[PATCH 7/9] drm/i915/dmc: Assert DMC is loaded harder
Shankar, Uma
uma.shankar at intel.com
Thu Jun 12 20:55:21 UTC 2025
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Ville
> Syrjala
> Sent: Wednesday, June 11, 2025 9:23 PM
> To: intel-gfx at lists.freedesktop.org
> Cc: intel-xe at lists.freedesktop.org
> Subject: [PATCH 7/9] drm/i915/dmc: Assert DMC is loaded harder
>
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Currently we have some asserts to make sure the main DMC has been loaded.
> Add similar assers for the pipe DMCs. And we migth as well just check all the
Nit: Typo in assert and might
> mmio registers the firmware has asked us to initialize. That also covers the
> hardcoded SSP/HTP registers we were checking for the main DMC.
>
> TODO: Maybe always configure DMC_EVT_CTL_ENABLE the way the firmware
> has it set so that we wouldn't need to special case in the assert?
>
> v2: Also assert in intel_dmc_load_program()
Looks Good to me.
Reviewed-by: Uma Shankar <uma.shankar at intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> .../i915/display/intel_display_power_well.c | 4 +-
> drivers/gpu/drm/i915/display/intel_dmc.c | 60 ++++++++++++++-----
> drivers/gpu/drm/i915/display/intel_dmc.h | 2 +-
> 3 files changed, 48 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power_well.c
> b/drivers/gpu/drm/i915/display/intel_display_power_well.c
> index cba96f920fd2..0f1848b970a7 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power_well.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_power_well.c
> @@ -829,7 +829,7 @@ static void assert_can_enable_dc5(struct intel_display
> *display)
>
> assert_display_rpm_held(display);
>
> - assert_dmc_loaded(display);
> + assert_main_dmc_loaded(display);
> }
>
> void gen9_enable_dc5(struct intel_display *display) @@ -860,7 +860,7 @@
> static void assert_can_enable_dc6(struct intel_display *display)
> DC_STATE_EN_UPTO_DC6),
> "DC6 already programmed to be enabled.\n");
>
> - assert_dmc_loaded(display);
> + assert_main_dmc_loaded(display);
> }
>
> void skl_enable_dc6(struct intel_display *display) diff --git
> a/drivers/gpu/drm/i915/display/intel_dmc.c
> b/drivers/gpu/drm/i915/display/intel_dmc.c
> index 76b88c9bea02..37618797d931 100644
> --- a/drivers/gpu/drm/i915/display/intel_dmc.c
> +++ b/drivers/gpu/drm/i915/display/intel_dmc.c
> @@ -606,6 +606,46 @@ static void dmc_load_program(struct intel_display
> *display, enum intel_dmc_id dm
> dmc_load_mmio(display, dmc_id);
> }
>
> +static void assert_dmc_loaded(struct intel_display *display,
> + enum intel_dmc_id dmc_id)
> +{
> + struct intel_dmc *dmc = display_to_dmc(display);
> + u32 expected, found;
> + int i;
> +
> + if (!is_valid_dmc_id(dmc_id) || !has_dmc_id_fw(display, dmc_id))
> + return;
> +
> + found = intel_de_read(display, DMC_PROGRAM(dmc-
> >dmc_info[dmc_id].start_mmioaddr, 0));
> + expected = dmc->dmc_info[dmc_id].payload[0];
> +
> + drm_WARN(display->drm, found != expected,
> + "DMC %d program storage start incorrect (expected 0x%x,
> current 0x%x)\n",
> + dmc_id, expected, found);
> +
> + for (i = 0; i < dmc->dmc_info[dmc_id].mmio_count; i++) {
> + i915_reg_t reg = dmc->dmc_info[dmc_id].mmioaddr[i];
> +
> + found = intel_de_read(display, reg);
> + expected = dmc_mmiodata(display, dmc, dmc_id, i);
> +
> + /* once set DMC_EVT_CTL_ENABLE can't be cleared :/ */
> + if (is_dmc_evt_ctl_reg(display, dmc_id, reg)) {
> + found &= ~DMC_EVT_CTL_ENABLE;
> + expected &= ~DMC_EVT_CTL_ENABLE;
> + }
> +
> + drm_WARN(display->drm, found != expected,
> + "DMC %d mmio[%d]/0x%x incorrect (expected 0x%x,
> current 0x%x)\n",
> + dmc_id, i, i915_mmio_reg_offset(reg), expected, found);
> + }
> +}
> +
> +void assert_main_dmc_loaded(struct intel_display *display) {
> + assert_dmc_loaded(display, DMC_FW_MAIN); }
> +
> static bool need_pipedmc_load_program(struct intel_display *display) {
> /* On TGL/derivatives pipe DMC state is lost when PG1 is disabled */ @@
> -635,6 +675,8 @@ void intel_dmc_enable_pipe(struct intel_display *display, enum
> pipe pipe)
> else if (need_pipedmc_load_mmio(display, pipe))
> dmc_load_mmio(display, dmc_id);
>
> + assert_dmc_loaded(display, dmc_id);
> +
> if (DISPLAY_VER(display) >= 20) {
> intel_de_write(display, PIPEDMC_INTERRUPT(pipe),
> pipedmc_interrupt_mask(display));
> intel_de_write(display, PIPEDMC_INTERRUPT_MASK(pipe),
> ~pipedmc_interrupt_mask(display));
> @@ -744,8 +786,10 @@ void intel_dmc_load_program(struct intel_display
> *display)
>
> pipedmc_clock_gating_wa(display, true);
>
> - for_each_dmc_id(dmc_id)
> + for_each_dmc_id(dmc_id) {
> dmc_load_program(display, dmc_id);
> + assert_dmc_loaded(display, dmc_id);
> + }
>
> power_domains->dc_state = 0;
>
> @@ -776,20 +820,6 @@ void intel_dmc_disable_program(struct intel_display
> *display)
> pipedmc_clock_gating_wa(display, false); }
>
> -void assert_dmc_loaded(struct intel_display *display) -{
> - struct intel_dmc *dmc = display_to_dmc(display);
> -
> - drm_WARN_ONCE(display->drm, !dmc, "DMC not initialized\n");
> - drm_WARN_ONCE(display->drm, dmc &&
> - !intel_de_read(display, DMC_PROGRAM(dmc-
> >dmc_info[DMC_FW_MAIN].start_mmioaddr, 0)),
> - "DMC program storage start is NULL\n");
> - drm_WARN_ONCE(display->drm, !intel_de_read(display,
> DMC_SSP_BASE),
> - "DMC SSP Base Not fine\n");
> - drm_WARN_ONCE(display->drm, !intel_de_read(display,
> DMC_HTP_SKL),
> - "DMC HTP Not fine\n");
> -}
> -
> static bool fw_info_matches_stepping(const struct intel_fw_info *fw_info,
> const struct stepping_info *si) { diff --git
> a/drivers/gpu/drm/i915/display/intel_dmc.h
> b/drivers/gpu/drm/i915/display/intel_dmc.h
> index a98e8deff13a..a3792052078a 100644
> --- a/drivers/gpu/drm/i915/display/intel_dmc.h
> +++ b/drivers/gpu/drm/i915/display/intel_dmc.h
> @@ -32,7 +32,7 @@ struct intel_dmc_snapshot
> *intel_dmc_snapshot_capture(struct intel_display *disp void
> intel_dmc_snapshot_print(const struct intel_dmc_snapshot *snapshot, struct
> drm_printer *p); void intel_dmc_update_dc6_allowed_count(struct intel_display
> *display, bool start_tracking);
>
> -void assert_dmc_loaded(struct intel_display *display);
> +void assert_main_dmc_loaded(struct intel_display *display);
>
> void intel_pipedmc_irq_handler(struct intel_display *display, enum pipe pipe);
>
> --
> 2.49.0
More information about the Intel-gfx
mailing list