[PATCH 3/8] tidy-constraints-check
MichaĆ Winiarski
michal.winiarski at intel.com
Tue Mar 20 21:08:27 UTC 2018
---
drivers/gpu/drm/i915/intel_wopcm.c | 127 ++++++++++++++++++++++---------------
1 file changed, 77 insertions(+), 50 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_wopcm.c b/drivers/gpu/drm/i915/intel_wopcm.c
index 013315b6eece..c903fa6a3a67 100644
--- a/drivers/gpu/drm/i915/intel_wopcm.c
+++ b/drivers/gpu/drm/i915/intel_wopcm.c
@@ -82,7 +82,7 @@ static inline u32 context_reserved_size(struct drm_i915_private *i915)
return 0;
}
-static inline int gen9_check_dword_gap(u32 guc_wopcm_base, u32 guc_wopcm_size)
+static int check_dword_gap(struct intel_wopcm *wopcm)
{
u32 offset;
@@ -91,49 +91,103 @@ static inline int gen9_check_dword_gap(u32 guc_wopcm_base, u32 guc_wopcm_size)
* WOPCM base (GuC WOPCM offset from WOPCM base + GEN9_GUC_WOPCM_OFFSET)
* due to hardware limitation on Gen9.
*/
- offset = guc_wopcm_base + GEN9_GUC_WOPCM_OFFSET;
- if (offset > guc_wopcm_size ||
- (guc_wopcm_size - offset) < sizeof(u32)) {
+ offset = wopcm->guc.base + GEN9_GUC_WOPCM_OFFSET + sizeof(u32);
+ if (wopcm->guc.size < offset) {
DRM_ERROR("GuC WOPCM size %uKiB is too small. %uKiB needed.\n",
- guc_wopcm_size / 1024,
- (u32)(offset + sizeof(u32)) / 1024);
+ wopcm->guc.size / 1024,
+ offset / 1024);
return -E2BIG;
}
return 0;
}
-static inline int gen9_check_huc_fw_fits(u32 guc_wopcm_size, u32 huc_fw_size)
+static int check_huc_fw_fits(struct intel_wopcm *wopcm, u32 huc_fw_size)
{
/*
* On Gen9 & CNL A0, hardware requires the total available GuC WOPCM
* size to be larger than or equal to HuC firmware size. Otherwise,
* firmware uploading would fail.
*/
- if (huc_fw_size > guc_wopcm_size - GUC_WOPCM_RESERVED) {
+ if (huc_fw_size >= wopcm->guc.size - GUC_WOPCM_RESERVED) {
DRM_ERROR("HuC FW (%uKiB) won't fit in GuC WOPCM (%uKiB).\n",
huc_fw_size / 1024,
- (guc_wopcm_size - GUC_WOPCM_RESERVED) / 1024);
+ (wopcm->guc.size - GUC_WOPCM_RESERVED) / 1024);
return -E2BIG;
}
return 0;
}
-static inline int check_hw_restriction(struct drm_i915_private *i915,
- u32 guc_wopcm_base, u32 guc_wopcm_size,
- u32 huc_fw_size)
+static int check_guc_fw_fits(struct intel_wopcm *wopcm, u32 guc_fw_size)
{
- int err = 0;
+ if ((guc_fw_size + GEN9_GUC_WOPCM_OFFSET) > wopcm->guc.size) {
+ DRM_ERROR("Need %uKiB WOPCM for GuC, %uKiB available.\n",
+ (guc_fw_size + GEN9_GUC_WOPCM_OFFSET) / 1024,
+ wopcm->guc.size / 1024);
+ return -E2BIG;
+ }
- if (IS_GEN9(i915))
- err = gen9_check_dword_gap(guc_wopcm_base, guc_wopcm_size);
+ return 0;
+}
- if (!err &&
- (IS_GEN9(i915) || IS_CNL_REVID(i915, CNL_REVID_A0, CNL_REVID_A0)))
- err = gen9_check_huc_fw_fits(guc_wopcm_size, huc_fw_size);
+static int check_ctx_rsvd_fits(struct intel_wopcm *wopcm, u32 ctx_rsvd)
+{
+ if ((wopcm->guc.base + wopcm->guc.size + ctx_rsvd) > wopcm->size) {
+ DRM_ERROR("GuC WOPCM base (%uKiB) is too big.\n",
+ wopcm->guc.base / 1024);
+ return -E2BIG;
+ }
- return err;
+ return 0;
+}
+
+static int wopcm_check_constraints(struct intel_wopcm *wopcm)
+{
+ struct drm_i915_private *i915 = wopcm_to_i915(wopcm);
+ u32 huc_fw_size = intel_uc_fw_get_upload_size(&i915->huc.fw);
+ u32 guc_fw_size = intel_uc_fw_get_upload_size(&i915->guc.fw);
+ u32 ctx_rsvd = context_reserved_size(i915);
+ int err;
+
+ if (IS_GEN9(i915) || IS_CNL_REVID(i915, CNL_REVID_A0, CNL_REVID_A0)) {
+ err = check_dword_gap(wopcm);
+ if (err)
+ return err;
+
+ err = check_huc_fw_fits(wopcm, huc_fw_size);
+ if (err)
+ return err;
+ }
+
+ err = check_guc_fw_fits(wopcm, guc_fw_size);
+ if (err)
+ return err;
+
+ err = check_ctx_rsvd_fits(wopcm, ctx_rsvd);
+ if (err)
+ return err;
+
+ return 0;
+}
+
+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 ctx_rsvd = context_reserved_size(dev_priv);
+
+ wopcm->guc.base = roundup(huc_fw_size + WOPCM_RESERVED_SIZE,
+ 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);
+
+ return 0;
}
/**
@@ -150,44 +204,17 @@ static inline int check_hw_restriction(struct drm_i915_private *i915,
*/
int intel_wopcm_init(struct intel_wopcm *wopcm)
{
- struct drm_i915_private *i915 = wopcm_to_i915(wopcm);
- u32 guc_fw_size = intel_uc_fw_get_upload_size(&i915->guc.fw);
- u32 huc_fw_size = intel_uc_fw_get_upload_size(&i915->huc.fw);
- u32 ctx_rsvd = context_reserved_size(i915);
- u32 guc_wopcm_base;
- u32 guc_wopcm_size;
int err;
GEM_BUG_ON(!wopcm->size);
- guc_wopcm_base = ALIGN(huc_fw_size + WOPCM_RESERVED_SIZE,
- GUC_WOPCM_OFFSET_ALIGNMENT);
- if ((guc_wopcm_base + ctx_rsvd) >= wopcm->size) {
- DRM_ERROR("GuC WOPCM base (%uKiB) is too big.\n",
- guc_wopcm_base / 1024);
- return -E2BIG;
- }
-
- guc_wopcm_size = wopcm->size - guc_wopcm_base - ctx_rsvd;
- guc_wopcm_size &= GUC_WOPCM_SIZE_MASK;
-
- DRM_DEBUG_DRIVER("Calculated GuC WOPCM Region: [%uKiB, %uKiB)\n",
- guc_wopcm_base / 1024, guc_wopcm_size / 1024);
-
- if ((guc_fw_size + GUC_WOPCM_RESERVED) > guc_wopcm_size) {
- DRM_ERROR("Need %uKiB WOPCM for GuC, %uKiB available.\n",
- (guc_fw_size + GUC_WOPCM_RESERVED) / 1024,
- guc_wopcm_size / 1024);
- return -E2BIG;
- }
-
- err = check_hw_restriction(i915, guc_wopcm_base, guc_wopcm_size,
- huc_fw_size);
+ err = wopcm_guc_init(wopcm);
if (err)
return err;
- wopcm->guc.base = guc_wopcm_base;
- wopcm->guc.size = guc_wopcm_size;
+ err = wopcm_check_constraints(wopcm);
+ if (err)
+ return err;
return 0;
}
--
2.14.3
More information about the Intel-gfx-trybot
mailing list