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 |
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 >
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 --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)