Skip to content

Commit bda3508

Browse files
vsyrjalatuxedo-wse
authored andcommitted
drm/i915/dmc: Don't enable any pipe DMC events
The pipe DMC may be making a mess of things. Keep all event handlers disabled until needed (which is never atm). This is also what Windows does on adl+. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
1 parent b58635f commit bda3508

File tree

1 file changed

+26
-1
lines changed

1 file changed

+26
-1
lines changed

drivers/gpu/drm/i915/display/intel_dmc.c

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,31 @@ void intel_dmc_disable_pipe(struct drm_i915_private *i915, enum pipe pipe)
493493
intel_de_rmw(i915, PIPEDMC_CONTROL(pipe), PIPEDMC_ENABLE, 0);
494494
}
495495

496+
static bool is_dmc_evt_reg(struct drm_i915_private *i915,
497+
enum intel_dmc_id dmc_id, i915_reg_t reg)
498+
{
499+
u32 offset = i915_mmio_reg_offset(reg);
500+
u32 start = i915_mmio_reg_offset(DMC_EVT_CTL(i915, dmc_id, 0));
501+
u32 end = i915_mmio_reg_offset(DMC_EVT_CTL(i915, dmc_id, DMC_EVENT_HANDLER_COUNT_GEN12));
502+
503+
return offset >= start && offset < end;
504+
}
505+
506+
static u32 dmc_mmiodata(struct drm_i915_private *i915,
507+
struct intel_dmc *dmc,
508+
enum intel_dmc_id dmc_id, int i)
509+
{
510+
/* keep all pipe DMC events disabled by default */
511+
if (dmc_id != DMC_FW_MAIN &&
512+
is_dmc_evt_reg(i915, dmc_id, dmc->dmc_info[dmc_id].mmioaddr[i]))
513+
return REG_FIELD_PREP(DMC_EVT_CTL_TYPE_MASK,
514+
DMC_EVT_CTL_TYPE_EDGE_0_1) |
515+
REG_FIELD_PREP(DMC_EVT_CTL_EVENT_ID_MASK,
516+
DMC_EVT_CTL_EVENT_ID_FALSE);
517+
else
518+
return dmc->dmc_info[dmc_id].mmiodata[i];
519+
}
520+
496521
/**
497522
* intel_dmc_load_program() - write the firmware from memory to register.
498523
* @i915: i915 drm device.
@@ -532,7 +557,7 @@ void intel_dmc_load_program(struct drm_i915_private *i915)
532557
for_each_dmc_id(dmc_id) {
533558
for (i = 0; i < dmc->dmc_info[dmc_id].mmio_count; i++) {
534559
intel_de_write(i915, dmc->dmc_info[dmc_id].mmioaddr[i],
535-
dmc->dmc_info[dmc_id].mmiodata[i]);
560+
dmc_mmiodata(i915, dmc, dmc_id, i));
536561
}
537562
}
538563

0 commit comments

Comments
 (0)