[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