[PATCH 4/6] drm/i915/guc: Extend dynamic GuC WOPCM offset & size calculation to CNL

Jackie Li yaodong.li at intel.com
Sat Feb 3 04:00:36 UTC 2018

CNL has specific hardware restrictions on GuC WOPCM size as well as
different reserved GuC WOPCM size. On CNL A0 and Gen9, hardware requires
the available GuC WOPCM size to be larger than or equal to HuC firmware

This patch updates GuC WOPCM init code to return the CNL specific reserved
GuC WOPCM size and also checks the the calculated GuC WOPCM size to ensure
the GuC WOPCM size to be larger than or equal to HuC firmware size on both
Gen9 and CNL A0

 - Extended HuC FW size check against GuC WOPCM size to all
   Gen9 and CNL A0 platforms

 - Fixed patch format issues

 - Renamed variables and functions to avoid ambiguity (Joonas)
 - Updated commit message and comments to be more comprehensive (Sagar)

Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
Cc: Sagar Arun Kamble <sagar.a.kamble at intel.com>
Cc: John Spotswood <john.a.spotswood at intel.com>
Cc: Jeff McGee <jeff.mcgee at intel.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
Signed-off-by: Jackie Li <yaodong.li at intel.com>
 drivers/gpu/drm/i915/intel_guc_wopcm.c | 24 +++++++++++++++++++++++-
 drivers/gpu/drm/i915/intel_guc_wopcm.h |  2 ++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_guc_wopcm.c b/drivers/gpu/drm/i915/intel_guc_wopcm.c
index 1555e79..3cba9ac 100644
--- a/drivers/gpu/drm/i915/intel_guc_wopcm.c
+++ b/drivers/gpu/drm/i915/intel_guc_wopcm.c
@@ -32,6 +32,25 @@ static inline u32 guc_reserved_wopcm_size(struct intel_guc *guc)
 	if (IS_GEN9_LP(i915))
+	if (IS_GEN10(i915))
+	return 0;
+static inline int guc_wopcm_check_huc_fw_size(struct drm_i915_private *i915)
+	struct intel_guc_wopcm *wopcm = &i915->guc.wopcm;
+	u32 huc_fw_size = intel_uc_fw_get_size(&i915->huc.fw);
+	/*
+	 * 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 (unlikely(wopcm->size - GUC_WOPCM_RESERVED < huc_fw_size))
+		return -E2BIG;
 	return 0;
@@ -54,7 +73,7 @@ static inline int gen9_guc_wopcm_size_check(struct drm_i915_private *i915)
 	if (unlikely(delta < GEN9_GUC_WOPCM_DELTA))
 		return -E2BIG;
-	return 0;
+	return guc_wopcm_check_huc_fw_size(i915);
 static inline int guc_wopcm_check_hw_restrictions(struct intel_guc *guc)
@@ -64,6 +83,9 @@ static inline int guc_wopcm_check_hw_restrictions(struct intel_guc *guc)
 	if (IS_GEN9(i915))
 		return gen9_guc_wopcm_size_check(i915);
+		return guc_wopcm_check_huc_fw_size(i915);
 	return 0;
diff --git a/drivers/gpu/drm/i915/intel_guc_wopcm.h b/drivers/gpu/drm/i915/intel_guc_wopcm.h
index 9f20b78..eca65f4 100644
--- a/drivers/gpu/drm/i915/intel_guc_wopcm.h
+++ b/drivers/gpu/drm/i915/intel_guc_wopcm.h
@@ -42,6 +42,8 @@ struct intel_guc;
 #define GUC_WOPCM_STACK_RESERVED	(0x2000)
 /* 24KB at the end of GuC WOPCM is reserved for RC6 CTX on BXT */
 #define BXT_GUC_WOPCM_RC6_RESERVED	(0x6000)
+/* 36KB WOPCM reserved at the end of GuC WOPCM on CNL */
+#define CNL_GUC_WOPCM_RESERVED		(0x9000)
 #define GEN9_GUC_WOPCM_DELTA		4
 /* GuC WOPCM starts at 144KB above GuC WOPCM offset on BXT */

More information about the Intel-gfx-trybot mailing list