diff mbox series

drm/i915/guc: Enable w/a 14019882105 for DG2 and MTL

Message ID 20240525014121.4157254-1-John.C.Harrison@Intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915/guc: Enable w/a 14019882105 for DG2 and MTL | expand

Commit Message

John Harrison May 25, 2024, 1:41 a.m. UTC
From: John Harrison <John.C.Harrison@Intel.com>

Enable another workaround that is implemented inside the GuC.

Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
---
 drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h |  1 +
 drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c    | 32 ++++++++++++-------
 2 files changed, 21 insertions(+), 12 deletions(-)

Comments

Matt Roper May 28, 2024, 8:21 p.m. UTC | #1
On Fri, May 24, 2024 at 06:41:20PM -0700, John.C.Harrison@Intel.com wrote:
> From: John Harrison <John.C.Harrison@Intel.com>
> 
> Enable another workaround that is implemented inside the GuC.
> 
> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
> ---
>  drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h |  1 +
>  drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c    | 32 ++++++++++++-------
>  2 files changed, 21 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h b/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h
> index 525587cfe1af9..37ff539a6963d 100644
> --- a/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h
> +++ b/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h
> @@ -106,6 +106,7 @@ enum {
>   */
>  enum {
>  	GUC_WORKAROUND_KLV_SERIALIZED_RA_MODE				= 0x9001,
> +	GUC_WORKAROUND_KLV_BLOCK_INTERRUPTS_WHEN_MGSR_BLOCKED		= 0x9002,
>  };
>  
>  #endif /* _ABI_GUC_KLVS_ABI_H */
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c
> index c606bb5e3b7b0..6c382785bc60b 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c
> @@ -815,23 +815,23 @@ guc_capture_prep_lists(struct intel_guc *guc)
>  	return PAGE_ALIGN(total_size);
>  }
>  
> -/* Wa_14019159160 */
> -static u32 guc_waklv_ra_mode(struct intel_guc *guc, u32 offset, u32 remain)
> +static void guc_waklv_enable_simple(struct intel_guc *guc,
> +				    u32 klv_id, u32 *offset, u32 *remain)
>  {
>  	u32 size;
>  	u32 klv_entry[] = {
>  		/* 16:16 key/length */
> -		FIELD_PREP(GUC_KLV_0_KEY, GUC_WORKAROUND_KLV_SERIALIZED_RA_MODE) |
> +		FIELD_PREP(GUC_KLV_0_KEY, klv_id) |
>  		FIELD_PREP(GUC_KLV_0_LEN, 0),
>  		/* 0 dwords data */
>  	};
>  
>  	size = sizeof(klv_entry);
> -	GEM_BUG_ON(remain < size);
> +	GEM_BUG_ON(*remain < size);
>  
> -	iosys_map_memcpy_to(&guc->ads_map, offset, klv_entry, size);
> -
> -	return size;
> +	iosys_map_memcpy_to(&guc->ads_map, *offset, klv_entry, size);
> +	*offset += size;
> +	*remain -= size;
>  }
>  
>  static void guc_waklv_init(struct intel_guc *guc)
> @@ -850,11 +850,19 @@ static void guc_waklv_init(struct intel_guc *guc)
>  	remain = guc_ads_waklv_size(guc);
>  
>  	/* Wa_14019159160 */
> -	if (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 71))) {
> -		size = guc_waklv_ra_mode(guc, offset, remain);
> -		offset += size;
> -		remain -= size;
> -	}
> +	if (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 71)))
> +		guc_waklv_enable_simple(guc,
> +					GUC_WORKAROUND_KLV_SERIALIZED_RA_MODE,
> +					&offset, &remain);
> +
> +	/* Wa_14019882105 */

Is this the right number?  When I look up Wa_14019882105 in the
workaround database, it only lists it as being relevant to A steppings
of G:20.04.  I don't see entries for 12.70/12.71.  Did it go by a
different lineage number on the older platforms?

Also, I notice the Wa_14019159160 we had just above this workaround is
missing handling for graphics version 12.74.


Matt

