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.

> +}
> +
> +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