> -----Original Message-----
> From: Shankar, Uma <[email protected]>
> Sent: Thursday, June 11, 2026 10:10 PM
> To: Manna, Animesh <[email protected]>; intel-
> [email protected]; [email protected]
> Cc: Dibin Moolakadan Subrahmanian
> <[email protected]>; [email protected];
> Nikula, Jani <[email protected]>
> Subject: RE: [PATCH v8 07/20] drm/i915/cmtg: Set timings for CMTG by using
> transcoder timing helpers
> 
> 
> 
> > -----Original Message-----
> > From: Manna, Animesh <[email protected]>
> > Sent: Thursday, June 4, 2026 1:24 AM
> > To: [email protected]; [email protected]
> > Cc: Shankar, Uma <[email protected]>; Dibin Moolakadan
> > Subrahmanian <[email protected]>;
> > [email protected]; Nikula, Jani <[email protected]>;
> > Manna, Animesh <[email protected]>
> > Subject: [PATCH v8 07/20] drm/i915/cmtg: Set timings for CMTG by using
> > transcoder timing helpers
> >
> > Expose intel_set_transcoder_timings() &
> > intel_set_transcoder_timings_lrr()
> > so that they can program timings on any transcoder, and use them from
> > a new
> > intel_cmtg_set_timings() helper instead of duplicating the timing
> > register write sequence for CMTG.
> >
> > intel_cmtg_set_timings() maps the CPU transcoder to the corresponding
> > CMTG transcoder (TRANSCODER_A->TRANSCODER_CMTG0,
> TRANSCODER_B->
> > TRANSCODER_CMTG1) and calls the shared helper, gated by
> > intel_cmtg_is_allowed(). It is invoked from
> > hsw_configure_cpu_transcoder() for the full modeset path and from
> intel_pipe_fastset() for the LRR update path.
> >
> > v2:
> > - Use sw state instead of reading directly from hardware. [Jani]
> > - Move set_timing later after encoder enable. [Dibin]
> >
> > v3:
> > - Replace id with trans. [Jani]
> > - Program cmtg set_timing() along with primary transcoder timing.
> >
> > v4:
> > - Use _MMIO_TRANS() for cmtg registers instead of direct
> > multiplication. [Jani]
> >
> > v5:
> > - Modify register definition approach and match existing transcoder
> definition.
> > [Ville]
> >
> > v6:
> > - Reuse transcoder timing helpers. [Ville]
> >
> > Bspec: 68989
> > Signed-off-by: Animesh Manna <[email protected]>
> > ---
> >  drivers/gpu/drm/i915/display/intel_cmtg.c    | 25 ++++++++++++++++++++
> >  drivers/gpu/drm/i915/display/intel_cmtg.h    |  1 +
> >  drivers/gpu/drm/i915/display/intel_display.c | 13 +++++-----
> > drivers/gpu/drm/i915/display/intel_display.h |  4 ++++
> >  4 files changed, 37 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_cmtg.c
> > b/drivers/gpu/drm/i915/display/intel_cmtg.c
> > index fbc8a4f2b9cb..082c04bec9ee 100644
> > --- a/drivers/gpu/drm/i915/display/intel_cmtg.c
> > +++ b/drivers/gpu/drm/i915/display/intel_cmtg.c
> > @@ -219,3 +219,28 @@ void intel_cmtg_set_clk_select(const struct
> > intel_crtc_state *crtc_state)
> >     if (clk_sel_set)
> >             intel_de_rmw(display, CMTG_CLK_SEL, clk_sel_clr,
> clk_sel_set); }
> > +
> > +static inline enum transcoder to_cmtg_transcoder(enum transcoder
> > +cpu_transcoder) {
> > +   switch (cpu_transcoder) {
> > +   case TRANSCODER_A:
> > +           return TRANSCODER_CMTG0;
> > +   case TRANSCODER_B:
> > +           return TRANSCODER_CMTG1;
> > +   default:
> > +           return INVALID_TRANSCODER;
> > +   }
> > +}
> > +
> > +void intel_cmtg_set_timings(const struct intel_crtc_state
> > +*crtc_state, bool lrr) {
> > +   enum transcoder cmtg_transcoder =
> > +to_cmtg_transcoder(crtc_state->cpu_transcoder);
> 
> This can get INVALID_TRANSCODER, we should add protection for it.
> Check below should help, but better to add an explicit check.

Added an explicit check in next version.

> 
> > +
> > +   if (!intel_cmtg_is_allowed(crtc_state))
> > +           return;
> > +
> > +   if (lrr)
> > +           intel_set_transcoder_timings_lrr(crtc_state,
> cmtg_transcoder);
> > +   else
> > +           intel_set_transcoder_timings(crtc_state, cmtg_transcoder); }
> > diff --git a/drivers/gpu/drm/i915/display/intel_cmtg.h
> > b/drivers/gpu/drm/i915/display/intel_cmtg.h
> > index 87092ce6d67b..53a44f505dd2 100644
> > --- a/drivers/gpu/drm/i915/display/intel_cmtg.h
> > +++ b/drivers/gpu/drm/i915/display/intel_cmtg.h
> > @@ -11,6 +11,7 @@
> >  struct intel_display;
> >  struct intel_crtc_state;
> >
> > +void intel_cmtg_set_timings(const struct intel_crtc_state
> > +*crtc_state, bool lrr);
> >  void intel_cmtg_set_clk_select(const struct intel_crtc_state
> > *crtc_state);  void intel_cmtg_sanitize(struct intel_display
> > *display);  bool intel_cmtg_is_allowed(const struct intel_crtc_state
> > *crtc_state); diff --git
> > a/drivers/gpu/drm/i915/display/intel_display.c
> > b/drivers/gpu/drm/i915/display/intel_display.c
> > index 17621f66501f..a6a1da4bd98d 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -60,6 +60,7 @@
> >  #include "intel_bw.h"
> >  #include "intel_cdclk.h"
> >  #include "intel_clock_gating.h"
> > +#include "intel_cmtg.h"
> >  #include "intel_color.h"
> >  #include "intel_crt.h"
> >  #include "intel_crtc.h"
> > @@ -132,8 +133,6 @@
> >  #include "vlv_dsi_pll.h"
> >  #include "vlv_dsi_regs.h"
> >
> > -static void intel_set_transcoder_timings(const struct intel_crtc_state
> *crtc_state,
> > -                                    enum transcoder transcoder);
> >  static void intel_set_pipe_src_size(const struct intel_crtc_state
> > *crtc_state); static void hsw_set_transconf(const struct
> > intel_crtc_state *crtc_state);  static void bdw_set_pipe_misc(struct
> > intel_dsb *dsb, @@ -1637,6 +1636,7 @@ static void
> hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta
> >     }
> >
> >     intel_set_transcoder_timings(crtc_state,
> > crtc_state->cpu_transcoder);
> > +   intel_cmtg_set_timings(crtc_state, false);
> >
> >     if (cpu_transcoder != TRANSCODER_EDP)
> >             intel_de_write(display, TRANS_MULT(display,
> cpu_transcoder), @@
> > -2665,8 +2665,8 @@ transcoder_has_vrr(const struct intel_crtc_state
> > *crtc_state)
> >     return HAS_VRR(display) && !transcoder_is_dsi(cpu_transcoder);
> >  }
> >
> > -static void intel_set_transcoder_timings(const struct intel_crtc_state
> *crtc_state,
> > -                                    enum transcoder transcoder)
> > +void intel_set_transcoder_timings(const struct intel_crtc_state 
> > *crtc_state,
> > +                             enum transcoder transcoder)
> >  {
> >     struct intel_display *display = to_intel_display(crtc_state);
> >     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> > @@ -2777,8 +2777,8 @@ static void intel_set_transcoder_timings(const
> > struct intel_crtc_state *crtc_sta
> >     }
> >  }
> >
> > -static void intel_set_transcoder_timings_lrr(const struct
> > intel_crtc_state *crtc_state,
> > -                                        enum transcoder transcoder)
> > +void intel_set_transcoder_timings_lrr(const struct intel_crtc_state
> *crtc_state,
> > +                                 enum transcoder transcoder)
> >  {
> >     struct intel_display *display = to_intel_display(crtc_state);
> >     const struct drm_display_mode *adjusted_mode = &crtc_state-
> > >hw.adjusted_mode; @@ -6673,6 +6673,7 @@ static void
> > intel_pipe_fastset(const struct intel_crtc_state *old_crtc_state,
> >
> >     if (new_crtc_state->update_lrr) {
> >             intel_set_transcoder_timings_lrr(new_crtc_state,
> new_crtc_state-
> > >cpu_transcoder);
> > +           intel_cmtg_set_timings(new_crtc_state, true);
> 
> Maybe instead of true and false here, an enum with explicit names can be
> used as argument.

enum set_timing_type {
        MODESET = 0,
        LRR
};

Added the above enum to intel_cmtg.h in next version. Hope that works.

Regards,
Animesh

> 
> With above fixed, this is
> Reviewed-by: Uma Shankar <[email protected]>
> 
> >             intel_vrr_set_fixed_rr_timings(new_crtc_state);
> >             intel_vrr_transcoder_enable(new_crtc_state);
> >     }
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.h
> > b/drivers/gpu/drm/i915/display/intel_display.h
> > index 1963dbc80221..ef7e0506f77f 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display.h
> > @@ -424,6 +424,10 @@ void intel_set_m_n(struct intel_display *display,
> >                const struct intel_link_m_n *m_n,
> >                intel_reg_t data_m_reg, intel_reg_t data_n_reg,
> >                intel_reg_t link_m_reg, intel_reg_t link_n_reg);
> > +void intel_set_transcoder_timings(const struct intel_crtc_state 
> > *crtc_state,
> > +                             enum transcoder transcoder);
> > +void intel_set_transcoder_timings_lrr(const struct intel_crtc_state
> *crtc_state,
> > +                                 enum transcoder transcoder);
> >  void intel_get_m_n(struct intel_display *display,
> >                struct intel_link_m_n *m_n,
> >                intel_reg_t data_m_reg, intel_reg_t data_n_reg,
> > --
> > 2.29.0

Reply via email to