> +	if ((GUC_FIRMWARE_VER(guc) >= MAKE_GUC_VER(70, 21, 1)) &&
> +	    (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 71)) ||
> +	     IS_MEDIA_GT_IP_RANGE(gt, IP_VER(13, 0), IP_VER(13, 0)) ||
> +	     IS_DG2(gt->i915)))
> +		guc_waklv_enable_simple(guc,
> +					GUC_WORKAROUND_KLV_BLOCK_INTERRUPTS_WHEN_MGSR_BLOCKED,
> +					&offset, &remain);
>  
>  	size = guc_ads_waklv_size(guc) - remain;
>  	if (!size)
> -- 
> 2.43.2
>
John Harrison May 28, 2024, 10:36 p.m. UTC | #2
On 5/28/2024 13:21, Matt Roper wrote:
> On Fri, May 24, 2024 at 06:41:20PM -0700, John.C.Harrison@Intel.com wrote:
>> From: John Harrison <John.C.Harrison@Intel.com>
>>
>> Enable another workaround that is implemented inside the GuC.
>>
>> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
>> ---
>>   drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h |  1 +
>>   drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c    | 32 ++++++++++++-------
>>   2 files changed, 21 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h b/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h
>> index 525587cfe1af9..37ff539a6963d 100644
>> --- a/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h
>> +++ b/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h
>> @@ -106,6 +106,7 @@ enum {
>>    */
>>   enum {
>>   	GUC_WORKAROUND_KLV_SERIALIZED_RA_MODE				= 0x9001,
>> +	GUC_WORKAROUND_KLV_BLOCK_INTERRUPTS_WHEN_MGSR_BLOCKED		= 0x9002,
>>   };
>>   
>>   #endif /* _ABI_GUC_KLVS_ABI_H */
>> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c
>> index c606bb5e3b7b0..6c382785bc60b 100644
>> --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c
>> +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c
>> @@ -815,23 +815,23 @@ guc_capture_prep_lists(struct intel_guc *guc)
>>   	return PAGE_ALIGN(total_size);
>>   }
>>   
>> -/* Wa_14019159160 */
>> -static u32 guc_waklv_ra_mode(struct intel_guc *guc, u32 offset, u32 remain)
>> +static void guc_waklv_enable_simple(struct intel_guc *guc,
>> +				    u32 klv_id, u32 *offset, u32 *remain)
>>   {
>>   	u32 size;
>>   	u32 klv_entry[] = {
>>   		/* 16:16 key/length */
>> -		FIELD_PREP(GUC_KLV_0_KEY, GUC_WORKAROUND_KLV_SERIALIZED_RA_MODE) |
>> +		FIELD_PREP(GUC_KLV_0_KEY, klv_id) |
>>   		FIELD_PREP(GUC_KLV_0_LEN, 0),
>>   		/* 0 dwords data */
>>   	};
>>   
>>   	size = sizeof(klv_entry);
>> -	GEM_BUG_ON(remain < size);
>> +	GEM_BUG_ON(*remain < size);
>>   
>> -	iosys_map_memcpy_to(&guc->ads_map, offset, klv_entry, size);
>> -
>> -	return size;
>> +	iosys_map_memcpy_to(&guc->ads_map, *offset, klv_entry, size);
>> +	*offset += size;
>> +	*remain -= size;
>>   }
>>   
>>   static void guc_waklv_init(struct intel_guc *guc)
>> @@ -850,11 +850,19 @@ static void guc_waklv_init(struct intel_guc *guc)
>>   	remain = guc_ads_waklv_size(guc);
>>   
>>   	/* Wa_14019159160 */
>> -	if (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 71))) {
>> -		size = guc_waklv_ra_mode(guc, offset, remain);
>> -		offset += size;
>> -		remain -= size;
>> -	}
>> +	if (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 71)))
>> +		guc_waklv_enable_simple(guc,
>> +					GUC_WORKAROUND_KLV_SERIALIZED_RA_MODE,
>> +					&offset, &remain);
>> +
>> +	/* Wa_14019882105 */
> Is this the right number?  When I look up Wa_14019882105 in the
> workaround database, it only lists it as being relevant to A steppings
> of G:20.04.  I don't see entries for 12.70/12.71.  Did it go by a
> different lineage number on the older platforms?
Argh. Copied the wrong number. 2105 is the Xe version, the Gen12 version 
is 16021333562. I think it is two separate actual issues, hence two 
different w/a numbers, but the w/a itself is the same for both. Hmm, 
looks ike 3562 should also be enabled for 12.74. Not sure how I missed 
that, unless that is a recent update?

