[PATCH] drm/i915/wopcm: Try to use already locked WOPCM layout

Michal Wajdeczko michal.wajdeczko at intel.com
Tue Aug 13 21:22:34 UTC 2019


If WOPCM layout is already locked we shouldn't continue with
own partitioning as it will be likely unsuccessful. Instead
we should try to reuse what is alreay programmed.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
---
 drivers/gpu/drm/i915/intel_wopcm.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_wopcm.c b/drivers/gpu/drm/i915/intel_wopcm.c
index 2bda24200498..cd23e5a6b6be 100644
--- a/drivers/gpu/drm/i915/intel_wopcm.c
+++ b/drivers/gpu/drm/i915/intel_wopcm.c
@@ -154,6 +154,21 @@ static inline int check_hw_restriction(struct drm_i915_private *i915,
 	return err;
 }
 
+static bool __wopcm_regs_locked(struct intel_gt *gt,
+				u32 *guc_wopcm_base, u32 *guc_wopcm_size)
+{
+	u32 reg_base = intel_uncore_read(gt->uncore, DMA_GUC_WOPCM_OFFSET);
+	u32 reg_size = intel_uncore_read(gt->uncore, GUC_WOPCM_SIZE);
+
+	if (!(reg_size & GUC_WOPCM_SIZE_LOCKED) ||
+	    !(reg_base & GUC_WOPCM_OFFSET_VALID))
+		return false;
+
+	*guc_wopcm_base = reg_base & GUC_WOPCM_OFFSET_MASK;
+	*guc_wopcm_size = reg_size & GUC_WOPCM_SIZE_MASK;
+	return true;
+}
+
 /**
  * intel_wopcm_init() - Initialize the WOPCM structure.
  * @wopcm: pointer to intel_wopcm.
@@ -197,6 +212,9 @@ void intel_wopcm_init(struct intel_wopcm *wopcm)
 		return;
 	}
 
+	if (__wopcm_regs_locked(&i915->gt, &guc_wopcm_base, &guc_wopcm_size))
+		goto check;
+
 	guc_wopcm_base = ALIGN(huc_fw_size + WOPCM_RESERVED_SIZE,
 			       GUC_WOPCM_OFFSET_ALIGNMENT);
 	if ((guc_wopcm_base + ctx_rsvd) >= wopcm->size) {
@@ -219,6 +237,7 @@ void intel_wopcm_init(struct intel_wopcm *wopcm)
 		return;
 	}
 
+check:
 	err = check_hw_restriction(i915, guc_wopcm_base, guc_wopcm_size,
 				   huc_fw_size);
 	if (err)
-- 
2.19.2



More information about the Intel-gfx-trybot mailing list