[PATCH v4 6/6] drm/i915/dgfx: Get VBT from rvda

Anshuman Gupta anshuman.gupta at intel.com
Sun Apr 3 17:40:36 UTC 2022


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.

v2:
- Add kzalloc NULL check for opreg_rvda pointer.

v3:
- Added kmemdup() insead of kzalloc() + memcpy() in
  intel_dgfx_alloc_rvda(), and added necessary
  credit to Manasi.

Cc: Jani Nikula <jani.nikula at intel.com>
Cc: Uma Shankar <uma.shankar at intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
Cc: Badal Nilawar <badal.nilawar at intel.com>
Signed-off-by: Manasi Navare <manasi.d.navare at intel.com>
Signed-off-by: Anshuman Gupta <anshuman.gupta at intel.com>
---
 drivers/gpu/drm/i915/display/intel_opregion.c | 25 ++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_opregion.c b/drivers/gpu/drm/i915/display/intel_opregion.c
index 724aa5a1e05b..bf7c2a31f84e 100644
--- a/drivers/gpu/drm/i915/display/intel_opregion.c
+++ b/drivers/gpu/drm/i915/display/intel_opregion.c
@@ -1629,11 +1629,34 @@ 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 = kmemdup(opregion->dgfx_oprom_opreg + opregion->asle->rvda,
+			     opregion->asle->rvds, GFP_KERNEL);
+
+	/* We got RVDA, OPROM opregion + vbt image not nedded anymore */
+	kfree(opregion->dgfx_oprom_opreg);
+	opregion->dgfx_oprom_opreg = NULL;
+
+	return opreg_rvda ?: ERR_PTR(-ENOMEM);
 }
 
 static void intel_dgfx_free_rvda(struct drm_i915_private *i915, void *rvda)
 {
+	struct intel_opregion *opregion = &i915->opregion;
+
+
+	if (IS_ERR(rvda)) {
+		opregion->rvda = NULL;
+		return;
+	}
+
+	kfree(opregion->rvda);
+	opregion->rvda = NULL;
 }
 
 static void intel_dgfx_free_opregion(struct drm_i915_private *i915, void *opreg)
-- 
2.26.2



More information about the Intel-gfx-trybot mailing list