Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Gustavo Sousa <gustavo.sousa@intel.com>
To: Imre Deak <imre.deak@intel.com>,
	<intel-gfx@lists.freedesktop.org>,
	<intel-xe@lists.freedesktop.org>
Cc: Mika Kahola <mika.kahola@intel.com>, <stable@vger.kernel.org>
Subject: Re: [PATCH] drm/i915/ptl: Use everywhere the correct DDI port clock select mask
Date: Mon, 12 May 2025 17:03:52 -0300	[thread overview]
Message-ID: <174708023231.10493.6499863984617165104@intel.com> (raw)
In-Reply-To: <20250512142600.824347-1-imre.deak@intel.com>

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@intel.com>
>Cc: stable@vger.kernel.org # v6.13+
>Signed-off-by: Imre Deak <imre.deak@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
>

  parent reply	other threads:[~2025-05-12 20:04 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-12 14:26 [PATCH] drm/i915/ptl: Use everywhere the correct DDI port clock select mask Imre Deak
2025-05-12 15:37 ` ✓ CI.Patch_applied: success for " Patchwork
2025-05-12 15:37 ` ✗ CI.checkpatch: warning " Patchwork
2025-05-12 15:38 ` ✓ CI.KUnit: success " Patchwork
2025-05-12 15:48 ` ✗ CI.Build: failure " Patchwork
2025-05-12 20:03 ` Gustavo Sousa [this message]
2025-05-12 20:26   ` [PATCH] " Imre Deak
2025-05-13  7:04     ` Kahola, Mika
2025-05-13  9:17 ` ✓ CI.Patch_applied: success for " Patchwork
2025-05-13  9:17 ` ✗ CI.checkpatch: warning " Patchwork
2025-05-13  9:18 ` ✓ CI.KUnit: success " Patchwork
2025-05-13  9:27 ` ✓ CI.Build: " Patchwork
2025-05-13  9:29 ` ✓ CI.Hooks: " Patchwork
2025-05-13  9:31 ` ✓ CI.checksparse: " Patchwork
2025-05-13  9:59 ` ✓ Xe.CI.BAT: " Patchwork
2025-05-13 11:24 ` ✗ Xe.CI.Full: failure " Patchwork
     [not found] ` <174708367140.71634.6259169189791900977@c664b1dc75d1>
2025-05-14 13:12   ` ✗ i915.CI.Full: " Imre Deak
2025-05-26 21:32 ` ✗ CI.Patch_applied: " 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=174708023231.10493.6499863984617165104@intel.com \
    --to=gustavo.sousa@intel.com \
    --cc=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=mika.kahola@intel.com \
    --cc=stable@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox