Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit
@ 2026-10-22  3:22 Suraj Kandpal
  2026-10-22  3:22 ` [PATCH v7 01/13] drm/i915/display: Add helper to compute link M/N ratio for reuse Suraj Kandpal
                   ` (15 more replies)
  0 siblings, 16 replies; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: mitulkumar.ajitkumar.golani, Suraj Kandpal

For Platforms that support higher link rates, there is a limitation on
Link M /Link N ratio.
If the CEILING( Link M / Link N ) ratio is greater than 10.0, then
hardware cannot support the given resolution / refresh rate at the given
configuration.
For BMG Wa_14021768792 helps to bypass this limitation and allows it to
support the ratio till 15.0.

This series adds the missing restrictions for earlier platforms and adds
the Wa_14021768792 for BMG as per Bspec:49266

Ankit Nautiyal (8):
  drm/i915/display: Add helper to compute link M/N ratio for reuse
  drm/i915/dp_mst: Limit M/N ratio for MST
  drm/i915/dp: Add M/N ratio check for DP link config
  drm/i915/display: Add bits for link_n_extended for DISPLAY >= 14
  drm/i915/display_wa: Add support for Wa_14021768792
  drm/i915/display: Add bits for Wa_14021768792 for linkm/n ratio > 10
  drm/i915/display: Implement Wa_14021768792 for BMG DP for link_m/n
    ratio > 10
  drm/i915/dp: Extend intel_dp_can_support_m_n() for BMG M/N bypass

Suraj Kandpal (5):
  drm/i915/dp: Limit M/N ratio for DP
  drm/i915/display_wa: Add support for Wa_14014191401
  drm/i915/display: Compare bypass_m_n_ratio_limit in the state checker
  drm/i915/display: Dump bypass_m_n_ratio_limit in the crtc state dump
  drm/i915/dp: Bump the max Link M/N ratio to 22 for DISPLAY_VER >= 35

 .../drm/i915/display/intel_crtc_state_dump.c  |   6 +-
 drivers/gpu/drm/i915/display/intel_display.c  | 113 +++++++++++-
 drivers/gpu/drm/i915/display/intel_display.h  |   4 +
 .../gpu/drm/i915/display/intel_display_regs.h |  12 ++
 .../drm/i915/display/intel_display_types.h    |   2 +
 .../gpu/drm/i915/display/intel_display_wa.c   |  11 ++
 .../gpu/drm/i915/display/intel_display_wa.h   |   2 +
 drivers/gpu/drm/i915/display/intel_dp.c       | 167 +++++++++++++++++-
 drivers/gpu/drm/i915/display/intel_dp.h       |   6 +
 drivers/gpu/drm/i915/display/intel_dp_mst.c   |   7 +
 10 files changed, 321 insertions(+), 9 deletions(-)

-- 
2.34.1


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

* [PATCH v7 01/13] drm/i915/display: Add helper to compute link M/N ratio for reuse
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22  3:22 ` [PATCH v7 02/13] drm/i915/dp: Limit M/N ratio for DP Suraj Kandpal
                   ` (14 subsequent siblings)
  15 siblings, 0 replies; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe
  Cc: mitulkumar.ajitkumar.golani, Ankit Nautiyal, Suraj Kandpal

From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Introduce intel_display_compute_link_m_n() to compute the link M/N ratio
from the pixel clock and the link symbol clock. This logic was
previously embedded within intel_link_compute_m_n().
The new helper allows reuse of link M/N computation in other contexts
without requiring the full data M/N calculation and will be used in
later commits.

No functional changes intended.

v2:
- Rename function (Jani)
- The link symbol clock is passed in rather than derived here, so that the
DP specific conversion from the link rate stays with the caller. (Jani)

Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 7602f633f49d..580c36a52921 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -2650,13 +2650,20 @@ static void compute_m_n(u32 *ret_m, u32 *ret_n,
 	intel_reduce_m_n_ratio(ret_m, ret_n);
 }
 
+static void intel_display_compute_link_m_n(u32 *link_m, u32 *link_n,
+					   int pixel_clock, int link_symbol_clock)
+{
+	compute_m_n(link_m, link_n,
+		    pixel_clock, link_symbol_clock,
+		    0x80000);
+}
+
 void
 intel_link_compute_m_n(u16 bits_per_pixel_x16, int nlanes,
 		       int pixel_clock, int link_clock,
 		       int bw_overhead,
 		       struct intel_link_m_n *m_n)
 {
-	u32 link_symbol_clock = intel_dp_link_symbol_clock(link_clock);
 	u32 data_m = intel_dp_effective_data_rate(pixel_clock, bits_per_pixel_x16,
 						  bw_overhead);
 	u32 data_n = drm_dp_max_dprx_data_rate(link_clock, nlanes);
@@ -2673,9 +2680,9 @@ intel_link_compute_m_n(u16 bits_per_pixel_x16, int nlanes,
 		    data_m, data_n,
 		    0x8000000);
 
-	compute_m_n(&m_n->link_m, &m_n->link_n,
-		    pixel_clock, link_symbol_clock,
-		    0x80000);
+	intel_display_compute_link_m_n(&m_n->link_m, &m_n->link_n,
+				       pixel_clock,
+				       intel_dp_link_symbol_clock(link_clock));
 }
 
 void intel_panel_sanitize_ssc(struct intel_display *display)
-- 
2.34.1


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

* [PATCH v7 02/13] drm/i915/dp: Limit M/N ratio for DP
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
  2026-10-22  3:22 ` [PATCH v7 01/13] drm/i915/display: Add helper to compute link M/N ratio for reuse Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22  3:34   ` sashiko-bot
  2026-10-22 16:29   ` Golani, Mitulkumar Ajitkumar
  2026-10-22  3:22 ` [PATCH v7 03/13] drm/i915/display_wa: Add support for Wa_14014191401 Suraj Kandpal
                   ` (13 subsequent siblings)
  15 siblings, 2 replies; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe
  Cc: mitulkumar.ajitkumar.golani, Suraj Kandpal, Ankit Nautiyal

The hardware cannot support DisplayPort configurations where the
ceiling of the Link M/Link N ratio exceeds the limit the transcoder's
timing generator DDA can track. This limitation has always existed, but
it typically wasn't encountered without the use of joiners and DSC.
With higher resolutions and combinations involving joiners and DSC,
this constraint can now be hit in certain scenarios.

Restrict the link configurations to those satisfying the constraint
while computing the link config limits, so that the SST and the MST
paths both get it, and so that a mode which no link rate can support
fails early rather than deep inside link config selection.

Also prune such modes in mode_valid. Note the ratio is the pixel clock
over the link symbol clock, and the symbol clock is not monotonic in the
link rate: it is the rate divided by 32 for 128b/132b but only by 10 for
8b/10b, so e.g. HBR3 has a higher symbol clock than UHBR20. There is
therefore no single best link rate to evaluate against, and mode_valid
walks the link configurations instead, only rejecting the mode if none
of them can satisfy the ratio.

For MSO, intel_dp_compute_config() divides adjusted_mode->crtc_clock by
the MSO link count before computing the link M/N. The limits and
mode_valid are evaluated before that, so divide the pixel clock by the
link count there as well, otherwise the check would be too strict by
that factor. The joiner needs no such handling, as
intel_joiner_adjust_timings() only rewrites the pipe mode and leaves the
adjusted mode the link M/N is derived from untouched.

Note: MST goes through intel_dp_compute_config_limits() as well, so its
compute config is already covered here. Only pruning the modes in the
MST mode_valid is left, which is added in a subsequent commit.

v2:
-Move the M/N ratio check to the link rate configuration phase instead
of during M/N computation. (Ville)
-Prune modes that cannot be supported even with highest link rate due to
M/N ratio restriction.
v3:
-Rebase on the link caps iterator based link config selection.
-Set the constraint up in intel_dp_compute_config_limits() by narrowing
the link config filter, and fail there if no config qualifies, instead
of skipping configs while iterating them. (Imre)
-Use a limit of 4 on DG2. (Wa_14014191401)
-Walk the link configurations in mode_valid rather than evaluating the
ratio at the highest link rate, which is not the best case for it.
v4:
-Add iterator for all dp configs in intel_dp_mode_valid_m_n() so
that we do not prune any mode that could have been supported (Sashiko)
v5:
-Drop "SST" from the subject and fix the note, MST compute is already
covered by the shared limits, only the MST mode_valid is left. (Mitul)
-Add the Bspec reference. (Mitul)
-Drop the link_n check, compute_m_n() fixes N at 0x80000 and only halves
it, so it cannot be 0. (Mitul)
-Fold in the MSO adjusted pixel clock from the M/N ratio check commit, so
this commit is correct on its own. (Mitul)
-Add intel_dp_link_m_n_ratio(), so that the M/N ratio check can share
it. (Mitul)

Bspec: 49266
Co-developed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c |   4 +-
 drivers/gpu/drm/i915/display/intel_display.h |   2 +
 drivers/gpu/drm/i915/display/intel_dp.c      | 114 +++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_dp.h      |   2 +
 4 files changed, 120 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 580c36a52921..f74e7ddf0e41 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -2650,8 +2650,8 @@ static void compute_m_n(u32 *ret_m, u32 *ret_n,
 	intel_reduce_m_n_ratio(ret_m, ret_n);
 }
 
-static void intel_display_compute_link_m_n(u32 *link_m, u32 *link_n,
-					   int pixel_clock, int link_symbol_clock)
+void intel_display_compute_link_m_n(u32 *link_m, u32 *link_n,
+				    int pixel_clock, int link_symbol_clock)
 {
 	compute_m_n(link_m, link_n,
 		    pixel_clock, link_symbol_clock,
diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
index eecafff167d3..404168f4213b 100644
--- a/drivers/gpu/drm/i915/display/intel_display.h
+++ b/drivers/gpu/drm/i915/display/intel_display.h
@@ -523,5 +523,7 @@ bool assert_port_valid(struct intel_display *display, enum port port);
 
 bool intel_scanout_needs_vtd_wa(struct intel_display *display);
 int intel_crtc_num_joined_pipes(const struct intel_crtc_state *crtc_state);
+void intel_display_compute_link_m_n(u32 *link_m, u32 *link_n,
+				    int pixel_clock, int link_symbol_clock);
 
 #endif
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index d8c0d9381471..7ceb7c02b597 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -63,6 +63,7 @@
 #include "intel_de.h"
 #include "intel_dip.h"
 #include "intel_dip_regs.h"
+#include "intel_display.h"
 #include "intel_display_driver.h"
 #include "intel_display_jiffies.h"
 #include "intel_display_utils.h"
@@ -1267,6 +1268,44 @@ bool intel_dp_has_dsc(const struct intel_connector *connector)
 	return true;
 }
 
+static int
+intel_dp_get_max_m_n_ratio(struct intel_display *display)
+{
+	if (display->platform.dg2)
+		return 4;
+
+	return 10;
+}
+
+static int intel_dp_link_m_n_ratio(u32 link_m, u32 link_n)
+{
+	return DIV_ROUND_UP(link_m, link_n);
+}
+
+static bool
+intel_dp_can_support_m_n(struct intel_display *display,
+			 int pixel_clock, int link_rate)
+{
+	int max_m_n_ratio = intel_dp_get_max_m_n_ratio(display);
+	u32 link_m, link_n;
+	int m_n_ratio;
+
+	intel_display_compute_link_m_n(&link_m, &link_n, pixel_clock,
+				       intel_dp_link_symbol_clock(link_rate));
+
+	m_n_ratio = intel_dp_link_m_n_ratio(link_m, link_n);
+
+	return m_n_ratio <= max_m_n_ratio;
+}
+
+static int intel_dp_mso_pixel_clock(struct intel_dp *intel_dp, int pixel_clock)
+{
+	if (!intel_dp->mso_link_count)
+		return pixel_clock;
+
+	return pixel_clock / intel_dp->mso_link_count;
+}
+
 static
 bool intel_dp_can_join(struct intel_dp *intel_dp,
 		       int num_joined_pipes)
@@ -1302,6 +1341,33 @@ bool intel_dp_dotclk_valid(struct intel_display *display,
 	return target_clock <= effective_dotclk_limit;
 }
 
+bool intel_dp_mode_valid_m_n(struct intel_dp *intel_dp, int pixel_clock)
+{
+	struct intel_display *display = to_intel_display(intel_dp);
+	int m_n_pixel_clock = intel_dp_mso_pixel_clock(intel_dp, pixel_clock);
+	struct intel_dp_link_caps_order order = {
+		.key = INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE,
+		.dir = INTEL_DP_LINK_CAPS_ORDER_DIR_DESC,
+	};
+	struct intel_dp_link_config link_config;
+	struct intel_dp_link_caps_iter iter;
+	bool found = false;
+
+	intel_dp_link_caps_iter_start(&iter, intel_dp->link.caps, order,
+				      INTEL_DP_LINK_CAPS_FILTER_ALL);
+	for_each_dp_link_config(&iter, &link_config) {
+		if (intel_dp_can_support_m_n(display, m_n_pixel_clock,
+					     link_config.rate)) {
+			found = true;
+
+			break;
+		}
+	}
+	intel_dp_link_caps_iter_end(&iter);
+
+	return found;
+}
+
 static enum drm_mode_status
 intel_dp_mode_valid_format(struct intel_connector *connector,
 			   const struct drm_display_mode *mode,
@@ -1456,6 +1522,9 @@ intel_dp_mode_valid(struct drm_connector *_connector,
 			return status;
 	}
 
+	if (!intel_dp_mode_valid_m_n(intel_dp, target_clock))
+		return MODE_CLOCK_HIGH;
+
 	/*
 	 * TODO: Even when using a 4:2:0 sink_format intel_dp_output_format()
 	 * will always choose a 4:4:4 output_format if the DFP can do the
@@ -2656,6 +2725,48 @@ intel_dp_dsc_compute_pipe_bpp_limits(struct intel_connector *connector,
 	return true;
 }
 
+static bool
+intel_dp_compute_m_n_ratio_limits(struct intel_dp *intel_dp,
+				  struct drm_connector_state *conn_state,
+				  const struct intel_crtc_state *crtc_state,
+				  struct link_config_limits *limits)
+{
+	struct intel_display *display = to_intel_display(intel_dp);
+	struct intel_connector *connector = to_intel_connector(conn_state->connector);
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+	struct intel_dp_link_caps_order order =
+		intel_dp_link_caps_connector_compute_order(connector);
+	struct intel_dp_link_caps_filter new_filter = INTEL_DP_LINK_CAPS_FILTER_NONE;
+	int pixel_clock = intel_dp_mso_pixel_clock(intel_dp,
+						  intel_dp_mode_clock(crtc_state, conn_state));
+	struct intel_dp_link_config link_config;
+	struct intel_dp_link_caps_iter iter;
+	bool found = false;
+
+	intel_dp_link_caps_iter_start(&iter, link_caps, order, limits->link_config_filter);
+	for_each_dp_link_config(&iter, &link_config) {
+		if (!intel_dp_can_support_m_n(display, pixel_clock, link_config.rate))
+			continue;
+
+		intel_dp_link_caps_filter_add(link_caps, &new_filter, &link_config);
+		found = true;
+	}
+	intel_dp_link_caps_iter_end(&iter);
+
+	if (!found) {
+		drm_dbg_kms(display->drm,
+			    "[CONNECTOR:%d:%s] No link config with a Link M/N ratio <= %d\n",
+			    connector->base.base.id, connector->base.name,
+			    intel_dp_get_max_m_n_ratio(display));
+
+		return false;
+	}
+
+	limits->link_config_filter = new_filter;
+
+	return true;
+}
+
 bool
 intel_dp_compute_config_limits(struct intel_dp *intel_dp,
 			       struct drm_connector_state *conn_state,
@@ -2772,6 +2883,9 @@ intel_dp_compute_config_limits(struct intel_dp *intel_dp,
 		limits->link_config_filter = new_filter;
 	}
 
+	if (!intel_dp_compute_m_n_ratio_limits(intel_dp, conn_state, crtc_state, limits))
+		return false;
+
 	if (!intel_dp_test_compute_config(connector, crtc_state, limits))
 		return false;
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
index 04fae203bb69..aa58833a405b 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -239,6 +239,8 @@ bool intel_dp_joiner_candidate_valid(struct intel_connector *connector,
 
 u8 intel_dp_as_sdp_transmission_time(void);
 
+bool intel_dp_mode_valid_m_n(struct intel_dp *intel_dp, int pixel_clock);
+
 int intel_dp_link_init(struct intel_dp *intel_dp);
 void intel_dp_link_cleanup(struct intel_dp *intel_dp);
 
-- 
2.34.1


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

* [PATCH v7 03/13] drm/i915/display_wa: Add support for Wa_14014191401
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
  2026-10-22  3:22 ` [PATCH v7 01/13] drm/i915/display: Add helper to compute link M/N ratio for reuse Suraj Kandpal
  2026-10-22  3:22 ` [PATCH v7 02/13] drm/i915/dp: Limit M/N ratio for DP Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22  3:22 ` [PATCH v7 04/13] drm/i915/dp_mst: Limit M/N ratio for MST Suraj Kandpal
                   ` (12 subsequent siblings)
  15 siblings, 0 replies; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: mitulkumar.ajitkumar.golani, Suraj Kandpal

The DG2 transcoder timing generator DDA only supports a Link M/N ratio
of up to 4. The Link M/N ratio limit uses a bare platform check for it.

Add Wa_14014191401 for DG2 and use it for the limit instead.

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_wa.c | 2 ++
 drivers/gpu/drm/i915/display/intel_display_wa.h | 1 +
 drivers/gpu/drm/i915/display/intel_dp.c         | 3 ++-
 3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.c b/drivers/gpu/drm/i915/display/intel_display_wa.c
index 2e3ff4861ef4..91395076e903 100644
--- a/drivers/gpu/drm/i915/display/intel_display_wa.c
+++ b/drivers/gpu/drm/i915/display/intel_display_wa.c
@@ -94,6 +94,8 @@ bool __intel_display_wa(struct intel_display *display, enum intel_display_wa wa,
 			IS_DISPLAY_STEP(display, STEP_A0, STEP_A2);
 	case INTEL_DISPLAY_WA_14014143976:
 		return IS_DISPLAY_STEP(display, STEP_E0, STEP_FOREVER);
+	case INTEL_DISPLAY_WA_14014191401:
+		return display->platform.dg2;
 	case INTEL_DISPLAY_WA_14016740474:
 		return IS_DISPLAY_VERx100_STEP(display, 1400, STEP_A0, STEP_C0);
 	case INTEL_DISPLAY_WA_14020863754:
diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.h b/drivers/gpu/drm/i915/display/intel_display_wa.h
index b707147a7587..f41e58d1d6e7 100644
--- a/drivers/gpu/drm/i915/display/intel_display_wa.h
+++ b/drivers/gpu/drm/i915/display/intel_display_wa.h
@@ -31,6 +31,7 @@ enum intel_display_wa {
 	INTEL_DISPLAY_WA_14011508470,
 	INTEL_DISPLAY_WA_14011765242,
 	INTEL_DISPLAY_WA_14014143976,
+	INTEL_DISPLAY_WA_14014191401,
 	INTEL_DISPLAY_WA_14016740474,
 	INTEL_DISPLAY_WA_14020863754,
 	INTEL_DISPLAY_WA_14025769978,
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 7ceb7c02b597..f3a79ae49b18 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -70,6 +70,7 @@
 #include "intel_display_regs.h"
 #include "intel_display_rpm.h"
 #include "intel_display_types.h"
+#include "intel_display_wa.h"
 #include "intel_dp.h"
 #include "intel_dp_aux.h"
 #include "intel_dp_hdcp.h"
@@ -1271,7 +1272,7 @@ bool intel_dp_has_dsc(const struct intel_connector *connector)
 static int
 intel_dp_get_max_m_n_ratio(struct intel_display *display)
 {
-	if (display->platform.dg2)
+	if (intel_display_wa(display, INTEL_DISPLAY_WA_14014191401))
 		return 4;
 
 	return 10;
-- 
2.34.1


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

* [PATCH v7 04/13] drm/i915/dp_mst: Limit M/N ratio for MST
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (2 preceding siblings ...)
  2026-10-22  3:22 ` [PATCH v7 03/13] drm/i915/display_wa: Add support for Wa_14014191401 Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22  3:43   ` sashiko-bot
  2026-10-22 16:42   ` Golani, Mitulkumar Ajitkumar
  2026-10-22  3:22 ` [PATCH v7 05/13] drm/i915/dp: Add M/N ratio check for DP link config Suraj Kandpal
                   ` (11 subsequent siblings)
  15 siblings, 2 replies; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe
  Cc: mitulkumar.ajitkumar.golani, Ankit Nautiyal, Suraj Kandpal

From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

The hardware does not support DisplayPort configurations where the
ceiling of the Link M/Link N ratio exceeds the limit. Enforce this
constraint for MST as well.

The compute config path needs no change: MST goes through
intel_dp_compute_config_limits() too, so the link config filter set up
there already excludes the configurations violating the ratio limit, and
MST fails there if none is left.

What is still missing is pruning such modes, so add the check to
mst_connector_mode_valid_ctx(), reusing the helper the SST mode_valid
uses. It walks the link configurations and only rejects the mode if none
of them can satisfy the ratio, rather than evaluating it at a single
link rate.

v2:
-Drop the checks in the MST link config helpers, redundant now that the
constraint is applied while computing the link config limits. (Imre)
-Share the mode_valid helper with SST instead of evaluating the ratio at
one link rate, since the link symbol clock is not monotonic in the link
rate and there is no single best case configuration.
v3:
-Now that intel_dp_mode_valid_m_n checks for all configs just call
that (Sashiko)

Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp_mst.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 7023619aaaba..f00edfb66a10 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -1565,6 +1565,11 @@ mst_connector_mode_valid_ctx(struct drm_connector *_connector,
 					   min_link_bpp_x16,
 					   bw_overhead_flags);
 
+	if (!intel_dp_mode_valid_m_n(intel_dp, mode->clock)) {
+		*status = MODE_CLOCK_HIGH;
+		return 0;
+	}
+
 	/*
 	 * TODO:
 	 * - Also check if compression would allow for the mode
-- 
2.34.1


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

* [PATCH v7 05/13] drm/i915/dp: Add M/N ratio check for DP link config
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (3 preceding siblings ...)
  2026-10-22  3:22 ` [PATCH v7 04/13] drm/i915/dp_mst: Limit M/N ratio for MST Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22  3:22 ` [PATCH v7 06/13] drm/i915/display: Add bits for link_n_extended for DISPLAY >= 14 Suraj Kandpal
                   ` (10 subsequent siblings)
  15 siblings, 0 replies; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe
  Cc: mitulkumar.ajitkumar.golani, Ankit Nautiyal, Suraj Kandpal

From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Introduce intel_dp_check_m_n_ratio() to validate the computed link M/N
ratio against the maximum allowed value, and log it if the ratio exceeds
the limit.

The link config limits computed in the previous commits only restrict
the configurations that may be selected; this catches anything that
still slips through.

Log it rather than warn about it: the link config filter already
excludes the configurations violating the limit, so the only way to get
here is with link parameters forced through debugfs, which are applied
after that filter. A user triggerable drm_WARN() with its backtrace
would be out of proportion for that.

For MST the check goes after the bpp loop rather than inside it. The
link M/N is computed from the pixel clock and the link symbol clock, so
it does not depend on the bpp being tried and the result is the same on
every iteration.

v2:
-Use the platform specific ratio limit. (Wa_14014191401)
-Use the MSO adjusted pixel clock when predicting the ratio, matching
what the link M/N is actually computed from. (Imre)
-Drop the check from ilk_fdi_compute_config(): it was passing dp_m_n
rather than the fdi_m_n it had just computed, and an FDI link cannot get
anywhere near the ratio limit anyway.
v3:
-Check the ratio once after the MST bpp loop instead of on every
iteration, the result does not depend on the bpp. (Sashiko)
-Log instead of warning, since the link config filter already excludes
these configurations and only forced link parameters can reach it.
(Sashiko)
v4:
-Move the MSO adjusted pixel clock to the commit adding the prediction,
so that one is correct on its own. (Mitul)
-Reuse intel_dp_link_m_n_ratio() instead of open coding the ratio.
(Mitul)
-Drop the m_n and link_n checks, neither can be NULL or 0. Make the
parameters const and move it next to intel_dp_can_support_m_n().
(Mitul)
-Drop the check on dp_m2_n2, the dp_m_n one already covers it. (Mitul)

Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c     | 17 +++++++++++++++++
 drivers/gpu/drm/i915/display/intel_dp.h     |  4 ++++
 drivers/gpu/drm/i915/display/intel_dp_mst.c |  2 ++
 3 files changed, 23 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index f3a79ae49b18..8ef6b4c4fc8e 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1299,6 +1299,21 @@ intel_dp_can_support_m_n(struct intel_display *display,
 	return m_n_ratio <= max_m_n_ratio;
 }
 
+void intel_dp_check_m_n_ratio(const struct intel_crtc_state *crtc_state,
+			      const struct intel_link_m_n *m_n)
+{
+	struct intel_display *display = to_intel_display(crtc_state);
+	int max_m_n_ratio = intel_dp_get_max_m_n_ratio(display);
+	int m_n_ratio;
+
+	m_n_ratio = intel_dp_link_m_n_ratio(m_n->link_m, m_n->link_n);
+
+	if (m_n_ratio > max_m_n_ratio)
+		drm_dbg_kms(display->drm,
+			    "Link M/N ratio (%d) exceeds max allowed (%d)\n",
+			    m_n_ratio, max_m_n_ratio);
+}
+
 static int intel_dp_mso_pixel_clock(struct intel_dp *intel_dp, int pixel_clock)
 {
 	if (!intel_dp->mso_link_count)
@@ -3755,6 +3770,8 @@ intel_dp_compute_config(struct intel_atomic_state *state,
 				       pipe_config->port_clock,
 				       intel_dp_bw_fec_overhead(pipe_config->fec_enable),
 				       &pipe_config->dp_m_n);
+
+		intel_dp_check_m_n_ratio(pipe_config, &pipe_config->dp_m_n);
 	}
 
 	ret = intel_dp_compute_min_hblank(pipe_config, conn_state);
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
index aa58833a405b..1e3da678c9b6 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -26,6 +26,7 @@ struct intel_display;
 struct intel_dp;
 struct intel_dp_link_config;
 struct intel_encoder;
+struct intel_link_m_n;
 
 struct link_config_limits {
 	struct intel_dp_link_caps_filter link_config_filter;
@@ -244,4 +245,7 @@ bool intel_dp_mode_valid_m_n(struct intel_dp *intel_dp, int pixel_clock);
 int intel_dp_link_init(struct intel_dp *intel_dp);
 void intel_dp_link_cleanup(struct intel_dp *intel_dp);
 
+void intel_dp_check_m_n_ratio(const struct intel_crtc_state *crtc_state,
+			      const struct intel_link_m_n *m_n);
+
 #endif /* __INTEL_DP_H__ */
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index f00edfb66a10..8db84975f36b 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -429,6 +429,8 @@ int intel_dp_mtp_tu_compute_config(struct intel_dp *intel_dp,
 		return slots;
 	}
 
+	intel_dp_check_m_n_ratio(crtc_state, &crtc_state->dp_m_n);
+
 	if (!dsc)
 		crtc_state->pipe_bpp = fxp_q4_to_int(bpp_x16);
 	else
-- 
2.34.1


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

* [PATCH v7 06/13] drm/i915/display: Add bits for link_n_extended for DISPLAY >= 14
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (4 preceding siblings ...)
  2026-10-22  3:22 ` [PATCH v7 05/13] drm/i915/dp: Add M/N ratio check for DP link config Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22  3:22 ` [PATCH v7 07/13] drm/i915/display_wa: Add support for Wa_14021768792 Suraj Kandpal
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe
  Cc: mitulkumar.ajitkumar.golani, Ankit Nautiyal, Suraj Kandpal

From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

LINK_N register has bits 31:24 for extended link N value used for
HDMI2.1 and for an alternate mode of operation of DP TG DDA.

Add support for these extra bits.

For displays with version 14 or higher, PIPE_LINK_N1_EXTENDED_MASK
(bits 31:24) is used to handle the extended link N bits. For older
platforms, DATA_LINK_M_N_MASK (bits 23:0) is used to handle the
standard link N bits. This distinction ensures clarity and maintains
the semantics for platforms that support the extended bits. In
subsequent changes the logic is updated to conditionally apply the
extended link N bits.

v2: Drop extra link_n_ext member. (Jani)
v3: Avoid link_n_ext in set_m_n helper. (Jani)
v4: Rebase, and update commit message.
v5: Drop a stale changelog entry, the DISPLAY_VER split here is
    intentional. (Sashiko)

