diff mbox

[v8,4/6] drm/i915/guc: Add dynamic GuC WOPCM offset and size support for CNL

Message ID 1517875362-12755-4-git-send-email-yaodong.li@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jackie Li Feb. 6, 2018, 12:02 a.m. UTC
CNL has its own specific reserved GuC WOPCM size and hardware restrictions
on GuC WOPCM size. On CNL A0 and Gen9, there's a hardware restriction that
requires the available GuC WOPCM size to be larger than or equal to HuC
firmware size.

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

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

v7:
 - Fixed patch format issues

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

Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Cc: John Spotswood <john.a.spotswood@intel.com>
Cc: Jeff McGee <jeff.mcgee@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Jackie Li <yaodong.li@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(-)

Comments

sagar.a.kamble@intel.com Feb. 6, 2018, 6:31 a.m. UTC | #1
On 2/6/2018 5:32 AM, Jackie Li wrote:
> CNL has its own specific reserved GuC WOPCM size and hardware restrictions
> on GuC WOPCM size. On CNL A0 and Gen9, there's a hardware restriction that
> requires the available GuC WOPCM size to be larger than or equal to HuC
> firmware size.
>
> This patch updates GuC WOPCM init code to return the CNL specific reserved
> GuC WOPCM size and also adds new verfication code to ensure the available
> GuC WOPCM size to be larger than or equal to HuC firmware size on both Gen9
> and CNL A0.
>
> v6:
>   - Extended HuC FW size check against GuC WOPCM size to all
>     Gen9 and CNL A0 platforms
>
> v7:
>   - Fixed patch format issues
>
> v8:
>   - Renamed variables and functions to avoid ambiguity (Joonas)
>   - Updated commit message and comments to be more comprehensive (Sagar)
>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
> Cc: John Spotswood <john.a.spotswood@intel.com>
> Cc: Jeff McGee <jeff.mcgee@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Signed-off-by: Jackie Li <yaodong.li@intel.com>
Need to update subject as "Update WOPCM restrictions for CNL and add HuC 
size related restriction for Gen9 and CNL A0"
Or else breaking into two patches would have been good idea.
But change looks good to me.
Reviewed-by: Sagar Arun Kamble <sagar.a.kamble@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))
>   		return BXT_GUC_WOPCM_RC6_RESERVED;
>   
> +	if (IS_GEN10(i915))
> +		return CNL_GUC_WOPCM_RESERVED;
> +
> +	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);
>   
> +	if (IS_CNL_REVID(i915, CNL_REVID_A0, CNL_REVID_A0))
> +		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 28e4103..8c71d20a 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
>   /**
Michal Wajdeczko Feb. 6, 2018, 10:29 p.m. UTC | #2
On Tue, 06 Feb 2018 07:31:06 +0100, Sagar Arun Kamble  
<sagar.a.kamble@intel.com> wrote:

>
>
> On 2/6/2018 5:32 AM, Jackie Li wrote:
>> CNL has its own specific reserved GuC WOPCM size and hardware  
>> restrictions
>> on GuC WOPCM size. On CNL A0 and Gen9, there's a hardware restriction  
>> that
>> requires the available GuC WOPCM size to be larger than or equal to HuC
>> firmware size.
>>
>> This patch updates GuC WOPCM init code to return the CNL specific  
>> reserved
>> GuC WOPCM size and also adds new verfication code to ensure the  
>> available
>> GuC WOPCM size to be larger than or equal to HuC firmware size on both  
>> Gen9
>> and CNL A0.
>>
>> v6:
>>   - Extended HuC FW size check against GuC WOPCM size to all
>>     Gen9 and CNL A0 platforms
>>
>> v7:
>>   - Fixed patch format issues
>>
>> v8:
>>   - Renamed variables and functions to avoid ambiguity (Joonas)
>>   - Updated commit message and comments to be more comprehensive (Sagar)
>>
>> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
>> Cc: John Spotswood <john.a.spotswood@intel.com>
>> Cc: Jeff McGee <jeff.mcgee@intel.com>
>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
>> Signed-off-by: Jackie Li <yaodong.li@intel.com>
> Need to update subject as "Update WOPCM restrictions for CNL and add HuC  
> size related restriction for Gen9 and CNL A0"
> Or else breaking into two patches would have been good idea.

+1 for split

> But change looks good to me.
> Reviewed-by: Sagar Arun Kamble <sagar.a.kamble@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))
>>   		return BXT_GUC_WOPCM_RC6_RESERVED;
>>   +	if (IS_GEN10(i915))
>> +		return CNL_GUC_WOPCM_RESERVED;
>> +
>> +	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);

HuC fw size was passed as param to intel_guc_wopcm_init() but here
you decided to read it directly ?

>> +
>> +	/*
>> +	 * 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);
>>   +	if (IS_CNL_REVID(i915, CNL_REVID_A0, CNL_REVID_A0))
>> +		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 28e4103..8c71d20a 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
>>   /**
diff mbox

Patch

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))
 		return BXT_GUC_WOPCM_RC6_RESERVED;
 
+	if (IS_GEN10(i915))
+		return CNL_GUC_WOPCM_RESERVED;
+
+	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);
 
+	if (IS_CNL_REVID(i915, CNL_REVID_A0, CNL_REVID_A0))
+		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 28e4103..8c71d20a 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
 /**