Commit f659ac15 authored by Matt Roper's avatar Matt Roper Committed by Rodrigo Vivi

drm/xe/mocs: LNCF MOCS settings only need to be restored on pre-Xe_HP

Reprogramming the LNCF MOCS registers on render domain reset is not
intended to be regular driver programming, but rather the implementation
of a specific workaround (Wa_1607983814).  This workaround no longer
applies on Xe_HP any beyond, so we can expect that these registers, like
the rest of the LNCF/LBCF registers, will maintain their values through
all engine resets.  We should only add these registers to the GuC's
save/restore list on platforms that need the workaround.

Furthermore, xe_mocs_init_engine() appears to be another attempt to
satisfy this same workaround.  This is unnecessary on the Xe driver
since even on platforms where the workaround is necessary, all
single-engine resets are initiated by the GuC and thus the GuC will take
care of saving/restoring these registers.  The only host-initiated
resets we have in Xe are full GT resets which will already
(re)initialize these registers as part of the regular xe_mocs_init()
flow.

v2:
 - Add needs_wa_1607983814() so that calculate_regset_size() doesn't
   overallocate regset space when the workaround isn't needed.  (Lucas)
 - On platforms affected by Wa_1607983814, only add the LNCF MOCS
   registers to the render engine's GuC save/restore list; resets of
   other engines don't need to save/restore these.

Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Reviewed-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent ee17e7f3
...@@ -460,7 +460,7 @@ static void execlist_engine_suspend_wait(struct xe_engine *e) ...@@ -460,7 +460,7 @@ static void execlist_engine_suspend_wait(struct xe_engine *e)
static void execlist_engine_resume(struct xe_engine *e) static void execlist_engine_resume(struct xe_engine *e)
{ {
xe_mocs_init_engine(e); /* NIY */
} }
static const struct xe_engine_ops execlist_engine_ops = { static const struct xe_engine_ops execlist_engine_ops = {
......
...@@ -207,6 +207,11 @@ static void guc_ads_fini(struct drm_device *drm, void *arg) ...@@ -207,6 +207,11 @@ static void guc_ads_fini(struct drm_device *drm, void *arg)
xe_bo_unpin_map_no_vm(ads->bo); xe_bo_unpin_map_no_vm(ads->bo);
} }
static bool needs_wa_1607983814(struct xe_device *xe)
{
return GRAPHICS_VERx100(xe) < 1250;
}
static size_t calculate_regset_size(struct xe_gt *gt) static size_t calculate_regset_size(struct xe_gt *gt)
{ {
struct xe_reg_sr_entry *sr_entry; struct xe_reg_sr_entry *sr_entry;
...@@ -219,7 +224,10 @@ static size_t calculate_regset_size(struct xe_gt *gt) ...@@ -219,7 +224,10 @@ static size_t calculate_regset_size(struct xe_gt *gt)
xa_for_each(&hwe->reg_sr.xa, sr_idx, sr_entry) xa_for_each(&hwe->reg_sr.xa, sr_idx, sr_entry)
count++; count++;
count += (ADS_REGSET_EXTRA_MAX + LNCFCMOCS_REG_COUNT) * XE_NUM_HW_ENGINES; count += ADS_REGSET_EXTRA_MAX * XE_NUM_HW_ENGINES;
if (needs_wa_1607983814(gt_to_xe(gt)))
count += LNCFCMOCS_REG_COUNT;
return count * sizeof(struct guc_mmio_reg); return count * sizeof(struct guc_mmio_reg);
} }
...@@ -431,6 +439,7 @@ static unsigned int guc_mmio_regset_write(struct xe_guc_ads *ads, ...@@ -431,6 +439,7 @@ static unsigned int guc_mmio_regset_write(struct xe_guc_ads *ads,
struct iosys_map *regset_map, struct iosys_map *regset_map,
struct xe_hw_engine *hwe) struct xe_hw_engine *hwe)
{ {
struct xe_device *xe = ads_to_xe(ads);
struct xe_hw_engine *hwe_rcs_reset_domain = struct xe_hw_engine *hwe_rcs_reset_domain =
xe_gt_any_hw_engine_by_reset_domain(hwe->gt, XE_ENGINE_CLASS_RENDER); xe_gt_any_hw_engine_by_reset_domain(hwe->gt, XE_ENGINE_CLASS_RENDER);
struct xe_reg_sr_entry *entry; struct xe_reg_sr_entry *entry;
...@@ -465,9 +474,12 @@ static unsigned int guc_mmio_regset_write(struct xe_guc_ads *ads, ...@@ -465,9 +474,12 @@ static unsigned int guc_mmio_regset_write(struct xe_guc_ads *ads,
e->reg, e->flags, count++); e->reg, e->flags, count++);
} }
for (i = 0; i < LNCFCMOCS_REG_COUNT; i++) { /* Wa_1607983814 */
guc_mmio_regset_write_one(ads, regset_map, if (needs_wa_1607983814(xe) && hwe->class == XE_ENGINE_CLASS_RENDER) {
GEN9_LNCFCMOCS(i).reg, 0, count++); for (i = 0; i < LNCFCMOCS_REG_COUNT; i++) {
guc_mmio_regset_write_one(ads, regset_map,
GEN9_LNCFCMOCS(i).reg, 0, count++);
}
} }
XE_BUG_ON(ads->regset_size < (count * sizeof(struct guc_mmio_reg))); XE_BUG_ON(ads->regset_size < (count * sizeof(struct guc_mmio_reg)));
......
...@@ -1270,7 +1270,6 @@ static void guc_engine_resume(struct xe_engine *e) ...@@ -1270,7 +1270,6 @@ static void guc_engine_resume(struct xe_engine *e)
XE_BUG_ON(e->guc->suspend_pending); XE_BUG_ON(e->guc->suspend_pending);
xe_mocs_init_engine(e);
guc_engine_add_msg(e, msg, RESUME); guc_engine_add_msg(e, msg, RESUME);
} }
......
...@@ -517,19 +517,6 @@ static void init_l3cc_table(struct xe_gt *gt, ...@@ -517,19 +517,6 @@ static void init_l3cc_table(struct xe_gt *gt,
} }
} }
void xe_mocs_init_engine(const struct xe_engine *engine)
{
struct xe_mocs_info table;
unsigned int flags;
flags = get_mocs_settings(engine->gt->xe, &table);
if (!flags)
return;
if (flags & HAS_RENDER_L3CC && engine->class == XE_ENGINE_CLASS_RENDER)
init_l3cc_table(engine->gt, &table);
}
void xe_mocs_init(struct xe_gt *gt) void xe_mocs_init(struct xe_gt *gt)
{ {
struct xe_mocs_info table; struct xe_mocs_info table;
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
struct xe_engine; struct xe_engine;
struct xe_gt; struct xe_gt;
void xe_mocs_init_engine(const struct xe_engine *engine);
void xe_mocs_init(struct xe_gt *gt); void xe_mocs_init(struct xe_gt *gt);
/** /**
......
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