[PATCH 5/8] calculate partitioning based on GuC size

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


---
 drivers/gpu/drm/i915/intel_wopcm.c | 38 +++++++++++++++++++++-----------------
 1 file changed, 21 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_wopcm.c b/drivers/gpu/drm/i915/intel_wopcm.c
index 36aef79459fb..045f5dad095f 100644
--- a/drivers/gpu/drm/i915/intel_wopcm.c
+++ b/drivers/gpu/drm/i915/intel_wopcm.c
@@ -139,19 +139,23 @@ 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) {
-			DRM_ERROR("GuC WOPCM size (%uKiB) too small. %ldKiB more needed.\n",
-				  wopcm->guc.size / 1024,
-				  gap_size / 1024);
-			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) {
-			DRM_ERROR("HuC FW (%uKiB) won't fit, %ldKiB more needed.\n",
-				  huc_fw_size / 1024,
-				  gap_size / 1024);
-			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;
 		}
+
+		GEM_BUG_ON(gen9_wa_dword_gap_size(wopcm) > 0);
+		GEM_BUG_ON(gen9_wa_huc_gap_size(wopcm, huc_fw_size) > 0);
 	}
 
 	return 0;
@@ -178,18 +182,14 @@ static int wopcm_check_constraints(struct intel_wopcm *wopcm)
 static int wopcm_guc_init(struct intel_wopcm *wopcm)
 {
 	struct drm_i915_private *dev_priv = wopcm_to_i915(wopcm);
-	u32 huc_fw_size = intel_uc_fw_get_upload_size(&dev_priv->huc.fw);
+	u32 guc_fw_size = intel_uc_fw_get_upload_size(&dev_priv->guc.fw);
 	u32 ctx_rsvd = context_reserved_size(dev_priv);
 
-	wopcm->guc.base = roundup(huc_fw_size + WOPCM_RESERVED_SIZE,
+	wopcm->guc.size = roundup(guc_fw_size + GEN9_GUC_WOPCM_OFFSET,
 				  GUC_WOPCM_OFFSET_ALIGNMENT);
 
-	wopcm->guc.size = roundup(wopcm->size - wopcm->guc.base - ctx_rsvd,
-				  PAGE_SIZE);
-
-	DRM_DEBUG_DRIVER("GuC WOPCM Region: [%uKiB, %uKiB)\n",
-			 wopcm->guc.base / 1024,
-			 (wopcm->guc.base + wopcm->guc.size) / 1024);
+	wopcm->guc.base = roundup(wopcm->size - ctx_rsvd - wopcm->guc.size,
+				  GUC_WOPCM_OFFSET_ALIGNMENT);
 
 	return 0;
 }
@@ -220,6 +220,10 @@ int intel_wopcm_init(struct intel_wopcm *wopcm)
 	if (err)
 		return err;
 
+	DRM_DEBUG_DRIVER("GuC WOPCM Region: [%uKiB, %uKiB)\n",
+			 wopcm->guc.base / 1024,
+			 (wopcm->guc.base + wopcm->guc.size) / 1024);
+
 	err = wopcm_check_constraints(wopcm);
 	if (err)
 		return err;
-- 
2.14.3



More information about the Intel-gfx-trybot mailing list