From: Mika Kahola <mika.kahola@intel.com>
To: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org
Cc: Imre Deak <imre.deak@intel.com>,
Mika Kahola <mika.kahola@intel.com>,
Suraj Kandpal <suraj.kandpal@intel.com>
Subject: [PATCH v2 11/32] drm/i915/cx0: Determine Cx0 PLL DP mode from PLL state
Date: Mon, 17 Nov 2025 12:45:41 +0200 [thread overview]
Message-ID: <20251117104602.2363671-12-mika.kahola@intel.com> (raw)
In-Reply-To: <20251117104602.2363671-1-mika.kahola@intel.com>
From: Imre Deak <imre.deak@intel.com>
The Cx0 PLL enable programming needs to know if the PLL is in DP or HDMI
mode. The PLL manager framework doesn't pass the CRTC state to the PLL's
enable hook, so prepare here for the conversion to use the PLL manager
for Cx0 PHY PLLs by determining the DP/HDMI mode from the PLL state.
For C10 PHYs use the fact that the HDMI divider value in the PLL
registers are set if and only if the PLL is in HDMI mode.
For C20 PHYs use the DP mode flag programmed to the VDR SERDES register,
which is set if and only if the PLL is in DP mode.
Assert that the above PLL/VDR SERDES register values match the DP/HDMI
mode being configured already during state computation.
This also allows dropping the is_dp param from the
__intel_cx0pll_enable() function, since it can retrieve this now from
the PLL state.
Signed-off-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Mika Kahola <mika.kahola@intel.com>
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
drivers/gpu/drm/i915/display/intel_cx0_phy.c | 43 ++++++++++++++++----
1 file changed, 36 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
index 4562e47042d2..29dfbd60c7ce 100644
--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
@@ -2085,6 +2085,24 @@ static void intel_c10pll_update_pll(struct intel_encoder *encoder,
pll_state->c10.pll[i] = 0;
}
+static bool c10pll_state_is_dp(const struct intel_c10pll_state *pll_state)
+{
+ return !REG_FIELD_GET8(C10_PLL15_HDMIDIV_MASK, pll_state->pll[15]);
+}
+
+static bool c20pll_state_is_dp(const struct intel_c20pll_state *pll_state)
+{
+ return pll_state->vdr.serdes_rate & PHY_C20_IS_DP;
+}
+
+static bool cx0pll_state_is_dp(const struct intel_cx0pll_state *pll_state)
+{
+ if (pll_state->use_c10)
+ return c10pll_state_is_dp(&pll_state->c10);
+
+ return c20pll_state_is_dp(&pll_state->c20);
+}
+
/*
* TODO: Convert the following to align with intel_c20pll_find_table() and
* intel_c20pll_calc_state_from_table().
@@ -2094,6 +2112,7 @@ static int intel_c10pll_calc_state_from_table(struct intel_encoder *encoder,
bool is_dp, int port_clock, int lane_count,
struct intel_cx0pll_state *pll_state)
{
+ struct intel_display *display = to_intel_display(encoder);
int i;
for (i = 0; tables[i]; i++) {
@@ -2105,6 +2124,8 @@ static int intel_c10pll_calc_state_from_table(struct intel_encoder *encoder,
pll_state->use_c10 = true;
pll_state->lane_count = lane_count;
+ drm_WARN_ON(display->drm, is_dp != c10pll_state_is_dp(&pll_state->c10));
+
return 0;
}
}
@@ -2115,6 +2136,8 @@ static int intel_c10pll_calc_state_from_table(struct intel_encoder *encoder,
static int intel_c10pll_calc_state(struct intel_crtc_state *crtc_state,
struct intel_encoder *encoder)
{
+ struct intel_display *display = to_intel_display(encoder);
+ bool is_dp = intel_crtc_has_dp_encoder(crtc_state);
const struct intel_c10pll_state * const *tables;
int err;
@@ -2122,8 +2145,7 @@ static int intel_c10pll_calc_state(struct intel_crtc_state *crtc_state,
if (!tables)
return -EINVAL;
- err = intel_c10pll_calc_state_from_table(encoder, tables,
- intel_crtc_has_dp_encoder(crtc_state),
+ err = intel_c10pll_calc_state_from_table(encoder, tables, is_dp,
crtc_state->port_clock, crtc_state->lane_count,
&crtc_state->dpll_hw_state.cx0pll);
@@ -2138,6 +2160,9 @@ static int intel_c10pll_calc_state(struct intel_crtc_state *crtc_state,
crtc_state->dpll_hw_state.cx0pll.use_c10 = true;
crtc_state->dpll_hw_state.cx0pll.lane_count = crtc_state->lane_count;
+ drm_WARN_ON(display->drm,
+ is_dp != c10pll_state_is_dp(&crtc_state->dpll_hw_state.cx0pll.c10));
+
return 0;
}
@@ -2624,6 +2649,7 @@ static int intel_c20pll_calc_state_from_table(struct intel_crtc_state *crtc_stat
static int intel_c20pll_calc_state(struct intel_crtc_state *crtc_state,
struct intel_encoder *encoder)
{
+ struct intel_display *display = to_intel_display(encoder);
bool is_dp = intel_crtc_has_dp_encoder(crtc_state);
int err = -ENOENT;
@@ -2644,6 +2670,9 @@ static int intel_c20pll_calc_state(struct intel_crtc_state *crtc_state,
intel_c20_calc_vdr_params(&crtc_state->dpll_hw_state.cx0pll.c20.vdr,
is_dp, crtc_state->port_clock);
+ drm_WARN_ON(display->drm,
+ is_dp != c20pll_state_is_dp(&crtc_state->dpll_hw_state.cx0pll.c20));
+
return 0;
}
@@ -2912,10 +2941,11 @@ static void intel_c20_pll_program(struct intel_display *display,
static void intel_program_port_clock_ctl(struct intel_encoder *encoder,
const struct intel_cx0pll_state *pll_state,
- bool is_dp, int port_clock,
+ int port_clock,
bool lane_reversal)
{
struct intel_display *display = to_intel_display(encoder);
+ bool is_dp = cx0pll_state_is_dp(pll_state);
u32 val = 0;
intel_de_rmw(display, XELPDP_PORT_BUF_CTL1(display, encoder->port),
@@ -3160,7 +3190,7 @@ static u32 intel_cx0_get_pclk_pll_ack(u8 lane_mask)
static void __intel_cx0pll_enable(struct intel_encoder *encoder,
const struct intel_cx0pll_state *pll_state,
- bool is_dp, int port_clock)
+ int port_clock)
{
struct intel_display *display = to_intel_display(encoder);
enum phy phy = intel_encoder_to_phy(encoder);
@@ -3174,7 +3204,7 @@ static void __intel_cx0pll_enable(struct intel_encoder *encoder,
* 1. Program PORT_CLOCK_CTL REGISTER to configure
* clock muxes, gating and SSC
*/
- intel_program_port_clock_ctl(encoder, pll_state, is_dp, port_clock, lane_reversal);
+ intel_program_port_clock_ctl(encoder, pll_state, port_clock, lane_reversal);
/* 2. Bring PHY out of reset. */
intel_cx0_phy_lane_reset(encoder, lane_reversal);
@@ -3244,7 +3274,6 @@ static void intel_cx0pll_enable(struct intel_encoder *encoder,
const struct intel_crtc_state *crtc_state)
{
__intel_cx0pll_enable(encoder, &crtc_state->dpll_hw_state.cx0pll,
- intel_crtc_has_dp_encoder(crtc_state),
crtc_state->port_clock);
}
@@ -3795,7 +3824,7 @@ void intel_cx0_pll_power_save_wa(struct intel_display *display)
"[ENCODER:%d:%s] Applying power saving workaround on disabled PLL\n",
encoder->base.base.id, encoder->base.name);
- __intel_cx0pll_enable(encoder, &pll_state, true, port_clock);
+ __intel_cx0pll_enable(encoder, &pll_state, port_clock);
intel_cx0pll_disable(encoder);
}
}
--
2.34.1
next prev parent reply other threads:[~2025-11-17 10:59 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-17 10:45 [PATCH v2 00/32] drm/i915/cx0: Add MTL+ platforms to support dpll framework Mika Kahola
2025-11-17 10:45 ` [PATCH v2 01/32] drm/i915/cx0: Rename TBT functions to be ICL specific Mika Kahola
2025-11-17 10:45 ` [PATCH v2 02/32] drm/i915/cx0: Factor out C10 msgbus access start/end helpers Mika Kahola
2025-11-17 10:45 ` [PATCH v2 03/32] drm/i915/cx0: Sanitize setting the Cx0 PLL use_c10 flag Mika Kahola
2025-11-17 10:45 ` [PATCH v2 04/32] drm/i915/cx0: Sanitize calculating C20 PLL state from tables Mika Kahola
2025-11-17 10:45 ` [PATCH v2 05/32] drm/i915/cx0: Track the C20 PHY VDR state in the PLL state Mika Kahola
2025-11-18 3:43 ` Kandpal, Suraj
2025-11-17 10:45 ` [PATCH v2 06/32] drm/i915/cx0: Move definition of Cx0 PHY functions earlier Mika Kahola
2025-11-17 10:45 ` [PATCH v2 07/32] drm/i915/cx0: Add macro to get DDI port width from a register value Mika Kahola
2025-11-17 10:45 ` [PATCH v2 08/32] drm/i915/cx0: Track the Cx0 PHY enabled lane count in the PLL state Mika Kahola
2025-11-17 10:45 ` [PATCH v2 09/32] drm/i915/cx0: Sanitize C10 PHY PLL SSC register setup Mika Kahola
2025-11-17 10:45 ` [PATCH v2 10/32] drm/i915/cx0: Read out the Cx0 PHY SSC enabled state Mika Kahola
2025-11-17 10:45 ` Mika Kahola [this message]
2025-11-17 10:45 ` [PATCH v2 12/32] drm/i915/cx0: Determine Cx0 PLL port clock from PLL state Mika Kahola
2025-11-17 10:45 ` [PATCH v2 13/32] drm/i915/cx0: Zero Cx0 PLL state before compute and HW readout Mika Kahola
2025-11-17 10:45 ` [PATCH v2 14/32] drm/i915/cx0: Print additional Cx0 PLL HW state Mika Kahola
2025-11-18 3:49 ` Kandpal, Suraj
2025-11-17 10:45 ` [PATCH v2 15/32] drm/i915/cx0: Remove state verification Mika Kahola
2025-11-17 10:45 ` [PATCH v2 16/32] drm/i915/cx0: Add PLL information for MTL+ Mika Kahola
2025-11-18 3:56 ` Kandpal, Suraj
2025-11-17 10:45 ` [PATCH v2 17/32] drm/i915/cx0: Update C10/C20 state calculation Mika Kahola
2025-11-18 4:00 ` Kandpal, Suraj
2025-11-17 10:45 ` [PATCH v2 18/32] drm/i915/cx0: Compute plls for MTL+ platform Mika Kahola
2025-11-18 4:03 ` Kandpal, Suraj
2025-11-18 9:14 ` Kahola, Mika
2025-11-17 10:45 ` [PATCH v2 19/32] drm/i915/cx0: Add MTL+ .get_dplls hook Mika Kahola
2025-11-18 4:04 ` Kandpal, Suraj
2025-11-17 10:45 ` [PATCH v2 20/32] drm/i915/cx0: Add MTL+ .put_dplls hook Mika Kahola
2025-11-17 10:45 ` [PATCH v2 21/32] drm/i915/cx0: Add MTL+ .update_active_dpll hook Mika Kahola
2025-11-18 4:21 ` Kandpal, Suraj
2025-11-18 9:46 ` Kahola, Mika
2025-11-18 11:28 ` Kahola, Mika
2025-11-18 13:28 ` [PATCH v3 " Mika Kahola
2025-11-19 5:29 ` Kandpal, Suraj
2025-11-17 10:45 ` [PATCH v2 22/32] drm/i915/cx0: Add MTL+ .update_dpll_ref_clks hook Mika Kahola
2025-11-17 10:45 ` [PATCH v2 23/32] drm/i915/cx0: Add MTL+ .dump_hw_state hook Mika Kahola
2025-11-17 10:45 ` [PATCH v2 24/32] drm/i915/cx0: Add .compare_hw_state hook Mika Kahola
2025-11-17 10:45 ` [PATCH v2 25/32] drm/i915/cx0: Add MTL+ .get_hw_state hook Mika Kahola
2026-04-20 23:19 ` Gustavo Sousa
2026-04-21 7:27 ` Kahola, Mika
2025-11-17 10:45 ` [PATCH v2 26/32] drm/i915/cx0: Add MTL+ .get_freq hook Mika Kahola
2025-11-17 10:45 ` [PATCH v2 27/32] drm/i915/cx0: Add MTL+ .crtc_get_dpll hook Mika Kahola
2025-11-17 10:45 ` [PATCH v2 28/32] drm/i915/cx0: PLL verify debug state print Mika Kahola
2025-11-17 10:45 ` [PATCH v2 29/32] drm/i915/cx0: Add MTL+ .enable_clock/.disable clock hooks on DDI Mika Kahola
2025-11-17 10:46 ` [PATCH v2 30/32] drm/i915/cx0: Get encoder configuration for C10 and C20 PHY PLLs Mika Kahola
2025-11-18 4:33 ` Kandpal, Suraj
2025-11-18 12:02 ` Kahola, Mika
2025-11-19 5:25 ` Kandpal, Suraj
2025-11-17 10:46 ` [PATCH v2 31/32] drm/i915/cx0: Add MTL+ Thunderbolt PLL hooks Mika Kahola
2025-11-18 4:38 ` Kandpal, Suraj
2025-11-18 10:50 ` Imre Deak
2025-11-19 6:03 ` Kandpal, Suraj
2025-11-17 10:46 ` [PATCH v2 32/32] drm/i915/cx0: Enable dpll framework for MTL+ Mika Kahola
2025-11-18 4:14 ` Kandpal, Suraj
2025-11-18 9:20 ` Kahola, Mika
2025-11-18 13:28 ` [PATCH v3 " Mika Kahola
2025-11-19 5:26 ` Kandpal, Suraj
2025-11-17 11:06 ` ✗ CI.checkpatch: warning for drm/i915/cx0: Add MTL+ platforms to support dpll framework Patchwork
2025-11-17 11:07 ` ✓ CI.KUnit: success " Patchwork
2025-11-17 11:22 ` ✗ CI.checksparse: warning " Patchwork
2025-11-17 12:09 ` ✓ Xe.CI.BAT: success " Patchwork
2025-11-17 13:29 ` ✗ Xe.CI.Full: failure " Patchwork
2025-11-18 17:17 ` ✗ CI.checkpatch: warning for drm/i915/cx0: Add MTL+ platforms to support dpll framework (rev3) Patchwork
2025-11-18 17:18 ` ✓ CI.KUnit: success " Patchwork
2025-11-18 17:33 ` ✗ CI.checksparse: warning " Patchwork
2025-11-18 17:58 ` ✓ Xe.CI.BAT: success " Patchwork
2025-11-19 11:59 ` [PATCH v2 00/32] drm/i915/cx0: Add MTL+ platforms to support dpll framework Kahola, Mika
2025-11-19 18:12 ` Matt Roper
2025-11-20 12:41 ` Kahola, Mika
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=20251117104602.2363671-12-mika.kahola@intel.com \
--to=mika.kahola@intel.com \
--cc=imre.deak@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=suraj.kandpal@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox