Hi Matt,
+static void intel_gt_apply_ccs_mode(struct intel_gt *gt) +{
- u32 mode;
- int cslice;
- if (!IS_DG2(gt->i915))
return;
- /* Set '0' as a default CCS id to all the cslices */
- mode = 0;
- for (cslice = 0; cslice < hweight32(CCS_MASK(gt)); cslice++)
/* Write 0x7 if no CCS context dispatches to this cslice */
if (!(CCS_MASK(gt) & BIT(cslice)))
mode |= XEHP_CCS_MODE_CSLICE(cslice,
XEHP_CCS_MODE_CSLICE_MASK);
- intel_uncore_write(gt->uncore, XEHP_CCS_MODE, mode);
This is still going to hook all available cslices up to hardware engine ccs0. But what you actually want is to hook them all up to what userspace sees as CCS0 (i.e., the first CCS engine that wasn't fused off). Hardware's engine numbering and userspace's numbering aren't the same.
Yes, correct... we had so many discussions and I forgot about it :-)
Also, if you have a part that only has hardware ccs1/cslice1 for example, you're not going to set cslices 2 & 3 to 0x7 properly.
Good point also here, the XEHP_CCS_MODE register is indeed generic to all platforms.
So probably what you want is something like this (untested):
static void intel_gt_apply_ccs_mode(struct intel_gt *gt) { u32 mode = 0; int first_ccs = __ffs(CCS_MASK(gt));
/* * Re-assign every present cslice to the first available CCS * engine; mark unavailable cslices as unused. */ for (int cslice = 0; cslice < 4; cslice++) { if (CCS_MASK(gt) & BIT(cslice)) mode |= XEHP_CCS_MODE_CSLICE(cslice, first_ccs); else mode |= XEHP_CCS_MODE_CSLICE(cslice, XEHP_CCS_MODE_CSLICE_MASK); } intel_uncore_write(gt->uncore, XEHP_CCS_MODE, mode);
}
+}
int intel_gt_init_hw(struct intel_gt *gt) { struct drm_i915_private *i915 = gt->i915; @@ -195,6 +215,9 @@ int intel_gt_init_hw(struct intel_gt *gt) intel_gt_init_swizzling(gt);
- /* Configure CCS mode */
- intel_gt_apply_ccs_mode(gt);
This is only setting this once during init. The value gets lost on every RCS/CCS reset, so we need to make sure it gets reapplied when necessary. That means you either need to add this to the GuC regset, or you need to implement the programming as a "fake workaround" so that the workaround framework will take care of the re-application for you.
OK, I'll hook everything up in the ccs_engine_wa_init().
Thanks, Andi