>
> Also, I notice the Wa_14019159160 we had just above this workaround is
> missing handling for graphics version 12.74.
12.74 is ARL? I think extending that is on my todo list as well. I have 
just been leaving updates to 160 until later because that one is 
horrific. It needs extending to DG2 as well but a whole bunch of tests 
start to fail when it is enabled because they need to be re-written to 
cope with the broken hardware.

John.

>
>
> Matt
>
>> +	if ((GUC_FIRMWARE_VER(guc) >= MAKE_GUC_VER(70, 21, 1)) &&
>> +	    (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 71)) ||
>> +	     IS_MEDIA_GT_IP_RANGE(gt, IP_VER(13, 0), IP_VER(13, 0)) ||
>> +	     IS_DG2(gt->i915)))
>> +		guc_waklv_enable_simple(guc,
>> +					GUC_WORKAROUND_KLV_BLOCK_INTERRUPTS_WHEN_MGSR_BLOCKED,
>> +					&offset, &remain);
>>   
>>   	size = guc_ads_waklv_size(guc) - remain;
>>   	if (!size)
>> -- 
>> 2.43.2
>>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h b/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h
index 525587cfe1af9..37ff539a6963d 100644
--- a/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h
+++ b/drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h
@@ -106,6 +106,7 @@  enum {
  */
 enum {
 	GUC_WORKAROUND_KLV_SERIALIZED_RA_MODE				= 0x9001,
+	GUC_WORKAROUND_KLV_BLOCK_INTERRUPTS_WHEN_MGSR_BLOCKED		= 0x9002,
 };
 
 #endif /* _ABI_GUC_KLVS_ABI_H */
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c
index c606bb5e3b7b0..6c382785bc60b 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c
@@ -815,23 +815,23 @@  guc_capture_prep_lists(struct intel_guc *guc)
 	return PAGE_ALIGN(total_size);
 }
 
-/* Wa_14019159160 */
-static u32 guc_waklv_ra_mode(struct intel_guc *guc, u32 offset, u32 remain)
+static void guc_waklv_enable_simple(struct intel_guc *guc,
+				    u32 klv_id, u32 *offset, u32 *remain)
 {
 	u32 size;
 	u32 klv_entry[] = {
 		/* 16:16 key/length */
-		FIELD_PREP(GUC_KLV_0_KEY, GUC_WORKAROUND_KLV_SERIALIZED_RA_MODE) |
+		FIELD_PREP(GUC_KLV_0_KEY, klv_id) |
 		FIELD_PREP(GUC_KLV_0_LEN, 0),
 		/* 0 dwords data */
 	};
 
 	size = sizeof(klv_entry);
-	GEM_BUG_ON(remain < size);
+	GEM_BUG_ON(*remain < size);
 
-	iosys_map_memcpy_to(&guc->ads_map, offset, klv_entry, size);
-
-	return size;
+	iosys_map_memcpy_to(&guc->ads_map, *offset, klv_entry, size);
+	*offset += size;
+	*remain -= size;
 }
 
 static void guc_waklv_init(struct intel_guc *guc)
@@ -850,11 +850,19 @@  static void guc_waklv_init(struct intel_guc *guc)
 	remain = guc_ads_waklv_size(guc);
 
 	/* Wa_14019159160 */
-	if (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 71))) {
-		size = guc_waklv_ra_mode(guc, offset, remain);
-		offset += size;
-		remain -= size;
-	}
+	if (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 71)))
+		guc_waklv_enable_simple(guc,
+					GUC_WORKAROUND_KLV_SERIALIZED_RA_MODE,
+					&offset, &remain);
+
+	/* Wa_14019882105 */
+	if ((GUC_FIRMWARE_VER(guc) >= MAKE_GUC_VER(70, 21, 1)) &&
+	    (IS_GFX_GT_IP_RANGE(gt, IP_VER(12, 70), IP_VER(12, 71)) ||
+	     IS_MEDIA_GT_IP_RANGE(gt, IP_VER(13, 0), IP_VER(13, 0)) ||
+	     IS_DG2(gt->i915)))
+		guc_waklv_enable_simple(guc,
+					GUC_WORKAROUND_KLV_BLOCK_INTERRUPTS_WHEN_MGSR_BLOCKED,
+					&offset, &remain);
 
 	size = guc_ads_waklv_size(guc) - remain;
 	if (!size)