[PATCH] drm/i915/ptl: Use everywhere the correct DDI port clock select mask
Gustavo Sousa
gustavo.sousa at intel.com
Mon May 12 20:03:52 UTC 2025
Quoting Imre Deak (2025-05-12 11:26:00-03:00)
>The PTL XELPDP_PORT_CLOCK_CTL register XELPDP_DDI_CLOCK_SELECT field's
>size is 5 bits vs. the earlier platforms where its size is 4 bits. Make
>sure the field is read-out/programmed everywhere correctly, according to
>the above.
>
>Cc: Mika Kahola <mika.kahola at intel.com>
>Cc: stable at vger.kernel.org # v6.13+
>Signed-off-by: Imre Deak <imre.deak at intel.com>
>---
> drivers/gpu/drm/i915/display/intel_cx0_phy.c | 27 +++++++------------
> .../gpu/drm/i915/display/intel_cx0_phy_regs.h | 15 ++++++++---
> 2 files changed, 21 insertions(+), 21 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>index b09f724c3046b..a82b93cbc81d2 100644
>--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>@@ -2763,9 +2763,9 @@ static void intel_program_port_clock_ctl(struct intel_encoder *encoder,
> val |= XELPDP_FORWARD_CLOCK_UNGATE;
>
> if (!is_dp && is_hdmi_frl(port_clock))
>- val |= XELPDP_DDI_CLOCK_SELECT(XELPDP_DDI_CLOCK_SELECT_DIV18CLK);
>+ val |= XELPDP_DDI_CLOCK_SELECT_PREP(display, XELPDP_DDI_CLOCK_SELECT_DIV18CLK);
> else
>- val |= XELPDP_DDI_CLOCK_SELECT(XELPDP_DDI_CLOCK_SELECT_MAXPCLK);
>+ val |= XELPDP_DDI_CLOCK_SELECT_PREP(display, XELPDP_DDI_CLOCK_SELECT_MAXPCLK);
>
> /* TODO: HDMI FRL */
> /* DP2.0 10G and 20G rates enable MPLLA*/
>@@ -2776,7 +2776,7 @@ static void intel_program_port_clock_ctl(struct intel_encoder *encoder,
>
> intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
> XELPDP_LANE1_PHY_CLOCK_SELECT | XELPDP_FORWARD_CLOCK_UNGATE |
>- XELPDP_DDI_CLOCK_SELECT_MASK | XELPDP_SSC_ENABLE_PLLA |
>+ XELPDP_DDI_CLOCK_SELECT_MASK(display) | XELPDP_SSC_ENABLE_PLLA |
> XELPDP_SSC_ENABLE_PLLB, val);
> }
>
>@@ -3099,10 +3099,7 @@ int intel_mtl_tbt_calc_port_clock(struct intel_encoder *encoder)
>
> val = intel_de_read(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port));
>
>- if (DISPLAY_VER(display) >= 30)
>- clock = REG_FIELD_GET(XE3_DDI_CLOCK_SELECT_MASK, val);
>- else
>- clock = REG_FIELD_GET(XELPDP_DDI_CLOCK_SELECT_MASK, val);
>+ clock = XELPDP_DDI_CLOCK_SELECT_GET(display, val);
>
> drm_WARN_ON(display->drm, !(val & XELPDP_FORWARD_CLOCK_UNGATE));
> drm_WARN_ON(display->drm, !(val & XELPDP_TBT_CLOCK_REQUEST));
>@@ -3170,13 +3167,9 @@ static void intel_mtl_tbt_pll_enable(struct intel_encoder *encoder,
> * clock muxes, gating and SSC
> */
>
>- if (DISPLAY_VER(display) >= 30) {
>- mask = XE3_DDI_CLOCK_SELECT_MASK;
>- val |= XE3_DDI_CLOCK_SELECT(intel_mtl_tbt_clock_select(display, crtc_state->port_clock));
>- } else {
>- mask = XELPDP_DDI_CLOCK_SELECT_MASK;
>- val |= XELPDP_DDI_CLOCK_SELECT(intel_mtl_tbt_clock_select(display, crtc_state->port_clock));
>- }
>+ mask = XELPDP_DDI_CLOCK_SELECT_MASK(display);
>+ val |= XELPDP_DDI_CLOCK_SELECT_PREP(display,
>+ intel_mtl_tbt_clock_select(display, crtc_state->port_clock));
>
> mask |= XELPDP_FORWARD_CLOCK_UNGATE;
> val |= XELPDP_FORWARD_CLOCK_UNGATE;
>@@ -3289,7 +3282,7 @@ static void intel_cx0pll_disable(struct intel_encoder *encoder)
>
> /* 7. Program PORT_CLOCK_CTL register to disable and gate clocks. */
> intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
>- XELPDP_DDI_CLOCK_SELECT_MASK, 0);
>+ XELPDP_DDI_CLOCK_SELECT_MASK(display), 0);
> intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
> XELPDP_FORWARD_CLOCK_UNGATE, 0);
>
>@@ -3338,7 +3331,7 @@ static void intel_mtl_tbt_pll_disable(struct intel_encoder *encoder)
> * 5. Program PORT CLOCK CTRL register to disable and gate clocks
> */
> intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
>- XELPDP_DDI_CLOCK_SELECT_MASK |
>+ XELPDP_DDI_CLOCK_SELECT_MASK(display) |
> XELPDP_FORWARD_CLOCK_UNGATE, 0);
>
> /* 6. Program DDI_CLK_VALFREQ to 0. */
>@@ -3367,7 +3360,7 @@ intel_mtl_port_pll_type(struct intel_encoder *encoder,
> * handling is done via the standard shared DPLL framework.
> */
> val = intel_de_read(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port));
>- clock = REG_FIELD_GET(XELPDP_DDI_CLOCK_SELECT_MASK, val);
>+ clock = XELPDP_DDI_CLOCK_SELECT_GET(display, val);
>
> if (clock == XELPDP_DDI_CLOCK_SELECT_MAXPCLK ||
> clock == XELPDP_DDI_CLOCK_SELECT_DIV18CLK)
>diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h b/drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h
>index 960f7f778fb81..59c22beaf1de5 100644
>--- a/drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h
>+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h
>@@ -192,10 +192,17 @@
>
> #define XELPDP_TBT_CLOCK_REQUEST REG_BIT(19)
> #define XELPDP_TBT_CLOCK_ACK REG_BIT(18)
>-#define XELPDP_DDI_CLOCK_SELECT_MASK REG_GENMASK(15, 12)
>-#define XE3_DDI_CLOCK_SELECT_MASK REG_GENMASK(16, 12)
>-#define XELPDP_DDI_CLOCK_SELECT(val) REG_FIELD_PREP(XELPDP_DDI_CLOCK_SELECT_MASK, val)
>-#define XE3_DDI_CLOCK_SELECT(val) REG_FIELD_PREP(XE3_DDI_CLOCK_SELECT_MASK, val)
>+#define _XELPDP_DDI_CLOCK_SELECT_MASK REG_GENMASK(15, 12)
>+#define _XE3_DDI_CLOCK_SELECT_MASK REG_GENMASK(16, 12)
Since bit 16 is unused for pre-Xe3 display IPs, I wonder if we should
simply redefine XELPDP_DDI_CLOCK_SELECT_MASK to be REG_GENMASK(16, 12)
and add a comment noting changes by display IP? Are we aware of
something that would be wired to bit 16 that would prevent us from doing
that?
I remember something similar was done to other register fields in the
past. Some examples I found:
3fe856180c94 ("drm/i915/xe3lpd: Add new bit range of MAX swing setup")
247bdac958fc ("drm/i915/adl_p: Add ddb allocation support")
d7e449a858ec ("drm/i915: Just use icl+ definition for PLANE_WM blocks field")
--
Gustavo Sousa
>+#define XELPDP_DDI_CLOCK_SELECT_MASK(display) (DISPLAY_VER(display) >= 30 ? \
>+ _XE3_DDI_CLOCK_SELECT_MASK : _XELPDP_DDI_CLOCK_SELECT_MASK)
>+#define XELPDP_DDI_CLOCK_SELECT_PREP(display, val) (DISPLAY_VER(display) >= 30 ? \
>+ REG_FIELD_PREP(_XE3_DDI_CLOCK_SELECT_MASK, (val)) : \
>+ REG_FIELD_PREP(_XELPDP_DDI_CLOCK_SELECT_MASK, (val)))
>+#define XELPDP_DDI_CLOCK_SELECT_GET(display, val) (DISPLAY_VER(display) >= 30 ? \
>+ REG_FIELD_GET(_XE3_DDI_CLOCK_SELECT_MASK, (val)) : \
>+ REG_FIELD_GET(_XELPDP_DDI_CLOCK_SELECT_MASK, (val)))
>+
> #define XELPDP_DDI_CLOCK_SELECT_NONE 0x0
> #define XELPDP_DDI_CLOCK_SELECT_MAXPCLK 0x8
> #define XELPDP_DDI_CLOCK_SELECT_DIV18CLK 0x9
>--
>2.44.2
>
More information about the Intel-gfx
mailing list