Bspec: 50488
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c   | 18 ++++++++++++++++--
 .../gpu/drm/i915/display/intel_display_regs.h  |  2 ++
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index f74e7ddf0e41..461b81bf8341 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -2720,14 +2720,22 @@ void intel_set_m_n(struct intel_display *display,
 		   intel_reg_t data_m_reg, intel_reg_t data_n_reg,
 		   intel_reg_t link_m_reg, intel_reg_t link_n_reg)
 {
+	u32 link_n = m_n->link_n;
+
 	intel_de_write(display, data_m_reg, TU_SIZE(m_n->tu) | m_n->data_m);
 	intel_de_write(display, data_n_reg, m_n->data_n);
 	intel_de_write(display, link_m_reg, m_n->link_m);
+
+	if (DISPLAY_VER(display) >= 14)
+		link_n &= ~PIPE_LINK_N1_EXTENDED_MASK;
+	else
+		link_n &= DATA_LINK_M_N_MASK;
+
 	/*
 	 * On BDW+ writing LINK_N arms the double buffered update
 	 * of all the M/N registers, so it must be written last.
 	 */
-	intel_de_write(display, link_n_reg, m_n->link_n);
+	intel_de_write(display, link_n_reg, link_n);
 }
 
 bool intel_cpu_transcoder_has_m2_n2(struct intel_display *display,
@@ -3484,7 +3492,13 @@ void intel_get_m_n(struct intel_display *display,
 		   intel_reg_t link_m_reg, intel_reg_t link_n_reg)
 {
 	m_n->link_m = intel_de_read(display, link_m_reg) & DATA_LINK_M_N_MASK;
-	m_n->link_n = intel_de_read(display, link_n_reg) & DATA_LINK_M_N_MASK;
+	m_n->link_n = intel_de_read(display, link_n_reg);
+
+	if (DISPLAY_VER(display) >= 14)
+		m_n->link_n &= ~PIPE_LINK_N1_EXTENDED_MASK;
+	else
+		m_n->link_n &= DATA_LINK_M_N_MASK;
+
 	m_n->data_m = intel_de_read(display, data_m_reg) & DATA_LINK_M_N_MASK;
 	m_n->data_n = intel_de_read(display, data_n_reg) & DATA_LINK_M_N_MASK;
 	m_n->tu = REG_FIELD_GET(TU_SIZE_MASK, intel_de_read(display, data_m_reg)) + 1;
diff --git a/drivers/gpu/drm/i915/display/intel_display_regs.h b/drivers/gpu/drm/i915/display/intel_display_regs.h
index 2f509bd06557..983a0d9dcb9c 100644
--- a/drivers/gpu/drm/i915/display/intel_display_regs.h
+++ b/drivers/gpu/drm/i915/display/intel_display_regs.h
@@ -1190,6 +1190,8 @@
 
 #define _PIPEA_LINK_N1		0x60044
 #define _PIPEB_LINK_N1		0x61044
+#define  PIPE_LINK_N1_EXTENDED_MASK	REG_GENMASK(31, 24)
+#define  PIPE_LINK_N1_EXTENDED(val)	REG_FIELD_PREP(PIPE_LINK_N1_EXTENDED_MASK, (val))
 #define PIPE_LINK_N1(dev_priv, tran) _MMIO_TRANS2(dev_priv, tran, _PIPEA_LINK_N1)
 
 #define _PIPEA_LINK_M2		0x60048
-- 
2.34.1


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

* [PATCH v7 07/13] drm/i915/display_wa: Add support for Wa_14021768792
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (5 preceding siblings ...)
  2026-10-22  3:22 ` [PATCH v7 06/13] drm/i915/display: Add bits for link_n_extended for DISPLAY >= 14 Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22  3:22 ` [PATCH v7 08/13] drm/i915/display: Add bits for Wa_14021768792 for linkm/n ratio > 10 Suraj Kandpal
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe
  Cc: mitulkumar.ajitkumar.golani, Ankit Nautiyal, Suraj Kandpal

From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Some BMG ultrajoiner configurations require support for Link M/N ratios
between 10.0 and 15.0. This range is not natively supported and requires
a workaround.

Wa_14021768792 enables this support by utilizing HDMI_EMP_DATA,
CHICKEN_TRANS and the extended bits in the LINK_N register.

Add the necessary logic to enable the workaround on applicable platforms.
The underlying mechanism comes from the display C0,
so it is gated on display stepping C0 and later.

v2:
-Don't include i915_drv.h and don't use struct drm_i915_private under
display/. Use display->platform.battlemage, which names the affected
platform directly, instead of IS_DGFX() combined with a display version
check. (Jani)
-Rebase on the reworked display WA framework, where the condition goes
directly into the __intel_display_wa() switch.

Bspec: 49266
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_wa.c | 9 +++++++++
 drivers/gpu/drm/i915/display/intel_display_wa.h | 1 +
 2 files changed, 10 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.c b/drivers/gpu/drm/i915/display/intel_display_wa.c
index 91395076e903..e6f84dffdeb7 100644
--- a/drivers/gpu/drm/i915/display/intel_display_wa.c
+++ b/drivers/gpu/drm/i915/display/intel_display_wa.c
@@ -102,6 +102,15 @@ bool __intel_display_wa(struct intel_display *display, enum intel_display_wa wa,
 		return DISPLAY_VERx100(display) == 3000 ||
 			DISPLAY_VERx100(display) == 2000 ||
 			DISPLAY_VERx100(display) == 1401;
+	/*
+	 * Wa_14021768792:
+	 * Fixes: Limitation of Link M/N ratio > 10 for specific Xe2HPD platforms.
+	 * Workaround: Use HDMI_EMP_DATA, CHICKEN_BITs and extended bits in LINK_N
+	 * registers to support LINK M/N ratios from > 10 but < 15.
+	 */
+	case INTEL_DISPLAY_WA_14021768792:
+		return display->platform.battlemage &&
+			IS_DISPLAY_STEP(display, STEP_C0, STEP_FOREVER);
 	case INTEL_DISPLAY_WA_14025769978:
 		return DISPLAY_VER(display) == 35;
 	case INTEL_DISPLAY_WA_14026643300:
diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.h b/drivers/gpu/drm/i915/display/intel_display_wa.h
index f41e58d1d6e7..0b43c2144dcc 100644
--- a/drivers/gpu/drm/i915/display/intel_display_wa.h
+++ b/drivers/gpu/drm/i915/display/intel_display_wa.h
@@ -34,6 +34,7 @@ enum intel_display_wa {
 	INTEL_DISPLAY_WA_14014191401,
 	INTEL_DISPLAY_WA_14016740474,
 	INTEL_DISPLAY_WA_14020863754,
+	INTEL_DISPLAY_WA_14021768792,
 	INTEL_DISPLAY_WA_14025769978,
 	INTEL_DISPLAY_WA_14026643300,
 	INTEL_DISPLAY_WA_15013987218,
-- 
2.34.1


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

* [PATCH v7 08/13] drm/i915/display: Add bits for Wa_14021768792 for linkm/n ratio > 10
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (6 preceding siblings ...)
  2026-10-22  3:22 ` [PATCH v7 07/13] drm/i915/display_wa: Add support for Wa_14021768792 Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22 17:32   ` Golani, Mitulkumar Ajitkumar
  2026-10-22  3:22 ` [PATCH v7 09/13] drm/i915/display: Compare bypass_m_n_ratio_limit in the state checker Suraj Kandpal
                   ` (7 subsequent siblings)
  15 siblings, 1 reply; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe
  Cc: mitulkumar.ajitkumar.golani, Ankit Nautiyal, Suraj Kandpal

From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

To support a Link M/N ratio between 10.0 and 15.0, for some BMG
ultrajoiner cases we need Wa_14021768792.

To bypass the hardware limitation within the Timing Generator DDA
(TGDDA), we need to program the LINKM and LINKN registers as defined in
the WA. Along with this we also need the relevant bits in HDMI_EMP_DATA
and CHICKEN_TRANS.

Add the bits for the WA and a new member 'bypass_m_n_ratio_limit' to
track if we need to bypass the Link M/N ratio limit in the
intel_link_m_n structure.

Per Bspec the extended LINK_N field is two nibbles: bits 27:24 hold
INT(Link M / Link N) and bits 31:28 hold CEIL(Link M / Link N).

The workaround is limited to transcoder A. Check the transcoder rather
than the pipe: for a single pipe the two are the same, but the joiner
secondaries read the M/N back through the primary's transcoder, so a
pipe check would have them report the workaround as not applied while
their state, copied from the primary, has it applied.

CHICKEN_TRANS and HDMI_EMP_DATA are programmed before LINK_N, since
writing LINK_N arms the double buffered update of the M/N registers, and
all of the programming has to be done before the transcoder is enabled.
Both are also explicitly cleared when the mechanism is not in use, so
that state cannot leak from a previous modeset.

v2:
-Drop the drm_WARN_ON() on the extended LINK_N field in intel_get_m_n():
it is derived from Link M and Link N, so the state checker comparison of
those and of bypass_m_n_ratio_limit already covers it. (Sashiko)
-Compare bypass_m_n_ratio_limit unconditionally, so that a change to it
forces a full modeset instead of being applied during a seamless M/N
fastset. (Sashiko)
v3:
-Check for transcoder A instead of pipe A, so that the joiner secondaries
read the flag back the same as the primary. (Mitul)
-Drop bypass_m_n_ratio_limit from intel_compare_link_m_n(), the
unconditional PIPE_CONF_CHECK_BOOL() already compares it. (Mitul)
-Print bypass_m_n_ratio_limit in the crtc state dump. (Mitul)
v4:
-Move the state checker comparison and the state dump of
bypass_m_n_ratio_limit to separate commits. (Mitul)

Bspec: 49266
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c  | 80 ++++++++++++++++++-
 drivers/gpu/drm/i915/display/intel_display.h  |  2 +
 .../gpu/drm/i915/display/intel_display_regs.h | 10 +++
 .../drm/i915/display/intel_display_types.h    |  2 +
 4 files changed, 93 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 461b81bf8341..9e9321976a21 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -2715,6 +2715,15 @@ void intel_zero_m_n(struct intel_link_m_n *m_n)
 	m_n->tu = 1;
 }
 
+static u8 bmg_get_link_n_ext(const struct intel_link_m_n *m_n)
+{
+	if (!m_n->link_n)
+		return 0;
+
+	return PIPE_LINK_N1_EXT_INT(m_n->link_m / m_n->link_n) |
+		PIPE_LINK_N1_EXT_CEIL(DIV_ROUND_UP(m_n->link_m, m_n->link_n));
+}
+
 void intel_set_m_n(struct intel_display *display,
 		   const struct intel_link_m_n *m_n,
 		   intel_reg_t data_m_reg, intel_reg_t data_n_reg,
@@ -2726,7 +2735,9 @@ void intel_set_m_n(struct intel_display *display,
 	intel_de_write(display, data_n_reg, m_n->data_n);
 	intel_de_write(display, link_m_reg, m_n->link_m);
 
-	if (DISPLAY_VER(display) >= 14)
+	if (DISPLAY_VER(display) >= 14 && m_n->bypass_m_n_ratio_limit)
+		link_n |= PIPE_LINK_N1_EXTENDED(bmg_get_link_n_ext(m_n));
+	else if (DISPLAY_VER(display) >= 14)
 		link_n &= ~PIPE_LINK_N1_EXTENDED_MASK;
 	else
 		link_n &= DATA_LINK_M_N_MASK;
@@ -2747,6 +2758,26 @@ bool intel_cpu_transcoder_has_m2_n2(struct intel_display *display,
 	return IS_DISPLAY_VER(display, 5, 7) || display->platform.cherryview;
 }
 
+static void bmg_enhanced_tgdda_write(struct intel_crtc *crtc,
+				     enum transcoder transcoder,
+				     const struct intel_link_m_n *m_n)
+{
+	struct intel_display *display = to_intel_display(crtc);
+	bool enable = m_n->bypass_m_n_ratio_limit && m_n->link_n;
+	u32 link_m_frac = enable ? m_n->link_m % m_n->link_n : 0;
+
+	if (!intel_display_wa(display, INTEL_DISPLAY_WA_14021768792))
+		return;
+
+	intel_de_rmw(display, HDMI_EMP_DATA(display, transcoder),
+		     HDMI_EMP_DATA_LINK_M_FRAC_MASK,
+		     REG_FIELD_PREP(HDMI_EMP_DATA_LINK_M_FRAC_MASK, link_m_frac));
+
+	intel_de_rmw(display, CHICKEN_TRANS(display, transcoder),
+		     DP_ENHANCED_TGDDA_ENABLE,
+		     enable ? DP_ENHANCED_TGDDA_ENABLE : 0);
+}
+
 void intel_cpu_transcoder_set_m1_n1(struct intel_crtc *crtc,
 				    enum transcoder transcoder,
 				    const struct intel_link_m_n *m_n)
@@ -2754,6 +2785,8 @@ void intel_cpu_transcoder_set_m1_n1(struct intel_crtc *crtc,
 	struct intel_display *display = to_intel_display(crtc);
 	enum pipe pipe = crtc->pipe;
 
+	bmg_enhanced_tgdda_write(crtc, transcoder, m_n);
+
 	if (DISPLAY_VER(display) >= 5)
 		intel_set_m_n(display, m_n,
 			      PIPE_DATA_M1(display, transcoder),
@@ -3504,6 +3537,49 @@ void intel_get_m_n(struct intel_display *display,
 	m_n->tu = REG_FIELD_GET(TU_SIZE_MASK, intel_de_read(display, data_m_reg)) + 1;
 }
 
+bool intel_display_can_bypass_m_n_limit(struct intel_display *display,
+					int m_n_ratio,
+					enum transcoder transcoder)
+{
+	if (!intel_display_wa(display, INTEL_DISPLAY_WA_14021768792))
+		return false;
+
+	if (m_n_ratio > 15)
+		return false;
+
+	if (transcoder != TRANSCODER_A)
+		return false;
+
+	return true;
+}
+
+static void bmg_enhanced_tgdda_read(struct intel_crtc *crtc,
+				    enum transcoder transcoder,
+				    struct intel_link_m_n *m_n)
+{
+	struct intel_display *display = to_intel_display(crtc);
+	u32 link_m_frac;
+	int m_n_ratio;
+
+	if (!m_n->link_n)
+		return;
+
+	m_n_ratio = DIV_ROUND_UP(m_n->link_m, m_n->link_n);
+
+	if (!intel_display_can_bypass_m_n_limit(display, m_n_ratio, transcoder))
+		return;
+
+	if (!(intel_de_read(display, CHICKEN_TRANS(display, transcoder)) &
+	      DP_ENHANCED_TGDDA_ENABLE))
+		return;
+
+	link_m_frac = REG_FIELD_GET(HDMI_EMP_DATA_LINK_M_FRAC_MASK,
+				    intel_de_read(display, HDMI_EMP_DATA(display, transcoder)));
+
+	if (link_m_frac == m_n->link_m % m_n->link_n)
+		m_n->bypass_m_n_ratio_limit = true;
+}
+
 void intel_cpu_transcoder_get_m1_n1(struct intel_crtc *crtc,
 				    enum transcoder transcoder,
 				    struct intel_link_m_n *m_n)
@@ -3521,6 +3597,8 @@ void intel_cpu_transcoder_get_m1_n1(struct intel_crtc *crtc,
 		intel_get_m_n(display, m_n,
 			      PIPE_DATA_M_G4X(pipe), PIPE_DATA_N_G4X(pipe),
 			      PIPE_LINK_M_G4X(pipe), PIPE_LINK_N_G4X(pipe));
+
+	bmg_enhanced_tgdda_read(crtc, transcoder, m_n);
 }
 
 void intel_cpu_transcoder_get_m2_n2(struct intel_crtc *crtc,
diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
index 404168f4213b..d53b7b4a80e7 100644
--- a/drivers/gpu/drm/i915/display/intel_display.h
+++ b/drivers/gpu/drm/i915/display/intel_display.h
@@ -525,5 +525,7 @@ bool intel_scanout_needs_vtd_wa(struct intel_display *display);
 int intel_crtc_num_joined_pipes(const struct intel_crtc_state *crtc_state);
 void intel_display_compute_link_m_n(u32 *link_m, u32 *link_n,
 				    int pixel_clock, int link_symbol_clock);
+bool intel_display_can_bypass_m_n_limit(struct intel_display *display,
+					int m_n_ratio, enum transcoder transcoder);
 
 #endif
diff --git a/drivers/gpu/drm/i915/display/intel_display_regs.h b/drivers/gpu/drm/i915/display/intel_display_regs.h
index 983a0d9dcb9c..bbdbc27629d7 100644
--- a/drivers/gpu/drm/i915/display/intel_display_regs.h
+++ b/drivers/gpu/drm/i915/display/intel_display_regs.h
@@ -550,6 +550,11 @@
 #define _TRANS_MULT_B		0x6102c
 #define TRANS_MULT(dev_priv, trans)	_MMIO_TRANS2(dev_priv, (trans), _TRANS_MULT_A)
 
+#define _HDMI_EMP_DATA_A	0x600d8
+#define _HDMI_EMP_DATA_B	0x610d8
+#define  HDMI_EMP_DATA_LINK_M_FRAC_MASK	REG_GENMASK(23, 0)
+#define HDMI_EMP_DATA(display, trans)	_MMIO_TRANS2((display), (trans), _HDMI_EMP_DATA_A)
+
 /* Hotplug control (945+ only) */
 #define PORT_HOTPLUG_EN(dev_priv)		_MMIO(DISPLAY_MMIO_BASE(dev_priv) + 0x61110)
 #define   PORTB_HOTPLUG_INT_EN			(1 << 29)
@@ -1192,6 +1197,10 @@
 #define _PIPEB_LINK_N1		0x61044
 #define  PIPE_LINK_N1_EXTENDED_MASK	REG_GENMASK(31, 24)
 #define  PIPE_LINK_N1_EXTENDED(val)	REG_FIELD_PREP(PIPE_LINK_N1_EXTENDED_MASK, (val))
+#define  PIPE_LINK_N1_EXT_CEIL_MASK	REG_GENMASK(7, 4)
+#define  PIPE_LINK_N1_EXT_CEIL(val)	REG_FIELD_PREP(PIPE_LINK_N1_EXT_CEIL_MASK, (val))
+#define  PIPE_LINK_N1_EXT_INT_MASK	REG_GENMASK(3, 0)
+#define  PIPE_LINK_N1_EXT_INT(val)	REG_FIELD_PREP(PIPE_LINK_N1_EXT_INT_MASK, (val))
 #define PIPE_LINK_N1(dev_priv, tran) _MMIO_TRANS2(dev_priv, tran, _PIPEA_LINK_N1)
 
 #define _PIPEA_LINK_M2		0x60048
@@ -1710,6 +1719,7 @@
 #define   PSR2_ADD_VERTICAL_LINE_COUNT	REG_BIT(15)
 #define   DP_FEC_BS_JITTER_WA		REG_BIT(15)
 #define   PSR2_VSC_ENABLE_PROG_HEADER	REG_BIT(12)
+#define   DP_ENHANCED_TGDDA_ENABLE	REG_BIT(11)
 #define   DP_DSC_INSERT_SF_AT_EOL_WA	REG_BIT(4)
 #define   HDCP_LINE_REKEY_DISABLE	REG_BIT(0)
 
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 8f9fb2603638..d0748837ce97 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -985,6 +985,8 @@ struct intel_link_m_n {
 	u32 data_n;
 	u32 link_m;
 	u32 link_n;
+	/* Wa_14021768792 for linkm/n ratio > 10 */
+	bool bypass_m_n_ratio_limit;
 };
 
 struct intel_csc_matrix {
-- 
2.34.1


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

* [PATCH v7 09/13] drm/i915/display: Compare bypass_m_n_ratio_limit in the state checker
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (7 preceding siblings ...)
  2026-10-22  3:22 ` [PATCH v7 08/13] drm/i915/display: Add bits for Wa_14021768792 for linkm/n ratio > 10 Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22  3:22 ` [PATCH v7 10/13] drm/i915/display: Dump bypass_m_n_ratio_limit in the crtc state dump Suraj Kandpal
                   ` (6 subsequent siblings)
  15 siblings, 0 replies; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: mitulkumar.ajitkumar.golani, Suraj Kandpal

Compare bypass_m_n_ratio_limit in intel_pipe_config_compare(), so that a
mismatch between the computed and the read back state of
Wa_14021768792 is caught.
Only bypass_m_n_ratio_limit is compared, not the ratio integer and
fraction themselves. That is deliberate: both are derived from Link M
and Link N, which are compared already, so the thing worth verifying is
whether the workaround ended up being applied or not.
Unlike the rest of the M/N registers, CHICKEN_TRANS and HDMI_EMP_DATA
are not double buffered, so the flag has to be compared outside the
fastset exemption that PIPE_CONF_CHECK_M_N() has for update_m_n.
Otherwise a seamless M/N update could switch the DDA out of the
workaround on a live transcoder, with the Link M/N values only following
at the next MSA.

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

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 9e9321976a21..ecc0e5ec181a 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -5523,6 +5523,8 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
 		PIPE_CONF_CHECK_M_N(dp_m2_n2);
 	}
 
+	PIPE_CONF_CHECK_BOOL(dp_m_n.bypass_m_n_ratio_limit);
+
 	PIPE_CONF_CHECK_X(output_types);
 
 	PIPE_CONF_CHECK_I(framestart_delay);
-- 
2.34.1


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

* [PATCH v7 10/13] drm/i915/display: Dump bypass_m_n_ratio_limit in the crtc state dump
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (8 preceding siblings ...)
  2026-10-22  3:22 ` [PATCH v7 09/13] drm/i915/display: Compare bypass_m_n_ratio_limit in the state checker Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22  7:38   ` Golani, Mitulkumar Ajitkumar
  2026-10-22  3:22 ` [PATCH v7 11/13] drm/i915/display: Implement Wa_14021768792 for BMG DP for link_m/n ratio > 10 Suraj Kandpal
                   ` (5 subsequent siblings)
  15 siblings, 1 reply; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: mitulkumar.ajitkumar.golani, Suraj Kandpal

Dump whether the Link M/N ratio limit is bypassed with Wa_14021768792
along with the rest of the M/N values in the crtc state dump.

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

diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
index 92675a88b969..c51b21222dc6 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
@@ -36,10 +36,12 @@ intel_dump_m_n_config(struct drm_printer *p,
 		      const char *id, unsigned int lane_count,
 		      const struct intel_link_m_n *m_n)
 {
-	drm_printf(p, "%s: lanes: %i; data_m: %u, data_n: %u, link_m: %u, link_n: %u, tu: %u\n",
+	drm_printf(p,
+		   "%s: lanes: %i; data_m: %u, data_n: %u, link_m: %u, link_n: %u, tu: %u, bypass_m_n_ratio_limit: %s\n",
 		   id, lane_count,
 		   m_n->data_m, m_n->data_n,
-		   m_n->link_m, m_n->link_n, m_n->tu);
+		   m_n->link_m, m_n->link_n, m_n->tu,
+		   str_yes_no(m_n->bypass_m_n_ratio_limit));
 }
 
 static void
-- 
2.34.1


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

* [PATCH v7 11/13] drm/i915/display: Implement Wa_14021768792 for BMG DP for link_m/n ratio > 10
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (9 preceding siblings ...)
  2026-10-22  3:22 ` [PATCH v7 10/13] drm/i915/display: Dump bypass_m_n_ratio_limit in the crtc state dump Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22  3:22 ` [PATCH v7 12/13] drm/i915/dp: Extend intel_dp_can_support_m_n() for BMG M/N bypass Suraj Kandpal
                   ` (4 subsequent siblings)
  15 siblings, 0 replies; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe
  Cc: mitulkumar.ajitkumar.golani, Ankit Nautiyal, Suraj Kandpal

From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Handle the bypass logic for the M/N ratio limit for DP.
Calculate the M/N ratio, check if it can bypass the limit, and set the
appropriate flags for the workaround.

v2:
-Restrict the workaround to 128b/132b links.
-Clear bypass_m_n_ratio_limit on entry, so a rejected link rate cannot
leave it set for the rate that gets used. (Sashiko)
v3:
-Rebase on the reworked M/N ratio check, which no longer checks m_n and
link_n. m_n is no longer const, as the flag is set through it. (Mitul)
-Pass the cpu transcoder to intel_display_can_bypass_m_n_limit() instead
of the pipe. (Mitul)

Bspec: 49266
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c | 28 ++++++++++++++++++++-----
 drivers/gpu/drm/i915/display/intel_dp.h |  2 +-
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 8ef6b4c4fc8e..8e6ba5b9fde6 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1300,18 +1300,32 @@ intel_dp_can_support_m_n(struct intel_display *display,
 }
 
 void intel_dp_check_m_n_ratio(const struct intel_crtc_state *crtc_state,
-			      const struct intel_link_m_n *m_n)
+			      struct intel_link_m_n *m_n)
 {
 	struct intel_display *display = to_intel_display(crtc_state);
 	int max_m_n_ratio = intel_dp_get_max_m_n_ratio(display);
 	int m_n_ratio;
 
+	m_n->bypass_m_n_ratio_limit = false;
+
 	m_n_ratio = intel_dp_link_m_n_ratio(m_n->link_m, m_n->link_n);
 
-	if (m_n_ratio > max_m_n_ratio)
+	if (m_n_ratio <= max_m_n_ratio)
+		return;
+
+	if (intel_dp_is_uhbr(crtc_state) &&
+	    intel_display_can_bypass_m_n_limit(display, m_n_ratio,
+					       crtc_state->cpu_transcoder)) {
+		m_n->bypass_m_n_ratio_limit = true;
 		drm_dbg_kms(display->drm,
-			    "Link M/N ratio (%d) exceeds max allowed (%d)\n",
-			    m_n_ratio, max_m_n_ratio);
+			    "Bypassing Link_m/Link_n ratio limit (ratio %d)\n",
+			    m_n_ratio);
+		return;
+	}
+
+	drm_dbg_kms(display->drm,
+		    "Link M/N ratio (%d) exceeds max allowed (%d)\n",
+		    m_n_ratio, max_m_n_ratio);
 }
 
 static int intel_dp_mso_pixel_clock(struct intel_dp *intel_dp, int pixel_clock)
@@ -3393,6 +3407,9 @@ static bool can_enable_drrs(struct intel_connector *connector,
 	if (pipe_config->vrr.enable)
 		return false;
 
+	if (pipe_config->dp_m_n.bypass_m_n_ratio_limit)
+		return false;
+
 	/*
 	 * DRRS and PSR can't be enable together, so giving preference to PSR
 	 * as it allows more power-savings by complete shutting down display,
@@ -3427,7 +3444,8 @@ intel_dp_drrs_compute_config(struct intel_connector *connector,
 	 * FIXME all joined pipes share the same transcoder.
 	 * Need to account for that when updating M/N live.
 	 */
-	if (has_seamless_m_n(connector) && !pipe_config->joiner_pipes)
+	if (has_seamless_m_n(connector) && !pipe_config->joiner_pipes &&
+	    !pipe_config->dp_m_n.bypass_m_n_ratio_limit)
 		pipe_config->update_m_n = true;
 
 	if (!can_enable_drrs(connector, pipe_config, downclock_mode)) {
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
index 1e3da678c9b6..c834d90a1f81 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -246,6 +246,6 @@ int intel_dp_link_init(struct intel_dp *intel_dp);
 void intel_dp_link_cleanup(struct intel_dp *intel_dp);
 
 void intel_dp_check_m_n_ratio(const struct intel_crtc_state *crtc_state,
-			      const struct intel_link_m_n *m_n);
+			      struct intel_link_m_n *m_n);
 
 #endif /* __INTEL_DP_H__ */
-- 
2.34.1


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

* [PATCH v7 12/13] drm/i915/dp: Extend intel_dp_can_support_m_n() for BMG M/N bypass
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (10 preceding siblings ...)
  2026-10-22  3:22 ` [PATCH v7 11/13] drm/i915/display: Implement Wa_14021768792 for BMG DP for link_m/n ratio > 10 Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22 16:13   ` Golani, Mitulkumar Ajitkumar
  2026-10-22  3:22 ` [PATCH v7 13/13] drm/i915/dp: Bump the max Link M/N ratio to 22 for DISPLAY_VER >= 35 Suraj Kandpal
                   ` (3 subsequent siblings)
  15 siblings, 1 reply; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe
  Cc: mitulkumar.ajitkumar.golani, Ankit Nautiyal, Suraj Kandpal

From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

On BMG platforms, the standard M/N ratio limit of 10 can be bypassed
under specific conditions, as permitted by hardware capabilities.

Modify the helper intel_dp_can_support_m_n() to account for this by
checking whether the platform supports bypassing the limit. The
workaround is only intended for 128b/132b links, so restrict it to
those.

During the mode_valid phase, the check assumes that TRANSCODER_A will be
used, to allow the mode where the M/N ratio is within the limits for the
workaround.

v2:
-Keep the helper static: the MST mode_valid now goes through the shared
intel_dp_mode_valid_m_n() rather than calling it directly, so it no
longer needs to be exported.
v3:
-Use the cpu transcoder instead of the pipe, following the change to
intel_display_can_bypass_m_n_limit(). (Mitul)

Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 8e6ba5b9fde6..045524994d85 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1285,9 +1285,11 @@ static int intel_dp_link_m_n_ratio(u32 link_m, u32 link_n)
 
 static bool
 intel_dp_can_support_m_n(struct intel_display *display,
+			 const struct intel_crtc_state *crtc_state,
 			 int pixel_clock, int link_rate)
 {
 	int max_m_n_ratio = intel_dp_get_max_m_n_ratio(display);
+	enum transcoder cpu_transcoder = TRANSCODER_A;
 	u32 link_m, link_n;
 	int m_n_ratio;
 
@@ -1296,7 +1298,16 @@ intel_dp_can_support_m_n(struct intel_display *display,
 
 	m_n_ratio = intel_dp_link_m_n_ratio(link_m, link_n);
 
-	return m_n_ratio <= max_m_n_ratio;
+	if (m_n_ratio <= max_m_n_ratio)
+		return true;
+
+	if (!drm_dp_is_uhbr_rate(link_rate))
+		return false;
+
+	if (crtc_state)
+		cpu_transcoder = crtc_state->cpu_transcoder;
+
+	return intel_display_can_bypass_m_n_limit(display, m_n_ratio, cpu_transcoder);
 }
 
 void intel_dp_check_m_n_ratio(const struct intel_crtc_state *crtc_state,
@@ -1386,7 +1397,7 @@ bool intel_dp_mode_valid_m_n(struct intel_dp *intel_dp, int pixel_clock)
 	intel_dp_link_caps_iter_start(&iter, intel_dp->link.caps, order,
 				      INTEL_DP_LINK_CAPS_FILTER_ALL);
 	for_each_dp_link_config(&iter, &link_config) {
-		if (intel_dp_can_support_m_n(display, m_n_pixel_clock,
+		if (intel_dp_can_support_m_n(display, NULL, m_n_pixel_clock,
 					     link_config.rate)) {
 			found = true;
 
@@ -2775,7 +2786,8 @@ intel_dp_compute_m_n_ratio_limits(struct intel_dp *intel_dp,
 
 	intel_dp_link_caps_iter_start(&iter, link_caps, order, limits->link_config_filter);
 	for_each_dp_link_config(&iter, &link_config) {
-		if (!intel_dp_can_support_m_n(display, pixel_clock, link_config.rate))
+		if (!intel_dp_can_support_m_n(display, crtc_state, pixel_clock,
+					      link_config.rate))
 			continue;
 
 		intel_dp_link_caps_filter_add(link_caps, &new_filter, &link_config);
-- 
2.34.1


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

* [PATCH v7 13/13] drm/i915/dp: Bump the max Link M/N ratio to 22 for DISPLAY_VER >= 35
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (11 preceding siblings ...)
  2026-10-22  3:22 ` [PATCH v7 12/13] drm/i915/dp: Extend intel_dp_can_support_m_n() for BMG M/N bypass Suraj Kandpal
@ 2026-10-22  3:22 ` Suraj Kandpal
  2026-10-22 14:08   ` Golani, Mitulkumar Ajitkumar
  2026-10-22  3:32 ` ✓ CI.KUnit: success for Implement Wa_14021768792 to bypass m_n ratio limit (rev11) Patchwork
                   ` (2 subsequent siblings)
  15 siblings, 1 reply; 28+ messages in thread
From: Suraj Kandpal @ 2026-10-22  3:22 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: mitulkumar.ajitkumar.golani, Suraj Kandpal

Starting Xe3p max M/N ratio has been increased to 22.

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

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 045524994d85..5864e33456a7 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1272,6 +1272,9 @@ bool intel_dp_has_dsc(const struct intel_connector *connector)
 static int
 intel_dp_get_max_m_n_ratio(struct intel_display *display)
 {
+	if (DISPLAY_VER(display) >= 35)
+		return 22;
+
 	if (intel_display_wa(display, INTEL_DISPLAY_WA_14014191401))
 		return 4;
 
-- 
2.34.1


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

* ✓ CI.KUnit: success for Implement Wa_14021768792 to bypass m_n ratio limit (rev11)
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (12 preceding siblings ...)
  2026-10-22  3:22 ` [PATCH v7 13/13] drm/i915/dp: Bump the max Link M/N ratio to 22 for DISPLAY_VER >= 35 Suraj Kandpal
@ 2026-10-22  3:32 ` Patchwork
  2026-10-22  4:10 ` ✓ Xe.CI.BAT: " Patchwork
  2026-10-22  7:39 ` ✗ Xe.CI.FULL: failure " Patchwork
  15 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2026-10-22  3:32 UTC (permalink / raw)
  To: Suraj Kandpal; +Cc: intel-xe

== Series Details ==

Series: Implement Wa_14021768792 to bypass m_n ratio limit (rev11)
URL   : https://patchwork.freedesktop.org/series/138256/
State : success

== Summary ==

+ trap cleanup EXIT
+ kunitconfigs=('/kernel/drivers/gpu/tests/.kunitconfig' '/kernel/drivers/gpu/drm/xe/.kunitconfig' '/kernel/drivers/gpu/drm/tests/.kunitconfig' '/kernel/drivers/gpu/drm/ttm/tests/.kunitconfig' '/kernel/drivers/dma-buf/.kunitconfig')
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/tests/.kunitconfig
[03:30:27] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[03:30:31] 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
[03:30:52] Starting KUnit Kernel (1/1)...
[03:30:52] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[03:30:52] ================= gpu_buddy (14 subtests) ==================
[03:30:52] [PASSED] gpu_test_buddy_alloc_limit
[03:30:52] [PASSED] gpu_test_buddy_alloc_optimistic
[03:30:52] [PASSED] gpu_test_buddy_alloc_pessimistic
[03:30:52] [PASSED] gpu_test_buddy_alloc_pathological
[03:30:52] [PASSED] gpu_test_buddy_alloc_contiguous
[03:30:52] [PASSED] gpu_test_buddy_alloc_clear
[03:30:52] [PASSED] gpu_test_buddy_alloc_range
[03:30:53] [PASSED] gpu_test_buddy_alloc_range_bias
[03:30:53] [PASSED] gpu_test_buddy_fragmentation_performance
[03:30:54] [PASSED] gpu_test_buddy_dirty_tracker_performance
[03:30:54] [PASSED] gpu_test_buddy_alloc_exceeds_max_order
[03:30:54] [PASSED] gpu_test_buddy_offset_aligned_allocation
[03:30:54] [PASSED] gpu_test_buddy_subtree_offset_alignment_stress
[03:30:54] [PASSED] gpu_test_buddy_addr_to_block
[03:30:54] ==================== [PASSED] gpu_buddy ====================
[03:30:54] ============================================================
[03:30:54] Testing complete. Ran 14 tests: passed: 14
[03:30:54] Elapsed time: 27.191s total, 4.502s configuring, 20.721s building, 1.890s running

+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/xe/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[03:30:54] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[03:30:56] 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
[03:31:35] Starting KUnit Kernel (1/1)...
[03:31:35] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[03:31:35] ================== guc_buf (11 subtests) ===================
[03:31:35] [PASSED] test_smallest
[03:31:35] [PASSED] test_largest
[03:31:35] [PASSED] test_granular
[03:31:35] [PASSED] test_unique
[03:31:35] [PASSED] test_overlap
[03:31:35] [PASSED] test_reusable
[03:31:35] [PASSED] test_too_big
[03:31:35] [PASSED] test_flush
[03:31:35] [PASSED] test_lookup
[03:31:35] [PASSED] test_data
[03:31:35] [PASSED] test_class
[03:31:35] ===================== [PASSED] guc_buf =====================
[03:31:35] =================== guc_dbm (7 subtests) ===================
[03:31:35] [PASSED] test_empty
[03:31:35] [PASSED] test_default
[03:31:35] ======================== test_size  ========================
[03:31:35] [PASSED] 4
[03:31:35] [PASSED] 8
[03:31:35] [PASSED] 32
[03:31:35] [PASSED] 256
[03:31:35] ==================== [PASSED] test_size ====================
[03:31:35] ======================= test_reuse  ========================
[03:31:35] [PASSED] 4
[03:31:35] [PASSED] 8
[03:31:35] [PASSED] 32
[03:31:35] [PASSED] 256
[03:31:35] =================== [PASSED] test_reuse ====================
[03:31:35] =================== test_range_overlap  ====================
[03:31:35] [PASSED] 4
[03:31:35] [PASSED] 8
[03:31:35] [PASSED] 32
[03:31:35] [PASSED] 256
[03:31:35] =============== [PASSED] test_range_overlap ================
[03:31:35] =================== test_range_compact  ====================
[03:31:35] [PASSED] 4
[03:31:35] [PASSED] 8
[03:31:35] [PASSED] 32
[03:31:35] [PASSED] 256
[03:31:35] =============== [PASSED] test_range_compact ================
[03:31:35] ==================== test_range_spare  =====================
[03:31:35] [PASSED] 4
[03:31:35] [PASSED] 8
[03:31:35] [PASSED] 32
[03:31:35] [PASSED] 256
[03:31:35] ================ [PASSED] test_range_spare =================
[03:31:35] ===================== [PASSED] guc_dbm =====================
[03:31:35] ================== guc_idm (22 subtests) ===================
[03:31:35] [PASSED] bad_init
[03:31:35] [PASSED] no_init
[03:31:35] [PASSED] init_fini
[03:31:35] [PASSED] check_init_small
[03:31:35] [PASSED] check_init_shared
[03:31:35] [PASSED] check_used
[03:31:35] [PASSED] check_quota
[03:31:35] [PASSED] check_all
[03:31:35] [PASSED] check_limits
[03:31:35] [PASSED] check_overlap
[03:31:35] [PASSED] check_overlap_alloc
[03:31:35] [PASSED] check_overlap_release
[03:31:35] [PASSED] check_overlap_partial_init
[03:31:35] [PASSED] check_overlap_partial_shared_range_blocking
[03:31:35] [PASSED] check_used_usable
[03:31:35] [PASSED] check_used_shareable
[03:31:35] [PASSED] check_used_mixed
[03:31:35] [PASSED] check_release_usable_range
[03:31:35] [PASSED] check_release_shareable_range
[03:31:35] [PASSED] check_split_boundaries
[03:31:35] [PASSED] check_shareable_spare
[03:31:35] [PASSED] check_shareable_spare_fragmented_tail
[03:31:35] ===================== [PASSED] guc_idm =====================
[03:31:35] ============== guc_klv_helpers (13 subtests) ===============
[03:31:35] [PASSED] test_count
[03:31:35] [PASSED] test_encode_u32
[03:31:35] [PASSED] test_encode_u64
[03:31:35] [PASSED] test_encode_string
[03:31:35] [PASSED] test_encode_object_raw
[03:31:35] [PASSED] test_encode_object_klv
[03:31:35] [PASSED] test_encode_object_nested
[03:31:35] [PASSED] test_encode_object_basic
[03:31:35] ===================== test_decode_u16  =====================
[03:31:35] [PASSED] empty
[03:31:35] [PASSED] valid
[03:31:35] [PASSED] max
[03:31:35] [PASSED] big
[03:31:35] [PASSED] long
[03:31:35] ================= [PASSED] test_decode_u16 =================
[03:31:35] ===================== test_decode_u32  =====================
[03:31:35] [PASSED] empty
[03:31:35] [PASSED] valid
[03:31:35] [PASSED] max
[03:31:35] [PASSED] long
[03:31:35] ================= [PASSED] test_decode_u32 =================
[03:31:35] ===================== test_decode_u64  =====================
[03:31:35] [PASSED] empty
[03:31:35] [PASSED] short
[03:31:35] [PASSED] valid
[03:31:35] [PASSED] max
[03:31:35] [PASSED] long
[03:31:35] ================= [PASSED] test_decode_u64 =================
[03:31:35] ===================== test_decode_str  =====================
[03:31:35] [PASSED] empty
[03:31:35] [PASSED] one
[03:31:35] [PASSED] one_trash
[03:31:35] [PASSED] two
[03:31:35] [PASSED] two_trash
[03:31:35] [PASSED] three
[03:31:35] [PASSED] dword
[03:31:35] [PASSED] four
[03:31:35] [PASSED] five
[03:31:35] [PASSED] six
[03:31:35] [PASSED] seven
[03:31:35] [PASSED] qword
[03:31:35] ================= [PASSED] test_decode_str =================
[03:31:35] [PASSED] test_print
[03:31:35] ================= [PASSED] guc_klv_helpers =================
[03:31:35] =================== xe_log (4 subtests) ====================
[03:31:35] [PASSED] demo_cper
[03:31:35] [PASSED] demo_dmesg
[03:31:35] ======================= test_dmesg  ========================
[03:31:35] [PASSED] test_fatal
[03:31:35] [PASSED] test_fatal_tile
[03:31:35] [PASSED] test_fatal_gt
[03:31:35] [PASSED] test_fatal_comp
[03:31:35] [PASSED] test_fatal_comp_tile
[03:31:35] [PASSED] test_fatal_comp_gt
[03:31:35] [PASSED] test_fatal_all
[03:31:35] [PASSED] test_recoverable
[03:31:35] [PASSED] test_recoverable_tile
[03:31:35] [PASSED] test_recoverable_gt
[03:31:35] [PASSED] test_recoverable_comp
[03:31:35] [PASSED] test_recoverable_comp_tile
[03:31:35] [PASSED] test_recoverable_comp_gt
[03:31:35] [PASSED] test_recoverable_all
[03:31:35] [PASSED] test_info
[03:31:35] [PASSED] test_info_tile
[03:31:35] [PASSED] test_info_gt
[03:31:35] [PASSED] test_info_err
[03:31:35] [PASSED] test_info_comp
[03:31:35] [PASSED] test_info_comp_tile
[03:31:35] [PASSED] test_info_comp_gt
[03:31:35] [PASSED] test_info_all
[03:31:35] [PASSED] test_hw_fatal
[03:31:35] [PASSED] test_hw_recoverable
[03:31:35] [PASSED] test_hw_corrected
[03:31:35] [PASSED] test_hw_informational
[03:31:35] =================== [PASSED] test_dmesg ====================
[03:31:35] ====================== test_invalid  =======================
[03:31:35] [SKIPPED] no-component no-location no-warn (requires CONFIG_DRM_XE_DEBUG)
[03:31:35] [SKIPPED] reserved location (requires CONFIG_DRM_XE_DEBUG)
[03:31:35] [SKIPPED] unknown location (requires CONFIG_DRM_XE_DEBUG)
[03:31:35] [SKIPPED] nonzero-device-id location (requires CONFIG_DRM_XE_DEBUG)
[03:31:35] [SKIPPED] invalid-tile-id location (requires CONFIG_DRM_XE_DEBUG)
[03:31:35] [SKIPPED] invalid-gt-id location (requires CONFIG_DRM_XE_DEBUG)
[03:31:35] [SKIPPED] unknown component class (requires CONFIG_DRM_XE_DEBUG)
[03:31:35] [SKIPPED] unknown system component (requires CONFIG_DRM_XE_DEBUG)
[03:31:35] [SKIPPED] unknown hardware component (requires CONFIG_DRM_XE_DEBUG)
[03:31:35] [SKIPPED] unknown component and location (requires CONFIG_DRM_XE_DEBUG)
[03:31:35] ================== [SKIPPED] test_invalid ==================
[03:31:35] ===================== [PASSED] xe_log ======================
[03:31:35] ================== no_relay (3 subtests) ===================
[03:31:35] [PASSED] xe_drops_guc2pf_if_not_ready
[03:31:35] [PASSED] xe_drops_guc2vf_if_not_ready
[03:31:35] [PASSED] xe_rejects_send_if_not_ready
[03:31:35] ==================== [PASSED] no_relay =====================
[03:31:35] ================== pf_relay (14 subtests) ==================
[03:31:35] [PASSED] pf_rejects_guc2pf_too_short
[03:31:35] [PASSED] pf_rejects_guc2pf_too_long
[03:31:35] [PASSED] pf_rejects_guc2pf_no_payload
[03:31:35] [PASSED] pf_fails_no_payload
[03:31:35] [PASSED] pf_fails_bad_origin
[03:31:35] [PASSED] pf_fails_bad_type
[03:31:35] [PASSED] pf_txn_reports_error
[03:31:35] [PASSED] pf_txn_sends_pf2guc
[03:31:35] [PASSED] pf_sends_pf2guc
[03:31:35] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[03:31:35] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[03:31:35] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[03:31:35] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[03:31:35] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[03:31:35] ==================== [PASSED] pf_relay =====================
[03:31:35] ================== vf_relay (3 subtests) ===================
[03:31:35] [PASSED] vf_rejects_guc2vf_too_short
[03:31:35] [PASSED] vf_rejects_guc2vf_too_long
[03:31:35] [PASSED] vf_rejects_guc2vf_no_payload
[03:31:35] ==================== [PASSED] vf_relay =====================
[03:31:35] ================ pf_gt_config (9 subtests) =================
[03:31:35] [PASSED] fair_contexts_1vf
[03:31:35] [PASSED] fair_doorbells_1vf
[03:31:35] [PASSED] fair_ggtt_1vf
[03:31:35] ====================== fair_vram_1vf  ======================
[03:31:35] [PASSED] 3.50 GiB
[03:31:35] [PASSED] 11.5 GiB
[03:31:35] [PASSED] 15.5 GiB
[03:31:35] [PASSED] 31.5 GiB
[03:31:35] [PASSED] 63.5 GiB
[03:31:35] [PASSED] 1.91 GiB
[03:31:35] ================== [PASSED] fair_vram_1vf ==================
[03:31:35] ================ fair_vram_1vf_admin_only  =================
[03:31:35] [PASSED] 3.50 GiB
[03:31:35] [PASSED] 11.5 GiB
[03:31:35] [PASSED] 15.5 GiB
[03:31:35] [PASSED] 31.5 GiB
[03:31:35] [PASSED] 63.5 GiB
[03:31:35] [PASSED] 1.91 GiB
[03:31:35] ============ [PASSED] fair_vram_1vf_admin_only =============
[03:31:35] ====================== fair_contexts  ======================
[03:31:35] [PASSED] 1 VF
[03:31:35] [PASSED] 2 VFs
[03:31:35] [PASSED] 3 VFs
[03:31:35] [PASSED] 4 VFs
[03:31:35] [PASSED] 5 VFs
[03:31:35] [PASSED] 6 VFs
[03:31:35] [PASSED] 7 VFs
[03:31:35] [PASSED] 8 VFs
[03:31:35] [PASSED] 9 VFs
[03:31:35] [PASSED] 10 VFs
[03:31:35] [PASSED] 11 VFs
[03:31:35] [PASSED] 12 VFs
[03:31:35] [PASSED] 13 VFs
[03:31:35] [PASSED] 14 VFs
[03:31:35] [PASSED] 15 VFs
[03:31:35] [PASSED] 16 VFs
[03:31:35] [PASSED] 17 VFs
[03:31:35] [PASSED] 18 VFs
[03:31:35] [PASSED] 19 VFs
[03:31:35] [PASSED] 20 VFs
[03:31:35] [PASSED] 21 VFs
[03:31:35] [PASSED] 22 VFs
[03:31:35] [PASSED] 23 VFs
[03:31:35] [PASSED] 24 VFs
[03:31:35] [PASSED] 25 VFs
[03:31:35] [PASSED] 26 VFs
[03:31:35] [PASSED] 27 VFs
[03:31:35] [PASSED] 28 VFs
[03:31:35] [PASSED] 29 VFs
[03:31:35] [PASSED] 30 VFs
[03:31:35] [PASSED] 31 VFs
[03:31:35] [PASSED] 32 VFs
[03:31:35] [PASSED] 33 VFs
[03:31:35] [PASSED] 34 VFs
[03:31:35] [PASSED] 35 VFs
[03:31:35] [PASSED] 36 VFs
[03:31:35] [PASSED] 37 VFs
[03:31:35] [PASSED] 38 VFs
[03:31:35] [PASSED] 39 VFs
[03:31:35] [PASSED] 40 VFs
[03:31:35] [PASSED] 41 VFs
[03:31:35] [PASSED] 42 VFs
[03:31:35] [PASSED] 43 VFs
[03:31:35] [PASSED] 44 VFs
[03:31:35] [PASSED] 45 VFs
[03:31:35] [PASSED] 46 VFs
[03:31:35] [PASSED] 47 VFs
[03:31:35] [PASSED] 48 VFs
[03:31:35] [PASSED] 49 VFs
[03:31:35] [PASSED] 50 VFs
[03:31:35] [PASSED] 51 VFs
[03:31:35] [PASSED] 52 VFs
[03:31:35] [PASSED] 53 VFs
[03:31:35] [PASSED] 54 VFs
[03:31:35] [PASSED] 55 VFs
[03:31:35] [PASSED] 56 VFs
[03:31:35] [PASSED] 57 VFs
[03:31:35] [PASSED] 58 VFs
[03:31:35] [PASSED] 59 VFs
[03:31:35] [PASSED] 60 VFs
[03:31:35] [PASSED] 61 VFs
[03:31:35] [PASSED] 62 VFs
[03:31:35] [PASSED] 63 VFs
[03:31:35] ================== [PASSED] fair_contexts ==================
[03:31:35] ===================== fair_doorbells  ======================
[03:31:35] [PASSED] 1 VF
[03:31:35] [PASSED] 2 VFs
[03:31:35] [PASSED] 3 VFs
[03:31:35] [PASSED] 4 VFs
[03:31:35] [PASSED] 5 VFs
[03:31:35] [PASSED] 6 VFs
[03:31:35] [PASSED] 7 VFs
[03:31:35] [PASSED] 8 VFs
[03:31:35] [PASSED] 9 VFs
[03:31:35] [PASSED] 10 VFs
[03:31:35] [PASSED] 11 VFs
[03:31:35] [PASSED] 12 VFs
[03:31:35] [PASSED] 13 VFs
[03:31:35] [PASSED] 14 VFs
[03:31:35] [PASSED] 15 VFs
[03:31:35] [PASSED] 16 VFs
[03:31:35] [PASSED] 17 VFs
[03:31:35] [PASSED] 18 VFs
[03:31:35] [PASSED] 19 VFs
[03:31:35] [PASSED] 20 VFs
[03:31:35] [PASSED] 21 VFs
[03:31:35] [PASSED] 22 VFs
[03:31:35] [PASSED] 23 VFs
[03:31:35] [PASSED] 24 VFs
[03:31:35] [PASSED] 25 VFs
[03:31:35] [PASSED] 26 VFs
[03:31:35] [PASSED] 27 VFs
[03:31:35] [PASSED] 28 VFs
[03:31:35] [PASSED] 29 VFs
[03:31:35] [PASSED] 30 VFs
[03:31:35] [PASSED] 31 VFs
[03:31:35] [PASSED] 32 VFs
[03:31:35] [PASSED] 33 VFs
[03:31:35] [PASSED] 34 VFs
[03:31:35] [PASSED] 35 VFs
[03:31:35] [PASSED] 36 VFs
[03:31:35] [PASSED] 37 VFs
[03:31:35] [PASSED] 38 VFs
[03:31:35] [PASSED] 39 VFs
[03:31:35] [PASSED] 40 VFs
[03:31:35] [PASSED] 41 VFs
[03:31:35] [PASSED] 42 VFs
[03:31:35] [PASSED] 43 VFs
[03:31:35] [PASSED] 44 VFs
[03:31:35] [PASSED] 45 VFs
[03:31:35] [PASSED] 46 VFs
[03:31:35] [PASSED] 47 VFs
[03:31:35] [PASSED] 48 VFs
[03:31:35] [PASSED] 49 VFs
[03:31:35] [PASSED] 50 VFs
[03:31:35] [PASSED] 51 VFs
[03:31:35] [PASSED] 52 VFs
[03:31:35] [PASSED] 53 VFs
[03:31:35] [PASSED] 54 VFs
[03:31:35] [PASSED] 55 VFs
[03:31:35] [PASSED] 56 VFs
[03:31:35] [PASSED] 57 VFs
[03:31:35] [PASSED] 58 VFs
[03:31:35] [PASSED] 59 VFs
[03:31:35] [PASSED] 60 VFs
[03:31:35] [PASSED] 61 VFs
[03:31:35] [PASSED] 62 VFs
[03:31:35] [PASSED] 63 VFs
[03:31:35] ================= [PASSED] fair_doorbells ==================
[03:31:35] ======================== fair_ggtt  ========================
[03:31:35] [PASSED] 1 VF
[03:31:35] [PASSED] 2 VFs
[03:31:35] [PASSED] 3 VFs
[03:31:35] [PASSED] 4 VFs
[03:31:35] [PASSED] 5 VFs
[03:31:35] [PASSED] 6 VFs
[03:31:35] [PASSED] 7 VFs
[03:31:35] [PASSED] 8 VFs
[03:31:35] [PASSED] 9 VFs
[03:31:35] [PASSED] 10 VFs
[03:31:35] [PASSED] 11 VFs
[03:31:35] [PASSED] 12 VFs
[03:31:35] [PASSED] 13 VFs
[03:31:35] [PASSED] 14 VFs
[03:31:35] [PASSED] 15 VFs
[03:31:35] [PASSED] 16 VFs
[03:31:35] [PASSED] 17 VFs
[03:31:35] [PASSED] 18 VFs
[03:31:35] [PASSED] 19 VFs
[03:31:35] [PASSED] 20 VFs
[03:31:35] [PASSED] 21 VFs
[03:31:35] [PASSED] 22 VFs
[03:31:35] [PASSED] 23 VFs
[03:31:35] [PASSED] 24 VFs
[03:31:35] [PASSED] 25 VFs
[03:31:35] [PASSED] 26 VFs
[03:31:35] [PASSED] 27 VFs
[03:31:35] [PASSED] 28 VFs
[03:31:35] [PASSED] 29 VFs
[03:31:35] [PASSED] 30 VFs
[03:31:35] [PASSED] 31 VFs
[03:31:35] [PASSED] 32 VFs
[03:31:35] [PASSED] 33 VFs
[03:31:35] [PASSED] 34 VFs
[03:31:35] [PASSED] 35 VFs
[03:31:35] [PASSED] 36 VFs
[03:31:35] [PASSED] 37 VFs
[03:31:35] [PASSED] 38 VFs
[03:31:35] [PASSED] 39 VFs
[03:31:35] [PASSED] 40 VFs
[03:31:35] [PASSED] 41 VFs
[03:31:35] [PASSED] 42 VFs
[03:31:35] [PASSED] 43 VFs
[03:31:35] [PASSED] 44 VFs
[03:31:35] [PASSED] 45 VFs
[03:31:35] [PASSED] 46 VFs
[03:31:35] [PASSED] 47 VFs
[03:31:35] [PASSED] 48 VFs
[03:31:35] [PASSED] 49 VFs
[03:31:35] [PASSED] 50 VFs
[03:31:35] [PASSED] 51 VFs
[03:31:35] [PASSED] 52 VFs
[03:31:35] [PASSED] 53 VFs
[03:31:35] [PASSED] 54 VFs
[03:31:35] [PASSED] 55 VFs
[03:31:35] [PASSED] 56 VFs
[03:31:35] [PASSED] 57 VFs
[03:31:35] [PASSED] 58 VFs
[03:31:35] [PASSED] 59 VFs
[03:31:35] [PASSED] 60 VFs
[03:31:35] [PASSED] 61 VFs
[03:31:35] [PASSED] 62 VFs
[03:31:35] [PASSED] 63 VFs
[03:31:35] ==================== [PASSED] fair_ggtt ====================
[03:31:35] ======================== fair_vram  ========================
[03:31:35] [PASSED] 1 VF
[03:31:35] [PASSED] 2 VFs
[03:31:35] [PASSED] 3 VFs
[03:31:35] [PASSED] 4 VFs
[03:31:35] [PASSED] 5 VFs
[03:31:35] [PASSED] 6 VFs
[03:31:35] [PASSED] 7 VFs
[03:31:35] [PASSED] 8 VFs
[03:31:35] [PASSED] 9 VFs
[03:31:35] [PASSED] 10 VFs
[03:31:35] [PASSED] 11 VFs
[03:31:35] [PASSED] 12 VFs
[03:31:35] [PASSED] 13 VFs
[03:31:35] [PASSED] 14 VFs
[03:31:35] [PASSED] 15 VFs
[03:31:35] [PASSED] 16 VFs
[03:31:35] [PASSED] 17 VFs
[03:31:35] [PASSED] 18 VFs
[03:31:35] [PASSED] 19 VFs
[03:31:35] [PASSED] 20 VFs
[03:31:35] [PASSED] 21 VFs
[03:31:35] [PASSED] 22 VFs
[03:31:35] [PASSED] 23 VFs
[03:31:35] [PASSED] 24 VFs
[03:31:35] [PASSED] 25 VFs
[03:31:35] [PASSED] 26 VFs
[03:31:35] [PASSED] 27 VFs
[03:31:35] [PASSED] 28 VFs
[03:31:35] [PASSED] 29 VFs
[03:31:35] [PASSED] 30 VFs
[03:31:35] [PASSED] 31 VFs
[03:31:35] [PASSED] 32 VFs
[03:31:35] [PASSED] 33 VFs
[03:31:35] [PASSED] 34 VFs
[03:31:35] [PASSED] 35 VFs
[03:31:35] [PASSED] 36 VFs
[03:31:35] [PASSED] 37 VFs
[03:31:35] [PASSED] 38 VFs
[03:31:35] [PASSED] 39 VFs
[03:31:35] [PASSED] 40 VFs
[03:31:35] [PASSED] 41 VFs
[03:31:35] [PASSED] 42 VFs
[03:31:35] [PASSED] 43 VFs
[03:31:35] [PASSED] 44 VFs
[03:31:35] [PASSED] 45 VFs
[03:31:35] [PASSED] 46 VFs
[03:31:35] [PASSED] 47 VFs
[03:31:35] [PASSED] 48 VFs
[03:31:35] [PASSED] 49 VFs
[03:31:35] [PASSED] 50 VFs
[03:31:35] [PASSED] 51 VFs
[03:31:35] [PASSED] 52 VFs
[03:31:35] [PASSED] 53 VFs
[03:31:35] [PASSED] 54 VFs
[03:31:35] [PASSED] 55 VFs
[03:31:35] [PASSED] 56 VFs
[03:31:35] [PASSED] 57 VFs
[03:31:35] [PASSED] 58 VFs
[03:31:35] [PASSED] 59 VFs
[03:31:35] [PASSED] 60 VFs
[03:31:35] [PASSED] 61 VFs
[03:31:35] [PASSED] 62 VFs
[03:31:35] [PASSED] 63 VFs
[03:31:35] ==================== [PASSED] fair_vram ====================
[03:31:35] ================== [PASSED] pf_gt_config ===================
[03:31:35] ===================== lmtt (1 subtest) =====================
[03:31:35] ======================== test_ops  =========================
[03:31:35] [PASSED] 2-level
[03:31:35] [PASSED] multi-level
[03:31:35] ==================== [PASSED] test_ops =====================
[03:31:35] ====================== [PASSED] lmtt =======================
[03:31:35] ================= sriov_packet (1 subtest) =================
[03:31:35] [PASSED] test_descriptor_init
[03:31:35] ================== [PASSED] sriov_packet ===================
[03:31:35] ================= pf_service (11 subtests) =================
[03:31:35] [PASSED] pf_negotiate_any
[03:31:35] [PASSED] pf_negotiate_base_match
[03:31:35] [PASSED] pf_negotiate_base_newer
[03:31:35] [PASSED] pf_negotiate_base_next
[03:31:35] [SKIPPED] pf_negotiate_base_older (no older minor)
[03:31:35] [PASSED] pf_negotiate_base_prev
[03:31:35] [PASSED] pf_negotiate_latest_match
[03:31:35] [PASSED] pf_negotiate_latest_newer
[03:31:35] [PASSED] pf_negotiate_latest_next
[03:31:35] [SKIPPED] pf_negotiate_latest_older (no older minor)
[03:31:35] [SKIPPED] pf_negotiate_latest_prev (no prev major)
[03:31:35] =================== [PASSED] pf_service ====================
[03:31:35] ================= xe_guc_g2g (2 subtests) ==================
[03:31:35] ============== xe_live_guc_g2g_kunit_default  ==============
[03:31:35] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[03:31:35] ============== xe_live_guc_g2g_kunit_allmem  ===============
[03:31:35] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[03:31:35] =================== [SKIPPED] xe_guc_g2g ===================
[03:31:35] =================== xe_mocs (2 subtests) ===================
[03:31:35] ================ xe_live_mocs_kernel_kunit  ================
[03:31:35] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[03:31:35] ================ xe_live_mocs_reset_kunit  =================
[03:31:35] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[03:31:35] ==================== [SKIPPED] xe_mocs =====================
[03:31:35] ================= xe_migrate (2 subtests) ==================
[03:31:35] ================= xe_migrate_sanity_kunit  =================
[03:31:35] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[03:31:35] ================== xe_validate_ccs_kunit  ==================
[03:31:35] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[03:31:35] =================== [SKIPPED] xe_migrate ===================
[03:31:35] ================== xe_dma_buf (1 subtest) ==================
[03:31:35] ==================== xe_dma_buf_kunit  =====================
[03:31:35] ================ [SKIPPED] xe_dma_buf_kunit ================
[03:31:35] =================== [SKIPPED] xe_dma_buf ===================
[03:31:35] ================= xe_bo_shrink (1 subtest) =================
[03:31:35] =================== xe_bo_shrink_kunit  ====================
[03:31:35] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[03:31:35] ================== [SKIPPED] xe_bo_shrink ==================
[03:31:35] ==================== xe_bo (2 subtests) ====================
[03:31:35] ================== xe_ccs_migrate_kunit  ===================
[03:31:35] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[03:31:35] ==================== xe_bo_evict_kunit  ====================
[03:31:35] =============== [SKIPPED] xe_bo_evict_kunit ================
[03:31:35] ===================== [SKIPPED] xe_bo ======================
[03:31:35] =================== xe_any (9 subtests) ====================
[03:31:35] [PASSED] test_to_xe
[03:31:35] [PASSED] test_to_dev
[03:31:35] [PASSED] test_to_pdev
[03:31:35] [PASSED] test_to_drm
[03:31:35] [PASSED] test_if_pdev
[03:31:35] [PASSED] test_if_xe
[03:31:35] [PASSED] test_if_tile
[03:31:35] [PASSED] test_if_gt
[03:31:35] [PASSED] test_to_id
[03:31:35] ===================== [PASSED] xe_any ======================
[03:31:35] ==================== args (13 subtests) ====================
[03:31:35] [PASSED] count_args_test
[03:31:35] [PASSED] call_args_example
[03:31:35] [PASSED] call_args_test
[03:31:35] [PASSED] drop_first_arg_example
[03:31:35] [PASSED] drop_first_arg_test
[03:31:35] [PASSED] first_arg_example
[03:31:35] [PASSED] first_arg_test
[03:31:35] [PASSED] last_arg_example
[03:31:35] [PASSED] last_arg_test
[03:31:35] [PASSED] pick_arg_example
[03:31:35] [PASSED] if_args_example
[03:31:35] [PASSED] if_args_test
[03:31:35] [PASSED] sep_comma_example
[03:31:35] ====================== [PASSED] args =======================
[03:31:35] =================== xe_pci (3 subtests) ====================
[03:31:35] ==================== check_graphics_ip  ====================
[03:31:35] [PASSED] 12.00 Xe_LP
[03:31:35] [PASSED] 12.10 Xe_LP+
[03:31:35] [PASSED] 12.55 Xe_HPG
[03:31:35] [PASSED] 12.60 Xe_HPC
[03:31:35] [PASSED] 12.70 Xe_LPG
[03:31:35] [PASSED] 12.71 Xe_LPG
[03:31:35] [PASSED] 12.74 Xe_LPG+
[03:31:35] [PASSED] 20.01 Xe2_HPG
[03:31:35] [PASSED] 20.02 Xe2_HPG
[03:31:35] [PASSED] 20.04 Xe2_LPG
[03:31:35] [PASSED] 30.00 Xe3_LPG
[03:31:35] [PASSED] 30.01 Xe3_LPG
[03:31:35] [PASSED] 30.03 Xe3_LPG
[03:31:35] [PASSED] 30.04 Xe3_LPG
[03:31:35] [PASSED] 30.05 Xe3_LPG
[03:31:35] [PASSED] 35.10 Xe3p_LPG
[03:31:35] [PASSED] 35.11 Xe3p_XPC
[03:31:35] ================ [PASSED] check_graphics_ip ================
[03:31:35] ===================== check_media_ip  ======================
[03:31:35] [PASSED] 12.00 Xe_M
[03:31:35] [PASSED] 12.55 Xe_HPM
[03:31:35] [PASSED] 13.00 Xe_LPM+
[03:31:35] [PASSED] 13.01 Xe2_HPM
[03:31:35] [PASSED] 20.00 Xe2_LPM
[03:31:35] [PASSED] 30.00 Xe3_LPM
[03:31:35] [PASSED] 30.02 Xe3_LPM
[03:31:35] [PASSED] 35.00 Xe3p_LPM
[03:31:35] [PASSED] 35.03 Xe3p_HPM
[03:31:35] ================= [PASSED] check_media_ip ==================
[03:31:35] =================== check_platform_desc  ===================
[03:31:35] [PASSED] 0x9A60 (TIGERLAKE)
[03:31:35] [PASSED] 0x9A68 (TIGERLAKE)
[03:31:35] [PASSED] 0x9A70 (TIGERLAKE)
[03:31:35] [PASSED] 0x9A40 (TIGERLAKE)
[03:31:35] [PASSED] 0x9A49 (TIGERLAKE)
[03:31:35] [PASSED] 0x9A59 (TIGERLAKE)
[03:31:35] [PASSED] 0x9A78 (TIGERLAKE)
[03:31:35] [PASSED] 0x9AC0 (TIGERLAKE)
[03:31:35] [PASSED] 0x9AC9 (TIGERLAKE)
[03:31:35] [PASSED] 0x9AD9 (TIGERLAKE)
[03:31:35] [PASSED] 0x9AF8 (TIGERLAKE)
[03:31:35] [PASSED] 0x4C80 (ROCKETLAKE)
[03:31:35] [PASSED] 0x4C8A (ROCKETLAKE)
[03:31:35] [PASSED] 0x4C8B (ROCKETLAKE)
[03:31:35] [PASSED] 0x4C8C (ROCKETLAKE)
[03:31:35] [PASSED] 0x4C90 (ROCKETLAKE)
[03:31:35] [PASSED] 0x4C9A (ROCKETLAKE)
[03:31:35] [PASSED] 0x4680 (ALDERLAKE_S)
[03:31:35] [PASSED] 0x4682 (ALDERLAKE_S)
[03:31:35] [PASSED] 0x4688 (ALDERLAKE_S)
[03:31:35] [PASSED] 0x468A (ALDERLAKE_S)
[03:31:35] [PASSED] 0x468B (ALDERLAKE_S)
[03:31:35] [PASSED] 0x4690 (ALDERLAKE_S)
[03:31:35] [PASSED] 0x4692 (ALDERLAKE_S)
[03:31:35] [PASSED] 0x4693 (ALDERLAKE_S)
[03:31:35] [PASSED] 0x46A0 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46A1 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46A2 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46A3 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46A6 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46A8 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46AA (ALDERLAKE_P)
[03:31:35] [PASSED] 0x462A (ALDERLAKE_P)
[03:31:35] [PASSED] 0x4626 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x4628 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46B0 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46B1 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46B2 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46B3 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46C0 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46C1 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46C2 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46C3 (ALDERLAKE_P)
[03:31:35] [PASSED] 0x46D0 (ALDERLAKE_N)
[03:31:35] [PASSED] 0x46D1 (ALDERLAKE_N)
[03:31:35] [PASSED] 0x46D2 (ALDERLAKE_N)
[03:31:35] [PASSED] 0x46D3 (ALDERLAKE_N)
[03:31:35] [PASSED] 0x46D4 (ALDERLAKE_N)
[03:31:35] [PASSED] 0xA721 (ALDERLAKE_P)
[03:31:35] [PASSED] 0xA7A1 (ALDERLAKE_P)
[03:31:35] [PASSED] 0xA7A9 (ALDERLAKE_P)
[03:31:35] [PASSED] 0xA7AC (ALDERLAKE_P)
[03:31:35] [PASSED] 0xA7AD (ALDERLAKE_P)
[03:31:35] [PASSED] 0xA720 (ALDERLAKE_P)
[03:31:35] [PASSED] 0xA7A0 (ALDERLAKE_P)
[03:31:35] [PASSED] 0xA7A8 (ALDERLAKE_P)
[03:31:35] [PASSED] 0xA7AA (ALDERLAKE_P)
[03:31:35] [PASSED] 0xA7AB (ALDERLAKE_P)
[03:31:35] [PASSED] 0xA780 (ALDERLAKE_S)
[03:31:35] [PASSED] 0xA781 (ALDERLAKE_S)
[03:31:35] [PASSED] 0xA782 (ALDERLAKE_S)
[03:31:35] [PASSED] 0xA783 (ALDERLAKE_S)
[03:31:35] [PASSED] 0xA788 (ALDERLAKE_S)
[03:31:35] [PASSED] 0xA789 (ALDERLAKE_S)
[03:31:35] [PASSED] 0xA78A (ALDERLAKE_S)
[03:31:35] [PASSED] 0xA78B (ALDERLAKE_S)
[03:31:35] [PASSED] 0x4905 (DG1)
[03:31:35] [PASSED] 0x4906 (DG1)
[03:31:35] [PASSED] 0x4907 (DG1)
[03:31:35] [PASSED] 0x4908 (DG1)
[03:31:35] [PASSED] 0x4909 (DG1)
[03:31:35] [PASSED] 0x56C0 (DG2)
[03:31:35] [PASSED] 0x56C2 (DG2)
[03:31:35] [PASSED] 0x56C1 (DG2)
[03:31:35] [PASSED] 0x7D51 (METEORLAKE)
[03:31:35] [PASSED] 0x7DD1 (METEORLAKE)
[03:31:35] [PASSED] 0x7D41 (METEORLAKE)
[03:31:35] [PASSED] 0x7D67 (METEORLAKE)
[03:31:35] [PASSED] 0xB640 (METEORLAKE)
[03:31:35] [PASSED] 0x56A0 (DG2)
[03:31:35] [PASSED] 0x56A1 (DG2)
[03:31:35] [PASSED] 0x56A2 (DG2)
[03:31:35] [PASSED] 0x56BE (DG2)
[03:31:35] [PASSED] 0x56BF (DG2)
[03:31:35] [PASSED] 0x5690 (DG2)
[03:31:35] [PASSED] 0x5691 (DG2)
[03:31:35] [PASSED] 0x5692 (DG2)
[03:31:35] [PASSED] 0x56A5 (DG2)
[03:31:35] [PASSED] 0x56A6 (DG2)
[03:31:35] [PASSED] 0x56B0 (DG2)
[03:31:35] [PASSED] 0x56B1 (DG2)
[03:31:35] [PASSED] 0x56BA (DG2)
[03:31:35] [PASSED] 0x56BB (DG2)
[03:31:35] [PASSED] 0x56BC (DG2)
[03:31:35] [PASSED] 0x56BD (DG2)
[03:31:35] [PASSED] 0x5693 (DG2)
[03:31:35] [PASSED] 0x5694 (DG2)
[03:31:35] [PASSED] 0x5695 (DG2)
[03:31:35] [PASSED] 0x56A3 (DG2)
[03:31:35] [PASSED] 0x56A4 (DG2)
[03:31:35] [PASSED] 0x56B2 (DG2)
[03:31:35] [PASSED] 0x56B3 (DG2)
[03:31:35] [PASSED] 0x5696 (DG2)
[03:31:35] [PASSED] 0x5697 (DG2)
[03:31:35] [PASSED] 0xB69 (PVC)
[03:31:35] [PASSED] 0xB6E (PVC)
[03:31:35] [PASSED] 0xBD4 (PVC)
[03:31:35] [PASSED] 0xBD5 (PVC)
[03:31:35] [PASSED] 0xBD6 (PVC)
[03:31:35] [PASSED] 0xBD7 (PVC)
[03:31:35] [PASSED] 0xBD8 (PVC)
[03:31:35] [PASSED] 0xBD9 (PVC)
[03:31:35] [PASSED] 0xBDA (PVC)
[03:31:35] [PASSED] 0xBDB (PVC)
[03:31:35] [PASSED] 0xBE0 (PVC)
[03:31:35] [PASSED] 0xBE1 (PVC)
[03:31:35] [PASSED] 0xBE5 (PVC)
[03:31:35] [PASSED] 0x7D40 (METEORLAKE)
[03:31:35] [PASSED] 0x7D45 (METEORLAKE)
[03:31:35] [PASSED] 0x7D55 (METEORLAKE)
[03:31:35] [PASSED] 0x7D60 (METEORLAKE)
[03:31:35] [PASSED] 0x7DD5 (METEORLAKE)
[03:31:35] [PASSED] 0x6420 (LUNARLAKE)
[03:31:35] [PASSED] 0x64A0 (LUNARLAKE)
[03:31:35] [PASSED] 0x64B0 (LUNARLAKE)
[03:31:35] [PASSED] 0xE202 (BATTLEMAGE)
[03:31:35] [PASSED] 0xE209 (BATTLEMAGE)
[03:31:35] [PASSED] 0xE20B (BATTLEMAGE)
[03:31:35] [PASSED] 0xE20C (BATTLEMAGE)
[03:31:35] [PASSED] 0xE20D (BATTLEMAGE)
[03:31:35] [PASSED] 0xE210 (BATTLEMAGE)
[03:31:35] [PASSED] 0xE211 (BATTLEMAGE)
[03:31:35] [PASSED] 0xE212 (BATTLEMAGE)
[03:31:35] [PASSED] 0xE216 (BATTLEMAGE)
[03:31:35] [PASSED] 0xE220 (BATTLEMAGE)
[03:31:35] [PASSED] 0xE221 (BATTLEMAGE)
[03:31:35] [PASSED] 0xE222 (BATTLEMAGE)
[03:31:35] [PASSED] 0xE223 (BATTLEMAGE)
[03:31:35] [PASSED] 0xB080 (PANTHERLAKE)
[03:31:35] [PASSED] 0xB081 (PANTHERLAKE)
[03:31:35] [PASSED] 0xB082 (PANTHERLAKE)
[03:31:35] [PASSED] 0xB083 (PANTHERLAKE)
[03:31:35] [PASSED] 0xB084 (PANTHERLAKE)
[03:31:35] [PASSED] 0xB085 (PANTHERLAKE)
[03:31:35] [PASSED] 0xB086 (PANTHERLAKE)
[03:31:35] [PASSED] 0xB087 (PANTHERLAKE)
[03:31:35] [PASSED] 0xB08F (PANTHERLAKE)
[03:31:35] [PASSED] 0xB090 (PANTHERLAKE)
[03:31:35] [PASSED] 0xB0A0 (PANTHERLAKE)
[03:31:35] [PASSED] 0xB0A1 (PANTHERLAKE)
[03:31:35] [PASSED] 0xB0B0 (PANTHERLAKE)
[03:31:35] [PASSED] 0xFD80 (PANTHERLAKE)
[03:31:35] [PASSED] 0xFD81 (PANTHERLAKE)
[03:31:35] [PASSED] 0xD740 (NOVALAKE_S)
[03:31:35] [PASSED] 0xD741 (NOVALAKE_S)
[03:31:35] [PASSED] 0xD742 (NOVALAKE_S)
[03:31:35] [PASSED] 0xD743 (NOVALAKE_S)
[03:31:35] [PASSED] 0xD745 (NOVALAKE_S)
[03:31:35] [PASSED] 0xD74A (NOVALAKE_S)
[03:31:35] [PASSED] 0xD74B (NOVALAKE_S)
[03:31:35] [PASSED] 0x674C (CRESCENTISLAND)
[03:31:35] [PASSED] 0x674D (CRESCENTISLAND)
[03:31:35] [PASSED] 0x674E (CRESCENTISLAND)
[03:31:35] [PASSED] 0x674F (CRESCENTISLAND)
[03:31:35] [PASSED] 0x6750 (CRESCENTISLAND)
[03:31:35] [PASSED] 0x6751 (CRESCENTISLAND)
[03:31:35] [PASSED] 0xD750 (NOVALAKE_P)
[03:31:35] [PASSED] 0xD751 (NOVALAKE_P)
[03:31:35] [PASSED] 0xD752 (NOVALAKE_P)
[03:31:35] [PASSED] 0xD753 (NOVALAKE_P)
[03:31:35] [PASSED] 0xD754 (NOVALAKE_P)
[03:31:35] [PASSED] 0xD755 (NOVALAKE_P)
[03:31:35] [PASSED] 0xD756 (NOVALAKE_P)
[03:31:35] [PASSED] 0xD757 (NOVALAKE_P)
[03:31:35] [PASSED] 0xD75F (NOVALAKE_P)
[03:31:35] =============== [PASSED] check_platform_desc ===============
[03:31:35] ===================== [PASSED] xe_pci ======================
[03:31:35] ============= xe_rtp_tables_test (5 subtests) ==============
[03:31:35] ================== xe_rtp_table_gt_test  ===================
[03:31:35] [PASSED] gt_was/14011060649
[03:31:35] [PASSED] gt_was/14011059788
[03:31:35] [PASSED] gt_was/14015795083
[03:31:35] [PASSED] gt_was/16021867713
[03:31:35] [PASSED] gt_was/14019449301
[03:31:35] [PASSED] gt_was/16028005424
[03:31:35] [PASSED] gt_was/14026578760
[03:31:35] [PASSED] gt_was/1409420604
[03:31:35] [PASSED] gt_was/1408615072
[03:31:35] [PASSED] gt_was/22010523718
[03:31:35] [PASSED] gt_was/14011006942
[03:31:35] [PASSED] gt_was/14014830051
[03:31:35] [PASSED] gt_was/18018781329
[03:31:35] [PASSED] gt_was/1509235366
[03:31:35] [PASSED] gt_was/18018781329
[03:31:35] [PASSED] gt_was/16016694945
[03:31:35] [PASSED] gt_was/14018575942
[03:31:35] [PASSED] gt_was/22016670082
[03:31:35] [PASSED] gt_was/22016670082
[03:31:35] [PASSED] gt_was/14017421178
[03:31:35] [PASSED] gt_was/16025250150
[03:31:35] [PASSED] gt_was/14021871409
[03:31:35] [PASSED] gt_was/16021865536
[03:31:35] [PASSED] gt_was/14021486841
[03:31:35] [PASSED] gt_was/14025160223
[03:31:35] [PASSED] gt_was/14026144927, 16029437861, 14026127056
[03:31:35] [PASSED] gt_was/14025635424
[03:31:35] [PASSED] gt_was/16028005424
[03:31:35] ============== [PASSED] xe_rtp_table_gt_test ===============
[03:31:35] ================== xe_rtp_table_gt_test  ===================
[03:31:35] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[03:31:35] [PASSED] gt_tunings/Tuning: 32B Access Enable
[03:31:35] [PASSED] gt_tunings/Tuning: L3 cache
[03:31:35] [PASSED] gt_tunings/Tuning: L3 cache - media
[03:31:35] [PASSED] gt_tunings/Tuning: Compression Overfetch
[03:31:35] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[03:31:35] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[03:31:35] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[03:31:35] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[03:31:35] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[03:31:35] [PASSED] gt_tunings/Tuning: Stateless compression control
[03:31:35] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[03:31:35] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[03:31:35] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[03:31:35] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[03:31:35] [PASSED] gt_tunings/Tuning: Force All Non-Compressible Memory Reads to be 256B Overfetches
[03:31:35] ============== [PASSED] xe_rtp_table_gt_test ===============
[03:31:35] ================== xe_rtp_table_oob_test  ==================
[03:31:35] [PASSED] oob_was/1607983814
[03:31:35] [PASSED] oob_was/16010904313
[03:31:35] [PASSED] oob_was/18022495364
[03:31:35] [PASSED] oob_was/22012773006
[03:31:35] [PASSED] oob_was/14014475959
[03:31:35] [PASSED] oob_was/22011391025
[03:31:35] [PASSED] oob_was/22012727170
[03:31:35] [PASSED] oob_was/22012727685
[03:31:35] [PASSED] oob_was/22016596838
[03:31:35] [PASSED] oob_was/18020744125
[03:31:35] [PASSED] oob_was/1409600907
[03:31:35] [PASSED] oob_was/22014953428
[03:31:35] [PASSED] oob_was/16017236439
[03:31:35] [PASSED] oob_was/14019821291
[03:31:35] [PASSED] oob_was/14015076503
[03:31:35] [PASSED] oob_was/22016122933
[03:31:35] [PASSED] oob_was/14018913170
[03:31:35] [PASSED] oob_was/14018094691
[03:31:35] [PASSED] oob_was/18024947630
[03:31:35] [PASSED] oob_was/16022287689
[03:31:35] [PASSED] oob_was/13011645652
[03:31:35] [PASSED] oob_was/14022293748
[03:31:35] [PASSED] oob_was/22019794406
[03:31:35] [PASSED] oob_was/22019338487
[03:31:35] [PASSED] oob_was/16023588340
[03:31:35] [PASSED] oob_was/14019789679
[03:31:35] [PASSED] oob_was/14022866841
[03:31:35] [PASSED] oob_was/16021333562
[03:31:35] [PASSED] oob_was/14016712196
[03:31:35] [PASSED] oob_was/14015568240
[03:31:35] [PASSED] oob_was/18013179988
[03:31:35] [PASSED] oob_was/1508761755
[03:31:35] [PASSED] oob_was/16023105232
[03:31:35] [PASSED] oob_was/16026508708
[03:31:35] [PASSED] oob_was/14020001231
[03:31:35] [PASSED] oob_was/16023683509
[03:31:35] [PASSED] oob_was/14025515070
[03:31:35] [PASSED] oob_was/15015404425_disable
[03:31:35] [PASSED] oob_was/16026007364
[03:31:35] [PASSED] oob_was/14020316580
[03:31:35] [PASSED] oob_was/14025883347
[03:31:35] [PASSED] oob_was/16029380221
[03:31:35] [PASSED] oob_was/22022079272
[03:31:35] [PASSED] oob_was/16029897822
[03:31:35] [PASSED] oob_was/14027054324
[03:31:35] [PASSED] oob_was/14025941587
[03:31:35] [PASSED] oob_was/16030224309
[03:31:35] ============== [PASSED] xe_rtp_table_oob_test ==============
[03:31:35] ================ xe_rtp_table_dev_oob_test  ================
[03:31:35] [PASSED] device_oob_was/22010954014
[03:31:35] [PASSED] device_oob_was/15015404425
[03:31:35] [PASSED] device_oob_was/22019338487_display
[03:31:35] [PASSED] device_oob_was/14022085890
[03:31:35] [PASSED] device_oob_was/14026539277
[03:31:35] [PASSED] device_oob_was/14026633728
[03:31:35] [PASSED] device_oob_was/14026746987
[03:31:35] [PASSED] device_oob_was/14026779378
[03:31:35] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[03:31:35] ========== xe_rtp_table_missing_upper_bound_test  ==========
[03:31:35] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865
[03:31:35] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037
[03:31:35] [PASSED] register_whitelist/1806527549
[03:31:35] [PASSED] register_whitelist/allow_read_ctx_timestamp
[03:31:35] [PASSED] register_whitelist/allow_read_queue_timestamp
[03:31:35] [PASSED] register_whitelist/16014440446
[03:31:35] [PASSED] register_whitelist/16017236439
[03:31:35] [PASSED] register_whitelist/16020183090
[03:31:35] [PASSED] register_whitelist/14024997852
[03:31:35] [PASSED] register_whitelist/14024997852
[03:31:35] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ======
[03:31:35] =============== [PASSED] xe_rtp_tables_test ================
[03:31:35] =================== xe_rtp (3 subtests) ====================
[03:31:35] =================== xe_rtp_rules_tests  ====================
[03:31:35] [PASSED] no
[03:31:35] [PASSED] yes
[03:31:35] [PASSED] no-and-no
[03:31:35] [PASSED] no-and-yes
[03:31:35] [PASSED] yes-and-no
[03:31:35] [PASSED] yes-and-yes
[03:31:35] [PASSED] no-or-no
[03:31:35] [PASSED] no-or-yes
[03:31:35] [PASSED] yes-or-no
[03:31:35] [PASSED] yes-or-yes
[03:31:35] [PASSED] no-yes-or-yes-no
[03:31:35] [PASSED] no-yes-or-yes-yes
[03:31:35] [PASSED] yes-yes-or-no-yes
[03:31:35] [PASSED] yes-yes-or-yes-yes
[03:31:35] [PASSED] no-no-or-yes-or-no
[03:31:35] [PASSED] or
[03:31:35] [PASSED] or-yes
[03:31:35] [PASSED] or-no
[03:31:35] [PASSED] yes-or
[03:31:35] [PASSED] no-or
[03:31:35] [PASSED] no-or-or-yes
[03:31:35] [PASSED] yes-or-or-no
[03:31:35] [PASSED] no-or-or-no
[03:31:35] [PASSED] missing-context-engine-class
[03:31:35] [PASSED] missing-context-engine-class-or-yes
[03:31:35] [PASSED] missing-context-engine-class-or-or-yes
[03:31:35] =============== [PASSED] xe_rtp_rules_tests ================
[03:31:35] =============== xe_rtp_process_to_sr_tests  ================
[03:31:35] [PASSED] coalesce-same-reg
[03:31:35] [PASSED] coalesce-same-reg-literal-and-func
[03:31:35] [PASSED] no-match-no-add
[03:31:35] [PASSED] two-regs-two-entries
[03:31:35] [PASSED] clr-one-set-other
[03:31:35] [PASSED] set-field
[03:31:35] [PASSED] conflict-duplicate
[03:31:35] [PASSED] conflict-not-disjoint
[03:31:35] [PASSED] conflict-not-disjoint-literal-and-func
[03:31:35] [PASSED] conflict-reg-type
[03:31:35] [PASSED] bad-mcr-reg-forced-to-regular
[03:31:36] [PASSED] bad-regular-reg-forced-to-mcr
[03:31:36] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[03:31:36] ================== xe_rtp_process_tests  ===================
[03:31:36] [PASSED] active1
[03:31:36] [PASSED] active2
[03:31:36] [PASSED] active-inactive
[03:31:36] [PASSED] inactive-active
[03:31:36] [PASSED] inactive-active-inactive
[03:31:36] [PASSED] inactive-inactive-inactive
[03:31:36] ============== [PASSED] xe_rtp_process_tests ===============
[03:31:36] ===================== [PASSED] xe_rtp ======================
[03:31:36] ==================== xe_wa (1 subtest) =====================
[03:31:36] ======================== xe_wa_gt  =========================
[03:31:36] [PASSED] TIGERLAKE B0
[03:31:36] [PASSED] DG1 A0
[03:31:36] [PASSED] DG1 B0
[03:31:36] [PASSED] ALDERLAKE_S A0
[03:31:36] [PASSED] ALDERLAKE_S B0
[03:31:36] [PASSED] ALDERLAKE_S C0
[03:31:36] [PASSED] ALDERLAKE_S D0
[03:31:36] [PASSED] ALDERLAKE_P A0
[03:31:36] [PASSED] ALDERLAKE_P B0
[03:31:36] [PASSED] ALDERLAKE_P C0
[03:31:36] [PASSED] ALDERLAKE_S RPLS D0
[03:31:36] [PASSED] ALDERLAKE_P RPLU E0
[03:31:36] [PASSED] DG2 G10 C0
[03:31:36] [PASSED] DG2 G11 B1
[03:31:36] [PASSED] DG2 G12 A1
[03:31:36] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[03:31:36] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[03:31:36] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[03:31:36] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[03:31:36] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[03:31:36] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[03:31:36] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[03:31:36] ==================== [PASSED] xe_wa_gt =====================
[03:31:36] ====================== [PASSED] xe_wa ======================
[03:31:36] ============================================================
[03:31:36] Testing complete. Ran 837 tests: passed: 809, skipped: 28
[03:31:36] Elapsed time: 41.247s total, 1.829s configuring, 38.652s building, 0.737s running

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

+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[03:32:03] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[03:32:05] 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
[03:32:16] Starting KUnit Kernel (1/1)...
[03:32:16] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[03:32:16] ================= ttm_device (5 subtests) ==================
[03:32:16] [PASSED] ttm_device_init_basic
[03:32:16] [PASSED] ttm_device_init_multiple
[03:32:16] [PASSED] ttm_device_fini_basic
[03:32:16] [PASSED] ttm_device_init_no_vma_man
[03:32:16] ================== ttm_device_init_pools  ==================
[03:32:16] [PASSED] No DMA allocations, no DMA32 required
[03:32:16] [PASSED] DMA allocations, DMA32 required
[03:32:16] [PASSED] No DMA allocations, DMA32 required
[03:32:16] [PASSED] DMA allocations, no DMA32 required
[03:32:16] ============== [PASSED] ttm_device_init_pools ==============
[03:32:16] =================== [PASSED] ttm_device ====================
[03:32:16] ================== ttm_pool (8 subtests) ===================
[03:32:16] ================== ttm_pool_alloc_basic  ===================
[03:32:16] [PASSED] One page
[03:32:16] [PASSED] More than one page
[03:32:16] [PASSED] Above the allocation limit
[03:32:16] [PASSED] One page, with coherent DMA mappings enabled
[03:32:16] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[03:32:16] ============== [PASSED] ttm_pool_alloc_basic ===============
[03:32:16] ============== ttm_pool_alloc_basic_dma_addr  ==============
[03:32:16] [PASSED] One page
[03:32:16] [PASSED] More than one page
[03:32:16] [PASSED] Above the allocation limit
[03:32:16] [PASSED] One page, with coherent DMA mappings enabled
[03:32:16] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[03:32:16] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[03:32:16] [PASSED] ttm_pool_alloc_order_caching_match
[03:32:16] [PASSED] ttm_pool_alloc_caching_mismatch
[03:32:16] [PASSED] ttm_pool_alloc_order_mismatch
[03:32:16] [PASSED] ttm_pool_free_dma_alloc
[03:32:16] [PASSED] ttm_pool_free_no_dma_alloc
[03:32:16] [PASSED] ttm_pool_fini_basic
[03:32:16] ==================== [PASSED] ttm_pool =====================
[03:32:16] ================ ttm_resource (8 subtests) =================
[03:32:16] ================= ttm_resource_init_basic  =================
[03:32:16] [PASSED] Init resource in TTM_PL_SYSTEM
[03:32:16] [PASSED] Init resource in TTM_PL_VRAM
[03:32:16] [PASSED] Init resource in a private placement
[03:32:16] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[03:32:16] ============= [PASSED] ttm_resource_init_basic =============
[03:32:16] [PASSED] ttm_resource_init_pinned
[03:32:16] [PASSED] ttm_resource_fini_basic
[03:32:16] [PASSED] ttm_resource_manager_init_basic
[03:32:16] [PASSED] ttm_resource_manager_usage_basic
[03:32:16] [PASSED] ttm_resource_manager_set_used_basic
[03:32:16] [PASSED] ttm_sys_man_alloc_basic
[03:32:16] [PASSED] ttm_sys_man_free_basic
[03:32:16] ================== [PASSED] ttm_resource ===================
[03:32:16] =================== ttm_tt (15 subtests) ===================
[03:32:16] ==================== ttm_tt_init_basic  ====================
[03:32:16] [PASSED] Page-aligned size
[03:32:16] [PASSED] Extra pages requested
[03:32:16] ================ [PASSED] ttm_tt_init_basic ================
[03:32:16] [PASSED] ttm_tt_init_misaligned
[03:32:16] [PASSED] ttm_tt_fini_basic
[03:32:16] [PASSED] ttm_tt_fini_sg
[03:32:16] [PASSED] ttm_tt_fini_shmem
[03:32:16] [PASSED] ttm_tt_create_basic
[03:32:16] [PASSED] ttm_tt_create_invalid_bo_type
[03:32:16] [PASSED] ttm_tt_create_ttm_exists
[03:32:16] [PASSED] ttm_tt_create_failed
[03:32:16] [PASSED] ttm_tt_destroy_basic
[03:32:16] [PASSED] ttm_tt_populate_null_ttm
[03:32:16] [PASSED] ttm_tt_populate_populated_ttm
[03:32:16] [PASSED] ttm_tt_unpopulate_basic
[03:32:16] [PASSED] ttm_tt_unpopulate_empty_ttm
[03:32:16] [PASSED] ttm_tt_swapin_basic
[03:32:16] ===================== [PASSED] ttm_tt ======================
[03:32:16] =================== ttm_bo (14 subtests) ===================
[03:32:16] =========== ttm_bo_reserve_optimistic_no_ticket  ===========
[03:32:16] [PASSED] Cannot be interrupted and sleeps
[03:32:16] [PASSED] Cannot be interrupted, locks straight away
[03:32:16] [PASSED] Can be interrupted, sleeps
[03:32:16] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[03:32:16] [PASSED] ttm_bo_reserve_locked_no_sleep
[03:32:16] [PASSED] ttm_bo_reserve_no_wait_ticket
[03:32:16] [PASSED] ttm_bo_reserve_double_resv
[03:32:16] [PASSED] ttm_bo_reserve_interrupted
[03:32:16] [PASSED] ttm_bo_reserve_deadlock
[03:32:16] [PASSED] ttm_bo_unreserve_basic
[03:32:16] [PASSED] ttm_bo_unreserve_pinned
[03:32:16] [PASSED] ttm_bo_unreserve_bulk
[03:32:16] [PASSED] ttm_bo_fini_basic
[03:32:16] [PASSED] ttm_bo_fini_shared_resv
[03:32:16] [PASSED] ttm_bo_pin_basic
[03:32:16] [PASSED] ttm_bo_pin_unpin_resource
[03:32:16] [PASSED] ttm_bo_multiple_pin_one_unpin
[03:32:16] ===================== [PASSED] ttm_bo ======================
[03:32:16] ============== ttm_bo_validate (22 subtests) ===============
[03:32:16] ============== ttm_bo_init_reserved_sys_man  ===============
[03:32:16] [PASSED] Buffer object for userspace
[03:32:16] [PASSED] Kernel buffer object
[03:32:16] [PASSED] Shared buffer object
[03:32:16] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[03:32:16] ============== ttm_bo_init_reserved_mock_man  ==============
[03:32:16] [PASSED] Buffer object for userspace
[03:32:16] [PASSED] Kernel buffer object
[03:32:16] [PASSED] Shared buffer object
[03:32:16] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[03:32:16] [PASSED] ttm_bo_init_reserved_resv
[03:32:16] ================== ttm_bo_validate_basic  ==================
[03:32:16] [PASSED] Buffer object for userspace
[03:32:16] [PASSED] Kernel buffer object
[03:32:16] [PASSED] Shared buffer object
[03:32:16] ============== [PASSED] ttm_bo_validate_basic ==============
[03:32:16] [PASSED] ttm_bo_validate_invalid_placement
[03:32:16] ============= ttm_bo_validate_same_placement  ==============
[03:32:16] [PASSED] System manager
[03:32:16] [PASSED] VRAM manager
[03:32:16] ========= [PASSED] ttm_bo_validate_same_placement ==========
[03:32:16] [PASSED] ttm_bo_validate_failed_alloc
[03:32:16] [PASSED] ttm_bo_validate_pinned
[03:32:16] [PASSED] ttm_bo_validate_busy_placement
[03:32:16] ================ ttm_bo_validate_multihop  =================
[03:32:16] [PASSED] Buffer object for userspace
[03:32:16] [PASSED] Kernel buffer object
[03:32:16] [PASSED] Shared buffer object
[03:32:16] ============ [PASSED] ttm_bo_validate_multihop =============
[03:32:16] ========== ttm_bo_validate_no_placement_signaled  ==========
[03:32:16] [PASSED] Buffer object in system domain, no page vector
[03:32:16] [PASSED] Buffer object in system domain with an existing page vector
[03:32:16] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[03:32:16] ======== ttm_bo_validate_no_placement_not_signaled  ========
[03:32:16] [PASSED] Buffer object for userspace
[03:32:16] [PASSED] Kernel buffer object
[03:32:16] [PASSED] Shared buffer object
[03:32:16] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[03:32:16] [PASSED] ttm_bo_validate_move_fence_signaled
[03:32:16] ========= ttm_bo_validate_move_fence_not_signaled  =========
[03:32:16] [PASSED] Waits for GPU
[03:32:16] [PASSED] Tries to lock straight away
[03:32:16] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[03:32:16] [PASSED] ttm_bo_validate_swapout
[03:32:16] [PASSED] ttm_bo_validate_happy_evict
[03:32:16] [PASSED] ttm_bo_validate_all_pinned_evict
[03:32:16] [PASSED] ttm_bo_validate_allowed_only_evict
[03:32:16] [PASSED] ttm_bo_validate_deleted_evict
[03:32:16] [PASSED] ttm_bo_validate_busy_domain_evict
[03:32:16] [PASSED] ttm_bo_validate_evict_gutting
[03:32:16] [PASSED] ttm_bo_validate_recrusive_evict
[03:32:16] ================= [PASSED] ttm_bo_validate =================
[03:32:16] ============================================================
[03:32:16] Testing complete. Ran 102 tests: passed: 102
[03:32:16] Elapsed time: 12.253s total, 1.870s configuring, 10.168s building, 0.182s running

+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/dma-buf/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/dma-buf/.kunitconfig
[03:32:16] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[03:32:18] 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
[03:32:27] Starting KUnit Kernel (1/1)...
[03:32:27] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[03:32:27] =============== dma-buf-fence (12 subtests) ================
[03:32:27] [PASSED] test_sanitycheck
[03:32:27] [PASSED] test_signaling
[03:32:27] [PASSED] test_add_callback
[03:32:27] [PASSED] test_late_add_callback
[03:32:27] [PASSED] test_rm_callback
[03:32:27] [PASSED] test_late_rm_callback
[03:32:27] [PASSED] test_status
[03:32:27] [PASSED] test_error
[03:32:27] [PASSED] test_wait
[03:32:27] [PASSED] test_wait_timeout
[03:32:27] [PASSED] test_stub
[03:32:27] [SKIPPED] test_race_signal_callback (requires at least 2 CPUs)
[03:32:27] ================== [PASSED] dma-buf-fence ==================
[03:32:27] ============ dma-buf-fence-chain (11 subtests) =============
[03:32:27] [PASSED] test_sanitycheck
[03:32:27] [PASSED] test_find_seqno
[03:32:27] [PASSED] test_find_signaled
[03:32:27] [PASSED] test_find_out_of_order
[03:32:32] [PASSED] test_find_gap
[03:32:32] [PASSED] test_find_race
[03:32:32] [PASSED] test_signal_forward
[03:32:32] [PASSED] test_signal_backward
[03:32:32] [PASSED] test_wait_forward
[03:32:32] [PASSED] test_wait_backward
[03:32:32] [PASSED] test_wait_random
[03:32:32] =============== [PASSED] dma-buf-fence-chain ===============
[03:32:32] ============ dma-buf-fence-unwrap (11 subtests) ============
[03:32:32] [PASSED] test_sanitycheck
[03:32:32] [PASSED] test_unwrap_array
[03:32:32] [PASSED] test_unwrap_chain
[03:32:32] [PASSED] test_unwrap_chain_array
[03:32:32] [PASSED] test_unwrap_merge
[03:32:32] [PASSED] test_unwrap_merge_duplicate
[03:32:32] [PASSED] test_unwrap_merge_seqno
[03:32:32] [PASSED] test_unwrap_merge_order
[03:32:32] [PASSED] test_unwrap_merge_complex
[03:32:32] [PASSED] test_unwrap_merge_complex_seqno
[03:32:32] [PASSED] test_dedup_empty
[03:32:32] ============== [PASSED] dma-buf-fence-unwrap ===============
[03:32:32] ================ dma-buf-resv (5 subtests) =================
[03:32:32] [PASSED] test_sanitycheck
[03:32:32] ===================== test_signaling  ======================
[03:32:32] [PASSED] kernel
[03:32:32] [PASSED] write
[03:32:32] [PASSED] read
[03:32:32] [PASSED] bookkeep
[03:32:32] ================= [PASSED] test_signaling ==================
[03:32:32] ====================== test_for_each  ======================
[03:32:32] [PASSED] kernel
[03:32:32] [PASSED] write
[03:32:32] [PASSED] read
[03:32:32] [PASSED] bookkeep
[03:32:32] ================== [PASSED] test_for_each ==================
[03:32:32] ================= test_for_each_unlocked  ==================
[03:32:32] [PASSED] kernel
[03:32:32] [PASSED] write
[03:32:32] [PASSED] read
[03:32:32] [PASSED] bookkeep
[03:32:32] ============= [PASSED] test_for_each_unlocked ==============
[03:32:32] ===================== test_get_fences  =====================
[03:32:32] [PASSED] kernel
[03:32:32] [PASSED] write
[03:32:32] [PASSED] read
[03:32:32] [PASSED] bookkeep
[03:32:32] ================= [PASSED] test_get_fences =================
[03:32:32] ================== [PASSED] dma-buf-resv ===================
[03:32:32] ============================================================
[03:32:32] Testing complete. Ran 51 tests: passed: 50, skipped: 1
[03:32:32] Elapsed time: 16.023s total, 1.871s configuring, 8.779s building, 5.336s running

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



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

* Re: [PATCH v7 02/13] drm/i915/dp: Limit M/N ratio for DP
  2026-10-22  3:22 ` [PATCH v7 02/13] drm/i915/dp: Limit M/N ratio for DP Suraj Kandpal
@ 2026-10-22  3:34   ` sashiko-bot
  2026-10-22 16:29   ` Golani, Mitulkumar Ajitkumar
  1 sibling, 0 replies; 28+ messages in thread
From: sashiko-bot @ 2026-10-22  3:34 UTC (permalink / raw)
  To: Suraj Kandpal, intel-gfx, intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] drm/i915/dp: misordered M/N ratio filter in intel_dp_compute_config_limits()
--

commit 702cc07abf5c42e8a3c593b53932c55fcc454655
Author: Suraj Kandpal <suraj.kandpal@intel.com>

drm/i915/dp: Limit M/N ratio for DP

This commit restricts DisplayPort link configurations and prunes modes where
the ceiling of the Link M/N ratio exceeds the hardware limit supported by the
transcoder timing generator DDA.

> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index d8c0d9381471d..7ceb7c02b597b 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c

[ ... ]

> @@ -2656,6 +2725,48 @@ intel_dp_dsc_compute_pipe_bpp_limits(struct intel_connector *connector,
>  	return true;
>  }
>  
> +static bool
> +intel_dp_compute_m_n_ratio_limits(struct intel_dp *intel_dp,
> +				  struct drm_connector_state *conn_state,
> +				  const struct intel_crtc_state *crtc_state,
> +				  struct link_config_limits *limits)
> +{
> +	struct intel_display *display = to_intel_display(intel_dp);
> +	struct intel_connector *connector = to_intel_connector(conn_state->connector);
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp_link_caps_order order =
> +		intel_dp_link_caps_connector_compute_order(connector);
> +	struct intel_dp_link_caps_filter new_filter = INTEL_DP_LINK_CAPS_FILTER_NONE;
> +	int pixel_clock = intel_dp_mso_pixel_clock(intel_dp,
> +						  intel_dp_mode_clock(crtc_state, conn_state));
> +	struct intel_dp_link_config link_config;
> +	struct intel_dp_link_caps_iter iter;
> +	bool found = false;
> +
> +	intel_dp_link_caps_iter_start(&iter, link_caps, order, limits->link_config_filter);
> +	for_each_dp_link_config(&iter, &link_config) {
> +		if (!intel_dp_can_support_m_n(display, pixel_clock, link_config.rate))
> +			continue;
> +
> +		intel_dp_link_caps_filter_add(link_caps, &new_filter, &link_config);
> +		found = true;
> +	}
> +	intel_dp_link_caps_iter_end(&iter);
> +
> +	if (!found) {
> +		drm_dbg_kms(display->drm,
> +			    "[CONNECTOR:%d:%s] No link config with a Link M/N ratio <= %d\n",
> +			    connector->base.base.id, connector->base.name,
> +			    intel_dp_get_max_m_n_ratio(display));
> +
> +		return false;
> +	}
> +
> +	limits->link_config_filter = new_filter;
> +
> +	return true;
> +}
> +
>  bool
>  intel_dp_compute_config_limits(struct intel_dp *intel_dp,
>  			       struct drm_connector_state *conn_state,
> @@ -2772,6 +2883,9 @@ intel_dp_compute_config_limits(struct intel_dp *intel_dp,
>  		limits->link_config_filter = new_filter;
>  	}
>  
> +	if (!intel_dp_compute_m_n_ratio_limits(intel_dp, conn_state, crtc_state, limits))
> +		return false;
> +
>  	if (!intel_dp_test_compute_config(connector, crtc_state, limits))
>  		return false;

[Severity: Medium]
Does calling intel_dp_compute_m_n_ratio_limits() after the
(is_mst || intel_dp->use_max_params) block and before
intel_dp_test_compute_config() in intel_dp_compute_config_limits() cause two
filtering regressions?

First, in drivers/gpu/drm/i915/display/intel_dp.c:
intel_dp_compute_config_limits() narrows limits->link_config_filter to a
single max_config before intel_dp_compute_m_n_ratio_limits() runs:

	if (is_mst || intel_dp->use_max_params) {
		...
		if (!intel_dp_get_connector_max_link_config(connector, limits, &max_config))
			return false;

		if (!intel_dp_link_caps_filter_add(link_caps, &new_filter, &max_config))
			return false;

		limits->link_config_filter = new_filter;
	}

	if (!intel_dp_compute_m_n_ratio_limits(intel_dp, conn_state, crtc_state, limits))
		return false;

Because 128b/132b symbol clocks (rate * 10 / 32) are lower than 8b/10b symbol
clocks (rate * 10 / 10), max_config can pick a UHBR rate such as UHBR10
(312.5 MHz symbol clock) or UHBR20 (625 MHz symbol clock) that exceeds the
M/N ratio limit for a high pixel clock mode, even when a lower link rate like
HBR3 (810 MHz symbol clock) or HBR2 (540 MHz symbol clock) satisfies the M/N
ratio and passed intel_dp_mode_valid_m_n(). Since
intel_dp_compute_m_n_ratio_limits() only iterates over
limits->link_config_filter, won't it reject the modeset instead of allowing
intel_dp_get_connector_max_link_config() to select the highest M/N-compatible
configuration?

Second, intel_dp_test_compute_config() is called right after
intel_dp_compute_m_n_ratio_limits(). When intel_dp->compliance.test_type is
DP_TEST_LINK_TRAINING, intel_dp_test_compute_config() ->
set_filter_for_link_params() -> set_filter_for_link_config() in
drivers/gpu/drm/i915/display/intel_dp_test.c overwrites
limits->link_config_filter with a fresh filter:

static bool set_filter_for_link_config(struct intel_connector *connector,
				       struct intel_dp_link_caps *link_caps,
				       const struct intel_dp_link_config *link_params,
				       struct link_config_limits *limits)
{
	struct intel_dp_link_caps_filter new_filter = INTEL_DP_LINK_CAPS_FILTER_NONE;

	if (!intel_dp_link_caps_filter_add(link_caps, &new_filter, link_params))
		return false;

	limits->link_config_filter = new_filter;

	return true;
}

Because intel_dp_link_caps_filter_add() checks get_allowed_config_filter()
rather than limits->link_config_filter, won't this discard the M/N ratio
filter applied by intel_dp_compute_m_n_ratio_limits() and allow an
M/N-invalid compliance link configuration?

Should intel_dp_compute_m_n_ratio_limits() be called before the
(is_mst || intel_dp->use_max_params) block, or after
intel_dp_test_compute_config() while also filtering before
intel_dp_get_connector_max_link_config()?

>  
[ ... ]

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261022032247.1378809-1-suraj.kandpal@intel.com?part=2

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

* Re: [PATCH v7 04/13] drm/i915/dp_mst: Limit M/N ratio for MST
  2026-10-22  3:22 ` [PATCH v7 04/13] drm/i915/dp_mst: Limit M/N ratio for MST Suraj Kandpal
@ 2026-10-22  3:43   ` sashiko-bot
  2026-10-22 16:42   ` Golani, Mitulkumar Ajitkumar
  1 sibling, 0 replies; 28+ messages in thread
From: sashiko-bot @ 2026-10-22  3:43 UTC (permalink / raw)
  To: Suraj Kandpal, intel-gfx, intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] drm/i915/dp_mst: M/N mode_valid check mismatches MST compute_config limits
--

commit 67d8f2b2b1195befcc18a05f5eb7b442e2188782
Author: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

drm/i915/dp_mst: Limit M/N ratio for MST

This commit adds a Link M/Link N ratio check to mst_connector_mode_valid_ctx()
using intel_dp_mode_valid_m_n() to prune display modes that exceed the
hardware M/N ratio limit on MST connectors.

> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 7023619aaaba9..f00edfb66a10a 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -1565,6 +1565,11 @@ mst_connector_mode_valid_ctx(struct drm_connector *_connector,
>  					   min_link_bpp_x16,
>  					   bw_overhead_flags);
>  
> +	if (!intel_dp_mode_valid_m_n(intel_dp, mode->clock)) {
> +		*status = MODE_CLOCK_HIGH;
> +		return 0;
> +	}
> +
>  	/*
>  	 * TODO:
>  	 * - Also check if compression would allow for the mode

[Severity: Medium]
Does calling intel_dp_mode_valid_m_n() here match the link configuration
constraints enforced during MST modeset in intel_dp_compute_config_limits()?

In drivers/gpu/drm/i915/display/intel_dp_mst.c, mst_connector_mode_valid_ctx()
evaluates bandwidth and DSC against max_bw_config, whereas
intel_dp_mode_valid_m_n() in drivers/gpu/drm/i915/display/intel_dp.c iterates
over all configurations in INTEL_DP_LINK_CAPS_FILTER_ALL:

drivers/gpu/drm/i915/display/intel_dp.c:intel_dp_mode_valid_m_n() {
	intel_dp_link_caps_iter_start(&iter, intel_dp->link.caps, order,
				      INTEL_DP_LINK_CAPS_FILTER_ALL);
	for_each_dp_link_config(&iter, &link_config) {
		if (intel_dp_can_support_m_n(display, m_n_pixel_clock,
					     link_config.rate)) {
			found = true;

			break;
		}
	}
}

On a UHBR-capable MST topology (for example UHBR10 with a 312.5 MHz symbol
clock, or UHBR13.5 with a 421.875 MHz symbol clock), intel_dp->link.caps also
includes 8b/10b rates such as HBR3 (810 MHz symbol clock). Because HBR3 has a
higher link symbol clock than UHBR10 or UHBR13.5, intel_dp_mode_valid_m_n()
will see that HBR3 satisfies intel_dp_can_support_m_n() and return true even
when max_bw_config violates the M/N ratio limit.

However, during modeset via
mst_stream_compute_config() -> mst_stream_compute_link_for_joined_pipes() ->
mst_stream_compute_config_limits() -> intel_dp_compute_config_limits(),
the MST path narrows limits->link_config_filter to the single highest-BW
max_config before intel_dp_compute_m_n_ratio_limits() is called:

drivers/gpu/drm/i915/display/intel_dp.c:intel_dp_compute_config_limits() {
	if (is_mst || intel_dp->use_max_params) {
		struct intel_dp_link_caps_filter new_filter = INTEL_DP_LINK_CAPS_FILTER_NONE;
		struct intel_dp_link_config max_config;
		...
		if (!intel_dp_get_connector_max_link_config(connector, limits, &max_config))
			return false;

		if (!intel_dp_link_caps_filter_add(link_caps, &new_filter, &max_config))
			return false;

		limits->link_config_filter = new_filter;
	}

	if (!intel_dp_compute_m_n_ratio_limits(intel_dp, conn_state, crtc_state, limits))
		return false;
}

As a result, intel_dp_compute_m_n_ratio_limits() only checks max_config for
MST and rejects the modeset if max_config violates the M/N ratio limit.

Should mst_connector_mode_valid_ctx() check intel_dp_can_support_m_n() against
max_link_clock (matching the rest of mst_connector_mode_valid_ctx() and the
current MST max_config selection), or should intel_dp_compute_m_n_ratio_limits()
filter limits->link_config_filter before intel_dp_get_connector_max_link_config()
picks max_config?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261022032247.1378809-1-suraj.kandpal@intel.com?part=4

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

* ✓ Xe.CI.BAT: success for Implement Wa_14021768792 to bypass m_n ratio limit (rev11)
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (13 preceding siblings ...)
  2026-10-22  3:32 ` ✓ CI.KUnit: success for Implement Wa_14021768792 to bypass m_n ratio limit (rev11) Patchwork
@ 2026-10-22  4:10 ` Patchwork
  2026-10-22  7:39 ` ✗ Xe.CI.FULL: failure " Patchwork
  15 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2026-10-22  4:10 UTC (permalink / raw)
  To: Suraj Kandpal; +Cc: intel-xe

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

== Series Details ==

Series: Implement Wa_14021768792 to bypass m_n ratio limit (rev11)
URL   : https://patchwork.freedesktop.org/series/138256/
State : success

== Summary ==

CI Bug Log - changes from xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f_BAT -> xe-pw-138256v11_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (15 -> 15)
------------------------------

  No changes in participating hosts


Changes
-------

  No changes found


Build changes
-------------

  * Linux: xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f -> xe-pw-138256v11

  IGT_9156: 9156
  xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f: dccfdbc40b10720efe537dfc63de84eed983fc8f
  xe-pw-138256v11: 138256v11

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/index.html

[-- Attachment #2: Type: text/html, Size: 1435 bytes --]

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

* RE: [PATCH v7 10/13] drm/i915/display: Dump bypass_m_n_ratio_limit in the crtc state dump
  2026-10-22  3:22 ` [PATCH v7 10/13] drm/i915/display: Dump bypass_m_n_ratio_limit in the crtc state dump Suraj Kandpal
@ 2026-10-22  7:38   ` Golani, Mitulkumar Ajitkumar
  0 siblings, 0 replies; 28+ messages in thread
From: Golani, Mitulkumar Ajitkumar @ 2026-10-22  7:38 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: 22 October 2026 08:53
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Golani, Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani@intel.com>;
> Kandpal, Suraj <suraj.kandpal@intel.com>
> Subject: [PATCH v7 10/13] drm/i915/display: Dump bypass_m_n_ratio_limit
> in the crtc state dump
> 
> Dump whether the Link M/N ratio limit is bypassed with Wa_14021768792
> along with the rest of the M/N values in the crtc state dump.
> 
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_crtc_state_dump.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
> b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
> index 92675a88b969..c51b21222dc6 100644
> --- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
> +++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
> @@ -36,10 +36,12 @@ intel_dump_m_n_config(struct drm_printer *p,
>  		      const char *id, unsigned int lane_count,
>  		      const struct intel_link_m_n *m_n)  {
> -	drm_printf(p, "%s: lanes: %i; data_m: %u, data_n: %u, link_m: %u,
> link_n: %u, tu: %u\n",
> +	drm_printf(p,
> +		   "%s: lanes: %i; data_m: %u, data_n: %u, link_m: %u, link_n:
> %u,
> +tu: %u, bypass_m_n_ratio_limit: %s\n",
>  		   id, lane_count,
>  		   m_n->data_m, m_n->data_n,
> -		   m_n->link_m, m_n->link_n, m_n->tu);
> +		   m_n->link_m, m_n->link_n, m_n->tu,
> +		   str_yes_no(m_n->bypass_m_n_ratio_limit));
>  }

LGTM
Reviewed-by: Mitul Golani<mitulkumar.ajitkumar.golani@intel.com>
> 
>  static void
> --
> 2.34.1


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

* ✗ Xe.CI.FULL: failure for Implement Wa_14021768792 to bypass m_n ratio limit (rev11)
  2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
                   ` (14 preceding siblings ...)
  2026-10-22  4:10 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-10-22  7:39 ` Patchwork
  15 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2026-10-22  7:39 UTC (permalink / raw)
  To: Suraj Kandpal; +Cc: intel-xe

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

== Series Details ==

Series: Implement Wa_14021768792 to bypass m_n ratio limit (rev11)
URL   : https://patchwork.freedesktop.org/series/138256/
State : failure

== Summary ==

CI Bug Log - changes from xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f_FULL -> xe-pw-138256v11_FULL
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with xe-pw-138256v11_FULL absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in xe-pw-138256v11_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
  to document this new failure mode, which will reduce false positives in CI.

  

Participating hosts (3 -> 3)
------------------------------

  No changes in participating hosts

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in xe-pw-138256v11_FULL:

### IGT changes ###

#### Possible regressions ####

  * igt@core_hotunplug@hotunplug-rescan-with-load:
    - shard-bmg:          [PASS][1] -> [ABORT][2]
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-2/igt@core_hotunplug@hotunplug-rescan-with-load.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-5/igt@core_hotunplug@hotunplug-rescan-with-load.html

  
Known issues
------------

  Here are the changes found in xe-pw-138256v11_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip:
    - shard-lnl:          NOTRUN -> [SKIP][3] ([Intel XE#3658] / [Intel XE#7360])
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-async-flip:
    - shard-lnl:          [PASS][4] -> [FAIL][5] ([Intel XE#1231])
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-lnl-6/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-6/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-async-flip.html

  * igt@kms_big_fb@linear-max-hw-stride-32bpp-rotate-0-hflip:
    - shard-lnl:          NOTRUN -> [SKIP][6] ([Intel XE#7059] / [Intel XE#7085])
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_big_fb@linear-max-hw-stride-32bpp-rotate-0-hflip.html

  * igt@kms_big_fb@x-tiled-8bpp-rotate-270:
    - shard-lnl:          NOTRUN -> [SKIP][7] ([Intel XE#1407]) +2 other tests skip
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_big_fb@x-tiled-8bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-addfb-size-offset-overflow:
    - shard-lnl:          NOTRUN -> [SKIP][8] ([Intel XE#1477] / [Intel XE#7361])
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_big_fb@y-tiled-addfb-size-offset-overflow.html

  * igt@kms_big_fb@yf-tiled-16bpp-rotate-0:
    - shard-lnl:          NOTRUN -> [SKIP][9] ([Intel XE#1124]) +4 other tests skip
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_big_fb@yf-tiled-16bpp-rotate-0.html

  * igt@kms_bw@connected-linear-tiling-2-displays-target-1920x1080p:
    - shard-lnl:          NOTRUN -> [SKIP][10] ([Intel XE#7679])
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_bw@connected-linear-tiling-2-displays-target-1920x1080p.html

  * igt@kms_bw@connected-linear-tiling-4-displays-target-3840x2160p:
    - shard-lnl:          NOTRUN -> [SKIP][11] ([Intel XE#8365])
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_bw@connected-linear-tiling-4-displays-target-3840x2160p.html

  * igt@kms_bw@linear-tiling-1-displays-target-3840x2160p:
    - shard-bmg:          [PASS][12] -> [SKIP][13] ([Intel XE#367])
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-7/igt@kms_bw@linear-tiling-1-displays-target-3840x2160p.html
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-8/igt@kms_bw@linear-tiling-1-displays-target-3840x2160p.html

  * igt@kms_bw@linear-tiling-2-displays-target-3840x2160p:
    - shard-lnl:          NOTRUN -> [SKIP][14] ([Intel XE#367])
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_bw@linear-tiling-2-displays-target-3840x2160p.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs:
    - shard-lnl:          NOTRUN -> [SKIP][15] ([Intel XE#2887]) +4 other tests skip
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs:
    - shard-lnl:          NOTRUN -> [SKIP][16] ([Intel XE#3432]) +1 other test skip
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs@pipe-b-dp-1:
    - shard-bmg:          NOTRUN -> [SKIP][17] ([Intel XE#2652]) +11 other tests skip
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-7/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs@pipe-b-dp-1.html

  * igt@kms_chamelium_color@ctm-negative:
    - shard-bmg:          NOTRUN -> [SKIP][18] ([Intel XE#2325] / [Intel XE#7358])
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-10/igt@kms_chamelium_color@ctm-negative.html

  * igt@kms_chamelium_color_pipeline@plane-lut1d-ctm3x4-lut1d:
    - shard-lnl:          NOTRUN -> [SKIP][19] ([Intel XE#7358])
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_chamelium_color_pipeline@plane-lut1d-ctm3x4-lut1d.html

  * igt@kms_chamelium_hpd@hdmi-hpd:
    - shard-lnl:          NOTRUN -> [SKIP][20] ([Intel XE#373]) +1 other test skip
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_chamelium_hpd@hdmi-hpd.html

  * igt@kms_content_protection@atomic-hdcp14@pipe-a-dp-1:
    - shard-bmg:          NOTRUN -> [FAIL][21] ([Intel XE#3304])
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-7/igt@kms_content_protection@atomic-hdcp14@pipe-a-dp-1.html

  * igt@kms_content_protection@dp-mst-lic-type-1:
    - shard-lnl:          NOTRUN -> [SKIP][22] ([Intel XE#307] / [Intel XE#6974])
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_content_protection@dp-mst-lic-type-1.html

  * igt@kms_content_protection@legacy-hdcp14@pipe-a-dp-2:
    - shard-bmg:          NOTRUN -> [FAIL][23] ([Intel XE#1178] / [Intel XE#3304] / [Intel XE#7374])
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-2/igt@kms_content_protection@legacy-hdcp14@pipe-a-dp-2.html

  * igt@kms_content_protection@type1:
    - shard-lnl:          NOTRUN -> [SKIP][24] ([Intel XE#7642])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-7/igt@kms_content_protection@type1.html

  * igt@kms_cursor_crc@cursor-random-512x512:
    - shard-lnl:          NOTRUN -> [SKIP][25] ([Intel XE#2321] / [Intel XE#7355])
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_cursor_crc@cursor-random-512x512.html

  * igt@kms_cursor_crc@cursor-rapid-movement-32x10:
    - shard-bmg:          NOTRUN -> [SKIP][26] ([Intel XE#2320])
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-10/igt@kms_cursor_crc@cursor-rapid-movement-32x10.html

  * igt@kms_cursor_crc@cursor-sliding-256x85:
    - shard-lnl:          NOTRUN -> [SKIP][27] ([Intel XE#1424]) +1 other test skip
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_cursor_crc@cursor-sliding-256x85.html

  * igt@kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic:
    - shard-lnl:          NOTRUN -> [SKIP][28] ([Intel XE#309] / [Intel XE#7343]) +1 other test skip
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_cursor_legacy@2x-nonblocking-modeset-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions:
    - shard-lnl:          NOTRUN -> [SKIP][29] ([Intel XE#323] / [Intel XE#6035])
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html

  * igt@kms_dp_linktrain_fallback@dp-fallback:
    - shard-lnl:          NOTRUN -> [SKIP][30] ([Intel XE#9009])
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_dp_linktrain_fallback@dp-fallback.html

  * igt@kms_dsc@dsc-with-output-formats-with-bpc-bigjoiner:
    - shard-lnl:          NOTRUN -> [SKIP][31] ([Intel XE#8265]) +1 other test skip
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_dsc@dsc-with-output-formats-with-bpc-bigjoiner.html

  * igt@kms_feature_discovery@display-3x:
    - shard-lnl:          NOTRUN -> [SKIP][32] ([Intel XE#703] / [Intel XE#7448])
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_feature_discovery@display-3x.html

  * igt@kms_flip@2x-flip-vs-absolute-wf_vblank:
    - shard-lnl:          NOTRUN -> [SKIP][33] ([Intel XE#1421]) +3 other tests skip
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_flip@2x-flip-vs-absolute-wf_vblank.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yuv-linear-to-32bpp-yuv-linear-reflect-x:
    - shard-lnl:          NOTRUN -> [SKIP][34] ([Intel XE#7179])
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-7/igt@kms_flip_scaled_crc@flip-32bpp-yuv-linear-to-32bpp-yuv-linear-reflect-x.html

  * igt@kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling:
    - shard-lnl:          NOTRUN -> [SKIP][35] ([Intel XE#1397] / [Intel XE#1745] / [Intel XE#7385] / [Intel XE#9144])
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling@pipe-a-default-mode:
    - shard-lnl:          NOTRUN -> [SKIP][36] ([Intel XE#1397] / [Intel XE#7385] / [Intel XE#9144])
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-16bpp-linear-downscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-downscaling:
    - shard-bmg:          NOTRUN -> [SKIP][37] ([Intel XE#7178] / [Intel XE#7351])
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-10/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-downscaling.html

  * igt@kms_frontbuffer_tracking@fbc-argb161616f-draw-mmap-wc:
    - shard-lnl:          NOTRUN -> [SKIP][38] ([Intel XE#7061] / [Intel XE#7356]) +1 other test skip
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_frontbuffer_tracking@fbc-argb161616f-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-modesetfrombusy:
    - shard-bmg:          NOTRUN -> [SKIP][39] ([Intel XE#4141])
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-10/igt@kms_frontbuffer_tracking@fbc-modesetfrombusy.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-indfb-draw-render:
    - shard-lnl:          NOTRUN -> [SKIP][40] ([Intel XE#656] / [Intel XE#7905]) +14 other tests skip
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-shrfb-pgflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][41] ([Intel XE#2311])
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-10/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-shrfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][42] ([Intel XE#6312] / [Intel XE#651]) +3 other tests skip
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_frontbuffer_tracking@fbcdrrs-rgb101010-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrshdr-modesetfrombusy:
    - shard-lnl:          NOTRUN -> [SKIP][43] ([Intel XE#6312]) +9 other tests skip
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-7/igt@kms_frontbuffer_tracking@fbcdrrshdr-modesetfrombusy.html

  * igt@kms_frontbuffer_tracking@fbcpsrhdr-1p-primscrn-cur-indfb-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][44] ([Intel XE#7865]) +11 other tests skip
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_frontbuffer_tracking@fbcpsrhdr-1p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsrhdr-abgr161616f-draw-render:
    - shard-lnl:          NOTRUN -> [SKIP][45] ([Intel XE#7061]) +1 other test skip
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_frontbuffer_tracking@fbcpsrhdr-abgr161616f-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsrhdr-stridechange:
    - shard-bmg:          NOTRUN -> [SKIP][46] ([Intel XE#2313])
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-10/igt@kms_frontbuffer_tracking@fbcpsrhdr-stridechange.html

  * igt@kms_frontbuffer_tracking@hdr-2p-primscrn-pri-indfb-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][47] ([Intel XE#7905]) +22 other tests skip
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_frontbuffer_tracking@hdr-2p-primscrn-pri-indfb-draw-blt.html

  * igt@kms_hdr@static-toggle:
    - shard-lnl:          NOTRUN -> [SKIP][48] ([Intel XE#1503])
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_hdr@static-toggle.html

  * igt@kms_joiner@basic-force-ultra-joiner:
    - shard-bmg:          NOTRUN -> [SKIP][49] ([Intel XE#6911] / [Intel XE#7466])
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-10/igt@kms_joiner@basic-force-ultra-joiner.html

  * igt@kms_pipe_crc_basic@suspend-read-crc:
    - shard-bmg:          [PASS][50] -> [DMESG-WARN][51] ([Intel XE#9365]) +1 other test dmesg-warn
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-9/igt@kms_pipe_crc_basic@suspend-read-crc.html
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-10/igt@kms_pipe_crc_basic@suspend-read-crc.html

  * igt@kms_plane@pixel-format-4-tiled-lnl-ccs-modifier@pipe-a-plane-5:
    - shard-lnl:          NOTRUN -> [SKIP][52] ([Intel XE#8303]) +1 other test skip
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_plane@pixel-format-4-tiled-lnl-ccs-modifier@pipe-a-plane-5.html

  * igt@kms_plane@pixel-format-yf-tiled-modifier:
    - shard-lnl:          NOTRUN -> [SKIP][53] ([Intel XE#7283]) +1 other test skip
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_plane@pixel-format-yf-tiled-modifier.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-5-upscale-factor-0-25:
    - shard-lnl:          NOTRUN -> [SKIP][54] ([Intel XE#2763] / [Intel XE#6886]) +7 other tests skip
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_plane_scaling@planes-downscale-factor-0-5-upscale-factor-0-25.html

  * igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait:
    - shard-lnl:          NOTRUN -> [SKIP][55] ([Intel XE#1439] / [Intel XE#3141] / [Intel XE#7383]) +1 other test skip
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf:
    - shard-lnl:          NOTRUN -> [SKIP][56] ([Intel XE#2893] / [Intel XE#4608] / [Intel XE#7304])
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-a-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][57] ([Intel XE#4608])
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-a-edp-1.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-b-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][58] ([Intel XE#4608] / [Intel XE#7304])
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-b-edp-1.html

  * igt@kms_psr2_sf@pr-cursor-plane-move-continuous-sf:
    - shard-lnl:          NOTRUN -> [SKIP][59] ([Intel XE#2893] / [Intel XE#7304]) +4 other tests skip
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_psr2_sf@pr-cursor-plane-move-continuous-sf.html

  * igt@kms_psr@fbc-pr-cursor-plane-move:
    - shard-lnl:          NOTRUN -> [SKIP][60] ([Intel XE#1406]) +2 other tests skip
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_psr@fbc-pr-cursor-plane-move.html

  * igt@kms_psr@fbc-psr2-cursor-plane-onoff:
    - shard-lnl:          NOTRUN -> [SKIP][61] ([Intel XE#1406] / [Intel XE#7345])
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_psr@fbc-psr2-cursor-plane-onoff.html

  * igt@kms_psr@fbc-psr2-cursor-plane-onoff@edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][62] ([Intel XE#1406] / [Intel XE#4609] / [Intel XE#7345])
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_psr@fbc-psr2-cursor-plane-onoff@edp-1.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-90:
    - shard-lnl:          NOTRUN -> [SKIP][63] ([Intel XE#3414] / [Intel XE#3904] / [Intel XE#7342])
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_rotation_crc@primary-y-tiled-reflect-x-90.html

  * igt@kms_setmode@basic-clone-single-crtc:
    - shard-lnl:          NOTRUN -> [SKIP][64] ([Intel XE#1435] / [Intel XE#9142])
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@kms_setmode@basic-clone-single-crtc.html

  * igt@kms_vrr@flip-basic:
    - shard-ptl:          [PASS][65] -> [FAIL][66] ([Intel XE#4227] / [Intel XE#7397]) +1 other test fail
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-ptl-7/igt@kms_vrr@flip-basic.html
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-ptl-5/igt@kms_vrr@flip-basic.html

  * igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all:
    - shard-lnl:          NOTRUN -> [SKIP][67] ([Intel XE#1091] / [Intel XE#2849]) +1 other test skip
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-7/igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all.html

  * igt@xe_ccs@suspend-resume@tile64-compressed-compfmt0-vram01-vram01:
    - shard-bmg:          NOTRUN -> [ABORT][68] ([Intel XE#9362] / [Intel XE#9425])
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-6/igt@xe_ccs@suspend-resume@tile64-compressed-compfmt0-vram01-vram01.html

  * igt@xe_evict@evict-mixed-many-threads-small:
    - shard-bmg:          [PASS][69] -> [INCOMPLETE][70] ([Intel XE#6321] / [Intel XE#8355])
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-10/igt@xe_evict@evict-mixed-many-threads-small.html
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-10/igt@xe_evict@evict-mixed-many-threads-small.html

  * igt@xe_evict@evict-mixed-threads-large:
    - shard-lnl:          NOTRUN -> [SKIP][71] ([Intel XE#6540] / [Intel XE#688]) +5 other tests skip
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@xe_evict@evict-mixed-threads-large.html

  * igt@xe_exec_balancer@no-exec-cm-parallel-rebind:
    - shard-lnl:          NOTRUN -> [SKIP][72] ([Intel XE#7482]) +6 other tests skip
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@xe_exec_balancer@no-exec-cm-parallel-rebind.html

  * igt@xe_exec_basic@multigpu-no-exec-basic-defer-mmap:
    - shard-lnl:          NOTRUN -> [SKIP][73] ([Intel XE#1392]) +2 other tests skip
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-7/igt@xe_exec_basic@multigpu-no-exec-basic-defer-mmap.html

  * igt@xe_exec_fault_mode@once-multi-queue-invalid-fault:
    - shard-lnl:          NOTRUN -> [SKIP][74] ([Intel XE#8374]) +8 other tests skip
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@xe_exec_fault_mode@once-multi-queue-invalid-fault.html

  * igt@xe_exec_multi_queue@few-execs-preempt-mode-userptr:
    - shard-lnl:          NOTRUN -> [SKIP][75] ([Intel XE#8364]) +14 other tests skip
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@xe_exec_multi_queue@few-execs-preempt-mode-userptr.html

  * igt@xe_exec_threads@threads-hang-fd-userptr-invalidate-race:
    - shard-lnl:          [PASS][76] -> [FAIL][77] ([Intel XE#9096] / [Intel XE#9297])
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-lnl-8/igt@xe_exec_threads@threads-hang-fd-userptr-invalidate-race.html
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-3/igt@xe_exec_threads@threads-hang-fd-userptr-invalidate-race.html
    - shard-bmg:          [PASS][78] -> [FAIL][79] ([Intel XE#9096])
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-10/igt@xe_exec_threads@threads-hang-fd-userptr-invalidate-race.html
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-2/igt@xe_exec_threads@threads-hang-fd-userptr-invalidate-race.html

  * igt@xe_exec_threads@threads-multi-queue-shared-vm-rebind:
    - shard-lnl:          NOTRUN -> [SKIP][80] ([Intel XE#8378]) +4 other tests skip
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-7/igt@xe_exec_threads@threads-multi-queue-shared-vm-rebind.html

  * igt@xe_fault_injection@inject-fault-probe-function-xe_device_probe_early:
    - shard-bmg:          [PASS][81] -> [ABORT][82] ([Intel XE#9463])
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-3/igt@xe_fault_injection@inject-fault-probe-function-xe_device_probe_early.html
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-9/igt@xe_fault_injection@inject-fault-probe-function-xe_device_probe_early.html

  * igt@xe_multigpu_svm@mgpu-pagefault-basic:
    - shard-lnl:          NOTRUN -> [SKIP][83] ([Intel XE#6964])
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@xe_multigpu_svm@mgpu-pagefault-basic.html

  * igt@xe_page_reclaim@pde-vs-pd:
    - shard-lnl:          NOTRUN -> [SKIP][84] ([Intel XE#7793])
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@xe_page_reclaim@pde-vs-pd.html

  * igt@xe_pat@xa-app-transient-media-off:
    - shard-lnl:          NOTRUN -> [SKIP][85] ([Intel XE#7590] / [Intel XE#7772])
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@xe_pat@xa-app-transient-media-off.html

  * igt@xe_pm@d3cold-basic:
    - shard-lnl:          NOTRUN -> [SKIP][86] ([Intel XE#2284] / [Intel XE#366] / [Intel XE#7370]) +2 other tests skip
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-7/igt@xe_pm@d3cold-basic.html

  * igt@xe_pm@s3-vm-bind-unbind-all:
    - shard-lnl:          NOTRUN -> [SKIP][87] ([Intel XE#584] / [Intel XE#7369]) +1 other test skip
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-7/igt@xe_pm@s3-vm-bind-unbind-all.html

  * igt@xe_pm@s4-mocs:
    - shard-bmg:          [PASS][88] -> [ABORT][89] ([Intel XE#9093])
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-3/igt@xe_pm@s4-mocs.html
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-9/igt@xe_pm@s4-mocs.html
    - shard-ptl:          [PASS][90] -> [DMESG-WARN][91] ([Intel XE#7727])
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-ptl-3/igt@xe_pm@s4-mocs.html
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-ptl-7/igt@xe_pm@s4-mocs.html

  * igt@xe_pm@s4-multiple-execs:
    - shard-ptl:          [PASS][92] -> [ABORT][93] ([Intel XE#9362])
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-ptl-3/igt@xe_pm@s4-multiple-execs.html
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-ptl-1/igt@xe_pm@s4-multiple-execs.html

  * igt@xe_pm@s4-vm-bind-unbind-all:
    - shard-lnl:          [PASS][94] -> [ABORT][95] ([Intel XE#9362])
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-lnl-4/igt@xe_pm@s4-vm-bind-unbind-all.html
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-6/igt@xe_pm@s4-vm-bind-unbind-all.html

  * igt@xe_pm@s4-vm-bind-userptr:
    - shard-lnl:          [PASS][96] -> [DMESG-WARN][97] ([Intel XE#7727])
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-lnl-3/igt@xe_pm@s4-vm-bind-userptr.html
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-8/igt@xe_pm@s4-vm-bind-userptr.html

  * igt@xe_pmu@engine-activity-accuracy-50:
    - shard-lnl:          [PASS][98] -> [FAIL][99] ([Intel XE#9347])
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-lnl-1/igt@xe_pmu@engine-activity-accuracy-50.html
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-4/igt@xe_pmu@engine-activity-accuracy-50.html

  * igt@xe_pmu@engine-activity-accuracy-50@engine-drm_xe_engine_class_compute0:
    - shard-lnl:          [PASS][100] -> [FAIL][101] ([Intel XE#9461])
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-lnl-1/igt@xe_pmu@engine-activity-accuracy-50@engine-drm_xe_engine_class_compute0.html
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-4/igt@xe_pmu@engine-activity-accuracy-50@engine-drm_xe_engine_class_compute0.html

  * igt@xe_query@multigpu-query-topology-l3-bank-mask:
    - shard-lnl:          NOTRUN -> [SKIP][102] ([Intel XE#944])
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@xe_query@multigpu-query-topology-l3-bank-mask.html

  * igt@xe_sriov_admin@bulk-exec-quantum-vfs-disabled:
    - shard-lnl:          NOTRUN -> [SKIP][103] ([Intel XE#7174])
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-5/igt@xe_sriov_admin@bulk-exec-quantum-vfs-disabled.html

  
#### Possible fixes ####

  * igt@kms_async_flips@alternate-sync-async-flip:
    - shard-bmg:          [FAIL][104] ([Intel XE#3718] / [Intel XE#6078]) -> [PASS][105] +1 other test pass
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-5/igt@kms_async_flips@alternate-sync-async-flip.html
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-7/igt@kms_async_flips@alternate-sync-async-flip.html

  * igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-3:
    - shard-bmg:          [FAIL][106] ([Intel XE#6078]) -> [PASS][107]
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-1/igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-3.html
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-6/igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-hdmi-a-3.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1:
    - shard-lnl:          [FAIL][108] ([Intel XE#301]) -> [PASS][109] +1 other test pass
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-lnl-7/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-lnl-8/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html

  * igt@xe_ccs@suspend-resume@xmajor-compressed-compfmt0-system-vram01:
    - shard-bmg:          [ABORT][110] ([Intel XE#9362] / [Intel XE#9425]) -> [PASS][111]
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-9/igt@xe_ccs@suspend-resume@xmajor-compressed-compfmt0-system-vram01.html
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-6/igt@xe_ccs@suspend-resume@xmajor-compressed-compfmt0-system-vram01.html

  * igt@xe_evict@evict-beng-mixed-many-threads-small:
    - shard-bmg:          [INCOMPLETE][112] ([Intel XE#6321] / [Intel XE#8355]) -> [PASS][113]
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-10/igt@xe_evict@evict-beng-mixed-many-threads-small.html
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-10/igt@xe_evict@evict-beng-mixed-many-threads-small.html

  * igt@xe_pm_residency@cpg-basic:
    - shard-bmg:          [ABORT][114] ([Intel XE#9399]) -> [PASS][115]
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f/shard-bmg-9/igt@xe_pm_residency@cpg-basic.html
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/shard-bmg-10/igt@xe_pm_residency@cpg-basic.html

  
  [Intel XE#1091]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1091
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1231]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1231
  [Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
  [Intel XE#1397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1397
  [Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
  [Intel XE#1407]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1407
  [Intel XE#1421]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1421
  [Intel XE#1424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1424
  [Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435
  [Intel XE#1439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1439
  [Intel XE#1477]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1477
  [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
  [Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
  [Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
  [Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
  [Intel XE#2325]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2325
  [Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
  [Intel XE#2763]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2763
  [Intel XE#2849]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2849
  [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
  [Intel XE#2893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2893
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#307]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/307
  [Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#3141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3141
  [Intel XE#323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/323
  [Intel XE#3304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3304
  [Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
  [Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432
  [Intel XE#3658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3658
  [Intel XE#366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/366
  [Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
  [Intel XE#3718]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3718
  [Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
  [Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
  [Intel XE#4227]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4227
  [Intel XE#4608]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4608
  [Intel XE#4609]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4609
  [Intel XE#584]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/584
  [Intel XE#6035]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6035
  [Intel XE#6078]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6078
  [Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
  [Intel XE#6321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6321
  [Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
  [Intel XE#6540]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6540
  [Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
  [Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
  [Intel XE#6886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6886
  [Intel XE#6911]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6911
  [Intel XE#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
  [Intel XE#6974]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6974
  [Intel XE#703]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/703
  [Intel XE#7059]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7059
  [Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
  [Intel XE#7085]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7085
  [Intel XE#7174]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7174
  [Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
  [Intel XE#7179]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7179
  [Intel XE#7283]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7283
  [Intel XE#7304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7304
  [Intel XE#7342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7342
  [Intel XE#7343]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7343
  [Intel XE#7345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7345
  [Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
  [Intel XE#7355]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7355
  [Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
  [Intel XE#7358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7358
  [Intel XE#7360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7360
  [Intel XE#7361]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7361
  [Intel XE#7369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7369
  [Intel XE#7370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7370
  [Intel XE#7374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7374
  [Intel XE#7383]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7383
  [Intel XE#7385]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7385
  [Intel XE#7397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7397
  [Intel XE#7448]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7448
  [Intel XE#7466]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7466
  [Intel XE#7482]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7482
  [Intel XE#7590]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7590
  [Intel XE#7642]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7642
  [Intel XE#7679]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7679
  [Intel XE#7727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7727
  [Intel XE#7772]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7772
  [Intel XE#7793]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7793
  [Intel XE#7865]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7865
  [Intel XE#7905]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7905
  [Intel XE#8265]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8265
  [Intel XE#8303]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8303
  [Intel XE#8355]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8355
  [Intel XE#8364]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8364
  [Intel XE#8365]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8365
  [Intel XE#8374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8374
  [Intel XE#8378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8378
  [Intel XE#9009]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9009
  [Intel XE#9093]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9093
  [Intel XE#9096]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9096
  [Intel XE#9142]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9142
  [Intel XE#9144]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9144
  [Intel XE#9297]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9297
  [Intel XE#9347]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9347
  [Intel XE#9362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9362
  [Intel XE#9365]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9365
  [Intel XE#9399]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9399
  [Intel XE#9425]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9425
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
  [Intel XE#9461]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9461
  [Intel XE#9463]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9463


Build changes
-------------

  * Linux: xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f -> xe-pw-138256v11

  IGT_9156: 9156
  xe-5997-dccfdbc40b10720efe537dfc63de84eed983fc8f: dccfdbc40b10720efe537dfc63de84eed983fc8f
  xe-pw-138256v11: 138256v11

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-138256v11/index.html

[-- Attachment #2: Type: text/html, Size: 43410 bytes --]

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

* RE: [PATCH v7 13/13] drm/i915/dp: Bump the max Link M/N ratio to 22 for DISPLAY_VER >= 35
  2026-10-22  3:22 ` [PATCH v7 13/13] drm/i915/dp: Bump the max Link M/N ratio to 22 for DISPLAY_VER >= 35 Suraj Kandpal
@ 2026-10-22 14:08   ` Golani, Mitulkumar Ajitkumar
  0 siblings, 0 replies; 28+ messages in thread
From: Golani, Mitulkumar Ajitkumar @ 2026-10-22 14:08 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: 22 October 2026 08:53
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Golani, Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani@intel.com>;
> Kandpal, Suraj <suraj.kandpal@intel.com>
> Subject: [PATCH v7 13/13] drm/i915/dp: Bump the max Link M/N ratio to 22
> for DISPLAY_VER >= 35
> 
> Starting Xe3p max M/N ratio has been increased to 22.
> 
> Bspec: 68922
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index 045524994d85..5864e33456a7 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1272,6 +1272,9 @@ bool intel_dp_has_dsc(const struct
> intel_connector *connector)  static int  intel_dp_get_max_m_n_ratio(struct
> intel_display *display)  {
> +	if (DISPLAY_VER(display) >= 35)
> +		return 22;
> +

LGTM
Reviewed-by: Mitul Golani<mitulkumar.ajitkumar.golani@intel.com>

>  	if (intel_display_wa(display, INTEL_DISPLAY_WA_14014191401))
>  		return 4;
> 
> --
> 2.34.1


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

* RE: [PATCH v7 12/13] drm/i915/dp: Extend intel_dp_can_support_m_n() for BMG M/N bypass
  2026-10-22  3:22 ` [PATCH v7 12/13] drm/i915/dp: Extend intel_dp_can_support_m_n() for BMG M/N bypass Suraj Kandpal
@ 2026-10-22 16:13   ` Golani, Mitulkumar Ajitkumar
  2026-10-22 17:05     ` Kandpal, Suraj
  0 siblings, 1 reply; 28+ messages in thread
From: Golani, Mitulkumar Ajitkumar @ 2026-10-22 16:13 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: 22 October 2026 08:53
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Golani, Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani@intel.com>;
> Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> <suraj.kandpal@intel.com>
> Subject: [PATCH v7 12/13] drm/i915/dp: Extend intel_dp_can_support_m_n()
> for BMG M/N bypass
> 
> From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> 
> On BMG platforms, the standard M/N ratio limit of 10 can be bypassed under
> specific conditions, as permitted by hardware capabilities.
> 
> Modify the helper intel_dp_can_support_m_n() to account for this by
> checking whether the platform supports bypassing the limit. The workaround
> is only intended for 128b/132b links, so restrict it to those.
> 
> During the mode_valid phase, the check assumes that TRANSCODER_A will be
> used, to allow the mode where the M/N ratio is within the limits for the
> workaround.
> 
> v2:
> -Keep the helper static: the MST mode_valid now goes through the shared
> intel_dp_mode_valid_m_n() rather than calling it directly, so it no longer
> needs to be exported.
> v3:
> -Use the cpu transcoder instead of the pipe, following the change to
> intel_display_can_bypass_m_n_limit(). (Mitul)
> 
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c | 18 +++++++++++++++---
>  1 file changed, 15 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index 8e6ba5b9fde6..045524994d85 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1285,9 +1285,11 @@ static int intel_dp_link_m_n_ratio(u32 link_m,
> u32 link_n)
> 
>  static bool
>  intel_dp_can_support_m_n(struct intel_display *display,
> +			 const struct intel_crtc_state *crtc_state,
>  			 int pixel_clock, int link_rate)
>  {
>  	int max_m_n_ratio = intel_dp_get_max_m_n_ratio(display);
> +	enum transcoder cpu_transcoder = TRANSCODER_A;
>  	u32 link_m, link_n;
>  	int m_n_ratio;
> 
> @@ -1296,7 +1298,16 @@ intel_dp_can_support_m_n(struct intel_display
> *display,
> 
>  	m_n_ratio = intel_dp_link_m_n_ratio(link_m, link_n);
> 
> -	return m_n_ratio <= max_m_n_ratio;
> +	if (m_n_ratio <= max_m_n_ratio)
> +		return true;
> +
> +	if (!drm_dp_is_uhbr_rate(link_rate))
> +		return false;
> +
> +	if (crtc_state)
> +		cpu_transcoder = crtc_state->cpu_transcoder;
> +
> +	return intel_display_can_bypass_m_n_limit(display, m_n_ratio,
> +cpu_transcoder);

The same bypass conditions (UHBR + intel_display_can_bypass_m_n_limit) are duplicated
in intel_dp_check_m_n_ratio. Please move them into one helper so the prediction and
the decision can't drift apart.

>  }
> 
>  void intel_dp_check_m_n_ratio(const struct intel_crtc_state *crtc_state,
> @@ -1386,7 +1397,7 @@ bool intel_dp_mode_valid_m_n(struct intel_dp
> *intel_dp, int pixel_clock)
>  	intel_dp_link_caps_iter_start(&iter, intel_dp->link.caps, order,
>  				      INTEL_DP_LINK_CAPS_FILTER_ALL);
>  	for_each_dp_link_config(&iter, &link_config) {
> -		if (intel_dp_can_support_m_n(display, m_n_pixel_clock,
> +		if (intel_dp_can_support_m_n(display, NULL,
> m_n_pixel_clock,
>  					     link_config.rate)) {
>  			found = true;
> 
> @@ -2775,7 +2786,8 @@ intel_dp_compute_m_n_ratio_limits(struct
> intel_dp *intel_dp,
> 
>  	intel_dp_link_caps_iter_start(&iter, link_caps, order, limits-
> >link_config_filter);
>  	for_each_dp_link_config(&iter, &link_config) {
> -		if (!intel_dp_can_support_m_n(display, pixel_clock,
> link_config.rate))
> +		if (!intel_dp_can_support_m_n(display, crtc_state,
> pixel_clock,
> +					      link_config.rate))

Bypass-capable configs now land in the same filter as native ones.
SST walks rates in ascending order, so UHBR10 with the WA (ratio 10-15)
gets picked before UHBR13.5, which may satisfy the ratio natively.
Could we keep the WA as a last resort: build the native filter first,
and add the bypass-capable configs only if none qualify?

>  			continue;
> 
>  		intel_dp_link_caps_filter_add(link_caps, &new_filter,
> &link_config);

One suggestion, not mandatory,

If possible,

This makes the bypass branch added in "Implement Wa_14021768792 for BMG DP..." reachable.
Please put this patch first or squash the two, so the WA arrives as one working change.

> --
> 2.34.1


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

* RE: [PATCH v7 02/13] drm/i915/dp: Limit M/N ratio for DP
  2026-10-22  3:22 ` [PATCH v7 02/13] drm/i915/dp: Limit M/N ratio for DP Suraj Kandpal
  2026-10-22  3:34   ` sashiko-bot
@ 2026-10-22 16:29   ` Golani, Mitulkumar Ajitkumar
  1 sibling, 0 replies; 28+ messages in thread
From: Golani, Mitulkumar Ajitkumar @ 2026-10-22 16:29 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: 22 October 2026 08:53
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Golani, Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani@intel.com>;
> Kandpal, Suraj <suraj.kandpal@intel.com>; Nautiyal, Ankit K
> <ankit.k.nautiyal@intel.com>
> Subject: [PATCH v7 02/13] drm/i915/dp: Limit M/N ratio for DP
> 
> The hardware cannot support DisplayPort configurations where the ceiling of
> the Link M/Link N ratio exceeds the limit the transcoder's timing generator
> DDA can track. This limitation has always existed, but it typically wasn't
> encountered without the use of joiners and DSC.
> With higher resolutions and combinations involving joiners and DSC, this
> constraint can now be hit in certain scenarios.
> 
> Restrict the link configurations to those satisfying the constraint while
> computing the link config limits, so that the SST and the MST paths both get
> it, and so that a mode which no link rate can support fails early rather than
> deep inside link config selection.
> 
> Also prune such modes in mode_valid. Note the ratio is the pixel clock over
> the link symbol clock, and the symbol clock is not monotonic in the link rate: it
> is the rate divided by 32 for 128b/132b but only by 10 for 8b/10b, so e.g.
> HBR3 has a higher symbol clock than UHBR20. There is therefore no single
> best link rate to evaluate against, and mode_valid walks the link
> configurations instead, only rejecting the mode if none of them can satisfy
> the ratio.
> 
> For MSO, intel_dp_compute_config() divides adjusted_mode->crtc_clock by
> the MSO link count before computing the link M/N. The limits and
> mode_valid are evaluated before that, so divide the pixel clock by the link
> count there as well, otherwise the check would be too strict by that factor.
> The joiner needs no such handling, as
> intel_joiner_adjust_timings() only rewrites the pipe mode and leaves the
> adjusted mode the link M/N is derived from untouched.
> 
> Note: MST goes through intel_dp_compute_config_limits() as well, so its
> compute config is already covered here. Only pruning the modes in the MST
> mode_valid is left, which is added in a subsequent commit.
> 
> v2:
> -Move the M/N ratio check to the link rate configuration phase instead of
> during M/N computation. (Ville) -Prune modes that cannot be supported
> even with highest link rate due to M/N ratio restriction.
> v3:
> -Rebase on the link caps iterator based link config selection.
> -Set the constraint up in intel_dp_compute_config_limits() by narrowing the
> link config filter, and fail there if no config qualifies, instead of skipping
> configs while iterating them. (Imre) -Use a limit of 4 on DG2.
> (Wa_14014191401) -Walk the link configurations in mode_valid rather than
> evaluating the ratio at the highest link rate, which is not the best case for it.
> v4:
> -Add iterator for all dp configs in intel_dp_mode_valid_m_n() so that we do
> not prune any mode that could have been supported (Sashiko)
> v5:
> -Drop "SST" from the subject and fix the note, MST compute is already
> covered by the shared limits, only the MST mode_valid is left. (Mitul) -Add the
> Bspec reference. (Mitul) -Drop the link_n check, compute_m_n() fixes N at
> 0x80000 and only halves it, so it cannot be 0. (Mitul) -Fold in the MSO
> adjusted pixel clock from the M/N ratio check commit, so this commit is
> correct on its own. (Mitul) -Add intel_dp_link_m_n_ratio(), so that the M/N
> ratio check can share it. (Mitul)
> 
> Bspec: 49266
> Co-developed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display.c |   4 +-
>  drivers/gpu/drm/i915/display/intel_display.h |   2 +
>  drivers/gpu/drm/i915/display/intel_dp.c      | 114 +++++++++++++++++++
>  drivers/gpu/drm/i915/display/intel_dp.h      |   2 +
>  4 files changed, 120 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 580c36a52921..f74e7ddf0e41 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -2650,8 +2650,8 @@ static void compute_m_n(u32 *ret_m, u32 *ret_n,
>  	intel_reduce_m_n_ratio(ret_m, ret_n);
>  }
> 
> -static void intel_display_compute_link_m_n(u32 *link_m, u32 *link_n,
> -					   int pixel_clock, int
> link_symbol_clock)
> +void intel_display_compute_link_m_n(u32 *link_m, u32 *link_n,
> +				    int pixel_clock, int link_symbol_clock)
>  {
>  	compute_m_n(link_m, link_n,
>  		    pixel_clock, link_symbol_clock,
> diff --git a/drivers/gpu/drm/i915/display/intel_display.h
> b/drivers/gpu/drm/i915/display/intel_display.h
> index eecafff167d3..404168f4213b 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_display.h
> @@ -523,5 +523,7 @@ bool assert_port_valid(struct intel_display *display,
> enum port port);
> 
>  bool intel_scanout_needs_vtd_wa(struct intel_display *display);  int
> intel_crtc_num_joined_pipes(const struct intel_crtc_state *crtc_state);
> +void intel_display_compute_link_m_n(u32 *link_m, u32 *link_n,
> +				    int pixel_clock, int link_symbol_clock);
> 
>  #endif
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index d8c0d9381471..7ceb7c02b597 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -63,6 +63,7 @@
>  #include "intel_de.h"
>  #include "intel_dip.h"
>  #include "intel_dip_regs.h"
> +#include "intel_display.h"
>  #include "intel_display_driver.h"
>  #include "intel_display_jiffies.h"
>  #include "intel_display_utils.h"
> @@ -1267,6 +1268,44 @@ bool intel_dp_has_dsc(const struct
> intel_connector *connector)
>  	return true;
>  }
> 
> +static int
> +intel_dp_get_max_m_n_ratio(struct intel_display *display) {
> +	if (display->platform.dg2)
> +		return 4;
> +
> +	return 10;
> +}
> +
> +static int intel_dp_link_m_n_ratio(u32 link_m, u32 link_n) {
> +	return DIV_ROUND_UP(link_m, link_n);
> +}
> +
> +static bool
> +intel_dp_can_support_m_n(struct intel_display *display,
> +			 int pixel_clock, int link_rate)
> +{
> +	int max_m_n_ratio = intel_dp_get_max_m_n_ratio(display);
> +	u32 link_m, link_n;
> +	int m_n_ratio;
> +
> +	intel_display_compute_link_m_n(&link_m, &link_n, pixel_clock,
> +				       intel_dp_link_symbol_clock(link_rate));
> +
> +	m_n_ratio = intel_dp_link_m_n_ratio(link_m, link_n);
> +
> +	return m_n_ratio <= max_m_n_ratio;
> +}
> +
> +static int intel_dp_mso_pixel_clock(struct intel_dp *intel_dp, int
> +pixel_clock) {
> +	if (!intel_dp->mso_link_count)
> +		return pixel_clock;
> +
> +	return pixel_clock / intel_dp->mso_link_count; }
> +
>  static
>  bool intel_dp_can_join(struct intel_dp *intel_dp,
>  		       int num_joined_pipes)
> @@ -1302,6 +1341,33 @@ bool intel_dp_dotclk_valid(struct intel_display
> *display,
>  	return target_clock <= effective_dotclk_limit;  }
> 
> +bool intel_dp_mode_valid_m_n(struct intel_dp *intel_dp, int
> +pixel_clock) {
> +	struct intel_display *display = to_intel_display(intel_dp);
> +	int m_n_pixel_clock = intel_dp_mso_pixel_clock(intel_dp,
> pixel_clock);
> +	struct intel_dp_link_caps_order order = {
> +		.key = INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE,
> +		.dir = INTEL_DP_LINK_CAPS_ORDER_DIR_DESC,
> +	};
> +	struct intel_dp_link_config link_config;
> +	struct intel_dp_link_caps_iter iter;
> +	bool found = false;
> +
> +	intel_dp_link_caps_iter_start(&iter, intel_dp->link.caps, order,
> +				      INTEL_DP_LINK_CAPS_FILTER_ALL);
> +	for_each_dp_link_config(&iter, &link_config) {
> +		if (intel_dp_can_support_m_n(display, m_n_pixel_clock,
> +					     link_config.rate)) {
> +			found = true;
> +
> +			break;
> +		}
> +	}
> +	intel_dp_link_caps_iter_end(&iter);
> +
> +	return found;
> +}
> +
>  static enum drm_mode_status
>  intel_dp_mode_valid_format(struct intel_connector *connector,
>  			   const struct drm_display_mode *mode, @@ -
> 1456,6 +1522,9 @@ intel_dp_mode_valid(struct drm_connector
> *_connector,
>  			return status;
>  	}
> 
> +	if (!intel_dp_mode_valid_m_n(intel_dp, target_clock))
> +		return MODE_CLOCK_HIGH;
> +
>  	/*
>  	 * TODO: Even when using a 4:2:0 sink_format
> intel_dp_output_format()
>  	 * will always choose a 4:4:4 output_format if the DFP can do the @@
> -2656,6 +2725,48 @@ intel_dp_dsc_compute_pipe_bpp_limits(struct
> intel_connector *connector,
>  	return true;
>  }
> 
> +static bool
> +intel_dp_compute_m_n_ratio_limits(struct intel_dp *intel_dp,
> +				  struct drm_connector_state *conn_state,
> +				  const struct intel_crtc_state *crtc_state,
> +				  struct link_config_limits *limits) {
> +	struct intel_display *display = to_intel_display(intel_dp);
> +	struct intel_connector *connector = to_intel_connector(conn_state-
> >connector);
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp_link_caps_order order =
> +		intel_dp_link_caps_connector_compute_order(connector);
> +	struct intel_dp_link_caps_filter new_filter =
> INTEL_DP_LINK_CAPS_FILTER_NONE;
> +	int pixel_clock = intel_dp_mso_pixel_clock(intel_dp,
> +
> intel_dp_mode_clock(crtc_state, conn_state));
> +	struct intel_dp_link_config link_config;
> +	struct intel_dp_link_caps_iter iter;
> +	bool found = false;
> +
> +	intel_dp_link_caps_iter_start(&iter, link_caps, order, limits-
> >link_config_filter);
> +	for_each_dp_link_config(&iter, &link_config) {
> +		if (!intel_dp_can_support_m_n(display, pixel_clock,
> link_config.rate))
> +			continue;
> +
> +		intel_dp_link_caps_filter_add(link_caps, &new_filter,
> &link_config);
> +		found = true;
> +	}
> +	intel_dp_link_caps_iter_end(&iter);
> +
> +	if (!found) {
> +		drm_dbg_kms(display->drm,
> +			    "[CONNECTOR:%d:%s] No link config with a Link
> M/N ratio <= %d\n",
> +			    connector->base.base.id, connector->base.name,
> +			    intel_dp_get_max_m_n_ratio(display));
> +
> +		return false;
> +	}
> +
> +	limits->link_config_filter = new_filter;
> +
> +	return true;
> +}
> +
>  bool
>  intel_dp_compute_config_limits(struct intel_dp *intel_dp,
>  			       struct drm_connector_state *conn_state, @@ -
> 2772,6 +2883,9 @@ intel_dp_compute_config_limits(struct intel_dp
> *intel_dp,
>  		limits->link_config_filter = new_filter;
>  	}
> 
> +	if (!intel_dp_compute_m_n_ratio_limits(intel_dp, conn_state,
> crtc_state, limits))
> +		return false;
> +
>  	if (!intel_dp_test_compute_config(connector, crtc_state, limits))
>  		return false;
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.h
> b/drivers/gpu/drm/i915/display/intel_dp.h
> index 04fae203bb69..aa58833a405b 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp.h
> @@ -239,6 +239,8 @@ bool intel_dp_joiner_candidate_valid(struct
> intel_connector *connector,
> 
>  u8 intel_dp_as_sdp_transmission_time(void);
> 
> +bool intel_dp_mode_valid_m_n(struct intel_dp *intel_dp, int
> +pixel_clock);
> +

LGTM
Reviewed-by: Mitul Golani<mitulkumar.ajitkumar.golani@intel.com>

>  int intel_dp_link_init(struct intel_dp *intel_dp);  void
> intel_dp_link_cleanup(struct intel_dp *intel_dp);
> 
> --
> 2.34.1


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

* RE: [PATCH v7 04/13] drm/i915/dp_mst: Limit M/N ratio for MST
  2026-10-22  3:22 ` [PATCH v7 04/13] drm/i915/dp_mst: Limit M/N ratio for MST Suraj Kandpal
  2026-10-22  3:43   ` sashiko-bot
@ 2026-10-22 16:42   ` Golani, Mitulkumar Ajitkumar
  1 sibling, 0 replies; 28+ messages in thread
From: Golani, Mitulkumar Ajitkumar @ 2026-10-22 16:42 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: 22 October 2026 08:53
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Golani, Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani@intel.com>;
> Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> <suraj.kandpal@intel.com>
> Subject: [PATCH v7 04/13] drm/i915/dp_mst: Limit M/N ratio for MST
> 
> From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> 
> The hardware does not support DisplayPort configurations where the ceiling
> of the Link M/Link N ratio exceeds the limit. Enforce this constraint for MST as
> well.
> 
> The compute config path needs no change: MST goes through
> intel_dp_compute_config_limits() too, so the link config filter set up there
> already excludes the configurations violating the ratio limit, and MST fails
> there if none is left.
> 
> What is still missing is pruning such modes, so add the check to
> mst_connector_mode_valid_ctx(), reusing the helper the SST mode_valid
> uses. It walks the link configurations and only rejects the mode if none of
> them can satisfy the ratio, rather than evaluating it at a single link rate.
> 
> v2:
> -Drop the checks in the MST link config helpers, redundant now that the
> constraint is applied while computing the link config limits. (Imre) -Share the
> mode_valid helper with SST instead of evaluating the ratio at one link rate,
> since the link symbol clock is not monotonic in the link rate and there is no
> single best case configuration.
> v3:
> -Now that intel_dp_mode_valid_m_n checks for all configs just call that
> (Sashiko)
> 
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp_mst.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 7023619aaaba..f00edfb66a10 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -1565,6 +1565,11 @@ mst_connector_mode_valid_ctx(struct
> drm_connector *_connector,
>  					   min_link_bpp_x16,
>  					   bw_overhead_flags);
> 
> +	if (!intel_dp_mode_valid_m_n(intel_dp, mode->clock)) {
> +		*status = MODE_CLOCK_HIGH;
> +		return 0;
> +	}
> +

Please check my in-line reply on

[PATCH v4 03/10] drm/i915/dp_mst: Limit M/N ratio for MST

Thanks
>  	/*
>  	 * TODO:
>  	 * - Also check if compression would allow for the mode
> --
> 2.34.1


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

* RE: [PATCH v7 12/13] drm/i915/dp: Extend intel_dp_can_support_m_n() for BMG M/N bypass
  2026-10-22 16:13   ` Golani, Mitulkumar Ajitkumar
@ 2026-10-22 17:05     ` Kandpal, Suraj
  0 siblings, 0 replies; 28+ messages in thread
From: Kandpal, Suraj @ 2026-10-22 17:05 UTC (permalink / raw)
  To: Golani, Mitulkumar Ajitkumar, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K

> > Subject: [PATCH v7 12/13] drm/i915/dp: Extend
> > intel_dp_can_support_m_n() for BMG M/N bypass
> >
> > From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> >
> > On BMG platforms, the standard M/N ratio limit of 10 can be bypassed
> > under specific conditions, as permitted by hardware capabilities.
> >
> > Modify the helper intel_dp_can_support_m_n() to account for this by
> > checking whether the platform supports bypassing the limit. The
> > workaround is only intended for 128b/132b links, so restrict it to those.
> >
> > During the mode_valid phase, the check assumes that TRANSCODER_A will
> > be used, to allow the mode where the M/N ratio is within the limits
> > for the workaround.
> >
> > v2:
> > -Keep the helper static: the MST mode_valid now goes through the
> > shared
> > intel_dp_mode_valid_m_n() rather than calling it directly, so it no
> > longer needs to be exported.
> > v3:
> > -Use the cpu transcoder instead of the pipe, following the change to
> > intel_display_can_bypass_m_n_limit(). (Mitul)
> >
> > Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_dp.c | 18 +++++++++++++++---
> >  1 file changed, 15 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> > b/drivers/gpu/drm/i915/display/intel_dp.c
> > index 8e6ba5b9fde6..045524994d85 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -1285,9 +1285,11 @@ static int intel_dp_link_m_n_ratio(u32 link_m,
> > u32 link_n)
> >
> >  static bool
> >  intel_dp_can_support_m_n(struct intel_display *display,
> > +			 const struct intel_crtc_state *crtc_state,
> >  			 int pixel_clock, int link_rate)
> >  {
> >  	int max_m_n_ratio = intel_dp_get_max_m_n_ratio(display);
> > +	enum transcoder cpu_transcoder = TRANSCODER_A;
> >  	u32 link_m, link_n;
> >  	int m_n_ratio;
> >
> > @@ -1296,7 +1298,16 @@ intel_dp_can_support_m_n(struct intel_display
> > *display,
> >
> >  	m_n_ratio = intel_dp_link_m_n_ratio(link_m, link_n);
> >
> > -	return m_n_ratio <= max_m_n_ratio;
> > +	if (m_n_ratio <= max_m_n_ratio)
> > +		return true;
> > +
> > +	if (!drm_dp_is_uhbr_rate(link_rate))
> > +		return false;
> > +
> > +	if (crtc_state)
> > +		cpu_transcoder = crtc_state->cpu_transcoder;
> > +
> > +	return intel_display_can_bypass_m_n_limit(display, m_n_ratio,
> > +cpu_transcoder);
> 
> The same bypass conditions (UHBR + intel_display_can_bypass_m_n_limit)
> are duplicated in intel_dp_check_m_n_ratio. Please move them into one
> helper so the prediction and the decision can't drift apart.

Sure will do.

> 
> >  }
> >
> >  void intel_dp_check_m_n_ratio(const struct intel_crtc_state
> > *crtc_state, @@ -1386,7 +1397,7 @@ bool
> intel_dp_mode_valid_m_n(struct
> > intel_dp *intel_dp, int pixel_clock)
> >  	intel_dp_link_caps_iter_start(&iter, intel_dp->link.caps, order,
> >  				      INTEL_DP_LINK_CAPS_FILTER_ALL);
> >  	for_each_dp_link_config(&iter, &link_config) {
> > -		if (intel_dp_can_support_m_n(display, m_n_pixel_clock,
> > +		if (intel_dp_can_support_m_n(display, NULL,
> > m_n_pixel_clock,
> >  					     link_config.rate)) {
> >  			found = true;
> >
> > @@ -2775,7 +2786,8 @@ intel_dp_compute_m_n_ratio_limits(struct
> > intel_dp *intel_dp,
> >
> >  	intel_dp_link_caps_iter_start(&iter, link_caps, order, limits-
> > >link_config_filter);
> >  	for_each_dp_link_config(&iter, &link_config) {
> > -		if (!intel_dp_can_support_m_n(display, pixel_clock,
> > link_config.rate))
> > +		if (!intel_dp_can_support_m_n(display, crtc_state,
> > pixel_clock,
> > +					      link_config.rate))
> 
> Bypass-capable configs now land in the same filter as native ones.
> SST walks rates in ascending order, so UHBR10 with the WA (ratio 10-15) gets
> picked before UHBR13.5, which may satisfy the ratio natively.
> Could we keep the WA as a last resort: build the native filter first, and add the
> bypass-capable configs only if none qualify?
 
On using the WA as a last resort: native first breaks the WA in practice.
Whenever UHBR10 needs the WA (ratio 10-15, ~3.1-4.7 GHz), HBR2/HBR3 pass the
ratio natively thanks to their higher symbol clock, so the native set is
never empty and the WA configs never get added. Since the filter is built
before the BW check, a mode that only fits at UHBR10 would then fail compute.
Doing it right would need a second compute pass, and I don't think it buys
anything: a ratio above 10 needs ultrajoiner, which already disables seamless
M/N, there's no DRRS on BMG, and preferring the lower link rate is the
existing SST policy. Bspec only requires the WA to be used when the ratio
exceeds the limit, which is the case for the config we pick


> 
> >  			continue;
> >
> >  		intel_dp_link_caps_filter_add(link_caps, &new_filter,
> > &link_config);
> 
> One suggestion, not mandatory,
> 
> If possible,
> 
> This makes the bypass branch added in "Implement Wa_14021768792 for
> BMG DP..." reachable.
> Please put this patch first or squash the two, so the WA arrives as one
> working change.

With this patch first, ratios above 10 get
through the filter before anything sets the flag, so a bisect could land on a
config programmed without the WA. The bypass branch is also reachable before
this patch with forced link params. And I'd rather keep the two separate
than squash them.

Regards,
Suraj Kandpal

> 
> > --
> > 2.34.1


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

* RE: [PATCH v7 08/13] drm/i915/display: Add bits for Wa_14021768792 for linkm/n ratio > 10
  2026-10-22  3:22 ` [PATCH v7 08/13] drm/i915/display: Add bits for Wa_14021768792 for linkm/n ratio > 10 Suraj Kandpal
@ 2026-10-22 17:32   ` Golani, Mitulkumar Ajitkumar
  2026-10-22 17:42     ` Golani, Mitulkumar Ajitkumar
  0 siblings, 1 reply; 28+ messages in thread
From: Golani, Mitulkumar Ajitkumar @ 2026-10-22 17:32 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: 22 October 2026 08:53
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Golani, Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani@intel.com>;
> Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> <suraj.kandpal@intel.com>
> Subject: [PATCH v7 08/13] drm/i915/display: Add bits for Wa_14021768792
> for linkm/n ratio > 10
> 
> From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> 
> To support a Link M/N ratio between 10.0 and 15.0, for some BMG ultrajoiner
> cases we need Wa_14021768792.
> 
> To bypass the hardware limitation within the Timing Generator DDA (TGDDA),
> we need to program the LINKM and LINKN registers as defined in the WA.
> Along with this we also need the relevant bits in HDMI_EMP_DATA and
> CHICKEN_TRANS.
> 
> Add the bits for the WA and a new member 'bypass_m_n_ratio_limit' to track
> if we need to bypass the Link M/N ratio limit in the intel_link_m_n structure.
> 
> Per Bspec the extended LINK_N field is two nibbles: bits 27:24 hold INT(Link
> M / Link N) and bits 31:28 hold CEIL(Link M / Link N).
> 
> The workaround is limited to transcoder A. Check the transcoder rather than
> the pipe: for a single pipe the two are the same, but the joiner secondaries
> read the M/N back through the primary's transcoder, so a pipe check would
> have them report the workaround as not applied while their state, copied
> from the primary, has it applied.
> 
> CHICKEN_TRANS and HDMI_EMP_DATA are programmed before LINK_N,
> since writing LINK_N arms the double buffered update of the M/N registers,
> and all of the programming has to be done before the transcoder is enabled.
> Both are also explicitly cleared when the mechanism is not in use, so that
> state cannot leak from a previous modeset.
> 
> v2:
> -Drop the drm_WARN_ON() on the extended LINK_N field in intel_get_m_n():
> it is derived from Link M and Link N, so the state checker comparison of those
> and of bypass_m_n_ratio_limit already covers it. (Sashiko) -Compare
> bypass_m_n_ratio_limit unconditionally, so that a change to it forces a full
> modeset instead of being applied during a seamless M/N fastset. (Sashiko)
> v3:
> -Check for transcoder A instead of pipe A, so that the joiner secondaries read
> the flag back the same as the primary. (Mitul) -Drop bypass_m_n_ratio_limit
> from intel_compare_link_m_n(), the unconditional
> PIPE_CONF_CHECK_BOOL() already compares it. (Mitul) -Print
> bypass_m_n_ratio_limit in the crtc state dump. (Mitul)
> v4:
> -Move the state checker comparison and the state dump of
> bypass_m_n_ratio_limit to separate commits. (Mitul)
> 
> Bspec: 49266
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display.c  | 80 ++++++++++++++++++-
> drivers/gpu/drm/i915/display/intel_display.h  |  2 +
> .../gpu/drm/i915/display/intel_display_regs.h | 10 +++
>  .../drm/i915/display/intel_display_types.h    |  2 +
>  4 files changed, 93 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 461b81bf8341..9e9321976a21 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -2715,6 +2715,15 @@ void intel_zero_m_n(struct intel_link_m_n *m_n)
>  	m_n->tu = 1;
>  }
> 
> +static u8 bmg_get_link_n_ext(const struct intel_link_m_n *m_n) {
> +	if (!m_n->link_n)
> +		return 0;
> +
> +	return PIPE_LINK_N1_EXT_INT(m_n->link_m / m_n->link_n) |
> +		PIPE_LINK_N1_EXT_CEIL(DIV_ROUND_UP(m_n->link_m,
> m_n->link_n)); }
> +
>  void intel_set_m_n(struct intel_display *display,
>  		   const struct intel_link_m_n *m_n,
>  		   intel_reg_t data_m_reg, intel_reg_t data_n_reg, @@ -
> 2726,7 +2735,9 @@ void intel_set_m_n(struct intel_display *display,
>  	intel_de_write(display, data_n_reg, m_n->data_n);
>  	intel_de_write(display, link_m_reg, m_n->link_m);
> 
> -	if (DISPLAY_VER(display) >= 14)
> +	if (DISPLAY_VER(display) >= 14 && m_n->bypass_m_n_ratio_limit)
> +		link_n |=
> PIPE_LINK_N1_EXTENDED(bmg_get_link_n_ext(m_n));
> +	else if (DISPLAY_VER(display) >= 14)
>  		link_n &= ~PIPE_LINK_N1_EXTENDED_MASK;
>  	else
>  		link_n &= DATA_LINK_M_N_MASK;
> @@ -2747,6 +2758,26 @@ bool intel_cpu_transcoder_has_m2_n2(struct
> intel_display *display,
>  	return IS_DISPLAY_VER(display, 5, 7) || display->platform.cherryview;
> }
> 
> +static void bmg_enhanced_tgdda_write(struct intel_crtc *crtc,
> +				     enum transcoder transcoder,
> +				     const struct intel_link_m_n *m_n) {
> +	struct intel_display *display = to_intel_display(crtc);
> +	bool enable = m_n->bypass_m_n_ratio_limit && m_n->link_n;
> +	u32 link_m_frac = enable ? m_n->link_m % m_n->link_n : 0;
> +
> +	if (!intel_display_wa(display, INTEL_DISPLAY_WA_14021768792))
> +		return;
> +
> +	intel_de_rmw(display, HDMI_EMP_DATA(display, transcoder),
> +		     HDMI_EMP_DATA_LINK_M_FRAC_MASK,
> +		     REG_FIELD_PREP(HDMI_EMP_DATA_LINK_M_FRAC_MASK,
> link_m_frac));
> +
> +	intel_de_rmw(display, CHICKEN_TRANS(display, transcoder),
> +		     DP_ENHANCED_TGDDA_ENABLE,
> +		     enable ? DP_ENHANCED_TGDDA_ENABLE : 0); }
> +
>  void intel_cpu_transcoder_set_m1_n1(struct intel_crtc *crtc,
>  				    enum transcoder transcoder,
>  				    const struct intel_link_m_n *m_n) @@ -
> 2754,6 +2785,8 @@ void intel_cpu_transcoder_set_m1_n1(struct intel_crtc
> *crtc,
>  	struct intel_display *display = to_intel_display(crtc);
>  	enum pipe pipe = crtc->pipe;
> 
> +	bmg_enhanced_tgdda_write(crtc, transcoder, m_n);
> +
>  	if (DISPLAY_VER(display) >= 5)
>  		intel_set_m_n(display, m_n,
>  			      PIPE_DATA_M1(display, transcoder), @@ -3504,6
> +3537,49 @@ void intel_get_m_n(struct intel_display *display,
>  	m_n->tu = REG_FIELD_GET(TU_SIZE_MASK, intel_de_read(display,
> data_m_reg)) + 1;  }
> 
> +bool intel_display_can_bypass_m_n_limit(struct intel_display *display,
> +					int m_n_ratio,
> +					enum transcoder transcoder)
> +{
> +	if (!intel_display_wa(display, INTEL_DISPLAY_WA_14021768792))
> +		return false;
> +
> +	if (m_n_ratio > 15)
> +		return false;
> +
> +	if (transcoder != TRANSCODER_A)
> +		return false;
> +
> +	return true;
> +}
> +
> +static void bmg_enhanced_tgdda_read(struct intel_crtc *crtc,
> +				    enum transcoder transcoder,
> +				    struct intel_link_m_n *m_n)
> +{
> +	struct intel_display *display = to_intel_display(crtc);
> +	u32 link_m_frac;
> +	int m_n_ratio;
> +
> +	if (!m_n->link_n)
> +		return;
> +
> +	m_n_ratio = DIV_ROUND_UP(m_n->link_m, m_n->link_n);
> +
> +	if (!intel_display_can_bypass_m_n_limit(display, m_n_ratio,
> transcoder))
> +		return;
> +
> +	if (!(intel_de_read(display, CHICKEN_TRANS(display, transcoder)) &
> +	      DP_ENHANCED_TGDDA_ENABLE))
> +		return;
> +
> +	link_m_frac =
> REG_FIELD_GET(HDMI_EMP_DATA_LINK_M_FRAC_MASK,
> +				    intel_de_read(display,
> HDMI_EMP_DATA(display, transcoder)));
> +
> +	if (link_m_frac == m_n->link_m % m_n->link_n)
> +		m_n->bypass_m_n_ratio_limit = true;
> +}
> +
>  void intel_cpu_transcoder_get_m1_n1(struct intel_crtc *crtc,
>  				    enum transcoder transcoder,
>  				    struct intel_link_m_n *m_n)
> @@ -3521,6 +3597,8 @@ void intel_cpu_transcoder_get_m1_n1(struct
> intel_crtc *crtc,
>  		intel_get_m_n(display, m_n,
>  			      PIPE_DATA_M_G4X(pipe),
> PIPE_DATA_N_G4X(pipe),
>  			      PIPE_LINK_M_G4X(pipe),
> PIPE_LINK_N_G4X(pipe));
> +
> +	bmg_enhanced_tgdda_read(crtc, transcoder, m_n);
>  }
> 
>  void intel_cpu_transcoder_get_m2_n2(struct intel_crtc *crtc, diff --git
> a/drivers/gpu/drm/i915/display/intel_display.h
> b/drivers/gpu/drm/i915/display/intel_display.h
> index 404168f4213b..d53b7b4a80e7 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_display.h
> @@ -525,5 +525,7 @@ bool intel_scanout_needs_vtd_wa(struct
> intel_display *display);  int intel_crtc_num_joined_pipes(const struct
> intel_crtc_state *crtc_state);  void intel_display_compute_link_m_n(u32
> *link_m, u32 *link_n,
>  				    int pixel_clock, int link_symbol_clock);
> +bool intel_display_can_bypass_m_n_limit(struct intel_display *display,
> +					int m_n_ratio, enum transcoder
> transcoder);
> 
>  #endif
> diff --git a/drivers/gpu/drm/i915/display/intel_display_regs.h
> b/drivers/gpu/drm/i915/display/intel_display_regs.h
> index 983a0d9dcb9c..bbdbc27629d7 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_regs.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_regs.h
> @@ -550,6 +550,11 @@
>  #define _TRANS_MULT_B		0x6102c
>  #define TRANS_MULT(dev_priv, trans)	_MMIO_TRANS2(dev_priv, (trans),
> _TRANS_MULT_A)
> 
> +#define _HDMI_EMP_DATA_A	0x600d8
> +#define _HDMI_EMP_DATA_B	0x610d8
> +#define  HDMI_EMP_DATA_LINK_M_FRAC_MASK	REG_GENMASK(23, 0)
> +#define HDMI_EMP_DATA(display, trans)	_MMIO_TRANS2((display),
> (trans), _HDMI_EMP_DATA_A)
> +
>  /* Hotplug control (945+ only) */
>  #define PORT_HOTPLUG_EN(dev_priv)
> 	_MMIO(DISPLAY_MMIO_BASE(dev_priv) + 0x61110)
>  #define   PORTB_HOTPLUG_INT_EN			(1 << 29)
> @@ -1192,6 +1197,10 @@
>  #define _PIPEB_LINK_N1		0x61044
>  #define  PIPE_LINK_N1_EXTENDED_MASK	REG_GENMASK(31, 24)
>  #define  PIPE_LINK_N1_EXTENDED(val)
> 	REG_FIELD_PREP(PIPE_LINK_N1_EXTENDED_MASK, (val))
> +#define  PIPE_LINK_N1_EXT_CEIL_MASK	REG_GENMASK(7, 4)
> +#define  PIPE_LINK_N1_EXT_CEIL(val)
> 	REG_FIELD_PREP(PIPE_LINK_N1_EXT_CEIL_MASK, (val))
> +#define  PIPE_LINK_N1_EXT_INT_MASK	REG_GENMASK(3, 0)
> +#define  PIPE_LINK_N1_EXT_INT(val)
> 	REG_FIELD_PREP(PIPE_LINK_N1_EXT_INT_MASK, (val))
>  #define PIPE_LINK_N1(dev_priv, tran) _MMIO_TRANS2(dev_priv, tran,
> _PIPEA_LINK_N1)
> 
>  #define _PIPEA_LINK_M2		0x60048
> @@ -1710,6 +1719,7 @@
>  #define   PSR2_ADD_VERTICAL_LINE_COUNT	REG_BIT(15)
>  #define   DP_FEC_BS_JITTER_WA		REG_BIT(15)
>  #define   PSR2_VSC_ENABLE_PROG_HEADER	REG_BIT(12)
> +#define   DP_ENHANCED_TGDDA_ENABLE	REG_BIT(11)
>  #define   DP_DSC_INSERT_SF_AT_EOL_WA	REG_BIT(4)
>  #define   HDCP_LINE_REKEY_DISABLE	REG_BIT(0)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 8f9fb2603638..d0748837ce97 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -985,6 +985,8 @@ struct intel_link_m_n {
>  	u32 data_n;
>  	u32 link_m;
>  	u32 link_n;
> +	/* Wa_14021768792 for linkm/n ratio > 10 */
> +	bool bypass_m_n_ratio_limit;

This commit still combines register definitions, WA programming, the bypass helper and readback.
For reviewability, could it be split into: (1) register definitions, (2) the bypass_m_n_ratio_limit member
plus write-side programming, (3) readback together with the state checker compare
(fold `drm/i915/display: Compare bypass_m_n_ratio_limit in the state checker` into it),
with the dump staying separate ?

I'd keep the compare after the readout rather than before, so it doesn't land without anything that sets the flag.

Not a blocker; the current order is bisect-safe.

>  };
> 
>  struct intel_csc_matrix {
> --
> 2.34.1


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

* RE: [PATCH v7 08/13] drm/i915/display: Add bits for Wa_14021768792 for linkm/n ratio > 10
  2026-10-22 17:32   ` Golani, Mitulkumar Ajitkumar
@ 2026-10-22 17:42     ` Golani, Mitulkumar Ajitkumar
  2026-10-23  3:39       ` Kandpal, Suraj
  0 siblings, 1 reply; 28+ messages in thread
From: Golani, Mitulkumar Ajitkumar @ 2026-10-22 17:42 UTC (permalink / raw)
  To: Golani, Mitulkumar Ajitkumar, Kandpal, Suraj,
	intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of
> Golani, Mitulkumar Ajitkumar
> Sent: 22 October 2026 23:02
> 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>
> Subject: RE: [PATCH v7 08/13] drm/i915/display: Add bits for
> Wa_14021768792 for linkm/n ratio > 10
> 
> 
> 
> > -----Original Message-----
> > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > Sent: 22 October 2026 08:53
> > To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> > Cc: Golani, Mitulkumar Ajitkumar
> > <mitulkumar.ajitkumar.golani@intel.com>;
> > Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> > <suraj.kandpal@intel.com>
> > Subject: [PATCH v7 08/13] drm/i915/display: Add bits for
> > Wa_14021768792 for linkm/n ratio > 10
> >
> > From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> >
> > To support a Link M/N ratio between 10.0 and 15.0, for some BMG
> > ultrajoiner cases we need Wa_14021768792.
> >
> > To bypass the hardware limitation within the Timing Generator DDA
> > (TGDDA), we need to program the LINKM and LINKN registers as defined in
> the WA.
> > Along with this we also need the relevant bits in HDMI_EMP_DATA and
> > CHICKEN_TRANS.
> >
> > Add the bits for the WA and a new member 'bypass_m_n_ratio_limit' to
> > track if we need to bypass the Link M/N ratio limit in the intel_link_m_n
> structure.
> >
> > Per Bspec the extended LINK_N field is two nibbles: bits 27:24 hold
> > INT(Link M / Link N) and bits 31:28 hold CEIL(Link M / Link N).
> >
> > The workaround is limited to transcoder A. Check the transcoder rather
> > than the pipe: for a single pipe the two are the same, but the joiner
> > secondaries read the M/N back through the primary's transcoder, so a
> > pipe check would have them report the workaround as not applied while
> > their state, copied from the primary, has it applied.
> >
> > CHICKEN_TRANS and HDMI_EMP_DATA are programmed before LINK_N,
> since
> > writing LINK_N arms the double buffered update of the M/N registers,
> > and all of the programming has to be done before the transcoder is
> enabled.
> > Both are also explicitly cleared when the mechanism is not in use, so
> > that state cannot leak from a previous modeset.
> >
> > v2:
> > -Drop the drm_WARN_ON() on the extended LINK_N field in
> intel_get_m_n():
> > it is derived from Link M and Link N, so the state checker comparison
> > of those and of bypass_m_n_ratio_limit already covers it. (Sashiko)
> > -Compare bypass_m_n_ratio_limit unconditionally, so that a change to
> > it forces a full modeset instead of being applied during a seamless
> > M/N fastset. (Sashiko)
> > v3:
> > -Check for transcoder A instead of pipe A, so that the joiner
> > secondaries read the flag back the same as the primary. (Mitul) -Drop
> > bypass_m_n_ratio_limit from intel_compare_link_m_n(), the
> > unconditional
> > PIPE_CONF_CHECK_BOOL() already compares it. (Mitul) -Print
> > bypass_m_n_ratio_limit in the crtc state dump. (Mitul)
> > v4:
> > -Move the state checker comparison and the state dump of
> > bypass_m_n_ratio_limit to separate commits. (Mitul)
> >
> > Bspec: 49266
> > Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_display.c  | 80
> > ++++++++++++++++++- drivers/gpu/drm/i915/display/intel_display.h  |  2
> > + .../gpu/drm/i915/display/intel_display_regs.h | 10 +++
> >  .../drm/i915/display/intel_display_types.h    |  2 +
> >  4 files changed, 93 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> > b/drivers/gpu/drm/i915/display/intel_display.c
> > index 461b81bf8341..9e9321976a21 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -2715,6 +2715,15 @@ void intel_zero_m_n(struct intel_link_m_n
> *m_n)
> >  	m_n->tu = 1;
> >  }
> >
> > +static u8 bmg_get_link_n_ext(const struct intel_link_m_n *m_n) {
> > +	if (!m_n->link_n)
> > +		return 0;
> > +
> > +	return PIPE_LINK_N1_EXT_INT(m_n->link_m / m_n->link_n) |
> > +		PIPE_LINK_N1_EXT_CEIL(DIV_ROUND_UP(m_n->link_m,
> > m_n->link_n)); }
> > +
> >  void intel_set_m_n(struct intel_display *display,
> >  		   const struct intel_link_m_n *m_n,
> >  		   intel_reg_t data_m_reg, intel_reg_t data_n_reg, @@ -
> > 2726,7 +2735,9 @@ void intel_set_m_n(struct intel_display *display,
> >  	intel_de_write(display, data_n_reg, m_n->data_n);
> >  	intel_de_write(display, link_m_reg, m_n->link_m);
> >
> > -	if (DISPLAY_VER(display) >= 14)
> > +	if (DISPLAY_VER(display) >= 14 && m_n->bypass_m_n_ratio_limit)
> > +		link_n |=
> > PIPE_LINK_N1_EXTENDED(bmg_get_link_n_ext(m_n));
> > +	else if (DISPLAY_VER(display) >= 14)
> >  		link_n &= ~PIPE_LINK_N1_EXTENDED_MASK;
> >  	else
> >  		link_n &= DATA_LINK_M_N_MASK;
> > @@ -2747,6 +2758,26 @@ bool intel_cpu_transcoder_has_m2_n2(struct
> > intel_display *display,
> >  	return IS_DISPLAY_VER(display, 5, 7) ||
> > display->platform.cherryview; }
> >
> > +static void bmg_enhanced_tgdda_write(struct intel_crtc *crtc,
> > +				     enum transcoder transcoder,
> > +				     const struct intel_link_m_n *m_n) {
> > +	struct intel_display *display = to_intel_display(crtc);
> > +	bool enable = m_n->bypass_m_n_ratio_limit && m_n->link_n;
> > +	u32 link_m_frac = enable ? m_n->link_m % m_n->link_n : 0;
> > +
> > +	if (!intel_display_wa(display, INTEL_DISPLAY_WA_14021768792))
> > +		return;
> > +
> > +	intel_de_rmw(display, HDMI_EMP_DATA(display, transcoder),
> > +		     HDMI_EMP_DATA_LINK_M_FRAC_MASK,
> > +		     REG_FIELD_PREP(HDMI_EMP_DATA_LINK_M_FRAC_MASK,
> > link_m_frac));
> > +
> > +	intel_de_rmw(display, CHICKEN_TRANS(display, transcoder),
> > +		     DP_ENHANCED_TGDDA_ENABLE,
> > +		     enable ? DP_ENHANCED_TGDDA_ENABLE : 0); }
> > +
> >  void intel_cpu_transcoder_set_m1_n1(struct intel_crtc *crtc,
> >  				    enum transcoder transcoder,
> >  				    const struct intel_link_m_n *m_n) @@ -
> > 2754,6 +2785,8 @@ void intel_cpu_transcoder_set_m1_n1(struct
> > intel_crtc *crtc,
> >  	struct intel_display *display = to_intel_display(crtc);
> >  	enum pipe pipe = crtc->pipe;
> >
> > +	bmg_enhanced_tgdda_write(crtc, transcoder, m_n);
> > +
> >  	if (DISPLAY_VER(display) >= 5)
> >  		intel_set_m_n(display, m_n,
> >  			      PIPE_DATA_M1(display, transcoder), @@ -3504,6
> > +3537,49 @@ void intel_get_m_n(struct intel_display *display,
> >  	m_n->tu = REG_FIELD_GET(TU_SIZE_MASK, intel_de_read(display,
> > data_m_reg)) + 1;  }
> >
> > +bool intel_display_can_bypass_m_n_limit(struct intel_display *display,
> > +					int m_n_ratio,
> > +					enum transcoder transcoder)
> > +{
> > +	if (!intel_display_wa(display, INTEL_DISPLAY_WA_14021768792))
> > +		return false;
> > +
> > +	if (m_n_ratio > 15)
> > +		return false;
> > +
> > +	if (transcoder != TRANSCODER_A)
> > +		return false;
> > +
> > +	return true;
> > +}
> > +
> > +static void bmg_enhanced_tgdda_read(struct intel_crtc *crtc,
> > +				    enum transcoder transcoder,
> > +				    struct intel_link_m_n *m_n)
> > +{
> > +	struct intel_display *display = to_intel_display(crtc);
> > +	u32 link_m_frac;
> > +	int m_n_ratio;
> > +
> > +	if (!m_n->link_n)
> > +		return;
> > +
> > +	m_n_ratio = DIV_ROUND_UP(m_n->link_m, m_n->link_n);
> > +
> > +	if (!intel_display_can_bypass_m_n_limit(display, m_n_ratio,
> > transcoder))
> > +		return;
> > +
> > +	if (!(intel_de_read(display, CHICKEN_TRANS(display, transcoder)) &
> > +	      DP_ENHANCED_TGDDA_ENABLE))
> > +		return;
> > +
> > +	link_m_frac =
> > REG_FIELD_GET(HDMI_EMP_DATA_LINK_M_FRAC_MASK,
> > +				    intel_de_read(display,
> > HDMI_EMP_DATA(display, transcoder)));
> > +
> > +	if (link_m_frac == m_n->link_m % m_n->link_n)
> > +		m_n->bypass_m_n_ratio_limit = true; }
> > +
> >  void intel_cpu_transcoder_get_m1_n1(struct intel_crtc *crtc,
> >  				    enum transcoder transcoder,
> >  				    struct intel_link_m_n *m_n)
> > @@ -3521,6 +3597,8 @@ void intel_cpu_transcoder_get_m1_n1(struct
> > intel_crtc *crtc,
> >  		intel_get_m_n(display, m_n,
> >  			      PIPE_DATA_M_G4X(pipe),
> > PIPE_DATA_N_G4X(pipe),
> >  			      PIPE_LINK_M_G4X(pipe),
> > PIPE_LINK_N_G4X(pipe));
> > +
> > +	bmg_enhanced_tgdda_read(crtc, transcoder, m_n);
> >  }
> >
> >  void intel_cpu_transcoder_get_m2_n2(struct intel_crtc *crtc, diff
> > --git a/drivers/gpu/drm/i915/display/intel_display.h
> > b/drivers/gpu/drm/i915/display/intel_display.h
> > index 404168f4213b..d53b7b4a80e7 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display.h
> > @@ -525,5 +525,7 @@ bool intel_scanout_needs_vtd_wa(struct
> > intel_display *display);  int intel_crtc_num_joined_pipes(const struct
> > intel_crtc_state *crtc_state);  void
> > intel_display_compute_link_m_n(u32
> > *link_m, u32 *link_n,
> >  				    int pixel_clock, int link_symbol_clock);
> > +bool intel_display_can_bypass_m_n_limit(struct intel_display *display,
> > +					int m_n_ratio, enum transcoder
> > transcoder);
> >
> >  #endif
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_regs.h
> > b/drivers/gpu/drm/i915/display/intel_display_regs.h
> > index 983a0d9dcb9c..bbdbc27629d7 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_regs.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_regs.h
> > @@ -550,6 +550,11 @@
> >  #define _TRANS_MULT_B		0x6102c
> >  #define TRANS_MULT(dev_priv, trans)	_MMIO_TRANS2(dev_priv,
> (trans),
> > _TRANS_MULT_A)
> >
> > +#define _HDMI_EMP_DATA_A	0x600d8
> > +#define _HDMI_EMP_DATA_B	0x610d8
> > +#define  HDMI_EMP_DATA_LINK_M_FRAC_MASK	REG_GENMASK(23, 0)
> > +#define HDMI_EMP_DATA(display, trans)	_MMIO_TRANS2((display),
> > (trans), _HDMI_EMP_DATA_A)
> > +
> >  /* Hotplug control (945+ only) */
> >  #define PORT_HOTPLUG_EN(dev_priv)
> > 	_MMIO(DISPLAY_MMIO_BASE(dev_priv) + 0x61110)
> >  #define   PORTB_HOTPLUG_INT_EN			(1 << 29)
> > @@ -1192,6 +1197,10 @@
> >  #define _PIPEB_LINK_N1		0x61044
> >  #define  PIPE_LINK_N1_EXTENDED_MASK	REG_GENMASK(31, 24)
> >  #define  PIPE_LINK_N1_EXTENDED(val)
> > 	REG_FIELD_PREP(PIPE_LINK_N1_EXTENDED_MASK, (val))
> > +#define  PIPE_LINK_N1_EXT_CEIL_MASK	REG_GENMASK(7, 4)
> > +#define  PIPE_LINK_N1_EXT_CEIL(val)
> > 	REG_FIELD_PREP(PIPE_LINK_N1_EXT_CEIL_MASK, (val))
> > +#define  PIPE_LINK_N1_EXT_INT_MASK	REG_GENMASK(3, 0)
> > +#define  PIPE_LINK_N1_EXT_INT(val)
> > 	REG_FIELD_PREP(PIPE_LINK_N1_EXT_INT_MASK, (val))  #define
> > PIPE_LINK_N1(dev_priv, tran) _MMIO_TRANS2(dev_priv, tran,
> > _PIPEA_LINK_N1)
> >
> >  #define _PIPEA_LINK_M2		0x60048
> > @@ -1710,6 +1719,7 @@
> >  #define   PSR2_ADD_VERTICAL_LINE_COUNT	REG_BIT(15)
> >  #define   DP_FEC_BS_JITTER_WA		REG_BIT(15)
> >  #define   PSR2_VSC_ENABLE_PROG_HEADER	REG_BIT(12)
> > +#define   DP_ENHANCED_TGDDA_ENABLE	REG_BIT(11)
> >  #define   DP_DSC_INSERT_SF_AT_EOL_WA	REG_BIT(4)
> >  #define   HDCP_LINE_REKEY_DISABLE	REG_BIT(0)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> > b/drivers/gpu/drm/i915/display/intel_display_types.h
> > index 8f9fb2603638..d0748837ce97 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> > @@ -985,6 +985,8 @@ struct intel_link_m_n {
> >  	u32 data_n;
> >  	u32 link_m;
> >  	u32 link_n;
> > +	/* Wa_14021768792 for linkm/n ratio > 10 */
> > +	bool bypass_m_n_ratio_limit;
> 
> This commit still combines register definitions, WA programming, the bypass
> helper and readback.
> For reviewability, could it be split into: (1) register definitions, (2) the
> bypass_m_n_ratio_limit member plus write-side programming, (3) readback
> together with the state checker compare (fold `drm/i915/display: Compare
> bypass_m_n_ratio_limit in the state checker` into it), with the dump staying
> separate ?
> 
> I'd keep the compare after the readout rather than before, so it doesn't land
> without anything that sets the flag.
> 
> Not a blocker; the current order is bisect-safe.
> 

Optional,
for reviewability: 548e544158f8f could be split into
(A) the register definitions,
(B) the bypass_m_n_ratio_limit member plus the write side (bmg_get_link_n_ext(), intel_set_m_n(), bmg_enhanced_tgdda_write()), and
(C) intel_display_can_bypass_m_n_limit() plus readback, with "Compare bypass_m_n_ratio_limit in the state checker" folded into (C).

Each step builds and is bisect-safe since nothing sets the flag until the compute patches. Fine to keep as is if you prefer.

> >  };
> >
> >  struct intel_csc_matrix {
> > --
> > 2.34.1


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

* RE: [PATCH v7 08/13] drm/i915/display: Add bits for Wa_14021768792 for linkm/n ratio > 10
  2026-10-22 17:42     ` Golani, Mitulkumar Ajitkumar
@ 2026-10-23  3:39       ` Kandpal, Suraj
  0 siblings, 0 replies; 28+ messages in thread
From: Kandpal, Suraj @ 2026-10-23  3:39 UTC (permalink / raw)
  To: Golani, Mitulkumar Ajitkumar, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nautiyal, Ankit K



> -----Original Message-----
> From: Golani, Mitulkumar Ajitkumar
> <mitulkumar.ajitkumar.golani@intel.com>
> Sent: 22 October 2026 23:12
> To: Golani, Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani@intel.com>;
> 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>
> Subject: RE: [PATCH v7 08/13] drm/i915/display: Add bits for
> Wa_14021768792 for linkm/n ratio > 10
> 
> 
> 
> > -----Original Message-----
> > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of
> > Golani, Mitulkumar Ajitkumar
> > Sent: 22 October 2026 23:02
> > 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>
> > Subject: RE: [PATCH v7 08/13] drm/i915/display: Add bits for
> > Wa_14021768792 for linkm/n ratio > 10
> >
> >
> >
> > > -----Original Message-----
> > > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > > Sent: 22 October 2026 08:53
> > > To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> > > Cc: Golani, Mitulkumar Ajitkumar
> > > <mitulkumar.ajitkumar.golani@intel.com>;
> > > Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> > > <suraj.kandpal@intel.com>
> > > Subject: [PATCH v7 08/13] drm/i915/display: Add bits for
> > > Wa_14021768792 for linkm/n ratio > 10
> > >
> > > From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > >
> > > To support a Link M/N ratio between 10.0 and 15.0, for some BMG
> > > ultrajoiner cases we need Wa_14021768792.
> > >
> > > To bypass the hardware limitation within the Timing Generator DDA
> > > (TGDDA), we need to program the LINKM and LINKN registers as defined
> > > in
> > the WA.
> > > Along with this we also need the relevant bits in HDMI_EMP_DATA and
> > > CHICKEN_TRANS.
> > >
> > > Add the bits for the WA and a new member 'bypass_m_n_ratio_limit' to
> > > track if we need to bypass the Link M/N ratio limit in the
> > > intel_link_m_n
> > structure.
> > >
> > > Per Bspec the extended LINK_N field is two nibbles: bits 27:24 hold
> > > INT(Link M / Link N) and bits 31:28 hold CEIL(Link M / Link N).
> > >
> > > The workaround is limited to transcoder A. Check the transcoder
> > > rather than the pipe: for a single pipe the two are the same, but
> > > the joiner secondaries read the M/N back through the primary's
> > > transcoder, so a pipe check would have them report the workaround as
> > > not applied while their state, copied from the primary, has it applied.
> > >
> > > CHICKEN_TRANS and HDMI_EMP_DATA are programmed before LINK_N,
> > since
> > > writing LINK_N arms the double buffered update of the M/N registers,
> > > and all of the programming has to be done before the transcoder is
> > enabled.
> > > Both are also explicitly cleared when the mechanism is not in use,
> > > so that state cannot leak from a previous modeset.
> > >
> > > v2:
> > > -Drop the drm_WARN_ON() on the extended LINK_N field in
> > intel_get_m_n():
> > > it is derived from Link M and Link N, so the state checker
> > > comparison of those and of bypass_m_n_ratio_limit already covers it.
> > > (Sashiko) -Compare bypass_m_n_ratio_limit unconditionally, so that a
> > > change to it forces a full modeset instead of being applied during a
> > > seamless M/N fastset. (Sashiko)
> > > v3:
> > > -Check for transcoder A instead of pipe A, so that the joiner
> > > secondaries read the flag back the same as the primary. (Mitul)
> > > -Drop bypass_m_n_ratio_limit from intel_compare_link_m_n(), the
> > > unconditional
> > > PIPE_CONF_CHECK_BOOL() already compares it. (Mitul) -Print
> > > bypass_m_n_ratio_limit in the crtc state dump. (Mitul)
> > > v4:
> > > -Move the state checker comparison and the state dump of
> > > bypass_m_n_ratio_limit to separate commits. (Mitul)
> > >
> > > Bspec: 49266
> > > Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > Co-developed-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > > ---
> > >  drivers/gpu/drm/i915/display/intel_display.c  | 80
> > > ++++++++++++++++++- drivers/gpu/drm/i915/display/intel_display.h  |
> > > ++++++++++++++++++2
> > > + .../gpu/drm/i915/display/intel_display_regs.h | 10 +++
> > >  .../drm/i915/display/intel_display_types.h    |  2 +
> > >  4 files changed, 93 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> > > b/drivers/gpu/drm/i915/display/intel_display.c
> > > index 461b81bf8341..9e9321976a21 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > > @@ -2715,6 +2715,15 @@ void intel_zero_m_n(struct intel_link_m_n
> > *m_n)
> > >  	m_n->tu = 1;
> > >  }
> > >
> > > +static u8 bmg_get_link_n_ext(const struct intel_link_m_n *m_n) {
> > > +	if (!m_n->link_n)
> > > +		return 0;
> > > +
> > > +	return PIPE_LINK_N1_EXT_INT(m_n->link_m / m_n->link_n) |
> > > +		PIPE_LINK_N1_EXT_CEIL(DIV_ROUND_UP(m_n->link_m,
> > > m_n->link_n)); }
> > > +
> > >  void intel_set_m_n(struct intel_display *display,
> > >  		   const struct intel_link_m_n *m_n,
> > >  		   intel_reg_t data_m_reg, intel_reg_t data_n_reg, @@ -
> > > 2726,7 +2735,9 @@ void intel_set_m_n(struct intel_display *display,
> > >  	intel_de_write(display, data_n_reg, m_n->data_n);
> > >  	intel_de_write(display, link_m_reg, m_n->link_m);
> > >
> > > -	if (DISPLAY_VER(display) >= 14)
> > > +	if (DISPLAY_VER(display) >= 14 && m_n->bypass_m_n_ratio_limit)
> > > +		link_n |=
> > > PIPE_LINK_N1_EXTENDED(bmg_get_link_n_ext(m_n));
> > > +	else if (DISPLAY_VER(display) >= 14)
> > >  		link_n &= ~PIPE_LINK_N1_EXTENDED_MASK;
> > >  	else
> > >  		link_n &= DATA_LINK_M_N_MASK;
> > > @@ -2747,6 +2758,26 @@ bool intel_cpu_transcoder_has_m2_n2(struct
> > > intel_display *display,
> > >  	return IS_DISPLAY_VER(display, 5, 7) ||
> > > display->platform.cherryview; }
> > >
> > > +static void bmg_enhanced_tgdda_write(struct intel_crtc *crtc,
> > > +				     enum transcoder transcoder,
> > > +				     const struct intel_link_m_n *m_n) {
> > > +	struct intel_display *display = to_intel_display(crtc);
> > > +	bool enable = m_n->bypass_m_n_ratio_limit && m_n->link_n;
> > > +	u32 link_m_frac = enable ? m_n->link_m % m_n->link_n : 0;
> > > +
> > > +	if (!intel_display_wa(display, INTEL_DISPLAY_WA_14021768792))
> > > +		return;
> > > +
> > > +	intel_de_rmw(display, HDMI_EMP_DATA(display, transcoder),
> > > +		     HDMI_EMP_DATA_LINK_M_FRAC_MASK,
> > > +		     REG_FIELD_PREP(HDMI_EMP_DATA_LINK_M_FRAC_MASK,
> > > link_m_frac));
> > > +
> > > +	intel_de_rmw(display, CHICKEN_TRANS(display, transcoder),
> > > +		     DP_ENHANCED_TGDDA_ENABLE,
> > > +		     enable ? DP_ENHANCED_TGDDA_ENABLE : 0); }
> > > +
> > >  void intel_cpu_transcoder_set_m1_n1(struct intel_crtc *crtc,
> > >  				    enum transcoder transcoder,
> > >  				    const struct intel_link_m_n *m_n) @@ -
> > > 2754,6 +2785,8 @@ void intel_cpu_transcoder_set_m1_n1(struct
> > > intel_crtc *crtc,
> > >  	struct intel_display *display = to_intel_display(crtc);
> > >  	enum pipe pipe = crtc->pipe;
> > >
> > > +	bmg_enhanced_tgdda_write(crtc, transcoder, m_n);
> > > +
> > >  	if (DISPLAY_VER(display) >= 5)
> > >  		intel_set_m_n(display, m_n,
> > >  			      PIPE_DATA_M1(display, transcoder), @@ -3504,6
> > > +3537,49 @@ void intel_get_m_n(struct intel_display *display,
> > >  	m_n->tu = REG_FIELD_GET(TU_SIZE_MASK, intel_de_read(display,
> > > data_m_reg)) + 1;  }
> > >
> > > +bool intel_display_can_bypass_m_n_limit(struct intel_display *display,
> > > +					int m_n_ratio,
> > > +					enum transcoder transcoder)
> > > +{
> > > +	if (!intel_display_wa(display, INTEL_DISPLAY_WA_14021768792))
> > > +		return false;
> > > +
> > > +	if (m_n_ratio > 15)
> > > +		return false;
> > > +
> > > +	if (transcoder != TRANSCODER_A)
> > > +		return false;
> > > +
> > > +	return true;
> > > +}
> > > +
> > > +static void bmg_enhanced_tgdda_read(struct intel_crtc *crtc,
> > > +				    enum transcoder transcoder,
> > > +				    struct intel_link_m_n *m_n) {
> > > +	struct intel_display *display = to_intel_display(crtc);
> > > +	u32 link_m_frac;
> > > +	int m_n_ratio;
> > > +
> > > +	if (!m_n->link_n)
> > > +		return;
> > > +
> > > +	m_n_ratio = DIV_ROUND_UP(m_n->link_m, m_n->link_n);
> > > +
> > > +	if (!intel_display_can_bypass_m_n_limit(display, m_n_ratio,
> > > transcoder))
> > > +		return;
> > > +
> > > +	if (!(intel_de_read(display, CHICKEN_TRANS(display, transcoder)) &
> > > +	      DP_ENHANCED_TGDDA_ENABLE))
> > > +		return;
> > > +
> > > +	link_m_frac =
> > > REG_FIELD_GET(HDMI_EMP_DATA_LINK_M_FRAC_MASK,
> > > +				    intel_de_read(display,
> > > HDMI_EMP_DATA(display, transcoder)));
> > > +
> > > +	if (link_m_frac == m_n->link_m % m_n->link_n)
> > > +		m_n->bypass_m_n_ratio_limit = true; }
> > > +
> > >  void intel_cpu_transcoder_get_m1_n1(struct intel_crtc *crtc,
> > >  				    enum transcoder transcoder,
> > >  				    struct intel_link_m_n *m_n) @@ -3521,6
> +3597,8 @@ void
> > > intel_cpu_transcoder_get_m1_n1(struct
> > > intel_crtc *crtc,
> > >  		intel_get_m_n(display, m_n,
> > >  			      PIPE_DATA_M_G4X(pipe),
> > > PIPE_DATA_N_G4X(pipe),
> > >  			      PIPE_LINK_M_G4X(pipe),
> > > PIPE_LINK_N_G4X(pipe));
> > > +
> > > +	bmg_enhanced_tgdda_read(crtc, transcoder, m_n);
> > >  }
> > >
> > >  void intel_cpu_transcoder_get_m2_n2(struct intel_crtc *crtc, diff
> > > --git a/drivers/gpu/drm/i915/display/intel_display.h
> > > b/drivers/gpu/drm/i915/display/intel_display.h
> > > index 404168f4213b..d53b7b4a80e7 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_display.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_display.h
> > > @@ -525,5 +525,7 @@ bool intel_scanout_needs_vtd_wa(struct
> > > intel_display *display);  int intel_crtc_num_joined_pipes(const
> > > struct intel_crtc_state *crtc_state);  void
> > > intel_display_compute_link_m_n(u32
> > > *link_m, u32 *link_n,
> > >  				    int pixel_clock, int link_symbol_clock);
> > > +bool intel_display_can_bypass_m_n_limit(struct intel_display *display,
> > > +					int m_n_ratio, enum transcoder
> > > transcoder);
> > >
> > >  #endif
> > > diff --git a/drivers/gpu/drm/i915/display/intel_display_regs.h
> > > b/drivers/gpu/drm/i915/display/intel_display_regs.h
> > > index 983a0d9dcb9c..bbdbc27629d7 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_display_regs.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_display_regs.h
> > > @@ -550,6 +550,11 @@
> > >  #define _TRANS_MULT_B		0x6102c
> > >  #define TRANS_MULT(dev_priv, trans)	_MMIO_TRANS2(dev_priv,
> > (trans),
> > > _TRANS_MULT_A)
> > >
> > > +#define _HDMI_EMP_DATA_A	0x600d8
> > > +#define _HDMI_EMP_DATA_B	0x610d8
> > > +#define  HDMI_EMP_DATA_LINK_M_FRAC_MASK	REG_GENMASK(23, 0)
> > > +#define HDMI_EMP_DATA(display, trans)	_MMIO_TRANS2((display),
> > > (trans), _HDMI_EMP_DATA_A)
> > > +
> > >  /* Hotplug control (945+ only) */
> > >  #define PORT_HOTPLUG_EN(dev_priv)
> > > 	_MMIO(DISPLAY_MMIO_BASE(dev_priv) + 0x61110)
> > >  #define   PORTB_HOTPLUG_INT_EN			(1 << 29)
> > > @@ -1192,6 +1197,10 @@
> > >  #define _PIPEB_LINK_N1		0x61044
> > >  #define  PIPE_LINK_N1_EXTENDED_MASK	REG_GENMASK(31, 24)
> > >  #define  PIPE_LINK_N1_EXTENDED(val)
> > > 	REG_FIELD_PREP(PIPE_LINK_N1_EXTENDED_MASK, (val))
> > > +#define  PIPE_LINK_N1_EXT_CEIL_MASK	REG_GENMASK(7, 4)
> > > +#define  PIPE_LINK_N1_EXT_CEIL(val)
> > > 	REG_FIELD_PREP(PIPE_LINK_N1_EXT_CEIL_MASK, (val))
> > > +#define  PIPE_LINK_N1_EXT_INT_MASK	REG_GENMASK(3, 0)
> > > +#define  PIPE_LINK_N1_EXT_INT(val)
> > > 	REG_FIELD_PREP(PIPE_LINK_N1_EXT_INT_MASK, (val))  #define
> > > PIPE_LINK_N1(dev_priv, tran) _MMIO_TRANS2(dev_priv, tran,
> > > _PIPEA_LINK_N1)
> > >
> > >  #define _PIPEA_LINK_M2		0x60048
> > > @@ -1710,6 +1719,7 @@
> > >  #define   PSR2_ADD_VERTICAL_LINE_COUNT	REG_BIT(15)
> > >  #define   DP_FEC_BS_JITTER_WA		REG_BIT(15)
> > >  #define   PSR2_VSC_ENABLE_PROG_HEADER	REG_BIT(12)
> > > +#define   DP_ENHANCED_TGDDA_ENABLE	REG_BIT(11)
> > >  #define   DP_DSC_INSERT_SF_AT_EOL_WA	REG_BIT(4)
> > >  #define   HDCP_LINE_REKEY_DISABLE	REG_BIT(0)
> > >
> > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> > > b/drivers/gpu/drm/i915/display/intel_display_types.h
> > > index 8f9fb2603638..d0748837ce97 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> > > @@ -985,6 +985,8 @@ struct intel_link_m_n {
> > >  	u32 data_n;
> > >  	u32 link_m;
> > >  	u32 link_n;
> > > +	/* Wa_14021768792 for linkm/n ratio > 10 */
> > > +	bool bypass_m_n_ratio_limit;
> >
> > This commit still combines register definitions, WA programming, the
> > bypass helper and readback.
> > For reviewability, could it be split into: (1) register definitions,
> > (2) the bypass_m_n_ratio_limit member plus write-side programming, (3)
> > readback together with the state checker compare (fold
> > `drm/i915/display: Compare bypass_m_n_ratio_limit in the state
> > checker` into it), with the dump staying separate ?
> >
> > I'd keep the compare after the readout rather than before, so it
> > doesn't land without anything that sets the flag.
> >
> > Not a blocker; the current order is bisect-safe.
> >
> 
> Optional,
> for reviewability: 548e544158f8f could be split into
> (A) the register definitions,
> (B) the bypass_m_n_ratio_limit member plus the write side
> (bmg_get_link_n_ext(), intel_set_m_n(), bmg_enhanced_tgdda_write()), and
> (C) intel_display_can_bypass_m_n_limit() plus readback, with "Compare
> bypass_m_n_ratio_limit in the state checker" folded into (C).
> 
> Each step builds and is bisect-safe since nothing sets the flag until the
> compute patches. Fine to keep as is if you prefer.

Sure will do

Regards,
Suraj Kandpal

> 
> > >  };
> > >
> > >  struct intel_csc_matrix {
> > > --
> > > 2.34.1


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

end of thread, other threads:[~2026-10-23  3:39 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-22  3:22 [PATCH v7 00/13] Implement Wa_14021768792 to bypass m_n ratio limit Suraj Kandpal
2026-10-22  3:22 ` [PATCH v7 01/13] drm/i915/display: Add helper to compute link M/N ratio for reuse Suraj Kandpal
2026-10-22  3:22 ` [PATCH v7 02/13] drm/i915/dp: Limit M/N ratio for DP Suraj Kandpal
2026-10-22  3:34   ` sashiko-bot
2026-10-22 16:29   ` Golani, Mitulkumar Ajitkumar
2026-10-22  3:22 ` [PATCH v7 03/13] drm/i915/display_wa: Add support for Wa_14014191401 Suraj Kandpal
2026-10-22  3:22 ` [PATCH v7 04/13] drm/i915/dp_mst: Limit M/N ratio for MST Suraj Kandpal
2026-10-22  3:43   ` sashiko-bot
2026-10-22 16:42   ` Golani, Mitulkumar Ajitkumar
2026-10-22  3:22 ` [PATCH v7 05/13] drm/i915/dp: Add M/N ratio check for DP link config Suraj Kandpal
2026-10-22  3:22 ` [PATCH v7 06/13] drm/i915/display: Add bits for link_n_extended for DISPLAY >= 14 Suraj Kandpal
2026-10-22  3:22 ` [PATCH v7 07/13] drm/i915/display_wa: Add support for Wa_14021768792 Suraj Kandpal
2026-10-22  3:22 ` [PATCH v7 08/13] drm/i915/display: Add bits for Wa_14021768792 for linkm/n ratio > 10 Suraj Kandpal
2026-10-22 17:32   ` Golani, Mitulkumar Ajitkumar
2026-10-22 17:42     ` Golani, Mitulkumar Ajitkumar
2026-10-23  3:39       ` Kandpal, Suraj
2026-10-22  3:22 ` [PATCH v7 09/13] drm/i915/display: Compare bypass_m_n_ratio_limit in the state checker Suraj Kandpal
2026-10-22  3:22 ` [PATCH v7 10/13] drm/i915/display: Dump bypass_m_n_ratio_limit in the crtc state dump Suraj Kandpal
2026-10-22  7:38   ` Golani, Mitulkumar Ajitkumar
2026-10-22  3:22 ` [PATCH v7 11/13] drm/i915/display: Implement Wa_14021768792 for BMG DP for link_m/n ratio > 10 Suraj Kandpal
2026-10-22  3:22 ` [PATCH v7 12/13] drm/i915/dp: Extend intel_dp_can_support_m_n() for BMG M/N bypass Suraj Kandpal
2026-10-22 16:13   ` Golani, Mitulkumar Ajitkumar
2026-10-22 17:05     ` Kandpal, Suraj
2026-10-22  3:22 ` [PATCH v7 13/13] drm/i915/dp: Bump the max Link M/N ratio to 22 for DISPLAY_VER >= 35 Suraj Kandpal
2026-10-22 14:08   ` Golani, Mitulkumar Ajitkumar
2026-10-22  3:32 ` ✓ CI.KUnit: success for Implement Wa_14021768792 to bypass m_n ratio limit (rev11) Patchwork
2026-10-22  4:10 ` ✓ Xe.CI.BAT: " Patchwork
2026-10-22  7:39 ` ✗ Xe.CI.FULL: failure " Patchwork

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