[PATCH 6/8] if-regs-locked-use-regs

MichaƂ Winiarski michal.winiarski at intel.com
Tue Mar 20 21:08:30 UTC 2018


---
 drivers/gpu/drm/i915/intel_wopcm.c | 32 ++++++++++++++++++++++++++++----
 drivers/gpu/drm/i915/intel_wopcm.h |  2 ++
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_wopcm.c b/drivers/gpu/drm/i915/intel_wopcm.c
index 045f5dad095f..087de5bff847 100644
--- a/drivers/gpu/drm/i915/intel_wopcm.c
+++ b/drivers/gpu/drm/i915/intel_wopcm.c
@@ -139,14 +139,21 @@ static int wopcm_apply_workarounds(struct intel_wopcm *wopcm)
 	if (IS_GEN9(i915) || IS_CNL_REVID(i915, CNL_REVID_A0, CNL_REVID_A0)) {
 		gap_size = gen9_wa_dword_gap_size(wopcm);
 		if (gap_size > 0) {
+			if (wopcm->locked)
+				return -E2BIG;
+
 			gap_size = DIV_ROUND_UP(gap_size, 2);
 			gap_size = roundup(gap_size,
 					   GUC_WOPCM_OFFSET_ALIGNMENT);
 			wopcm->guc.size += gap_size;
 			wopcm->guc.base -= gap_size;
 		}
+
 		gap_size = gen9_wa_huc_gap_size(wopcm, huc_fw_size);
 		if (gap_size > 0) {
+			if (wopcm->locked)
+				return -E2BIG;
+
 			gap_size = DIV_ROUND_UP(gap_size, 2);
 			gap_size = roundup(gap_size,
 					   GUC_WOPCM_OFFSET_ALIGNMENT);
@@ -183,13 +190,30 @@ static int wopcm_guc_init(struct intel_wopcm *wopcm)
 {
 	struct drm_i915_private *dev_priv = wopcm_to_i915(wopcm);
 	u32 guc_fw_size = intel_uc_fw_get_upload_size(&dev_priv->guc.fw);
+	u32 huc_fw_size = intel_uc_fw_get_upload_size(&dev_priv->huc.fw);
 	u32 ctx_rsvd = context_reserved_size(dev_priv);
+	u32 reg_val;
 
-	wopcm->guc.size = roundup(guc_fw_size + GEN9_GUC_WOPCM_OFFSET,
-				  GUC_WOPCM_OFFSET_ALIGNMENT);
+	reg_val = I915_READ(GUC_WOPCM_SIZE);
+	if (reg_val & GUC_WOPCM_SIZE_LOCKED) {
+		wopcm->guc.size = (reg_val & GUC_WOPCM_SIZE_MASK);
+		wopcm->locked = true;
+	} else {
+		wopcm->guc.size = roundup(guc_fw_size + GEN9_GUC_WOPCM_OFFSET,
+					  GUC_WOPCM_OFFSET_ALIGNMENT);
+	}
+
+	reg_val = I915_READ(DMA_GUC_WOPCM_OFFSET);
+	if (reg_val & GUC_WOPCM_OFFSET_VALID) {
+		if (huc_fw_size && !(reg_val & HUC_LOADING_AGENT_GUC))
+			return -EIO;
 
-	wopcm->guc.base = roundup(wopcm->size - ctx_rsvd - wopcm->guc.size,
-				  GUC_WOPCM_OFFSET_ALIGNMENT);
+		wopcm->guc.base = (reg_val & GUC_WOPCM_OFFSET_MASK);
+		wopcm->locked = true;
+	} else {
+		wopcm->guc.base = roundup(wopcm->size - wopcm->guc.size -
+					  ctx_rsvd, GUC_WOPCM_OFFSET_ALIGNMENT);
+	}
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/i915/intel_wopcm.h b/drivers/gpu/drm/i915/intel_wopcm.h
index 6298910a384c..7d56abacb4d4 100644
--- a/drivers/gpu/drm/i915/intel_wopcm.h
+++ b/drivers/gpu/drm/i915/intel_wopcm.h
@@ -12,12 +12,14 @@
 /**
  * struct intel_wopcm - Overall WOPCM info and WOPCM regions.
  * @size: Size of overall WOPCM.
+ * @locked: True if we're operating on fixed WOPCM partitioning.
  * @guc: GuC WOPCM Region info.
  * @guc.base: GuC WOPCM base which is offset from WOPCM base.
  * @guc.size: Size of the GuC WOPCM region.
  */
 struct intel_wopcm {
 	u32 size;
+	bool locked;
 	struct {
 		u32 base;
 		u32 size;
-- 
2.14.3



More information about the Intel-gfx-trybot mailing list