Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] Fix Cx0 Suspend Resume issue
@ 2025-12-30  8:31 Suraj Kandpal
  2025-12-30  8:31 ` [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts Suraj Kandpal
                   ` (3 more replies)
  0 siblings, 4 replies; 21+ messages in thread
From: Suraj Kandpal @ 2025-12-30  8:31 UTC (permalink / raw)
  To: intel-xe, intel-gfx; +Cc: ankit.k.nautiyal, mika.kahola, Suraj Kandpal

CX0 PHY currently has two issues which cause a hang when we try
to suspend resume machine with a delay of 15mins and 1+ hour.
This happens due to two reasons:
1) We do not follow the Enablement sequence where we need to
enable our clock after PPS Enablement cycle
2) We do not make sure response ready and error bit are cleared
in P2M_MSGBUS_STATUS before writing the transaction pending bit.
This series aims to solve this.

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>

Mika Kahola (1):
  drm/i915/cx0: Split PLL enabling/disabling in two parts

Suraj Kandpal (2):
  drm/i915/cx0: Move step 12 to enable clock hook
  drm/i915/cx0: Clear response ready & error bit

 drivers/gpu/drm/i915/display/intel_cx0_phy.c  | 122 +++++++++++-------
 drivers/gpu/drm/i915/display/intel_dpll_mgr.c |  12 +-
 2 files changed, 84 insertions(+), 50 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts
  2025-12-30  8:31 [PATCH 0/3] Fix Cx0 Suspend Resume issue Suraj Kandpal
@ 2025-12-30  8:31 ` Suraj Kandpal
  2025-12-30 15:20   ` Gustavo Sousa
                     ` (2 more replies)
  2025-12-30  8:31 ` [PATCH 2/3] drm/i915/cx0: Move step 12 to enable clock hook Suraj Kandpal
                   ` (2 subsequent siblings)
  3 siblings, 3 replies; 21+ messages in thread
From: Suraj Kandpal @ 2025-12-30  8:31 UTC (permalink / raw)
  To: intel-xe, intel-gfx; +Cc: ankit.k.nautiyal, mika.kahola, Suraj Kandpal

From: Mika Kahola <mika.kahola@intel.com>

Split PLL enabling/disabling in two parts - one for pll setting
pll dividers and second one to enable/disable pll clock. PLL
clock enabling/disbling happens via encoder->enable_clock/disable_clock
function hook. The reason for doing this is that we need to make sure
the clock enablement happens after PPS ON step to be inline with the
sequences which we end up violating otherwise. As a result of this
violation we end up in a hanged state if machine stays idle for more
that 15 mins.

PLL state verification happens now earlier than the clock is enabled
which causes a drm warn to be thrown. Silence this warning by
allowing this check for only earlier platforms than MeteorLake.

Bspec: 49190
Signed-off-by: Mika Kahola <mika.kahola@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
 drivers/gpu/drm/i915/display/intel_cx0_phy.c  | 87 ++++++++++++-------
 drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 12 +--
 2 files changed, 64 insertions(+), 35 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
index 7288065d2461..f3baba264e88 100644
--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
@@ -3225,11 +3225,8 @@ static void intel_cx0pll_enable(struct intel_encoder *encoder,
 {
 	int port_clock = pll_state->use_c10 ? pll_state->c10.clock : pll_state->c20.clock;
 	struct intel_display *display = to_intel_display(encoder);
-	enum phy phy = intel_encoder_to_phy(encoder);
 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
 	bool lane_reversal = dig_port->lane_reversal;
-	u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
-					  INTEL_CX0_LANE0;
 	struct ref_tracker *wakeref = intel_cx0_phy_transaction_begin(encoder);
 
 	/*
@@ -3284,27 +3281,6 @@ static void intel_cx0pll_enable(struct intel_encoder *encoder,
 	 */
 	intel_de_write(display, DDI_CLK_VALFREQ(encoder->port), port_clock);
 
-	/*
-	 * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
-	 * LN<Lane for maxPCLK> to "1" to enable PLL.
-	 */
-	intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
-		     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
-		     intel_cx0_get_pclk_pll_request(maxpclk_lane));
-
-	/* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK> == "1". */
-	if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
-			     intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
-			     intel_cx0_get_pclk_pll_ack(maxpclk_lane),
-			     XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
-		drm_warn(display->drm, "Port %c PLL not locked\n",
-			 phy_name(phy));
-
-	/*
-	 * 11. Follow the Display Voltage Frequency Switching Sequence After
-	 * Frequency Change. We handle this step in bxt_set_cdclk().
-	 */
-
 	/*
 	 * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
 	 *
@@ -3403,6 +3379,42 @@ static int intel_mtl_tbt_clock_select(struct intel_display *display,
 	}
 }
 
+static void intel_cx0pll_enable_clock(struct intel_encoder *encoder)
+{
+	struct intel_display *display = to_intel_display(encoder);
+	enum phy phy = intel_encoder_to_phy(encoder);
+	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
+	bool lane_reversal = dig_port->lane_reversal;
+					  INTEL_CX0_LANE0;
+	u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
+					INTEL_CX0_LANE0;
+
+	struct ref_tracker *wakeref = intel_cx0_phy_transaction_begin(encoder);
+
+	/*
+	 * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
+	 * LN<Lane for maxPCLK> to "1" to enable PLL.
+	 */
+	intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
+		     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
+		     intel_cx0_get_pclk_pll_request(maxpclk_lane));
+
+	/* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK> == "1". */
+	if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
+			     intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
+			     intel_cx0_get_pclk_pll_ack(maxpclk_lane),
+			     XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
+		drm_warn(display->drm, "Port %c PLL not locked\n",
+			 phy_name(phy));
+
+	/*
+	 * 11. Follow the Display Voltage Frequency Switching Sequence After
+	 * Frequency Change. We handle this step in bxt_set_cdclk().
+	 */
+
+	intel_cx0_phy_transaction_end(encoder, wakeref);
+}
+
 void intel_mtl_tbt_pll_enable_clock(struct intel_encoder *encoder, int port_clock)
 {
 	struct intel_display *display = to_intel_display(encoder);
@@ -3472,6 +3484,8 @@ void intel_mtl_pll_enable_clock(struct intel_encoder *encoder,
 
 	if (intel_tc_port_in_tbt_alt_mode(dig_port))
 		intel_mtl_tbt_pll_enable_clock(encoder, crtc_state->port_clock);
+	else
+		intel_cx0pll_enable_clock(encoder);
 }
 
 /*
@@ -3567,12 +3581,6 @@ static void intel_cx0pll_disable(struct intel_encoder *encoder)
 	 * Frequency Change. We handle this step in bxt_set_cdclk().
 	 */
 
-	/* 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(display), 0);
-	intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
-		     XELPDP_FORWARD_CLOCK_UNGATE, 0);
-
 	intel_cx0_phy_transaction_end(encoder, wakeref);
 }
 
@@ -3586,6 +3594,20 @@ static bool intel_cx0_pll_is_enabled(struct intel_encoder *encoder)
 			     intel_cx0_get_pclk_pll_request(lane);
 }
 
+static void intel_cx0pll_disable_clock(struct intel_encoder *encoder)
+{
+	struct intel_display *display = to_intel_display(encoder);
+	struct ref_tracker *wakeref = intel_cx0_phy_transaction_begin(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(display), 0);
+	intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
+		     XELPDP_FORWARD_CLOCK_UNGATE, 0);
+
+	intel_cx0_phy_transaction_end(encoder, wakeref);
+}
+
 void intel_mtl_tbt_pll_disable_clock(struct intel_encoder *encoder)
 {
 	struct intel_display *display = to_intel_display(encoder);
@@ -3635,6 +3657,9 @@ void intel_mtl_pll_disable_clock(struct intel_encoder *encoder)
 
 	if (intel_tc_port_in_tbt_alt_mode(dig_port))
 		intel_mtl_tbt_pll_disable_clock(encoder);
+	else
+		intel_cx0pll_disable_clock(encoder);
+
 }
 
 enum icl_port_dpll_id
@@ -3783,6 +3808,8 @@ void intel_cx0_pll_power_save_wa(struct intel_display *display)
 			    encoder->base.base.id, encoder->base.name);
 
 		intel_cx0pll_enable(encoder, &pll_state);
+		intel_cx0pll_enable_clock(encoder);
 		intel_cx0pll_disable(encoder);
+		intel_cx0pll_disable_clock(encoder);
 	}
 }
diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
index 9aa84a430f09..59395076103c 100644
--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
@@ -186,11 +186,13 @@ void assert_dpll(struct intel_display *display,
 		     "asserting DPLL %s with no DPLL\n", str_on_off(state)))
 		return;
 
-	cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
-	INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
-				 "%s assertion failure (expected %s, current %s)\n",
-				 pll->info->name, str_on_off(state),
-				 str_on_off(cur_state));
+	if (DISPLAY_VER(display) < 14) {
+		cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
+		INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
+					 "%s assertion failure (expected %s, current %s)\n",
+					 pll->info->name, str_on_off(state),
+					 str_on_off(cur_state));
+	}
 }
 
 static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id)
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 2/3] drm/i915/cx0: Move step 12 to enable clock hook
  2025-12-30  8:31 [PATCH 0/3] Fix Cx0 Suspend Resume issue Suraj Kandpal
  2025-12-30  8:31 ` [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts Suraj Kandpal
@ 2025-12-30  8:31 ` Suraj Kandpal
  2025-12-30 15:22   ` Gustavo Sousa
  2025-12-30  8:31 ` [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit Suraj Kandpal
  2025-12-30  8:38 ` ✓ CI.KUnit: success for Fix Cx0 Suspend Resume issue Patchwork
  3 siblings, 1 reply; 21+ messages in thread
From: Suraj Kandpal @ 2025-12-30  8:31 UTC (permalink / raw)
  To: intel-xe, intel-gfx; +Cc: ankit.k.nautiyal, mika.kahola, Suraj Kandpal

Move the step to toggle powerdown sequence change for HDMI to enable
clock hook where it belongs according to its sequence.
Do the required changes to make that work.

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
 drivers/gpu/drm/i915/display/intel_cx0_phy.c | 37 ++++++++++----------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
index f3baba264e88..5edd293b533b 100644
--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
@@ -3281,21 +3281,6 @@ static void intel_cx0pll_enable(struct intel_encoder *encoder,
 	 */
 	intel_de_write(display, DDI_CLK_VALFREQ(encoder->port), port_clock);
 
-	/*
-	 * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
-	 *
-	 * Wa_13013502646:
-	 * Fixes: HDMI lane to lane skew violations on C10 display PHYs.
-	 * Workaround: Toggle powerdown value by setting first to P0 and then to P2, for both
-	 * PHY lanes.
-	 */
-	if (!cx0pll_state_is_dp(pll_state) && pll_state->use_c10) {
-		intel_cx0_powerdown_change_sequence(encoder, INTEL_CX0_BOTH_LANES,
-						    XELPDP_P0_STATE_ACTIVE);
-		intel_cx0_powerdown_change_sequence(encoder, INTEL_CX0_BOTH_LANES,
-						    XELPDP_P2_STATE_READY);
-	}
-
 	intel_cx0_phy_transaction_end(encoder, wakeref);
 }
 
@@ -3379,7 +3364,8 @@ static int intel_mtl_tbt_clock_select(struct intel_display *display,
 	}
 }
 
-static void intel_cx0pll_enable_clock(struct intel_encoder *encoder)
+static void intel_cx0pll_enable_clock(struct intel_encoder *encoder,
+				      const struct intel_cx0pll_state *pll_state)
 {
 	struct intel_display *display = to_intel_display(encoder);
 	enum phy phy = intel_encoder_to_phy(encoder);
@@ -3412,6 +3398,21 @@ static void intel_cx0pll_enable_clock(struct intel_encoder *encoder)
 	 * Frequency Change. We handle this step in bxt_set_cdclk().
 	 */
 
+	/*
+	 * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
+	 *
+	 * Wa_13013502646:
+	 * Fixes: HDMI lane to lane skew violations on C10 display PHYs.
+	 * Workaround: Toggle powerdown value by setting first to P0 and then to P2, for both
+	 * PHY lanes.
+	 */
+	if (!cx0pll_state_is_dp(pll_state) && pll_state->use_c10) {
+		intel_cx0_powerdown_change_sequence(encoder, INTEL_CX0_BOTH_LANES,
+						    XELPDP_P0_STATE_ACTIVE);
+		intel_cx0_powerdown_change_sequence(encoder, INTEL_CX0_BOTH_LANES,
+						    XELPDP_P2_STATE_READY);
+	}
+
 	intel_cx0_phy_transaction_end(encoder, wakeref);
 }
 
@@ -3485,7 +3486,7 @@ void intel_mtl_pll_enable_clock(struct intel_encoder *encoder,
 	if (intel_tc_port_in_tbt_alt_mode(dig_port))
 		intel_mtl_tbt_pll_enable_clock(encoder, crtc_state->port_clock);
 	else
-		intel_cx0pll_enable_clock(encoder);
+		intel_cx0pll_enable_clock(encoder, &crtc_state->dpll_hw_state.cx0pll);
 }
 
 /*
@@ -3808,7 +3809,7 @@ void intel_cx0_pll_power_save_wa(struct intel_display *display)
 			    encoder->base.base.id, encoder->base.name);
 
 		intel_cx0pll_enable(encoder, &pll_state);
-		intel_cx0pll_enable_clock(encoder);
+		intel_cx0pll_enable_clock(encoder, &pll_state);
 		intel_cx0pll_disable(encoder);
 		intel_cx0pll_disable_clock(encoder);
 	}
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit
  2025-12-30  8:31 [PATCH 0/3] Fix Cx0 Suspend Resume issue Suraj Kandpal
  2025-12-30  8:31 ` [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts Suraj Kandpal
  2025-12-30  8:31 ` [PATCH 2/3] drm/i915/cx0: Move step 12 to enable clock hook Suraj Kandpal
@ 2025-12-30  8:31 ` Suraj Kandpal
  2025-12-30 15:29   ` Jani Nikula
  2025-12-30 17:36   ` Gustavo Sousa
  2025-12-30  8:38 ` ✓ CI.KUnit: success for Fix Cx0 Suspend Resume issue Patchwork
  3 siblings, 2 replies; 21+ messages in thread
From: Suraj Kandpal @ 2025-12-30  8:31 UTC (permalink / raw)
  To: intel-xe, intel-gfx; +Cc: ankit.k.nautiyal, mika.kahola, Suraj Kandpal

Clear the response ready and error bit of PORT_P2M_MESSAGE_BUS_STATUS
before writing the transaction pending bit of
PORT_M2P_MSGBUS_CTL as that is a hard requirement. If not done
we find that the PHY hangs since it ends up in a weird state if left
idle for more than 1 hour.

Bspec: 65101
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
 drivers/gpu/drm/i915/display/intel_cx0_phy.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
index 5edd293b533b..5ebc3404eee2 100644
--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
@@ -222,6 +222,8 @@ static int __intel_cx0_read_once(struct intel_encoder *encoder,
 		return -ETIMEDOUT;
 	}
 
+	intel_clear_response_ready_flag(encoder, lane);
+
 	intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane),
 		       XELPDP_PORT_M2P_TRANSACTION_PENDING |
 		       XELPDP_PORT_M2P_COMMAND_READ |
@@ -293,6 +295,8 @@ static int __intel_cx0_write_once(struct intel_encoder *encoder,
 		return -ETIMEDOUT;
 	}
 
+	intel_clear_response_ready_flag(encoder, lane);
+
 	intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane),
 		       XELPDP_PORT_M2P_TRANSACTION_PENDING |
 		       (committed ? XELPDP_PORT_M2P_COMMAND_WRITE_COMMITTED :
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* ✓ CI.KUnit: success for Fix Cx0 Suspend Resume issue
  2025-12-30  8:31 [PATCH 0/3] Fix Cx0 Suspend Resume issue Suraj Kandpal
                   ` (2 preceding siblings ...)
  2025-12-30  8:31 ` [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit Suraj Kandpal
@ 2025-12-30  8:38 ` Patchwork
  3 siblings, 0 replies; 21+ messages in thread
From: Patchwork @ 2025-12-30  8:38 UTC (permalink / raw)
  To: Suraj Kandpal; +Cc: intel-xe

== Series Details ==

Series: Fix Cx0 Suspend Resume issue
URL   : https://patchwork.freedesktop.org/series/159539/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[08:36:49] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[08:36:54] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[08:37:25] Starting KUnit Kernel (1/1)...
[08:37:25] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[08:37:25] ================== guc_buf (11 subtests) ===================
[08:37:25] [PASSED] test_smallest
[08:37:25] [PASSED] test_largest
[08:37:25] [PASSED] test_granular
[08:37:25] [PASSED] test_unique
[08:37:25] [PASSED] test_overlap
[08:37:25] [PASSED] test_reusable
[08:37:25] [PASSED] test_too_big
[08:37:25] [PASSED] test_flush
[08:37:25] [PASSED] test_lookup
[08:37:25] [PASSED] test_data
[08:37:25] [PASSED] test_class
[08:37:25] ===================== [PASSED] guc_buf =====================
[08:37:25] =================== guc_dbm (7 subtests) ===================
[08:37:25] [PASSED] test_empty
[08:37:25] [PASSED] test_default
[08:37:25] ======================== test_size  ========================
[08:37:25] [PASSED] 4
[08:37:25] [PASSED] 8
[08:37:25] [PASSED] 32
[08:37:25] [PASSED] 256
[08:37:25] ==================== [PASSED] test_size ====================
[08:37:25] ======================= test_reuse  ========================
[08:37:25] [PASSED] 4
[08:37:25] [PASSED] 8
[08:37:25] [PASSED] 32
[08:37:25] [PASSED] 256
[08:37:25] =================== [PASSED] test_reuse ====================
[08:37:25] =================== test_range_overlap  ====================
[08:37:25] [PASSED] 4
[08:37:25] [PASSED] 8
[08:37:25] [PASSED] 32
[08:37:25] [PASSED] 256
[08:37:25] =============== [PASSED] test_range_overlap ================
[08:37:25] =================== test_range_compact  ====================
[08:37:25] [PASSED] 4
[08:37:25] [PASSED] 8
[08:37:25] [PASSED] 32
[08:37:25] [PASSED] 256
[08:37:25] =============== [PASSED] test_range_compact ================
[08:37:25] ==================== test_range_spare  =====================
[08:37:25] [PASSED] 4
[08:37:25] [PASSED] 8
[08:37:25] [PASSED] 32
[08:37:25] [PASSED] 256
[08:37:25] ================ [PASSED] test_range_spare =================
[08:37:25] ===================== [PASSED] guc_dbm =====================
[08:37:25] =================== guc_idm (6 subtests) ===================
[08:37:25] [PASSED] bad_init
[08:37:25] [PASSED] no_init
[08:37:25] [PASSED] init_fini
[08:37:25] [PASSED] check_used
[08:37:25] [PASSED] check_quota
[08:37:25] [PASSED] check_all
[08:37:25] ===================== [PASSED] guc_idm =====================
[08:37:25] ================== no_relay (3 subtests) ===================
[08:37:25] [PASSED] xe_drops_guc2pf_if_not_ready
[08:37:25] [PASSED] xe_drops_guc2vf_if_not_ready
[08:37:25] [PASSED] xe_rejects_send_if_not_ready
[08:37:25] ==================== [PASSED] no_relay =====================
[08:37:25] ================== pf_relay (14 subtests) ==================
[08:37:25] [PASSED] pf_rejects_guc2pf_too_short
[08:37:25] [PASSED] pf_rejects_guc2pf_too_long
[08:37:25] [PASSED] pf_rejects_guc2pf_no_payload
[08:37:25] [PASSED] pf_fails_no_payload
[08:37:25] [PASSED] pf_fails_bad_origin
[08:37:25] [PASSED] pf_fails_bad_type
[08:37:25] [PASSED] pf_txn_reports_error
[08:37:25] [PASSED] pf_txn_sends_pf2guc
[08:37:25] [PASSED] pf_sends_pf2guc
[08:37:25] [SKIPPED] pf_loopback_nop
[08:37:25] [SKIPPED] pf_loopback_echo
[08:37:25] [SKIPPED] pf_loopback_fail
[08:37:25] [SKIPPED] pf_loopback_busy
[08:37:25] [SKIPPED] pf_loopback_retry
[08:37:25] ==================== [PASSED] pf_relay =====================
[08:37:25] ================== vf_relay (3 subtests) ===================
[08:37:25] [PASSED] vf_rejects_guc2vf_too_short
[08:37:25] [PASSED] vf_rejects_guc2vf_too_long
[08:37:25] [PASSED] vf_rejects_guc2vf_no_payload
[08:37:25] ==================== [PASSED] vf_relay =====================
[08:37:25] ================ pf_gt_config (6 subtests) =================
[08:37:25] [PASSED] fair_contexts_1vf
[08:37:25] [PASSED] fair_doorbells_1vf
[08:37:25] [PASSED] fair_ggtt_1vf
[08:37:25] ====================== fair_contexts  ======================
[08:37:25] [PASSED] 1 VF
[08:37:25] [PASSED] 2 VFs
[08:37:25] [PASSED] 3 VFs
[08:37:25] [PASSED] 4 VFs
[08:37:25] [PASSED] 5 VFs
[08:37:25] [PASSED] 6 VFs
[08:37:25] [PASSED] 7 VFs
[08:37:25] [PASSED] 8 VFs
[08:37:25] [PASSED] 9 VFs
[08:37:25] [PASSED] 10 VFs
[08:37:25] [PASSED] 11 VFs
[08:37:25] [PASSED] 12 VFs
[08:37:25] [PASSED] 13 VFs
[08:37:25] [PASSED] 14 VFs
[08:37:25] [PASSED] 15 VFs
[08:37:25] [PASSED] 16 VFs
[08:37:25] [PASSED] 17 VFs
[08:37:25] [PASSED] 18 VFs
[08:37:25] [PASSED] 19 VFs
[08:37:25] [PASSED] 20 VFs
[08:37:25] [PASSED] 21 VFs
[08:37:25] [PASSED] 22 VFs
[08:37:25] [PASSED] 23 VFs
[08:37:25] [PASSED] 24 VFs
[08:37:25] [PASSED] 25 VFs
[08:37:25] [PASSED] 26 VFs
[08:37:25] [PASSED] 27 VFs
[08:37:25] [PASSED] 28 VFs
[08:37:25] [PASSED] 29 VFs
[08:37:25] [PASSED] 30 VFs
[08:37:25] [PASSED] 31 VFs
[08:37:25] [PASSED] 32 VFs
[08:37:25] [PASSED] 33 VFs
[08:37:25] [PASSED] 34 VFs
[08:37:25] [PASSED] 35 VFs
[08:37:25] [PASSED] 36 VFs
[08:37:25] [PASSED] 37 VFs
[08:37:25] [PASSED] 38 VFs
[08:37:25] [PASSED] 39 VFs
[08:37:25] [PASSED] 40 VFs
[08:37:25] [PASSED] 41 VFs
[08:37:25] [PASSED] 42 VFs
[08:37:25] [PASSED] 43 VFs
[08:37:25] [PASSED] 44 VFs
[08:37:25] [PASSED] 45 VFs
[08:37:25] [PASSED] 46 VFs
[08:37:25] [PASSED] 47 VFs
[08:37:25] [PASSED] 48 VFs
[08:37:25] [PASSED] 49 VFs
[08:37:25] [PASSED] 50 VFs
[08:37:25] [PASSED] 51 VFs
[08:37:25] [PASSED] 52 VFs
[08:37:25] [PASSED] 53 VFs
[08:37:25] [PASSED] 54 VFs
[08:37:25] [PASSED] 55 VFs
[08:37:25] [PASSED] 56 VFs
[08:37:25] [PASSED] 57 VFs
[08:37:25] [PASSED] 58 VFs
[08:37:25] [PASSED] 59 VFs
[08:37:25] [PASSED] 60 VFs
[08:37:25] [PASSED] 61 VFs
[08:37:25] [PASSED] 62 VFs
[08:37:25] [PASSED] 63 VFs
[08:37:25] ================== [PASSED] fair_contexts ==================
[08:37:25] ===================== fair_doorbells  ======================
[08:37:25] [PASSED] 1 VF
[08:37:25] [PASSED] 2 VFs
[08:37:25] [PASSED] 3 VFs
[08:37:25] [PASSED] 4 VFs
[08:37:25] [PASSED] 5 VFs
[08:37:25] [PASSED] 6 VFs
[08:37:25] [PASSED] 7 VFs
[08:37:25] [PASSED] 8 VFs
[08:37:25] [PASSED] 9 VFs
[08:37:25] [PASSED] 10 VFs
[08:37:25] [PASSED] 11 VFs
[08:37:25] [PASSED] 12 VFs
[08:37:25] [PASSED] 13 VFs
[08:37:25] [PASSED] 14 VFs
[08:37:25] [PASSED] 15 VFs
[08:37:25] [PASSED] 16 VFs
[08:37:25] [PASSED] 17 VFs
[08:37:25] [PASSED] 18 VFs
[08:37:25] [PASSED] 19 VFs
[08:37:25] [PASSED] 20 VFs
[08:37:25] [PASSED] 21 VFs
[08:37:25] [PASSED] 22 VFs
[08:37:25] [PASSED] 23 VFs
[08:37:25] [PASSED] 24 VFs
[08:37:25] [PASSED] 25 VFs
[08:37:25] [PASSED] 26 VFs
[08:37:25] [PASSED] 27 VFs
[08:37:25] [PASSED] 28 VFs
[08:37:25] [PASSED] 29 VFs
[08:37:25] [PASSED] 30 VFs
[08:37:25] [PASSED] 31 VFs
[08:37:25] [PASSED] 32 VFs
[08:37:25] [PASSED] 33 VFs
[08:37:25] [PASSED] 34 VFs
[08:37:25] [PASSED] 35 VFs
[08:37:25] [PASSED] 36 VFs
[08:37:25] [PASSED] 37 VFs
[08:37:25] [PASSED] 38 VFs
[08:37:25] [PASSED] 39 VFs
[08:37:25] [PASSED] 40 VFs
[08:37:25] [PASSED] 41 VFs
[08:37:25] [PASSED] 42 VFs
[08:37:25] [PASSED] 43 VFs
[08:37:25] [PASSED] 44 VFs
[08:37:25] [PASSED] 45 VFs
[08:37:25] [PASSED] 46 VFs
[08:37:25] [PASSED] 47 VFs
[08:37:25] [PASSED] 48 VFs
[08:37:25] [PASSED] 49 VFs
[08:37:25] [PASSED] 50 VFs
[08:37:25] [PASSED] 51 VFs
[08:37:25] [PASSED] 52 VFs
[08:37:25] [PASSED] 53 VFs
[08:37:25] [PASSED] 54 VFs
[08:37:25] [PASSED] 55 VFs
[08:37:25] [PASSED] 56 VFs
[08:37:25] [PASSED] 57 VFs
[08:37:25] [PASSED] 58 VFs
[08:37:25] [PASSED] 59 VFs
[08:37:25] [PASSED] 60 VFs
[08:37:25] [PASSED] 61 VFs
[08:37:25] [PASSED] 62 VFs
[08:37:25] [PASSED] 63 VFs
[08:37:25] ================= [PASSED] fair_doorbells ==================
[08:37:25] ======================== fair_ggtt  ========================
[08:37:25] [PASSED] 1 VF
[08:37:25] [PASSED] 2 VFs
[08:37:25] [PASSED] 3 VFs
[08:37:25] [PASSED] 4 VFs
[08:37:25] [PASSED] 5 VFs
[08:37:25] [PASSED] 6 VFs
[08:37:25] [PASSED] 7 VFs
[08:37:25] [PASSED] 8 VFs
[08:37:25] [PASSED] 9 VFs
[08:37:25] [PASSED] 10 VFs
[08:37:25] [PASSED] 11 VFs
[08:37:25] [PASSED] 12 VFs
[08:37:25] [PASSED] 13 VFs
[08:37:25] [PASSED] 14 VFs
[08:37:25] [PASSED] 15 VFs
[08:37:25] [PASSED] 16 VFs
[08:37:25] [PASSED] 17 VFs
[08:37:25] [PASSED] 18 VFs
[08:37:25] [PASSED] 19 VFs
[08:37:25] [PASSED] 20 VFs
[08:37:25] [PASSED] 21 VFs
[08:37:25] [PASSED] 22 VFs
[08:37:25] [PASSED] 23 VFs
[08:37:25] [PASSED] 24 VFs
[08:37:25] [PASSED] 25 VFs
[08:37:25] [PASSED] 26 VFs
[08:37:25] [PASSED] 27 VFs
[08:37:25] [PASSED] 28 VFs
[08:37:25] [PASSED] 29 VFs
[08:37:25] [PASSED] 30 VFs
[08:37:25] [PASSED] 31 VFs
[08:37:25] [PASSED] 32 VFs
[08:37:25] [PASSED] 33 VFs
[08:37:25] [PASSED] 34 VFs
[08:37:25] [PASSED] 35 VFs
[08:37:25] [PASSED] 36 VFs
[08:37:25] [PASSED] 37 VFs
[08:37:25] [PASSED] 38 VFs
[08:37:25] [PASSED] 39 VFs
[08:37:25] [PASSED] 40 VFs
[08:37:25] [PASSED] 41 VFs
[08:37:25] [PASSED] 42 VFs
[08:37:25] [PASSED] 43 VFs
[08:37:25] [PASSED] 44 VFs
[08:37:25] [PASSED] 45 VFs
[08:37:25] [PASSED] 46 VFs
[08:37:25] [PASSED] 47 VFs
[08:37:25] [PASSED] 48 VFs
[08:37:25] [PASSED] 49 VFs
[08:37:25] [PASSED] 50 VFs
[08:37:25] [PASSED] 51 VFs
[08:37:25] [PASSED] 52 VFs
[08:37:25] [PASSED] 53 VFs
[08:37:25] [PASSED] 54 VFs
[08:37:25] [PASSED] 55 VFs
[08:37:25] [PASSED] 56 VFs
[08:37:25] [PASSED] 57 VFs
[08:37:25] [PASSED] 58 VFs
[08:37:25] [PASSED] 59 VFs
[08:37:25] [PASSED] 60 VFs
[08:37:25] [PASSED] 61 VFs
[08:37:25] [PASSED] 62 VFs
[08:37:25] [PASSED] 63 VFs
[08:37:25] ==================== [PASSED] fair_ggtt ====================
[08:37:25] ================== [PASSED] pf_gt_config ===================
[08:37:25] ===================== lmtt (1 subtest) =====================
[08:37:25] ======================== test_ops  =========================
[08:37:25] [PASSED] 2-level
[08:37:25] [PASSED] multi-level
[08:37:25] ==================== [PASSED] test_ops =====================
[08:37:25] ====================== [PASSED] lmtt =======================
[08:37:25] ================= pf_service (11 subtests) =================
[08:37:25] [PASSED] pf_negotiate_any
[08:37:25] [PASSED] pf_negotiate_base_match
[08:37:25] [PASSED] pf_negotiate_base_newer
[08:37:25] [PASSED] pf_negotiate_base_next
[08:37:25] [SKIPPED] pf_negotiate_base_older
[08:37:25] [PASSED] pf_negotiate_base_prev
[08:37:25] [PASSED] pf_negotiate_latest_match
[08:37:25] [PASSED] pf_negotiate_latest_newer
[08:37:25] [PASSED] pf_negotiate_latest_next
[08:37:25] [SKIPPED] pf_negotiate_latest_older
[08:37:25] [SKIPPED] pf_negotiate_latest_prev
[08:37:25] =================== [PASSED] pf_service ====================
[08:37:25] ================= xe_guc_g2g (2 subtests) ==================
[08:37:25] ============== xe_live_guc_g2g_kunit_default  ==============
[08:37:25] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[08:37:25] ============== xe_live_guc_g2g_kunit_allmem  ===============
[08:37:25] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[08:37:25] =================== [SKIPPED] xe_guc_g2g ===================
[08:37:25] =================== xe_mocs (2 subtests) ===================
[08:37:25] ================ xe_live_mocs_kernel_kunit  ================
[08:37:25] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[08:37:25] ================ xe_live_mocs_reset_kunit  =================
[08:37:25] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[08:37:25] ==================== [SKIPPED] xe_mocs =====================
[08:37:25] ================= xe_migrate (2 subtests) ==================
[08:37:25] ================= xe_migrate_sanity_kunit  =================
[08:37:25] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[08:37:25] ================== xe_validate_ccs_kunit  ==================
[08:37:25] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[08:37:25] =================== [SKIPPED] xe_migrate ===================
[08:37:25] ================== xe_dma_buf (1 subtest) ==================
[08:37:25] ==================== xe_dma_buf_kunit  =====================
[08:37:25] ================ [SKIPPED] xe_dma_buf_kunit ================
[08:37:25] =================== [SKIPPED] xe_dma_buf ===================
[08:37:25] ================= xe_bo_shrink (1 subtest) =================
[08:37:25] =================== xe_bo_shrink_kunit  ====================
[08:37:25] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[08:37:25] ================== [SKIPPED] xe_bo_shrink ==================
[08:37:25] ==================== xe_bo (2 subtests) ====================
[08:37:25] ================== xe_ccs_migrate_kunit  ===================
[08:37:25] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[08:37:25] ==================== xe_bo_evict_kunit  ====================
[08:37:25] =============== [SKIPPED] xe_bo_evict_kunit ================
[08:37:25] ===================== [SKIPPED] xe_bo ======================
[08:37:25] ==================== args (13 subtests) ====================
[08:37:25] [PASSED] count_args_test
[08:37:25] [PASSED] call_args_example
[08:37:25] [PASSED] call_args_test
[08:37:25] [PASSED] drop_first_arg_example
[08:37:25] [PASSED] drop_first_arg_test
[08:37:25] [PASSED] first_arg_example
[08:37:25] [PASSED] first_arg_test
[08:37:25] [PASSED] last_arg_example
[08:37:25] [PASSED] last_arg_test
[08:37:25] [PASSED] pick_arg_example
[08:37:25] [PASSED] if_args_example
[08:37:25] [PASSED] if_args_test
[08:37:25] [PASSED] sep_comma_example
[08:37:25] ====================== [PASSED] args =======================
[08:37:25] =================== xe_pci (3 subtests) ====================
[08:37:25] ==================== check_graphics_ip  ====================
[08:37:25] [PASSED] 12.00 Xe_LP
[08:37:25] [PASSED] 12.10 Xe_LP+
[08:37:25] [PASSED] 12.55 Xe_HPG
[08:37:25] [PASSED] 12.60 Xe_HPC
[08:37:25] [PASSED] 12.70 Xe_LPG
[08:37:25] [PASSED] 12.71 Xe_LPG
[08:37:25] [PASSED] 12.74 Xe_LPG+
[08:37:25] [PASSED] 20.01 Xe2_HPG
[08:37:25] [PASSED] 20.02 Xe2_HPG
[08:37:25] [PASSED] 20.04 Xe2_LPG
[08:37:25] [PASSED] 30.00 Xe3_LPG
[08:37:25] [PASSED] 30.01 Xe3_LPG
[08:37:25] [PASSED] 30.03 Xe3_LPG
[08:37:25] [PASSED] 30.04 Xe3_LPG
[08:37:25] [PASSED] 30.05 Xe3_LPG
[08:37:25] [PASSED] 35.11 Xe3p_XPC
[08:37:25] ================ [PASSED] check_graphics_ip ================
[08:37:25] ===================== check_media_ip  ======================
[08:37:25] [PASSED] 12.00 Xe_M
[08:37:25] [PASSED] 12.55 Xe_HPM
[08:37:25] [PASSED] 13.00 Xe_LPM+
[08:37:25] [PASSED] 13.01 Xe2_HPM
[08:37:25] [PASSED] 20.00 Xe2_LPM
[08:37:25] [PASSED] 30.00 Xe3_LPM
[08:37:25] [PASSED] 30.02 Xe3_LPM
[08:37:25] [PASSED] 35.00 Xe3p_LPM
[08:37:25] [PASSED] 35.03 Xe3p_HPM
[08:37:25] ================= [PASSED] check_media_ip ==================
[08:37:25] =================== check_platform_desc  ===================
[08:37:25] [PASSED] 0x9A60 (TIGERLAKE)
[08:37:25] [PASSED] 0x9A68 (TIGERLAKE)
[08:37:25] [PASSED] 0x9A70 (TIGERLAKE)
[08:37:25] [PASSED] 0x9A40 (TIGERLAKE)
[08:37:25] [PASSED] 0x9A49 (TIGERLAKE)
[08:37:25] [PASSED] 0x9A59 (TIGERLAKE)
[08:37:25] [PASSED] 0x9A78 (TIGERLAKE)
[08:37:25] [PASSED] 0x9AC0 (TIGERLAKE)
[08:37:25] [PASSED] 0x9AC9 (TIGERLAKE)
[08:37:25] [PASSED] 0x9AD9 (TIGERLAKE)
[08:37:25] [PASSED] 0x9AF8 (TIGERLAKE)
[08:37:25] [PASSED] 0x4C80 (ROCKETLAKE)
[08:37:25] [PASSED] 0x4C8A (ROCKETLAKE)
[08:37:25] [PASSED] 0x4C8B (ROCKETLAKE)
[08:37:25] [PASSED] 0x4C8C (ROCKETLAKE)
[08:37:25] [PASSED] 0x4C90 (ROCKETLAKE)
[08:37:25] [PASSED] 0x4C9A (ROCKETLAKE)
[08:37:25] [PASSED] 0x4680 (ALDERLAKE_S)
[08:37:25] [PASSED] 0x4682 (ALDERLAKE_S)
[08:37:25] [PASSED] 0x4688 (ALDERLAKE_S)
[08:37:25] [PASSED] 0x468A (ALDERLAKE_S)
[08:37:25] [PASSED] 0x468B (ALDERLAKE_S)
[08:37:25] [PASSED] 0x4690 (ALDERLAKE_S)
[08:37:25] [PASSED] 0x4692 (ALDERLAKE_S)
[08:37:25] [PASSED] 0x4693 (ALDERLAKE_S)
[08:37:25] [PASSED] 0x46A0 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46A1 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46A2 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46A3 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46A6 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46A8 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46AA (ALDERLAKE_P)
[08:37:25] [PASSED] 0x462A (ALDERLAKE_P)
[08:37:25] [PASSED] 0x4626 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x4628 (ALDERLAKE_P)
stty: 'standard input': Inappropriate ioctl for device
[08:37:25] [PASSED] 0x46B0 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46B1 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46B2 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46B3 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46C0 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46C1 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46C2 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46C3 (ALDERLAKE_P)
[08:37:25] [PASSED] 0x46D0 (ALDERLAKE_N)
[08:37:25] [PASSED] 0x46D1 (ALDERLAKE_N)
[08:37:25] [PASSED] 0x46D2 (ALDERLAKE_N)
[08:37:25] [PASSED] 0x46D3 (ALDERLAKE_N)
[08:37:25] [PASSED] 0x46D4 (ALDERLAKE_N)
[08:37:25] [PASSED] 0xA721 (ALDERLAKE_P)
[08:37:25] [PASSED] 0xA7A1 (ALDERLAKE_P)
[08:37:25] [PASSED] 0xA7A9 (ALDERLAKE_P)
[08:37:25] [PASSED] 0xA7AC (ALDERLAKE_P)
[08:37:25] [PASSED] 0xA7AD (ALDERLAKE_P)
[08:37:25] [PASSED] 0xA720 (ALDERLAKE_P)
[08:37:25] [PASSED] 0xA7A0 (ALDERLAKE_P)
[08:37:25] [PASSED] 0xA7A8 (ALDERLAKE_P)
[08:37:25] [PASSED] 0xA7AA (ALDERLAKE_P)
[08:37:25] [PASSED] 0xA7AB (ALDERLAKE_P)
[08:37:25] [PASSED] 0xA780 (ALDERLAKE_S)
[08:37:25] [PASSED] 0xA781 (ALDERLAKE_S)
[08:37:25] [PASSED] 0xA782 (ALDERLAKE_S)
[08:37:25] [PASSED] 0xA783 (ALDERLAKE_S)
[08:37:25] [PASSED] 0xA788 (ALDERLAKE_S)
[08:37:25] [PASSED] 0xA789 (ALDERLAKE_S)
[08:37:25] [PASSED] 0xA78A (ALDERLAKE_S)
[08:37:25] [PASSED] 0xA78B (ALDERLAKE_S)
[08:37:25] [PASSED] 0x4905 (DG1)
[08:37:25] [PASSED] 0x4906 (DG1)
[08:37:25] [PASSED] 0x4907 (DG1)
[08:37:25] [PASSED] 0x4908 (DG1)
[08:37:25] [PASSED] 0x4909 (DG1)
[08:37:25] [PASSED] 0x56C0 (DG2)
[08:37:25] [PASSED] 0x56C2 (DG2)
[08:37:25] [PASSED] 0x56C1 (DG2)
[08:37:25] [PASSED] 0x7D51 (METEORLAKE)
[08:37:25] [PASSED] 0x7DD1 (METEORLAKE)
[08:37:25] [PASSED] 0x7D41 (METEORLAKE)
[08:37:25] [PASSED] 0x7D67 (METEORLAKE)
[08:37:25] [PASSED] 0xB640 (METEORLAKE)
[08:37:25] [PASSED] 0x56A0 (DG2)
[08:37:25] [PASSED] 0x56A1 (DG2)
[08:37:25] [PASSED] 0x56A2 (DG2)
[08:37:25] [PASSED] 0x56BE (DG2)
[08:37:25] [PASSED] 0x56BF (DG2)
[08:37:25] [PASSED] 0x5690 (DG2)
[08:37:25] [PASSED] 0x5691 (DG2)
[08:37:25] [PASSED] 0x5692 (DG2)
[08:37:25] [PASSED] 0x56A5 (DG2)
[08:37:25] [PASSED] 0x56A6 (DG2)
[08:37:25] [PASSED] 0x56B0 (DG2)
[08:37:25] [PASSED] 0x56B1 (DG2)
[08:37:25] [PASSED] 0x56BA (DG2)
[08:37:25] [PASSED] 0x56BB (DG2)
[08:37:25] [PASSED] 0x56BC (DG2)
[08:37:25] [PASSED] 0x56BD (DG2)
[08:37:25] [PASSED] 0x5693 (DG2)
[08:37:25] [PASSED] 0x5694 (DG2)
[08:37:25] [PASSED] 0x5695 (DG2)
[08:37:25] [PASSED] 0x56A3 (DG2)
[08:37:25] [PASSED] 0x56A4 (DG2)
[08:37:25] [PASSED] 0x56B2 (DG2)
[08:37:25] [PASSED] 0x56B3 (DG2)
[08:37:25] [PASSED] 0x5696 (DG2)
[08:37:25] [PASSED] 0x5697 (DG2)
[08:37:25] [PASSED] 0xB69 (PVC)
[08:37:25] [PASSED] 0xB6E (PVC)
[08:37:25] [PASSED] 0xBD4 (PVC)
[08:37:25] [PASSED] 0xBD5 (PVC)
[08:37:25] [PASSED] 0xBD6 (PVC)
[08:37:25] [PASSED] 0xBD7 (PVC)
[08:37:25] [PASSED] 0xBD8 (PVC)
[08:37:25] [PASSED] 0xBD9 (PVC)
[08:37:25] [PASSED] 0xBDA (PVC)
[08:37:25] [PASSED] 0xBDB (PVC)
[08:37:25] [PASSED] 0xBE0 (PVC)
[08:37:25] [PASSED] 0xBE1 (PVC)
[08:37:25] [PASSED] 0xBE5 (PVC)
[08:37:25] [PASSED] 0x7D40 (METEORLAKE)
[08:37:25] [PASSED] 0x7D45 (METEORLAKE)
[08:37:25] [PASSED] 0x7D55 (METEORLAKE)
[08:37:25] [PASSED] 0x7D60 (METEORLAKE)
[08:37:25] [PASSED] 0x7DD5 (METEORLAKE)
[08:37:25] [PASSED] 0x6420 (LUNARLAKE)
[08:37:25] [PASSED] 0x64A0 (LUNARLAKE)
[08:37:25] [PASSED] 0x64B0 (LUNARLAKE)
[08:37:25] [PASSED] 0xE202 (BATTLEMAGE)
[08:37:25] [PASSED] 0xE209 (BATTLEMAGE)
[08:37:25] [PASSED] 0xE20B (BATTLEMAGE)
[08:37:25] [PASSED] 0xE20C (BATTLEMAGE)
[08:37:25] [PASSED] 0xE20D (BATTLEMAGE)
[08:37:25] [PASSED] 0xE210 (BATTLEMAGE)
[08:37:25] [PASSED] 0xE211 (BATTLEMAGE)
[08:37:25] [PASSED] 0xE212 (BATTLEMAGE)
[08:37:25] [PASSED] 0xE216 (BATTLEMAGE)
[08:37:25] [PASSED] 0xE220 (BATTLEMAGE)
[08:37:25] [PASSED] 0xE221 (BATTLEMAGE)
[08:37:25] [PASSED] 0xE222 (BATTLEMAGE)
[08:37:25] [PASSED] 0xE223 (BATTLEMAGE)
[08:37:25] [PASSED] 0xB080 (PANTHERLAKE)
[08:37:25] [PASSED] 0xB081 (PANTHERLAKE)
[08:37:25] [PASSED] 0xB082 (PANTHERLAKE)
[08:37:25] [PASSED] 0xB083 (PANTHERLAKE)
[08:37:25] [PASSED] 0xB084 (PANTHERLAKE)
[08:37:25] [PASSED] 0xB085 (PANTHERLAKE)
[08:37:25] [PASSED] 0xB086 (PANTHERLAKE)
[08:37:25] [PASSED] 0xB087 (PANTHERLAKE)
[08:37:25] [PASSED] 0xB08F (PANTHERLAKE)
[08:37:25] [PASSED] 0xB090 (PANTHERLAKE)
[08:37:25] [PASSED] 0xB0A0 (PANTHERLAKE)
[08:37:25] [PASSED] 0xB0B0 (PANTHERLAKE)
[08:37:25] [PASSED] 0xFD80 (PANTHERLAKE)
[08:37:25] [PASSED] 0xFD81 (PANTHERLAKE)
[08:37:25] [PASSED] 0xD740 (NOVALAKE_S)
[08:37:25] [PASSED] 0xD741 (NOVALAKE_S)
[08:37:25] [PASSED] 0xD742 (NOVALAKE_S)
[08:37:25] [PASSED] 0xD743 (NOVALAKE_S)
[08:37:25] [PASSED] 0xD744 (NOVALAKE_S)
[08:37:25] [PASSED] 0xD745 (NOVALAKE_S)
[08:37:25] [PASSED] 0x674C (CRESCENTISLAND)
[08:37:25] =============== [PASSED] check_platform_desc ===============
[08:37:25] ===================== [PASSED] xe_pci ======================
[08:37:25] =================== xe_rtp (2 subtests) ====================
[08:37:25] =============== xe_rtp_process_to_sr_tests  ================
[08:37:25] [PASSED] coalesce-same-reg
[08:37:25] [PASSED] no-match-no-add
[08:37:25] [PASSED] match-or
[08:37:25] [PASSED] match-or-xfail
[08:37:25] [PASSED] no-match-no-add-multiple-rules
[08:37:25] [PASSED] two-regs-two-entries
[08:37:25] [PASSED] clr-one-set-other
[08:37:25] [PASSED] set-field
[08:37:25] [PASSED] conflict-duplicate
[08:37:25] [PASSED] conflict-not-disjoint
[08:37:25] [PASSED] conflict-reg-type
[08:37:25] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[08:37:25] ================== xe_rtp_process_tests  ===================
[08:37:25] [PASSED] active1
[08:37:25] [PASSED] active2
[08:37:25] [PASSED] active-inactive
[08:37:25] [PASSED] inactive-active
[08:37:25] [PASSED] inactive-1st_or_active-inactive
[08:37:25] [PASSED] inactive-2nd_or_active-inactive
[08:37:25] [PASSED] inactive-last_or_active-inactive
[08:37:25] [PASSED] inactive-no_or_active-inactive
[08:37:25] ============== [PASSED] xe_rtp_process_tests ===============
[08:37:25] ===================== [PASSED] xe_rtp ======================
[08:37:25] ==================== xe_wa (1 subtest) =====================
[08:37:25] ======================== xe_wa_gt  =========================
[08:37:25] [PASSED] TIGERLAKE B0
[08:37:25] [PASSED] DG1 A0
[08:37:25] [PASSED] DG1 B0
[08:37:25] [PASSED] ALDERLAKE_S A0
[08:37:25] [PASSED] ALDERLAKE_S B0
[08:37:25] [PASSED] ALDERLAKE_S C0
[08:37:25] [PASSED] ALDERLAKE_S D0
[08:37:25] [PASSED] ALDERLAKE_P A0
[08:37:25] [PASSED] ALDERLAKE_P B0
[08:37:25] [PASSED] ALDERLAKE_P C0
[08:37:25] [PASSED] ALDERLAKE_S RPLS D0
[08:37:25] [PASSED] ALDERLAKE_P RPLU E0
[08:37:25] [PASSED] DG2 G10 C0
[08:37:25] [PASSED] DG2 G11 B1
[08:37:25] [PASSED] DG2 G12 A1
[08:37:25] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[08:37:25] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[08:37:25] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[08:37:25] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[08:37:25] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[08:37:25] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[08:37:25] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[08:37:25] ==================== [PASSED] xe_wa_gt =====================
[08:37:25] ====================== [PASSED] xe_wa ======================
[08:37:25] ============================================================
[08:37:25] Testing complete. Ran 512 tests: passed: 494, skipped: 18
[08:37:26] Elapsed time: 36.109s total, 4.215s configuring, 31.376s building, 0.465s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[08:37:26] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[08:37:27] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[08:37:52] Starting KUnit Kernel (1/1)...
[08:37:52] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[08:37:53] ============ drm_test_pick_cmdline (2 subtests) ============
[08:37:53] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[08:37:53] =============== drm_test_pick_cmdline_named  ===============
[08:37:53] [PASSED] NTSC
[08:37:53] [PASSED] NTSC-J
[08:37:53] [PASSED] PAL
[08:37:53] [PASSED] PAL-M
[08:37:53] =========== [PASSED] drm_test_pick_cmdline_named ===========
[08:37:53] ============== [PASSED] drm_test_pick_cmdline ==============
[08:37:53] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[08:37:53] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[08:37:53] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[08:37:53] =========== drm_validate_clone_mode (2 subtests) ===========
[08:37:53] ============== drm_test_check_in_clone_mode  ===============
[08:37:53] [PASSED] in_clone_mode
[08:37:53] [PASSED] not_in_clone_mode
[08:37:53] ========== [PASSED] drm_test_check_in_clone_mode ===========
[08:37:53] =============== drm_test_check_valid_clones  ===============
[08:37:53] [PASSED] not_in_clone_mode
[08:37:53] [PASSED] valid_clone
[08:37:53] [PASSED] invalid_clone
[08:37:53] =========== [PASSED] drm_test_check_valid_clones ===========
[08:37:53] ============= [PASSED] drm_validate_clone_mode =============
[08:37:53] ============= drm_validate_modeset (1 subtest) =============
[08:37:53] [PASSED] drm_test_check_connector_changed_modeset
[08:37:53] ============== [PASSED] drm_validate_modeset ===============
[08:37:53] ====== drm_test_bridge_get_current_state (2 subtests) ======
[08:37:53] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[08:37:53] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[08:37:53] ======== [PASSED] drm_test_bridge_get_current_state ========
[08:37:53] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[08:37:53] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[08:37:53] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[08:37:53] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[08:37:53] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[08:37:53] ============== drm_bridge_alloc (2 subtests) ===============
[08:37:53] [PASSED] drm_test_drm_bridge_alloc_basic
[08:37:53] [PASSED] drm_test_drm_bridge_alloc_get_put
[08:37:53] ================ [PASSED] drm_bridge_alloc =================
[08:37:53] ================== drm_buddy (8 subtests) ==================
[08:37:53] [PASSED] drm_test_buddy_alloc_limit
[08:37:53] [PASSED] drm_test_buddy_alloc_optimistic
[08:37:53] [PASSED] drm_test_buddy_alloc_pessimistic
[08:37:53] [PASSED] drm_test_buddy_alloc_pathological
[08:37:53] [PASSED] drm_test_buddy_alloc_contiguous
[08:37:53] [PASSED] drm_test_buddy_alloc_clear
[08:37:53] [PASSED] drm_test_buddy_alloc_range_bias
[08:37:53] [PASSED] drm_test_buddy_fragmentation_performance
[08:37:53] ==================== [PASSED] drm_buddy ====================
[08:37:53] ============= drm_cmdline_parser (40 subtests) =============
[08:37:53] [PASSED] drm_test_cmdline_force_d_only
[08:37:53] [PASSED] drm_test_cmdline_force_D_only_dvi
[08:37:53] [PASSED] drm_test_cmdline_force_D_only_hdmi
[08:37:53] [PASSED] drm_test_cmdline_force_D_only_not_digital
[08:37:53] [PASSED] drm_test_cmdline_force_e_only
[08:37:53] [PASSED] drm_test_cmdline_res
[08:37:53] [PASSED] drm_test_cmdline_res_vesa
[08:37:53] [PASSED] drm_test_cmdline_res_vesa_rblank
[08:37:53] [PASSED] drm_test_cmdline_res_rblank
[08:37:53] [PASSED] drm_test_cmdline_res_bpp
[08:37:53] [PASSED] drm_test_cmdline_res_refresh
[08:37:53] [PASSED] drm_test_cmdline_res_bpp_refresh
[08:37:53] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[08:37:53] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[08:37:53] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[08:37:53] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[08:37:53] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[08:37:53] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[08:37:53] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[08:37:53] [PASSED] drm_test_cmdline_res_margins_force_on
[08:37:53] [PASSED] drm_test_cmdline_res_vesa_margins
[08:37:53] [PASSED] drm_test_cmdline_name
[08:37:53] [PASSED] drm_test_cmdline_name_bpp
[08:37:53] [PASSED] drm_test_cmdline_name_option
[08:37:53] [PASSED] drm_test_cmdline_name_bpp_option
[08:37:53] [PASSED] drm_test_cmdline_rotate_0
[08:37:53] [PASSED] drm_test_cmdline_rotate_90
[08:37:53] [PASSED] drm_test_cmdline_rotate_180
[08:37:53] [PASSED] drm_test_cmdline_rotate_270
[08:37:53] [PASSED] drm_test_cmdline_hmirror
[08:37:53] [PASSED] drm_test_cmdline_vmirror
[08:37:53] [PASSED] drm_test_cmdline_margin_options
[08:37:53] [PASSED] drm_test_cmdline_multiple_options
[08:37:53] [PASSED] drm_test_cmdline_bpp_extra_and_option
[08:37:53] [PASSED] drm_test_cmdline_extra_and_option
[08:37:53] [PASSED] drm_test_cmdline_freestanding_options
[08:37:53] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[08:37:53] [PASSED] drm_test_cmdline_panel_orientation
[08:37:53] ================ drm_test_cmdline_invalid  =================
[08:37:53] [PASSED] margin_only
[08:37:53] [PASSED] interlace_only
[08:37:53] [PASSED] res_missing_x
[08:37:53] [PASSED] res_missing_y
[08:37:53] [PASSED] res_bad_y
[08:37:53] [PASSED] res_missing_y_bpp
[08:37:53] [PASSED] res_bad_bpp
[08:37:53] [PASSED] res_bad_refresh
[08:37:53] [PASSED] res_bpp_refresh_force_on_off
[08:37:53] [PASSED] res_invalid_mode
[08:37:53] [PASSED] res_bpp_wrong_place_mode
[08:37:53] [PASSED] name_bpp_refresh
[08:37:53] [PASSED] name_refresh
[08:37:53] [PASSED] name_refresh_wrong_mode
[08:37:53] [PASSED] name_refresh_invalid_mode
[08:37:53] [PASSED] rotate_multiple
[08:37:53] [PASSED] rotate_invalid_val
[08:37:53] [PASSED] rotate_truncated
[08:37:53] [PASSED] invalid_option
[08:37:53] [PASSED] invalid_tv_option
[08:37:53] [PASSED] truncated_tv_option
[08:37:53] ============ [PASSED] drm_test_cmdline_invalid =============
[08:37:53] =============== drm_test_cmdline_tv_options  ===============
[08:37:53] [PASSED] NTSC
[08:37:53] [PASSED] NTSC_443
[08:37:53] [PASSED] NTSC_J
[08:37:53] [PASSED] PAL
[08:37:53] [PASSED] PAL_M
[08:37:53] [PASSED] PAL_N
[08:37:53] [PASSED] SECAM
[08:37:53] [PASSED] MONO_525
[08:37:53] [PASSED] MONO_625
[08:37:53] =========== [PASSED] drm_test_cmdline_tv_options ===========
[08:37:53] =============== [PASSED] drm_cmdline_parser ================
[08:37:53] ========== drmm_connector_hdmi_init (20 subtests) ==========
[08:37:53] [PASSED] drm_test_connector_hdmi_init_valid
[08:37:53] [PASSED] drm_test_connector_hdmi_init_bpc_8
[08:37:53] [PASSED] drm_test_connector_hdmi_init_bpc_10
[08:37:53] [PASSED] drm_test_connector_hdmi_init_bpc_12
[08:37:53] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[08:37:53] [PASSED] drm_test_connector_hdmi_init_bpc_null
[08:37:53] [PASSED] drm_test_connector_hdmi_init_formats_empty
[08:37:53] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[08:37:53] === drm_test_connector_hdmi_init_formats_yuv420_allowed  ===
[08:37:53] [PASSED] supported_formats=0x9 yuv420_allowed=1
[08:37:53] [PASSED] supported_formats=0x9 yuv420_allowed=0
[08:37:53] [PASSED] supported_formats=0x3 yuv420_allowed=1
[08:37:53] [PASSED] supported_formats=0x3 yuv420_allowed=0
[08:37:53] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[08:37:53] [PASSED] drm_test_connector_hdmi_init_null_ddc
[08:37:53] [PASSED] drm_test_connector_hdmi_init_null_product
[08:37:53] [PASSED] drm_test_connector_hdmi_init_null_vendor
[08:37:53] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[08:37:53] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[08:37:53] [PASSED] drm_test_connector_hdmi_init_product_valid
[08:37:53] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[08:37:53] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[08:37:53] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[08:37:53] ========= drm_test_connector_hdmi_init_type_valid  =========
[08:37:53] [PASSED] HDMI-A
[08:37:53] [PASSED] HDMI-B
[08:37:53] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[08:37:53] ======== drm_test_connector_hdmi_init_type_invalid  ========
[08:37:53] [PASSED] Unknown
[08:37:53] [PASSED] VGA
[08:37:53] [PASSED] DVI-I
[08:37:53] [PASSED] DVI-D
[08:37:53] [PASSED] DVI-A
[08:37:53] [PASSED] Composite
[08:37:53] [PASSED] SVIDEO
[08:37:53] [PASSED] LVDS
[08:37:53] [PASSED] Component
[08:37:53] [PASSED] DIN
[08:37:53] [PASSED] DP
[08:37:53] [PASSED] TV
[08:37:53] [PASSED] eDP
[08:37:53] [PASSED] Virtual
[08:37:53] [PASSED] DSI
[08:37:53] [PASSED] DPI
[08:37:53] [PASSED] Writeback
[08:37:53] [PASSED] SPI
[08:37:53] [PASSED] USB
[08:37:53] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[08:37:53] ============ [PASSED] drmm_connector_hdmi_init =============
[08:37:53] ============= drmm_connector_init (3 subtests) =============
[08:37:53] [PASSED] drm_test_drmm_connector_init
[08:37:53] [PASSED] drm_test_drmm_connector_init_null_ddc
[08:37:53] ========= drm_test_drmm_connector_init_type_valid  =========
[08:37:53] [PASSED] Unknown
[08:37:53] [PASSED] VGA
[08:37:53] [PASSED] DVI-I
[08:37:53] [PASSED] DVI-D
[08:37:53] [PASSED] DVI-A
[08:37:53] [PASSED] Composite
[08:37:53] [PASSED] SVIDEO
[08:37:53] [PASSED] LVDS
[08:37:53] [PASSED] Component
[08:37:53] [PASSED] DIN
[08:37:53] [PASSED] DP
[08:37:53] [PASSED] HDMI-A
[08:37:53] [PASSED] HDMI-B
[08:37:53] [PASSED] TV
[08:37:53] [PASSED] eDP
[08:37:53] [PASSED] Virtual
[08:37:53] [PASSED] DSI
[08:37:53] [PASSED] DPI
[08:37:53] [PASSED] Writeback
[08:37:53] [PASSED] SPI
[08:37:53] [PASSED] USB
[08:37:53] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[08:37:53] =============== [PASSED] drmm_connector_init ===============
[08:37:53] ========= drm_connector_dynamic_init (6 subtests) ==========
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_init
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_init_properties
[08:37:53] ===== drm_test_drm_connector_dynamic_init_type_valid  ======
[08:37:53] [PASSED] Unknown
[08:37:53] [PASSED] VGA
[08:37:53] [PASSED] DVI-I
[08:37:53] [PASSED] DVI-D
[08:37:53] [PASSED] DVI-A
[08:37:53] [PASSED] Composite
[08:37:53] [PASSED] SVIDEO
[08:37:53] [PASSED] LVDS
[08:37:53] [PASSED] Component
[08:37:53] [PASSED] DIN
[08:37:53] [PASSED] DP
[08:37:53] [PASSED] HDMI-A
[08:37:53] [PASSED] HDMI-B
[08:37:53] [PASSED] TV
[08:37:53] [PASSED] eDP
[08:37:53] [PASSED] Virtual
[08:37:53] [PASSED] DSI
[08:37:53] [PASSED] DPI
[08:37:53] [PASSED] Writeback
[08:37:53] [PASSED] SPI
[08:37:53] [PASSED] USB
[08:37:53] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[08:37:53] ======== drm_test_drm_connector_dynamic_init_name  =========
[08:37:53] [PASSED] Unknown
[08:37:53] [PASSED] VGA
[08:37:53] [PASSED] DVI-I
[08:37:53] [PASSED] DVI-D
[08:37:53] [PASSED] DVI-A
[08:37:53] [PASSED] Composite
[08:37:53] [PASSED] SVIDEO
[08:37:53] [PASSED] LVDS
[08:37:53] [PASSED] Component
[08:37:53] [PASSED] DIN
[08:37:53] [PASSED] DP
[08:37:53] [PASSED] HDMI-A
[08:37:53] [PASSED] HDMI-B
[08:37:53] [PASSED] TV
[08:37:53] [PASSED] eDP
[08:37:53] [PASSED] Virtual
[08:37:53] [PASSED] DSI
[08:37:53] [PASSED] DPI
[08:37:53] [PASSED] Writeback
[08:37:53] [PASSED] SPI
[08:37:53] [PASSED] USB
[08:37:53] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[08:37:53] =========== [PASSED] drm_connector_dynamic_init ============
[08:37:53] ==== drm_connector_dynamic_register_early (4 subtests) =====
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[08:37:53] ====== [PASSED] drm_connector_dynamic_register_early =======
[08:37:53] ======= drm_connector_dynamic_register (7 subtests) ========
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[08:37:53] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[08:37:53] ========= [PASSED] drm_connector_dynamic_register ==========
[08:37:53] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[08:37:53] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[08:37:53] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[08:37:53] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[08:37:53] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[08:37:53] ========== drm_test_get_tv_mode_from_name_valid  ===========
[08:37:53] [PASSED] NTSC
[08:37:53] [PASSED] NTSC-443
[08:37:53] [PASSED] NTSC-J
[08:37:53] [PASSED] PAL
[08:37:53] [PASSED] PAL-M
[08:37:53] [PASSED] PAL-N
[08:37:53] [PASSED] SECAM
[08:37:53] [PASSED] Mono
[08:37:53] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[08:37:53] [PASSED] drm_test_get_tv_mode_from_name_truncated
[08:37:53] ============ [PASSED] drm_get_tv_mode_from_name ============
[08:37:53] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[08:37:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[08:37:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[08:37:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[08:37:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[08:37:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[08:37:53] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[08:37:53] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid  =
[08:37:53] [PASSED] VIC 96
[08:37:53] [PASSED] VIC 97
[08:37:53] [PASSED] VIC 101
[08:37:53] [PASSED] VIC 102
[08:37:53] [PASSED] VIC 106
[08:37:53] [PASSED] VIC 107
[08:37:53] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[08:37:53] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[08:37:53] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[08:37:53] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[08:37:53] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[08:37:53] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[08:37:53] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[08:37:53] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[08:37:53] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name  ====
[08:37:53] [PASSED] Automatic
[08:37:53] [PASSED] Full
[08:37:53] [PASSED] Limited 16:235
[08:37:53] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[08:37:53] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[08:37:53] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[08:37:53] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[08:37:53] === drm_test_drm_hdmi_connector_get_output_format_name  ====
[08:37:53] [PASSED] RGB
[08:37:53] [PASSED] YUV 4:2:0
[08:37:53] [PASSED] YUV 4:2:2
[08:37:53] [PASSED] YUV 4:4:4
[08:37:53] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[08:37:53] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[08:37:53] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[08:37:53] ============= drm_damage_helper (21 subtests) ==============
[08:37:53] [PASSED] drm_test_damage_iter_no_damage
[08:37:53] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[08:37:53] [PASSED] drm_test_damage_iter_no_damage_src_moved
[08:37:53] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[08:37:53] [PASSED] drm_test_damage_iter_no_damage_not_visible
[08:37:53] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[08:37:53] [PASSED] drm_test_damage_iter_no_damage_no_fb
[08:37:53] [PASSED] drm_test_damage_iter_simple_damage
[08:37:53] [PASSED] drm_test_damage_iter_single_damage
[08:37:53] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[08:37:53] [PASSED] drm_test_damage_iter_single_damage_outside_src
[08:37:53] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[08:37:53] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[08:37:53] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[08:37:53] [PASSED] drm_test_damage_iter_single_damage_src_moved
[08:37:53] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[08:37:53] [PASSED] drm_test_damage_iter_damage
[08:37:53] [PASSED] drm_test_damage_iter_damage_one_intersect
[08:37:53] [PASSED] drm_test_damage_iter_damage_one_outside
[08:37:53] [PASSED] drm_test_damage_iter_damage_src_moved
[08:37:53] [PASSED] drm_test_damage_iter_damage_not_visible
[08:37:53] ================ [PASSED] drm_damage_helper ================
[08:37:53] ============== drm_dp_mst_helper (3 subtests) ==============
[08:37:53] ============== drm_test_dp_mst_calc_pbn_mode  ==============
[08:37:53] [PASSED] Clock 154000 BPP 30 DSC disabled
[08:37:53] [PASSED] Clock 234000 BPP 30 DSC disabled
[08:37:53] [PASSED] Clock 297000 BPP 24 DSC disabled
[08:37:53] [PASSED] Clock 332880 BPP 24 DSC enabled
[08:37:53] [PASSED] Clock 324540 BPP 24 DSC enabled
[08:37:53] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[08:37:53] ============== drm_test_dp_mst_calc_pbn_div  ===============
[08:37:53] [PASSED] Link rate 2000000 lane count 4
[08:37:53] [PASSED] Link rate 2000000 lane count 2
[08:37:53] [PASSED] Link rate 2000000 lane count 1
[08:37:53] [PASSED] Link rate 1350000 lane count 4
[08:37:53] [PASSED] Link rate 1350000 lane count 2
[08:37:53] [PASSED] Link rate 1350000 lane count 1
[08:37:53] [PASSED] Link rate 1000000 lane count 4
[08:37:53] [PASSED] Link rate 1000000 lane count 2
[08:37:53] [PASSED] Link rate 1000000 lane count 1
[08:37:53] [PASSED] Link rate 810000 lane count 4
[08:37:53] [PASSED] Link rate 810000 lane count 2
[08:37:53] [PASSED] Link rate 810000 lane count 1
[08:37:53] [PASSED] Link rate 540000 lane count 4
[08:37:53] [PASSED] Link rate 540000 lane count 2
[08:37:53] [PASSED] Link rate 540000 lane count 1
[08:37:53] [PASSED] Link rate 270000 lane count 4
[08:37:53] [PASSED] Link rate 270000 lane count 2
[08:37:53] [PASSED] Link rate 270000 lane count 1
[08:37:53] [PASSED] Link rate 162000 lane count 4
[08:37:53] [PASSED] Link rate 162000 lane count 2
[08:37:53] [PASSED] Link rate 162000 lane count 1
[08:37:53] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[08:37:53] ========= drm_test_dp_mst_sideband_msg_req_decode  =========
[08:37:53] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[08:37:53] [PASSED] DP_POWER_UP_PHY with port number
[08:37:53] [PASSED] DP_POWER_DOWN_PHY with port number
[08:37:53] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[08:37:53] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[08:37:53] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[08:37:53] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[08:37:53] [PASSED] DP_QUERY_PAYLOAD with port number
[08:37:53] [PASSED] DP_QUERY_PAYLOAD with VCPI
[08:37:53] [PASSED] DP_REMOTE_DPCD_READ with port number
[08:37:53] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[08:37:53] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[08:37:53] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[08:37:53] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[08:37:53] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[08:37:53] [PASSED] DP_REMOTE_I2C_READ with port number
[08:37:53] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[08:37:53] [PASSED] DP_REMOTE_I2C_READ with transactions array
[08:37:53] [PASSED] DP_REMOTE_I2C_WRITE with port number
[08:37:53] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[08:37:53] [PASSED] DP_REMOTE_I2C_WRITE with data array
[08:37:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[08:37:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[08:37:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[08:37:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[08:37:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[08:37:53] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[08:37:53] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[08:37:53] ================ [PASSED] drm_dp_mst_helper ================
[08:37:53] ================== drm_exec (7 subtests) ===================
[08:37:53] [PASSED] sanitycheck
[08:37:53] [PASSED] test_lock
[08:37:53] [PASSED] test_lock_unlock
[08:37:53] [PASSED] test_duplicates
[08:37:53] [PASSED] test_prepare
[08:37:53] [PASSED] test_prepare_array
[08:37:53] [PASSED] test_multiple_loops
[08:37:53] ==================== [PASSED] drm_exec =====================
[08:37:53] =========== drm_format_helper_test (17 subtests) ===========
[08:37:53] ============== drm_test_fb_xrgb8888_to_gray8  ==============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[08:37:53] ============= drm_test_fb_xrgb8888_to_rgb332  ==============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[08:37:53] ============= drm_test_fb_xrgb8888_to_rgb565  ==============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[08:37:53] ============ drm_test_fb_xrgb8888_to_xrgb1555  =============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[08:37:53] ============ drm_test_fb_xrgb8888_to_argb1555  =============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[08:37:53] ============ drm_test_fb_xrgb8888_to_rgba5551  =============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[08:37:53] ============= drm_test_fb_xrgb8888_to_rgb888  ==============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[08:37:53] ============= drm_test_fb_xrgb8888_to_bgr888  ==============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[08:37:53] ============ drm_test_fb_xrgb8888_to_argb8888  =============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[08:37:53] =========== drm_test_fb_xrgb8888_to_xrgb2101010  ===========
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[08:37:53] =========== drm_test_fb_xrgb8888_to_argb2101010  ===========
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[08:37:53] ============== drm_test_fb_xrgb8888_to_mono  ===============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[08:37:53] ==================== drm_test_fb_swab  =====================
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ================ [PASSED] drm_test_fb_swab =================
[08:37:53] ============ drm_test_fb_xrgb8888_to_xbgr8888  =============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[08:37:53] ============ drm_test_fb_xrgb8888_to_abgr8888  =============
[08:37:53] [PASSED] single_pixel_source_buffer
[08:37:53] [PASSED] single_pixel_clip_rectangle
[08:37:53] [PASSED] well_known_colors
[08:37:53] [PASSED] destination_pitch
[08:37:53] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[08:37:53] ================= drm_test_fb_clip_offset  =================
[08:37:53] [PASSED] pass through
[08:37:53] [PASSED] horizontal offset
[08:37:53] [PASSED] vertical offset
[08:37:53] [PASSED] horizontal and vertical offset
[08:37:53] [PASSED] horizontal offset (custom pitch)
[08:37:53] [PASSED] vertical offset (custom pitch)
[08:37:53] [PASSED] horizontal and vertical offset (custom pitch)
[08:37:53] ============= [PASSED] drm_test_fb_clip_offset =============
[08:37:53] =================== drm_test_fb_memcpy  ====================
[08:37:53] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[08:37:53] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[08:37:53] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[08:37:53] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[08:37:53] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[08:37:53] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[08:37:53] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[08:37:53] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[08:37:53] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[08:37:53] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[08:37:53] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[08:37:53] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[08:37:53] =============== [PASSED] drm_test_fb_memcpy ================
[08:37:53] ============= [PASSED] drm_format_helper_test ==============
[08:37:53] ================= drm_format (18 subtests) =================
[08:37:53] [PASSED] drm_test_format_block_width_invalid
[08:37:53] [PASSED] drm_test_format_block_width_one_plane
[08:37:53] [PASSED] drm_test_format_block_width_two_plane
[08:37:53] [PASSED] drm_test_format_block_width_three_plane
[08:37:53] [PASSED] drm_test_format_block_width_tiled
[08:37:53] [PASSED] drm_test_format_block_height_invalid
[08:37:53] [PASSED] drm_test_format_block_height_one_plane
[08:37:53] [PASSED] drm_test_format_block_height_two_plane
[08:37:53] [PASSED] drm_test_format_block_height_three_plane
[08:37:53] [PASSED] drm_test_format_block_height_tiled
[08:37:53] [PASSED] drm_test_format_min_pitch_invalid
[08:37:53] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[08:37:53] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[08:37:53] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[08:37:53] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[08:37:53] [PASSED] drm_test_format_min_pitch_two_plane
[08:37:53] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[08:37:53] [PASSED] drm_test_format_min_pitch_tiled
[08:37:53] =================== [PASSED] drm_format ====================
[08:37:53] ============== drm_framebuffer (10 subtests) ===============
[08:37:53] ========== drm_test_framebuffer_check_src_coords  ==========
[08:37:53] [PASSED] Success: source fits into fb
[08:37:53] [PASSED] Fail: overflowing fb with x-axis coordinate
[08:37:53] [PASSED] Fail: overflowing fb with y-axis coordinate
[08:37:53] [PASSED] Fail: overflowing fb with source width
[08:37:53] [PASSED] Fail: overflowing fb with source height
[08:37:53] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[08:37:53] [PASSED] drm_test_framebuffer_cleanup
[08:37:53] =============== drm_test_framebuffer_create  ===============
[08:37:53] [PASSED] ABGR8888 normal sizes
[08:37:53] [PASSED] ABGR8888 max sizes
[08:37:53] [PASSED] ABGR8888 pitch greater than min required
[08:37:53] [PASSED] ABGR8888 pitch less than min required
[08:37:53] [PASSED] ABGR8888 Invalid width
[08:37:53] [PASSED] ABGR8888 Invalid buffer handle
[08:37:53] [PASSED] No pixel format
[08:37:53] [PASSED] ABGR8888 Width 0
[08:37:53] [PASSED] ABGR8888 Height 0
[08:37:53] [PASSED] ABGR8888 Out of bound height * pitch combination
[08:37:53] [PASSED] ABGR8888 Large buffer offset
[08:37:53] [PASSED] ABGR8888 Buffer offset for inexistent plane
[08:37:53] [PASSED] ABGR8888 Invalid flag
[08:37:53] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[08:37:53] [PASSED] ABGR8888 Valid buffer modifier
[08:37:53] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[08:37:53] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[08:37:53] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[08:37:53] [PASSED] NV12 Normal sizes
[08:37:53] [PASSED] NV12 Max sizes
[08:37:53] [PASSED] NV12 Invalid pitch
[08:37:53] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[08:37:53] [PASSED] NV12 different  modifier per-plane
[08:37:53] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[08:37:53] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[08:37:53] [PASSED] NV12 Modifier for inexistent plane
[08:37:53] [PASSED] NV12 Handle for inexistent plane
[08:37:53] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[08:37:53] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[08:37:53] [PASSED] YVU420 Normal sizes
[08:37:53] [PASSED] YVU420 Max sizes
[08:37:53] [PASSED] YVU420 Invalid pitch
[08:37:53] [PASSED] YVU420 Different pitches
[08:37:53] [PASSED] YVU420 Different buffer offsets/pitches
[08:37:53] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[08:37:53] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[08:37:53] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[08:37:53] [PASSED] YVU420 Valid modifier
[08:37:53] [PASSED] YVU420 Different modifiers per plane
[08:37:53] [PASSED] YVU420 Modifier for inexistent plane
[08:37:53] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[08:37:53] [PASSED] X0L2 Normal sizes
[08:37:53] [PASSED] X0L2 Max sizes
[08:37:53] [PASSED] X0L2 Invalid pitch
[08:37:53] [PASSED] X0L2 Pitch greater than minimum required
[08:37:53] [PASSED] X0L2 Handle for inexistent plane
[08:37:53] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[08:37:53] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[08:37:53] [PASSED] X0L2 Valid modifier
[08:37:53] [PASSED] X0L2 Modifier for inexistent plane
[08:37:53] =========== [PASSED] drm_test_framebuffer_create ===========
[08:37:53] [PASSED] drm_test_framebuffer_free
[08:37:53] [PASSED] drm_test_framebuffer_init
[08:37:53] [PASSED] drm_test_framebuffer_init_bad_format
[08:37:53] [PASSED] drm_test_framebuffer_init_dev_mismatch
[08:37:53] [PASSED] drm_test_framebuffer_lookup
[08:37:53] [PASSED] drm_test_framebuffer_lookup_inexistent
[08:37:53] [PASSED] drm_test_framebuffer_modifiers_not_supported
[08:37:53] ================= [PASSED] drm_framebuffer =================
[08:37:53] ================ drm_gem_shmem (8 subtests) ================
[08:37:53] [PASSED] drm_gem_shmem_test_obj_create
[08:37:53] [PASSED] drm_gem_shmem_test_obj_create_private
[08:37:53] [PASSED] drm_gem_shmem_test_pin_pages
[08:37:53] [PASSED] drm_gem_shmem_test_vmap
[08:37:53] [PASSED] drm_gem_shmem_test_get_sg_table
[08:37:53] [PASSED] drm_gem_shmem_test_get_pages_sgt
[08:37:53] [PASSED] drm_gem_shmem_test_madvise
[08:37:53] [PASSED] drm_gem_shmem_test_purge
[08:37:53] ================== [PASSED] drm_gem_shmem ==================
[08:37:53] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[08:37:53] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[08:37:53] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[08:37:53] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[08:37:53] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[08:37:53] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[08:37:53] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[08:37:53] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420  =======
[08:37:53] [PASSED] Automatic
[08:37:53] [PASSED] Full
[08:37:53] [PASSED] Limited 16:235
[08:37:53] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[08:37:53] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[08:37:53] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[08:37:53] [PASSED] drm_test_check_disable_connector
[08:37:53] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[08:37:53] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[08:37:53] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[08:37:53] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[08:37:53] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[08:37:53] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[08:37:53] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[08:37:53] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[08:37:53] [PASSED] drm_test_check_output_bpc_dvi
[08:37:53] [PASSED] drm_test_check_output_bpc_format_vic_1
[08:37:53] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[08:37:53] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[08:37:53] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[08:37:53] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[08:37:53] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[08:37:53] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[08:37:53] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[08:37:53] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[08:37:53] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[08:37:53] [PASSED] drm_test_check_broadcast_rgb_value
[08:37:53] [PASSED] drm_test_check_bpc_8_value
[08:37:53] [PASSED] drm_test_check_bpc_10_value
[08:37:53] [PASSED] drm_test_check_bpc_12_value
[08:37:53] [PASSED] drm_test_check_format_value
[08:37:53] [PASSED] drm_test_check_tmds_char_value
[08:37:53] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[08:37:53] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[08:37:53] [PASSED] drm_test_check_mode_valid
[08:37:53] [PASSED] drm_test_check_mode_valid_reject
[08:37:53] [PASSED] drm_test_check_mode_valid_reject_rate
[08:37:53] [PASSED] drm_test_check_mode_valid_reject_max_clock
[08:37:53] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[08:37:53] ================= drm_managed (2 subtests) =================
[08:37:53] [PASSED] drm_test_managed_release_action
[08:37:53] [PASSED] drm_test_managed_run_action
[08:37:53] =================== [PASSED] drm_managed ===================
[08:37:53] =================== drm_mm (6 subtests) ====================
[08:37:53] [PASSED] drm_test_mm_init
[08:37:53] [PASSED] drm_test_mm_debug
[08:37:53] [PASSED] drm_test_mm_align32
[08:37:53] [PASSED] drm_test_mm_align64
[08:37:53] [PASSED] drm_test_mm_lowest
[08:37:53] [PASSED] drm_test_mm_highest
[08:37:53] ===================== [PASSED] drm_mm ======================
[08:37:53] ============= drm_modes_analog_tv (5 subtests) =============
[08:37:53] [PASSED] drm_test_modes_analog_tv_mono_576i
[08:37:53] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[08:37:53] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[08:37:53] [PASSED] drm_test_modes_analog_tv_pal_576i
[08:37:53] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[08:37:53] =============== [PASSED] drm_modes_analog_tv ===============
[08:37:53] ============== drm_plane_helper (2 subtests) ===============
[08:37:53] =============== drm_test_check_plane_state  ================
[08:37:53] [PASSED] clipping_simple
[08:37:53] [PASSED] clipping_rotate_reflect
[08:37:53] [PASSED] positioning_simple
[08:37:53] [PASSED] upscaling
[08:37:53] [PASSED] downscaling
[08:37:53] [PASSED] rounding1
[08:37:53] [PASSED] rounding2
[08:37:53] [PASSED] rounding3
[08:37:53] [PASSED] rounding4
[08:37:53] =========== [PASSED] drm_test_check_plane_state ============
[08:37:53] =========== drm_test_check_invalid_plane_state  ============
[08:37:53] [PASSED] positioning_invalid
[08:37:53] [PASSED] upscaling_invalid
[08:37:53] [PASSED] downscaling_invalid
[08:37:53] ======= [PASSED] drm_test_check_invalid_plane_state ========
[08:37:53] ================ [PASSED] drm_plane_helper =================
[08:37:53] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[08:37:53] ====== drm_test_connector_helper_tv_get_modes_check  =======
[08:37:53] [PASSED] None
[08:37:53] [PASSED] PAL
[08:37:53] [PASSED] NTSC
[08:37:53] [PASSED] Both, NTSC Default
[08:37:53] [PASSED] Both, PAL Default
[08:37:53] [PASSED] Both, NTSC Default, with PAL on command-line
[08:37:53] [PASSED] Both, PAL Default, with NTSC on command-line
[08:37:53] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[08:37:53] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[08:37:53] ================== drm_rect (9 subtests) ===================
[08:37:53] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[08:37:53] [PASSED] drm_test_rect_clip_scaled_not_clipped
[08:37:53] [PASSED] drm_test_rect_clip_scaled_clipped
[08:37:53] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[08:37:53] ================= drm_test_rect_intersect  =================
[08:37:53] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[08:37:53] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[08:37:53] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[08:37:53] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[08:37:53] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[08:37:53] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[08:37:53] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[08:37:53] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[08:37:53] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[08:37:53] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[08:37:53] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[08:37:53] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[08:37:53] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[08:37:53] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[08:37:53] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[08:37:53] ============= [PASSED] drm_test_rect_intersect =============
[08:37:53] ================ drm_test_rect_calc_hscale  ================
[08:37:53] [PASSED] normal use
[08:37:53] [PASSED] out of max range
[08:37:53] [PASSED] out of min range
[08:37:53] [PASSED] zero dst
[08:37:53] [PASSED] negative src
[08:37:53] [PASSED] negative dst
[08:37:53] ============ [PASSED] drm_test_rect_calc_hscale ============
[08:37:53] ================ drm_test_rect_calc_vscale  ================
[08:37:53] [PASSED] normal use
stty: 'standard input': Inappropriate ioctl for device
[08:37:53] [PASSED] out of max range
[08:37:53] [PASSED] out of min range
[08:37:53] [PASSED] zero dst
[08:37:53] [PASSED] negative src
[08:37:53] [PASSED] negative dst
[08:37:53] ============ [PASSED] drm_test_rect_calc_vscale ============
[08:37:53] ================== drm_test_rect_rotate  ===================
[08:37:53] [PASSED] reflect-x
[08:37:53] [PASSED] reflect-y
[08:37:53] [PASSED] rotate-0
[08:37:53] [PASSED] rotate-90
[08:37:53] [PASSED] rotate-180
[08:37:53] [PASSED] rotate-270
[08:37:53] ============== [PASSED] drm_test_rect_rotate ===============
[08:37:53] ================ drm_test_rect_rotate_inv  =================
[08:37:53] [PASSED] reflect-x
[08:37:53] [PASSED] reflect-y
[08:37:53] [PASSED] rotate-0
[08:37:53] [PASSED] rotate-90
[08:37:53] [PASSED] rotate-180
[08:37:53] [PASSED] rotate-270
[08:37:53] ============ [PASSED] drm_test_rect_rotate_inv =============
[08:37:53] ==================== [PASSED] drm_rect =====================
[08:37:53] ============ drm_sysfb_modeset_test (1 subtest) ============
[08:37:53] ============ drm_test_sysfb_build_fourcc_list  =============
[08:37:53] [PASSED] no native formats
[08:37:53] [PASSED] XRGB8888 as native format
[08:37:53] [PASSED] remove duplicates
[08:37:53] [PASSED] convert alpha formats
[08:37:53] [PASSED] random formats
[08:37:53] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[08:37:53] ============= [PASSED] drm_sysfb_modeset_test ==============
[08:37:53] ================== drm_fixp (2 subtests) ===================
[08:37:53] [PASSED] drm_test_int2fixp
[08:37:53] [PASSED] drm_test_sm2fixp
[08:37:53] ==================== [PASSED] drm_fixp =====================
[08:37:53] ============================================================
[08:37:53] Testing complete. Ran 624 tests: passed: 624
[08:37:53] Elapsed time: 27.180s total, 1.550s configuring, 25.207s building, 0.421s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[08:37:53] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[08:37:55] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[08:38:04] Starting KUnit Kernel (1/1)...
[08:38:04] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[08:38:04] ================= ttm_device (5 subtests) ==================
[08:38:04] [PASSED] ttm_device_init_basic
[08:38:04] [PASSED] ttm_device_init_multiple
[08:38:04] [PASSED] ttm_device_fini_basic
[08:38:04] [PASSED] ttm_device_init_no_vma_man
[08:38:04] ================== ttm_device_init_pools  ==================
[08:38:04] [PASSED] No DMA allocations, no DMA32 required
[08:38:04] [PASSED] DMA allocations, DMA32 required
[08:38:04] [PASSED] No DMA allocations, DMA32 required
[08:38:04] [PASSED] DMA allocations, no DMA32 required
[08:38:04] ============== [PASSED] ttm_device_init_pools ==============
[08:38:04] =================== [PASSED] ttm_device ====================
[08:38:04] ================== ttm_pool (8 subtests) ===================
[08:38:04] ================== ttm_pool_alloc_basic  ===================
[08:38:04] [PASSED] One page
[08:38:04] [PASSED] More than one page
[08:38:04] [PASSED] Above the allocation limit
[08:38:04] [PASSED] One page, with coherent DMA mappings enabled
[08:38:04] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[08:38:04] ============== [PASSED] ttm_pool_alloc_basic ===============
[08:38:04] ============== ttm_pool_alloc_basic_dma_addr  ==============
[08:38:04] [PASSED] One page
[08:38:04] [PASSED] More than one page
[08:38:04] [PASSED] Above the allocation limit
[08:38:04] [PASSED] One page, with coherent DMA mappings enabled
[08:38:04] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[08:38:04] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[08:38:04] [PASSED] ttm_pool_alloc_order_caching_match
[08:38:04] [PASSED] ttm_pool_alloc_caching_mismatch
[08:38:04] [PASSED] ttm_pool_alloc_order_mismatch
[08:38:04] [PASSED] ttm_pool_free_dma_alloc
[08:38:04] [PASSED] ttm_pool_free_no_dma_alloc
[08:38:04] [PASSED] ttm_pool_fini_basic
[08:38:04] ==================== [PASSED] ttm_pool =====================
[08:38:04] ================ ttm_resource (8 subtests) =================
[08:38:04] ================= ttm_resource_init_basic  =================
[08:38:04] [PASSED] Init resource in TTM_PL_SYSTEM
[08:38:04] [PASSED] Init resource in TTM_PL_VRAM
[08:38:04] [PASSED] Init resource in a private placement
[08:38:04] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[08:38:04] ============= [PASSED] ttm_resource_init_basic =============
[08:38:04] [PASSED] ttm_resource_init_pinned
[08:38:04] [PASSED] ttm_resource_fini_basic
[08:38:04] [PASSED] ttm_resource_manager_init_basic
[08:38:04] [PASSED] ttm_resource_manager_usage_basic
[08:38:04] [PASSED] ttm_resource_manager_set_used_basic
[08:38:04] [PASSED] ttm_sys_man_alloc_basic
[08:38:04] [PASSED] ttm_sys_man_free_basic
[08:38:04] ================== [PASSED] ttm_resource ===================
[08:38:04] =================== ttm_tt (15 subtests) ===================
[08:38:04] ==================== ttm_tt_init_basic  ====================
[08:38:04] [PASSED] Page-aligned size
[08:38:04] [PASSED] Extra pages requested
[08:38:04] ================ [PASSED] ttm_tt_init_basic ================
[08:38:04] [PASSED] ttm_tt_init_misaligned
[08:38:04] [PASSED] ttm_tt_fini_basic
[08:38:04] [PASSED] ttm_tt_fini_sg
[08:38:04] [PASSED] ttm_tt_fini_shmem
[08:38:04] [PASSED] ttm_tt_create_basic
[08:38:04] [PASSED] ttm_tt_create_invalid_bo_type
[08:38:04] [PASSED] ttm_tt_create_ttm_exists
[08:38:04] [PASSED] ttm_tt_create_failed
[08:38:04] [PASSED] ttm_tt_destroy_basic
[08:38:04] [PASSED] ttm_tt_populate_null_ttm
[08:38:04] [PASSED] ttm_tt_populate_populated_ttm
[08:38:04] [PASSED] ttm_tt_unpopulate_basic
[08:38:04] [PASSED] ttm_tt_unpopulate_empty_ttm
[08:38:04] [PASSED] ttm_tt_swapin_basic
[08:38:04] ===================== [PASSED] ttm_tt ======================
[08:38:04] =================== ttm_bo (14 subtests) ===================
[08:38:04] =========== ttm_bo_reserve_optimistic_no_ticket  ===========
[08:38:04] [PASSED] Cannot be interrupted and sleeps
[08:38:04] [PASSED] Cannot be interrupted, locks straight away
[08:38:04] [PASSED] Can be interrupted, sleeps
[08:38:04] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[08:38:04] [PASSED] ttm_bo_reserve_locked_no_sleep
[08:38:04] [PASSED] ttm_bo_reserve_no_wait_ticket
[08:38:04] [PASSED] ttm_bo_reserve_double_resv
[08:38:04] [PASSED] ttm_bo_reserve_interrupted
[08:38:04] [PASSED] ttm_bo_reserve_deadlock
[08:38:04] [PASSED] ttm_bo_unreserve_basic
[08:38:04] [PASSED] ttm_bo_unreserve_pinned
[08:38:04] [PASSED] ttm_bo_unreserve_bulk
[08:38:04] [PASSED] ttm_bo_fini_basic
[08:38:04] [PASSED] ttm_bo_fini_shared_resv
[08:38:04] [PASSED] ttm_bo_pin_basic
[08:38:04] [PASSED] ttm_bo_pin_unpin_resource
[08:38:04] [PASSED] ttm_bo_multiple_pin_one_unpin
[08:38:04] ===================== [PASSED] ttm_bo ======================
[08:38:04] ============== ttm_bo_validate (21 subtests) ===============
[08:38:04] ============== ttm_bo_init_reserved_sys_man  ===============
[08:38:04] [PASSED] Buffer object for userspace
[08:38:04] [PASSED] Kernel buffer object
[08:38:04] [PASSED] Shared buffer object
[08:38:04] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[08:38:04] ============== ttm_bo_init_reserved_mock_man  ==============
[08:38:04] [PASSED] Buffer object for userspace
[08:38:04] [PASSED] Kernel buffer object
[08:38:04] [PASSED] Shared buffer object
[08:38:04] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[08:38:04] [PASSED] ttm_bo_init_reserved_resv
[08:38:04] ================== ttm_bo_validate_basic  ==================
[08:38:04] [PASSED] Buffer object for userspace
[08:38:04] [PASSED] Kernel buffer object
[08:38:04] [PASSED] Shared buffer object
[08:38:04] ============== [PASSED] ttm_bo_validate_basic ==============
[08:38:04] [PASSED] ttm_bo_validate_invalid_placement
[08:38:04] ============= ttm_bo_validate_same_placement  ==============
[08:38:04] [PASSED] System manager
[08:38:04] [PASSED] VRAM manager
[08:38:04] ========= [PASSED] ttm_bo_validate_same_placement ==========
[08:38:04] [PASSED] ttm_bo_validate_failed_alloc
[08:38:04] [PASSED] ttm_bo_validate_pinned
[08:38:04] [PASSED] ttm_bo_validate_busy_placement
[08:38:04] ================ ttm_bo_validate_multihop  =================
[08:38:04] [PASSED] Buffer object for userspace
[08:38:04] [PASSED] Kernel buffer object
[08:38:04] [PASSED] Shared buffer object
[08:38:04] ============ [PASSED] ttm_bo_validate_multihop =============
[08:38:04] ========== ttm_bo_validate_no_placement_signaled  ==========
[08:38:04] [PASSED] Buffer object in system domain, no page vector
[08:38:04] [PASSED] Buffer object in system domain with an existing page vector
[08:38:04] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[08:38:04] ======== ttm_bo_validate_no_placement_not_signaled  ========
[08:38:04] [PASSED] Buffer object for userspace
[08:38:04] [PASSED] Kernel buffer object
[08:38:04] [PASSED] Shared buffer object
[08:38:04] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[08:38:04] [PASSED] ttm_bo_validate_move_fence_signaled
[08:38:04] ========= ttm_bo_validate_move_fence_not_signaled  =========
[08:38:04] [PASSED] Waits for GPU
[08:38:04] [PASSED] Tries to lock straight away
[08:38:04] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[08:38:04] [PASSED] ttm_bo_validate_happy_evict
[08:38:04] [PASSED] ttm_bo_validate_all_pinned_evict
[08:38:04] [PASSED] ttm_bo_validate_allowed_only_evict
[08:38:04] [PASSED] ttm_bo_validate_deleted_evict
[08:38:04] [PASSED] ttm_bo_validate_busy_domain_evict
[08:38:04] [PASSED] ttm_bo_validate_evict_gutting
[08:38:04] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[08:38:04] ================= [PASSED] ttm_bo_validate =================
[08:38:04] ============================================================
[08:38:04] Testing complete. Ran 101 tests: passed: 101
[08:38:04] Elapsed time: 11.176s total, 1.658s configuring, 9.302s building, 0.183s running

+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts
  2025-12-30  8:31 ` [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts Suraj Kandpal
@ 2025-12-30 15:20   ` Gustavo Sousa
  2025-12-31  5:07     ` Kandpal, Suraj
  2025-12-30 21:23   ` kernel test robot
  2026-01-07 15:22   ` Michał Grzelak
  2 siblings, 1 reply; 21+ messages in thread
From: Gustavo Sousa @ 2025-12-30 15:20 UTC (permalink / raw)
  To: Suraj Kandpal, intel-gfx, intel-xe
  Cc: ankit.k.nautiyal, mika.kahola, Suraj Kandpal

Quoting Suraj Kandpal (2025-12-30 05:31:40-03:00)
>From: Mika Kahola <mika.kahola@intel.com>
>
>Split PLL enabling/disabling in two parts - one for pll setting
>pll dividers and second one to enable/disable pll clock. PLL
>clock enabling/disbling happens via encoder->enable_clock/disable_clock
>function hook. The reason for doing this is that we need to make sure
>the clock enablement happens after PPS ON step to be inline with the
>sequences which we end up violating otherwise. As a result of this
>violation we end up in a hanged state if machine stays idle for more
>that 15 mins.

So, it appears this started happening when we Cx0 code was integrated
into the DPLL framework and then the driver started enabling the PHY
PLL/clock too early, right?

I am lacking some context/background here due to my unfamiliarity with
pre-MTL platforms, but why I exactly do we program the PLLs before the
modeset sequence?  Is it related to the shared nature of PLLs for
platforms pre-C10/pre-C20?  If so, do we really need to do the same for
C10/C20 PHYs, since we have dedicated PLLs for them?

(Sorry for asking here and a bit too late.  Probably the better place to
ask this was in series that integrated Cx0 into the DPLL framework.)

>
>PLL state verification happens now earlier than the clock is enabled
>which causes a drm warn to be thrown. Silence this warning by
>allowing this check for only earlier platforms than MeteorLake.
>
>Bspec: 49190

This Bspec page is not invalid for platforms using C10/C20 PHYs.

We probably want to use these instead:

Bspec: 65448, 68849

--
Gustavo Sousa

>Signed-off-by: Mika Kahola <mika.kahola@intel.com>
>Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
>---
> drivers/gpu/drm/i915/display/intel_cx0_phy.c  | 87 ++++++++++++-------
> drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 12 +--
> 2 files changed, 64 insertions(+), 35 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>index 7288065d2461..f3baba264e88 100644
>--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>@@ -3225,11 +3225,8 @@ static void intel_cx0pll_enable(struct intel_encoder *encoder,
> {
>         int port_clock = pll_state->use_c10 ? pll_state->c10.clock : pll_state->c20.clock;
>         struct intel_display *display = to_intel_display(encoder);
>-        enum phy phy = intel_encoder_to_phy(encoder);
>         struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
>         bool lane_reversal = dig_port->lane_reversal;
>-        u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
>-                                          INTEL_CX0_LANE0;
>         struct ref_tracker *wakeref = intel_cx0_phy_transaction_begin(encoder);
> 
>         /*
>@@ -3284,27 +3281,6 @@ static void intel_cx0pll_enable(struct intel_encoder *encoder,
>          */
>         intel_de_write(display, DDI_CLK_VALFREQ(encoder->port), port_clock);
> 
>-        /*
>-         * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
>-         * LN<Lane for maxPCLK> to "1" to enable PLL.
>-         */
>-        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
>-                     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
>-                     intel_cx0_get_pclk_pll_request(maxpclk_lane));
>-
>-        /* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK> == "1". */
>-        if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
>-                             intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
>-                             intel_cx0_get_pclk_pll_ack(maxpclk_lane),
>-                             XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
>-                drm_warn(display->drm, "Port %c PLL not locked\n",
>-                         phy_name(phy));
>-
>-        /*
>-         * 11. Follow the Display Voltage Frequency Switching Sequence After
>-         * Frequency Change. We handle this step in bxt_set_cdclk().
>-         */
>-
>         /*
>          * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
>          *
>@@ -3403,6 +3379,42 @@ static int intel_mtl_tbt_clock_select(struct intel_display *display,
>         }
> }
> 
>+static void intel_cx0pll_enable_clock(struct intel_encoder *encoder)
>+{
>+        struct intel_display *display = to_intel_display(encoder);
>+        enum phy phy = intel_encoder_to_phy(encoder);
>+        struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
>+        bool lane_reversal = dig_port->lane_reversal;
>+                                          INTEL_CX0_LANE0;
>+        u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
>+                                        INTEL_CX0_LANE0;
>+
>+        struct ref_tracker *wakeref = intel_cx0_phy_transaction_begin(encoder);
>+
>+        /*
>+         * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
>+         * LN<Lane for maxPCLK> to "1" to enable PLL.
>+         */
>+        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
>+                     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
>+                     intel_cx0_get_pclk_pll_request(maxpclk_lane));
>+
>+        /* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK> == "1". */
>+        if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
>+                             intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
>+                             intel_cx0_get_pclk_pll_ack(maxpclk_lane),
>+                             XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
>+                drm_warn(display->drm, "Port %c PLL not locked\n",
>+                         phy_name(phy));
>+
>+        /*
>+         * 11. Follow the Display Voltage Frequency Switching Sequence After
>+         * Frequency Change. We handle this step in bxt_set_cdclk().
>+         */
>+
>+        intel_cx0_phy_transaction_end(encoder, wakeref);
>+}
>+
> void intel_mtl_tbt_pll_enable_clock(struct intel_encoder *encoder, int port_clock)
> {
>         struct intel_display *display = to_intel_display(encoder);
>@@ -3472,6 +3484,8 @@ void intel_mtl_pll_enable_clock(struct intel_encoder *encoder,
> 
>         if (intel_tc_port_in_tbt_alt_mode(dig_port))
>                 intel_mtl_tbt_pll_enable_clock(encoder, crtc_state->port_clock);
>+        else
>+                intel_cx0pll_enable_clock(encoder);
> }
> 
> /*
>@@ -3567,12 +3581,6 @@ static void intel_cx0pll_disable(struct intel_encoder *encoder)
>          * Frequency Change. We handle this step in bxt_set_cdclk().
>          */
> 
>-        /* 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(display), 0);
>-        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
>-                     XELPDP_FORWARD_CLOCK_UNGATE, 0);
>-
>         intel_cx0_phy_transaction_end(encoder, wakeref);
> }
> 
>@@ -3586,6 +3594,20 @@ static bool intel_cx0_pll_is_enabled(struct intel_encoder *encoder)
>                              intel_cx0_get_pclk_pll_request(lane);
> }
> 
>+static void intel_cx0pll_disable_clock(struct intel_encoder *encoder)
>+{
>+        struct intel_display *display = to_intel_display(encoder);
>+        struct ref_tracker *wakeref = intel_cx0_phy_transaction_begin(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(display), 0);
>+        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
>+                     XELPDP_FORWARD_CLOCK_UNGATE, 0);
>+
>+        intel_cx0_phy_transaction_end(encoder, wakeref);
>+}
>+
> void intel_mtl_tbt_pll_disable_clock(struct intel_encoder *encoder)
> {
>         struct intel_display *display = to_intel_display(encoder);
>@@ -3635,6 +3657,9 @@ void intel_mtl_pll_disable_clock(struct intel_encoder *encoder)
> 
>         if (intel_tc_port_in_tbt_alt_mode(dig_port))
>                 intel_mtl_tbt_pll_disable_clock(encoder);
>+        else
>+                intel_cx0pll_disable_clock(encoder);
>+
> }
> 
> enum icl_port_dpll_id
>@@ -3783,6 +3808,8 @@ void intel_cx0_pll_power_save_wa(struct intel_display *display)
>                             encoder->base.base.id, encoder->base.name);
> 
>                 intel_cx0pll_enable(encoder, &pll_state);
>+                intel_cx0pll_enable_clock(encoder);
>                 intel_cx0pll_disable(encoder);
>+                intel_cx0pll_disable_clock(encoder);
>         }
> }
>diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
>index 9aa84a430f09..59395076103c 100644
>--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
>+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
>@@ -186,11 +186,13 @@ void assert_dpll(struct intel_display *display,
>                      "asserting DPLL %s with no DPLL\n", str_on_off(state)))
>                 return;
> 
>-        cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
>-        INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
>-                                 "%s assertion failure (expected %s, current %s)\n",
>-                                 pll->info->name, str_on_off(state),
>-                                 str_on_off(cur_state));
>+        if (DISPLAY_VER(display) < 14) {
>+                cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
>+                INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
>+                                         "%s assertion failure (expected %s, current %s)\n",
>+                                         pll->info->name, str_on_off(state),
>+                                         str_on_off(cur_state));
>+        }
> }
> 
> static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id)
>-- 
>2.34.1
>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/3] drm/i915/cx0: Move step 12 to enable clock hook
  2025-12-30  8:31 ` [PATCH 2/3] drm/i915/cx0: Move step 12 to enable clock hook Suraj Kandpal
@ 2025-12-30 15:22   ` Gustavo Sousa
  2025-12-31  5:10     ` Kandpal, Suraj
  0 siblings, 1 reply; 21+ messages in thread
From: Gustavo Sousa @ 2025-12-30 15:22 UTC (permalink / raw)
  To: Suraj Kandpal, intel-gfx, intel-xe
  Cc: ankit.k.nautiyal, mika.kahola, Suraj Kandpal

Quoting Suraj Kandpal (2025-12-30 05:31:41-03:00)
>Move the step to toggle powerdown sequence change for HDMI to enable
>clock hook where it belongs according to its sequence.
>Do the required changes to make that work.

This should probably be a squash into the previous patch?

--
Gustavo Sousa

>
>Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
>---
> drivers/gpu/drm/i915/display/intel_cx0_phy.c | 37 ++++++++++----------
> 1 file changed, 19 insertions(+), 18 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>index f3baba264e88..5edd293b533b 100644
>--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>@@ -3281,21 +3281,6 @@ static void intel_cx0pll_enable(struct intel_encoder *encoder,
>          */
>         intel_de_write(display, DDI_CLK_VALFREQ(encoder->port), port_clock);
> 
>-        /*
>-         * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
>-         *
>-         * Wa_13013502646:
>-         * Fixes: HDMI lane to lane skew violations on C10 display PHYs.
>-         * Workaround: Toggle powerdown value by setting first to P0 and then to P2, for both
>-         * PHY lanes.
>-         */
>-        if (!cx0pll_state_is_dp(pll_state) && pll_state->use_c10) {
>-                intel_cx0_powerdown_change_sequence(encoder, INTEL_CX0_BOTH_LANES,
>-                                                    XELPDP_P0_STATE_ACTIVE);
>-                intel_cx0_powerdown_change_sequence(encoder, INTEL_CX0_BOTH_LANES,
>-                                                    XELPDP_P2_STATE_READY);
>-        }
>-
>         intel_cx0_phy_transaction_end(encoder, wakeref);
> }
> 
>@@ -3379,7 +3364,8 @@ static int intel_mtl_tbt_clock_select(struct intel_display *display,
>         }
> }
> 
>-static void intel_cx0pll_enable_clock(struct intel_encoder *encoder)
>+static void intel_cx0pll_enable_clock(struct intel_encoder *encoder,
>+                                      const struct intel_cx0pll_state *pll_state)
> {
>         struct intel_display *display = to_intel_display(encoder);
>         enum phy phy = intel_encoder_to_phy(encoder);
>@@ -3412,6 +3398,21 @@ static void intel_cx0pll_enable_clock(struct intel_encoder *encoder)
>          * Frequency Change. We handle this step in bxt_set_cdclk().
>          */
> 
>+        /*
>+         * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
>+         *
>+         * Wa_13013502646:
>+         * Fixes: HDMI lane to lane skew violations on C10 display PHYs.
>+         * Workaround: Toggle powerdown value by setting first to P0 and then to P2, for both
>+         * PHY lanes.
>+         */
>+        if (!cx0pll_state_is_dp(pll_state) && pll_state->use_c10) {
>+                intel_cx0_powerdown_change_sequence(encoder, INTEL_CX0_BOTH_LANES,
>+                                                    XELPDP_P0_STATE_ACTIVE);
>+                intel_cx0_powerdown_change_sequence(encoder, INTEL_CX0_BOTH_LANES,
>+                                                    XELPDP_P2_STATE_READY);
>+        }
>+
>         intel_cx0_phy_transaction_end(encoder, wakeref);
> }
> 
>@@ -3485,7 +3486,7 @@ void intel_mtl_pll_enable_clock(struct intel_encoder *encoder,
>         if (intel_tc_port_in_tbt_alt_mode(dig_port))
>                 intel_mtl_tbt_pll_enable_clock(encoder, crtc_state->port_clock);
>         else
>-                intel_cx0pll_enable_clock(encoder);
>+                intel_cx0pll_enable_clock(encoder, &crtc_state->dpll_hw_state.cx0pll);
> }
> 
> /*
>@@ -3808,7 +3809,7 @@ void intel_cx0_pll_power_save_wa(struct intel_display *display)
>                             encoder->base.base.id, encoder->base.name);
> 
>                 intel_cx0pll_enable(encoder, &pll_state);
>-                intel_cx0pll_enable_clock(encoder);
>+                intel_cx0pll_enable_clock(encoder, &pll_state);
>                 intel_cx0pll_disable(encoder);
>                 intel_cx0pll_disable_clock(encoder);
>         }
>-- 
>2.34.1
>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit
  2025-12-30  8:31 ` [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit Suraj Kandpal
@ 2025-12-30 15:29   ` Jani Nikula
  2025-12-30 17:36   ` Gustavo Sousa
  1 sibling, 0 replies; 21+ messages in thread
From: Jani Nikula @ 2025-12-30 15:29 UTC (permalink / raw)
  To: Suraj Kandpal, intel-xe, intel-gfx
  Cc: ankit.k.nautiyal, mika.kahola, Suraj Kandpal

On Tue, 30 Dec 2025, Suraj Kandpal <suraj.kandpal@intel.com> wrote:
> Clear the response ready and error bit of PORT_P2M_MESSAGE_BUS_STATUS
> before writing the transaction pending bit of
> PORT_M2P_MSGBUS_CTL as that is a hard requirement. If not done
> we find that the PHY hangs since it ends up in a weird state if left
> idle for more than 1 hour.
>
> Bspec: 65101
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_cx0_phy.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> index 5edd293b533b..5ebc3404eee2 100644
> --- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> +++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> @@ -222,6 +222,8 @@ static int __intel_cx0_read_once(struct intel_encoder *encoder,
>  		return -ETIMEDOUT;
>  	}
>  
> +	intel_clear_response_ready_flag(encoder, lane);
> +

Please rename the non-static function. Nobody knows what that's related
to without looking at the function.

BR,
Jani.

>  	intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane),
>  		       XELPDP_PORT_M2P_TRANSACTION_PENDING |
>  		       XELPDP_PORT_M2P_COMMAND_READ |
> @@ -293,6 +295,8 @@ static int __intel_cx0_write_once(struct intel_encoder *encoder,
>  		return -ETIMEDOUT;
>  	}
>  
> +	intel_clear_response_ready_flag(encoder, lane);
> +
>  	intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane),
>  		       XELPDP_PORT_M2P_TRANSACTION_PENDING |
>  		       (committed ? XELPDP_PORT_M2P_COMMAND_WRITE_COMMITTED :

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit
  2025-12-30  8:31 ` [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit Suraj Kandpal
  2025-12-30 15:29   ` Jani Nikula
@ 2025-12-30 17:36   ` Gustavo Sousa
  2025-12-31  4:59     ` Kandpal, Suraj
  1 sibling, 1 reply; 21+ messages in thread
From: Gustavo Sousa @ 2025-12-30 17:36 UTC (permalink / raw)
  To: Suraj Kandpal, intel-gfx, intel-xe
  Cc: ankit.k.nautiyal, mika.kahola, Suraj Kandpal

Quoting Suraj Kandpal (2025-12-30 05:31:42-03:00)
>Clear the response ready and error bit of PORT_P2M_MESSAGE_BUS_STATUS
>before writing the transaction pending bit of
>PORT_M2P_MSGBUS_CTL as that is a hard requirement. If not done
>we find that the PHY hangs since it ends up in a weird state if left
>idle for more than 1 hour.

Since the series title refers to suspend/resume, is there an easy way of
reproducing this via some power state transition?

I'm wondering if we are looking at a driver issue here or if this is
really something else.  I see that we usually call intel_cx0_bus_reset()
in error paths, which contains a call to
intel_clear_response_ready_flag(), but it could end up being not called
if the reset times out.

Do we see error messages from the driver when the PHY hangs?

--
Gustavo Sousa

>
>Bspec: 65101
>Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
>---
> drivers/gpu/drm/i915/display/intel_cx0_phy.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
>diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>index 5edd293b533b..5ebc3404eee2 100644
>--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>@@ -222,6 +222,8 @@ static int __intel_cx0_read_once(struct intel_encoder *encoder,
>                 return -ETIMEDOUT;
>         }
> 
>+        intel_clear_response_ready_flag(encoder, lane);
>+
>         intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane),
>                        XELPDP_PORT_M2P_TRANSACTION_PENDING |
>                        XELPDP_PORT_M2P_COMMAND_READ |
>@@ -293,6 +295,8 @@ static int __intel_cx0_write_once(struct intel_encoder *encoder,
>                 return -ETIMEDOUT;
>         }
> 
>+        intel_clear_response_ready_flag(encoder, lane);
>+
>         intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane),
>                        XELPDP_PORT_M2P_TRANSACTION_PENDING |
>                        (committed ? XELPDP_PORT_M2P_COMMAND_WRITE_COMMITTED :
>-- 
>2.34.1
>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts
  2025-12-30  8:31 ` [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts Suraj Kandpal
  2025-12-30 15:20   ` Gustavo Sousa
@ 2025-12-30 21:23   ` kernel test robot
  2026-01-07 15:22   ` Michał Grzelak
  2 siblings, 0 replies; 21+ messages in thread
From: kernel test robot @ 2025-12-30 21:23 UTC (permalink / raw)
  To: Suraj Kandpal, intel-xe, intel-gfx
  Cc: oe-kbuild-all, ankit.k.nautiyal, mika.kahola, Suraj Kandpal

Hi Suraj,

kernel test robot noticed the following build warnings:

[auto build test WARNING on drm-i915/for-linux-next]
[also build test WARNING on drm-tip/drm-tip]
[cannot apply to drm-i915/for-linux-next-fixes linus/master v6.19-rc3 next-20251219]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Suraj-Kandpal/drm-i915-cx0-Split-PLL-enabling-disabling-in-two-parts/20251230-163308
base:   https://gitlab.freedesktop.org/drm/i915/kernel.git for-linux-next
patch link:    https://lore.kernel.org/r/20251230083142.70064-2-suraj.kandpal%40intel.com
patch subject: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts
config: x86_64-rhel-9.4-kunit (https://download.01.org/0day-ci/archive/20251230/202512302233.vcqoghOz-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251230/202512302233.vcqoghOz-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512302233.vcqoghOz-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from include/linux/bits.h:5,
                    from include/linux/bitops.h:6,
                    from include/linux/log2.h:12,
                    from drivers/gpu/drm/i915/display/intel_cx0_phy.c:6:
   drivers/gpu/drm/i915/display/intel_cx0_phy.c: In function 'intel_cx0pll_enable_clock':
>> include/vdso/bits.h:7:33: warning: statement with no effect [-Wunused-value]
       7 | #define BIT(nr)                 (UL(1) << (nr))
         |                                 ^
   drivers/gpu/drm/i915/display/intel_cx0_phy.c:32:33: note: in expansion of macro 'BIT'
      32 | #define INTEL_CX0_LANE0         BIT(0)
         |                                 ^~~
   drivers/gpu/drm/i915/display/intel_cx0_phy.c:3388:43: note: in expansion of macro 'INTEL_CX0_LANE0'
    3388 |                                           INTEL_CX0_LANE0;
         |                                           ^~~~~~~~~~~~~~~
--
   In file included from include/linux/bits.h:5,
                    from include/linux/bitops.h:6,
                    from include/linux/log2.h:12,
                    from display/intel_cx0_phy.c:6:
   display/intel_cx0_phy.c: In function 'intel_cx0pll_enable_clock':
>> include/vdso/bits.h:7:33: warning: statement with no effect [-Wunused-value]
       7 | #define BIT(nr)                 (UL(1) << (nr))
         |                                 ^
   display/intel_cx0_phy.c:32:33: note: in expansion of macro 'BIT'
      32 | #define INTEL_CX0_LANE0         BIT(0)
         |                                 ^~~
   display/intel_cx0_phy.c:3388:43: note: in expansion of macro 'INTEL_CX0_LANE0'
    3388 |                                           INTEL_CX0_LANE0;
         |                                           ^~~~~~~~~~~~~~~


vim +7 include/vdso/bits.h

3945ff37d2f48d Vincenzo Frascino 2020-03-20  6  
3945ff37d2f48d Vincenzo Frascino 2020-03-20 @7  #define BIT(nr)			(UL(1) << (nr))
cbdb1f163af2bb Andy Shevchenko   2022-11-28  8  #define BIT_ULL(nr)		(ULL(1) << (nr))
3945ff37d2f48d Vincenzo Frascino 2020-03-20  9  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit
  2025-12-30 17:36   ` Gustavo Sousa
@ 2025-12-31  4:59     ` Kandpal, Suraj
  2026-01-05 15:14       ` Gustavo Sousa
  0 siblings, 1 reply; 21+ messages in thread
From: Kandpal, Suraj @ 2025-12-31  4:59 UTC (permalink / raw)
  To: Sousa, Gustavo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K, Kahola, Mika

> Subject: Re: [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit
> 
> Quoting Suraj Kandpal (2025-12-30 05:31:42-03:00)
> >Clear the response ready and error bit of PORT_P2M_MESSAGE_BUS_STATUS
> >before writing the transaction pending bit of PORT_M2P_MSGBUS_CTL as
> >that is a hard requirement. If not done we find that the PHY hangs
> >since it ends up in a weird state if left idle for more than 1 hour.
> 
> Since the series title refers to suspend/resume, is there an easy way of
> reproducing this via some power state transition?

Sadly no we did try to no avail went as low as DC9 too. Tried sleep then wake,
Tried hibernating too.

> 
> I'm wondering if we are looking at a driver issue here or if this is really
> something else.  I see that we usually call intel_cx0_bus_reset() in error paths,
> which contains a call to intel_clear_response_ready_flag(), but it could end up
> being not called if the reset times out.

Yes the reset times out and this is because PHY is in hanged state here

> 
> Do we see error messages from the driver when the PHY hangs?

Yes we do see a PHY hang when we are at the stage of swing programming setting
And the error happens when we try to read the msg access bit itself which is because the PHY ends up in
Weird state where it has a write ack but no response ready bit getting set.
But with my observation I can certainly say this is PHY issue.
I also double confirmed this behavior with windows folks and their code where they said they saw an issue in the same lines.
Also the bspec basically adds this as a disclaimer that response ready and error bit should be cleared no matter what before writing
The transaction pending bit.

Regards,
Suraj Kandpal

> 
> --
> Gustavo Sousa
> 
> >
> >Bspec: 65101
> >Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> >---
> > drivers/gpu/drm/i915/display/intel_cx0_phy.c | 4 ++++
> > 1 file changed, 4 insertions(+)
> >
> >diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >index 5edd293b533b..5ebc3404eee2 100644
> >--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >@@ -222,6 +222,8 @@ static int __intel_cx0_read_once(struct intel_encoder
> *encoder,
> >                 return -ETIMEDOUT;
> >         }
> >
> >+        intel_clear_response_ready_flag(encoder, lane);
> >+
> >         intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port,
> lane),
> >                        XELPDP_PORT_M2P_TRANSACTION_PENDING |
> >                        XELPDP_PORT_M2P_COMMAND_READ | @@ -293,6 +295,8
> >@@ static int __intel_cx0_write_once(struct intel_encoder *encoder,
> >                 return -ETIMEDOUT;
> >         }
> >
> >+        intel_clear_response_ready_flag(encoder, lane);
> >+
> >         intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port,
> lane),
> >                        XELPDP_PORT_M2P_TRANSACTION_PENDING |
> >                        (committed ?
> XELPDP_PORT_M2P_COMMAND_WRITE_COMMITTED :
> >--
> >2.34.1
> >

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts
  2025-12-30 15:20   ` Gustavo Sousa
@ 2025-12-31  5:07     ` Kandpal, Suraj
  2026-01-05 14:13       ` Gustavo Sousa
  0 siblings, 1 reply; 21+ messages in thread
From: Kandpal, Suraj @ 2025-12-31  5:07 UTC (permalink / raw)
  To: Sousa, Gustavo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K, Kahola, Mika

> Subject: Re: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two
> parts
> 
> Quoting Suraj Kandpal (2025-12-30 05:31:40-03:00)
> >From: Mika Kahola <mika.kahola@intel.com>
> >
> >Split PLL enabling/disabling in two parts - one for pll setting pll
> >dividers and second one to enable/disable pll clock. PLL clock
> >enabling/disbling happens via encoder->enable_clock/disable_clock
> >function hook. The reason for doing this is that we need to make sure
> >the clock enablement happens after PPS ON step to be inline with the
> >sequences which we end up violating otherwise. As a result of this
> >violation we end up in a hanged state if machine stays idle for more
> >that 15 mins.
> 
> So, it appears this started happening when we Cx0 code was integrated into
> the DPLL framework and then the driver started enabling the PHY PLL/clock
> too early, right?
> 
> I am lacking some context/background here due to my unfamiliarity with pre-
> MTL platforms, but why I exactly do we program the PLLs before the modeset
> sequence?  Is it related to the shared nature of PLLs for platforms pre-
> C10/pre-C20?  If so, do we really need to do the same for
> C10/C20 PHYs, since we have dedicated PLLs for them?
> 
> (Sorry for asking here and a bit too late.  Probably the better place to ask this
> was in series that integrated Cx0 into the DPLL framework.)


Right it used to be actually because of the shared nature of PLL's. With c10 c20 we moved
to a different framework where we called the the sequence together using hooks like enable_clock
and disable_clock since there was not a lot of time of time to refactor the dpll_shared_framework to
a framework with supported individual ones.
Now that we had time we shifted cx0 back to the previous framework but missed defer the clock enablement
To later during enable clock time so that we honor the sequence, why we had to do this is even though its not shared PLL anymore is
To make sure this framework is backward compatible too.
Also we had to move cx0 pll framework back to dpll framework because the previous can work well as long as the ports are static hence aren’t
As future proof , we plan to move LT PHY back here too once this ages well.

> 
> >
> >PLL state verification happens now earlier than the clock is enabled
> >which causes a drm warn to be thrown. Silence this warning by allowing
> >this check for only earlier platforms than MeteorLake.
> >
> >Bspec: 49190
> 
> This Bspec page is not invalid for platforms using C10/C20 PHYs.
> 
> We probably want to use these instead:
> 
> Bspec: 65448, 68849
>

Sure will replace them.

Regards,
Suraj Kandpal
 
> --
> Gustavo Sousa
> 
> >Signed-off-by: Mika Kahola <mika.kahola@intel.com>
> >Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> >---
> > drivers/gpu/drm/i915/display/intel_cx0_phy.c  | 87 ++++++++++++-------
> >drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 12 +--
> > 2 files changed, 64 insertions(+), 35 deletions(-)
> >
> >diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >index 7288065d2461..f3baba264e88 100644
> >--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >@@ -3225,11 +3225,8 @@ static void intel_cx0pll_enable(struct
> >intel_encoder *encoder,  {
> >         int port_clock = pll_state->use_c10 ? pll_state->c10.clock : pll_state-
> >c20.clock;
> >         struct intel_display *display = to_intel_display(encoder);
> >-        enum phy phy = intel_encoder_to_phy(encoder);
> >         struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
> >         bool lane_reversal = dig_port->lane_reversal;
> >-        u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
> >-                                          INTEL_CX0_LANE0;
> >         struct ref_tracker *wakeref =
> >intel_cx0_phy_transaction_begin(encoder);
> >
> >         /*
> >@@ -3284,27 +3281,6 @@ static void intel_cx0pll_enable(struct
> intel_encoder *encoder,
> >          */
> >         intel_de_write(display, DDI_CLK_VALFREQ(encoder->port),
> >port_clock);
> >
> >-        /*
> >-         * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
> >-         * LN<Lane for maxPCLK> to "1" to enable PLL.
> >-         */
> >-        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
> >port),
> >-                     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
> >-                     intel_cx0_get_pclk_pll_request(maxpclk_lane));
> >-
> >-        /* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK>
> == "1". */
> >-        if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display,
> encoder->port),
> >-                             intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
> >-                             intel_cx0_get_pclk_pll_ack(maxpclk_lane),
> >-                             XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
> >-                drm_warn(display->drm, "Port %c PLL not locked\n",
> >-                         phy_name(phy));
> >-
> >-        /*
> >-         * 11. Follow the Display Voltage Frequency Switching Sequence After
> >-         * Frequency Change. We handle this step in bxt_set_cdclk().
> >-         */
> >-
> >         /*
> >          * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
> >          *
> >@@ -3403,6 +3379,42 @@ static int intel_mtl_tbt_clock_select(struct
> intel_display *display,
> >         }
> > }
> >
> >+static void intel_cx0pll_enable_clock(struct intel_encoder *encoder) {
> >+        struct intel_display *display = to_intel_display(encoder);
> >+        enum phy phy = intel_encoder_to_phy(encoder);
> >+        struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
> >+        bool lane_reversal = dig_port->lane_reversal;
> >+                                          INTEL_CX0_LANE0;
> >+        u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
> >+                                        INTEL_CX0_LANE0;
> >+
> >+        struct ref_tracker *wakeref =
> >+ intel_cx0_phy_transaction_begin(encoder);
> >+
> >+        /*
> >+         * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
> >+         * LN<Lane for maxPCLK> to "1" to enable PLL.
> >+         */
> >+        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
> >port),
> >+                     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
> >+                     intel_cx0_get_pclk_pll_request(maxpclk_lane));
> >+
> >+        /* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK>
> == "1". */
> >+        if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display,
> encoder->port),
> >+                             intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
> >+                             intel_cx0_get_pclk_pll_ack(maxpclk_lane),
> >+                             XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
> >+                drm_warn(display->drm, "Port %c PLL not locked\n",
> >+                         phy_name(phy));
> >+
> >+        /*
> >+         * 11. Follow the Display Voltage Frequency Switching Sequence After
> >+         * Frequency Change. We handle this step in bxt_set_cdclk().
> >+         */
> >+
> >+        intel_cx0_phy_transaction_end(encoder, wakeref); }
> >+
> > void intel_mtl_tbt_pll_enable_clock(struct intel_encoder *encoder, int
> >port_clock)  {
> >         struct intel_display *display = to_intel_display(encoder); @@
> >-3472,6 +3484,8 @@ void intel_mtl_pll_enable_clock(struct intel_encoder
> >*encoder,
> >
> >         if (intel_tc_port_in_tbt_alt_mode(dig_port))
> >                 intel_mtl_tbt_pll_enable_clock(encoder,
> > crtc_state->port_clock);
> >+        else
> >+                intel_cx0pll_enable_clock(encoder);
> > }
> >
> > /*
> >@@ -3567,12 +3581,6 @@ static void intel_cx0pll_disable(struct
> intel_encoder *encoder)
> >          * Frequency Change. We handle this step in bxt_set_cdclk().
> >          */
> >
> >-        /* 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(display), 0);
> >-        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
> >port),
> >-                     XELPDP_FORWARD_CLOCK_UNGATE, 0);
> >-
> >         intel_cx0_phy_transaction_end(encoder, wakeref);  }
> >
> >@@ -3586,6 +3594,20 @@ static bool intel_cx0_pll_is_enabled(struct
> intel_encoder *encoder)
> >                              intel_cx0_get_pclk_pll_request(lane);
> > }
> >
> >+static void intel_cx0pll_disable_clock(struct intel_encoder *encoder)
> >+{
> >+        struct intel_display *display = to_intel_display(encoder);
> >+        struct ref_tracker *wakeref =
> >+intel_cx0_phy_transaction_begin(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(display), 0);
> >+        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
> >port),
> >+                     XELPDP_FORWARD_CLOCK_UNGATE, 0);
> >+
> >+        intel_cx0_phy_transaction_end(encoder, wakeref); }
> >+
> > void intel_mtl_tbt_pll_disable_clock(struct intel_encoder *encoder)  {
> >         struct intel_display *display = to_intel_display(encoder); @@
> >-3635,6 +3657,9 @@ void intel_mtl_pll_disable_clock(struct
> >intel_encoder *encoder)
> >
> >         if (intel_tc_port_in_tbt_alt_mode(dig_port))
> >                 intel_mtl_tbt_pll_disable_clock(encoder);
> >+        else
> >+                intel_cx0pll_disable_clock(encoder);
> >+
> > }
> >
> > enum icl_port_dpll_id
> >@@ -3783,6 +3808,8 @@ void intel_cx0_pll_power_save_wa(struct
> intel_display *display)
> >                             encoder->base.base.id,
> >encoder->base.name);
> >
> >                 intel_cx0pll_enable(encoder, &pll_state);
> >+                intel_cx0pll_enable_clock(encoder);
> >                 intel_cx0pll_disable(encoder);
> >+                intel_cx0pll_disable_clock(encoder);
> >         }
> > }
> >diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >index 9aa84a430f09..59395076103c 100644
> >--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >@@ -186,11 +186,13 @@ void assert_dpll(struct intel_display *display,
> >                      "asserting DPLL %s with no DPLL\n", str_on_off(state)))
> >                 return;
> >
> >-        cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
> >-        INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
> >-                                 "%s assertion failure (expected %s, current %s)\n",
> >-                                 pll->info->name, str_on_off(state),
> >-                                 str_on_off(cur_state));
> >+        if (DISPLAY_VER(display) < 14) {
> >+                cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
> >+                INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
> >+                                         "%s assertion failure (expected %s, current %s)\n",
> >+                                         pll->info->name, str_on_off(state),
> >+                                         str_on_off(cur_state));
> >+        }
> > }
> >
> > static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id)
> >--
> >2.34.1
> >

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [PATCH 2/3] drm/i915/cx0: Move step 12 to enable clock hook
  2025-12-30 15:22   ` Gustavo Sousa
@ 2025-12-31  5:10     ` Kandpal, Suraj
  2026-01-05 14:37       ` Gustavo Sousa
  0 siblings, 1 reply; 21+ messages in thread
From: Kandpal, Suraj @ 2025-12-31  5:10 UTC (permalink / raw)
  To: Sousa, Gustavo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K, Kahola, Mika

> 
> Quoting Suraj Kandpal (2025-12-30 05:31:41-03:00)
> >Move the step to toggle powerdown sequence change for HDMI to enable
> >clock hook where it belongs according to its sequence.
> >Do the required changes to make that work.
> 
> This should probably be a squash into the previous patch?

So reason for separate patch is that this requires me changing the argument of
clock enable which is not because of the same logical reason that changes are being done in patch 1,
hence a separate patch for changes that were brought about due to another reason. Had this been just movement
of step 12 then I would have squashed them.

Regards,
Suraj Kandpal

> 
> --
> Gustavo Sousa
> 
> >
> >Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> >---
> > drivers/gpu/drm/i915/display/intel_cx0_phy.c | 37 ++++++++++----------
> > 1 file changed, 19 insertions(+), 18 deletions(-)
> >
> >diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >index f3baba264e88..5edd293b533b 100644
> >--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >@@ -3281,21 +3281,6 @@ static void intel_cx0pll_enable(struct
> intel_encoder *encoder,
> >          */
> >         intel_de_write(display, DDI_CLK_VALFREQ(encoder->port),
> >port_clock);
> >
> >-        /*
> >-         * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
> >-         *
> >-         * Wa_13013502646:
> >-         * Fixes: HDMI lane to lane skew violations on C10 display PHYs.
> >-         * Workaround: Toggle powerdown value by setting first to P0 and then
> to P2, for both
> >-         * PHY lanes.
> >-         */
> >-        if (!cx0pll_state_is_dp(pll_state) && pll_state->use_c10) {
> >-                intel_cx0_powerdown_change_sequence(encoder,
> INTEL_CX0_BOTH_LANES,
> >-                                                    XELPDP_P0_STATE_ACTIVE);
> >-                intel_cx0_powerdown_change_sequence(encoder,
> INTEL_CX0_BOTH_LANES,
> >-                                                    XELPDP_P2_STATE_READY);
> >-        }
> >-
> >         intel_cx0_phy_transaction_end(encoder, wakeref);  }
> >
> >@@ -3379,7 +3364,8 @@ static int intel_mtl_tbt_clock_select(struct
> intel_display *display,
> >         }
> > }
> >
> >-static void intel_cx0pll_enable_clock(struct intel_encoder *encoder)
> >+static void intel_cx0pll_enable_clock(struct intel_encoder *encoder,
> >+                                      const struct intel_cx0pll_state
> >+*pll_state)
> > {
> >         struct intel_display *display = to_intel_display(encoder);
> >         enum phy phy = intel_encoder_to_phy(encoder); @@ -3412,6
> >+3398,21 @@ static void intel_cx0pll_enable_clock(struct intel_encoder
> *encoder)
> >          * Frequency Change. We handle this step in bxt_set_cdclk().
> >          */
> >
> >+        /*
> >+         * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
> >+         *
> >+         * Wa_13013502646:
> >+         * Fixes: HDMI lane to lane skew violations on C10 display PHYs.
> >+         * Workaround: Toggle powerdown value by setting first to P0 and then
> to P2, for both
> >+         * PHY lanes.
> >+         */
> >+        if (!cx0pll_state_is_dp(pll_state) && pll_state->use_c10) {
> >+                intel_cx0_powerdown_change_sequence(encoder,
> INTEL_CX0_BOTH_LANES,
> >+                                                    XELPDP_P0_STATE_ACTIVE);
> >+                intel_cx0_powerdown_change_sequence(encoder,
> INTEL_CX0_BOTH_LANES,
> >+                                                    XELPDP_P2_STATE_READY);
> >+        }
> >+
> >         intel_cx0_phy_transaction_end(encoder, wakeref); }
> >
> >@@ -3485,7 +3486,7 @@ void intel_mtl_pll_enable_clock(struct
> intel_encoder *encoder,
> >         if (intel_tc_port_in_tbt_alt_mode(dig_port))
> >                 intel_mtl_tbt_pll_enable_clock(encoder, crtc_state->port_clock);
> >         else
> >-                intel_cx0pll_enable_clock(encoder);
> >+                intel_cx0pll_enable_clock(encoder,
> >+ &crtc_state->dpll_hw_state.cx0pll);
> > }
> >
> > /*
> >@@ -3808,7 +3809,7 @@ void intel_cx0_pll_power_save_wa(struct
> intel_display *display)
> >                             encoder->base.base.id,
> >encoder->base.name);
> >
> >                 intel_cx0pll_enable(encoder, &pll_state);
> >-                intel_cx0pll_enable_clock(encoder);
> >+                intel_cx0pll_enable_clock(encoder, &pll_state);
> >                 intel_cx0pll_disable(encoder);
> >                 intel_cx0pll_disable_clock(encoder);
> >         }
> >--
> >2.34.1
> >

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts
  2025-12-31  5:07     ` Kandpal, Suraj
@ 2026-01-05 14:13       ` Gustavo Sousa
  2026-01-06  6:19         ` Kandpal, Suraj
  2026-01-08  8:51         ` Kahola, Mika
  0 siblings, 2 replies; 21+ messages in thread
From: Gustavo Sousa @ 2026-01-05 14:13 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K, Kahola, Mika

Quoting Kandpal, Suraj (2025-12-31 02:07:35-03:00)
>> Subject: Re: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two
>> parts
>> 
>> Quoting Suraj Kandpal (2025-12-30 05:31:40-03:00)
>> >From: Mika Kahola <mika.kahola@intel.com>
>> >
>> >Split PLL enabling/disabling in two parts - one for pll setting pll
>> >dividers and second one to enable/disable pll clock. PLL clock
>> >enabling/disbling happens via encoder->enable_clock/disable_clock
>> >function hook. The reason for doing this is that we need to make sure
>> >the clock enablement happens after PPS ON step to be inline with the
>> >sequences which we end up violating otherwise. As a result of this
>> >violation we end up in a hanged state if machine stays idle for more
>> >that 15 mins.
>> 
>> So, it appears this started happening when we Cx0 code was integrated into
>> the DPLL framework and then the driver started enabling the PHY PLL/clock
>> too early, right?
>> 
>> I am lacking some context/background here due to my unfamiliarity with pre-
>> MTL platforms, but why I exactly do we program the PLLs before the modeset
>> sequence?  Is it related to the shared nature of PLLs for platforms pre-
>> C10/pre-C20?  If so, do we really need to do the same for
>> C10/C20 PHYs, since we have dedicated PLLs for them?
>> 
>> (Sorry for asking here and a bit too late.  Probably the better place to ask this
>> was in series that integrated Cx0 into the DPLL framework.)
>
>
>Right it used to be actually because of the shared nature of PLL's. With c10 c20 we moved
>to a different framework where we called the the sequence together using hooks like enable_clock
>and disable_clock since there was not a lot of time of time to refactor the dpll_shared_framework to
>a framework with supported individual ones.
>Now that we had time we shifted cx0 back to the previous framework but missed defer the clock enablement

Then, if we move forward with this, perhaps this patch deserves a
"Fixes:" trailer.

>To later during enable clock time so that we honor the sequence, why we had to do this is even though its not shared PLL anymore is
>To make sure this framework is backward compatible too.

I see.

If the requirement for programming PLL parameters early was only because
of shared PLLs and we do not have that same requirements for C10/C20, I
would argue that doing the whole programming at once and only during the
"enable clock" phase of the encoder would make the driver more compliant
with the Bspec.

I also noticed that, for the older displays, the "enable clock" thing is
the part that selects the PLL (which is already enabled) as the port's
"clock source".  With C10/C20 we are actually deferring the PLL enabling
to the "enable clock" phase of the port while, I believe, the
expectation of intel_dpll_funcs::enable() is that the PLL would be
enabled when the function returned, which would not be exactly true for
C10/C20 after this patch.

What if, in intel_dpll_mgr, we made the distinction between enabling the
PLL early and enabling it at "intel_ddi_enable_clock()" time?

--
Gustavo Sousa

>Also we had to move cx0 pll framework back to dpll framework because the previous can work well as long as the ports are static hence aren’t
>As future proof , we plan to move LT PHY back here too once this ages well.
>
>> 
>> >
>> >PLL state verification happens now earlier than the clock is enabled
>> >which causes a drm warn to be thrown. Silence this warning by allowing
>> >this check for only earlier platforms than MeteorLake.
>> >
>> >Bspec: 49190
>> 
>> This Bspec page is not invalid for platforms using C10/C20 PHYs.
>> 
>> We probably want to use these instead:
>> 
>> Bspec: 65448, 68849
>>
>
>Sure will replace them.
>
>Regards,
>Suraj Kandpal
> 
>> --
>> Gustavo Sousa
>> 
>> >Signed-off-by: Mika Kahola <mika.kahola@intel.com>
>> >Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
>> >---
>> > drivers/gpu/drm/i915/display/intel_cx0_phy.c  | 87 ++++++++++++-------
>> >drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 12 +--
>> > 2 files changed, 64 insertions(+), 35 deletions(-)
>> >
>> >diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >index 7288065d2461..f3baba264e88 100644
>> >--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >@@ -3225,11 +3225,8 @@ static void intel_cx0pll_enable(struct
>> >intel_encoder *encoder,  {
>> >         int port_clock = pll_state->use_c10 ? pll_state->c10.clock : pll_state-
>> >c20.clock;
>> >         struct intel_display *display = to_intel_display(encoder);
>> >-        enum phy phy = intel_encoder_to_phy(encoder);
>> >         struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
>> >         bool lane_reversal = dig_port->lane_reversal;
>> >-        u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
>> >-                                          INTEL_CX0_LANE0;
>> >         struct ref_tracker *wakeref =
>> >intel_cx0_phy_transaction_begin(encoder);
>> >
>> >         /*
>> >@@ -3284,27 +3281,6 @@ static void intel_cx0pll_enable(struct
>> intel_encoder *encoder,
>> >          */
>> >         intel_de_write(display, DDI_CLK_VALFREQ(encoder->port),
>> >port_clock);
>> >
>> >-        /*
>> >-         * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
>> >-         * LN<Lane for maxPCLK> to "1" to enable PLL.
>> >-         */
>> >-        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
>> >port),
>> >-                     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
>> >-                     intel_cx0_get_pclk_pll_request(maxpclk_lane));
>> >-
>> >-        /* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK>
>> == "1". */
>> >-        if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display,
>> encoder->port),
>> >-                             intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
>> >-                             intel_cx0_get_pclk_pll_ack(maxpclk_lane),
>> >-                             XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
>> >-                drm_warn(display->drm, "Port %c PLL not locked\n",
>> >-                         phy_name(phy));
>> >-
>> >-        /*
>> >-         * 11. Follow the Display Voltage Frequency Switching Sequence After
>> >-         * Frequency Change. We handle this step in bxt_set_cdclk().
>> >-         */
>> >-
>> >         /*
>> >          * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
>> >          *
>> >@@ -3403,6 +3379,42 @@ static int intel_mtl_tbt_clock_select(struct
>> intel_display *display,
>> >         }
>> > }
>> >
>> >+static void intel_cx0pll_enable_clock(struct intel_encoder *encoder) {
>> >+        struct intel_display *display = to_intel_display(encoder);
>> >+        enum phy phy = intel_encoder_to_phy(encoder);
>> >+        struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
>> >+        bool lane_reversal = dig_port->lane_reversal;
>> >+                                          INTEL_CX0_LANE0;
>> >+        u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
>> >+                                        INTEL_CX0_LANE0;
>> >+
>> >+        struct ref_tracker *wakeref =
>> >+ intel_cx0_phy_transaction_begin(encoder);
>> >+
>> >+        /*
>> >+         * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
>> >+         * LN<Lane for maxPCLK> to "1" to enable PLL.
>> >+         */
>> >+        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
>> >port),
>> >+                     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
>> >+                     intel_cx0_get_pclk_pll_request(maxpclk_lane));
>> >+
>> >+        /* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK>
>> == "1". */
>> >+        if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display,
>> encoder->port),
>> >+                             intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
>> >+                             intel_cx0_get_pclk_pll_ack(maxpclk_lane),
>> >+                             XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
>> >+                drm_warn(display->drm, "Port %c PLL not locked\n",
>> >+                         phy_name(phy));
>> >+
>> >+        /*
>> >+         * 11. Follow the Display Voltage Frequency Switching Sequence After
>> >+         * Frequency Change. We handle this step in bxt_set_cdclk().
>> >+         */
>> >+
>> >+        intel_cx0_phy_transaction_end(encoder, wakeref); }
>> >+
>> > void intel_mtl_tbt_pll_enable_clock(struct intel_encoder *encoder, int
>> >port_clock)  {
>> >         struct intel_display *display = to_intel_display(encoder); @@
>> >-3472,6 +3484,8 @@ void intel_mtl_pll_enable_clock(struct intel_encoder
>> >*encoder,
>> >
>> >         if (intel_tc_port_in_tbt_alt_mode(dig_port))
>> >                 intel_mtl_tbt_pll_enable_clock(encoder,
>> > crtc_state->port_clock);
>> >+        else
>> >+                intel_cx0pll_enable_clock(encoder);
>> > }
>> >
>> > /*
>> >@@ -3567,12 +3581,6 @@ static void intel_cx0pll_disable(struct
>> intel_encoder *encoder)
>> >          * Frequency Change. We handle this step in bxt_set_cdclk().
>> >          */
>> >
>> >-        /* 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(display), 0);
>> >-        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
>> >port),
>> >-                     XELPDP_FORWARD_CLOCK_UNGATE, 0);
>> >-
>> >         intel_cx0_phy_transaction_end(encoder, wakeref);  }
>> >
>> >@@ -3586,6 +3594,20 @@ static bool intel_cx0_pll_is_enabled(struct
>> intel_encoder *encoder)
>> >                              intel_cx0_get_pclk_pll_request(lane);
>> > }
>> >
>> >+static void intel_cx0pll_disable_clock(struct intel_encoder *encoder)
>> >+{
>> >+        struct intel_display *display = to_intel_display(encoder);
>> >+        struct ref_tracker *wakeref =
>> >+intel_cx0_phy_transaction_begin(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(display), 0);
>> >+        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
>> >port),
>> >+                     XELPDP_FORWARD_CLOCK_UNGATE, 0);
>> >+
>> >+        intel_cx0_phy_transaction_end(encoder, wakeref); }
>> >+
>> > void intel_mtl_tbt_pll_disable_clock(struct intel_encoder *encoder)  {
>> >         struct intel_display *display = to_intel_display(encoder); @@
>> >-3635,6 +3657,9 @@ void intel_mtl_pll_disable_clock(struct
>> >intel_encoder *encoder)
>> >
>> >         if (intel_tc_port_in_tbt_alt_mode(dig_port))
>> >                 intel_mtl_tbt_pll_disable_clock(encoder);
>> >+        else
>> >+                intel_cx0pll_disable_clock(encoder);
>> >+
>> > }
>> >
>> > enum icl_port_dpll_id
>> >@@ -3783,6 +3808,8 @@ void intel_cx0_pll_power_save_wa(struct
>> intel_display *display)
>> >                             encoder->base.base.id,
>> >encoder->base.name);
>> >
>> >                 intel_cx0pll_enable(encoder, &pll_state);
>> >+                intel_cx0pll_enable_clock(encoder);
>> >                 intel_cx0pll_disable(encoder);
>> >+                intel_cx0pll_disable_clock(encoder);
>> >         }
>> > }
>> >diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
>> >b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
>> >index 9aa84a430f09..59395076103c 100644
>> >--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
>> >+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
>> >@@ -186,11 +186,13 @@ void assert_dpll(struct intel_display *display,
>> >                      "asserting DPLL %s with no DPLL\n", str_on_off(state)))
>> >                 return;
>> >
>> >-        cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
>> >-        INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
>> >-                                 "%s assertion failure (expected %s, current %s)\n",
>> >-                                 pll->info->name, str_on_off(state),
>> >-                                 str_on_off(cur_state));
>> >+        if (DISPLAY_VER(display) < 14) {
>> >+                cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
>> >+                INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
>> >+                                         "%s assertion failure (expected %s, current %s)\n",
>> >+                                         pll->info->name, str_on_off(state),
>> >+                                         str_on_off(cur_state));
>> >+        }
>> > }
>> >
>> > static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id)
>> >--
>> >2.34.1
>> >

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [PATCH 2/3] drm/i915/cx0: Move step 12 to enable clock hook
  2025-12-31  5:10     ` Kandpal, Suraj
@ 2026-01-05 14:37       ` Gustavo Sousa
  2026-01-06  6:18         ` Kandpal, Suraj
  0 siblings, 1 reply; 21+ messages in thread
From: Gustavo Sousa @ 2026-01-05 14:37 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K, Kahola, Mika

Quoting Kandpal, Suraj (2025-12-31 02:10:59-03:00)
>> 
>> Quoting Suraj Kandpal (2025-12-30 05:31:41-03:00)
>> >Move the step to toggle powerdown sequence change for HDMI to enable
>> >clock hook where it belongs according to its sequence.
>> >Do the required changes to make that work.
>> 
>> This should probably be a squash into the previous patch?
>
>So reason for separate patch is that this requires me changing the argument of
>clock enable which is not because of the same logical reason that changes are being done in patch 1,
>hence a separate patch for changes that were brought about due to another reason. Had this been just movement
>of step 12 then I would have squashed them.

Hm... The previous patch is introducing intel_cx0pll_enable_clock() and
says it is splitting the sequence in two, but then it ended up is
leaving step 12 behind.  If it is introducing
intel_cx0pll_enable_clock(), it could as well have done it with a
signature that allows step 12 to be done.

IMO, here we are modifying that function to "make it right".  This looks
like a good fixup candidate to me.

--
Gustavo Sousa

>
>Regards,
>Suraj Kandpal
>
>> 
>> --
>> Gustavo Sousa
>> 
>> >
>> >Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
>> >---
>> > drivers/gpu/drm/i915/display/intel_cx0_phy.c | 37 ++++++++++----------
>> > 1 file changed, 19 insertions(+), 18 deletions(-)
>> >
>> >diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >index f3baba264e88..5edd293b533b 100644
>> >--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >@@ -3281,21 +3281,6 @@ static void intel_cx0pll_enable(struct
>> intel_encoder *encoder,
>> >          */
>> >         intel_de_write(display, DDI_CLK_VALFREQ(encoder->port),
>> >port_clock);
>> >
>> >-        /*
>> >-         * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
>> >-         *
>> >-         * Wa_13013502646:
>> >-         * Fixes: HDMI lane to lane skew violations on C10 display PHYs.
>> >-         * Workaround: Toggle powerdown value by setting first to P0 and then
>> to P2, for both
>> >-         * PHY lanes.
>> >-         */
>> >-        if (!cx0pll_state_is_dp(pll_state) && pll_state->use_c10) {
>> >-                intel_cx0_powerdown_change_sequence(encoder,
>> INTEL_CX0_BOTH_LANES,
>> >-                                                    XELPDP_P0_STATE_ACTIVE);
>> >-                intel_cx0_powerdown_change_sequence(encoder,
>> INTEL_CX0_BOTH_LANES,
>> >-                                                    XELPDP_P2_STATE_READY);
>> >-        }
>> >-
>> >         intel_cx0_phy_transaction_end(encoder, wakeref);  }
>> >
>> >@@ -3379,7 +3364,8 @@ static int intel_mtl_tbt_clock_select(struct
>> intel_display *display,
>> >         }
>> > }
>> >
>> >-static void intel_cx0pll_enable_clock(struct intel_encoder *encoder)
>> >+static void intel_cx0pll_enable_clock(struct intel_encoder *encoder,
>> >+                                      const struct intel_cx0pll_state
>> >+*pll_state)
>> > {
>> >         struct intel_display *display = to_intel_display(encoder);
>> >         enum phy phy = intel_encoder_to_phy(encoder); @@ -3412,6
>> >+3398,21 @@ static void intel_cx0pll_enable_clock(struct intel_encoder
>> *encoder)
>> >          * Frequency Change. We handle this step in bxt_set_cdclk().
>> >          */
>> >
>> >+        /*
>> >+         * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
>> >+         *
>> >+         * Wa_13013502646:
>> >+         * Fixes: HDMI lane to lane skew violations on C10 display PHYs.
>> >+         * Workaround: Toggle powerdown value by setting first to P0 and then
>> to P2, for both
>> >+         * PHY lanes.
>> >+         */
>> >+        if (!cx0pll_state_is_dp(pll_state) && pll_state->use_c10) {
>> >+                intel_cx0_powerdown_change_sequence(encoder,
>> INTEL_CX0_BOTH_LANES,
>> >+                                                    XELPDP_P0_STATE_ACTIVE);
>> >+                intel_cx0_powerdown_change_sequence(encoder,
>> INTEL_CX0_BOTH_LANES,
>> >+                                                    XELPDP_P2_STATE_READY);
>> >+        }
>> >+
>> >         intel_cx0_phy_transaction_end(encoder, wakeref); }
>> >
>> >@@ -3485,7 +3486,7 @@ void intel_mtl_pll_enable_clock(struct
>> intel_encoder *encoder,
>> >         if (intel_tc_port_in_tbt_alt_mode(dig_port))
>> >                 intel_mtl_tbt_pll_enable_clock(encoder, crtc_state->port_clock);
>> >         else
>> >-                intel_cx0pll_enable_clock(encoder);
>> >+                intel_cx0pll_enable_clock(encoder,
>> >+ &crtc_state->dpll_hw_state.cx0pll);
>> > }
>> >
>> > /*
>> >@@ -3808,7 +3809,7 @@ void intel_cx0_pll_power_save_wa(struct
>> intel_display *display)
>> >                             encoder->base.base.id,
>> >encoder->base.name);
>> >
>> >                 intel_cx0pll_enable(encoder, &pll_state);
>> >-                intel_cx0pll_enable_clock(encoder);
>> >+                intel_cx0pll_enable_clock(encoder, &pll_state);
>> >                 intel_cx0pll_disable(encoder);
>> >                 intel_cx0pll_disable_clock(encoder);
>> >         }
>> >--
>> >2.34.1
>> >

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit
  2025-12-31  4:59     ` Kandpal, Suraj
@ 2026-01-05 15:14       ` Gustavo Sousa
  2026-01-06  6:21         ` Kandpal, Suraj
  0 siblings, 1 reply; 21+ messages in thread
From: Gustavo Sousa @ 2026-01-05 15:14 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K, Kahola, Mika, Jani Nikula

Quoting Kandpal, Suraj (2025-12-31 01:59:29-03:00)
>> Subject: Re: [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit
>> 
>> Quoting Suraj Kandpal (2025-12-30 05:31:42-03:00)
>> >Clear the response ready and error bit of PORT_P2M_MESSAGE_BUS_STATUS
>> >before writing the transaction pending bit of PORT_M2P_MSGBUS_CTL as
>> >that is a hard requirement. If not done we find that the PHY hangs
>> >since it ends up in a weird state if left idle for more than 1 hour.
>> 
>> Since the series title refers to suspend/resume, is there an easy way of
>> reproducing this via some power state transition?
>
>Sadly no we did try to no avail went as low as DC9 too. Tried sleep then wake,
>Tried hibernating too.

I see.  I was wondering if DMC could be at play here.

So the only known way of reproducing this is to leave it idle for more
than 1 hour?  Do you know if that happens if we load the driver with
DC5/6 disabled (i.e. enable_dc=0)?

>
>> 
>> I'm wondering if we are looking at a driver issue here or if this is really
>> something else.  I see that we usually call intel_cx0_bus_reset() in error paths,
>> which contains a call to intel_clear_response_ready_flag(), but it could end up
>> being not called if the reset times out.
>
>Yes the reset times out and this is because PHY is in hanged state here
>
>> 
>> Do we see error messages from the driver when the PHY hangs?
>
>Yes we do see a PHY hang when we are at the stage of swing programming setting
>And the error happens when we try to read the msg access bit itself which is because the PHY ends up in
>Weird state where it has a write ack but no response ready bit getting set.
>But with my observation I can certainly say this is PHY issue.
>I also double confirmed this behavior with windows folks and their code where they said they saw an issue in the same lines.
>Also the bspec basically adds this as a disclaimer that response ready and error bit should be cleared no matter what before writing
>The transaction pending bit.

Agreed on the need to clear the response ready bit before starting
another transaction, so the patch looks fine.  I believe Jani's
request to rename the function wouldn't necessarily change the semantics
of this patch, so

Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>

in case the rename gets done as a follow-up.

>
>Regards,
>Suraj Kandpal
>
>> 
>> --
>> Gustavo Sousa
>> 
>> >
>> >Bspec: 65101
>> >Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
>> >---
>> > drivers/gpu/drm/i915/display/intel_cx0_phy.c | 4 ++++
>> > 1 file changed, 4 insertions(+)
>> >
>> >diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >index 5edd293b533b..5ebc3404eee2 100644
>> >--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
>> >@@ -222,6 +222,8 @@ static int __intel_cx0_read_once(struct intel_encoder
>> *encoder,
>> >                 return -ETIMEDOUT;
>> >         }
>> >
>> >+        intel_clear_response_ready_flag(encoder, lane);
>> >+
>> >         intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port,
>> lane),
>> >                        XELPDP_PORT_M2P_TRANSACTION_PENDING |
>> >                        XELPDP_PORT_M2P_COMMAND_READ | @@ -293,6 +295,8
>> >@@ static int __intel_cx0_write_once(struct intel_encoder *encoder,
>> >                 return -ETIMEDOUT;
>> >         }
>> >
>> >+        intel_clear_response_ready_flag(encoder, lane);
>> >+
>> >         intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port,
>> lane),
>> >                        XELPDP_PORT_M2P_TRANSACTION_PENDING |
>> >                        (committed ?
>> XELPDP_PORT_M2P_COMMAND_WRITE_COMMITTED :
>> >--
>> >2.34.1
>> >

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [PATCH 2/3] drm/i915/cx0: Move step 12 to enable clock hook
  2026-01-05 14:37       ` Gustavo Sousa
@ 2026-01-06  6:18         ` Kandpal, Suraj
  0 siblings, 0 replies; 21+ messages in thread
From: Kandpal, Suraj @ 2026-01-06  6:18 UTC (permalink / raw)
  To: Sousa, Gustavo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K, Kahola, Mika

> Subject: RE: [PATCH 2/3] drm/i915/cx0: Move step 12 to enable clock hook
> 
> Quoting Kandpal, Suraj (2025-12-31 02:10:59-03:00)
> >>
> >> Quoting Suraj Kandpal (2025-12-30 05:31:41-03:00)
> >> >Move the step to toggle powerdown sequence change for HDMI to
> enable
> >> >clock hook where it belongs according to its sequence.
> >> >Do the required changes to make that work.
> >>
> >> This should probably be a squash into the previous patch?
> >
> >So reason for separate patch is that this requires me changing the
> >argument of clock enable which is not because of the same logical
> >reason that changes are being done in patch 1, hence a separate patch
> >for changes that were brought about due to another reason. Had this been
> just movement of step 12 then I would have squashed them.
> 
> Hm... The previous patch is introducing intel_cx0pll_enable_clock() and says it
> is splitting the sequence in two, but then it ended up is leaving step 12 behind.
> If it is introducing intel_cx0pll_enable_clock(), it could as well have done it
> with a signature that allows step 12 to be done.
> 
> IMO, here we are modifying that function to "make it right".  This looks like a
> good fixup candidate to me.
> 

Let's see how the discussion in patch 1 goes then see how this can be dealt with

Regards,
Suraj Kandpal
> --
> Gustavo Sousa
> 
> >
> >Regards,
> >Suraj Kandpal
> >
> >>
> >> --
> >> Gustavo Sousa
> >>
> >> >
> >> >Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> >> >---
> >> > drivers/gpu/drm/i915/display/intel_cx0_phy.c | 37
> >> >++++++++++----------
> >> > 1 file changed, 19 insertions(+), 18 deletions(-)
> >> >
> >> >diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >index f3baba264e88..5edd293b533b 100644
> >> >--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >@@ -3281,21 +3281,6 @@ static void intel_cx0pll_enable(struct
> >> intel_encoder *encoder,
> >> >          */
> >> >         intel_de_write(display, DDI_CLK_VALFREQ(encoder->port),
> >> >port_clock);
> >> >
> >> >-        /*
> >> >-         * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
> >> >-         *
> >> >-         * Wa_13013502646:
> >> >-         * Fixes: HDMI lane to lane skew violations on C10 display PHYs.
> >> >-         * Workaround: Toggle powerdown value by setting first to P0 and
> then
> >> to P2, for both
> >> >-         * PHY lanes.
> >> >-         */
> >> >-        if (!cx0pll_state_is_dp(pll_state) && pll_state->use_c10) {
> >> >-                intel_cx0_powerdown_change_sequence(encoder,
> >> INTEL_CX0_BOTH_LANES,
> >> >-                                                    XELPDP_P0_STATE_ACTIVE);
> >> >-                intel_cx0_powerdown_change_sequence(encoder,
> >> INTEL_CX0_BOTH_LANES,
> >> >-                                                    XELPDP_P2_STATE_READY);
> >> >-        }
> >> >-
> >> >         intel_cx0_phy_transaction_end(encoder, wakeref);  }
> >> >
> >> >@@ -3379,7 +3364,8 @@ static int intel_mtl_tbt_clock_select(struct
> >> intel_display *display,
> >> >         }
> >> > }
> >> >
> >> >-static void intel_cx0pll_enable_clock(struct intel_encoder
> >> >*encoder)
> >> >+static void intel_cx0pll_enable_clock(struct intel_encoder *encoder,
> >> >+                                      const struct
> >> >+intel_cx0pll_state
> >> >+*pll_state)
> >> > {
> >> >         struct intel_display *display = to_intel_display(encoder);
> >> >         enum phy phy = intel_encoder_to_phy(encoder); @@ -3412,6
> >> >+3398,21 @@ static void intel_cx0pll_enable_clock(struct
> >> >+intel_encoder
> >> *encoder)
> >> >          * Frequency Change. We handle this step in bxt_set_cdclk().
> >> >          */
> >> >
> >> >+        /*
> >> >+         * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
> >> >+         *
> >> >+         * Wa_13013502646:
> >> >+         * Fixes: HDMI lane to lane skew violations on C10 display PHYs.
> >> >+         * Workaround: Toggle powerdown value by setting first to
> >> >+ P0 and then
> >> to P2, for both
> >> >+         * PHY lanes.
> >> >+         */
> >> >+        if (!cx0pll_state_is_dp(pll_state) && pll_state->use_c10) {
> >> >+                intel_cx0_powerdown_change_sequence(encoder,
> >> INTEL_CX0_BOTH_LANES,
> >> >+                                                    XELPDP_P0_STATE_ACTIVE);
> >> >+                intel_cx0_powerdown_change_sequence(encoder,
> >> INTEL_CX0_BOTH_LANES,
> >> >+                                                    XELPDP_P2_STATE_READY);
> >> >+        }
> >> >+
> >> >         intel_cx0_phy_transaction_end(encoder, wakeref); }
> >> >
> >> >@@ -3485,7 +3486,7 @@ void intel_mtl_pll_enable_clock(struct
> >> intel_encoder *encoder,
> >> >         if (intel_tc_port_in_tbt_alt_mode(dig_port))
> >> >                 intel_mtl_tbt_pll_enable_clock(encoder, crtc_state-
> >port_clock);
> >> >         else
> >> >-                intel_cx0pll_enable_clock(encoder);
> >> >+                intel_cx0pll_enable_clock(encoder,
> >> >+ &crtc_state->dpll_hw_state.cx0pll);
> >> > }
> >> >
> >> > /*
> >> >@@ -3808,7 +3809,7 @@ void intel_cx0_pll_power_save_wa(struct
> >> intel_display *display)
> >> >                             encoder->base.base.id,
> >> >encoder->base.name);
> >> >
> >> >                 intel_cx0pll_enable(encoder, &pll_state);
> >> >-                intel_cx0pll_enable_clock(encoder);
> >> >+                intel_cx0pll_enable_clock(encoder, &pll_state);
> >> >                 intel_cx0pll_disable(encoder);
> >> >                 intel_cx0pll_disable_clock(encoder);
> >> >         }
> >> >--
> >> >2.34.1
> >> >

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts
  2026-01-05 14:13       ` Gustavo Sousa
@ 2026-01-06  6:19         ` Kandpal, Suraj
  2026-01-08  8:51         ` Kahola, Mika
  1 sibling, 0 replies; 21+ messages in thread
From: Kandpal, Suraj @ 2026-01-06  6:19 UTC (permalink / raw)
  To: Sousa, Gustavo, Kahola, Mika, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org, Deak, Imre
  Cc: Nautiyal, Ankit K

> Subject: RE: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two
> parts
> 
> Quoting Kandpal, Suraj (2025-12-31 02:07:35-03:00)
> >> Subject: Re: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling
> >> in two parts
> >>
> >> Quoting Suraj Kandpal (2025-12-30 05:31:40-03:00)
> >> >From: Mika Kahola <mika.kahola@intel.com>
> >> >
> >> >Split PLL enabling/disabling in two parts - one for pll setting pll
> >> >dividers and second one to enable/disable pll clock. PLL clock
> >> >enabling/disbling happens via encoder->enable_clock/disable_clock
> >> >function hook. The reason for doing this is that we need to make
> >> >sure the clock enablement happens after PPS ON step to be inline
> >> >with the sequences which we end up violating otherwise. As a result
> >> >of this violation we end up in a hanged state if machine stays idle
> >> >for more that 15 mins.
> >>
> >> So, it appears this started happening when we Cx0 code was integrated
> >> into the DPLL framework and then the driver started enabling the PHY
> >> PLL/clock too early, right?
> >>
> >> I am lacking some context/background here due to my unfamiliarity
> >> with pre- MTL platforms, but why I exactly do we program the PLLs
> >> before the modeset sequence?  Is it related to the shared nature of
> >> PLLs for platforms pre- C10/pre-C20?  If so, do we really need to do
> >> the same for
> >> C10/C20 PHYs, since we have dedicated PLLs for them?
> >>
> >> (Sorry for asking here and a bit too late.  Probably the better place
> >> to ask this was in series that integrated Cx0 into the DPLL
> >> framework.)
> >
> >
> >Right it used to be actually because of the shared nature of PLL's.
> >With c10 c20 we moved to a different framework where we called the the
> >sequence together using hooks like enable_clock and disable_clock since
> >there was not a lot of time of time to refactor the dpll_shared_framework to
> a framework with supported individual ones.
> >Now that we had time we shifted cx0 back to the previous framework but
> >missed defer the clock enablement
> 
> Then, if we move forward with this, perhaps this patch deserves a "Fixes:"
> trailer.
> 
> >To later during enable clock time so that we honor the sequence, why we
> >had to do this is even though its not shared PLL anymore is To make sure this
> framework is backward compatible too.
> 
> I see.
> 
> If the requirement for programming PLL parameters early was only because of
> shared PLLs and we do not have that same requirements for C10/C20, I would
> argue that doing the whole programming at once and only during the "enable
> clock" phase of the encoder would make the driver more compliant with the
> Bspec.
> 
> I also noticed that, for the older displays, the "enable clock" thing is the part
> that selects the PLL (which is already enabled) as the port's "clock source".
> With C10/C20 we are actually deferring the PLL enabling to the "enable clock"
> phase of the port while, I believe, the expectation of intel_dpll_funcs::enable()
> is that the PLL would be enabled when the function returned, which would not
> be exactly true for
> C10/C20 after this patch.
> 
> What if, in intel_dpll_mgr, we made the distinction between enabling the PLL
> early and enabling it at "intel_ddi_enable_clock()" time?
> 

Any inputs here @Kahola, Mika @Deak, Imre

Regards,
Suraj Kandpal

> --
> Gustavo Sousa
> 
> >Also we had to move cx0 pll framework back to dpll framework because
> >the previous can work well as long as the ports are static hence aren’t As
> future proof , we plan to move LT PHY back here too once this ages well.
> >
> >>
> >> >
> >> >PLL state verification happens now earlier than the clock is enabled
> >> >which causes a drm warn to be thrown. Silence this warning by
> >> >allowing this check for only earlier platforms than MeteorLake.
> >> >
> >> >Bspec: 49190
> >>
> >> This Bspec page is not invalid for platforms using C10/C20 PHYs.
> >>
> >> We probably want to use these instead:
> >>
> >> Bspec: 65448, 68849
> >>
> >
> >Sure will replace them.
> >
> >Regards,
> >Suraj Kandpal
> >
> >> --
> >> Gustavo Sousa
> >>
> >> >Signed-off-by: Mika Kahola <mika.kahola@intel.com>
> >> >Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> >> >---
> >> > drivers/gpu/drm/i915/display/intel_cx0_phy.c  | 87
> >> >++++++++++++------- drivers/gpu/drm/i915/display/intel_dpll_mgr.c |
> >> >12 +--
> >> > 2 files changed, 64 insertions(+), 35 deletions(-)
> >> >
> >> >diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >index 7288065d2461..f3baba264e88 100644
> >> >--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >@@ -3225,11 +3225,8 @@ static void intel_cx0pll_enable(struct
> >> >intel_encoder *encoder,  {
> >> >         int port_clock = pll_state->use_c10 ? pll_state->c10.clock
> >> >: pll_state- c20.clock;
> >> >         struct intel_display *display = to_intel_display(encoder);
> >> >-        enum phy phy = intel_encoder_to_phy(encoder);
> >> >         struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
> >> >         bool lane_reversal = dig_port->lane_reversal;
> >> >-        u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
> >> >-                                          INTEL_CX0_LANE0;
> >> >         struct ref_tracker *wakeref =
> >> >intel_cx0_phy_transaction_begin(encoder);
> >> >
> >> >         /*
> >> >@@ -3284,27 +3281,6 @@ static void intel_cx0pll_enable(struct
> >> intel_encoder *encoder,
> >> >          */
> >> >         intel_de_write(display, DDI_CLK_VALFREQ(encoder->port),
> >> >port_clock);
> >> >
> >> >-        /*
> >> >-         * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
> >> >-         * LN<Lane for maxPCLK> to "1" to enable PLL.
> >> >-         */
> >> >-        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
> >> >port),
> >> >-                     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
> >> >-                     intel_cx0_get_pclk_pll_request(maxpclk_lane));
> >> >-
> >> >-        /* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for
> maxPCLK>
> >> == "1". */
> >> >-        if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display,
> >> encoder->port),
> >> >-                             intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
> >> >-                             intel_cx0_get_pclk_pll_ack(maxpclk_lane),
> >> >-                             XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
> >> >-                drm_warn(display->drm, "Port %c PLL not locked\n",
> >> >-                         phy_name(phy));
> >> >-
> >> >-        /*
> >> >-         * 11. Follow the Display Voltage Frequency Switching Sequence
> After
> >> >-         * Frequency Change. We handle this step in bxt_set_cdclk().
> >> >-         */
> >> >-
> >> >         /*
> >> >          * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
> >> >          *
> >> >@@ -3403,6 +3379,42 @@ static int intel_mtl_tbt_clock_select(struct
> >> intel_display *display,
> >> >         }
> >> > }
> >> >
> >> >+static void intel_cx0pll_enable_clock(struct intel_encoder *encoder) {
> >> >+        struct intel_display *display = to_intel_display(encoder);
> >> >+        enum phy phy = intel_encoder_to_phy(encoder);
> >> >+        struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
> >> >+        bool lane_reversal = dig_port->lane_reversal;
> >> >+                                          INTEL_CX0_LANE0;
> >> >+        u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
> >> >+                                        INTEL_CX0_LANE0;
> >> >+
> >> >+        struct ref_tracker *wakeref =
> >> >+ intel_cx0_phy_transaction_begin(encoder);
> >> >+
> >> >+        /*
> >> >+         * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
> >> >+         * LN<Lane for maxPCLK> to "1" to enable PLL.
> >> >+         */
> >> >+        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display,
> >> >+ encoder-
> >> >port),
> >> >+                     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
> >> >+                     intel_cx0_get_pclk_pll_request(maxpclk_lane));
> >> >+
> >> >+        /* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for
> >> >+ maxPCLK>
> >> == "1". */
> >> >+        if (intel_de_wait_us(display,
> >> >+ XELPDP_PORT_CLOCK_CTL(display,
> >> encoder->port),
> >> >+                             intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
> >> >+                             intel_cx0_get_pclk_pll_ack(maxpclk_lane),
> >> >+                             XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
> >> >+                drm_warn(display->drm, "Port %c PLL not locked\n",
> >> >+                         phy_name(phy));
> >> >+
> >> >+        /*
> >> >+         * 11. Follow the Display Voltage Frequency Switching Sequence
> After
> >> >+         * Frequency Change. We handle this step in bxt_set_cdclk().
> >> >+         */
> >> >+
> >> >+        intel_cx0_phy_transaction_end(encoder, wakeref); }
> >> >+
> >> > void intel_mtl_tbt_pll_enable_clock(struct intel_encoder *encoder,
> >> >int
> >> >port_clock)  {
> >> >         struct intel_display *display = to_intel_display(encoder);
> >> >@@
> >> >-3472,6 +3484,8 @@ void intel_mtl_pll_enable_clock(struct
> >> >intel_encoder *encoder,
> >> >
> >> >         if (intel_tc_port_in_tbt_alt_mode(dig_port))
> >> >                 intel_mtl_tbt_pll_enable_clock(encoder,
> >> > crtc_state->port_clock);
> >> >+        else
> >> >+                intel_cx0pll_enable_clock(encoder);
> >> > }
> >> >
> >> > /*
> >> >@@ -3567,12 +3581,6 @@ static void intel_cx0pll_disable(struct
> >> intel_encoder *encoder)
> >> >          * Frequency Change. We handle this step in bxt_set_cdclk().
> >> >          */
> >> >
> >> >-        /* 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(display), 0);
> >> >-        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
> >> >port),
> >> >-                     XELPDP_FORWARD_CLOCK_UNGATE, 0);
> >> >-
> >> >         intel_cx0_phy_transaction_end(encoder, wakeref);  }
> >> >
> >> >@@ -3586,6 +3594,20 @@ static bool intel_cx0_pll_is_enabled(struct
> >> intel_encoder *encoder)
> >> >                              intel_cx0_get_pclk_pll_request(lane);
> >> > }
> >> >
> >> >+static void intel_cx0pll_disable_clock(struct intel_encoder
> >> >+*encoder) {
> >> >+        struct intel_display *display = to_intel_display(encoder);
> >> >+        struct ref_tracker *wakeref =
> >> >+intel_cx0_phy_transaction_begin(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(display), 0);
> >> >+        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display,
> >> >+ encoder-
> >> >port),
> >> >+                     XELPDP_FORWARD_CLOCK_UNGATE, 0);
> >> >+
> >> >+        intel_cx0_phy_transaction_end(encoder, wakeref); }
> >> >+
> >> > void intel_mtl_tbt_pll_disable_clock(struct intel_encoder *encoder)  {
> >> >         struct intel_display *display = to_intel_display(encoder);
> >> >@@
> >> >-3635,6 +3657,9 @@ void intel_mtl_pll_disable_clock(struct
> >> >intel_encoder *encoder)
> >> >
> >> >         if (intel_tc_port_in_tbt_alt_mode(dig_port))
> >> >                 intel_mtl_tbt_pll_disable_clock(encoder);
> >> >+        else
> >> >+                intel_cx0pll_disable_clock(encoder);
> >> >+
> >> > }
> >> >
> >> > enum icl_port_dpll_id
> >> >@@ -3783,6 +3808,8 @@ void intel_cx0_pll_power_save_wa(struct
> >> intel_display *display)
> >> >                             encoder->base.base.id,
> >> >encoder->base.name);
> >> >
> >> >                 intel_cx0pll_enable(encoder, &pll_state);
> >> >+                intel_cx0pll_enable_clock(encoder);
> >> >                 intel_cx0pll_disable(encoder);
> >> >+                intel_cx0pll_disable_clock(encoder);
> >> >         }
> >> > }
> >> >diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >> >b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >> >index 9aa84a430f09..59395076103c 100644
> >> >--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >> >+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >> >@@ -186,11 +186,13 @@ void assert_dpll(struct intel_display *display,
> >> >                      "asserting DPLL %s with no DPLL\n", str_on_off(state)))
> >> >                 return;
> >> >
> >> >-        cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
> >> >-        INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
> >> >-                                 "%s assertion failure (expected %s, current %s)\n",
> >> >-                                 pll->info->name, str_on_off(state),
> >> >-                                 str_on_off(cur_state));
> >> >+        if (DISPLAY_VER(display) < 14) {
> >> >+                cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
> >> >+                INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
> >> >+                                         "%s assertion failure (expected %s, current
> %s)\n",
> >> >+                                         pll->info->name, str_on_off(state),
> >> >+                                         str_on_off(cur_state));
> >> >+        }
> >> > }
> >> >
> >> > static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id)
> >> >--
> >> >2.34.1
> >> >

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit
  2026-01-05 15:14       ` Gustavo Sousa
@ 2026-01-06  6:21         ` Kandpal, Suraj
  0 siblings, 0 replies; 21+ messages in thread
From: Kandpal, Suraj @ 2026-01-06  6:21 UTC (permalink / raw)
  To: Sousa, Gustavo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K, Kahola, Mika, Nikula, Jani

> Subject: RE: [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit
> 
> Quoting Kandpal, Suraj (2025-12-31 01:59:29-03:00)
> >> Subject: Re: [PATCH 3/3] drm/i915/cx0: Clear response ready & error
> >> bit
> >>
> >> Quoting Suraj Kandpal (2025-12-30 05:31:42-03:00)
> >> >Clear the response ready and error bit of
> >> >PORT_P2M_MESSAGE_BUS_STATUS before writing the transaction
> pending
> >> >bit of PORT_M2P_MSGBUS_CTL as that is a hard requirement. If not
> >> >done we find that the PHY hangs since it ends up in a weird state if left
> idle for more than 1 hour.
> >>
> >> Since the series title refers to suspend/resume, is there an easy way
> >> of reproducing this via some power state transition?
> >
> >Sadly no we did try to no avail went as low as DC9 too. Tried sleep
> >then wake, Tried hibernating too.
> 
> I see.  I was wondering if DMC could be at play here.
> 
> So the only known way of reproducing this is to leave it idle for more than 1
> hour?  Do you know if that happens if we load the driver with
> DC5/6 disabled (i.e. enable_dc=0)?
> 
> >
> >>
> >> I'm wondering if we are looking at a driver issue here or if this is
> >> really something else.  I see that we usually call
> >> intel_cx0_bus_reset() in error paths, which contains a call to
> >> intel_clear_response_ready_flag(), but it could end up being not called if
> the reset times out.
> >
> >Yes the reset times out and this is because PHY is in hanged state here
> >
> >>
> >> Do we see error messages from the driver when the PHY hangs?
> >
> >Yes we do see a PHY hang when we are at the stage of swing programming
> >setting And the error happens when we try to read the msg access bit
> >itself which is because the PHY ends up in Weird state where it has a write
> ack but no response ready bit getting set.
> >But with my observation I can certainly say this is PHY issue.
> >I also double confirmed this behavior with windows folks and their code
> where they said they saw an issue in the same lines.
> >Also the bspec basically adds this as a disclaimer that response ready
> >and error bit should be cleared no matter what before writing The
> transaction pending bit.
> 
> Agreed on the need to clear the response ready bit before starting another
> transaction, so the patch looks fine.  I believe Jani's request to rename the
> function wouldn't necessarily change the semantics of this patch, so
> 
> Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
> 
> in case the rename gets done as a follow-up.
> 

Thanks will separate out this patch from the series since the first patch seems to need a little more discussion 

Regards,
Suraj Kandpal

> >
> >Regards,
> >Suraj Kandpal
> >
> >>
> >> --
> >> Gustavo Sousa
> >>
> >> >
> >> >Bspec: 65101
> >> >Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> >> >---
> >> > drivers/gpu/drm/i915/display/intel_cx0_phy.c | 4 ++++
> >> > 1 file changed, 4 insertions(+)
> >> >
> >> >diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >index 5edd293b533b..5ebc3404eee2 100644
> >> >--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >@@ -222,6 +222,8 @@ static int __intel_cx0_read_once(struct
> >> >intel_encoder
> >> *encoder,
> >> >                 return -ETIMEDOUT;
> >> >         }
> >> >
> >> >+        intel_clear_response_ready_flag(encoder, lane);
> >> >+
> >> >         intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display,
> >> > port,
> >> lane),
> >> >                        XELPDP_PORT_M2P_TRANSACTION_PENDING |
> >> >                        XELPDP_PORT_M2P_COMMAND_READ | @@ -293,6
> >> >+295,8 @@ static int __intel_cx0_write_once(struct intel_encoder
> *encoder,
> >> >                 return -ETIMEDOUT;
> >> >         }
> >> >
> >> >+        intel_clear_response_ready_flag(encoder, lane);
> >> >+
> >> >         intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display,
> >> > port,
> >> lane),
> >> >                        XELPDP_PORT_M2P_TRANSACTION_PENDING |
> >> >                        (committed ?
> >> XELPDP_PORT_M2P_COMMAND_WRITE_COMMITTED :
> >> >--
> >> >2.34.1
> >> >

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts
  2025-12-30  8:31 ` [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts Suraj Kandpal
  2025-12-30 15:20   ` Gustavo Sousa
  2025-12-30 21:23   ` kernel test robot
@ 2026-01-07 15:22   ` Michał Grzelak
  2 siblings, 0 replies; 21+ messages in thread
From: Michał Grzelak @ 2026-01-07 15:22 UTC (permalink / raw)
  To: Suraj Kandpal; +Cc: intel-xe, intel-gfx, ankit.k.nautiyal, mika.kahola

[-- Attachment #1: Type: text/plain, Size: 9599 bytes --]

Hi Suraj,

On Tue, 30 Dec 2025, Suraj Kandpal wrote:
> From: Mika Kahola <mika.kahola@intel.com>
>
> Split PLL enabling/disabling in two parts - one for pll setting
> pll dividers and second one to enable/disable pll clock. PLL
> clock enabling/disbling happens via encoder->enable_clock/disable_clock
> function hook. The reason for doing this is that we need to make sure
> the clock enablement happens after PPS ON step to be inline with the
> sequences which we end up violating otherwise. As a result of this
> violation we end up in a hanged state if machine stays idle for more
> that 15 mins.
>
> PLL state verification happens now earlier than the clock is enabled
> which causes a drm warn to be thrown. Silence this warning by
> allowing this check for only earlier platforms than MeteorLake.
>
> Bspec: 49190
> Signed-off-by: Mika Kahola <mika.kahola@intel.com>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_cx0_phy.c  | 87 ++++++++++++-------
> drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 12 +--
> 2 files changed, 64 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> index 7288065d2461..f3baba264e88 100644
> --- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> +++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> @@ -3225,11 +3225,8 @@ static void intel_cx0pll_enable(struct intel_encoder *encoder,
> {
> 	int port_clock = pll_state->use_c10 ? pll_state->c10.clock : pll_state->c20.clock;
> 	struct intel_display *display = to_intel_display(encoder);
> -	enum phy phy = intel_encoder_to_phy(encoder);
> 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
> 	bool lane_reversal = dig_port->lane_reversal;
> -	u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
> -					  INTEL_CX0_LANE0;
> 	struct ref_tracker *wakeref = intel_cx0_phy_transaction_begin(encoder);
>
> 	/*
> @@ -3284,27 +3281,6 @@ static void intel_cx0pll_enable(struct intel_encoder *encoder,
> 	 */
> 	intel_de_write(display, DDI_CLK_VALFREQ(encoder->port), port_clock);
>
> -	/*
> -	 * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
> -	 * LN<Lane for maxPCLK> to "1" to enable PLL.
> -	 */
> -	intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
> -		     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
> -		     intel_cx0_get_pclk_pll_request(maxpclk_lane));
> -
> -	/* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK> == "1". */
> -	if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
> -			     intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
> -			     intel_cx0_get_pclk_pll_ack(maxpclk_lane),
> -			     XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
> -		drm_warn(display->drm, "Port %c PLL not locked\n",
> -			 phy_name(phy));
> -
> -	/*
> -	 * 11. Follow the Display Voltage Frequency Switching Sequence After
> -	 * Frequency Change. We handle this step in bxt_set_cdclk().
> -	 */
> -
> 	/*
> 	 * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
> 	 *
> @@ -3403,6 +3379,42 @@ static int intel_mtl_tbt_clock_select(struct intel_display *display,
> 	}
> }
>
> +static void intel_cx0pll_enable_clock(struct intel_encoder *encoder)
> +{
> +	struct intel_display *display = to_intel_display(encoder);
> +	enum phy phy = intel_encoder_to_phy(encoder);
> +	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
> +	bool lane_reversal = dig_port->lane_reversal;
> +					  INTEL_CX0_LANE0;

Line above breaks the build. My current understanding is that it causes
compiler to expand INTEL_CX0_LANE0 into BIT(0), which expands into 1UL
<< 0. Finally, compiler parses it more or less as:

1;

Since it is a valid statement but doesn't do anything, it triggers
unused value warning, which is turned into error.

IOW, with the line removed build works.

The explanation seems consistent with the output:

In file included from ./include/linux/bits.h:5,
                  from ./include/linux/bitops.h:6,
                  from ./include/linux/log2.h:12,
                  from drivers/gpu/drm/i915/display/intel_cx0_phy.c:6:
drivers/gpu/drm/i915/display/intel_cx0_phy.c: In function ‘intel_cx0pll_enable_clock’:
./include/vdso/bits.h:7:33: error: statement with no effect [-Werror=unused-value]
     7 | #define BIT(nr)                 (UL(1) << (nr))
       |                                 ^
drivers/gpu/drm/i915/display/intel_cx0_phy.c:32:33: note: in expansion of macro ‘BIT’
    32 | #define INTEL_CX0_LANE0         BIT(0)
       |                                 ^~~
drivers/gpu/drm/i915/display/intel_cx0_phy.c:3378:43: note: in expansion of macro ‘INTEL_CX0_LANE0’
  3378 |                                           INTEL_CX0_LANE0;
       |                                           ^~~~~~~~~~~~~~~
cc1: all warnings being treated as errors

Besides of this, for the whole series:
Reviewed-by: Michał Grzelak <michal.grzelak@intel.com>

BR,
Michał

> +	u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
> +					INTEL_CX0_LANE0;
> +
> +	struct ref_tracker *wakeref = intel_cx0_phy_transaction_begin(encoder);
> +
> +	/*
> +	 * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
> +	 * LN<Lane for maxPCLK> to "1" to enable PLL.
> +	 */
> +	intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
> +		     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
> +		     intel_cx0_get_pclk_pll_request(maxpclk_lane));
> +
> +	/* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK> == "1". */
> +	if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
> +			     intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
> +			     intel_cx0_get_pclk_pll_ack(maxpclk_lane),
> +			     XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
> +		drm_warn(display->drm, "Port %c PLL not locked\n",
> +			 phy_name(phy));
> +
> +	/*
> +	 * 11. Follow the Display Voltage Frequency Switching Sequence After
> +	 * Frequency Change. We handle this step in bxt_set_cdclk().
> +	 */
> +
> +	intel_cx0_phy_transaction_end(encoder, wakeref);
> +}
> +
> void intel_mtl_tbt_pll_enable_clock(struct intel_encoder *encoder, int port_clock)
> {
> 	struct intel_display *display = to_intel_display(encoder);
> @@ -3472,6 +3484,8 @@ void intel_mtl_pll_enable_clock(struct intel_encoder *encoder,
>
> 	if (intel_tc_port_in_tbt_alt_mode(dig_port))
> 		intel_mtl_tbt_pll_enable_clock(encoder, crtc_state->port_clock);
> +	else
> +		intel_cx0pll_enable_clock(encoder);
> }
>
> /*
> @@ -3567,12 +3581,6 @@ static void intel_cx0pll_disable(struct intel_encoder *encoder)
> 	 * Frequency Change. We handle this step in bxt_set_cdclk().
> 	 */
>
> -	/* 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(display), 0);
> -	intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
> -		     XELPDP_FORWARD_CLOCK_UNGATE, 0);
> -
> 	intel_cx0_phy_transaction_end(encoder, wakeref);
> }
>
> @@ -3586,6 +3594,20 @@ static bool intel_cx0_pll_is_enabled(struct intel_encoder *encoder)
> 			     intel_cx0_get_pclk_pll_request(lane);
> }
>
> +static void intel_cx0pll_disable_clock(struct intel_encoder *encoder)
> +{
> +	struct intel_display *display = to_intel_display(encoder);
> +	struct ref_tracker *wakeref = intel_cx0_phy_transaction_begin(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(display), 0);
> +	intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port),
> +		     XELPDP_FORWARD_CLOCK_UNGATE, 0);
> +
> +	intel_cx0_phy_transaction_end(encoder, wakeref);
> +}
> +
> void intel_mtl_tbt_pll_disable_clock(struct intel_encoder *encoder)
> {
> 	struct intel_display *display = to_intel_display(encoder);
> @@ -3635,6 +3657,9 @@ void intel_mtl_pll_disable_clock(struct intel_encoder *encoder)
>
> 	if (intel_tc_port_in_tbt_alt_mode(dig_port))
> 		intel_mtl_tbt_pll_disable_clock(encoder);
> +	else
> +		intel_cx0pll_disable_clock(encoder);
> +
> }
>
> enum icl_port_dpll_id
> @@ -3783,6 +3808,8 @@ void intel_cx0_pll_power_save_wa(struct intel_display *display)
> 			    encoder->base.base.id, encoder->base.name);
>
> 		intel_cx0pll_enable(encoder, &pll_state);
> +		intel_cx0pll_enable_clock(encoder);
> 		intel_cx0pll_disable(encoder);
> +		intel_cx0pll_disable_clock(encoder);
> 	}
> }
> diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> index 9aa84a430f09..59395076103c 100644
> --- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> +++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> @@ -186,11 +186,13 @@ void assert_dpll(struct intel_display *display,
> 		     "asserting DPLL %s with no DPLL\n", str_on_off(state)))
> 		return;
>
> -	cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
> -	INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
> -				 "%s assertion failure (expected %s, current %s)\n",
> -				 pll->info->name, str_on_off(state),
> -				 str_on_off(cur_state));
> +	if (DISPLAY_VER(display) < 14) {
> +		cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
> +		INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
> +					 "%s assertion failure (expected %s, current %s)\n",
> +					 pll->info->name, str_on_off(state),
> +					 str_on_off(cur_state));
> +	}
> }
>
> static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id)
> -- 
> 2.34.1
>
>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts
  2026-01-05 14:13       ` Gustavo Sousa
  2026-01-06  6:19         ` Kandpal, Suraj
@ 2026-01-08  8:51         ` Kahola, Mika
  1 sibling, 0 replies; 21+ messages in thread
From: Kahola, Mika @ 2026-01-08  8:51 UTC (permalink / raw)
  To: Sousa, Gustavo, Kandpal, Suraj, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K



> -----Original Message-----
> From: Sousa, Gustavo <gustavo.sousa@intel.com>
> Sent: Monday, 5 January 2026 16.14
> To: Kandpal, Suraj <suraj.kandpal@intel.com>; intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kahola, Mika <mika.kahola@intel.com>
> Subject: RE: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts
> 
> Quoting Kandpal, Suraj (2025-12-31 02:07:35-03:00)
> >> Subject: Re: [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling
> >> in two parts
> >>
> >> Quoting Suraj Kandpal (2025-12-30 05:31:40-03:00)
> >> >From: Mika Kahola <mika.kahola@intel.com>
> >> >
> >> >Split PLL enabling/disabling in two parts - one for pll setting pll
> >> >dividers and second one to enable/disable pll clock. PLL clock
> >> >enabling/disbling happens via encoder->enable_clock/disable_clock
> >> >function hook. The reason for doing this is that we need to make
> >> >sure the clock enablement happens after PPS ON step to be inline
> >> >with the sequences which we end up violating otherwise. As a result
> >> >of this violation we end up in a hanged state if machine stays idle
> >> >for more that 15 mins.
> >>
> >> So, it appears this started happening when we Cx0 code was integrated
> >> into the DPLL framework and then the driver started enabling the PHY
> >> PLL/clock too early, right?
> >>
> >> I am lacking some context/background here due to my unfamiliarity
> >> with pre- MTL platforms, but why I exactly do we program the PLLs
> >> before the modeset sequence?  Is it related to the shared nature of
> >> PLLs for platforms pre- C10/pre-C20?  If so, do we really need to do
> >> the same for
> >> C10/C20 PHYs, since we have dedicated PLLs for them?
> >>
> >> (Sorry for asking here and a bit too late.  Probably the better place
> >> to ask this was in series that integrated Cx0 into the DPLL
> >> framework.)
> >
> >
> >Right it used to be actually because of the shared nature of PLL's.
> >With c10 c20 we moved to a different framework where we called the the
> >sequence together using hooks like enable_clock and disable_clock since
> >there was not a lot of time of time to refactor the dpll_shared_framework to a framework with supported individual ones.
> >Now that we had time we shifted cx0 back to the previous framework but
> >missed defer the clock enablement
> 
> Then, if we move forward with this, perhaps this patch deserves a "Fixes:" trailer.
> 
> >To later during enable clock time so that we honor the sequence, why we
> >had to do this is even though its not shared PLL anymore is To make sure this framework is backward compatible too.
> 
> I see.
> 
> If the requirement for programming PLL parameters early was only because of shared PLLs and we do not have that same
> requirements for C10/C20, I would argue that doing the whole programming at once and only during the "enable clock" phase of
> the encoder would make the driver more compliant with the Bspec.

Programming PLL parameters for C10/C20 as part of pll framework with .enable function hook seemed to work ok until we bumped into this ArrowLake case where system suspend resume after an hour of idling would cause C10/C20 chips to get stuck and hence unable to resume correctly. This behaviour hasn't been seen with other platforms. Tests with this platform showed that we would need to delay a bit the clock enabling. This patch proposed to split the sequence for C10/C20 in two parts. First part for PLL programming and second part to enable the clock. Like you mentioned we could also do all PLL programming and clock enabling in one go with .enable_clock function hook. 

> 
> I also noticed that, for the older displays, the "enable clock" thing is the part that selects the PLL (which is already enabled) as the
> port's "clock source".  With C10/C20 we are actually deferring the PLL enabling to the "enable clock" phase of the port while, I
> believe, the expectation of intel_dpll_funcs::enable() is that the PLL would be enabled when the function returned, which would
> not be exactly true for
> C10/C20 after this patch.
> 
> What if, in intel_dpll_mgr, we made the distinction between enabling the PLL early and enabling it at "intel_ddi_enable_clock()"
> time?

By this you mean, all PLL programming is done in intel_ddi_enable_clock() function leaving .enable() function hook in intel_dpll_mgr empty?

> 
> --
> Gustavo Sousa
> 
> >Also we had to move cx0 pll framework back to dpll framework because
> >the previous can work well as long as the ports are static hence aren’t As future proof , we plan to move LT PHY back here too
> once this ages well.
> >
> >>
> >> >
> >> >PLL state verification happens now earlier than the clock is enabled
> >> >which causes a drm warn to be thrown. Silence this warning by
> >> >allowing this check for only earlier platforms than MeteorLake.
> >> >
> >> >Bspec: 49190
> >>
> >> This Bspec page is not invalid for platforms using C10/C20 PHYs.
> >>
> >> We probably want to use these instead:
> >>
> >> Bspec: 65448, 68849
> >>
> >
> >Sure will replace them.
> >
> >Regards,
> >Suraj Kandpal
> >
> >> --
> >> Gustavo Sousa
> >>
> >> >Signed-off-by: Mika Kahola <mika.kahola@intel.com>
> >> >Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> >> >---
> >> > drivers/gpu/drm/i915/display/intel_cx0_phy.c  | 87
> >> >++++++++++++------- drivers/gpu/drm/i915/display/intel_dpll_mgr.c |
> >> >12 +--
> >> > 2 files changed, 64 insertions(+), 35 deletions(-)
> >> >
> >> >diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >index 7288065d2461..f3baba264e88 100644
> >> >--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
> >> >@@ -3225,11 +3225,8 @@ static void intel_cx0pll_enable(struct
> >> >intel_encoder *encoder,  {
> >> >         int port_clock = pll_state->use_c10 ? pll_state->c10.clock
> >> >: pll_state- c20.clock;
> >> >         struct intel_display *display = to_intel_display(encoder);
> >> >-        enum phy phy = intel_encoder_to_phy(encoder);
> >> >         struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
> >> >         bool lane_reversal = dig_port->lane_reversal;
> >> >-        u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
> >> >-                                          INTEL_CX0_LANE0;
> >> >         struct ref_tracker *wakeref =
> >> >intel_cx0_phy_transaction_begin(encoder);
> >> >
> >> >         /*
> >> >@@ -3284,27 +3281,6 @@ static void intel_cx0pll_enable(struct
> >> intel_encoder *encoder,
> >> >          */
> >> >         intel_de_write(display, DDI_CLK_VALFREQ(encoder->port),
> >> >port_clock);
> >> >
> >> >-        /*
> >> >-         * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
> >> >-         * LN<Lane for maxPCLK> to "1" to enable PLL.
> >> >-         */
> >> >-        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
> >> >port),
> >> >-                     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
> >> >-                     intel_cx0_get_pclk_pll_request(maxpclk_lane));
> >> >-
> >> >-        /* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK>
> >> == "1". */
> >> >-        if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display,
> >> encoder->port),
> >> >-                             intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
> >> >-                             intel_cx0_get_pclk_pll_ack(maxpclk_lane),
> >> >-                             XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
> >> >-                drm_warn(display->drm, "Port %c PLL not locked\n",
> >> >-                         phy_name(phy));
> >> >-
> >> >-        /*
> >> >-         * 11. Follow the Display Voltage Frequency Switching Sequence After
> >> >-         * Frequency Change. We handle this step in bxt_set_cdclk().
> >> >-         */
> >> >-
> >> >         /*
> >> >          * 12. Toggle powerdown if HDMI is enabled on C10 PHY.
> >> >          *
> >> >@@ -3403,6 +3379,42 @@ static int intel_mtl_tbt_clock_select(struct
> >> intel_display *display,
> >> >         }
> >> > }
> >> >
> >> >+static void intel_cx0pll_enable_clock(struct intel_encoder *encoder) {
> >> >+        struct intel_display *display = to_intel_display(encoder);
> >> >+        enum phy phy = intel_encoder_to_phy(encoder);
> >> >+        struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
> >> >+        bool lane_reversal = dig_port->lane_reversal;
> >> >+                                          INTEL_CX0_LANE0;
> >> >+        u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
> >> >+                                        INTEL_CX0_LANE0;
> >> >+
> >> >+        struct ref_tracker *wakeref =
> >> >+ intel_cx0_phy_transaction_begin(encoder);
> >> >+
> >> >+        /*
> >> >+         * 9. Set PORT_CLOCK_CTL register PCLK PLL Request
> >> >+         * LN<Lane for maxPCLK> to "1" to enable PLL.
> >> >+         */
> >> >+        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display,
> >> >+ encoder-
> >> >port),
> >> >+                     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
> >> >+                     intel_cx0_get_pclk_pll_request(maxpclk_lane));
> >> >+
> >> >+        /* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for
> >> >+ maxPCLK>
> >> == "1". */
> >> >+        if (intel_de_wait_us(display,
> >> >+ XELPDP_PORT_CLOCK_CTL(display,
> >> encoder->port),
> >> >+                             intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
> >> >+                             intel_cx0_get_pclk_pll_ack(maxpclk_lane),
> >> >+                             XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL))
> >> >+                drm_warn(display->drm, "Port %c PLL not locked\n",
> >> >+                         phy_name(phy));
> >> >+
> >> >+        /*
> >> >+         * 11. Follow the Display Voltage Frequency Switching Sequence After
> >> >+         * Frequency Change. We handle this step in bxt_set_cdclk().
> >> >+         */
> >> >+
> >> >+        intel_cx0_phy_transaction_end(encoder, wakeref); }
> >> >+
> >> > void intel_mtl_tbt_pll_enable_clock(struct intel_encoder *encoder,
> >> >int
> >> >port_clock)  {
> >> >         struct intel_display *display = to_intel_display(encoder);
> >> >@@
> >> >-3472,6 +3484,8 @@ void intel_mtl_pll_enable_clock(struct
> >> >intel_encoder *encoder,
> >> >
> >> >         if (intel_tc_port_in_tbt_alt_mode(dig_port))
> >> >                 intel_mtl_tbt_pll_enable_clock(encoder,
> >> > crtc_state->port_clock);
> >> >+        else
> >> >+                intel_cx0pll_enable_clock(encoder);
> >> > }
> >> >
> >> > /*
> >> >@@ -3567,12 +3581,6 @@ static void intel_cx0pll_disable(struct
> >> intel_encoder *encoder)
> >> >          * Frequency Change. We handle this step in bxt_set_cdclk().
> >> >          */
> >> >
> >> >-        /* 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(display), 0);
> >> >-        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, encoder-
> >> >port),
> >> >-                     XELPDP_FORWARD_CLOCK_UNGATE, 0);
> >> >-
> >> >         intel_cx0_phy_transaction_end(encoder, wakeref);  }
> >> >
> >> >@@ -3586,6 +3594,20 @@ static bool intel_cx0_pll_is_enabled(struct
> >> intel_encoder *encoder)
> >> >                              intel_cx0_get_pclk_pll_request(lane);
> >> > }
> >> >
> >> >+static void intel_cx0pll_disable_clock(struct intel_encoder
> >> >+*encoder) {
> >> >+        struct intel_display *display = to_intel_display(encoder);
> >> >+        struct ref_tracker *wakeref =
> >> >+intel_cx0_phy_transaction_begin(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(display), 0);
> >> >+        intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display,
> >> >+ encoder-
> >> >port),
> >> >+                     XELPDP_FORWARD_CLOCK_UNGATE, 0);
> >> >+
> >> >+        intel_cx0_phy_transaction_end(encoder, wakeref); }
> >> >+
> >> > void intel_mtl_tbt_pll_disable_clock(struct intel_encoder *encoder)  {
> >> >         struct intel_display *display = to_intel_display(encoder);
> >> >@@
> >> >-3635,6 +3657,9 @@ void intel_mtl_pll_disable_clock(struct
> >> >intel_encoder *encoder)
> >> >
> >> >         if (intel_tc_port_in_tbt_alt_mode(dig_port))
> >> >                 intel_mtl_tbt_pll_disable_clock(encoder);
> >> >+        else
> >> >+                intel_cx0pll_disable_clock(encoder);
> >> >+
> >> > }
> >> >
> >> > enum icl_port_dpll_id
> >> >@@ -3783,6 +3808,8 @@ void intel_cx0_pll_power_save_wa(struct
> >> intel_display *display)
> >> >                             encoder->base.base.id,
> >> >encoder->base.name);
> >> >
> >> >                 intel_cx0pll_enable(encoder, &pll_state);
> >> >+                intel_cx0pll_enable_clock(encoder);
> >> >                 intel_cx0pll_disable(encoder);
> >> >+                intel_cx0pll_disable_clock(encoder);
> >> >         }
> >> > }
> >> >diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >> >b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >> >index 9aa84a430f09..59395076103c 100644
> >> >--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >> >+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
> >> >@@ -186,11 +186,13 @@ void assert_dpll(struct intel_display *display,
> >> >                      "asserting DPLL %s with no DPLL\n", str_on_off(state)))
> >> >                 return;
> >> >
> >> >-        cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
> >> >-        INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
> >> >-                                 "%s assertion failure (expected %s, current %s)\n",
> >> >-                                 pll->info->name, str_on_off(state),
> >> >-                                 str_on_off(cur_state));
> >> >+        if (DISPLAY_VER(display) < 14) {
> >> >+                cur_state = intel_dpll_get_hw_state(display, pll, &hw_state);
> >> >+                INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
> >> >+                                         "%s assertion failure (expected %s, current %s)\n",
> >> >+                                         pll->info->name, str_on_off(state),
> >> >+                                         str_on_off(cur_state));
> >> >+        }
> >> > }
> >> >
> >> > static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id)
> >> >--
> >> >2.34.1
> >> >

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2026-01-08  8:51 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-30  8:31 [PATCH 0/3] Fix Cx0 Suspend Resume issue Suraj Kandpal
2025-12-30  8:31 ` [PATCH 1/3] drm/i915/cx0: Split PLL enabling/disabling in two parts Suraj Kandpal
2025-12-30 15:20   ` Gustavo Sousa
2025-12-31  5:07     ` Kandpal, Suraj
2026-01-05 14:13       ` Gustavo Sousa
2026-01-06  6:19         ` Kandpal, Suraj
2026-01-08  8:51         ` Kahola, Mika
2025-12-30 21:23   ` kernel test robot
2026-01-07 15:22   ` Michał Grzelak
2025-12-30  8:31 ` [PATCH 2/3] drm/i915/cx0: Move step 12 to enable clock hook Suraj Kandpal
2025-12-30 15:22   ` Gustavo Sousa
2025-12-31  5:10     ` Kandpal, Suraj
2026-01-05 14:37       ` Gustavo Sousa
2026-01-06  6:18         ` Kandpal, Suraj
2025-12-30  8:31 ` [PATCH 3/3] drm/i915/cx0: Clear response ready & error bit Suraj Kandpal
2025-12-30 15:29   ` Jani Nikula
2025-12-30 17:36   ` Gustavo Sousa
2025-12-31  4:59     ` Kandpal, Suraj
2026-01-05 15:14       ` Gustavo Sousa
2026-01-06  6:21         ` Kandpal, Suraj
2025-12-30  8:38 ` ✓ CI.KUnit: success for Fix Cx0 Suspend Resume issue Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox