Skip to content

Commit d9a1ae0

Browse files
committed
drm/xe/guc: Enable WA_DUAL_QUEUE for newer platforms
The DUAL_QUEUE_WA tells the GuC to not allow concurrent submissions on RCS and CCSes with different address spaces, which on DG2 is required as a WA for an HW bug. On newer platforms, this block has been moved in HW at the CS level, by stalling the RCS/CCS context switch when one of the other RCS/CCSes is busy with a different address space. While functionally correct, having a submission stalled on the HW limits the GuC ability to shuffle things around and can cause complications if the non-stalled submission runs for a long time, because the GuC doesn't know that the stalled submission isn't actually running and might declare it as hung. Therefore, we enable the DUAL_QUEUE_WA on all newer platforms to move management back to the GuC. Note that the GuC specs also recommend enabling this for all platforms starting from MTL that have a CCS. v2: only apply the WA on GTs that have CCS engines v3: split comment (Jonathan) Signed-off-by: Daniele Ceraolo Spurio <[email protected]> Cc: John Harrison <[email protected]> Cc: Jesus Narvaez <[email protected]> Cc: Jonathan Cavitt <[email protected]> Reviewed-by: Jonathan Cavitt <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent cda0641 commit d9a1ae0

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

drivers/gpu/drm/xe/xe_guc.c

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,34 @@ static u32 guc_ctl_ads_flags(struct xe_guc *guc)
147147
return flags;
148148
}
149149

150+
static bool needs_wa_dual_queue(struct xe_gt *gt)
151+
{
152+
/*
153+
* The DUAL_QUEUE_WA tells the GuC to not allow concurrent submissions
154+
* on RCS and CCSes with different address spaces, which on DG2 is
155+
* required as a WA for an HW bug.
156+
*/
157+
if (XE_WA(gt, 22011391025))
158+
return true;
159+
160+
/*
161+
* On newer platforms, the HW has been updated to not allow parallel
162+
* execution of different address spaces, so the RCS/CCS will stall the
163+
* context switch if one of the other RCS/CCSes is busy with a different
164+
* address space. While functionally correct, having a submission
165+
* stalled on the HW limits the GuC ability to shuffle things around and
166+
* can cause complications if the non-stalled submission runs for a long
167+
* time, because the GuC doesn't know that the stalled submission isn't
168+
* actually running and might declare it as hung. Therefore, we enable
169+
* the DUAL_QUEUE_WA on all newer platforms on GTs that have CCS engines
170+
* to move management back to the GuC.
171+
*/
172+
if (CCS_MASK(gt) && GRAPHICS_VERx100(gt_to_xe(gt)) >= 1270)
173+
return true;
174+
175+
return false;
176+
}
177+
150178
static u32 guc_ctl_wa_flags(struct xe_guc *guc)
151179
{
152180
struct xe_device *xe = guc_to_xe(guc);
@@ -159,7 +187,7 @@ static u32 guc_ctl_wa_flags(struct xe_guc *guc)
159187
if (XE_WA(gt, 14014475959))
160188
flags |= GUC_WA_HOLD_CCS_SWITCHOUT;
161189

162-
if (XE_WA(gt, 22011391025))
190+
if (needs_wa_dual_queue(gt))
163191
flags |= GUC_WA_DUAL_QUEUE;
164192

165193
/*

0 commit comments

Comments
 (0)