From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Animesh Manna <animesh.manna@intel.com>
Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
uma.shankar@intel.com, dibin.moolakadan.subrahmanian@intel.com,
jani.nikula@intel.com
Subject: Re: [PATCH v7 04/15] drm/i915/cmtg: Set timings for CMTG
Date: Fri, 29 May 2026 13:58:41 +0300 [thread overview]
Message-ID: <ahlxYUKRBlA1KMDP@intel.com> (raw)
In-Reply-To: <20260526133811.2621675-5-animesh.manna@intel.com>
On Tue, May 26, 2026 at 07:08:00PM +0530, Animesh Manna wrote:
> Timing registers are separate for CMTG, read transcoder register
> and program cmtg transcoder with those values.
>
> 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]
>
> Signed-off-by: Animesh Manna <animesh.manna@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_cmtg.c | 74 ++++++++++++++++++++
> drivers/gpu/drm/i915/display/intel_cmtg.h | 1 +
> drivers/gpu/drm/i915/display/intel_display.c | 4 ++
> 3 files changed, 79 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_cmtg.c b/drivers/gpu/drm/i915/display/intel_cmtg.c
> index fbc8a4f2b9cb..0e730afbb4ab 100644
> --- a/drivers/gpu/drm/i915/display/intel_cmtg.c
> +++ b/drivers/gpu/drm/i915/display/intel_cmtg.c
> @@ -219,3 +219,77 @@ 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)
> +{
> + struct intel_display *display = to_intel_display(crtc_state);
> + const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
> + enum transcoder cmtg_transcoder = to_cmtg_transcoder(crtc_state->cpu_transcoder);
> + u32 crtc_vdisplay, crtc_vtotal, crtc_vblank_start, crtc_vblank_end;
> +
> + if (!intel_cmtg_is_allowed(crtc_state))
> + return;
> +
> + crtc_vdisplay = adjusted_mode->crtc_vdisplay;
> +
> + /*
> + * For platforms that always use VRR Timing Generator, the VTOTAL.Vtotal
> + * bits are not required. Since the support for these bits is going to
> + * be deprecated in upcoming platforms, avoid writing these bits for the
> + * platforms that do not use legacy Timing Generator.
> + */
> + crtc_vtotal = 1;
> +
> + /*
> + * VBLANK_START not used by hw, just clear it
> + * to make it stand out in register dumps.
> + */
> + crtc_vblank_start = 1;
> +
> + crtc_vblank_end = adjusted_mode->crtc_vblank_end;
> +
> + if (lrr) {
> + intel_de_write(display, TRANS_SET_CONTEXT_LATENCY(display, cmtg_transcoder),
> + crtc_state->set_context_latency);
> + intel_de_write(display, TRANS_VBLANK(display, cmtg_transcoder),
> + VBLANK_START(crtc_vblank_start - 1) |
> + VBLANK_END(crtc_vblank_end - 1));
> + intel_de_write(display, TRANS_VTOTAL(display, cmtg_transcoder),
> + VACTIVE(crtc_vdisplay - 1) |
> + VTOTAL(crtc_vtotal - 1));
> + return;
> + }
> +
> + intel_de_write(display, TRANS_HTOTAL(display, cmtg_transcoder),
> + HACTIVE(adjusted_mode->crtc_hdisplay - 1) |
> + HTOTAL(adjusted_mode->crtc_htotal - 1));
> + intel_de_write(display, TRANS_HBLANK(display, cmtg_transcoder),
> + HBLANK_START(adjusted_mode->crtc_hblank_start - 1) |
> + HBLANK_END(adjusted_mode->crtc_hblank_end - 1));
> + intel_de_write(display, TRANS_HSYNC(display, cmtg_transcoder),
> + HSYNC_START(adjusted_mode->crtc_hsync_start - 1) |
> + HSYNC_END(adjusted_mode->crtc_hsync_end - 1));
> + intel_de_write(display, TRANS_VTOTAL(display, cmtg_transcoder),
> + VACTIVE(crtc_vdisplay - 1) |
> + VTOTAL(crtc_vtotal - 1));
> + intel_de_write(display, TRANS_VBLANK(display, cmtg_transcoder),
> + VBLANK_START(crtc_vblank_start - 1) |
> + VBLANK_END(crtc_vblank_end - 1));
> + intel_de_write(display, TRANS_VSYNC(display, cmtg_transcoder),
> + VSYNC_START(adjusted_mode->crtc_vsync_start - 1) |
> + VSYNC_END(adjusted_mode->crtc_vsync_end - 1));
> + intel_de_write(display, TRANS_SET_CONTEXT_LATENCY(display, cmtg_transcoder),
> + crtc_state->set_context_latency);
> +}
We already have functions to configure the timing registers. Why can't
we just reuse those (as in pass the transcoder from the caller)?
> 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 6c8935f69db1..f8bcd1fcddca 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"
> @@ -2753,6 +2754,8 @@ static void intel_set_transcoder_timings(const struct intel_crtc_state *crtc_sta
> intel_de_write(display, DP_MIN_HBLANK_CTL(cpu_transcoder),
> crtc_state->min_hblank);
> }
> +
> + intel_cmtg_set_timings(crtc_state, false);
> }
>
> static void intel_set_transcoder_timings_lrr(const struct intel_crtc_state *crtc_state)
> @@ -2814,6 +2817,7 @@ static void intel_set_transcoder_timings_lrr(const struct intel_crtc_state *crtc
> VACTIVE(crtc_vdisplay - 1) |
> VTOTAL(crtc_vtotal - 1));
>
> + intel_cmtg_set_timings(crtc_state, true);
> intel_vrr_set_fixed_rr_timings(crtc_state);
> intel_vrr_transcoder_enable(crtc_state);
> }
> --
> 2.29.0
--
Ville Syrjälä
Intel
next prev parent reply other threads:[~2026-05-29 10:58 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-26 13:37 [PATCH v7 00/15] CMTG enablement Animesh Manna
2026-05-26 13:37 ` [PATCH v7 01/15] drm/i915/cmtg: Add intel_cmtg_is_allowed() for CMTG Animesh Manna
2026-05-29 10:22 ` Dibin Moolakadan Subrahmanian
2026-05-26 13:37 ` [PATCH v7 02/15] drm/i915/cmtg: Set CMTG clock select Animesh Manna
2026-05-26 13:37 ` [PATCH v7 03/15] drm/i915/cmtg: Add cmtg transcoder offset in struct _device_info Animesh Manna
2026-05-26 13:38 ` [PATCH v7 04/15] drm/i915/cmtg: Set timings for CMTG Animesh Manna
2026-05-29 10:58 ` Ville Syrjälä [this message]
2026-06-01 14:31 ` Manna, Animesh
2026-06-02 8:31 ` Shankar, Uma
2026-05-26 13:38 ` [PATCH v7 05/15] drm/i915/cmtg: Program VRR registers of CMTG Animesh Manna
2026-05-26 13:38 ` [PATCH v7 06/15] drm/i915/cmtg: Set transcoder mn for CMTG Animesh Manna
2026-05-26 13:38 ` [PATCH v7 07/15] drm/i915/cmtg: Add hook to enable CMTG with sync to port Animesh Manna
2026-05-26 13:38 ` [PATCH v7 08/15] drm/i915/cmtg: Add a hook to make eDP transcoder secondary Animesh Manna
2026-05-29 10:27 ` Dibin Moolakadan Subrahmanian
2026-05-29 10:52 ` Ville Syrjälä
2026-06-01 13:39 ` Manna, Animesh
2026-05-26 13:38 ` [PATCH v7 09/15] drm/i915/cmtg: Modify existing hook to disable CMTG Animesh Manna
2026-05-29 11:02 ` Ville Syrjälä
2026-06-01 14:43 ` Manna, Animesh
2026-05-26 13:38 ` [PATCH v7 10/15] drm/i915/cmtg: Add CMTG interrupt handling Animesh Manna
2026-05-29 14:15 ` Dibin Moolakadan Subrahmanian
2026-06-03 12:22 ` Manna, Animesh
2026-05-26 13:38 ` [PATCH v7 11/15] drm/i915/cmtg: Add CMTG HWGB programming Animesh Manna
2026-05-26 13:38 ` [PATCH v7 12/15] drm/i915/cmtg: Add CMTG scan line programming Animesh Manna
2026-05-26 13:38 ` [PATCH v7 13/15] drm/i915/cmtg: Add trigger to enable/disable cmtg Animesh Manna
2026-05-29 14:28 ` Dibin Moolakadan Subrahmanian
2026-06-03 12:27 ` Manna, Animesh
2026-05-26 13:38 ` [PATCH v7 14/15] drm/i915/cmtg: Restore CMTG after DC6 exit Animesh Manna
2026-05-26 13:38 ` [PATCH v7 15/15] [Not for Review] Debug patch Animesh Manna
2026-05-26 15:02 ` ✓ CI.KUnit: success for CMTG enablement (rev8) Patchwork
2026-05-26 16:10 ` ✓ Xe.CI.BAT: " Patchwork
2026-05-26 18:01 ` ✓ i915.CI.BAT: success for CMTG enablement (rev7) Patchwork
2026-05-26 18:30 ` ✓ Xe.CI.FULL: success for CMTG enablement (rev8) Patchwork
2026-05-27 1:52 ` ✗ i915.CI.Full: failure for CMTG enablement (rev7) Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ahlxYUKRBlA1KMDP@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=animesh.manna@intel.com \
--cc=dibin.moolakadan.subrahmanian@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jani.nikula@intel.com \
--cc=uma.shankar@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.