diff --git a/drivers/gpu/drm/xe/xe_execlist.c b/drivers/gpu/drm/xe/xe_execlist.c index be47d28da4c7..ae7ee56f1b1b 100644 --- a/drivers/gpu/drm/xe/xe_execlist.c +++ b/drivers/gpu/drm/xe/xe_execlist.c @@ -460,7 +460,7 @@ static void execlist_engine_suspend_wait(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 = { diff --git a/drivers/gpu/drm/xe/xe_guc_ads.c b/drivers/gpu/drm/xe/xe_guc_ads.c index 49725093fb47..7a892ff7aba3 100644 --- a/drivers/gpu/drm/xe/xe_guc_ads.c +++ b/drivers/gpu/drm/xe/xe_guc_ads.c @@ -207,6 +207,11 @@ static void guc_ads_fini(struct drm_device *drm, void *arg) 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) { struct xe_reg_sr_entry *sr_entry; @@ -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) 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); } @@ -431,6 +439,7 @@ static unsigned int guc_mmio_regset_write(struct xe_guc_ads *ads, struct iosys_map *regset_map, struct xe_hw_engine *hwe) { + struct xe_device *xe = ads_to_xe(ads); struct xe_hw_engine *hwe_rcs_reset_domain = xe_gt_any_hw_engine_by_reset_domain(hwe->gt, XE_ENGINE_CLASS_RENDER); struct xe_reg_sr_entry *entry; @@ -465,9 +474,12 @@ static unsigned int guc_mmio_regset_write(struct xe_guc_ads *ads, e->reg, e->flags, count++); } - for (i = 0; i < LNCFCMOCS_REG_COUNT; i++) { - guc_mmio_regset_write_one(ads, regset_map, - GEN9_LNCFCMOCS(i).reg, 0, count++); + /* Wa_1607983814 */ + if (needs_wa_1607983814(xe) && hwe->class == XE_ENGINE_CLASS_RENDER) { + 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))); diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c index aa21f2bb5cba..0ba6f5dcd029 100644 --- a/drivers/gpu/drm/xe/xe_guc_submit.c +++ b/drivers/gpu/drm/xe/xe_guc_submit.c @@ -1270,7 +1270,6 @@ static void guc_engine_resume(struct xe_engine *e) XE_BUG_ON(e->guc->suspend_pending); - xe_mocs_init_engine(e); guc_engine_add_msg(e, msg, RESUME); } diff --git a/drivers/gpu/drm/xe/xe_mocs.c b/drivers/gpu/drm/xe/xe_mocs.c index e00fa2155dc4..ef237853fdab 100644 --- a/drivers/gpu/drm/xe/xe_mocs.c +++ b/drivers/gpu/drm/xe/xe_mocs.c @@ -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) { struct xe_mocs_info table; diff --git a/drivers/gpu/drm/xe/xe_mocs.h b/drivers/gpu/drm/xe/xe_mocs.h index aba1abe216ab..63500a1d6660 100644 --- a/drivers/gpu/drm/xe/xe_mocs.h +++ b/drivers/gpu/drm/xe/xe_mocs.h @@ -11,7 +11,6 @@ struct xe_engine; struct xe_gt; -void xe_mocs_init_engine(const struct xe_engine *engine); void xe_mocs_init(struct xe_gt *gt); /**