Commit 4cfca03f authored by Andi Shyti's avatar Andi Shyti

drm/i915/gt: Automate CCS Mode setting during engine resets

We missed setting the CCS mode during resume and engine resets.
Create a workaround to be added in the engine's workaround list.
This workaround sets the XEHP_CCS_MODE value at every reset.

The issue can be reproduced by running:

  $ clpeak --kernel-latency

Without resetting the CCS mode, we encounter a fence timeout:

  Fence expiration time out i915-0000:03:00.0:clpeak[2387]:2!

Fixes: 2bebae01 ("drm/i915/gt: Enable only one CCS for compute workload")
Reported-by: default avatarGnattu OC <gnattuoc@me.com>
Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10895Signed-off-by: default avatarAndi Shyti <andi.shyti@linux.intel.com>
Cc: Chris Wilson <chris.p.wilson@linux.intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Cc: <stable@vger.kernel.org> # v6.2+
Tested-by: default avatarGnattu OC <gnattuoc@me.com>
Reviewed-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Tested-by: default avatarKrzysztof Gibala <krzysztof.gibala@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240426000723.229296-1-andi.shyti@linux.intel.com
parent 4d3421e0
...@@ -8,14 +8,14 @@ ...@@ -8,14 +8,14 @@
#include "intel_gt_ccs_mode.h" #include "intel_gt_ccs_mode.h"
#include "intel_gt_regs.h" #include "intel_gt_regs.h"
void intel_gt_apply_ccs_mode(struct intel_gt *gt) unsigned int intel_gt_apply_ccs_mode(struct intel_gt *gt)
{ {
int cslice; int cslice;
u32 mode = 0; u32 mode = 0;
int first_ccs = __ffs(CCS_MASK(gt)); int first_ccs = __ffs(CCS_MASK(gt));
if (!IS_DG2(gt->i915)) if (!IS_DG2(gt->i915))
return; return 0;
/* Build the value for the fixed CCS load balancing */ /* Build the value for the fixed CCS load balancing */
for (cslice = 0; cslice < I915_MAX_CCS; cslice++) { for (cslice = 0; cslice < I915_MAX_CCS; cslice++) {
...@@ -35,5 +35,5 @@ void intel_gt_apply_ccs_mode(struct intel_gt *gt) ...@@ -35,5 +35,5 @@ void intel_gt_apply_ccs_mode(struct intel_gt *gt)
XEHP_CCS_MODE_CSLICE_MASK); XEHP_CCS_MODE_CSLICE_MASK);
} }
intel_uncore_write(gt->uncore, XEHP_CCS_MODE, mode); return mode;
} }
...@@ -8,6 +8,6 @@ ...@@ -8,6 +8,6 @@
struct intel_gt; struct intel_gt;
void intel_gt_apply_ccs_mode(struct intel_gt *gt); unsigned int intel_gt_apply_ccs_mode(struct intel_gt *gt);
#endif /* __INTEL_GT_CCS_MODE_H__ */ #endif /* __INTEL_GT_CCS_MODE_H__ */
...@@ -2858,6 +2858,7 @@ add_render_compute_tuning_settings(struct intel_gt *gt, ...@@ -2858,6 +2858,7 @@ add_render_compute_tuning_settings(struct intel_gt *gt,
static void ccs_engine_wa_mode(struct intel_engine_cs *engine, struct i915_wa_list *wal) static void ccs_engine_wa_mode(struct intel_engine_cs *engine, struct i915_wa_list *wal)
{ {
struct intel_gt *gt = engine->gt; struct intel_gt *gt = engine->gt;
u32 mode;
if (!IS_DG2(gt->i915)) if (!IS_DG2(gt->i915))
return; return;
...@@ -2874,7 +2875,8 @@ static void ccs_engine_wa_mode(struct intel_engine_cs *engine, struct i915_wa_li ...@@ -2874,7 +2875,8 @@ static void ccs_engine_wa_mode(struct intel_engine_cs *engine, struct i915_wa_li
* After having disabled automatic load balancing we need to * After having disabled automatic load balancing we need to
* assign all slices to a single CCS. We will call it CCS mode 1 * assign all slices to a single CCS. We will call it CCS mode 1
*/ */
intel_gt_apply_ccs_mode(gt); mode = intel_gt_apply_ccs_mode(gt);
wa_masked_en(wal, XEHP_CCS_MODE, mode);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment