@@ -1558,11 +1558,28 @@ static void *intel_dgfx_alloc_opregion(struct drm_i915_private *i915)
static void *intel_dgfx_alloc_rvda(struct drm_i915_private *i915)
{
- return ERR_PTR(-EOPNOTSUPP);
+ struct intel_opregion *opregion = &i915->opregion;
+ void *opreg_rvda;
+
+ if (!opregion->dgfx_oprom_opreg)
+ return ERR_PTR(-EINVAL);
+
+ opreg_rvda = kzalloc(opregion->asle->rvds, GFP_KERNEL);
+ memcpy(opreg_rvda, opregion->dgfx_oprom_opreg + opregion->asle->rvda, opregion->asle->rvds);
+
+ /* We got RVDA, OPROM opregion + vbt image not nedded anymore */
+ kfree(opregion->dgfx_oprom_opreg);
+ opregion->dgfx_oprom_opreg = NULL;
+
+ return opreg_rvda;
}
static void intel_dgfx_free_rvda(struct drm_i915_private *i915)
{
+ struct intel_opregion *opregion = &i915->opregion;
+
+ kfree(opregion->rvda);
+ opregion->rvda = NULL;
}
static void intel_dgfx_free_opregion(struct drm_i915_private *i915)
Since OpRegion ver 2.1 MBOX3 RVDA field is Relative address of Raw VBT data from OpRegion Base. Populate the opreion->rvda accordingly. As Intel DGFX cards supports OpRegion version 2.2 or greater, RVDA as an absolute VBT physical address (Ver 2.0) doesn't applicable to DGFX cards. Cc: Jani Nikula <jani.nikula@intel.com> Cc: Uma Shankar <uma.shankar@intel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: Badal Nilawar <badal.nilawar@intel.com> Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com> --- drivers/gpu/drm/i915/display/intel_opregion.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)