> -----Original Message-----
> From: Intel-gfx <intel-gfx-boun...@lists.freedesktop.org> On Behalf Of Ville
> Syrjala
> Sent: Wednesday, June 11, 2025 9:23 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: intel...@lists.freedesktop.org
> Subject: [PATCH 7/9] drm/i915/dmc: Assert DMC is loaded harder
> 
> From: Ville Syrjälä <ville.syrj...@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.shan...@intel.com>

> Signed-off-by: Ville Syrjälä <ville.syrj...@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

Reply via email to