> -----Original Message-----
> From: Jani Nikula <[email protected]>
> Sent: Monday, November 17, 2025 8:43 PM
> To: Manna, Animesh <[email protected]>; intel-
> [email protected]; [email protected]
> Cc: Manna, Animesh <[email protected]>
> Subject: Re: [RFC 3/8] drm/i915/cmtg: set timings for cmtg
> 
> On Mon, 17 Nov 2025, Animesh Manna <[email protected]> wrote:
> > Timing registers are separate for CMTG, read transcoder register and
> > program cmtg transcoder with those values.
> >
> > Signed-off-by: Animesh Manna <[email protected]>
> > ---
> >  drivers/gpu/drm/i915/display/intel_cmtg.c     | 31 +++++++++++++++++++
> >  drivers/gpu/drm/i915/display/intel_cmtg.h     |  1 +
> >  .../gpu/drm/i915/display/intel_cmtg_regs.h    | 13 ++++++++
> >  drivers/gpu/drm/i915/display/intel_display.c  |  4 +++
> >  4 files changed, 49 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_cmtg.c
> > b/drivers/gpu/drm/i915/display/intel_cmtg.c
> > index 4640cafe8dde..5e9aaa50b38f 100644
> > --- a/drivers/gpu/drm/i915/display/intel_cmtg.c
> > +++ b/drivers/gpu/drm/i915/display/intel_cmtg.c
> > @@ -208,3 +208,34 @@ 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 void intel_cmtg_set_timings(const struct intel_crtc_state
> > +*crtc_state) {
> > +   struct intel_display *display = to_intel_display(crtc_state);
> > +   enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
> > +
> > +   intel_de_write(display, TRANS_HTOTAL_CMTG(cpu_transcoder),
> > +                  intel_de_read(display, TRANS_HTOTAL(display,
> cpu_transcoder)));
> > +   intel_de_write(display, TRANS_HBLANK_CMTG(cpu_transcoder),
> > +                  intel_de_read(display, TRANS_HBLANK(display,
> cpu_transcoder)));
> > +   intel_de_write(display, TRANS_HSYNC_CMTG(cpu_transcoder),
> > +                  intel_de_read(display, TRANS_HSYNC(display,
> cpu_transcoder)));
> > +   intel_de_write(display, TRANS_VTOTAL_CMTG(cpu_transcoder),
> > +                  intel_de_read(display, TRANS_VTOTAL(display,
> cpu_transcoder)));
> > +   intel_de_write(display, TRANS_VBLANK_CMTG(cpu_transcoder),
> > +                  intel_de_read(display, TRANS_VBLANK(display,
> cpu_transcoder)));
> > +   intel_de_write(display, TRANS_VSYNC_CMTG(cpu_transcoder),
> > +                  intel_de_read(display, TRANS_VSYNC(display,
> > +cpu_transcoder)));
> 
> If something needs to be written in multiple places, it needs to be written
> from the same source software state, not via hardware like this.

Taken care in next version, currently debug ongoing with flipQ, will float 
after that.

Regards,
Animesh
> 
> > +}
> > +
> > +void intel_cmtg_enable(const struct intel_crtc_state *crtc_state) {
> > +   enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
> > +
> > +   if (cpu_transcoder != TRANSCODER_A && cpu_transcoder !=
> TRANSCODER_B)
> > +           return;
> > +
> > +   /* Program CMTG Transcoder Timings */
> 
> Is this comment helpful?
> 
> > +   intel_cmtg_set_timings(crtc_state);
> > +
> > +}
> > diff --git a/drivers/gpu/drm/i915/display/intel_cmtg.h
> > b/drivers/gpu/drm/i915/display/intel_cmtg.h
> > index bef2426b2787..113042e5d3a8 100644
> > --- a/drivers/gpu/drm/i915/display/intel_cmtg.h
> > +++ b/drivers/gpu/drm/i915/display/intel_cmtg.h
> > @@ -11,5 +11,6 @@ struct intel_crtc_state;
> >
> >  void intel_cmtg_set_clk_select(const struct intel_crtc_state
> > *crtc_state);  void intel_cmtg_sanitize(struct intel_display
> > *display);
> > +void intel_cmtg_enable(const struct intel_crtc_state *crtc_state);
> >
> >  #endif /* __INTEL_CMTG_H__ */
> > diff --git a/drivers/gpu/drm/i915/display/intel_cmtg_regs.h
> > b/drivers/gpu/drm/i915/display/intel_cmtg_regs.h
> > index 9fd54f7e9d1f..47403bbcac7d 100644
> > --- a/drivers/gpu/drm/i915/display/intel_cmtg_regs.h
> > +++ b/drivers/gpu/drm/i915/display/intel_cmtg_regs.h
> > @@ -8,6 +8,12 @@
> >
> >  #include "intel_display_reg_defs.h"
> >
> > +enum cmtg {
> > +   CMTG_A = 0,
> > +   CMTG_B,
> > +   MAX_CMTG
> > +};
> > +
> >  #define CMTG_CLK_SEL                       _MMIO(0x46160)
> >  #define CMTG_CLK_SEL_A_MASK                REG_GENMASK(31, 29)
> >  #define CMTG_CLK_SELECT_PHYA_ENABLE        0x4
> > @@ -20,4 +26,11 @@
> >  #define TRANS_CMTG_CTL_B           _MMIO(0x6fb88)
> >  #define  CMTG_ENABLE                       REG_BIT(31)
> >
> > +#define TRANS_HTOTAL_CMTG(id)              _MMIO(0x6F000 + (id) *
> 0x100)
> > +#define TRANS_HBLANK_CMTG(id)              _MMIO(0x6F004 + (id) *
> 0x100)
> > +#define TRANS_HSYNC_CMTG(id)               _MMIO(0x6F008 + (id) *
> 0x100)
> > +#define TRANS_VTOTAL_CMTG(id)              _MMIO(0x6F00C + (id) *
> 0x100)
> > +#define TRANS_VBLANK_CMTG(id)              _MMIO(0x6F010 + (id) *
> 0x100)
> > +#define TRANS_VSYNC_CMTG(id)               _MMIO(0x6F014 + (id) *
> 0x100)
> > +
> >  #endif /* __INTEL_CMTG_REGS_H__ */
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> > b/drivers/gpu/drm/i915/display/intel_display.c
> > index 069967114bd9..19242c12f52a 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -63,6 +63,7 @@
> >  #include "intel_casf.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"
> > @@ -1669,6 +1670,9 @@ static void hsw_crtc_enable(struct
> intel_atomic_state *state,
> >     if (!transcoder_is_dsi(cpu_transcoder))
> >             hsw_configure_cpu_transcoder(new_crtc_state);
> >
> > +   if (new_crtc_state->enable_cmtg)
> > +           intel_cmtg_enable(new_crtc_state);
> > +
> >     for_each_pipe_crtc_modeset_enable(display, pipe_crtc,
> new_crtc_state, i) {
> >             const struct intel_crtc_state *pipe_crtc_state =
> >                     intel_atomic_get_new_crtc_state(state, pipe_crtc);
> 
> --
> Jani Nikula, Intel

Reply via email to