Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1
@ 2026-06-16 20:08 Imre Deak
  2026-06-16 20:08 ` [PATCH v2 01/28] drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry Imre Deak
                   ` (31 more replies)
  0 siblings, 32 replies; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: Jani Nikula, Ville Syrjälä

This is v2 of the second part of [1] refactoring the DP link capability
logic in patches 27-57 of [1]. The first part of [1] was merged, see
[2]. For the rationale of this patchset, please refer to the link
capability parts in the cover letter of [1].

This v2 version has the following changes:
- Address the review comments from Jani:
  - Remove unneeded function documentation.
  - Add a helper to debug print the link rates tracked by link_caps
    instead of exposing the rates.

- Simplify tracking of link capability changes as suggested by Ville,
  removing the need to track changes or adjust the maximum link
  parameter limits set by the fallback logic. This is possible, since the
  limits are reset now (after patchset [3]) whenever any link parameter
  changes. This resulted in dropping patches 46, 48, 51 from patchset [1].

Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>

[1] https://lore.kernel.org/all/20260428125233.1664668-1-imre.deak@intel.com
[2] https://lore.kernel.org/all/20260601093836.3057345-1-imre.deak@intel.com
[3] https://lore.kernel.org/all/20260522160514.2628249-1-imre.deak@intel.com

Imre Deak (28):
  drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry
  drm/i915/dp: Add struct intel_dp_link_config
  drm/i915/dp_link_caps: Introduce DP link capability module
  drm/i915/dp_link_caps: Move common rate helpers to link caps
  drm/i915/dp_link_caps: Move forced link param helpers to link caps
  drm/i915/dp: Simplify querying of forced link parameters
  drm/i915/dp_link_caps: Move forced and max link debugfs entries to
    link caps
  drm/i915/dp_link_training: Use helpers to get forced link params
  drm/i915/dp_link_caps: Move forced link params to link_caps
  drm/i915/dp_link_caps: Move link config helpers to link caps
  drm/i915/dp_link_caps: Move link config tracking to link_caps
  drm/i915/dp_link_caps: Rename helper updating the link configurations
  drm/i915/dp: Factor out helper to get link rate capabilities
  drm/i915/dp_link_caps: Pass supported link rates to link caps update
  drm/i915/dp_link_caps: Add helper to print all supported link rates
  drm/i915/dp_link_caps: Add helper to get the number of supported link
    rates
  drm/i915/dp_link_caps: Add helper to get common rate index
  drm/i915/dp_link_caps: Move tracking of common rates to link_caps
    struct
  drm/i915/dp_link_caps: Track max common lane count in link_caps
  drm/i915/dp_link_caps: Use max common lane count from link_caps
  drm/i915/dp_link_caps: Add helpers to get max link limits
  drm/i915/dp_link_caps: Add helpers to set max link limits
  drm/i915/dp_link_caps: Add helper to reset max link limits
  drm/i915/dp_link_caps: Add helper to reset link_caps state
  drm/i915/dp_link_caps: Move max link limits to link_caps
  drm/i915/dp_link_caps: Pass link_caps to static functions
  drm/i915/dp_link_caps: Pass link_caps to config update/lookup helpers
  drm/i915/dp_link_caps: Pass link_caps to common rate helpers

 drivers/gpu/drm/i915/Makefile                 |   1 +
 .../drm/i915/display/intel_display_debugfs.c  |   2 +
 .../drm/i915/display/intel_display_types.h    |  32 +-
 drivers/gpu/drm/i915/display/intel_dp.c       | 272 ++-----
 drivers/gpu/drm/i915/display/intel_dp.h       |   6 +-
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 675 ++++++++++++++++++
 .../gpu/drm/i915/display/intel_dp_link_caps.h |  47 ++
 .../drm/i915/display/intel_dp_link_training.c | 320 +--------
 drivers/gpu/drm/i915/display/intel_dp_test.c  |   7 +-
 .../gpu/drm/i915/display/intel_dp_tunnel.c    |   6 +-
 drivers/gpu/drm/xe/Makefile                   |   1 +
 11 files changed, 854 insertions(+), 515 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/display/intel_dp_link_caps.c
 create mode 100644 drivers/gpu/drm/i915/display/intel_dp_link_caps.h

-- 
2.49.1


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

* [PATCH v2 01/28] drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-22 13:11   ` Kahola, Mika
  2026-06-22 21:53   ` Michał Grzelak
  2026-06-16 20:08 ` [PATCH v2 02/28] drm/i915/dp: Add struct intel_dp_link_config Imre Deak
                   ` (30 subsequent siblings)
  31 siblings, 2 replies; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Rename intel_dp_link_config to intel_dp_link_config_entry to prepare
for tracking a link configuration in both an internal packed and a
public unpacked format. A follow-up change will add
struct intel_dp_link_config representing the public unpacked format.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 .../gpu/drm/i915/display/intel_display_types.h   |  2 +-
 drivers/gpu/drm/i915/display/intel_dp.c          | 16 ++++++++--------
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 6cd102a3b610c..c71edea145878 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1840,7 +1840,7 @@ struct intel_dp {
 #define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
 #define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
 						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
-		struct intel_dp_link_config {
+		struct intel_dp_link_config_entry {
 			u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
 			u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
 		} configs[INTEL_DP_MAX_LINK_CONFIGS];
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 3569e61e7feea..00eb3f5103383 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -699,18 +699,18 @@ int intel_dp_rate_index(const int *rates, int len, int rate)
 }
 
 static int intel_dp_link_config_rate(struct intel_dp *intel_dp,
-				     const struct intel_dp_link_config *lc)
+				     const struct intel_dp_link_config_entry *lc)
 {
 	return intel_dp_common_rate(intel_dp, lc->link_rate_idx);
 }
 
-static int intel_dp_link_config_lane_count(const struct intel_dp_link_config *lc)
+static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lc)
 {
 	return 1 << lc->lane_count_exp;
 }
 
 static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
-				   const struct intel_dp_link_config *lc)
+				   const struct intel_dp_link_config_entry *lc)
 {
 	return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(intel_dp, lc),
 					 intel_dp_link_config_lane_count(lc));
@@ -719,8 +719,8 @@ static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
 static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
 {
 	struct intel_dp *intel_dp = (struct intel_dp *)p;	/* remove const */
-	const struct intel_dp_link_config *lc_a = a;
-	const struct intel_dp_link_config *lc_b = b;
+	const struct intel_dp_link_config_entry *lc_a = a;
+	const struct intel_dp_link_config_entry *lc_b = b;
 	int bw_a = intel_dp_link_config_bw(intel_dp, lc_a);
 	int bw_b = intel_dp_link_config_bw(intel_dp, lc_b);
 
@@ -734,7 +734,7 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
 static void intel_dp_link_config_init(struct intel_dp *intel_dp)
 {
 	struct intel_display *display = to_intel_display(intel_dp);
-	struct intel_dp_link_config *lc;
+	struct intel_dp_link_config_entry *lc;
 	int num_common_lane_configs;
 	int i;
 	int j;
@@ -769,7 +769,7 @@ static void intel_dp_link_config_init(struct intel_dp *intel_dp)
 void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
 {
 	struct intel_display *display = to_intel_display(intel_dp);
-	const struct intel_dp_link_config *lc;
+	const struct intel_dp_link_config_entry *lc;
 
 	if (drm_WARN_ON(display->drm, idx < 0 || idx >= intel_dp->link.num_configs))
 		idx = 0;
@@ -788,7 +788,7 @@ int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lan
 	int i;
 
 	for (i = 0; i < intel_dp->link.num_configs; i++) {
-		const struct intel_dp_link_config *lc = &intel_dp->link.configs[i];
+		const struct intel_dp_link_config_entry *lc = &intel_dp->link.configs[i];
 
 		if (lc->lane_count_exp == lane_count_exp &&
 		    lc->link_rate_idx == link_rate_idx)
-- 
2.49.1


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

* [PATCH v2 02/28] drm/i915/dp: Add struct intel_dp_link_config
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
  2026-06-16 20:08 ` [PATCH v2 01/28] drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-22 13:11   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 03/28] drm/i915/dp_link_caps: Introduce DP link capability module Imre Deak
                   ` (29 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Add a struct representing the public unpacked format of a link
configuration. This will be used by the DP link capability API added
as a follow-up, and by DP code in general that needs to track a link
configuration.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_types.h | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index c71edea145878..c092c81ed2eb6 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1800,6 +1800,14 @@ struct intel_psr {
 	struct ref_tracker *vblank_wakeref;
 };
 
+struct intel_dp_link_config {
+	int rate;
+	int lane_count;
+};
+
+#define INTEL_DP_LINK_CONFIG_NULL \
+	((struct intel_dp_link_config){})
+
 struct intel_dp {
 	intel_reg_t output_reg;
 	u32 DP;
-- 
2.49.1


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

* [PATCH v2 03/28] drm/i915/dp_link_caps: Introduce DP link capability module
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
  2026-06-16 20:08 ` [PATCH v2 01/28] drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry Imre Deak
  2026-06-16 20:08 ` [PATCH v2 02/28] drm/i915/dp: Add struct intel_dp_link_config Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-22 13:21   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 04/28] drm/i915/dp_link_caps: Move common rate helpers to link caps Imre Deak
                   ` (28 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: Jani Nikula

Start isolating the DP link capability logic from the generic DP code by
adding a separate intel_dp_link_caps module and a corresponding state
object.

Allocate the state so it can remain opaque within its module.

Follow-up changes will move link capability helpers and state from
intel_dp.c and intel_dp_link_training.c to the new module and state.

v2: Remove unnecessary function documentation. (Jani)

Cc: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/Makefile                 |  1 +
 .../drm/i915/display/intel_display_types.h    |  2 ++
 drivers/gpu/drm/i915/display/intel_dp.c       |  9 ++++++
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 30 +++++++++++++++++++
 .../gpu/drm/i915/display/intel_dp_link_caps.h | 12 ++++++++
 drivers/gpu/drm/xe/Makefile                   |  1 +
 6 files changed, 55 insertions(+)
 create mode 100644 drivers/gpu/drm/i915/display/intel_dp_link_caps.c
 create mode 100644 drivers/gpu/drm/i915/display/intel_dp_link_caps.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 07802a7f4ce50..81e16f377641b 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -356,6 +356,7 @@ i915-y += \
 	display/intel_dp_aux.o \
 	display/intel_dp_aux_backlight.o \
 	display/intel_dp_hdcp.o \
+	display/intel_dp_link_caps.o \
 	display/intel_dp_link_training.o \
 	display/intel_dp_mst.o \
 	display/intel_dp_test.o \
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index c092c81ed2eb6..10933ccdeb31e 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -58,6 +58,7 @@ struct cec_notifier;
 struct drm_printer;
 struct intel_connector;
 struct intel_ddi_buf_trans;
+struct intel_dp_link_caps;
 struct intel_dp_link_training;
 struct intel_fbc;
 struct intel_global_objs_state;
@@ -1867,6 +1868,7 @@ struct intel_dp {
 		int force_lane_count;
 		int force_rate;
 		struct intel_dp_link_training *training;
+		struct intel_dp_link_caps *caps;
 	} link;
 	bool reset_link_params;
 	int mso_link_count;
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 00eb3f5103383..fa095c4db7fe6 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -71,6 +71,7 @@
 #include "intel_dp.h"
 #include "intel_dp_aux.h"
 #include "intel_dp_hdcp.h"
+#include "intel_dp_link_caps.h"
 #include "intel_dp_link_training.h"
 #include "intel_dp_mst.h"
 #include "intel_dp_test.h"
@@ -7458,10 +7459,18 @@ int intel_dp_link_init(struct intel_dp *intel_dp)
 	if (!intel_dp->link.training)
 		return -ENOMEM;
 
+	intel_dp->link.caps = intel_dp_link_caps_init(intel_dp);
+	if (!intel_dp->link.caps) {
+		intel_dp_link_training_cleanup(intel_dp->link.training);
+
+		return -ENOMEM;
+	}
+
 	return 0;
 }
 
 void intel_dp_link_cleanup(struct intel_dp *intel_dp)
 {
+	intel_dp_link_caps_cleanup(intel_dp->link.caps);
 	intel_dp_link_training_cleanup(intel_dp->link.training);
 }
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
new file mode 100644
index 0000000000000..63989d97effd7
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2026 Intel Corporation
+ */
+
+#include <linux/slab.h>
+
+#include "intel_dp_link_caps.h"
+
+struct intel_dp_link_caps {
+	struct intel_dp *dp;
+};
+
+struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
+{
+	struct intel_dp_link_caps *link_caps;
+
+	link_caps = kzalloc_obj(*link_caps);
+	if (!link_caps)
+		return NULL;
+
+	link_caps->dp = intel_dp;
+
+	return link_caps;
+}
+
+void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps)
+{
+	kfree(link_caps);
+}
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
new file mode 100644
index 0000000000000..050b279463d6e
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: MIT */
+/* Copyright © 2026 Intel Corporation */
+
+#ifndef __INTEL_DP_LINK_CAPS_H__
+#define __INTEL_DP_LINK_CAPS_H__
+
+struct intel_dp;
+
+struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
+void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
+
+#endif /* __INTEL_DP_LINK_CAPS_H__ */
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index 8e7b146880f46..e5a04253e73bf 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -278,6 +278,7 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \
 	i915-display/intel_dp_aux.o \
 	i915-display/intel_dp_aux_backlight.o \
 	i915-display/intel_dp_hdcp.o \
+	i915-display/intel_dp_link_caps.o \
 	i915-display/intel_dp_link_training.o \
 	i915-display/intel_dp_mst.o \
 	i915-display/intel_dp_test.o \
-- 
2.49.1


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

* [PATCH v2 04/28] drm/i915/dp_link_caps: Move common rate helpers to link caps
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (2 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 03/28] drm/i915/dp_link_caps: Introduce DP link capability module Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23  7:27   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 05/28] drm/i915/dp_link_caps: Move forced link param " Imre Deak
                   ` (27 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Move the helpers handling common link rates to intel_dp_link_caps.c.
Their functionality is part of the link capability logic and will be
updated to use the link capability state in follow-up changes.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c       | 27 +----------------
 drivers/gpu/drm/i915/display/intel_dp.h       |  3 +-
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 30 +++++++++++++++++++
 .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 ++++
 .../drm/i915/display/intel_dp_link_training.c |  1 +
 .../gpu/drm/i915/display/intel_dp_tunnel.c    |  1 +
 6 files changed, 39 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index fa095c4db7fe6..a34d3704a5667 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -314,7 +314,7 @@ static void intel_dp_set_max_sink_lane_count(struct intel_dp *intel_dp)
 }
 
 /* Get length of rates array potentially limited by max_rate. */
-static int intel_dp_rate_limit_len(const int *rates, int len, int max_rate)
+int intel_dp_rate_limit_len(const int *rates, int len, int max_rate)
 {
 	int i;
 
@@ -327,31 +327,6 @@ static int intel_dp_rate_limit_len(const int *rates, int len, int max_rate)
 	return 0;
 }
 
-/* Get length of common rates array potentially limited by max_rate. */
-static int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
-					  int max_rate)
-{
-	return intel_dp_rate_limit_len(intel_dp->common_rates,
-				       intel_dp->num_common_rates, max_rate);
-}
-
-int intel_dp_common_rate(struct intel_dp *intel_dp, int index)
-{
-	struct intel_display *display = to_intel_display(intel_dp);
-
-	if (drm_WARN_ON(display->drm,
-			index < 0 || index >= intel_dp->num_common_rates))
-		return 162000;
-
-	return intel_dp->common_rates[index];
-}
-
-/* Theoretical max between source and sink */
-int intel_dp_max_common_rate(struct intel_dp *intel_dp)
-{
-	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
-}
-
 int intel_dp_max_source_lane_count(struct intel_digital_port *dig_port)
 {
 	int vbt_max_lanes = intel_bios_dp_max_lane_count(dig_port->base.devdata);
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
index 92ce048523267..8cc6ea04e000c 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -100,14 +100,13 @@ void intel_edp_backlight_off(const struct drm_connector_state *conn_state);
 void intel_edp_fixup_vbt_bpp(struct intel_encoder *encoder, int pipe_bpp);
 void intel_dp_mst_suspend(struct intel_display *display);
 void intel_dp_mst_resume(struct intel_display *display);
+int intel_dp_rate_limit_len(const int *rates, int len, int max_rate);
 int intel_dp_max_source_lane_count(struct intel_digital_port *dig_port);
 int intel_dp_max_link_rate(struct intel_dp *intel_dp);
 int intel_dp_max_lane_count(struct intel_dp *intel_dp);
 int intel_dp_config_required_rate(const struct intel_crtc_state *crtc_state);
 int intel_dp_rate_select(struct intel_dp *intel_dp, int rate);
-int intel_dp_max_common_rate(struct intel_dp *intel_dp);
 int intel_dp_max_common_lane_count(struct intel_dp *intel_dp);
-int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
 int intel_dp_rate_index(const int *rates, int len, int rate);
 int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
 void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 63989d97effd7..37ffd714c6a42 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -5,12 +5,42 @@
 
 #include <linux/slab.h>
 
+#include <drm/drm_print.h>
+
+#include "intel_display_core.h"
+#include "intel_display_types.h"
+#include "intel_dp.h"
 #include "intel_dp_link_caps.h"
 
 struct intel_dp_link_caps {
 	struct intel_dp *dp;
 };
 
+/* Get length of common rates array potentially limited by max_rate. */
+int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
+				   int max_rate)
+{
+	return intel_dp_rate_limit_len(intel_dp->common_rates,
+				       intel_dp->num_common_rates, max_rate);
+}
+
+int intel_dp_common_rate(struct intel_dp *intel_dp, int index)
+{
+	struct intel_display *display = to_intel_display(intel_dp);
+
+	if (drm_WARN_ON(display->drm,
+			index < 0 || index >= intel_dp->num_common_rates))
+		return 162000;
+
+	return intel_dp->common_rates[index];
+}
+
+/* Theoretical max between source and sink */
+int intel_dp_max_common_rate(struct intel_dp *intel_dp)
+{
+	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
+}
+
 struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
 {
 	struct intel_dp_link_caps *link_caps;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 050b279463d6e..3248777d1287f 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -6,6 +6,11 @@
 
 struct intel_dp;
 
+int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
+				   int max_rate);
+int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
+int intel_dp_max_common_rate(struct intel_dp *intel_dp);
+
 struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
 void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
index 97cb407d084cd..b915cfdeabd0e 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
@@ -33,6 +33,7 @@
 #include "intel_display_types.h"
 #include "intel_display_utils.h"
 #include "intel_dp.h"
+#include "intel_dp_link_caps.h"
 #include "intel_dp_link_training.h"
 #include "intel_dp_mst.h"
 #include "intel_encoder.h"
diff --git a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
index d6bd1f7e01e18..c82adfcce01d0 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
@@ -11,6 +11,7 @@
 #include "intel_display_limits.h"
 #include "intel_display_types.h"
 #include "intel_dp.h"
+#include "intel_dp_link_caps.h"
 #include "intel_dp_link_training.h"
 #include "intel_dp_mst.h"
 #include "intel_dp_tunnel.h"
-- 
2.49.1


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

* [PATCH v2 05/28] drm/i915/dp_link_caps: Move forced link param helpers to link caps
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (3 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 04/28] drm/i915/dp_link_caps: Move common rate helpers to link caps Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23  9:40   ` Kahola, Mika
  2026-06-23 10:22   ` Luca Coelho
  2026-06-16 20:08 ` [PATCH v2 06/28] drm/i915/dp: Simplify querying of forced link parameters Imre Deak
                   ` (26 subsequent siblings)
  31 siblings, 2 replies; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Move the helpers handling forced link parameters to intel_dp_link_caps.c.
Their functionality is part of the link capability logic and will be
updated to use the link capability state in follow-up changes.

Return the forced link rate and lane count through a
struct intel_dp_link_config, which is the canonical way the rest of the
link capability API will also accept and return link configurations.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c       | 39 ++++++++++---------
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 22 +++++++++++
 .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 +++
 3 files changed, 47 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index a34d3704a5667..7643fe079e15b 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -364,17 +364,16 @@ int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
 	return intel_dp->max_common_lane_count;
 }
 
-static int forced_lane_count(struct intel_dp *intel_dp)
-{
-	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
-}
-
 int intel_dp_max_lane_count(struct intel_dp *intel_dp)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+	struct intel_dp_link_config forced_params;
 	int lane_count;
 
+	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
+
 	if (intel_dp->link.force_lane_count)
-		lane_count = forced_lane_count(intel_dp);
+		lane_count = forced_params.lane_count;
 	else
 		lane_count = intel_dp->link.max_lane_count;
 
@@ -391,8 +390,12 @@ int intel_dp_max_lane_count(struct intel_dp *intel_dp)
 
 static int intel_dp_min_lane_count(struct intel_dp *intel_dp)
 {
+	struct intel_dp_link_config forced_params;
+
+	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
+
 	if (intel_dp->link.force_lane_count)
-		return forced_lane_count(intel_dp);
+		return forced_params.lane_count;
 
 	return 1;
 }
@@ -1655,23 +1658,17 @@ static void intel_dp_print_rates(struct intel_dp *intel_dp)
 	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
 }
 
-static int forced_link_rate(struct intel_dp *intel_dp)
-{
-	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
-
-	if (len == 0)
-		return intel_dp_common_rate(intel_dp, 0);
-
-	return intel_dp_common_rate(intel_dp, len - 1);
-}
-
 int
 intel_dp_max_link_rate(struct intel_dp *intel_dp)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+	struct intel_dp_link_config forced_params;
 	int len;
 
+	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
+
 	if (intel_dp->link.force_rate)
-		return forced_link_rate(intel_dp);
+		return forced_params.rate;
 
 	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.max_rate);
 
@@ -1681,8 +1678,12 @@ intel_dp_max_link_rate(struct intel_dp *intel_dp)
 static int
 intel_dp_min_link_rate(struct intel_dp *intel_dp)
 {
+	struct intel_dp_link_config forced_params;
+
+	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
+
 	if (intel_dp->link.force_rate)
-		return forced_link_rate(intel_dp);
+		return forced_params.rate;
 
 	return intel_dp_common_rate(intel_dp, 0);
 }
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 37ffd714c6a42..1d3a3ff007a03 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -41,6 +41,28 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
 	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
 }
 
+static int forced_lane_count(struct intel_dp *intel_dp)
+{
+	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
+}
+
+static int forced_link_rate(struct intel_dp *intel_dp)
+{
+	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
+
+	if (len == 0)
+		return intel_dp_common_rate(intel_dp, 0);
+
+	return intel_dp_common_rate(intel_dp, len - 1);
+}
+
+void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
+					  struct intel_dp_link_config *forced_params)
+{
+	forced_params->rate = forced_link_rate(link_caps->dp);
+	forced_params->lane_count = forced_lane_count(link_caps->dp);
+}
+
 struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
 {
 	struct intel_dp_link_caps *link_caps;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 3248777d1287f..61dbce86ee3d0 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -5,12 +5,17 @@
 #define __INTEL_DP_LINK_CAPS_H__
 
 struct intel_dp;
+struct intel_dp_link_caps;
+struct intel_dp_link_config;
 
 int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
 				   int max_rate);
 int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
 int intel_dp_max_common_rate(struct intel_dp *intel_dp);
 
+void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
+					  struct intel_dp_link_config *forced_params);
+
 struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
 void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
 
-- 
2.49.1


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

* [PATCH v2 06/28] drm/i915/dp: Simplify querying of forced link parameters
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (4 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 05/28] drm/i915/dp_link_caps: Move forced link param " Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23  9:49   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 07/28] drm/i915/dp_link_caps: Move forced and max link debugfs entries to link caps Imre Deak
                   ` (25 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Simplify querying the forced link rate and lane count by
performing the zero checks inside the helpers, allowing callers
to use the returned values directly.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c           | 8 ++++----
 drivers/gpu/drm/i915/display/intel_dp_link_caps.c | 9 ++++++++-
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 7643fe079e15b..c4ad386acc6db 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -372,7 +372,7 @@ int intel_dp_max_lane_count(struct intel_dp *intel_dp)
 
 	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
 
-	if (intel_dp->link.force_lane_count)
+	if (forced_params.lane_count)
 		lane_count = forced_params.lane_count;
 	else
 		lane_count = intel_dp->link.max_lane_count;
@@ -394,7 +394,7 @@ static int intel_dp_min_lane_count(struct intel_dp *intel_dp)
 
 	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
 
-	if (intel_dp->link.force_lane_count)
+	if (forced_params.lane_count)
 		return forced_params.lane_count;
 
 	return 1;
@@ -1667,7 +1667,7 @@ intel_dp_max_link_rate(struct intel_dp *intel_dp)
 
 	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
 
-	if (intel_dp->link.force_rate)
+	if (forced_params.rate)
 		return forced_params.rate;
 
 	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.max_rate);
@@ -1682,7 +1682,7 @@ intel_dp_min_link_rate(struct intel_dp *intel_dp)
 
 	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
 
-	if (intel_dp->link.force_rate)
+	if (forced_params.rate)
 		return forced_params.rate;
 
 	return intel_dp_common_rate(intel_dp, 0);
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 1d3a3ff007a03..e39e6c99ec25f 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -43,13 +43,20 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
 
 static int forced_lane_count(struct intel_dp *intel_dp)
 {
+	if (!intel_dp->link.force_lane_count)
+		return 0;
+
 	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
 }
 
 static int forced_link_rate(struct intel_dp *intel_dp)
 {
-	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
+	int len;
 
+	if (!intel_dp->link.force_rate)
+		return 0;
+
+	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
 	if (len == 0)
 		return intel_dp_common_rate(intel_dp, 0);
 
-- 
2.49.1


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

* [PATCH v2 07/28] drm/i915/dp_link_caps: Move forced and max link debugfs entries to link caps
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (5 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 06/28] drm/i915/dp: Simplify querying of forced link parameters Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23 10:28   ` Luca Coelho
  2026-06-23 10:29   ` Luca Coelho
  2026-06-16 20:08 ` [PATCH v2 08/28] drm/i915/dp_link_training: Use helpers to get forced link params Imre Deak
                   ` (24 subsequent siblings)
  31 siblings, 2 replies; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Move the debugfs entries for the forced and max DP link parameters to
intel_dp_link_caps. Their functionality is part of the link capability
logic and will be updated to use the link capability state in follow-up
changes.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 .../drm/i915/display/intel_display_debugfs.c  |   2 +
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 280 ++++++++++++++++++
 .../gpu/drm/i915/display/intel_dp_link_caps.h |   3 +
 .../drm/i915/display/intel_dp_link_training.c | 263 ----------------
 4 files changed, 285 insertions(+), 263 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
index 08004c1ba03f4..3f02868ef105b 100644
--- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
+++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
@@ -32,6 +32,7 @@
 #include "intel_display_types.h"
 #include "intel_dmc.h"
 #include "intel_dp.h"
+#include "intel_dp_link_caps.h"
 #include "intel_dp_link_training.h"
 #include "intel_dp_mst.h"
 #include "intel_dp_test.h"
@@ -1342,6 +1343,7 @@ void intel_connector_debugfs_add(struct intel_connector *connector)
 	intel_psr_connector_debugfs_add(connector);
 	intel_alpm_lobf_debugfs_add(connector);
 	intel_dp_link_training_debugfs_add(connector);
+	intel_dp_link_caps_debugfs_add(connector);
 	intel_link_bw_connector_debugfs_add(connector);
 
 	if (DISPLAY_VER(display) >= 11 &&
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index e39e6c99ec25f..ea90e84500a89 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -3,6 +3,7 @@
  * Copyright © 2026 Intel Corporation
  */
 
+#include <linux/debugfs.h>
 #include <linux/slab.h>
 
 #include <drm/drm_print.h>
@@ -70,6 +71,285 @@ void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
 	forced_params->lane_count = forced_lane_count(link_caps->dp);
 }
 
+static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
+{
+	struct intel_connector *connector = to_intel_connector(m->private);
+	struct intel_display *display = to_intel_display(connector);
+	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	int current_rate = -1;
+	int force_rate;
+	int err;
+	int i;
+
+	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
+	if (err)
+		return err;
+
+	intel_dp_flush_connector_commits(connector);
+
+	if (intel_dp->link.active)
+		current_rate = intel_dp->link_rate;
+
+	force_rate = intel_dp->link.force_rate;
+
+	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
+
+	seq_printf(m, "%sauto%s",
+		   force_rate == 0 ? "[" : "",
+		   force_rate == 0 ? "]" : "");
+
+	for (i = 0; i < intel_dp->num_source_rates; i++)
+		seq_printf(m, " %s%d%s%s",
+			   intel_dp->source_rates[i] == force_rate ? "[" : "",
+			   intel_dp->source_rates[i],
+			   intel_dp->source_rates[i] == current_rate ? "*" : "",
+			   intel_dp->source_rates[i] == force_rate ? "]" : "");
+
+	seq_putc(m, '\n');
+
+	return 0;
+}
+
+static int parse_link_rate(struct intel_dp *intel_dp, const char __user *ubuf, size_t len)
+{
+	char *kbuf;
+	const char *p;
+	int rate;
+	int ret = 0;
+
+	kbuf = memdup_user_nul(ubuf, len);
+	if (IS_ERR(kbuf))
+		return PTR_ERR(kbuf);
+
+	p = strim(kbuf);
+
+	if (!strcmp(p, "auto")) {
+		rate = 0;
+	} else {
+		ret = kstrtoint(p, 0, &rate);
+		if (ret < 0)
+			goto out_free;
+
+		if (intel_dp_rate_index(intel_dp->source_rates,
+					intel_dp->num_source_rates,
+					rate) < 0)
+			ret = -EINVAL;
+	}
+
+out_free:
+	kfree(kbuf);
+
+	return ret < 0 ? ret : rate;
+}
+
+static ssize_t i915_dp_force_link_rate_write(struct file *file,
+					     const char __user *ubuf,
+					     size_t len, loff_t *offp)
+{
+	struct seq_file *m = file->private_data;
+	struct intel_connector *connector = to_intel_connector(m->private);
+	struct intel_display *display = to_intel_display(connector);
+	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	int rate;
+	int err;
+
+	rate = parse_link_rate(intel_dp, ubuf, len);
+	if (rate < 0)
+		return rate;
+
+	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
+	if (err)
+		return err;
+
+	intel_dp_flush_connector_commits(connector);
+
+	intel_dp_reset_link_params(intel_dp);
+	intel_dp->link.force_rate = rate;
+
+	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
+
+	*offp += len;
+
+	return len;
+}
+DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_link_rate);
+
+static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
+{
+	struct intel_connector *connector = to_intel_connector(m->private);
+	struct intel_display *display = to_intel_display(connector);
+	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	int current_lane_count = -1;
+	int force_lane_count;
+	int err;
+	int i;
+
+	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
+	if (err)
+		return err;
+
+	intel_dp_flush_connector_commits(connector);
+
+	if (intel_dp->link.active)
+		current_lane_count = intel_dp->lane_count;
+	force_lane_count = intel_dp->link.force_lane_count;
+
+	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
+
+	seq_printf(m, "%sauto%s",
+		   force_lane_count == 0 ? "[" : "",
+		   force_lane_count == 0 ? "]" : "");
+
+	for (i = 1; i <= 4; i <<= 1)
+		seq_printf(m, " %s%d%s%s",
+			   i == force_lane_count ? "[" : "",
+			   i,
+			   i == current_lane_count ? "*" : "",
+			   i == force_lane_count ? "]" : "");
+
+	seq_putc(m, '\n');
+
+	return 0;
+}
+
+static int parse_lane_count(const char __user *ubuf, size_t len)
+{
+	char *kbuf;
+	const char *p;
+	int lane_count;
+	int ret = 0;
+
+	kbuf = memdup_user_nul(ubuf, len);
+	if (IS_ERR(kbuf))
+		return PTR_ERR(kbuf);
+
+	p = strim(kbuf);
+
+	if (!strcmp(p, "auto")) {
+		lane_count = 0;
+	} else {
+		ret = kstrtoint(p, 0, &lane_count);
+		if (ret < 0)
+			goto out_free;
+
+		switch (lane_count) {
+		case 1:
+		case 2:
+		case 4:
+			break;
+		default:
+			ret = -EINVAL;
+		}
+	}
+
+out_free:
+	kfree(kbuf);
+
+	return ret < 0 ? ret : lane_count;
+}
+
+static ssize_t i915_dp_force_lane_count_write(struct file *file,
+					      const char __user *ubuf,
+					      size_t len, loff_t *offp)
+{
+	struct seq_file *m = file->private_data;
+	struct intel_connector *connector = to_intel_connector(m->private);
+	struct intel_display *display = to_intel_display(connector);
+	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	int lane_count;
+	int err;
+
+	lane_count = parse_lane_count(ubuf, len);
+	if (lane_count < 0)
+		return lane_count;
+
+	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
+	if (err)
+		return err;
+
+	intel_dp_flush_connector_commits(connector);
+
+	intel_dp_reset_link_params(intel_dp);
+	intel_dp->link.force_lane_count = lane_count;
+
+	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
+
+	*offp += len;
+
+	return len;
+}
+DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_lane_count);
+
+static int i915_dp_max_link_rate_show(void *data, u64 *val)
+{
+	struct intel_connector *connector = to_intel_connector(data);
+	struct intel_display *display = to_intel_display(connector);
+	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	int err;
+
+	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
+	if (err)
+		return err;
+
+	intel_dp_flush_connector_commits(connector);
+
+	*val = intel_dp->link.max_rate;
+
+	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
+
+	return 0;
+}
+DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_link_rate_fops, i915_dp_max_link_rate_show, NULL, "%llu\n");
+
+static int i915_dp_max_lane_count_show(void *data, u64 *val)
+{
+	struct intel_connector *connector = to_intel_connector(data);
+	struct intel_display *display = to_intel_display(connector);
+	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	int err;
+
+	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
+	if (err)
+		return err;
+
+	intel_dp_flush_connector_commits(connector);
+
+	*val = intel_dp->link.max_lane_count;
+
+	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
+
+	return 0;
+}
+DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_lane_count_fops, i915_dp_max_lane_count_show, NULL, "%llu\n");
+
+
+/**
+ * intel_dp_link_caps_debugfs_add - add link caps debugfs files for a connector
+ * @connector: connector to add the debugfs files for
+ *
+ * Add the link-capability debugfs files for a DP @connector.
+ */
+void intel_dp_link_caps_debugfs_add(struct intel_connector *connector)
+{
+	struct dentry *root = connector->base.debugfs_entry;
+
+	if (connector->base.connector_type != DRM_MODE_CONNECTOR_DisplayPort &&
+	    connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
+		return;
+
+	debugfs_create_file("i915_dp_force_link_rate", 0644, root,
+			    connector, &i915_dp_force_link_rate_fops);
+
+	debugfs_create_file("i915_dp_force_lane_count", 0644, root,
+			    connector, &i915_dp_force_lane_count_fops);
+
+	debugfs_create_file("i915_dp_max_link_rate", 0444, root,
+			    connector, &i915_dp_max_link_rate_fops);
+
+	debugfs_create_file("i915_dp_max_lane_count", 0444, root,
+			    connector, &i915_dp_max_lane_count_fops);
+}
+
 struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
 {
 	struct intel_dp_link_caps *link_caps;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 61dbce86ee3d0..c6a84891db464 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -4,6 +4,7 @@
 #ifndef __INTEL_DP_LINK_CAPS_H__
 #define __INTEL_DP_LINK_CAPS_H__
 
+struct intel_connector;
 struct intel_dp;
 struct intel_dp_link_caps;
 struct intel_dp_link_config;
@@ -16,6 +17,8 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp);
 void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
 					  struct intel_dp_link_config *forced_params);
 
+void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
+
 struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
 void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
index b915cfdeabd0e..cbef3d45baf9c 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
@@ -2660,257 +2660,6 @@ void intel_dp_check_link_state(struct intel_dp *intel_dp)
 	intel_encoder_link_check_queue_work(encoder, 0);
 }
 
-static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
-{
-	struct intel_connector *connector = to_intel_connector(m->private);
-	struct intel_display *display = to_intel_display(connector);
-	struct intel_dp *intel_dp = intel_attached_dp(connector);
-	int current_rate = -1;
-	int force_rate;
-	int err;
-	int i;
-
-	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
-	if (err)
-		return err;
-
-	intel_dp_flush_connector_commits(connector);
-
-	if (intel_dp->link.active)
-		current_rate = intel_dp->link_rate;
-
-	force_rate = intel_dp->link.force_rate;
-
-	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
-
-	seq_printf(m, "%sauto%s",
-		   force_rate == 0 ? "[" : "",
-		   force_rate == 0 ? "]" : "");
-
-	for (i = 0; i < intel_dp->num_source_rates; i++)
-		seq_printf(m, " %s%d%s%s",
-			   intel_dp->source_rates[i] == force_rate ? "[" : "",
-			   intel_dp->source_rates[i],
-			   intel_dp->source_rates[i] == current_rate ? "*" : "",
-			   intel_dp->source_rates[i] == force_rate ? "]" : "");
-
-	seq_putc(m, '\n');
-
-	return 0;
-}
-
-static int parse_link_rate(struct intel_dp *intel_dp, const char __user *ubuf, size_t len)
-{
-	char *kbuf;
-	const char *p;
-	int rate;
-	int ret = 0;
-
-	kbuf = memdup_user_nul(ubuf, len);
-	if (IS_ERR(kbuf))
-		return PTR_ERR(kbuf);
-
-	p = strim(kbuf);
-
-	if (!strcmp(p, "auto")) {
-		rate = 0;
-	} else {
-		ret = kstrtoint(p, 0, &rate);
-		if (ret < 0)
-			goto out_free;
-
-		if (intel_dp_rate_index(intel_dp->source_rates,
-					intel_dp->num_source_rates,
-					rate) < 0)
-			ret = -EINVAL;
-	}
-
-out_free:
-	kfree(kbuf);
-
-	return ret < 0 ? ret : rate;
-}
-
-static ssize_t i915_dp_force_link_rate_write(struct file *file,
-					     const char __user *ubuf,
-					     size_t len, loff_t *offp)
-{
-	struct seq_file *m = file->private_data;
-	struct intel_connector *connector = to_intel_connector(m->private);
-	struct intel_display *display = to_intel_display(connector);
-	struct intel_dp *intel_dp = intel_attached_dp(connector);
-	int rate;
-	int err;
-
-	rate = parse_link_rate(intel_dp, ubuf, len);
-	if (rate < 0)
-		return rate;
-
-	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
-	if (err)
-		return err;
-
-	intel_dp_flush_connector_commits(connector);
-
-	intel_dp_reset_link_params(intel_dp);
-	intel_dp->link.force_rate = rate;
-
-	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
-
-	*offp += len;
-
-	return len;
-}
-DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_link_rate);
-
-static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
-{
-	struct intel_connector *connector = to_intel_connector(m->private);
-	struct intel_display *display = to_intel_display(connector);
-	struct intel_dp *intel_dp = intel_attached_dp(connector);
-	int current_lane_count = -1;
-	int force_lane_count;
-	int err;
-	int i;
-
-	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
-	if (err)
-		return err;
-
-	intel_dp_flush_connector_commits(connector);
-
-	if (intel_dp->link.active)
-		current_lane_count = intel_dp->lane_count;
-	force_lane_count = intel_dp->link.force_lane_count;
-
-	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
-
-	seq_printf(m, "%sauto%s",
-		   force_lane_count == 0 ? "[" : "",
-		   force_lane_count == 0 ? "]" : "");
-
-	for (i = 1; i <= 4; i <<= 1)
-		seq_printf(m, " %s%d%s%s",
-			   i == force_lane_count ? "[" : "",
-			   i,
-			   i == current_lane_count ? "*" : "",
-			   i == force_lane_count ? "]" : "");
-
-	seq_putc(m, '\n');
-
-	return 0;
-}
-
-static int parse_lane_count(const char __user *ubuf, size_t len)
-{
-	char *kbuf;
-	const char *p;
-	int lane_count;
-	int ret = 0;
-
-	kbuf = memdup_user_nul(ubuf, len);
-	if (IS_ERR(kbuf))
-		return PTR_ERR(kbuf);
-
-	p = strim(kbuf);
-
-	if (!strcmp(p, "auto")) {
-		lane_count = 0;
-	} else {
-		ret = kstrtoint(p, 0, &lane_count);
-		if (ret < 0)
-			goto out_free;
-
-		switch (lane_count) {
-		case 1:
-		case 2:
-		case 4:
-			break;
-		default:
-			ret = -EINVAL;
-		}
-	}
-
-out_free:
-	kfree(kbuf);
-
-	return ret < 0 ? ret : lane_count;
-}
-
-static ssize_t i915_dp_force_lane_count_write(struct file *file,
-					      const char __user *ubuf,
-					      size_t len, loff_t *offp)
-{
-	struct seq_file *m = file->private_data;
-	struct intel_connector *connector = to_intel_connector(m->private);
-	struct intel_display *display = to_intel_display(connector);
-	struct intel_dp *intel_dp = intel_attached_dp(connector);
-	int lane_count;
-	int err;
-
-	lane_count = parse_lane_count(ubuf, len);
-	if (lane_count < 0)
-		return lane_count;
-
-	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
-	if (err)
-		return err;
-
-	intel_dp_flush_connector_commits(connector);
-
-	intel_dp_reset_link_params(intel_dp);
-	intel_dp->link.force_lane_count = lane_count;
-
-	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
-
-	*offp += len;
-
-	return len;
-}
-DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_lane_count);
-
-static int i915_dp_max_link_rate_show(void *data, u64 *val)
-{
-	struct intel_connector *connector = to_intel_connector(data);
-	struct intel_display *display = to_intel_display(connector);
-	struct intel_dp *intel_dp = intel_attached_dp(connector);
-	int err;
-
-	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
-	if (err)
-		return err;
-
-	intel_dp_flush_connector_commits(connector);
-
-	*val = intel_dp->link.max_rate;
-
-	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
-
-	return 0;
-}
-DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_link_rate_fops, i915_dp_max_link_rate_show, NULL, "%llu\n");
-
-static int i915_dp_max_lane_count_show(void *data, u64 *val)
-{
-	struct intel_connector *connector = to_intel_connector(data);
-	struct intel_display *display = to_intel_display(connector);
-	struct intel_dp *intel_dp = intel_attached_dp(connector);
-	int err;
-
-	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
-	if (err)
-		return err;
-
-	intel_dp_flush_connector_commits(connector);
-
-	*val = intel_dp->link.max_lane_count;
-
-	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
-
-	return 0;
-}
-DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_lane_count_fops, i915_dp_max_lane_count_show, NULL, "%llu\n");
-
 static int i915_dp_force_link_training_failure_show(void *data, u64 *val)
 {
 	struct intel_connector *connector = to_intel_connector(data);
@@ -3033,18 +2782,6 @@ void intel_dp_link_training_debugfs_add(struct intel_connector *connector)
 	    connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
 		return;
 
-	debugfs_create_file("i915_dp_force_link_rate", 0644, root,
-			    connector, &i915_dp_force_link_rate_fops);
-
-	debugfs_create_file("i915_dp_force_lane_count", 0644, root,
-			    connector, &i915_dp_force_lane_count_fops);
-
-	debugfs_create_file("i915_dp_max_link_rate", 0444, root,
-			    connector, &i915_dp_max_link_rate_fops);
-
-	debugfs_create_file("i915_dp_max_lane_count", 0444, root,
-			    connector, &i915_dp_max_lane_count_fops);
-
 	debugfs_create_file("i915_dp_force_link_training_failure", 0644, root,
 			    connector, &i915_dp_force_link_training_failure_fops);
 
-- 
2.49.1


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

* [PATCH v2 08/28] drm/i915/dp_link_training: Use helpers to get forced link params
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (6 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 07/28] drm/i915/dp_link_caps: Move forced and max link debugfs entries to link caps Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23 10:31   ` Luca Coelho
  2026-06-16 20:08 ` [PATCH v2 09/28] drm/i915/dp_link_caps: Move forced link params to link_caps Imre Deak
                   ` (23 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Use intel_dp_link_caps_get_forced_params() in the link training fallback
code instead of directly accessing the state. This allows the link caps
module to track changes to forced parameters internally.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 .../drm/i915/display/intel_dp_link_training.c | 22 ++++++++++++++-----
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
index cbef3d45baf9c..61ada34ab9c8e 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
@@ -1850,18 +1850,22 @@ static bool reduce_link_params_in_bw_order(struct intel_dp *intel_dp,
 					   const struct intel_crtc_state *crtc_state,
 					   int *new_link_rate, int *new_lane_count)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+	struct intel_dp_link_config forced_params;
 	int link_rate;
 	int lane_count;
 	int i;
 
+	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
+
 	i = intel_dp_link_config_index(intel_dp, crtc_state->port_clock, crtc_state->lane_count);
 	for (i--; i >= 0; i--) {
 		intel_dp_link_config_get(intel_dp, i, &link_rate, &lane_count);
 
-		if ((intel_dp->link.force_rate &&
-		     intel_dp->link.force_rate != link_rate) ||
-		    (intel_dp->link.force_lane_count &&
-		     intel_dp->link.force_lane_count != lane_count))
+		if ((forced_params.rate &&
+		     forced_params.rate != link_rate) ||
+		    (forced_params.lane_count &&
+		     forced_params.lane_count != lane_count))
 			continue;
 
 		break;
@@ -1878,10 +1882,13 @@ static bool reduce_link_params_in_bw_order(struct intel_dp *intel_dp,
 
 static int reduce_link_rate(struct intel_dp *intel_dp, int current_rate)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+	struct intel_dp_link_config forced_params;
 	int rate_index;
 	int new_rate;
 
-	if (intel_dp->link.force_rate)
+	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
+	if (forced_params.rate)
 		return -1;
 
 	rate_index = intel_dp_rate_index(intel_dp->common_rates,
@@ -1902,7 +1909,10 @@ static int reduce_link_rate(struct intel_dp *intel_dp, int current_rate)
 
 static int reduce_lane_count(struct intel_dp *intel_dp, int current_lane_count)
 {
-	if (intel_dp->link.force_lane_count)
+	struct intel_dp_link_config forced_params;
+
+	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
+	if (forced_params.lane_count)
 		return -1;
 
 	if (current_lane_count == 1)
-- 
2.49.1


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

* [PATCH v2 09/28] drm/i915/dp_link_caps: Move forced link params to link_caps
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (7 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 08/28] drm/i915/dp_link_training: Use helpers to get forced link params Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23 10:32   ` Luca Coelho
  2026-06-16 20:08 ` [PATCH v2 10/28] drm/i915/dp_link_caps: Move link config helpers to link caps Imre Deak
                   ` (22 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Move tracking of the forced link parameters from struct intel_dp to
struct intel_dp_link_caps.

Previous changes made all users access these parameters through the link
caps helpers, so the state can now be kept internal to the link caps
module.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 .../drm/i915/display/intel_display_types.h    |  2 --
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 30 ++++++++++++++-----
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 10933ccdeb31e..c84ef29529373 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1865,8 +1865,6 @@ struct intel_dp {
 		 */
 		int mst_probed_lane_count;
 		int mst_probed_rate;
-		int force_lane_count;
-		int force_rate;
 		struct intel_dp_link_training *training;
 		struct intel_dp_link_caps *caps;
 	} link;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index ea90e84500a89..8ecdc01af70eb 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -15,6 +15,12 @@
 
 struct intel_dp_link_caps {
 	struct intel_dp *dp;
+
+	/*
+	 * Forced parameters requested via debugfs. Remains set across sink
+	 * disconnects.
+	 */
+	struct intel_dp_link_config forced_params;
 };
 
 /* Get length of common rates array potentially limited by max_rate. */
@@ -44,20 +50,24 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
 
 static int forced_lane_count(struct intel_dp *intel_dp)
 {
-	if (!intel_dp->link.force_lane_count)
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+
+	if (!link_caps->forced_params.lane_count)
 		return 0;
 
-	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
+	return clamp(link_caps->forced_params.lane_count,
+		     1, intel_dp_max_common_lane_count(intel_dp));
 }
 
 static int forced_link_rate(struct intel_dp *intel_dp)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	int len;
 
-	if (!intel_dp->link.force_rate)
+	if (!link_caps->forced_params.rate)
 		return 0;
 
-	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
+	len = intel_dp_common_len_rate_limit(intel_dp, link_caps->forced_params.rate);
 	if (len == 0)
 		return intel_dp_common_rate(intel_dp, 0);
 
@@ -76,6 +86,7 @@ static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
 	struct intel_connector *connector = to_intel_connector(m->private);
 	struct intel_display *display = to_intel_display(connector);
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	int current_rate = -1;
 	int force_rate;
 	int err;
@@ -90,7 +101,7 @@ static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
 	if (intel_dp->link.active)
 		current_rate = intel_dp->link_rate;
 
-	force_rate = intel_dp->link.force_rate;
+	force_rate = link_caps->forced_params.rate;
 
 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
 
@@ -150,6 +161,7 @@ static ssize_t i915_dp_force_link_rate_write(struct file *file,
 	struct intel_connector *connector = to_intel_connector(m->private);
 	struct intel_display *display = to_intel_display(connector);
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	int rate;
 	int err;
 
@@ -164,7 +176,7 @@ static ssize_t i915_dp_force_link_rate_write(struct file *file,
 	intel_dp_flush_connector_commits(connector);
 
 	intel_dp_reset_link_params(intel_dp);
-	intel_dp->link.force_rate = rate;
+	link_caps->forced_params.rate = rate;
 
 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
 
@@ -179,6 +191,7 @@ static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
 	struct intel_connector *connector = to_intel_connector(m->private);
 	struct intel_display *display = to_intel_display(connector);
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	int current_lane_count = -1;
 	int force_lane_count;
 	int err;
@@ -192,7 +205,7 @@ static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
 
 	if (intel_dp->link.active)
 		current_lane_count = intel_dp->lane_count;
-	force_lane_count = intel_dp->link.force_lane_count;
+	force_lane_count = link_caps->forced_params.lane_count;
 
 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
 
@@ -256,6 +269,7 @@ static ssize_t i915_dp_force_lane_count_write(struct file *file,
 	struct intel_connector *connector = to_intel_connector(m->private);
 	struct intel_display *display = to_intel_display(connector);
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	int lane_count;
 	int err;
 
@@ -270,7 +284,7 @@ static ssize_t i915_dp_force_lane_count_write(struct file *file,
 	intel_dp_flush_connector_commits(connector);
 
 	intel_dp_reset_link_params(intel_dp);
-	intel_dp->link.force_lane_count = lane_count;
+	link_caps->forced_params.lane_count = lane_count;
 
 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
 
-- 
2.49.1


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

* [PATCH v2 10/28] drm/i915/dp_link_caps: Move link config helpers to link caps
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (8 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 09/28] drm/i915/dp_link_caps: Move forced link params to link_caps Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23 10:34   ` Luca Coelho
  2026-06-16 20:08 ` [PATCH v2 11/28] drm/i915/dp_link_caps: Move link config tracking to link_caps Imre Deak
                   ` (21 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Move the helpers handling link configurations to intel_dp_link_caps.c.
Their functionality is part of the link capability logic and will be
updated to use the link capability state in follow-up changes.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c       | 101 -----------------
 drivers/gpu/drm/i915/display/intel_dp.h       |   2 -
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 102 ++++++++++++++++++
 .../gpu/drm/i915/display/intel_dp_link_caps.h |   5 +
 4 files changed, 107 insertions(+), 103 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index c4ad386acc6db..c4b650431eff5 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -33,7 +33,6 @@
 #include <linux/notifier.h>
 #include <linux/seq_buf.h>
 #include <linux/slab.h>
-#include <linux/sort.h>
 #include <linux/string_helpers.h>
 #include <linux/timekeeping.h>
 #include <linux/types.h>
@@ -677,106 +676,6 @@ int intel_dp_rate_index(const int *rates, int len, int rate)
 	return -1;
 }
 
-static int intel_dp_link_config_rate(struct intel_dp *intel_dp,
-				     const struct intel_dp_link_config_entry *lc)
-{
-	return intel_dp_common_rate(intel_dp, lc->link_rate_idx);
-}
-
-static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lc)
-{
-	return 1 << lc->lane_count_exp;
-}
-
-static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
-				   const struct intel_dp_link_config_entry *lc)
-{
-	return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(intel_dp, lc),
-					 intel_dp_link_config_lane_count(lc));
-}
-
-static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
-{
-	struct intel_dp *intel_dp = (struct intel_dp *)p;	/* remove const */
-	const struct intel_dp_link_config_entry *lc_a = a;
-	const struct intel_dp_link_config_entry *lc_b = b;
-	int bw_a = intel_dp_link_config_bw(intel_dp, lc_a);
-	int bw_b = intel_dp_link_config_bw(intel_dp, lc_b);
-
-	if (bw_a != bw_b)
-		return bw_a - bw_b;
-
-	return intel_dp_link_config_rate(intel_dp, lc_a) -
-	       intel_dp_link_config_rate(intel_dp, lc_b);
-}
-
-static void intel_dp_link_config_init(struct intel_dp *intel_dp)
-{
-	struct intel_display *display = to_intel_display(intel_dp);
-	struct intel_dp_link_config_entry *lc;
-	int num_common_lane_configs;
-	int i;
-	int j;
-
-	if (drm_WARN_ON(display->drm, !is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
-		return;
-
-	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
-
-	if (drm_WARN_ON(display->drm, intel_dp->num_common_rates * num_common_lane_configs >
-				    ARRAY_SIZE(intel_dp->link.configs)))
-		return;
-
-	intel_dp->link.num_configs = intel_dp->num_common_rates * num_common_lane_configs;
-
-	lc = &intel_dp->link.configs[0];
-	for (i = 0; i < intel_dp->num_common_rates; i++) {
-		for (j = 0; j < num_common_lane_configs; j++) {
-			lc->lane_count_exp = j;
-			lc->link_rate_idx = i;
-
-			lc++;
-		}
-	}
-
-	sort_r(intel_dp->link.configs, intel_dp->link.num_configs,
-	       sizeof(intel_dp->link.configs[0]),
-	       link_config_cmp_by_bw, NULL,
-	       intel_dp);
-}
-
-void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
-{
-	struct intel_display *display = to_intel_display(intel_dp);
-	const struct intel_dp_link_config_entry *lc;
-
-	if (drm_WARN_ON(display->drm, idx < 0 || idx >= intel_dp->link.num_configs))
-		idx = 0;
-
-	lc = &intel_dp->link.configs[idx];
-
-	*link_rate = intel_dp_link_config_rate(intel_dp, lc);
-	*lane_count = intel_dp_link_config_lane_count(lc);
-}
-
-int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count)
-{
-	int link_rate_idx = intel_dp_rate_index(intel_dp->common_rates, intel_dp->num_common_rates,
-						link_rate);
-	int lane_count_exp = ilog2(lane_count);
-	int i;
-
-	for (i = 0; i < intel_dp->link.num_configs; i++) {
-		const struct intel_dp_link_config_entry *lc = &intel_dp->link.configs[i];
-
-		if (lc->lane_count_exp == lane_count_exp &&
-		    lc->link_rate_idx == link_rate_idx)
-			return i;
-	}
-
-	return -1;
-}
-
 /* Return %true if the common rates changed. */
 static bool intel_dp_set_common_rates(struct intel_dp *intel_dp)
 {
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
index 8cc6ea04e000c..fdf9bd88859e7 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -108,8 +108,6 @@ int intel_dp_config_required_rate(const struct intel_crtc_state *crtc_state);
 int intel_dp_rate_select(struct intel_dp *intel_dp, int rate);
 int intel_dp_max_common_lane_count(struct intel_dp *intel_dp);
 int intel_dp_rate_index(const int *rates, int len, int rate);
-int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
-void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
 void intel_dp_update_sink_caps(struct intel_dp *intel_dp);
 void intel_dp_reset_link_params(struct intel_dp *intel_dp);
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 8ecdc01af70eb..6a37ba8c35e27 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -4,7 +4,9 @@
  */
 
 #include <linux/debugfs.h>
+#include <linux/log2.h>
 #include <linux/slab.h>
+#include <linux/sort.h>
 
 #include <drm/drm_print.h>
 
@@ -81,6 +83,106 @@ void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
 	forced_params->lane_count = forced_lane_count(link_caps->dp);
 }
 
+static int intel_dp_link_config_rate(struct intel_dp *intel_dp,
+				     const struct intel_dp_link_config_entry *lc)
+{
+	return intel_dp_common_rate(intel_dp, lc->link_rate_idx);
+}
+
+static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lc)
+{
+	return 1 << lc->lane_count_exp;
+}
+
+static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
+				   const struct intel_dp_link_config_entry *lc)
+{
+	return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(intel_dp, lc),
+					 intel_dp_link_config_lane_count(lc));
+}
+
+static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
+{
+	struct intel_dp *intel_dp = (struct intel_dp *)p;	/* remove const */
+	const struct intel_dp_link_config_entry *lc_a = a;
+	const struct intel_dp_link_config_entry *lc_b = b;
+	int bw_a = intel_dp_link_config_bw(intel_dp, lc_a);
+	int bw_b = intel_dp_link_config_bw(intel_dp, lc_b);
+
+	if (bw_a != bw_b)
+		return bw_a - bw_b;
+
+	return intel_dp_link_config_rate(intel_dp, lc_a) -
+	       intel_dp_link_config_rate(intel_dp, lc_b);
+}
+
+void intel_dp_link_config_init(struct intel_dp *intel_dp)
+{
+	struct intel_display *display = to_intel_display(intel_dp);
+	struct intel_dp_link_config_entry *lc;
+	int num_common_lane_configs;
+	int i;
+	int j;
+
+	if (drm_WARN_ON(display->drm, !is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
+		return;
+
+	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
+
+	if (drm_WARN_ON(display->drm, intel_dp->num_common_rates * num_common_lane_configs >
+				    ARRAY_SIZE(intel_dp->link.configs)))
+		return;
+
+	intel_dp->link.num_configs = intel_dp->num_common_rates * num_common_lane_configs;
+
+	lc = &intel_dp->link.configs[0];
+	for (i = 0; i < intel_dp->num_common_rates; i++) {
+		for (j = 0; j < num_common_lane_configs; j++) {
+			lc->lane_count_exp = j;
+			lc->link_rate_idx = i;
+
+			lc++;
+		}
+	}
+
+	sort_r(intel_dp->link.configs, intel_dp->link.num_configs,
+	       sizeof(intel_dp->link.configs[0]),
+	       link_config_cmp_by_bw, NULL,
+	       intel_dp);
+}
+
+void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
+{
+	struct intel_display *display = to_intel_display(intel_dp);
+	const struct intel_dp_link_config_entry *lc;
+
+	if (drm_WARN_ON(display->drm, idx < 0 || idx >= intel_dp->link.num_configs))
+		idx = 0;
+
+	lc = &intel_dp->link.configs[idx];
+
+	*link_rate = intel_dp_link_config_rate(intel_dp, lc);
+	*lane_count = intel_dp_link_config_lane_count(lc);
+}
+
+int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count)
+{
+	int link_rate_idx = intel_dp_rate_index(intel_dp->common_rates, intel_dp->num_common_rates,
+						link_rate);
+	int lane_count_exp = ilog2(lane_count);
+	int i;
+
+	for (i = 0; i < intel_dp->link.num_configs; i++) {
+		const struct intel_dp_link_config_entry *lc = &intel_dp->link.configs[i];
+
+		if (lc->lane_count_exp == lane_count_exp &&
+		    lc->link_rate_idx == link_rate_idx)
+			return i;
+	}
+
+	return -1;
+}
+
 static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
 {
 	struct intel_connector *connector = to_intel_connector(m->private);
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index c6a84891db464..dab956e804b95 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -17,6 +17,11 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp);
 void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
 					  struct intel_dp_link_config *forced_params);
 
+int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
+void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
+
+void intel_dp_link_config_init(struct intel_dp *intel_dp);
+
 void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
 
 struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
-- 
2.49.1


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

* [PATCH v2 11/28] drm/i915/dp_link_caps: Move link config tracking to link_caps
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (9 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 10/28] drm/i915/dp_link_caps: Move link config helpers to link caps Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23 11:17   ` Kahola, Mika
  2026-06-24 11:15   ` Luca Coelho
  2026-06-16 20:08 ` [PATCH v2 12/28] drm/i915/dp_link_caps: Rename helper updating the link configurations Imre Deak
                   ` (20 subsequent siblings)
  31 siblings, 2 replies; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Move tracking of the link configurations from struct intel_dp to struct
intel_dp_link_caps.

Previous changes moved the helpers operating on configurations to the
link caps module, so the state can now be kept internal to that module.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 .../drm/i915/display/intel_display_types.h    | 12 -------
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 36 ++++++++++++++-----
 2 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index c84ef29529373..443bb3b5e9fa3 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1841,18 +1841,6 @@ struct intel_dp {
 	struct {
 		/* TODO: move the rest of link specific fields to here */
 		bool active;
-		/* common rate,lane_count configs in bw order */
-		int num_configs;
-#define INTEL_DP_MAX_LANE_COUNT			4
-#define INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS	(ilog2(INTEL_DP_MAX_LANE_COUNT) + 1)
-#define INTEL_DP_LANE_COUNT_EXP_BITS		order_base_2(INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
-#define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
-#define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
-						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
-		struct intel_dp_link_config_entry {
-			u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
-			u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
-		} configs[INTEL_DP_MAX_LINK_CONFIGS];
 		/* Max lane count for the current link */
 		int max_lane_count;
 		/* Max rate for the current link */
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 6a37ba8c35e27..05ec933c74407 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -3,10 +3,12 @@
  * Copyright © 2026 Intel Corporation
  */
 
+#include <linux/bitops.h>
 #include <linux/debugfs.h>
 #include <linux/log2.h>
 #include <linux/slab.h>
 #include <linux/sort.h>
+#include <linux/types.h>
 
 #include <drm/drm_print.h>
 
@@ -18,6 +20,19 @@
 struct intel_dp_link_caps {
 	struct intel_dp *dp;
 
+	/* common rate,lane_count configs in bw order */
+	int num_configs;
+#define INTEL_DP_MAX_LANE_COUNT			4
+#define INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS	(ilog2(INTEL_DP_MAX_LANE_COUNT) + 1)
+#define INTEL_DP_LANE_COUNT_EXP_BITS		order_base_2(INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
+#define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
+#define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
+						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
+	struct intel_dp_link_config_entry {
+		u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
+		u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
+	} configs[INTEL_DP_MAX_LINK_CONFIGS];
+
 	/*
 	 * Forced parameters requested via debugfs. Remains set across sink
 	 * disconnects.
@@ -118,6 +133,7 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
 
 void intel_dp_link_config_init(struct intel_dp *intel_dp)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	struct intel_display *display = to_intel_display(intel_dp);
 	struct intel_dp_link_config_entry *lc;
 	int num_common_lane_configs;
@@ -130,12 +146,12 @@ void intel_dp_link_config_init(struct intel_dp *intel_dp)
 	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
 
 	if (drm_WARN_ON(display->drm, intel_dp->num_common_rates * num_common_lane_configs >
-				    ARRAY_SIZE(intel_dp->link.configs)))
+				    ARRAY_SIZE(link_caps->configs)))
 		return;
 
-	intel_dp->link.num_configs = intel_dp->num_common_rates * num_common_lane_configs;
+	link_caps->num_configs = intel_dp->num_common_rates * num_common_lane_configs;
 
-	lc = &intel_dp->link.configs[0];
+	lc = &link_caps->configs[0];
 	for (i = 0; i < intel_dp->num_common_rates; i++) {
 		for (j = 0; j < num_common_lane_configs; j++) {
 			lc->lane_count_exp = j;
@@ -145,21 +161,22 @@ void intel_dp_link_config_init(struct intel_dp *intel_dp)
 		}
 	}
 
-	sort_r(intel_dp->link.configs, intel_dp->link.num_configs,
-	       sizeof(intel_dp->link.configs[0]),
+	sort_r(link_caps->configs, link_caps->num_configs,
+	       sizeof(link_caps->configs[0]),
 	       link_config_cmp_by_bw, NULL,
 	       intel_dp);
 }
 
 void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	struct intel_display *display = to_intel_display(intel_dp);
 	const struct intel_dp_link_config_entry *lc;
 
-	if (drm_WARN_ON(display->drm, idx < 0 || idx >= intel_dp->link.num_configs))
+	if (drm_WARN_ON(display->drm, idx < 0 || idx >= link_caps->num_configs))
 		idx = 0;
 
-	lc = &intel_dp->link.configs[idx];
+	lc = &link_caps->configs[idx];
 
 	*link_rate = intel_dp_link_config_rate(intel_dp, lc);
 	*lane_count = intel_dp_link_config_lane_count(lc);
@@ -167,13 +184,14 @@ void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate
 
 int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	int link_rate_idx = intel_dp_rate_index(intel_dp->common_rates, intel_dp->num_common_rates,
 						link_rate);
 	int lane_count_exp = ilog2(lane_count);
 	int i;
 
-	for (i = 0; i < intel_dp->link.num_configs; i++) {
-		const struct intel_dp_link_config_entry *lc = &intel_dp->link.configs[i];
+	for (i = 0; i < link_caps->num_configs; i++) {
+		const struct intel_dp_link_config_entry *lc = &link_caps->configs[i];
 
 		if (lc->lane_count_exp == lane_count_exp &&
 		    lc->link_rate_idx == link_rate_idx)
-- 
2.49.1


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

* [PATCH v2 12/28] drm/i915/dp_link_caps: Rename helper updating the link configurations
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (10 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 11/28] drm/i915/dp_link_caps: Move link config tracking to link_caps Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23  5:11   ` Garg, Nemesa
  2026-06-16 20:08 ` [PATCH v2 13/28] drm/i915/dp: Factor out helper to get link rate capabilities Imre Deak
                   ` (19 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Rename the helper updating link configurations to
intel_dp_link_caps_update() to better reflect its functionality.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c           | 2 +-
 drivers/gpu/drm/i915/display/intel_dp_link_caps.c | 2 +-
 drivers/gpu/drm/i915/display/intel_dp_link_caps.h | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index c4b650431eff5..65a13b2f7584d 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -720,7 +720,7 @@ static bool intel_dp_set_common_link_params(struct intel_dp *intel_dp)
 	if (intel_dp_set_max_common_lane_count(intel_dp))
 		params_changed = true;
 
-	intel_dp_link_config_init(intel_dp);
+	intel_dp_link_caps_update(intel_dp);
 
 	return params_changed;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 05ec933c74407..2074952931738 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -131,7 +131,7 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
 	       intel_dp_link_config_rate(intel_dp, lc_b);
 }
 
-void intel_dp_link_config_init(struct intel_dp *intel_dp)
+void intel_dp_link_caps_update(struct intel_dp *intel_dp)
 {
 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	struct intel_display *display = to_intel_display(intel_dp);
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index dab956e804b95..aed2122a05d24 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -20,7 +20,7 @@ void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
 int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
 void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
 
-void intel_dp_link_config_init(struct intel_dp *intel_dp);
+void intel_dp_link_caps_update(struct intel_dp *intel_dp);
 
 void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
 
-- 
2.49.1


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

* [PATCH v2 13/28] drm/i915/dp: Factor out helper to get link rate capabilities
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (11 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 12/28] drm/i915/dp_link_caps: Rename helper updating the link configurations Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-24  8:29   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 14/28] drm/i915/dp_link_caps: Pass supported link rates to link caps update Imre Deak
                   ` (18 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Factor out a helper to get the supported link rates. This allows to
gather all the link capabilities and pass these to the link capability
module from a single place. A follow-up change will extend this to
gather and pass the maximum lane count capability in the same way.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c | 37 +++++++++++++++----------
 1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 65a13b2f7584d..635e3ede0d41e 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -676,33 +676,40 @@ int intel_dp_rate_index(const int *rates, int len, int rate)
 	return -1;
 }
 
-/* Return %true if the common rates changed. */
-static bool intel_dp_set_common_rates(struct intel_dp *intel_dp)
+static void intel_dp_get_common_rates(struct intel_dp *intel_dp,
+				      int common_rates[DP_MAX_SUPPORTED_RATES],
+				      int *num_common_rates)
 {
 	struct intel_display *display = to_intel_display(intel_dp);
-	int num_old_common_rates = intel_dp->num_common_rates;
-	int old_common_rates[DP_MAX_SUPPORTED_RATES];
 
 	drm_WARN_ON(display->drm,
 		    !intel_dp->num_source_rates || !intel_dp->num_sink_rates);
 
+	*num_common_rates = intersect_rates(intel_dp->source_rates,
+					    intel_dp->num_source_rates,
+					    intel_dp->sink_rates,
+					    intel_dp->num_sink_rates,
+					    common_rates);
+
+	/* Paranoia, there should always be something in common. */
+	if (drm_WARN_ON(display->drm, *num_common_rates == 0)) {
+		common_rates[0] = 162000;
+		*num_common_rates = 1;
+	}
+}
+
+static bool intel_dp_set_common_rates(struct intel_dp *intel_dp)
+{
+	int num_old_common_rates = intel_dp->num_common_rates;
+	int old_common_rates[DP_MAX_SUPPORTED_RATES];
+
 	/* TODO: Add a struct containing both rates and number of rates. */
 	static_assert(__same_type(old_common_rates[0], intel_dp->common_rates[0]) &&
 		      sizeof(old_common_rates) == sizeof(intel_dp->common_rates));
 	memcpy(old_common_rates, intel_dp->common_rates,
 	       num_old_common_rates * sizeof(old_common_rates[0]));
 
-	intel_dp->num_common_rates = intersect_rates(intel_dp->source_rates,
-						     intel_dp->num_source_rates,
-						     intel_dp->sink_rates,
-						     intel_dp->num_sink_rates,
-						     intel_dp->common_rates);
-
-	/* Paranoia, there should always be something in common. */
-	if (drm_WARN_ON(display->drm, intel_dp->num_common_rates == 0)) {
-		intel_dp->common_rates[0] = 162000;
-		intel_dp->num_common_rates = 1;
-	}
+	intel_dp_get_common_rates(intel_dp, intel_dp->common_rates, &intel_dp->num_common_rates);
 
 	return num_old_common_rates != intel_dp->num_common_rates ||
 	       memcmp(old_common_rates, intel_dp->common_rates,
-- 
2.49.1


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

* [PATCH v2 14/28] drm/i915/dp_link_caps: Pass supported link rates to link caps update
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (12 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 13/28] drm/i915/dp: Factor out helper to get link rate capabilities Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-24  8:32   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 15/28] drm/i915/dp_link_caps: Add helper to print all supported link rates Imre Deak
                   ` (17 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Pass the supported link rates explicitly to intel_dp_link_caps_update().
This prepares for tracking these capabilities internally within the
link caps module.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c       | 28 ++++---------------
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 28 +++++++++++++++----
 .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 +++-
 3 files changed, 33 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 635e3ede0d41e..d2b9b6fce2b32 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -698,36 +698,20 @@ static void intel_dp_get_common_rates(struct intel_dp *intel_dp,
 	}
 }
 
-static bool intel_dp_set_common_rates(struct intel_dp *intel_dp)
-{
-	int num_old_common_rates = intel_dp->num_common_rates;
-	int old_common_rates[DP_MAX_SUPPORTED_RATES];
-
-	/* TODO: Add a struct containing both rates and number of rates. */
-	static_assert(__same_type(old_common_rates[0], intel_dp->common_rates[0]) &&
-		      sizeof(old_common_rates) == sizeof(intel_dp->common_rates));
-	memcpy(old_common_rates, intel_dp->common_rates,
-	       num_old_common_rates * sizeof(old_common_rates[0]));
-
-	intel_dp_get_common_rates(intel_dp, intel_dp->common_rates, &intel_dp->num_common_rates);
-
-	return num_old_common_rates != intel_dp->num_common_rates ||
-	       memcmp(old_common_rates, intel_dp->common_rates,
-		      num_old_common_rates * sizeof(old_common_rates[0]));
-}
-
 /* Return %true if any common link param changed. */
 static bool intel_dp_set_common_link_params(struct intel_dp *intel_dp)
 {
+	int num_common_rates;
+	int common_rates[DP_MAX_SUPPORTED_RATES];
 	bool params_changed = false;
 
-	if (intel_dp_set_common_rates(intel_dp))
-		params_changed = true;
-
 	if (intel_dp_set_max_common_lane_count(intel_dp))
 		params_changed = true;
 
-	intel_dp_link_caps_update(intel_dp);
+	intel_dp_get_common_rates(intel_dp, common_rates, &num_common_rates);
+	if (intel_dp_link_caps_update(intel_dp,
+				      common_rates, num_common_rates))
+		params_changed = true;
 
 	return params_changed;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 2074952931738..679d59cc256c9 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -8,6 +8,7 @@
 #include <linux/log2.h>
 #include <linux/slab.h>
 #include <linux/sort.h>
+#include <linux/string.h>
 #include <linux/types.h>
 
 #include <drm/drm_print.h>
@@ -131,25 +132,39 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
 	       intel_dp_link_config_rate(intel_dp, lc_b);
 }
 
-void intel_dp_link_caps_update(struct intel_dp *intel_dp)
+/* Return %true if the supported link parameters have changed. */
+bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
+			       const int *rates, int num_rates)
 {
 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	struct intel_display *display = to_intel_display(intel_dp);
 	struct intel_dp_link_config_entry *lc;
+	bool link_params_changed = false;
 	int num_common_lane_configs;
 	int i;
 	int j;
 
 	if (drm_WARN_ON(display->drm, !is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
-		return;
+		return false;
+
+	if (drm_WARN_ON(display->drm, num_rates > ARRAY_SIZE(intel_dp->common_rates)))
+		return false;
 
 	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
 
-	if (drm_WARN_ON(display->drm, intel_dp->num_common_rates * num_common_lane_configs >
+	if (drm_WARN_ON(display->drm, num_rates * num_common_lane_configs >
 				    ARRAY_SIZE(link_caps->configs)))
-		return;
+		return false;
 
-	link_caps->num_configs = intel_dp->num_common_rates * num_common_lane_configs;
+	/* TODO: Add a struct containing both rates and number of rates. */
+	static_assert(__same_type(rates[0], intel_dp->common_rates[0]));
+	if (num_rates != intel_dp->num_common_rates ||
+	    memcmp(rates, intel_dp->common_rates, num_rates * sizeof(rates[0])))
+		link_params_changed = true;
+
+	memcpy(intel_dp->common_rates, rates, num_rates * sizeof(rates[0]));
+	intel_dp->num_common_rates = num_rates;
+	link_caps->num_configs = num_rates * num_common_lane_configs;
 
 	lc = &link_caps->configs[0];
 	for (i = 0; i < intel_dp->num_common_rates; i++) {
@@ -165,6 +180,9 @@ void intel_dp_link_caps_update(struct intel_dp *intel_dp)
 	       sizeof(link_caps->configs[0]),
 	       link_config_cmp_by_bw, NULL,
 	       intel_dp);
+
+	/* TODO: Also detect a change in the max lane count. */
+	return link_params_changed;
 }
 
 void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index aed2122a05d24..09e580bc5c9b3 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -4,6 +4,8 @@
 #ifndef __INTEL_DP_LINK_CAPS_H__
 #define __INTEL_DP_LINK_CAPS_H__
 
+#include <linux/types.h>
+
 struct intel_connector;
 struct intel_dp;
 struct intel_dp_link_caps;
@@ -20,7 +22,8 @@ void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
 int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
 void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
 
-void intel_dp_link_caps_update(struct intel_dp *intel_dp);
+bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
+			       const int *rates, int num_rates);
 
 void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
 
-- 
2.49.1


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

* [PATCH v2 15/28] drm/i915/dp_link_caps: Add helper to print all supported link rates
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (13 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 14/28] drm/i915/dp_link_caps: Pass supported link rates to link caps update Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23  5:21   ` Garg, Nemesa
  2026-06-16 20:08 ` [PATCH v2 16/28] drm/i915/dp_link_caps: Add helper to get the number of " Imre Deak
                   ` (16 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: Jani Nikula

Add intel_dp_link_caps_print_rates() to print all the supported link
rates tracked by the link_caps module. This prepares for tracking
these capabilities internally within the link caps module.

Suggested-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c           |  4 +---
 drivers/gpu/drm/i915/display/intel_dp_link_caps.c | 14 ++++++++++++++
 drivers/gpu/drm/i915/display/intel_dp_link_caps.h |  2 ++
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index d2b9b6fce2b32..f9c3d3561c417 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1543,9 +1543,7 @@ static void intel_dp_print_rates(struct intel_dp *intel_dp)
 	seq_buf_print_array(&s, intel_dp->sink_rates, intel_dp->num_sink_rates);
 	drm_dbg_kms(display->drm, "sink rates: %s\n", seq_buf_str(&s));
 
-	seq_buf_clear(&s);
-	seq_buf_print_array(&s, intel_dp->common_rates, intel_dp->num_common_rates);
-	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
+	intel_dp_link_caps_print_common_rates(intel_dp->link.caps);
 }
 
 int
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 679d59cc256c9..13f9bfd5d7bad 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -6,6 +6,7 @@
 #include <linux/bitops.h>
 #include <linux/debugfs.h>
 #include <linux/log2.h>
+#include <linux/seq_buf.h>
 #include <linux/slab.h>
 #include <linux/sort.h>
 #include <linux/string.h>
@@ -66,6 +67,19 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
 	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
 }
 
+void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps)
+{
+	struct intel_dp *intel_dp = link_caps->dp;
+	struct intel_display *display = to_intel_display(intel_dp);
+	DECLARE_SEQ_BUF(s, 128);
+	int i;
+
+	for (i = 0; i < intel_dp->num_common_rates; i++)
+		seq_buf_printf(&s, "%s%d", i ? ", " : "", intel_dp->common_rates[i]);
+
+	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
+}
+
 static int forced_lane_count(struct intel_dp *intel_dp)
 {
 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 09e580bc5c9b3..7333df6b82f97 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -16,6 +16,8 @@ int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
 int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
 int intel_dp_max_common_rate(struct intel_dp *intel_dp);
 
+void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps);
+
 void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
 					  struct intel_dp_link_config *forced_params);
 
-- 
2.49.1


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

* [PATCH v2 16/28] drm/i915/dp_link_caps: Add helper to get the number of supported link rates
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (14 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 15/28] drm/i915/dp_link_caps: Add helper to print all supported link rates Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-24  8:34   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 17/28] drm/i915/dp_link_caps: Add helper to get common rate index Imre Deak
                   ` (15 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Add intel_dp_link_caps_num_common_rates() to return the number of
supported link rates tracked by the link_caps module. This prepares for
tracking these capabilities internally within the link caps module.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c           | 4 ++--
 drivers/gpu/drm/i915/display/intel_dp_link_caps.c | 5 +++++
 drivers/gpu/drm/i915/display/intel_dp_link_caps.h | 1 +
 3 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index f9c3d3561c417..84640c8394534 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1766,7 +1766,7 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
 		int link_bpp_x16 =
 			intel_dp_output_format_link_bpp_x16(pipe_config->output_format, bpp);
 
-		for (i = 0; i < intel_dp->num_common_rates; i++) {
+		for (i = 0; i < intel_dp_link_caps_num_common_rates(intel_dp->link.caps); i++) {
 			link_rate = intel_dp_common_rate(intel_dp, i);
 			if (link_rate < limits->min_rate ||
 			    link_rate > limits->max_rate)
@@ -1995,7 +1995,7 @@ static int dsc_compute_link_config(struct intel_dp *intel_dp,
 	int link_rate, lane_count;
 	int i;
 
-	for (i = 0; i < intel_dp->num_common_rates; i++) {
+	for (i = 0; i < intel_dp_link_caps_num_common_rates(intel_dp->link.caps); i++) {
 		link_rate = intel_dp_common_rate(intel_dp, i);
 		if (link_rate < limits->min_rate || link_rate > limits->max_rate)
 			continue;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 13f9bfd5d7bad..09b60a0cd6fbb 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -67,6 +67,11 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
 	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
 }
 
+int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps)
+{
+	return link_caps->dp->num_common_rates;
+}
+
 void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps)
 {
 	struct intel_dp *intel_dp = link_caps->dp;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 7333df6b82f97..3413f6f760453 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -15,6 +15,7 @@ int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
 				   int max_rate);
 int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
 int intel_dp_max_common_rate(struct intel_dp *intel_dp);
+int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps);
 
 void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps);
 
-- 
2.49.1


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

* [PATCH v2 17/28] drm/i915/dp_link_caps: Add helper to get common rate index
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (15 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 16/28] drm/i915/dp_link_caps: Add helper to get the number of " Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-24  9:02   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 18/28] drm/i915/dp_link_caps: Move tracking of common rates to link_caps struct Imre Deak
                   ` (14 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Add intel_dp_link_caps_common_rate_idx() to look up supported link rates
tracked by the link_caps module by rate. This prepares for tracking these
capabilities internally within the link caps module.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp_link_caps.c     | 9 +++++++++
 drivers/gpu/drm/i915/display/intel_dp_link_caps.h     | 1 +
 drivers/gpu/drm/i915/display/intel_dp_link_training.c | 5 ++---
 drivers/gpu/drm/i915/display/intel_dp_test.c          | 7 ++++---
 4 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 09b60a0cd6fbb..84d9636f4adb4 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -61,6 +61,15 @@ int intel_dp_common_rate(struct intel_dp *intel_dp, int index)
 	return intel_dp->common_rates[index];
 }
 
+int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, int rate)
+{
+	struct intel_dp *intel_dp = link_caps->dp;
+
+	return intel_dp_rate_index(intel_dp->common_rates,
+				   intel_dp->num_common_rates,
+				   rate);
+}
+
 /* Theoretical max between source and sink */
 int intel_dp_max_common_rate(struct intel_dp *intel_dp)
 {
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 3413f6f760453..7d7d3d11ba3fe 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -14,6 +14,7 @@ struct intel_dp_link_config;
 int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
 				   int max_rate);
 int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
+int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, int rate);
 int intel_dp_max_common_rate(struct intel_dp *intel_dp);
 int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps);
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
index 61ada34ab9c8e..ec9bd9b4c800b 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
@@ -1891,9 +1891,8 @@ static int reduce_link_rate(struct intel_dp *intel_dp, int current_rate)
 	if (forced_params.rate)
 		return -1;
 
-	rate_index = intel_dp_rate_index(intel_dp->common_rates,
-					 intel_dp->num_common_rates,
-					 current_rate);
+	rate_index = intel_dp_link_caps_common_rate_idx(link_caps,
+							current_rate);
 
 	if (rate_index <= 0)
 		return -1;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_test.c b/drivers/gpu/drm/i915/display/intel_dp_test.c
index ba44769c9cfbe..da7632536dace 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_test.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_test.c
@@ -14,6 +14,7 @@
 #include "intel_display_regs.h"
 #include "intel_display_types.h"
 #include "intel_dp.h"
+#include "intel_dp_link_caps.h"
 #include "intel_dp_link_training.h"
 #include "intel_dp_mst.h"
 #include "intel_dp_test.h"
@@ -32,6 +33,7 @@ void intel_dp_test_compute_config(struct intel_dp *intel_dp,
 				  struct intel_crtc_state *pipe_config,
 				  struct link_config_limits *limits)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	struct intel_display *display = to_intel_display(intel_dp);
 
 	/* For DP Compliance we override the computed bpp for the pipe */
@@ -54,9 +56,8 @@ void intel_dp_test_compute_config(struct intel_dp *intel_dp,
 		 */
 		if (intel_dp_link_params_valid(intel_dp, intel_dp->compliance.test_link_rate,
 					       intel_dp->compliance.test_lane_count)) {
-			index = intel_dp_rate_index(intel_dp->common_rates,
-						    intel_dp->num_common_rates,
-						    intel_dp->compliance.test_link_rate);
+			index = intel_dp_link_caps_common_rate_idx(link_caps,
+								   intel_dp->compliance.test_link_rate);
 			if (index >= 0) {
 				limits->min_rate = intel_dp->compliance.test_link_rate;
 				limits->max_rate = intel_dp->compliance.test_link_rate;
-- 
2.49.1


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

* [PATCH v2 18/28] drm/i915/dp_link_caps: Move tracking of common rates to link_caps struct
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (16 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 17/28] drm/i915/dp_link_caps: Add helper to get common rate index Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-24  9:22   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 19/28] drm/i915/dp_link_caps: Track max common lane count in link_caps Imre Deak
                   ` (13 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Now that all users access the supported link rates via helpers, move
tracking of these rates from struct intel_dp to the link_caps state.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 .../drm/i915/display/intel_display_types.h    |  3 --
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 51 +++++++++++--------
 2 files changed, 29 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 443bb3b5e9fa3..dd43c7ee8f143 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1834,9 +1834,6 @@ struct intel_dp {
 	bool use_rate_select;
 	/* Max sink lane count as reported by DP_MAX_LANE_COUNT */
 	int max_sink_lane_count;
-	/* intersection of source and sink rates */
-	int num_common_rates;
-	int common_rates[DP_MAX_SUPPORTED_RATES];
 	int max_common_lane_count;
 	struct {
 		/* TODO: move the rest of link specific fields to here */
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 84d9636f4adb4..e28f7308283ce 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -22,6 +22,10 @@
 struct intel_dp_link_caps {
 	struct intel_dp *dp;
 
+	/* Rate, lane count caps common to source and sink. */
+	int num_rates;
+	int rates[DP_MAX_SUPPORTED_RATES];
+
 	/* common rate,lane_count configs in bw order */
 	int num_configs;
 #define INTEL_DP_MAX_LANE_COUNT			4
@@ -31,6 +35,7 @@ struct intel_dp_link_caps {
 #define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
 						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
 	struct intel_dp_link_config_entry {
+		/* index into rates[] */
 		u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
 		u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
 	} configs[INTEL_DP_MAX_LINK_CONFIGS];
@@ -46,50 +51,52 @@ struct intel_dp_link_caps {
 int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
 				   int max_rate)
 {
-	return intel_dp_rate_limit_len(intel_dp->common_rates,
-				       intel_dp->num_common_rates, max_rate);
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+
+	return intel_dp_rate_limit_len(link_caps->rates,
+				       link_caps->num_rates, max_rate);
 }
 
 int intel_dp_common_rate(struct intel_dp *intel_dp, int index)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	struct intel_display *display = to_intel_display(intel_dp);
 
 	if (drm_WARN_ON(display->drm,
-			index < 0 || index >= intel_dp->num_common_rates))
+			index < 0 || index >= link_caps->num_rates))
 		return 162000;
 
-	return intel_dp->common_rates[index];
+	return link_caps->rates[index];
 }
 
 int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, int rate)
 {
-	struct intel_dp *intel_dp = link_caps->dp;
-
-	return intel_dp_rate_index(intel_dp->common_rates,
-				   intel_dp->num_common_rates,
+	return intel_dp_rate_index(link_caps->rates,
+				   link_caps->num_rates,
 				   rate);
 }
 
 /* Theoretical max between source and sink */
 int intel_dp_max_common_rate(struct intel_dp *intel_dp)
 {
-	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+
+	return intel_dp_common_rate(intel_dp, link_caps->num_rates - 1);
 }
 
 int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps)
 {
-	return link_caps->dp->num_common_rates;
+	return link_caps->num_rates;
 }
 
 void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps)
 {
-	struct intel_dp *intel_dp = link_caps->dp;
-	struct intel_display *display = to_intel_display(intel_dp);
+	struct intel_display *display = to_intel_display(link_caps->dp);
 	DECLARE_SEQ_BUF(s, 128);
 	int i;
 
-	for (i = 0; i < intel_dp->num_common_rates; i++)
-		seq_buf_printf(&s, "%s%d", i ? ", " : "", intel_dp->common_rates[i]);
+	for (i = 0; i < link_caps->num_rates; i++)
+		seq_buf_printf(&s, "%s%d", i ? ", " : "", link_caps->rates[i]);
 
 	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
 }
@@ -175,7 +182,7 @@ bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
 	if (drm_WARN_ON(display->drm, !is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
 		return false;
 
-	if (drm_WARN_ON(display->drm, num_rates > ARRAY_SIZE(intel_dp->common_rates)))
+	if (drm_WARN_ON(display->drm, num_rates > ARRAY_SIZE(link_caps->rates)))
 		return false;
 
 	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
@@ -185,17 +192,17 @@ bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
 		return false;
 
 	/* TODO: Add a struct containing both rates and number of rates. */
-	static_assert(__same_type(rates[0], intel_dp->common_rates[0]));
-	if (num_rates != intel_dp->num_common_rates ||
-	    memcmp(rates, intel_dp->common_rates, num_rates * sizeof(rates[0])))
+	static_assert(__same_type(rates[0], link_caps->rates[0]));
+	if (num_rates != link_caps->num_rates ||
+	    memcmp(rates, link_caps->rates, num_rates * sizeof(rates[0])))
 		link_params_changed = true;
 
-	memcpy(intel_dp->common_rates, rates, num_rates * sizeof(rates[0]));
-	intel_dp->num_common_rates = num_rates;
+	memcpy(link_caps->rates, rates, num_rates * sizeof(rates[0]));
+	link_caps->num_rates = num_rates;
 	link_caps->num_configs = num_rates * num_common_lane_configs;
 
 	lc = &link_caps->configs[0];
-	for (i = 0; i < intel_dp->num_common_rates; i++) {
+	for (i = 0; i < link_caps->num_rates; i++) {
 		for (j = 0; j < num_common_lane_configs; j++) {
 			lc->lane_count_exp = j;
 			lc->link_rate_idx = i;
@@ -231,7 +238,7 @@ void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate
 int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count)
 {
 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
-	int link_rate_idx = intel_dp_rate_index(intel_dp->common_rates, intel_dp->num_common_rates,
+	int link_rate_idx = intel_dp_rate_index(link_caps->rates, link_caps->num_rates,
 						link_rate);
 	int lane_count_exp = ilog2(lane_count);
 	int i;
-- 
2.49.1


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

* [PATCH v2 19/28] drm/i915/dp_link_caps: Track max common lane count in link_caps
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (17 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 18/28] drm/i915/dp_link_caps: Move tracking of common rates to link_caps struct Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-24  9:46   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 20/28] drm/i915/dp_link_caps: Use max common lane count from link_caps Imre Deak
                   ` (12 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Pass the maximum common lane count to intel_dp_link_caps_update() and
track it together with the supported link rates. This prepares for
converting all users of intel_dp_max_common_lane_count() to query the
value from the link caps module instead.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c           | 14 +++++---------
 drivers/gpu/drm/i915/display/intel_dp_link_caps.c | 13 +++++++++----
 drivers/gpu/drm/i915/display/intel_dp_link_caps.h |  2 +-
 3 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 84640c8394534..2873b2df29f84 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -339,23 +339,19 @@ int intel_dp_max_source_lane_count(struct intel_digital_port *dig_port)
 
 /*
  * Theoretical max between source and sink.
- * Return %true if the max common lane count changed.
  */
-static bool intel_dp_set_max_common_lane_count(struct intel_dp *intel_dp)
+static int intel_dp_get_max_common_lane_count(struct intel_dp *intel_dp)
 {
 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 	int source_max = intel_dp_max_source_lane_count(dig_port);
 	int sink_max = intel_dp->max_sink_lane_count;
 	int lane_max = intel_tc_port_max_lane_count(dig_port);
 	int lttpr_max = drm_dp_lttpr_max_lane_count(intel_dp->lttpr_common_caps);
-	int old_max_common_lane_count = intel_dp->max_common_lane_count;
 
 	if (lttpr_max)
 		sink_max = min(sink_max, lttpr_max);
 
-	intel_dp->max_common_lane_count = min3(source_max, sink_max, lane_max);
-
-	return intel_dp->max_common_lane_count != old_max_common_lane_count;
+	return min3(source_max, sink_max, lane_max);
 }
 
 int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
@@ -705,12 +701,12 @@ static bool intel_dp_set_common_link_params(struct intel_dp *intel_dp)
 	int common_rates[DP_MAX_SUPPORTED_RATES];
 	bool params_changed = false;
 
-	if (intel_dp_set_max_common_lane_count(intel_dp))
-		params_changed = true;
+	intel_dp->max_common_lane_count = intel_dp_get_max_common_lane_count(intel_dp);
 
 	intel_dp_get_common_rates(intel_dp, common_rates, &num_common_rates);
 	if (intel_dp_link_caps_update(intel_dp,
-				      common_rates, num_common_rates))
+				      common_rates, num_common_rates,
+				      intel_dp_get_max_common_lane_count(intel_dp)))
 		params_changed = true;
 
 	return params_changed;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index e28f7308283ce..bb727bcf4de18 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -25,6 +25,7 @@ struct intel_dp_link_caps {
 	/* Rate, lane count caps common to source and sink. */
 	int num_rates;
 	int rates[DP_MAX_SUPPORTED_RATES];
+	int max_lane_count;
 
 	/* common rate,lane_count configs in bw order */
 	int num_configs;
@@ -169,7 +170,7 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
 
 /* Return %true if the supported link parameters have changed. */
 bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
-			       const int *rates, int num_rates)
+			       const int *rates, int num_rates, int max_lane_count)
 {
 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	struct intel_display *display = to_intel_display(intel_dp);
@@ -179,13 +180,13 @@ bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
 	int i;
 	int j;
 
-	if (drm_WARN_ON(display->drm, !is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
+	if (drm_WARN_ON(display->drm, !is_power_of_2(max_lane_count)))
 		return false;
 
 	if (drm_WARN_ON(display->drm, num_rates > ARRAY_SIZE(link_caps->rates)))
 		return false;
 
-	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
+	num_common_lane_configs = ilog2(max_lane_count) + 1;
 
 	if (drm_WARN_ON(display->drm, num_rates * num_common_lane_configs >
 				    ARRAY_SIZE(link_caps->configs)))
@@ -197,8 +198,13 @@ bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
 	    memcmp(rates, link_caps->rates, num_rates * sizeof(rates[0])))
 		link_params_changed = true;
 
+	if (max_lane_count != link_caps->max_lane_count)
+		link_params_changed = true;
+
 	memcpy(link_caps->rates, rates, num_rates * sizeof(rates[0]));
 	link_caps->num_rates = num_rates;
+	link_caps->max_lane_count = max_lane_count;
+
 	link_caps->num_configs = num_rates * num_common_lane_configs;
 
 	lc = &link_caps->configs[0];
@@ -216,7 +222,6 @@ bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
 	       link_config_cmp_by_bw, NULL,
 	       intel_dp);
 
-	/* TODO: Also detect a change in the max lane count. */
 	return link_params_changed;
 }
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 7d7d3d11ba3fe..e2f53eb167a8e 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -27,7 +27,7 @@ int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lan
 void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
 
 bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
-			       const int *rates, int num_rates);
+			       const int *rates, int num_rates, int max_lane_count);
 
 void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
 
-- 
2.49.1


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

* [PATCH v2 20/28] drm/i915/dp_link_caps: Use max common lane count from link_caps
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (18 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 19/28] drm/i915/dp_link_caps: Track max common lane count in link_caps Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-24 11:29   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 21/28] drm/i915/dp_link_caps: Add helpers to get max link limits Imre Deak
                   ` (11 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Convert all users of intel_dp_max_common_lane_count() to query the
maximum common lane count via the link capability API, in common with
the link rate queries.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_types.h | 1 -
 drivers/gpu/drm/i915/display/intel_dp.c            | 9 +--------
 drivers/gpu/drm/i915/display/intel_dp.h            | 1 -
 drivers/gpu/drm/i915/display/intel_dp_link_caps.c  | 7 ++++++-
 drivers/gpu/drm/i915/display/intel_dp_link_caps.h  | 1 +
 drivers/gpu/drm/i915/display/intel_dp_tunnel.c     | 3 ++-
 6 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index dd43c7ee8f143..19c66b3a81509 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1834,7 +1834,6 @@ struct intel_dp {
 	bool use_rate_select;
 	/* Max sink lane count as reported by DP_MAX_LANE_COUNT */
 	int max_sink_lane_count;
-	int max_common_lane_count;
 	struct {
 		/* TODO: move the rest of link specific fields to here */
 		bool active;
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 2873b2df29f84..0d7ec7a8898c9 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -354,11 +354,6 @@ static int intel_dp_get_max_common_lane_count(struct intel_dp *intel_dp)
 	return min3(source_max, sink_max, lane_max);
 }
 
-int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
-{
-	return intel_dp->max_common_lane_count;
-}
-
 int intel_dp_max_lane_count(struct intel_dp *intel_dp)
 {
 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
@@ -701,8 +696,6 @@ static bool intel_dp_set_common_link_params(struct intel_dp *intel_dp)
 	int common_rates[DP_MAX_SUPPORTED_RATES];
 	bool params_changed = false;
 
-	intel_dp->max_common_lane_count = intel_dp_get_max_common_lane_count(intel_dp);
-
 	intel_dp_get_common_rates(intel_dp, common_rates, &num_common_rates);
 	if (intel_dp_link_caps_update(intel_dp,
 				      common_rates, num_common_rates,
@@ -3613,7 +3606,7 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp,
 
 void intel_dp_reset_link_params(struct intel_dp *intel_dp)
 {
-	intel_dp->link.max_lane_count = intel_dp_max_common_lane_count(intel_dp);
+	intel_dp->link.max_lane_count = intel_dp_link_caps_max_common_lane_count(intel_dp->link.caps);
 	intel_dp->link.max_rate = intel_dp_max_common_rate(intel_dp);
 	intel_dp->link.mst_probed_lane_count = 0;
 	intel_dp->link.mst_probed_rate = 0;
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
index fdf9bd88859e7..f776bec7c4254 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -106,7 +106,6 @@ int intel_dp_max_link_rate(struct intel_dp *intel_dp);
 int intel_dp_max_lane_count(struct intel_dp *intel_dp);
 int intel_dp_config_required_rate(const struct intel_crtc_state *crtc_state);
 int intel_dp_rate_select(struct intel_dp *intel_dp, int rate);
-int intel_dp_max_common_lane_count(struct intel_dp *intel_dp);
 int intel_dp_rate_index(const int *rates, int len, int rate);
 void intel_dp_update_sink_caps(struct intel_dp *intel_dp);
 void intel_dp_reset_link_params(struct intel_dp *intel_dp);
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index bb727bcf4de18..b227c9a55f63b 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -102,6 +102,11 @@ void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps)
 	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
 }
 
+int intel_dp_link_caps_max_common_lane_count(struct intel_dp_link_caps *link_caps)
+{
+	return link_caps->max_lane_count;
+}
+
 static int forced_lane_count(struct intel_dp *intel_dp)
 {
 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
@@ -110,7 +115,7 @@ static int forced_lane_count(struct intel_dp *intel_dp)
 		return 0;
 
 	return clamp(link_caps->forced_params.lane_count,
-		     1, intel_dp_max_common_lane_count(intel_dp));
+		     1, intel_dp_link_caps_max_common_lane_count(link_caps));
 }
 
 static int forced_link_rate(struct intel_dp *intel_dp)
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index e2f53eb167a8e..9218cb5de2c71 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -17,6 +17,7 @@ int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
 int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, int rate);
 int intel_dp_max_common_rate(struct intel_dp *intel_dp);
 int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps);
+int intel_dp_link_caps_max_common_lane_count(struct intel_dp_link_caps *link_caps);
 
 void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps);
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
index c82adfcce01d0..9d9d8d04742bc 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
@@ -57,8 +57,9 @@ static int kbytes_to_mbits(int kbytes)
 
 static int get_current_link_bw(struct intel_dp *intel_dp)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	int rate = intel_dp_max_common_rate(intel_dp);
-	int lane_count = intel_dp_max_common_lane_count(intel_dp);
+	int lane_count = intel_dp_link_caps_max_common_lane_count(link_caps);
 
 	return intel_dp_max_link_data_rate(intel_dp, rate, lane_count);
 }
-- 
2.49.1


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

* [PATCH v2 21/28] drm/i915/dp_link_caps: Add helpers to get max link limits
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (19 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 20/28] drm/i915/dp_link_caps: Use max common lane count from link_caps Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-24 12:44   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 22/28] drm/i915/dp_link_caps: Add helpers to set " Imre Deak
                   ` (10 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Add intel_dp_link_caps_get_max_limits() to query the current maximum
link limits (max bound over all allowed configurations) through the
link caps API instead of direct accesses.

This allows tracking the state internally within the link caps module.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c       |  8 +++-
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 38 ++++++++++++++++++-
 .../gpu/drm/i915/display/intel_dp_link_caps.h |  3 ++
 .../drm/i915/display/intel_dp_link_training.c |  8 +++-
 4 files changed, 51 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 0d7ec7a8898c9..3b3c31122452d 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -357,15 +357,17 @@ static int intel_dp_get_max_common_lane_count(struct intel_dp *intel_dp)
 int intel_dp_max_lane_count(struct intel_dp *intel_dp)
 {
 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+	struct intel_dp_link_config max_link_limits;
 	struct intel_dp_link_config forced_params;
 	int lane_count;
 
+	intel_dp_link_caps_get_max_limits(link_caps, &max_link_limits);
 	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
 
 	if (forced_params.lane_count)
 		lane_count = forced_params.lane_count;
 	else
-		lane_count = intel_dp->link.max_lane_count;
+		lane_count = max_link_limits.lane_count;
 
 	switch (lane_count) {
 	case 1:
@@ -1539,6 +1541,7 @@ int
 intel_dp_max_link_rate(struct intel_dp *intel_dp)
 {
 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+	struct intel_dp_link_config max_link_limits;
 	struct intel_dp_link_config forced_params;
 	int len;
 
@@ -1547,7 +1550,8 @@ intel_dp_max_link_rate(struct intel_dp *intel_dp)
 	if (forced_params.rate)
 		return forced_params.rate;
 
-	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.max_rate);
+	intel_dp_link_caps_get_max_limits(link_caps, &max_link_limits);
+	len = intel_dp_common_len_rate_limit(intel_dp, max_link_limits.rate);
 
 	return intel_dp_common_rate(intel_dp, len - 1);
 }
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index b227c9a55f63b..fa7dabc94ddf1 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -151,6 +151,36 @@ static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_ent
 	return 1 << lc->lane_count_exp;
 }
 
+/**
+ * intel_dp_link_caps_get_max_limits - get the current maximum link limits
+ * @link_caps: link capabilities state
+ * @max_link_limits: returned maximum link limits
+ *
+ * Return the current maximum rate and lane count limits in
+ * @max_link_limits.
+ *
+ * These limits constrain the set of allowed configurations.
+ *
+ * The limits are set to the maximum common supported values after
+ * intel_dp_link_caps_reset() is called, and can later be modified by
+ * intel_dp_link_caps_set_max_limits(). The max rate and lane count
+ * parameters are independent limits, so the pair does not necessarily
+ * define a valid configuration.
+ *
+ * This function may be called without serializing against updates to
+ * @link_caps. However, without such serialization the returned value may be
+ * an out-of-sync (link rate, lane count) tuple, i.e. the parameters may
+ * belong to different update snapshots in time.
+ */
+void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
+				       struct intel_dp_link_config *max_link_limits)
+{
+	struct intel_dp *intel_dp = link_caps->dp;
+
+	max_link_limits->rate = intel_dp->link.max_rate;
+	max_link_limits->lane_count = intel_dp->link.max_lane_count;
+}
+
 static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
 				   const struct intel_dp_link_config_entry *lc)
 {
@@ -482,6 +512,7 @@ static int i915_dp_max_link_rate_show(void *data, u64 *val)
 	struct intel_connector *connector = to_intel_connector(data);
 	struct intel_display *display = to_intel_display(connector);
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	struct intel_dp_link_config max_link_limits;
 	int err;
 
 	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
@@ -490,7 +521,8 @@ static int i915_dp_max_link_rate_show(void *data, u64 *val)
 
 	intel_dp_flush_connector_commits(connector);
 
-	*val = intel_dp->link.max_rate;
+	intel_dp_link_caps_get_max_limits(intel_dp->link.caps, &max_link_limits);
+	*val = max_link_limits.rate;
 
 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
 
@@ -503,6 +535,7 @@ static int i915_dp_max_lane_count_show(void *data, u64 *val)
 	struct intel_connector *connector = to_intel_connector(data);
 	struct intel_display *display = to_intel_display(connector);
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
+	struct intel_dp_link_config max_link_limits;
 	int err;
 
 	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
@@ -511,7 +544,8 @@ static int i915_dp_max_lane_count_show(void *data, u64 *val)
 
 	intel_dp_flush_connector_commits(connector);
 
-	*val = intel_dp->link.max_lane_count;
+	intel_dp_link_caps_get_max_limits(intel_dp->link.caps, &max_link_limits);
+	*val = max_link_limits.lane_count;
 
 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 9218cb5de2c71..376dbd9bd5aba 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -27,6 +27,9 @@ void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
 int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
 void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
 
+void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
+				       struct intel_dp_link_config *max_link_limits);
+
 bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
 			       const int *rates, int num_rates, int max_lane_count);
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
index ec9bd9b4c800b..7145f2d0ad6d3 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
@@ -2389,6 +2389,8 @@ void intel_dp_128b132b_sdp_crc16(struct intel_dp *intel_dp,
 bool intel_dp_link_params_valid(struct intel_dp *intel_dp, int link_rate,
 				u8 lane_count)
 {
+	struct intel_dp_link_config max_link_limits;
+
 	/*
 	 * FIXME: we need to synchronize the current link parameters with
 	 * hardware readout. Currently fast link training doesn't work on
@@ -2411,12 +2413,14 @@ bool intel_dp_link_params_valid(struct intel_dp *intel_dp, int link_rate,
 	 * configuration. Although that happens to be true for now, it will
 	 * stop being guaranteed once fallback depends only on disabled configs.
 	 */
+	intel_dp_link_caps_get_max_limits(intel_dp->link.caps, &max_link_limits);
+
 	if (link_rate == 0 ||
-	    link_rate > intel_dp->link.max_rate)
+	    link_rate > max_link_limits.rate)
 		return false;
 
 	if (lane_count == 0 ||
-	    lane_count > intel_dp_max_lane_count(intel_dp))
+	    lane_count > max_link_limits.lane_count)
 		return false;
 
 	return true;
-- 
2.49.1


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

* [PATCH v2 22/28] drm/i915/dp_link_caps: Add helpers to set max link limits
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (20 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 21/28] drm/i915/dp_link_caps: Add helpers to get max link limits Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-24 12:47   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 23/28] drm/i915/dp_link_caps: Add helper to reset " Imre Deak
                   ` (9 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Add intel_dp_link_caps_set_max_limits() to set the current maximum link
limits (max bound over all allowed configurations) through the link caps
API instead of direct accesses.

This allows tracking the state internally within the link caps module.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 35 +++++++++++++++++++
 .../gpu/drm/i915/display/intel_dp_link_caps.h |  2 ++
 .../drm/i915/display/intel_dp_link_training.c |  9 +++--
 3 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index fa7dabc94ddf1..e568f00720d31 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -151,6 +151,15 @@ static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_ent
 	return 1 << lc->lane_count_exp;
 }
 
+static void set_max_link_limits_no_update(struct intel_dp_link_caps *link_caps,
+					  const struct intel_dp_link_config *max_link_limits)
+{
+	struct intel_dp *intel_dp = link_caps->dp;
+
+	intel_dp->link.max_rate = max_link_limits->rate;
+	intel_dp->link.max_lane_count = max_link_limits->lane_count;
+}
+
 /**
  * intel_dp_link_caps_get_max_limits - get the current maximum link limits
  * @link_caps: link capabilities state
@@ -181,6 +190,32 @@ void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
 	max_link_limits->lane_count = intel_dp->link.max_lane_count;
 }
 
+/**
+ * intel_dp_link_caps_set_max_limits - set the current maximum link limits
+ * @link_caps: link capabilities state
+ * @max_link_limits: new maximum link limits
+ *
+ * Set the current maximum rate and lane count limits to @max_link_limits,
+ * constraining the set of allowed configurations.
+ *
+ * Unlike intel_dp_link_caps_get_max_limits(), the caller must serialize
+ * this call against concurrent queries and updates to @link_caps, in line
+ * with the rest of the API.
+ *
+ * Return:
+ * - %true  if the @link_caps cached max limits value got updated with
+ *          @max_link_limits.
+ * - %false if @max_link_limits is invalid.
+ */
+bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
+				       const struct intel_dp_link_config *max_link_limits)
+{
+	set_max_link_limits_no_update(link_caps, max_link_limits);
+
+	/* TODO: validate max_link_limits */
+	return true;
+}
+
 static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
 				   const struct intel_dp_link_config_entry *lc)
 {
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 376dbd9bd5aba..c6c60b7888874 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -29,6 +29,8 @@ void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate
 
 void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
 				       struct intel_dp_link_config *max_link_limits);
+bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
+				       const struct intel_dp_link_config *max_link_limits);
 
 bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
 			       const int *rates, int num_rates, int max_lane_count);
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
index 7145f2d0ad6d3..9d9911ebad439 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
@@ -1958,6 +1958,8 @@ static bool reduce_link_params(struct intel_dp *intel_dp, const struct intel_crt
 static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
 						   const struct intel_crtc_state *crtc_state)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+	struct intel_dp_link_config max_link_limits;
 	int new_link_rate;
 	int new_lane_count;
 
@@ -1983,8 +1985,11 @@ static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
 	       crtc_state->lane_count, crtc_state->port_clock,
 	       new_lane_count, new_link_rate);
 
-	intel_dp->link.max_rate = new_link_rate;
-	intel_dp->link.max_lane_count = new_lane_count;
+	max_link_limits.rate = new_link_rate;
+	max_link_limits.lane_count = new_lane_count;
+
+	/* TODO: handle an update failure */
+	intel_dp_link_caps_set_max_limits(link_caps, &max_link_limits);
 
 	return 0;
 }
-- 
2.49.1


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

* [PATCH v2 23/28] drm/i915/dp_link_caps: Add helper to reset max link limits
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (21 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 22/28] drm/i915/dp_link_caps: Add helpers to set " Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-24 12:49   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 24/28] drm/i915/dp_link_caps: Add helper to reset link_caps state Imre Deak
                   ` (8 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Add a helper to reset the link_caps::max_limits max link limits to the
maximum common supported rate and lane count.

This is needed by a follow-up change in the link training fallback code,
which temporarily resets max_limits before searching for a fallback
configuration.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 22 +++++++++++++++++++
 .../gpu/drm/i915/display/intel_dp_link_caps.h |  1 +
 2 files changed, 23 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index e568f00720d31..ae10200bdd934 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -160,6 +160,16 @@ static void set_max_link_limits_no_update(struct intel_dp_link_caps *link_caps,
 	intel_dp->link.max_lane_count = max_link_limits->lane_count;
 }
 
+static void reset_max_link_limits_no_update(struct intel_dp_link_caps *link_caps)
+{
+	struct intel_dp_link_config max_link_limits = {
+		.rate = intel_dp_max_common_rate(link_caps->dp),
+		.lane_count = intel_dp_link_caps_max_common_lane_count(link_caps),
+	};
+
+	set_max_link_limits_no_update(link_caps, &max_link_limits);
+}
+
 /**
  * intel_dp_link_caps_get_max_limits - get the current maximum link limits
  * @link_caps: link capabilities state
@@ -216,6 +226,18 @@ bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
 	return true;
 }
 
+/**
+ * intel_dp_link_caps_reset_max_limits - reset the current maximum link limits
+ * @link_caps: link capabilities state
+ *
+ * Reset the current maximum link limits to the maximum supported common link
+ * rate and lane count.
+ */
+void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps)
+{
+	reset_max_link_limits_no_update(link_caps);
+}
+
 static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
 				   const struct intel_dp_link_config_entry *lc)
 {
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index c6c60b7888874..7baeb4359d2d4 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -31,6 +31,7 @@ void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
 				       struct intel_dp_link_config *max_link_limits);
 bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
 				       const struct intel_dp_link_config *max_link_limits);
+void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps);
 
 bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
 			       const int *rates, int num_rates, int max_lane_count);
-- 
2.49.1


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

* [PATCH v2 24/28] drm/i915/dp_link_caps: Add helper to reset link_caps state
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (22 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 23/28] drm/i915/dp_link_caps: Add helper to reset " Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-24 12:55   ` Kahola, Mika
  2026-06-16 20:08 ` [PATCH v2 25/28] drm/i915/dp_link_caps: Move max link limits to link_caps Imre Deak
                   ` (7 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Add a helper to reset the link_caps state, removing all restrictions
except user-forced parameters, re-allowing all supported
configurations. Currently this only resets the maximum link limits,
but follow-up changes will also re-enable configurations previously
disabled on a per-configuration basis by fallback or other logic.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c        |  3 +--
 .../gpu/drm/i915/display/intel_dp_link_caps.c  | 18 ++++++++++++++++++
 .../gpu/drm/i915/display/intel_dp_link_caps.h  |  1 +
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 3b3c31122452d..b63c6f047f83a 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -3610,8 +3610,7 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp,
 
 void intel_dp_reset_link_params(struct intel_dp *intel_dp)
 {
-	intel_dp->link.max_lane_count = intel_dp_link_caps_max_common_lane_count(intel_dp->link.caps);
-	intel_dp->link.max_rate = intel_dp_max_common_rate(intel_dp);
+	intel_dp_link_caps_reset(intel_dp->link.caps);
 	intel_dp->link.mst_probed_lane_count = 0;
 	intel_dp->link.mst_probed_rate = 0;
 	intel_dp_link_training_reset(intel_dp->link.training);
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index ae10200bdd934..9b7da5a64ee25 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -351,6 +351,24 @@ int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lan
 	return -1;
 }
 
+/**
+ * intel_dp_link_caps_reset - reset link capability restrictions
+ * @link_caps: link capabilities state
+ *
+ * Reset all current restrictions except for the user requested forced
+ * parameters, thus updating the set of allowed configurations and the
+ * derived maximum link information accordingly.
+ *
+ * This function is regularly called after a sink is connected, either
+ * for the first time to the connector or after a previous sink was
+ * disconnected from it, and intel_dp_link_caps_update() was called.
+ */
+void intel_dp_link_caps_reset(struct intel_dp_link_caps *link_caps)
+{
+	/* TODO: Update the maximum link information. */
+	reset_max_link_limits_no_update(link_caps);
+}
+
 static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
 {
 	struct intel_connector *connector = to_intel_connector(m->private);
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 7baeb4359d2d4..fa45a46723059 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -35,6 +35,7 @@ void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps);
 
 bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
 			       const int *rates, int num_rates, int max_lane_count);
+void intel_dp_link_caps_reset(struct intel_dp_link_caps *link_caps);
 
 void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
 
-- 
2.49.1


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

* [PATCH v2 25/28] drm/i915/dp_link_caps: Move max link limits to link_caps
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (23 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 24/28] drm/i915/dp_link_caps: Add helper to reset link_caps state Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23  5:34   ` Garg, Nemesa
  2026-06-16 20:08 ` [PATCH v2 26/28] drm/i915/dp_link_caps: Pass link_caps to static functions Imre Deak
                   ` (6 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Now that all users access the max link limits via helpers, move tracking
of these limits from struct intel_dp to the link_caps state.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 .../drm/i915/display/intel_display_types.h    |  4 ----
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 21 ++++++++++++-------
 2 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 19c66b3a81509..8f9c8309b33e6 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1837,10 +1837,6 @@ struct intel_dp {
 	struct {
 		/* TODO: move the rest of link specific fields to here */
 		bool active;
-		/* Max lane count for the current link */
-		int max_lane_count;
-		/* Max rate for the current link */
-		int max_rate;
 		/*
 		 * Link parameters for which the MST topology was probed.
 		 * Tracking these ensures that the MST path resources are
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 9b7da5a64ee25..43427e7cf422a 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -46,6 +46,17 @@ struct intel_dp_link_caps {
 	 * disconnects.
 	 */
 	struct intel_dp_link_config forced_params;
+
+	/*
+	 * User set maximum limits. These limits constrain the currently
+	 * allowed set of configurations and are not adjusted when sink
+	 * capabilities change.
+	 *
+	 * max_limits.rate/lane_count may come from different allowed
+	 * configurations, i.e. the (max_limits.rate, max_limits.lane_count)
+	 * tuple itself may not be an allowed configuration.
+	 */
+	struct intel_dp_link_config max_limits;
 };
 
 /* Get length of common rates array potentially limited by max_rate. */
@@ -154,10 +165,7 @@ static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_ent
 static void set_max_link_limits_no_update(struct intel_dp_link_caps *link_caps,
 					  const struct intel_dp_link_config *max_link_limits)
 {
-	struct intel_dp *intel_dp = link_caps->dp;
-
-	intel_dp->link.max_rate = max_link_limits->rate;
-	intel_dp->link.max_lane_count = max_link_limits->lane_count;
+	link_caps->max_limits = *max_link_limits;
 }
 
 static void reset_max_link_limits_no_update(struct intel_dp_link_caps *link_caps)
@@ -194,10 +202,7 @@ static void reset_max_link_limits_no_update(struct intel_dp_link_caps *link_caps
 void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
 				       struct intel_dp_link_config *max_link_limits)
 {
-	struct intel_dp *intel_dp = link_caps->dp;
-
-	max_link_limits->rate = intel_dp->link.max_rate;
-	max_link_limits->lane_count = intel_dp->link.max_lane_count;
+	*max_link_limits = link_caps->max_limits;
 }
 
 /**
-- 
2.49.1


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

* [PATCH v2 26/28] drm/i915/dp_link_caps: Pass link_caps to static functions
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (24 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 25/28] drm/i915/dp_link_caps: Move max link limits to link_caps Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23  5:29   ` Garg, Nemesa
  2026-06-16 20:08 ` [PATCH v2 27/28] drm/i915/dp_link_caps: Pass link_caps to config update/lookup helpers Imre Deak
                   ` (5 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Pass the link_caps pointer to static functions in intel_dp_link_caps.c,
as it holds the state with the relevant information.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 37 ++++++++++---------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index 43427e7cf422a..fc1061149ef2e 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -118,10 +118,8 @@ int intel_dp_link_caps_max_common_lane_count(struct intel_dp_link_caps *link_cap
 	return link_caps->max_lane_count;
 }
 
-static int forced_lane_count(struct intel_dp *intel_dp)
+static int forced_lane_count(struct intel_dp_link_caps *link_caps)
 {
-	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
-
 	if (!link_caps->forced_params.lane_count)
 		return 0;
 
@@ -129,9 +127,9 @@ static int forced_lane_count(struct intel_dp *intel_dp)
 		     1, intel_dp_link_caps_max_common_lane_count(link_caps));
 }
 
-static int forced_link_rate(struct intel_dp *intel_dp)
+static int forced_link_rate(struct intel_dp_link_caps *link_caps)
 {
-	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+	struct intel_dp *intel_dp = link_caps->dp;
 	int len;
 
 	if (!link_caps->forced_params.rate)
@@ -147,14 +145,14 @@ static int forced_link_rate(struct intel_dp *intel_dp)
 void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
 					  struct intel_dp_link_config *forced_params)
 {
-	forced_params->rate = forced_link_rate(link_caps->dp);
-	forced_params->lane_count = forced_lane_count(link_caps->dp);
+	forced_params->rate = forced_link_rate(link_caps);
+	forced_params->lane_count = forced_lane_count(link_caps);
 }
 
-static int intel_dp_link_config_rate(struct intel_dp *intel_dp,
+static int intel_dp_link_config_rate(struct intel_dp_link_caps *link_caps,
 				     const struct intel_dp_link_config_entry *lc)
 {
-	return intel_dp_common_rate(intel_dp, lc->link_rate_idx);
+	return intel_dp_common_rate(link_caps->dp, lc->link_rate_idx);
 }
 
 static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lc)
@@ -243,26 +241,28 @@ void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps)
 	reset_max_link_limits_no_update(link_caps);
 }
 
-static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
+static int intel_dp_link_config_bw(struct intel_dp_link_caps *link_caps,
 				   const struct intel_dp_link_config_entry *lc)
 {
-	return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(intel_dp, lc),
+	return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(link_caps, lc),
 					 intel_dp_link_config_lane_count(lc));
 }
 
 static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
 {
 	struct intel_dp *intel_dp = (struct intel_dp *)p;	/* remove const */
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+
 	const struct intel_dp_link_config_entry *lc_a = a;
 	const struct intel_dp_link_config_entry *lc_b = b;
-	int bw_a = intel_dp_link_config_bw(intel_dp, lc_a);
-	int bw_b = intel_dp_link_config_bw(intel_dp, lc_b);
+	int bw_a = intel_dp_link_config_bw(link_caps, lc_a);
+	int bw_b = intel_dp_link_config_bw(link_caps, lc_b);
 
 	if (bw_a != bw_b)
 		return bw_a - bw_b;
 
-	return intel_dp_link_config_rate(intel_dp, lc_a) -
-	       intel_dp_link_config_rate(intel_dp, lc_b);
+	return intel_dp_link_config_rate(link_caps, lc_a) -
+	       intel_dp_link_config_rate(link_caps, lc_b);
 }
 
 /* Return %true if the supported link parameters have changed. */
@@ -333,7 +333,7 @@ void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate
 
 	lc = &link_caps->configs[idx];
 
-	*link_rate = intel_dp_link_config_rate(intel_dp, lc);
+	*link_rate = intel_dp_link_config_rate(link_caps, lc);
 	*lane_count = intel_dp_link_config_lane_count(lc);
 }
 
@@ -414,8 +414,9 @@ static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
 	return 0;
 }
 
-static int parse_link_rate(struct intel_dp *intel_dp, const char __user *ubuf, size_t len)
+static int parse_link_rate(struct intel_dp_link_caps *link_caps, const char __user *ubuf, size_t len)
 {
+	struct intel_dp *intel_dp = link_caps->dp;
 	char *kbuf;
 	const char *p;
 	int rate;
@@ -458,7 +459,7 @@ static ssize_t i915_dp_force_link_rate_write(struct file *file,
 	int rate;
 	int err;
 
-	rate = parse_link_rate(intel_dp, ubuf, len);
+	rate = parse_link_rate(link_caps, ubuf, len);
 	if (rate < 0)
 		return rate;
 
-- 
2.49.1


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

* [PATCH v2 27/28] drm/i915/dp_link_caps: Pass link_caps to config update/lookup helpers
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (25 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 26/28] drm/i915/dp_link_caps: Pass link_caps to static functions Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23  5:25   ` Garg, Nemesa
  2026-06-16 20:08 ` [PATCH v2 28/28] drm/i915/dp_link_caps: Pass link_caps to common rate helpers Imre Deak
                   ` (4 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Pass the link_caps pointer to the update/lookup helpers in
intel_dp_link_caps.c, as it holds the state with the relevant
information.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c            |  2 +-
 drivers/gpu/drm/i915/display/intel_dp_link_caps.c  | 14 +++++++-------
 drivers/gpu/drm/i915/display/intel_dp_link_caps.h  |  8 +++++---
 .../gpu/drm/i915/display/intel_dp_link_training.c  |  5 +++--
 4 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index b63c6f047f83a..07266f4e6835b 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -699,7 +699,7 @@ static bool intel_dp_set_common_link_params(struct intel_dp *intel_dp)
 	bool params_changed = false;
 
 	intel_dp_get_common_rates(intel_dp, common_rates, &num_common_rates);
-	if (intel_dp_link_caps_update(intel_dp,
+	if (intel_dp_link_caps_update(intel_dp->link.caps,
 				      common_rates, num_common_rates,
 				      intel_dp_get_max_common_lane_count(intel_dp)))
 		params_changed = true;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index fc1061149ef2e..c5701f02fbf69 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -266,10 +266,10 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
 }
 
 /* Return %true if the supported link parameters have changed. */
-bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
+bool intel_dp_link_caps_update(struct intel_dp_link_caps *link_caps,
 			       const int *rates, int num_rates, int max_lane_count)
 {
-	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
+	struct intel_dp *intel_dp = link_caps->dp;
 	struct intel_display *display = to_intel_display(intel_dp);
 	struct intel_dp_link_config_entry *lc;
 	bool link_params_changed = false;
@@ -322,10 +322,10 @@ bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
 	return link_params_changed;
 }
 
-void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
+void intel_dp_link_config_get(struct intel_dp_link_caps *link_caps,
+			      int idx, int *link_rate, int *lane_count)
 {
-	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
-	struct intel_display *display = to_intel_display(intel_dp);
+	struct intel_display *display = to_intel_display(link_caps->dp);
 	const struct intel_dp_link_config_entry *lc;
 
 	if (drm_WARN_ON(display->drm, idx < 0 || idx >= link_caps->num_configs))
@@ -337,9 +337,9 @@ void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate
 	*lane_count = intel_dp_link_config_lane_count(lc);
 }
 
-int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count)
+int intel_dp_link_config_index(struct intel_dp_link_caps *link_caps,
+			       int link_rate, int lane_count)
 {
-	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	int link_rate_idx = intel_dp_rate_index(link_caps->rates, link_caps->num_rates,
 						link_rate);
 	int lane_count_exp = ilog2(lane_count);
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index fa45a46723059..9256f02fed11e 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -24,8 +24,10 @@ void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps)
 void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
 					  struct intel_dp_link_config *forced_params);
 
-int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
-void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
+int intel_dp_link_config_index(struct intel_dp_link_caps *link_caps,
+			       int link_rate, int lane_count);
+void intel_dp_link_config_get(struct intel_dp_link_caps *link_caps,
+			      int idx, int *link_rate, int *lane_count);
 
 void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
 				       struct intel_dp_link_config *max_link_limits);
@@ -33,7 +35,7 @@ bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
 				       const struct intel_dp_link_config *max_link_limits);
 void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps);
 
-bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
+bool intel_dp_link_caps_update(struct intel_dp_link_caps *link_caps,
 			       const int *rates, int num_rates, int max_lane_count);
 void intel_dp_link_caps_reset(struct intel_dp_link_caps *link_caps);
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
index 9d9911ebad439..0d4a0bf1dac53 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
@@ -1858,9 +1858,10 @@ static bool reduce_link_params_in_bw_order(struct intel_dp *intel_dp,
 
 	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
 
-	i = intel_dp_link_config_index(intel_dp, crtc_state->port_clock, crtc_state->lane_count);
+	i = intel_dp_link_config_index(intel_dp->link.caps,
+				       crtc_state->port_clock, crtc_state->lane_count);
 	for (i--; i >= 0; i--) {
-		intel_dp_link_config_get(intel_dp, i, &link_rate, &lane_count);
+		intel_dp_link_config_get(intel_dp->link.caps, i, &link_rate, &lane_count);
 
 		if ((forced_params.rate &&
 		     forced_params.rate != link_rate) ||
-- 
2.49.1


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

* [PATCH v2 28/28] drm/i915/dp_link_caps: Pass link_caps to common rate helpers
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (26 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 27/28] drm/i915/dp_link_caps: Pass link_caps to config update/lookup helpers Imre Deak
@ 2026-06-16 20:08 ` Imre Deak
  2026-06-23  5:39   ` Garg, Nemesa
  2026-06-16 20:20 ` ✗ CI.checkpatch: warning for drm/i915/dp_link: Refactor DP link capability logic part1 Patchwork
                   ` (3 subsequent siblings)
  31 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-16 20:08 UTC (permalink / raw)
  To: intel-gfx, intel-xe

Pass the link_caps pointer to the common rate helpers in
intel_dp_link_caps.c, as it holds the state with the relevant
information.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c       | 13 ++++++----
 .../gpu/drm/i915/display/intel_dp_link_caps.c | 26 +++++++------------
 .../gpu/drm/i915/display/intel_dp_link_caps.h |  6 ++---
 .../drm/i915/display/intel_dp_link_training.c |  5 ++--
 .../gpu/drm/i915/display/intel_dp_tunnel.c    |  2 +-
 5 files changed, 25 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 07266f4e6835b..66346b74b2c04 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1551,14 +1551,15 @@ intel_dp_max_link_rate(struct intel_dp *intel_dp)
 		return forced_params.rate;
 
 	intel_dp_link_caps_get_max_limits(link_caps, &max_link_limits);
-	len = intel_dp_common_len_rate_limit(intel_dp, max_link_limits.rate);
+	len = intel_dp_common_len_rate_limit(link_caps, max_link_limits.rate);
 
-	return intel_dp_common_rate(intel_dp, len - 1);
+	return intel_dp_common_rate(link_caps, len - 1);
 }
 
 static int
 intel_dp_min_link_rate(struct intel_dp *intel_dp)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	struct intel_dp_link_config forced_params;
 
 	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
@@ -1566,7 +1567,7 @@ intel_dp_min_link_rate(struct intel_dp *intel_dp)
 	if (forced_params.rate)
 		return forced_params.rate;
 
-	return intel_dp_common_rate(intel_dp, 0);
+	return intel_dp_common_rate(link_caps, 0);
 }
 
 int intel_dp_rate_select(struct intel_dp *intel_dp, int rate)
@@ -1750,6 +1751,7 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
 				  const struct drm_connector_state *conn_state,
 				  const struct link_config_limits *limits)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	int bpp, i, lane_count, clock = intel_dp_mode_clock(pipe_config, conn_state);
 	int link_rate, link_avail;
 
@@ -1760,7 +1762,7 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
 			intel_dp_output_format_link_bpp_x16(pipe_config->output_format, bpp);
 
 		for (i = 0; i < intel_dp_link_caps_num_common_rates(intel_dp->link.caps); i++) {
-			link_rate = intel_dp_common_rate(intel_dp, i);
+			link_rate = intel_dp_common_rate(link_caps, i);
 			if (link_rate < limits->min_rate ||
 			    link_rate > limits->max_rate)
 				continue;
@@ -1984,12 +1986,13 @@ static int dsc_compute_link_config(struct intel_dp *intel_dp,
 				   const struct link_config_limits *limits,
 				   int dsc_bpp_x16)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
 	int link_rate, lane_count;
 	int i;
 
 	for (i = 0; i < intel_dp_link_caps_num_common_rates(intel_dp->link.caps); i++) {
-		link_rate = intel_dp_common_rate(intel_dp, i);
+		link_rate = intel_dp_common_rate(link_caps, i);
 		if (link_rate < limits->min_rate || link_rate > limits->max_rate)
 			continue;
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
index c5701f02fbf69..0917e7f51a26d 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
@@ -60,19 +60,16 @@ struct intel_dp_link_caps {
 };
 
 /* Get length of common rates array potentially limited by max_rate. */
-int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
+int intel_dp_common_len_rate_limit(struct intel_dp_link_caps *link_caps,
 				   int max_rate)
 {
-	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
-
 	return intel_dp_rate_limit_len(link_caps->rates,
 				       link_caps->num_rates, max_rate);
 }
 
-int intel_dp_common_rate(struct intel_dp *intel_dp, int index)
+int intel_dp_common_rate(struct intel_dp_link_caps *link_caps, int index)
 {
-	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
-	struct intel_display *display = to_intel_display(intel_dp);
+	struct intel_display *display = to_intel_display(link_caps->dp);
 
 	if (drm_WARN_ON(display->drm,
 			index < 0 || index >= link_caps->num_rates))
@@ -89,11 +86,9 @@ int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, int
 }
 
 /* Theoretical max between source and sink */
-int intel_dp_max_common_rate(struct intel_dp *intel_dp)
+int intel_dp_max_common_rate(struct intel_dp_link_caps *link_caps)
 {
-	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
-
-	return intel_dp_common_rate(intel_dp, link_caps->num_rates - 1);
+	return intel_dp_common_rate(link_caps, link_caps->num_rates - 1);
 }
 
 int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps)
@@ -129,17 +124,16 @@ static int forced_lane_count(struct intel_dp_link_caps *link_caps)
 
 static int forced_link_rate(struct intel_dp_link_caps *link_caps)
 {
-	struct intel_dp *intel_dp = link_caps->dp;
 	int len;
 
 	if (!link_caps->forced_params.rate)
 		return 0;
 
-	len = intel_dp_common_len_rate_limit(intel_dp, link_caps->forced_params.rate);
+	len = intel_dp_common_len_rate_limit(link_caps, link_caps->forced_params.rate);
 	if (len == 0)
-		return intel_dp_common_rate(intel_dp, 0);
+		return intel_dp_common_rate(link_caps, 0);
 
-	return intel_dp_common_rate(intel_dp, len - 1);
+	return intel_dp_common_rate(link_caps, len - 1);
 }
 
 void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
@@ -152,7 +146,7 @@ void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
 static int intel_dp_link_config_rate(struct intel_dp_link_caps *link_caps,
 				     const struct intel_dp_link_config_entry *lc)
 {
-	return intel_dp_common_rate(link_caps->dp, lc->link_rate_idx);
+	return intel_dp_common_rate(link_caps, lc->link_rate_idx);
 }
 
 static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lc)
@@ -169,7 +163,7 @@ static void set_max_link_limits_no_update(struct intel_dp_link_caps *link_caps,
 static void reset_max_link_limits_no_update(struct intel_dp_link_caps *link_caps)
 {
 	struct intel_dp_link_config max_link_limits = {
-		.rate = intel_dp_max_common_rate(link_caps->dp),
+		.rate = intel_dp_max_common_rate(link_caps),
 		.lane_count = intel_dp_link_caps_max_common_lane_count(link_caps),
 	};
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
index 9256f02fed11e..af9028e7cb987 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
@@ -11,11 +11,11 @@ struct intel_dp;
 struct intel_dp_link_caps;
 struct intel_dp_link_config;
 
-int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
+int intel_dp_common_len_rate_limit(struct intel_dp_link_caps *link_caps,
 				   int max_rate);
-int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
+int intel_dp_common_rate(struct intel_dp_link_caps *link_caps, int index);
 int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, int rate);
-int intel_dp_max_common_rate(struct intel_dp *intel_dp);
+int intel_dp_max_common_rate(struct intel_dp_link_caps *link_caps);
 int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps);
 int intel_dp_link_caps_max_common_lane_count(struct intel_dp_link_caps *link_caps);
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
index 0d4a0bf1dac53..b521dd11b62a7 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
@@ -1898,7 +1898,7 @@ static int reduce_link_rate(struct intel_dp *intel_dp, int current_rate)
 	if (rate_index <= 0)
 		return -1;
 
-	new_rate = intel_dp_common_rate(intel_dp, rate_index - 1);
+	new_rate = intel_dp_common_rate(link_caps, rate_index - 1);
 
 	/* TODO: Make switching from UHBR to non-UHBR rates work. */
 	if (drm_dp_is_uhbr_rate(current_rate) != drm_dp_is_uhbr_rate(new_rate))
@@ -1925,6 +1925,7 @@ static bool reduce_link_params_in_rate_lane_order(struct intel_dp *intel_dp,
 						  const struct intel_crtc_state *crtc_state,
 						  int *new_link_rate, int *new_lane_count)
 {
+	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
 	int link_rate;
 	int lane_count;
 
@@ -1932,7 +1933,7 @@ static bool reduce_link_params_in_rate_lane_order(struct intel_dp *intel_dp,
 	link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
 	if (link_rate < 0) {
 		lane_count = reduce_lane_count(intel_dp, crtc_state->lane_count);
-		link_rate = intel_dp_max_common_rate(intel_dp);
+		link_rate = intel_dp_max_common_rate(link_caps);
 	}
 
 	if (lane_count < 0)
diff --git a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
index 9d9d8d04742bc..76e9753766b9f 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
@@ -58,7 +58,7 @@ static int kbytes_to_mbits(int kbytes)
 static int get_current_link_bw(struct intel_dp *intel_dp)
 {
 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
-	int rate = intel_dp_max_common_rate(intel_dp);
+	int rate = intel_dp_max_common_rate(link_caps);
 	int lane_count = intel_dp_link_caps_max_common_lane_count(link_caps);
 
 	return intel_dp_max_link_data_rate(intel_dp, rate, lane_count);
-- 
2.49.1


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

* ✗ CI.checkpatch: warning for drm/i915/dp_link: Refactor DP link capability logic part1
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (27 preceding siblings ...)
  2026-06-16 20:08 ` [PATCH v2 28/28] drm/i915/dp_link_caps: Pass link_caps to common rate helpers Imre Deak
@ 2026-06-16 20:20 ` Patchwork
  2026-06-16 20:21 ` ✓ CI.KUnit: success " Patchwork
                   ` (2 subsequent siblings)
  31 siblings, 0 replies; 68+ messages in thread
From: Patchwork @ 2026-06-16 20:20 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-xe

== Series Details ==

Series: drm/i915/dp_link: Refactor DP link capability logic part1
URL   : https://patchwork.freedesktop.org/series/168632/
State : warning

== Summary ==

+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
061140b9bc586ae7f40abc1249c97e1cc72d1b9d
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 8fffa40b893c7f1a58eb4f857affd0ff1a069cb0
Author: Imre Deak <imre.deak@intel.com>
Date:   Tue Jun 16 23:08:48 2026 +0300

    drm/i915/dp_link_caps: Pass link_caps to common rate helpers
    
    Pass the link_caps pointer to the common rate helpers in
    intel_dp_link_caps.c, as it holds the state with the relevant
    information.
    
    Signed-off-by: Imre Deak <imre.deak@intel.com>
+ /mt/dim checkpatch 5447491819dcc3d10fd362c7bfbf877d343f6526 drm-intel
d331ab695995 drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry
91d2069c21cc drm/i915/dp: Add struct intel_dp_link_config
f516300a3fe5 drm/i915/dp_link_caps: Introduce DP link capability module
-:84: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#84: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 95 lines checked
28e7d30a8f17 drm/i915/dp_link_caps: Move common rate helpers to link caps
6303984b95cb drm/i915/dp_link_caps: Move forced link param helpers to link caps
686fb0b9d5ef drm/i915/dp: Simplify querying of forced link parameters
a74375a910b4 drm/i915/dp_link_caps: Move forced and max link debugfs entries to link caps
-:301: CHECK:LINE_SPACING: Please don't use multiple blank lines
#301: FILE: drivers/gpu/drm/i915/display/intel_dp_link_caps.c:325:
+
+

total: 0 errors, 0 warnings, 1 checks, 596 lines checked
149d0fc2a454 drm/i915/dp_link_training: Use helpers to get forced link params
f41d29c502ce drm/i915/dp_link_caps: Move forced link params to link_caps
be7e3e774a21 drm/i915/dp_link_caps: Move link config helpers to link caps
6eaf9267a798 drm/i915/dp_link_caps: Move link config tracking to link_caps
-:63: CHECK:SPACING: No space is necessary after a cast
#63: FILE: drivers/gpu/drm/i915/display/intel_dp_link_caps.c:28:
+#define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)

total: 0 errors, 0 warnings, 1 checks, 113 lines checked
ff0ba2857366 drm/i915/dp_link_caps: Rename helper updating the link configurations
133085c811cd drm/i915/dp: Factor out helper to get link rate capabilities
c90a42561ff5 drm/i915/dp_link_caps: Pass supported link rates to link caps update
c49558f9332c drm/i915/dp_link_caps: Add helper to print all supported link rates
9a3ed085d13a drm/i915/dp_link_caps: Add helper to get the number of supported link rates
5e130ac021fd drm/i915/dp_link_caps: Add helper to get common rate index
-:88: WARNING:LONG_LINE: line length of 104 exceeds 100 columns
#88: FILE: drivers/gpu/drm/i915/display/intel_dp_test.c:60:
+								   intel_dp->compliance.test_link_rate);

total: 0 errors, 1 warnings, 0 checks, 58 lines checked
9c60673083e8 drm/i915/dp_link_caps: Move tracking of common rates to link_caps struct
a31d3c9410f8 drm/i915/dp_link_caps: Track max common lane count in link_caps
d38209149d94 drm/i915/dp_link_caps: Use max common lane count from link_caps
-:55: WARNING:LONG_LINE: line length of 102 exceeds 100 columns
#55: FILE: drivers/gpu/drm/i915/display/intel_dp.c:3609:
+	intel_dp->link.max_lane_count = intel_dp_link_caps_max_common_lane_count(intel_dp->link.caps);

total: 0 errors, 1 warnings, 0 checks, 77 lines checked
cb0c222352de drm/i915/dp_link_caps: Add helpers to get max link limits
50f07cf796e9 drm/i915/dp_link_caps: Add helpers to set max link limits
43b143a47c1f drm/i915/dp_link_caps: Add helper to reset max link limits
7779a6b79a3d drm/i915/dp_link_caps: Add helper to reset link_caps state
0fec924131f3 drm/i915/dp_link_caps: Move max link limits to link_caps
13cecd67b2b7 drm/i915/dp_link_caps: Pass link_caps to static functions
-:107: WARNING:LONG_LINE: line length of 101 exceeds 100 columns
#107: FILE: drivers/gpu/drm/i915/display/intel_dp_link_caps.c:417:
+static int parse_link_rate(struct intel_dp_link_caps *link_caps, const char __user *ubuf, size_t len)

total: 0 errors, 1 warnings, 0 checks, 100 lines checked
e0b15827cc68 drm/i915/dp_link_caps: Pass link_caps to config update/lookup helpers
8fffa40b893c drm/i915/dp_link_caps: Pass link_caps to common rate helpers



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

* ✓ CI.KUnit: success for drm/i915/dp_link: Refactor DP link capability logic part1
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (28 preceding siblings ...)
  2026-06-16 20:20 ` ✗ CI.checkpatch: warning for drm/i915/dp_link: Refactor DP link capability logic part1 Patchwork
@ 2026-06-16 20:21 ` Patchwork
  2026-06-16 21:18 ` ✓ Xe.CI.BAT: " Patchwork
  2026-06-17  1:46 ` ✓ Xe.CI.FULL: " Patchwork
  31 siblings, 0 replies; 68+ messages in thread
From: Patchwork @ 2026-06-16 20:21 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-xe

== Series Details ==

Series: drm/i915/dp_link: Refactor DP link capability logic part1
URL   : https://patchwork.freedesktop.org/series/168632/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[20:20:31] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[20:20:36] 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
[20:21:07] Starting KUnit Kernel (1/1)...
[20:21:07] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[20:21:07] ================== guc_buf (11 subtests) ===================
[20:21:07] [PASSED] test_smallest
[20:21:07] [PASSED] test_largest
[20:21:07] [PASSED] test_granular
[20:21:07] [PASSED] test_unique
[20:21:07] [PASSED] test_overlap
[20:21:07] [PASSED] test_reusable
[20:21:07] [PASSED] test_too_big
[20:21:07] [PASSED] test_flush
[20:21:07] [PASSED] test_lookup
[20:21:07] [PASSED] test_data
[20:21:07] [PASSED] test_class
[20:21:07] ===================== [PASSED] guc_buf =====================
[20:21:07] =================== guc_dbm (7 subtests) ===================
[20:21:07] [PASSED] test_empty
[20:21:07] [PASSED] test_default
[20:21:07] ======================== test_size  ========================
[20:21:07] [PASSED] 4
[20:21:07] [PASSED] 8
[20:21:07] [PASSED] 32
[20:21:07] [PASSED] 256
[20:21:07] ==================== [PASSED] test_size ====================
[20:21:07] ======================= test_reuse  ========================
[20:21:07] [PASSED] 4
[20:21:07] [PASSED] 8
[20:21:07] [PASSED] 32
[20:21:07] [PASSED] 256
[20:21:07] =================== [PASSED] test_reuse ====================
[20:21:07] =================== test_range_overlap  ====================
[20:21:07] [PASSED] 4
[20:21:07] [PASSED] 8
[20:21:07] [PASSED] 32
[20:21:07] [PASSED] 256
[20:21:07] =============== [PASSED] test_range_overlap ================
[20:21:07] =================== test_range_compact  ====================
[20:21:07] [PASSED] 4
[20:21:07] [PASSED] 8
[20:21:07] [PASSED] 32
[20:21:07] [PASSED] 256
[20:21:07] =============== [PASSED] test_range_compact ================
[20:21:07] ==================== test_range_spare  =====================
[20:21:07] [PASSED] 4
[20:21:07] [PASSED] 8
[20:21:07] [PASSED] 32
[20:21:07] [PASSED] 256
[20:21:07] ================ [PASSED] test_range_spare =================
[20:21:07] ===================== [PASSED] guc_dbm =====================
[20:21:07] =================== guc_idm (6 subtests) ===================
[20:21:07] [PASSED] bad_init
[20:21:07] [PASSED] no_init
[20:21:07] [PASSED] init_fini
[20:21:07] [PASSED] check_used
[20:21:07] [PASSED] check_quota
[20:21:07] [PASSED] check_all
[20:21:07] ===================== [PASSED] guc_idm =====================
[20:21:07] ================== no_relay (3 subtests) ===================
[20:21:07] [PASSED] xe_drops_guc2pf_if_not_ready
[20:21:07] [PASSED] xe_drops_guc2vf_if_not_ready
[20:21:07] [PASSED] xe_rejects_send_if_not_ready
[20:21:07] ==================== [PASSED] no_relay =====================
[20:21:07] ================== pf_relay (14 subtests) ==================
[20:21:07] [PASSED] pf_rejects_guc2pf_too_short
[20:21:07] [PASSED] pf_rejects_guc2pf_too_long
[20:21:07] [PASSED] pf_rejects_guc2pf_no_payload
[20:21:07] [PASSED] pf_fails_no_payload
[20:21:07] [PASSED] pf_fails_bad_origin
[20:21:07] [PASSED] pf_fails_bad_type
[20:21:07] [PASSED] pf_txn_reports_error
[20:21:07] [PASSED] pf_txn_sends_pf2guc
[20:21:07] [PASSED] pf_sends_pf2guc
[20:21:07] [SKIPPED] pf_loopback_nop
[20:21:07] [SKIPPED] pf_loopback_echo
[20:21:07] [SKIPPED] pf_loopback_fail
[20:21:07] [SKIPPED] pf_loopback_busy
[20:21:07] [SKIPPED] pf_loopback_retry
[20:21:07] ==================== [PASSED] pf_relay =====================
[20:21:07] ================== vf_relay (3 subtests) ===================
[20:21:07] [PASSED] vf_rejects_guc2vf_too_short
[20:21:07] [PASSED] vf_rejects_guc2vf_too_long
[20:21:07] [PASSED] vf_rejects_guc2vf_no_payload
[20:21:07] ==================== [PASSED] vf_relay =====================
[20:21:07] ================ pf_gt_config (9 subtests) =================
[20:21:07] [PASSED] fair_contexts_1vf
[20:21:07] [PASSED] fair_doorbells_1vf
[20:21:07] [PASSED] fair_ggtt_1vf
[20:21:07] ====================== fair_vram_1vf  ======================
[20:21:07] [PASSED] 3.50 GiB
[20:21:07] [PASSED] 11.5 GiB
[20:21:07] [PASSED] 15.5 GiB
[20:21:07] [PASSED] 31.5 GiB
[20:21:07] [PASSED] 63.5 GiB
[20:21:07] [PASSED] 1.91 GiB
[20:21:07] ================== [PASSED] fair_vram_1vf ==================
[20:21:07] ================ fair_vram_1vf_admin_only  =================
[20:21:07] [PASSED] 3.50 GiB
[20:21:07] [PASSED] 11.5 GiB
[20:21:07] [PASSED] 15.5 GiB
[20:21:07] [PASSED] 31.5 GiB
[20:21:07] [PASSED] 63.5 GiB
[20:21:07] [PASSED] 1.91 GiB
[20:21:07] ============ [PASSED] fair_vram_1vf_admin_only =============
[20:21:07] ====================== fair_contexts  ======================
[20:21:07] [PASSED] 1 VF
[20:21:07] [PASSED] 2 VFs
[20:21:07] [PASSED] 3 VFs
[20:21:07] [PASSED] 4 VFs
[20:21:07] [PASSED] 5 VFs
[20:21:07] [PASSED] 6 VFs
[20:21:07] [PASSED] 7 VFs
[20:21:07] [PASSED] 8 VFs
[20:21:07] [PASSED] 9 VFs
[20:21:07] [PASSED] 10 VFs
[20:21:07] [PASSED] 11 VFs
[20:21:07] [PASSED] 12 VFs
[20:21:07] [PASSED] 13 VFs
[20:21:07] [PASSED] 14 VFs
[20:21:07] [PASSED] 15 VFs
[20:21:07] [PASSED] 16 VFs
[20:21:07] [PASSED] 17 VFs
[20:21:07] [PASSED] 18 VFs
[20:21:07] [PASSED] 19 VFs
[20:21:07] [PASSED] 20 VFs
[20:21:07] [PASSED] 21 VFs
[20:21:07] [PASSED] 22 VFs
[20:21:07] [PASSED] 23 VFs
[20:21:07] [PASSED] 24 VFs
[20:21:07] [PASSED] 25 VFs
[20:21:07] [PASSED] 26 VFs
[20:21:07] [PASSED] 27 VFs
[20:21:07] [PASSED] 28 VFs
[20:21:07] [PASSED] 29 VFs
[20:21:07] [PASSED] 30 VFs
[20:21:07] [PASSED] 31 VFs
[20:21:07] [PASSED] 32 VFs
[20:21:07] [PASSED] 33 VFs
[20:21:07] [PASSED] 34 VFs
[20:21:07] [PASSED] 35 VFs
[20:21:07] [PASSED] 36 VFs
[20:21:07] [PASSED] 37 VFs
[20:21:07] [PASSED] 38 VFs
[20:21:07] [PASSED] 39 VFs
[20:21:07] [PASSED] 40 VFs
[20:21:07] [PASSED] 41 VFs
[20:21:07] [PASSED] 42 VFs
[20:21:07] [PASSED] 43 VFs
[20:21:07] [PASSED] 44 VFs
[20:21:07] [PASSED] 45 VFs
[20:21:07] [PASSED] 46 VFs
[20:21:07] [PASSED] 47 VFs
[20:21:07] [PASSED] 48 VFs
[20:21:07] [PASSED] 49 VFs
[20:21:07] [PASSED] 50 VFs
[20:21:07] [PASSED] 51 VFs
[20:21:07] [PASSED] 52 VFs
[20:21:07] [PASSED] 53 VFs
[20:21:07] [PASSED] 54 VFs
[20:21:07] [PASSED] 55 VFs
[20:21:07] [PASSED] 56 VFs
[20:21:07] [PASSED] 57 VFs
[20:21:07] [PASSED] 58 VFs
[20:21:07] [PASSED] 59 VFs
[20:21:07] [PASSED] 60 VFs
[20:21:07] [PASSED] 61 VFs
[20:21:07] [PASSED] 62 VFs
[20:21:07] [PASSED] 63 VFs
[20:21:07] ================== [PASSED] fair_contexts ==================
[20:21:07] ===================== fair_doorbells  ======================
[20:21:07] [PASSED] 1 VF
[20:21:07] [PASSED] 2 VFs
[20:21:07] [PASSED] 3 VFs
[20:21:07] [PASSED] 4 VFs
[20:21:07] [PASSED] 5 VFs
[20:21:07] [PASSED] 6 VFs
[20:21:07] [PASSED] 7 VFs
[20:21:07] [PASSED] 8 VFs
[20:21:07] [PASSED] 9 VFs
[20:21:07] [PASSED] 10 VFs
[20:21:07] [PASSED] 11 VFs
[20:21:07] [PASSED] 12 VFs
[20:21:07] [PASSED] 13 VFs
[20:21:07] [PASSED] 14 VFs
[20:21:07] [PASSED] 15 VFs
[20:21:07] [PASSED] 16 VFs
[20:21:07] [PASSED] 17 VFs
[20:21:07] [PASSED] 18 VFs
[20:21:07] [PASSED] 19 VFs
[20:21:07] [PASSED] 20 VFs
[20:21:07] [PASSED] 21 VFs
[20:21:07] [PASSED] 22 VFs
[20:21:07] [PASSED] 23 VFs
[20:21:07] [PASSED] 24 VFs
[20:21:07] [PASSED] 25 VFs
[20:21:07] [PASSED] 26 VFs
[20:21:07] [PASSED] 27 VFs
[20:21:07] [PASSED] 28 VFs
[20:21:07] [PASSED] 29 VFs
[20:21:07] [PASSED] 30 VFs
[20:21:07] [PASSED] 31 VFs
[20:21:07] [PASSED] 32 VFs
[20:21:07] [PASSED] 33 VFs
[20:21:07] [PASSED] 34 VFs
[20:21:07] [PASSED] 35 VFs
[20:21:07] [PASSED] 36 VFs
[20:21:07] [PASSED] 37 VFs
[20:21:07] [PASSED] 38 VFs
[20:21:07] [PASSED] 39 VFs
[20:21:07] [PASSED] 40 VFs
[20:21:07] [PASSED] 41 VFs
[20:21:07] [PASSED] 42 VFs
[20:21:07] [PASSED] 43 VFs
[20:21:07] [PASSED] 44 VFs
[20:21:07] [PASSED] 45 VFs
[20:21:07] [PASSED] 46 VFs
[20:21:07] [PASSED] 47 VFs
[20:21:07] [PASSED] 48 VFs
[20:21:07] [PASSED] 49 VFs
[20:21:07] [PASSED] 50 VFs
[20:21:07] [PASSED] 51 VFs
[20:21:07] [PASSED] 52 VFs
[20:21:07] [PASSED] 53 VFs
[20:21:07] [PASSED] 54 VFs
[20:21:07] [PASSED] 55 VFs
[20:21:07] [PASSED] 56 VFs
[20:21:07] [PASSED] 57 VFs
[20:21:07] [PASSED] 58 VFs
[20:21:07] [PASSED] 59 VFs
[20:21:07] [PASSED] 60 VFs
[20:21:07] [PASSED] 61 VFs
[20:21:07] [PASSED] 62 VFs
[20:21:07] [PASSED] 63 VFs
[20:21:07] ================= [PASSED] fair_doorbells ==================
[20:21:07] ======================== fair_ggtt  ========================
[20:21:07] [PASSED] 1 VF
[20:21:07] [PASSED] 2 VFs
[20:21:07] [PASSED] 3 VFs
[20:21:07] [PASSED] 4 VFs
[20:21:07] [PASSED] 5 VFs
[20:21:07] [PASSED] 6 VFs
[20:21:07] [PASSED] 7 VFs
[20:21:07] [PASSED] 8 VFs
[20:21:07] [PASSED] 9 VFs
[20:21:07] [PASSED] 10 VFs
[20:21:07] [PASSED] 11 VFs
[20:21:07] [PASSED] 12 VFs
[20:21:07] [PASSED] 13 VFs
[20:21:07] [PASSED] 14 VFs
[20:21:07] [PASSED] 15 VFs
[20:21:07] [PASSED] 16 VFs
[20:21:07] [PASSED] 17 VFs
[20:21:07] [PASSED] 18 VFs
[20:21:07] [PASSED] 19 VFs
[20:21:07] [PASSED] 20 VFs
[20:21:07] [PASSED] 21 VFs
[20:21:07] [PASSED] 22 VFs
[20:21:07] [PASSED] 23 VFs
[20:21:07] [PASSED] 24 VFs
[20:21:07] [PASSED] 25 VFs
[20:21:07] [PASSED] 26 VFs
[20:21:07] [PASSED] 27 VFs
[20:21:07] [PASSED] 28 VFs
[20:21:07] [PASSED] 29 VFs
[20:21:07] [PASSED] 30 VFs
[20:21:07] [PASSED] 31 VFs
[20:21:07] [PASSED] 32 VFs
[20:21:07] [PASSED] 33 VFs
[20:21:07] [PASSED] 34 VFs
[20:21:07] [PASSED] 35 VFs
[20:21:07] [PASSED] 36 VFs
[20:21:07] [PASSED] 37 VFs
[20:21:07] [PASSED] 38 VFs
[20:21:07] [PASSED] 39 VFs
[20:21:07] [PASSED] 40 VFs
[20:21:07] [PASSED] 41 VFs
[20:21:07] [PASSED] 42 VFs
[20:21:07] [PASSED] 43 VFs
[20:21:07] [PASSED] 44 VFs
[20:21:07] [PASSED] 45 VFs
[20:21:07] [PASSED] 46 VFs
[20:21:07] [PASSED] 47 VFs
[20:21:07] [PASSED] 48 VFs
[20:21:07] [PASSED] 49 VFs
[20:21:07] [PASSED] 50 VFs
[20:21:07] [PASSED] 51 VFs
[20:21:07] [PASSED] 52 VFs
[20:21:07] [PASSED] 53 VFs
[20:21:07] [PASSED] 54 VFs
[20:21:07] [PASSED] 55 VFs
[20:21:07] [PASSED] 56 VFs
[20:21:07] [PASSED] 57 VFs
[20:21:07] [PASSED] 58 VFs
[20:21:07] [PASSED] 59 VFs
[20:21:07] [PASSED] 60 VFs
[20:21:07] [PASSED] 61 VFs
[20:21:07] [PASSED] 62 VFs
[20:21:07] [PASSED] 63 VFs
[20:21:07] ==================== [PASSED] fair_ggtt ====================
[20:21:07] ======================== fair_vram  ========================
[20:21:07] [PASSED] 1 VF
[20:21:07] [PASSED] 2 VFs
[20:21:07] [PASSED] 3 VFs
[20:21:07] [PASSED] 4 VFs
[20:21:07] [PASSED] 5 VFs
[20:21:07] [PASSED] 6 VFs
[20:21:07] [PASSED] 7 VFs
[20:21:07] [PASSED] 8 VFs
[20:21:07] [PASSED] 9 VFs
[20:21:07] [PASSED] 10 VFs
[20:21:07] [PASSED] 11 VFs
[20:21:07] [PASSED] 12 VFs
[20:21:07] [PASSED] 13 VFs
[20:21:07] [PASSED] 14 VFs
[20:21:07] [PASSED] 15 VFs
[20:21:07] [PASSED] 16 VFs
[20:21:07] [PASSED] 17 VFs
[20:21:07] [PASSED] 18 VFs
[20:21:07] [PASSED] 19 VFs
[20:21:07] [PASSED] 20 VFs
[20:21:07] [PASSED] 21 VFs
[20:21:07] [PASSED] 22 VFs
[20:21:07] [PASSED] 23 VFs
[20:21:07] [PASSED] 24 VFs
[20:21:07] [PASSED] 25 VFs
[20:21:07] [PASSED] 26 VFs
[20:21:07] [PASSED] 27 VFs
[20:21:07] [PASSED] 28 VFs
[20:21:07] [PASSED] 29 VFs
[20:21:07] [PASSED] 30 VFs
[20:21:07] [PASSED] 31 VFs
[20:21:07] [PASSED] 32 VFs
[20:21:07] [PASSED] 33 VFs
[20:21:07] [PASSED] 34 VFs
[20:21:07] [PASSED] 35 VFs
[20:21:07] [PASSED] 36 VFs
[20:21:07] [PASSED] 37 VFs
[20:21:07] [PASSED] 38 VFs
[20:21:07] [PASSED] 39 VFs
[20:21:07] [PASSED] 40 VFs
[20:21:07] [PASSED] 41 VFs
[20:21:07] [PASSED] 42 VFs
[20:21:07] [PASSED] 43 VFs
[20:21:07] [PASSED] 44 VFs
[20:21:07] [PASSED] 45 VFs
[20:21:07] [PASSED] 46 VFs
[20:21:07] [PASSED] 47 VFs
[20:21:07] [PASSED] 48 VFs
[20:21:07] [PASSED] 49 VFs
[20:21:07] [PASSED] 50 VFs
[20:21:07] [PASSED] 51 VFs
[20:21:07] [PASSED] 52 VFs
[20:21:07] [PASSED] 53 VFs
[20:21:07] [PASSED] 54 VFs
[20:21:07] [PASSED] 55 VFs
[20:21:07] [PASSED] 56 VFs
[20:21:07] [PASSED] 57 VFs
[20:21:07] [PASSED] 58 VFs
[20:21:07] [PASSED] 59 VFs
[20:21:07] [PASSED] 60 VFs
[20:21:07] [PASSED] 61 VFs
[20:21:07] [PASSED] 62 VFs
[20:21:07] [PASSED] 63 VFs
[20:21:07] ==================== [PASSED] fair_vram ====================
[20:21:07] ================== [PASSED] pf_gt_config ===================
[20:21:07] ===================== lmtt (1 subtest) =====================
[20:21:07] ======================== test_ops  =========================
[20:21:07] [PASSED] 2-level
[20:21:07] [PASSED] multi-level
[20:21:07] ==================== [PASSED] test_ops =====================
[20:21:07] ====================== [PASSED] lmtt =======================
[20:21:07] ================= pf_service (11 subtests) =================
[20:21:07] [PASSED] pf_negotiate_any
[20:21:07] [PASSED] pf_negotiate_base_match
[20:21:07] [PASSED] pf_negotiate_base_newer
[20:21:07] [PASSED] pf_negotiate_base_next
[20:21:07] [SKIPPED] pf_negotiate_base_older
[20:21:07] [PASSED] pf_negotiate_base_prev
[20:21:07] [PASSED] pf_negotiate_latest_match
[20:21:07] [PASSED] pf_negotiate_latest_newer
[20:21:07] [PASSED] pf_negotiate_latest_next
[20:21:07] [SKIPPED] pf_negotiate_latest_older
[20:21:07] [SKIPPED] pf_negotiate_latest_prev
[20:21:07] =================== [PASSED] pf_service ====================
[20:21:07] ================= xe_guc_g2g (2 subtests) ==================
[20:21:07] ============== xe_live_guc_g2g_kunit_default  ==============
[20:21:07] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[20:21:07] ============== xe_live_guc_g2g_kunit_allmem  ===============
[20:21:07] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[20:21:07] =================== [SKIPPED] xe_guc_g2g ===================
[20:21:07] =================== xe_mocs (2 subtests) ===================
[20:21:07] ================ xe_live_mocs_kernel_kunit  ================
[20:21:07] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[20:21:07] ================ xe_live_mocs_reset_kunit  =================
[20:21:07] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[20:21:07] ==================== [SKIPPED] xe_mocs =====================
[20:21:07] ================= xe_migrate (2 subtests) ==================
[20:21:07] ================= xe_migrate_sanity_kunit  =================
[20:21:07] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[20:21:07] ================== xe_validate_ccs_kunit  ==================
[20:21:07] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[20:21:07] =================== [SKIPPED] xe_migrate ===================
[20:21:07] ================== xe_dma_buf (1 subtest) ==================
[20:21:07] ==================== xe_dma_buf_kunit  =====================
[20:21:07] ================ [SKIPPED] xe_dma_buf_kunit ================
[20:21:07] =================== [SKIPPED] xe_dma_buf ===================
[20:21:07] ================= xe_bo_shrink (1 subtest) =================
[20:21:07] =================== xe_bo_shrink_kunit  ====================
[20:21:07] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[20:21:07] ================== [SKIPPED] xe_bo_shrink ==================
[20:21:07] ==================== xe_bo (2 subtests) ====================
[20:21:07] ================== xe_ccs_migrate_kunit  ===================
[20:21:07] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[20:21:07] ==================== xe_bo_evict_kunit  ====================
[20:21:07] =============== [SKIPPED] xe_bo_evict_kunit ================
[20:21:07] ===================== [SKIPPED] xe_bo ======================
[20:21:07] ==================== args (13 subtests) ====================
[20:21:07] [PASSED] count_args_test
[20:21:07] [PASSED] call_args_example
[20:21:07] [PASSED] call_args_test
[20:21:07] [PASSED] drop_first_arg_example
[20:21:07] [PASSED] drop_first_arg_test
[20:21:07] [PASSED] first_arg_example
[20:21:07] [PASSED] first_arg_test
[20:21:07] [PASSED] last_arg_example
[20:21:07] [PASSED] last_arg_test
[20:21:07] [PASSED] pick_arg_example
[20:21:07] [PASSED] if_args_example
[20:21:07] [PASSED] if_args_test
[20:21:07] [PASSED] sep_comma_example
[20:21:07] ====================== [PASSED] args =======================
[20:21:07] =================== xe_pci (3 subtests) ====================
[20:21:07] ==================== check_graphics_ip  ====================
[20:21:07] [PASSED] 12.00 Xe_LP
[20:21:07] [PASSED] 12.10 Xe_LP+
[20:21:07] [PASSED] 12.55 Xe_HPG
[20:21:07] [PASSED] 12.60 Xe_HPC
[20:21:07] [PASSED] 12.70 Xe_LPG
[20:21:07] [PASSED] 12.71 Xe_LPG
[20:21:07] [PASSED] 12.74 Xe_LPG+
[20:21:07] [PASSED] 20.01 Xe2_HPG
[20:21:07] [PASSED] 20.02 Xe2_HPG
[20:21:07] [PASSED] 20.04 Xe2_LPG
[20:21:07] [PASSED] 30.00 Xe3_LPG
[20:21:07] [PASSED] 30.01 Xe3_LPG
[20:21:07] [PASSED] 30.03 Xe3_LPG
[20:21:07] [PASSED] 30.04 Xe3_LPG
[20:21:07] [PASSED] 30.05 Xe3_LPG
[20:21:07] [PASSED] 35.10 Xe3p_LPG
[20:21:07] [PASSED] 35.11 Xe3p_XPC
[20:21:07] ================ [PASSED] check_graphics_ip ================
[20:21:07] ===================== check_media_ip  ======================
[20:21:07] [PASSED] 12.00 Xe_M
[20:21:07] [PASSED] 12.55 Xe_HPM
[20:21:07] [PASSED] 13.00 Xe_LPM+
[20:21:07] [PASSED] 13.01 Xe2_HPM
[20:21:07] [PASSED] 20.00 Xe2_LPM
[20:21:07] [PASSED] 30.00 Xe3_LPM
[20:21:07] [PASSED] 30.02 Xe3_LPM
[20:21:07] [PASSED] 35.00 Xe3p_LPM
[20:21:07] [PASSED] 35.03 Xe3p_HPM
[20:21:07] ================= [PASSED] check_media_ip ==================
[20:21:07] =================== check_platform_desc  ===================
[20:21:07] [PASSED] 0x9A60 (TIGERLAKE)
[20:21:07] [PASSED] 0x9A68 (TIGERLAKE)
[20:21:07] [PASSED] 0x9A70 (TIGERLAKE)
[20:21:07] [PASSED] 0x9A40 (TIGERLAKE)
[20:21:07] [PASSED] 0x9A49 (TIGERLAKE)
[20:21:07] [PASSED] 0x9A59 (TIGERLAKE)
[20:21:07] [PASSED] 0x9A78 (TIGERLAKE)
[20:21:07] [PASSED] 0x9AC0 (TIGERLAKE)
[20:21:07] [PASSED] 0x9AC9 (TIGERLAKE)
[20:21:07] [PASSED] 0x9AD9 (TIGERLAKE)
[20:21:07] [PASSED] 0x9AF8 (TIGERLAKE)
[20:21:07] [PASSED] 0x4C80 (ROCKETLAKE)
[20:21:07] [PASSED] 0x4C8A (ROCKETLAKE)
[20:21:07] [PASSED] 0x4C8B (ROCKETLAKE)
[20:21:07] [PASSED] 0x4C8C (ROCKETLAKE)
[20:21:07] [PASSED] 0x4C90 (ROCKETLAKE)
[20:21:07] [PASSED] 0x4C9A (ROCKETLAKE)
[20:21:07] [PASSED] 0x4680 (ALDERLAKE_S)
[20:21:07] [PASSED] 0x4682 (ALDERLAKE_S)
[20:21:07] [PASSED] 0x4688 (ALDERLAKE_S)
[20:21:07] [PASSED] 0x468A (ALDERLAKE_S)
[20:21:07] [PASSED] 0x468B (ALDERLAKE_S)
[20:21:07] [PASSED] 0x4690 (ALDERLAKE_S)
[20:21:07] [PASSED] 0x4692 (ALDERLAKE_S)
[20:21:07] [PASSED] 0x4693 (ALDERLAKE_S)
[20:21:07] [PASSED] 0x46A0 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46A1 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46A2 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46A3 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46A6 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46A8 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46AA (ALDERLAKE_P)
[20:21:07] [PASSED] 0x462A (ALDERLAKE_P)
[20:21:07] [PASSED] 0x4626 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x4628 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46B0 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46B1 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46B2 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46B3 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46C0 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46C1 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46C2 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46C3 (ALDERLAKE_P)
[20:21:07] [PASSED] 0x46D0 (ALDERLAKE_N)
[20:21:07] [PASSED] 0x46D1 (ALDERLAKE_N)
[20:21:07] [PASSED] 0x46D2 (ALDERLAKE_N)
[20:21:07] [PASSED] 0x46D3 (ALDERLAKE_N)
[20:21:07] [PASSED] 0x46D4 (ALDERLAKE_N)
[20:21:07] [PASSED] 0xA721 (ALDERLAKE_P)
[20:21:07] [PASSED] 0xA7A1 (ALDERLAKE_P)
[20:21:07] [PASSED] 0xA7A9 (ALDERLAKE_P)
[20:21:07] [PASSED] 0xA7AC (ALDERLAKE_P)
[20:21:07] [PASSED] 0xA7AD (ALDERLAKE_P)
[20:21:07] [PASSED] 0xA720 (ALDERLAKE_P)
[20:21:07] [PASSED] 0xA7A0 (ALDERLAKE_P)
[20:21:07] [PASSED] 0xA7A8 (ALDERLAKE_P)
[20:21:07] [PASSED] 0xA7AA (ALDERLAKE_P)
[20:21:07] [PASSED] 0xA7AB (ALDERLAKE_P)
[20:21:07] [PASSED] 0xA780 (ALDERLAKE_S)
[20:21:07] [PASSED] 0xA781 (ALDERLAKE_S)
[20:21:07] [PASSED] 0xA782 (ALDERLAKE_S)
[20:21:07] [PASSED] 0xA783 (ALDERLAKE_S)
[20:21:07] [PASSED] 0xA788 (ALDERLAKE_S)
[20:21:07] [PASSED] 0xA789 (ALDERLAKE_S)
[20:21:07] [PASSED] 0xA78A (ALDERLAKE_S)
[20:21:07] [PASSED] 0xA78B (ALDERLAKE_S)
[20:21:07] [PASSED] 0x4905 (DG1)
[20:21:07] [PASSED] 0x4906 (DG1)
[20:21:07] [PASSED] 0x4907 (DG1)
[20:21:07] [PASSED] 0x4908 (DG1)
[20:21:07] [PASSED] 0x4909 (DG1)
[20:21:07] [PASSED] 0x56C0 (DG2)
[20:21:07] [PASSED] 0x56C2 (DG2)
[20:21:07] [PASSED] 0x56C1 (DG2)
[20:21:07] [PASSED] 0x7D51 (METEORLAKE)
[20:21:07] [PASSED] 0x7DD1 (METEORLAKE)
[20:21:07] [PASSED] 0x7D41 (METEORLAKE)
[20:21:07] [PASSED] 0x7D67 (METEORLAKE)
[20:21:07] [PASSED] 0xB640 (METEORLAKE)
[20:21:07] [PASSED] 0x56A0 (DG2)
[20:21:07] [PASSED] 0x56A1 (DG2)
[20:21:07] [PASSED] 0x56A2 (DG2)
[20:21:07] [PASSED] 0x56BE (DG2)
[20:21:07] [PASSED] 0x56BF (DG2)
[20:21:07] [PASSED] 0x5690 (DG2)
[20:21:07] [PASSED] 0x5691 (DG2)
[20:21:07] [PASSED] 0x5692 (DG2)
[20:21:07] [PASSED] 0x56A5 (DG2)
[20:21:07] [PASSED] 0x56A6 (DG2)
[20:21:07] [PASSED] 0x56B0 (DG2)
[20:21:07] [PASSED] 0x56B1 (DG2)
[20:21:07] [PASSED] 0x56BA (DG2)
[20:21:07] [PASSED] 0x56BB (DG2)
[20:21:07] [PASSED] 0x56BC (DG2)
[20:21:07] [PASSED] 0x56BD (DG2)
[20:21:07] [PASSED] 0x5693 (DG2)
[20:21:07] [PASSED] 0x5694 (DG2)
[20:21:07] [PASSED] 0x5695 (DG2)
[20:21:07] [PASSED] 0x56A3 (DG2)
[20:21:07] [PASSED] 0x56A4 (DG2)
[20:21:07] [PASSED] 0x56B2 (DG2)
[20:21:07] [PASSED] 0x56B3 (DG2)
[20:21:07] [PASSED] 0x5696 (DG2)
[20:21:07] [PASSED] 0x5697 (DG2)
[20:21:07] [PASSED] 0xB69 (PVC)
[20:21:07] [PASSED] 0xB6E (PVC)
[20:21:07] [PASSED] 0xBD4 (PVC)
[20:21:07] [PASSED] 0xBD5 (PVC)
[20:21:07] [PASSED] 0xBD6 (PVC)
[20:21:07] [PASSED] 0xBD7 (PVC)
[20:21:07] [PASSED] 0xBD8 (PVC)
[20:21:07] [PASSED] 0xBD9 (PVC)
[20:21:07] [PASSED] 0xBDA (PVC)
[20:21:07] [PASSED] 0xBDB (PVC)
[20:21:07] [PASSED] 0xBE0 (PVC)
[20:21:07] [PASSED] 0xBE1 (PVC)
[20:21:07] [PASSED] 0xBE5 (PVC)
[20:21:07] [PASSED] 0x7D40 (METEORLAKE)
[20:21:07] [PASSED] 0x7D45 (METEORLAKE)
[20:21:07] [PASSED] 0x7D55 (METEORLAKE)
[20:21:07] [PASSED] 0x7D60 (METEORLAKE)
[20:21:07] [PASSED] 0x7DD5 (METEORLAKE)
[20:21:07] [PASSED] 0x6420 (LUNARLAKE)
[20:21:07] [PASSED] 0x64A0 (LUNARLAKE)
[20:21:07] [PASSED] 0x64B0 (LUNARLAKE)
[20:21:07] [PASSED] 0xE202 (BATTLEMAGE)
[20:21:07] [PASSED] 0xE209 (BATTLEMAGE)
[20:21:07] [PASSED] 0xE20B (BATTLEMAGE)
[20:21:07] [PASSED] 0xE20C (BATTLEMAGE)
[20:21:07] [PASSED] 0xE20D (BATTLEMAGE)
[20:21:07] [PASSED] 0xE210 (BATTLEMAGE)
[20:21:07] [PASSED] 0xE211 (BATTLEMAGE)
[20:21:07] [PASSED] 0xE212 (BATTLEMAGE)
[20:21:07] [PASSED] 0xE216 (BATTLEMAGE)
[20:21:07] [PASSED] 0xE220 (BATTLEMAGE)
[20:21:07] [PASSED] 0xE221 (BATTLEMAGE)
[20:21:07] [PASSED] 0xE222 (BATTLEMAGE)
[20:21:07] [PASSED] 0xE223 (BATTLEMAGE)
[20:21:07] [PASSED] 0xB080 (PANTHERLAKE)
[20:21:07] [PASSED] 0xB081 (PANTHERLAKE)
[20:21:07] [PASSED] 0xB082 (PANTHERLAKE)
[20:21:07] [PASSED] 0xB083 (PANTHERLAKE)
[20:21:07] [PASSED] 0xB084 (PANTHERLAKE)
[20:21:07] [PASSED] 0xB085 (PANTHERLAKE)
[20:21:07] [PASSED] 0xB086 (PANTHERLAKE)
[20:21:07] [PASSED] 0xB087 (PANTHERLAKE)
[20:21:07] [PASSED] 0xB08F (PANTHERLAKE)
[20:21:07] [PASSED] 0xB090 (PANTHERLAKE)
[20:21:07] [PASSED] 0xB0A0 (PANTHERLAKE)
[20:21:07] [PASSED] 0xB0B0 (PANTHERLAKE)
[20:21:07] [PASSED] 0xFD80 (PANTHERLAKE)
[20:21:07] [PASSED] 0xFD81 (PANTHERLAKE)
[20:21:07] [PASSED] 0xD740 (NOVALAKE_S)
[20:21:07] [PASSED] 0xD741 (NOVALAKE_S)
[20:21:07] [PASSED] 0xD742 (NOVALAKE_S)
[20:21:07] [PASSED] 0xD743 (NOVALAKE_S)
[20:21:07] [PASSED] 0xD745 (NOVALAKE_S)
[20:21:07] [PASSED] 0xD74A (NOVALAKE_S)
[20:21:07] [PASSED] 0xD74B (NOVALAKE_S)
[20:21:07] [PASSED] 0x674C (CRESCENTISLAND)
[20:21:07] [PASSED] 0x674D (CRESCENTISLAND)
[20:21:07] [PASSED] 0x674E (CRESCENTISLAND)
[20:21:07] [PASSED] 0x674F (CRESCENTISLAND)
[20:21:07] [PASSED] 0x6750 (CRESCENTISLAND)
[20:21:07] [PASSED] 0xD750 (NOVALAKE_P)
[20:21:07] [PASSED] 0xD751 (NOVALAKE_P)
[20:21:07] [PASSED] 0xD752 (NOVALAKE_P)
[20:21:07] [PASSED] 0xD753 (NOVALAKE_P)
[20:21:07] [PASSED] 0xD754 (NOVALAKE_P)
[20:21:07] [PASSED] 0xD755 (NOVALAKE_P)
[20:21:07] [PASSED] 0xD756 (NOVALAKE_P)
[20:21:07] [PASSED] 0xD757 (NOVALAKE_P)
[20:21:07] [PASSED] 0xD75F (NOVALAKE_P)
[20:21:07] =============== [PASSED] check_platform_desc ===============
[20:21:07] ===================== [PASSED] xe_pci ======================
[20:21:07] ============= xe_rtp_tables_test (4 subtests) ==============
[20:21:07] ================== xe_rtp_table_gt_test  ===================
[20:21:07] [PASSED] gt_was/14011060649
[20:21:07] [PASSED] gt_was/14011059788
[20:21:07] [PASSED] gt_was/14015795083
[20:21:07] [PASSED] gt_was/16021867713
[20:21:07] [PASSED] gt_was/14019449301
[20:21:07] [PASSED] gt_was/16028005424
[20:21:07] [PASSED] gt_was/14026578760
[20:21:07] [PASSED] gt_was/1409420604
[20:21:07] [PASSED] gt_was/1408615072
[20:21:07] [PASSED] gt_was/22010523718
[20:21:07] [PASSED] gt_was/14011006942
[20:21:07] [PASSED] gt_was/14014830051
[20:21:07] [PASSED] gt_was/18018781329
[20:21:07] [PASSED] gt_was/1509235366
[20:21:07] [PASSED] gt_was/18018781329
[20:21:07] [PASSED] gt_was/16016694945
[20:21:07] [PASSED] gt_was/14018575942
[20:21:07] [PASSED] gt_was/22016670082
[20:21:07] [PASSED] gt_was/22016670082
[20:21:07] [PASSED] gt_was/14017421178
[20:21:07] [PASSED] gt_was/16025250150
[20:21:07] [PASSED] gt_was/14021871409
[20:21:07] [PASSED] gt_was/16021865536
[20:21:07] [PASSED] gt_was/14021486841
[20:21:07] [PASSED] gt_was/14025160223
[20:21:07] [PASSED] gt_was/14026144927, 16029437861, 14026127056
[20:21:07] [PASSED] gt_was/14025635424
[20:21:07] [PASSED] gt_was/16028005424
[20:21:07] ============== [PASSED] xe_rtp_table_gt_test ===============
[20:21:07] ================== xe_rtp_table_gt_test  ===================
[20:21:07] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[20:21:07] [PASSED] gt_tunings/Tuning: 32B Access Enable
[20:21:07] [PASSED] gt_tunings/Tuning: L3 cache
[20:21:07] [PASSED] gt_tunings/Tuning: L3 cache - media
[20:21:07] [PASSED] gt_tunings/Tuning: Compression Overfetch
[20:21:07] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[20:21:07] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[20:21:07] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[20:21:07] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[20:21:07] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[20:21:07] [PASSED] gt_tunings/Tuning: Stateless compression control
[20:21:07] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[20:21:07] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[20:21:07] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[20:21:07] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[20:21:07] ============== [PASSED] xe_rtp_table_gt_test ===============
[20:21:07] ================== xe_rtp_table_oob_test  ==================
[20:21:07] [PASSED] oob_was/1607983814
[20:21:07] [PASSED] oob_was/16010904313
[20:21:07] [PASSED] oob_was/18022495364
[20:21:07] [PASSED] oob_was/22012773006
[20:21:07] [PASSED] oob_was/14014475959
[20:21:07] [PASSED] oob_was/22011391025
[20:21:07] [PASSED] oob_was/22012727170
[20:21:07] [PASSED] oob_was/22012727685
[20:21:07] [PASSED] oob_was/22016596838
[20:21:07] [PASSED] oob_was/18020744125
[20:21:07] [PASSED] oob_was/1409600907
[20:21:07] [PASSED] oob_was/22014953428
[20:21:07] [PASSED] oob_was/16017236439
[20:21:07] [PASSED] oob_was/14019821291
[20:21:07] [PASSED] oob_was/14015076503
[20:21:07] [PASSED] oob_was/14018913170
[20:21:07] [PASSED] oob_was/14018094691
[20:21:07] [PASSED] oob_was/18024947630
[20:21:07] [PASSED] oob_was/16022287689
[20:21:07] [PASSED] oob_was/13011645652
[20:21:07] [PASSED] oob_was/14022293748
[20:21:07] [PASSED] oob_was/22019794406
[20:21:07] [PASSED] oob_was/22019338487
[20:21:07] [PASSED] oob_was/16023588340
[20:21:07] [PASSED] oob_was/14019789679
[20:21:07] [PASSED] oob_was/14022866841
[20:21:07] [PASSED] oob_was/16021333562
[20:21:07] [PASSED] oob_was/14016712196
[20:21:07] [PASSED] oob_was/14015568240
[20:21:07] [PASSED] oob_was/18013179988
[20:21:07] [PASSED] oob_was/1508761755
[20:21:07] [PASSED] oob_was/16023105232
[20:21:07] [PASSED] oob_was/16026508708
[20:21:07] [PASSED] oob_was/14020001231
[20:21:07] [PASSED] oob_was/16023683509
[20:21:07] [PASSED] oob_was/14025515070
[20:21:07] [PASSED] oob_was/15015404425_disable
[20:21:07] [PASSED] oob_was/16026007364
[20:21:07] [PASSED] oob_was/14020316580
[20:21:07] [PASSED] oob_was/14025883347
[20:21:07] [PASSED] oob_was/16029380221
[20:21:07] ============== [PASSED] xe_rtp_table_oob_test ==============
[20:21:07] ================ xe_rtp_table_dev_oob_test  ================
[20:21:07] [PASSED] device_oob_was/22010954014
[20:21:07] [PASSED] device_oob_was/15015404425
[20:21:07] [PASSED] device_oob_was/22019338487_display
[20:21:07] [PASSED] device_oob_was/14022085890
[20:21:07] [PASSED] device_oob_was/14026539277
[20:21:07] [PASSED] device_oob_was/14026633728
[20:21:07] [PASSED] device_oob_was/14026746987
[20:21:07] [PASSED] device_oob_was/14026779378
[20:21:07] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[20:21:07] =============== [PASSED] xe_rtp_tables_test ================
[20:21:07] =================== xe_rtp (3 subtests) ====================
[20:21:07] =================== xe_rtp_rules_tests  ====================
[20:21:07] [PASSED] no
[20:21:07] [PASSED] yes
[20:21:07] [PASSED] no-and-no
[20:21:07] [PASSED] no-and-yes
[20:21:07] [PASSED] yes-and-no
[20:21:07] [PASSED] yes-and-yes
[20:21:07] [PASSED] no-or-no
[20:21:07] [PASSED] no-or-yes
[20:21:07] [PASSED] yes-or-no
[20:21:07] [PASSED] yes-or-yes
[20:21:07] [PASSED] no-yes-or-yes-no
[20:21:07] [PASSED] no-yes-or-yes-yes
[20:21:07] [PASSED] yes-yes-or-no-yes
[20:21:07] [PASSED] yes-yes-or-yes-yes
[20:21:07] [PASSED] no-no-or-yes-or-no
[20:21:07] [PASSED] or
[20:21:07] [PASSED] or-yes
[20:21:07] [PASSED] or-no
[20:21:07] [PASSED] yes-or
[20:21:07] [PASSED] no-or
[20:21:07] [PASSED] no-or-or-yes
[20:21:07] [PASSED] yes-or-or-no
[20:21:07] [PASSED] no-or-or-no
[20:21:07] [PASSED] missing-context-engine-class
[20:21:07] [PASSED] missing-context-engine-class-or-yes
[20:21:07] [PASSED] missing-context-engine-class-or-or-yes
[20:21:07] =============== [PASSED] xe_rtp_rules_tests ================
[20:21:07] =============== xe_rtp_process_to_sr_tests  ================
[20:21:07] [PASSED] coalesce-same-reg
[20:21:07] [PASSED] no-match-no-add
[20:21:07] [PASSED] two-regs-two-entries
[20:21:07] [PASSED] clr-one-set-other
[20:21:07] [PASSED] set-field
[20:21:07] [PASSED] conflict-duplicate
[20:21:07] [PASSED] conflict-not-disjoint
[20:21:07] [PASSED] conflict-reg-type
[20:21:07] [PASSED] bad-mcr-reg-forced-to-regular
[20:21:07] [PASSED] bad-regular-reg-forced-to-mcr
[20:21:07] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[20:21:07] ================== xe_rtp_process_tests  ===================
[20:21:07] [PASSED] active1
[20:21:07] [PASSED] active2
[20:21:07] [PASSED] active-inactive
[20:21:07] [PASSED] inactive-active
[20:21:07] [PASSED] inactive-active-inactive
[20:21:07] [PASSED] inactive-inactive-inactive
[20:21:07] ============== [PASSED] xe_rtp_process_tests ===============
[20:21:07] ===================== [PASSED] xe_rtp ======================
[20:21:07] ==================== xe_wa (1 subtest) =====================
[20:21:07] ======================== xe_wa_gt  =========================
[20:21:07] [PASSED] TIGERLAKE B0
[20:21:07] [PASSED] DG1 A0
[20:21:07] [PASSED] DG1 B0
[20:21:07] [PASSED] ALDERLAKE_S A0
[20:21:07] [PASSED] ALDERLAKE_S B0
[20:21:07] [PASSED] ALDERLAKE_S C0
[20:21:07] [PASSED] ALDERLAKE_S D0
[20:21:07] [PASSED] ALDERLAKE_P A0
[20:21:07] [PASSED] ALDERLAKE_P B0
[20:21:07] [PASSED] ALDERLAKE_P C0
[20:21:07] [PASSED] ALDERLAKE_S RPLS D0
[20:21:07] [PASSED] ALDERLAKE_P RPLU E0
[20:21:07] [PASSED] DG2 G10 C0
[20:21:07] [PASSED] DG2 G11 B1
[20:21:07] [PASSED] DG2 G12 A1
[20:21:07] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[20:21:07] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[20:21:07] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[20:21:07] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[20:21:07] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[20:21:07] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[20:21:07] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[20:21:07] ==================== [PASSED] xe_wa_gt =====================
[20:21:07] ====================== [PASSED] xe_wa ======================
[20:21:07] ============================================================
[20:21:07] Testing complete. Ran 717 tests: passed: 699, skipped: 18
[20:21:07] Elapsed time: 36.224s total, 4.316s configuring, 31.242s building, 0.635s running

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

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

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



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

* ✓ Xe.CI.BAT: success for drm/i915/dp_link: Refactor DP link capability logic part1
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (29 preceding siblings ...)
  2026-06-16 20:21 ` ✓ CI.KUnit: success " Patchwork
@ 2026-06-16 21:18 ` Patchwork
  2026-06-17  1:46 ` ✓ Xe.CI.FULL: " Patchwork
  31 siblings, 0 replies; 68+ messages in thread
From: Patchwork @ 2026-06-16 21:18 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-xe

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

== Series Details ==

Series: drm/i915/dp_link: Refactor DP link capability logic part1
URL   : https://patchwork.freedesktop.org/series/168632/
State : success

== Summary ==

CI Bug Log - changes from xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526_BAT -> xe-pw-168632v1_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (13 -> 13)
------------------------------

  No changes in participating hosts


Changes
-------

  No changes found


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

  * Linux: xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526 -> xe-pw-168632v1

  IGT_8966: 9b33225c761bfe8c8c266bc56558d75c700029fb @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526: 5447491819dcc3d10fd362c7bfbf877d343f6526
  xe-pw-168632v1: 168632v1

== Logs ==

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

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

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

* ✓ Xe.CI.FULL: success for drm/i915/dp_link: Refactor DP link capability logic part1
  2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
                   ` (30 preceding siblings ...)
  2026-06-16 21:18 ` ✓ Xe.CI.BAT: " Patchwork
@ 2026-06-17  1:46 ` Patchwork
  31 siblings, 0 replies; 68+ messages in thread
From: Patchwork @ 2026-06-17  1:46 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-xe

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

== Series Details ==

Series: drm/i915/dp_link: Refactor DP link capability logic part1
URL   : https://patchwork.freedesktop.org/series/168632/
State : success

== Summary ==

CI Bug Log - changes from xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526_FULL -> xe-pw-168632v1_FULL
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (2 -> 2)
------------------------------

  No changes in participating hosts

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

  Here are the changes found in xe-pw-168632v1_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_big_fb@4-tiled-16bpp-rotate-90:
    - shard-bmg:          NOTRUN -> [SKIP][1] ([Intel XE#2327])
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_big_fb@4-tiled-16bpp-rotate-90.html

  * igt@kms_big_fb@yf-tiled-32bpp-rotate-270:
    - shard-bmg:          NOTRUN -> [SKIP][2] ([Intel XE#1124]) +2 other tests skip
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_big_fb@yf-tiled-32bpp-rotate-270.html

  * igt@kms_bw@connected-linear-tiling-3-displays-target-3840x2160p:
    - shard-bmg:          NOTRUN -> [SKIP][3] ([Intel XE#7679])
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_bw@connected-linear-tiling-3-displays-target-3840x2160p.html

  * igt@kms_bw@linear-tiling-2-displays-target-1920x1080p:
    - shard-lnl:          NOTRUN -> [SKIP][4] ([Intel XE#367])
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@kms_bw@linear-tiling-2-displays-target-1920x1080p.html

  * igt@kms_ccs@bad-pixel-format-y-tiled-gen12-mc-ccs:
    - shard-bmg:          NOTRUN -> [SKIP][5] ([Intel XE#2887]) +5 other tests skip
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_ccs@bad-pixel-format-y-tiled-gen12-mc-ccs.html

  * igt@kms_ccs@ccs-on-another-bo-y-tiled-ccs:
    - shard-lnl:          NOTRUN -> [SKIP][6] ([Intel XE#2887]) +1 other test skip
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@kms_ccs@ccs-on-another-bo-y-tiled-ccs.html

  * igt@kms_chamelium_hpd@dp-hpd-with-enabled-mode:
    - shard-bmg:          NOTRUN -> [SKIP][7] ([Intel XE#2252]) +1 other test skip
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_chamelium_hpd@dp-hpd-with-enabled-mode.html

  * igt@kms_content_protection@content-type-change:
    - shard-bmg:          NOTRUN -> [SKIP][8] ([Intel XE#7642])
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_content_protection@content-type-change.html

  * igt@kms_cursor_crc@cursor-random-32x32:
    - shard-bmg:          NOTRUN -> [SKIP][9] ([Intel XE#2320]) +1 other test skip
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_cursor_crc@cursor-random-32x32.html

  * igt@kms_dsc@dsc-with-output-formats-bigjoiner:
    - shard-bmg:          NOTRUN -> [SKIP][10] ([Intel XE#8265]) +1 other test skip
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_dsc@dsc-with-output-formats-bigjoiner.html

  * igt@kms_dsc@dsc-with-output-formats-with-bpc-ultrajoiner:
    - shard-lnl:          NOTRUN -> [SKIP][11] ([Intel XE#8265])
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@kms_dsc@dsc-with-output-formats-with-bpc-ultrajoiner.html

  * igt@kms_flip@2x-plain-flip-ts-check:
    - shard-lnl:          NOTRUN -> [SKIP][12] ([Intel XE#1421])
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@kms_flip@2x-plain-flip-ts-check.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling:
    - shard-lnl:          NOTRUN -> [SKIP][13] ([Intel XE#7178] / [Intel XE#7351])
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-downscaling:
    - shard-bmg:          NOTRUN -> [SKIP][14] ([Intel XE#7178] / [Intel XE#7351])
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-downscaling.html

  * igt@kms_frontbuffer_tracking@drrs-argb161616f-draw-render:
    - shard-bmg:          NOTRUN -> [SKIP][15] ([Intel XE#7061] / [Intel XE#7356]) +1 other test skip
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_frontbuffer_tracking@drrs-argb161616f-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-1p-offscreen-pri-indfb-draw-render:
    - shard-bmg:          NOTRUN -> [SKIP][16] ([Intel XE#4141]) +4 other tests skip
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_frontbuffer_tracking@fbc-1p-offscreen-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscreen-pri-indfb-draw-blt:
    - shard-lnl:          NOTRUN -> [SKIP][17] ([Intel XE#6312]) +1 other test skip
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscreen-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-render:
    - shard-lnl:          NOTRUN -> [SKIP][18] ([Intel XE#656] / [Intel XE#7905]) +3 other tests skip
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrshdr-2p-primscrn-pri-indfb-draw-render:
    - shard-lnl:          NOTRUN -> [SKIP][19] ([Intel XE#7905]) +2 other tests skip
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@kms_frontbuffer_tracking@fbcdrrshdr-2p-primscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrshdr-argb161616f-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][20] ([Intel XE#7061])
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-10/igt@kms_frontbuffer_tracking@fbcdrrshdr-argb161616f-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrshdr-rgb565-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][21] ([Intel XE#2311]) +13 other tests skip
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcdrrshdr-rgb565-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsrhdr-1p-primscrn-pri-shrfb-draw-render:
    - shard-lnl:          NOTRUN -> [SKIP][22] ([Intel XE#7865]) +1 other test skip
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@kms_frontbuffer_tracking@fbcpsrhdr-1p-primscrn-pri-shrfb-draw-render.html

  * igt@kms_frontbuffer_tracking@plane-fbc-rte:
    - shard-bmg:          NOTRUN -> [SKIP][23] ([Intel XE#2350] / [Intel XE#7503])
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_frontbuffer_tracking@plane-fbc-rte.html

  * igt@kms_frontbuffer_tracking@psrhdr-1p-primscrn-shrfb-plflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][24] ([Intel XE#2313]) +15 other tests skip
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_frontbuffer_tracking@psrhdr-1p-primscrn-shrfb-plflip-blt.html

  * igt@kms_hdr@static-toggle-suspend@pipe-a-hdmi-a-3-xrgb16161616f:
    - shard-bmg:          [PASS][25] -> [SKIP][26] ([Intel XE#7915]) +1 other test skip
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-bmg-3/igt@kms_hdr@static-toggle-suspend@pipe-a-hdmi-a-3-xrgb16161616f.html
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-7/igt@kms_hdr@static-toggle-suspend@pipe-a-hdmi-a-3-xrgb16161616f.html

  * igt@kms_joiner@basic-max-non-joiner:
    - shard-lnl:          NOTRUN -> [SKIP][27] ([Intel XE#4298] / [Intel XE#5873])
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@kms_joiner@basic-max-non-joiner.html

  * igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner:
    - shard-bmg:          NOTRUN -> [SKIP][28] ([Intel XE#4090] / [Intel XE#7443])
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner.html

  * igt@kms_plane@pixel-format-x-tiled-modifier@pipe-b-plane-5:
    - shard-bmg:          NOTRUN -> [SKIP][29] ([Intel XE#8303]) +1 other test skip
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_plane@pixel-format-x-tiled-modifier@pipe-b-plane-5.html

  * igt@kms_pm_backlight@fade-with-dpms:
    - shard-bmg:          NOTRUN -> [SKIP][30] ([Intel XE#7376] / [Intel XE#7760] / [Intel XE#870])
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_pm_backlight@fade-with-dpms.html

  * igt@kms_psr2_sf@psr2-overlay-plane-update-continuous-sf:
    - shard-bmg:          NOTRUN -> [SKIP][31] ([Intel XE#1489]) +1 other test skip
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_psr2_sf@psr2-overlay-plane-update-continuous-sf.html

  * igt@kms_psr@pr-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][32] ([Intel XE#2234] / [Intel XE#2850]) +2 other tests skip
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_psr@pr-suspend.html

  * igt@kms_rotation_crc@primary-rotation-90:
    - shard-bmg:          NOTRUN -> [SKIP][33] ([Intel XE#3904] / [Intel XE#7342])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_rotation_crc@primary-rotation-90.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-180:
    - shard-bmg:          NOTRUN -> [SKIP][34] ([Intel XE#2330] / [Intel XE#5813])
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-10/igt@kms_rotation_crc@primary-y-tiled-reflect-x-180.html

  * igt@kms_sharpness_filter@invalid-plane-with-filter:
    - shard-bmg:          NOTRUN -> [SKIP][35] ([Intel XE#6503])
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@kms_sharpness_filter@invalid-plane-with-filter.html

  * igt@kms_vrr@seamless-rr-switch-drrs:
    - shard-bmg:          NOTRUN -> [SKIP][36] ([Intel XE#1499])
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-10/igt@kms_vrr@seamless-rr-switch-drrs.html

  * igt@xe_eudebug_online@set-breakpoint-sigint-debugger:
    - shard-bmg:          NOTRUN -> [SKIP][37] ([Intel XE#7636]) +2 other tests skip
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@xe_eudebug_online@set-breakpoint-sigint-debugger.html

  * igt@xe_evict@evict-cm-threads-small-multi-queue:
    - shard-bmg:          NOTRUN -> [SKIP][38] ([Intel XE#7140])
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@xe_evict@evict-cm-threads-small-multi-queue.html

  * igt@xe_evict@evict-mixed-many-threads-small:
    - shard-bmg:          [PASS][39] -> [INCOMPLETE][40] ([Intel XE#6321])
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-bmg-2/igt@xe_evict@evict-mixed-many-threads-small.html
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-7/igt@xe_evict@evict-mixed-many-threads-small.html

  * igt@xe_exec_basic@multigpu-once-bindexecqueue-rebind:
    - shard-bmg:          NOTRUN -> [SKIP][41] ([Intel XE#2322] / [Intel XE#7372]) +1 other test skip
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@xe_exec_basic@multigpu-once-bindexecqueue-rebind.html

  * igt@xe_exec_fault_mode@once-multi-queue-userptr-rebind-imm:
    - shard-lnl:          NOTRUN -> [SKIP][42] ([Intel XE#7136])
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@xe_exec_fault_mode@once-multi-queue-userptr-rebind-imm.html

  * igt@xe_exec_fault_mode@twice-multi-queue-userptr-rebind:
    - shard-bmg:          NOTRUN -> [SKIP][43] ([Intel XE#7136]) +2 other tests skip
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-10/igt@xe_exec_fault_mode@twice-multi-queue-userptr-rebind.html

  * igt@xe_exec_multi_queue@many-execs-preempt-mode-userptr:
    - shard-lnl:          NOTRUN -> [SKIP][44] ([Intel XE#6874]) +1 other test skip
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@xe_exec_multi_queue@many-execs-preempt-mode-userptr.html

  * igt@xe_exec_multi_queue@one-queue-preempt-mode-close-fd-smem:
    - shard-bmg:          NOTRUN -> [SKIP][45] ([Intel XE#6874]) +8 other tests skip
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@xe_exec_multi_queue@one-queue-preempt-mode-close-fd-smem.html

  * igt@xe_exec_reset@cm-multi-queue-close-execqueues:
    - shard-bmg:          NOTRUN -> [SKIP][46] ([Intel XE#7866])
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@xe_exec_reset@cm-multi-queue-close-execqueues.html

  * igt@xe_exec_reset@multi-queue-cat-error:
    - shard-lnl:          NOTRUN -> [SKIP][47] ([Intel XE#7866])
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@xe_exec_reset@multi-queue-cat-error.html

  * igt@xe_exec_threads@threads-multi-queue-mixed-shared-vm-userptr-rebind:
    - shard-bmg:          NOTRUN -> [SKIP][48] ([Intel XE#7138]) +1 other test skip
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@xe_exec_threads@threads-multi-queue-mixed-shared-vm-userptr-rebind.html

  * igt@xe_multigpu_svm@mgpu-migration-prefetch:
    - shard-bmg:          NOTRUN -> [SKIP][49] ([Intel XE#6964])
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@xe_multigpu_svm@mgpu-migration-prefetch.html

  * igt@xe_oa@oa-tlb-invalidate:
    - shard-bmg:          NOTRUN -> [SKIP][50] ([Intel XE#2248] / [Intel XE#7325] / [Intel XE#7393])
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@xe_oa@oa-tlb-invalidate.html

  * igt@xe_pat@l2-flush-opt-svm-pat-restrict:
    - shard-bmg:          NOTRUN -> [SKIP][51] ([Intel XE#7590])
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@xe_pat@l2-flush-opt-svm-pat-restrict.html

  * igt@xe_pm@d3cold-basic-exec:
    - shard-bmg:          NOTRUN -> [SKIP][52] ([Intel XE#2284] / [Intel XE#7370])
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@xe_pm@d3cold-basic-exec.html

  * igt@xe_query@multigpu-query-gt-list:
    - shard-bmg:          NOTRUN -> [SKIP][53] ([Intel XE#944])
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-3/igt@xe_query@multigpu-query-gt-list.html

  * igt@xe_survivability@runtime-survivability:
    - shard-bmg:          [PASS][54] -> [DMESG-WARN][55] ([Intel XE#6627] / [Intel XE#7419])
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-bmg-7/igt@xe_survivability@runtime-survivability.html
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-1/igt@xe_survivability@runtime-survivability.html

  
#### Possible fixes ####

  * igt@kms_async_flips@alternate-sync-async-flip:
    - shard-bmg:          [FAIL][56] ([Intel XE#3718] / [Intel XE#6078]) -> [PASS][57]
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-bmg-9/igt@kms_async_flips@alternate-sync-async-flip.html
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-10/igt@kms_async_flips@alternate-sync-async-flip.html

  * igt@kms_async_flips@alternate-sync-async-flip@pipe-a-dp-2:
    - shard-bmg:          [FAIL][58] ([Intel XE#6078]) -> [PASS][59]
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-bmg-9/igt@kms_async_flips@alternate-sync-async-flip@pipe-a-dp-2.html
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-10/igt@kms_async_flips@alternate-sync-async-flip@pipe-a-dp-2.html

  * igt@kms_flip@flip-vs-expired-vblank@c-edp1:
    - shard-lnl:          [FAIL][60] ([Intel XE#301] / [Intel XE#3149]) -> [PASS][61] +1 other test pass
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-4/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html

  * igt@kms_hdr@static-toggle-dpms@pipe-a-hdmi-a-3-xrgb2101010:
    - shard-bmg:          [SKIP][62] ([Intel XE#7915]) -> [PASS][63] +1 other test pass
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-bmg-8/igt@kms_hdr@static-toggle-dpms@pipe-a-hdmi-a-3-xrgb2101010.html
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-5/igt@kms_hdr@static-toggle-dpms@pipe-a-hdmi-a-3-xrgb2101010.html

  * igt@xe_exec_system_allocator@threads-many-large-execqueues-mmap-remap-ro:
    - shard-lnl:          [ABORT][64] ([Intel XE#8007]) -> [PASS][65]
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-lnl-2/igt@xe_exec_system_allocator@threads-many-large-execqueues-mmap-remap-ro.html
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-8/igt@xe_exec_system_allocator@threads-many-large-execqueues-mmap-remap-ro.html

  * igt@xe_fault_injection@oa-add-config-fail-xe_oa_alloc_regs:
    - shard-bmg:          [ABORT][66] ([Intel XE#8007]) -> [PASS][67]
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-bmg-5/igt@xe_fault_injection@oa-add-config-fail-xe_oa_alloc_regs.html
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-10/igt@xe_fault_injection@oa-add-config-fail-xe_oa_alloc_regs.html

  
#### Warnings ####

  * igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions:
    - shard-lnl:          [SKIP][68] ([Intel XE#309] / [Intel XE#7343] / [Intel XE#7935]) -> [SKIP][69] ([Intel XE#309] / [Intel XE#7343])
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-lnl-8/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions.html
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-lnl-2/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-bmg:          [SKIP][70] ([Intel XE#3544] / [Intel XE#7916]) -> [SKIP][71] ([Intel XE#3544] / [Intel XE#7915] / [Intel XE#7916])
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-bmg-5/igt@kms_hdr@brightness-with-hdr.html
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-6/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_hdr@brightness-with-hdr@pipe-a-hdmi-a-3-xrgb16161616f:
    - shard-bmg:          [SKIP][72] ([Intel XE#7916]) -> [SKIP][73] ([Intel XE#7915]) +1 other test skip
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-bmg-5/igt@kms_hdr@brightness-with-hdr@pipe-a-hdmi-a-3-xrgb16161616f.html
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-6/igt@kms_hdr@brightness-with-hdr@pipe-a-hdmi-a-3-xrgb16161616f.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-bmg:          [SKIP][74] ([Intel XE#2426] / [Intel XE#5848]) -> [FAIL][75] ([Intel XE#1729] / [Intel XE#7424])
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526/shard-bmg-9/igt@kms_tiled_display@basic-test-pattern.html
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-168632v1/shard-bmg-10/igt@kms_tiled_display@basic-test-pattern.html

  
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1421]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1421
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
  [Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2248]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2248
  [Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
  [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#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
  [Intel XE#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327
  [Intel XE#2330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2330
  [Intel XE#2350]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2350
  [Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
  [Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
  [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#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#4090]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4090
  [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
  [Intel XE#4298]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4298
  [Intel XE#5813]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5813
  [Intel XE#5848]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5848
  [Intel XE#5873]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5873
  [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#6503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6503
  [Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
  [Intel XE#6627]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6627
  [Intel XE#6874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6874
  [Intel XE#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
  [Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
  [Intel XE#7136]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7136
  [Intel XE#7138]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7138
  [Intel XE#7140]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7140
  [Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
  [Intel XE#7325]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7325
  [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#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
  [Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
  [Intel XE#7370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7370
  [Intel XE#7372]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7372
  [Intel XE#7376]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7376
  [Intel XE#7393]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7393
  [Intel XE#7419]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7419
  [Intel XE#7424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7424
  [Intel XE#7443]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7443
  [Intel XE#7503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7503
  [Intel XE#7590]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7590
  [Intel XE#7636]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7636
  [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#7760]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7760
  [Intel XE#7865]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7865
  [Intel XE#7866]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7866
  [Intel XE#7905]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7905
  [Intel XE#7915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7915
  [Intel XE#7916]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7916
  [Intel XE#7935]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7935
  [Intel XE#8007]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8007
  [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#870]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/870
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944


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

  * Linux: xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526 -> xe-pw-168632v1

  IGT_8966: 9b33225c761bfe8c8c266bc56558d75c700029fb @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-5267-5447491819dcc3d10fd362c7bfbf877d343f6526: 5447491819dcc3d10fd362c7bfbf877d343f6526
  xe-pw-168632v1: 168632v1

== Logs ==

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

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

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

* RE: [PATCH v2 01/28] drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry
  2026-06-16 20:08 ` [PATCH v2 01/28] drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry Imre Deak
@ 2026-06-22 13:11   ` Kahola, Mika
  2026-06-22 21:53   ` Michał Grzelak
  1 sibling, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-22 13:11 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.08
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 01/28] drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry
> 
> Rename intel_dp_link_config to intel_dp_link_config_entry to prepare
> for tracking a link configuration in both an internal packed and a
> public unpacked format. A follow-up change will add
> struct intel_dp_link_config representing the public unpacked format.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  .../gpu/drm/i915/display/intel_display_types.h   |  2 +-
>  drivers/gpu/drm/i915/display/intel_dp.c          | 16 ++++++++--------
>  2 files changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 6cd102a3b610c..c71edea145878 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1840,7 +1840,7 @@ struct intel_dp {
>  #define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
>  #define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
>  						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
> -		struct intel_dp_link_config {
> +		struct intel_dp_link_config_entry {
>  			u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
>  			u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
>  		} configs[INTEL_DP_MAX_LINK_CONFIGS];
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 3569e61e7feea..00eb3f5103383 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -699,18 +699,18 @@ int intel_dp_rate_index(const int *rates, int len, int rate)
>  }
> 
>  static int intel_dp_link_config_rate(struct intel_dp *intel_dp,
> -				     const struct intel_dp_link_config *lc)
> +				     const struct intel_dp_link_config_entry *lc)
>  {
>  	return intel_dp_common_rate(intel_dp, lc->link_rate_idx);
>  }
> 
> -static int intel_dp_link_config_lane_count(const struct intel_dp_link_config *lc)
> +static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lc)
>  {
>  	return 1 << lc->lane_count_exp;
>  }
> 
>  static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
> -				   const struct intel_dp_link_config *lc)
> +				   const struct intel_dp_link_config_entry *lc)
>  {
>  	return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(intel_dp, lc),
>  					 intel_dp_link_config_lane_count(lc));
> @@ -719,8 +719,8 @@ static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
>  static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
>  {
>  	struct intel_dp *intel_dp = (struct intel_dp *)p;	/* remove const */
> -	const struct intel_dp_link_config *lc_a = a;
> -	const struct intel_dp_link_config *lc_b = b;
> +	const struct intel_dp_link_config_entry *lc_a = a;
> +	const struct intel_dp_link_config_entry *lc_b = b;
>  	int bw_a = intel_dp_link_config_bw(intel_dp, lc_a);
>  	int bw_b = intel_dp_link_config_bw(intel_dp, lc_b);
> 
> @@ -734,7 +734,7 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
>  static void intel_dp_link_config_init(struct intel_dp *intel_dp)
>  {
>  	struct intel_display *display = to_intel_display(intel_dp);
> -	struct intel_dp_link_config *lc;
> +	struct intel_dp_link_config_entry *lc;
>  	int num_common_lane_configs;
>  	int i;
>  	int j;
> @@ -769,7 +769,7 @@ static void intel_dp_link_config_init(struct intel_dp *intel_dp)
>  void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
>  {
>  	struct intel_display *display = to_intel_display(intel_dp);
> -	const struct intel_dp_link_config *lc;
> +	const struct intel_dp_link_config_entry *lc;
> 
>  	if (drm_WARN_ON(display->drm, idx < 0 || idx >= intel_dp->link.num_configs))
>  		idx = 0;
> @@ -788,7 +788,7 @@ int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lan
>  	int i;
> 
>  	for (i = 0; i < intel_dp->link.num_configs; i++) {
> -		const struct intel_dp_link_config *lc = &intel_dp->link.configs[i];
> +		const struct intel_dp_link_config_entry *lc = &intel_dp->link.configs[i];
> 
>  		if (lc->lane_count_exp == lane_count_exp &&
>  		    lc->link_rate_idx == link_rate_idx)
> --
> 2.49.1


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

* RE: [PATCH v2 02/28] drm/i915/dp: Add struct intel_dp_link_config
  2026-06-16 20:08 ` [PATCH v2 02/28] drm/i915/dp: Add struct intel_dp_link_config Imre Deak
@ 2026-06-22 13:11   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-22 13:11 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.08
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 02/28] drm/i915/dp: Add struct intel_dp_link_config
> 
> Add a struct representing the public unpacked format of a link
> configuration. This will be used by the DP link capability API added
> as a follow-up, and by DP code in general that needs to track a link
> configuration.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display_types.h | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index c71edea145878..c092c81ed2eb6 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1800,6 +1800,14 @@ struct intel_psr {
>  	struct ref_tracker *vblank_wakeref;
>  };
> 
> +struct intel_dp_link_config {
> +	int rate;
> +	int lane_count;
> +};
> +
> +#define INTEL_DP_LINK_CONFIG_NULL \
> +	((struct intel_dp_link_config){})
> +
>  struct intel_dp {
>  	intel_reg_t output_reg;
>  	u32 DP;
> --
> 2.49.1


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

* RE: [PATCH v2 03/28] drm/i915/dp_link_caps: Introduce DP link capability module
  2026-06-16 20:08 ` [PATCH v2 03/28] drm/i915/dp_link_caps: Introduce DP link capability module Imre Deak
@ 2026-06-22 13:21   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-22 13:21 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nikula, Jani

> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.08
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Nikula, Jani <jani.nikula@intel.com>
> Subject: [PATCH v2 03/28] drm/i915/dp_link_caps: Introduce DP link capability module
> 
> Start isolating the DP link capability logic from the generic DP code by
> adding a separate intel_dp_link_caps module and a corresponding state
> object.
> 
> Allocate the state so it can remain opaque within its module.
> 
> Follow-up changes will move link capability helpers and state from
> intel_dp.c and intel_dp_link_training.c to the new module and state.
> 
> v2: Remove unnecessary function documentation. (Jani)
> 
> Cc: Jani Nikula <jani.nikula@intel.com>

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/Makefile                 |  1 +
>  .../drm/i915/display/intel_display_types.h    |  2 ++
>  drivers/gpu/drm/i915/display/intel_dp.c       |  9 ++++++
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 30 +++++++++++++++++++
>  .../gpu/drm/i915/display/intel_dp_link_caps.h | 12 ++++++++
>  drivers/gpu/drm/xe/Makefile                   |  1 +
>  6 files changed, 55 insertions(+)
>  create mode 100644 drivers/gpu/drm/i915/display/intel_dp_link_caps.c
>  create mode 100644 drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> 
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> index 07802a7f4ce50..81e16f377641b 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -356,6 +356,7 @@ i915-y += \
>  	display/intel_dp_aux.o \
>  	display/intel_dp_aux_backlight.o \
>  	display/intel_dp_hdcp.o \
> +	display/intel_dp_link_caps.o \
>  	display/intel_dp_link_training.o \
>  	display/intel_dp_mst.o \
>  	display/intel_dp_test.o \
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index c092c81ed2eb6..10933ccdeb31e 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -58,6 +58,7 @@ struct cec_notifier;
>  struct drm_printer;
>  struct intel_connector;
>  struct intel_ddi_buf_trans;
> +struct intel_dp_link_caps;
>  struct intel_dp_link_training;
>  struct intel_fbc;
>  struct intel_global_objs_state;
> @@ -1867,6 +1868,7 @@ struct intel_dp {
>  		int force_lane_count;
>  		int force_rate;
>  		struct intel_dp_link_training *training;
> +		struct intel_dp_link_caps *caps;
>  	} link;
>  	bool reset_link_params;
>  	int mso_link_count;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 00eb3f5103383..fa095c4db7fe6 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -71,6 +71,7 @@
>  #include "intel_dp.h"
>  #include "intel_dp_aux.h"
>  #include "intel_dp_hdcp.h"
> +#include "intel_dp_link_caps.h"
>  #include "intel_dp_link_training.h"
>  #include "intel_dp_mst.h"
>  #include "intel_dp_test.h"
> @@ -7458,10 +7459,18 @@ int intel_dp_link_init(struct intel_dp *intel_dp)
>  	if (!intel_dp->link.training)
>  		return -ENOMEM;
> 
> +	intel_dp->link.caps = intel_dp_link_caps_init(intel_dp);
> +	if (!intel_dp->link.caps) {
> +		intel_dp_link_training_cleanup(intel_dp->link.training);
> +
> +		return -ENOMEM;
> +	}
> +
>  	return 0;
>  }
> 
>  void intel_dp_link_cleanup(struct intel_dp *intel_dp)
>  {
> +	intel_dp_link_caps_cleanup(intel_dp->link.caps);
>  	intel_dp_link_training_cleanup(intel_dp->link.training);
>  }
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> new file mode 100644
> index 0000000000000..63989d97effd7
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -0,0 +1,30 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2026 Intel Corporation
> + */
> +
> +#include <linux/slab.h>
> +
> +#include "intel_dp_link_caps.h"
> +
> +struct intel_dp_link_caps {
> +	struct intel_dp *dp;
> +};
> +
> +struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
> +{
> +	struct intel_dp_link_caps *link_caps;
> +
> +	link_caps = kzalloc_obj(*link_caps);
> +	if (!link_caps)
> +		return NULL;
> +
> +	link_caps->dp = intel_dp;
> +
> +	return link_caps;
> +}
> +
> +void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps)
> +{
> +	kfree(link_caps);
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> new file mode 100644
> index 0000000000000..050b279463d6e
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -0,0 +1,12 @@
> +/* SPDX-License-Identifier: MIT */
> +/* Copyright © 2026 Intel Corporation */
> +
> +#ifndef __INTEL_DP_LINK_CAPS_H__
> +#define __INTEL_DP_LINK_CAPS_H__
> +
> +struct intel_dp;
> +
> +struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
> +void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
> +
> +#endif /* __INTEL_DP_LINK_CAPS_H__ */
> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> index 8e7b146880f46..e5a04253e73bf 100644
> --- a/drivers/gpu/drm/xe/Makefile
> +++ b/drivers/gpu/drm/xe/Makefile
> @@ -278,6 +278,7 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \
>  	i915-display/intel_dp_aux.o \
>  	i915-display/intel_dp_aux_backlight.o \
>  	i915-display/intel_dp_hdcp.o \
> +	i915-display/intel_dp_link_caps.o \
>  	i915-display/intel_dp_link_training.o \
>  	i915-display/intel_dp_mst.o \
>  	i915-display/intel_dp_test.o \
> --
> 2.49.1


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

* Re: [PATCH v2 01/28] drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry
  2026-06-16 20:08 ` [PATCH v2 01/28] drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry Imre Deak
  2026-06-22 13:11   ` Kahola, Mika
@ 2026-06-22 21:53   ` Michał Grzelak
  2026-06-24 15:32     ` Imre Deak
  1 sibling, 1 reply; 68+ messages in thread
From: Michał Grzelak @ 2026-06-22 21:53 UTC (permalink / raw)
  To: Imre Deak; +Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org

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

On Tue, 16 Jun 2026, Imre Deak wrote:
> Rename intel_dp_link_config to intel_dp_link_config_entry to prepare
> for tracking a link configuration in both an internal packed and a
> public unpacked format. A follow-up change will add
> struct intel_dp_link_config representing the public unpacked format.
>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
> .../gpu/drm/i915/display/intel_display_types.h   |  2 +-
> drivers/gpu/drm/i915/display/intel_dp.c          | 16 ++++++++--------
> 2 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 6cd102a3b610c..c71edea145878 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1840,7 +1840,7 @@ struct intel_dp {
> #define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
> #define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
> 						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
> -		struct intel_dp_link_config {
> +		struct intel_dp_link_config_entry {
> 			u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
> 			u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
> 		} configs[INTEL_DP_MAX_LINK_CONFIGS];
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 3569e61e7feea..00eb3f5103383 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -699,18 +699,18 @@ int intel_dp_rate_index(const int *rates, int len, int rate)
> }
>
> static int intel_dp_link_config_rate(struct intel_dp *intel_dp,
> -				     const struct intel_dp_link_config *lc)
> +				     const struct intel_dp_link_config_entry *lc)
> {
> 	return intel_dp_common_rate(intel_dp, lc->link_rate_idx);

I'm wondering about s/lc/lce/ and s/lc_/lce_/ since I assume the var
name derives from link_config, and now it will be changed. This could be
beneficial given that next patch introduces back struct
intel_dp_link_config. Whether it applies or not:

Reviewed-by: Michał Grzelak <michal.grzelak@intel.com>

BR,
Michał

> }
>
> -static int intel_dp_link_config_lane_count(const struct intel_dp_link_config *lc)
> +static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lc)
> {
> 	return 1 << lc->lane_count_exp;
> }
>
> static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
> -				   const struct intel_dp_link_config *lc)
> +				   const struct intel_dp_link_config_entry *lc)
> {
> 	return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(intel_dp, lc),
> 					 intel_dp_link_config_lane_count(lc));
> @@ -719,8 +719,8 @@ static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
> static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
> {
> 	struct intel_dp *intel_dp = (struct intel_dp *)p;	/* remove const */
> -	const struct intel_dp_link_config *lc_a = a;
> -	const struct intel_dp_link_config *lc_b = b;
> +	const struct intel_dp_link_config_entry *lc_a = a;
> +	const struct intel_dp_link_config_entry *lc_b = b;
> 	int bw_a = intel_dp_link_config_bw(intel_dp, lc_a);
> 	int bw_b = intel_dp_link_config_bw(intel_dp, lc_b);
>
> @@ -734,7 +734,7 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
> static void intel_dp_link_config_init(struct intel_dp *intel_dp)
> {
> 	struct intel_display *display = to_intel_display(intel_dp);
> -	struct intel_dp_link_config *lc;
> +	struct intel_dp_link_config_entry *lc;
> 	int num_common_lane_configs;
> 	int i;
> 	int j;
> @@ -769,7 +769,7 @@ static void intel_dp_link_config_init(struct intel_dp *intel_dp)
> void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
> {
> 	struct intel_display *display = to_intel_display(intel_dp);
> -	const struct intel_dp_link_config *lc;
> +	const struct intel_dp_link_config_entry *lc;
>
> 	if (drm_WARN_ON(display->drm, idx < 0 || idx >= intel_dp->link.num_configs))
> 		idx = 0;
> @@ -788,7 +788,7 @@ int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lan
> 	int i;
>
> 	for (i = 0; i < intel_dp->link.num_configs; i++) {
> -		const struct intel_dp_link_config *lc = &intel_dp->link.configs[i];
> +		const struct intel_dp_link_config_entry *lc = &intel_dp->link.configs[i];
>
> 		if (lc->lane_count_exp == lane_count_exp &&
> 		    lc->link_rate_idx == link_rate_idx)
> -- 
> 2.49.1
>
>

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

* RE: [PATCH v2 12/28] drm/i915/dp_link_caps: Rename helper updating the link configurations
  2026-06-16 20:08 ` [PATCH v2 12/28] drm/i915/dp_link_caps: Rename helper updating the link configurations Imre Deak
@ 2026-06-23  5:11   ` Garg, Nemesa
  0 siblings, 0 replies; 68+ messages in thread
From: Garg, Nemesa @ 2026-06-23  5:11 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre
> Deak
> Sent: Wednesday, June 17, 2026 1:39 AM
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 12/28] drm/i915/dp_link_caps: Rename helper updating
> the link configurations
> 
> Rename the helper updating link configurations to
> intel_dp_link_caps_update() to better reflect its functionality.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c           | 2 +-
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.c | 2 +-
> drivers/gpu/drm/i915/display/intel_dp_link_caps.h | 2 +-
>  3 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index c4b650431eff5..65a13b2f7584d 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -720,7 +720,7 @@ static bool intel_dp_set_common_link_params(struct
> intel_dp *intel_dp)
>  	if (intel_dp_set_max_common_lane_count(intel_dp))
>  		params_changed = true;
> 
> -	intel_dp_link_config_init(intel_dp);
> +	intel_dp_link_caps_update(intel_dp);
> 
>  	return params_changed;
>  }
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 05ec933c74407..2074952931738 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -131,7 +131,7 @@ static int link_config_cmp_by_bw(const void *a, const
> void *b, const void *p)
>  	       intel_dp_link_config_rate(intel_dp, lc_b);  }
> 
> -void intel_dp_link_config_init(struct intel_dp *intel_dp)
> +void intel_dp_link_caps_update(struct intel_dp *intel_dp)
>  {
>  	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	struct intel_display *display = to_intel_display(intel_dp); diff --git
> a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index dab956e804b95..aed2122a05d24 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -20,7 +20,7 @@ void intel_dp_link_caps_get_forced_params(struct
> intel_dp_link_caps *link_caps,  int intel_dp_link_config_index(struct intel_dp
> *intel_dp, int link_rate, int lane_count);  void intel_dp_link_config_get(struct
> intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
> 
> -void intel_dp_link_config_init(struct intel_dp *intel_dp);
> +void intel_dp_link_caps_update(struct intel_dp *intel_dp);
> 
LGTM,
Reviewed-by: Nemesa Garg <nemesa.garg@intel.com>

>  void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
> 
> --
> 2.49.1


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

* RE: [PATCH v2 15/28] drm/i915/dp_link_caps: Add helper to print all supported link rates
  2026-06-16 20:08 ` [PATCH v2 15/28] drm/i915/dp_link_caps: Add helper to print all supported link rates Imre Deak
@ 2026-06-23  5:21   ` Garg, Nemesa
  0 siblings, 0 replies; 68+ messages in thread
From: Garg, Nemesa @ 2026-06-23  5:21 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Nikula, Jani



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre
> Deak
> Sent: Wednesday, June 17, 2026 1:39 AM
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Nikula, Jani <jani.nikula@intel.com>
> Subject: [PATCH v2 15/28] drm/i915/dp_link_caps: Add helper to print all
> supported link rates
> 
> Add intel_dp_link_caps_print_rates() to print all the supported link rates
> tracked by the link_caps module. This prepares for tracking these capabilities
> internally within the link caps module.
> 
> Suggested-by: Jani Nikula <jani.nikula@intel.com>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c           |  4 +---
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.c | 14 ++++++++++++++
> drivers/gpu/drm/i915/display/intel_dp_link_caps.h |  2 ++
>  3 files changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index d2b9b6fce2b32..f9c3d3561c417 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1543,9 +1543,7 @@ static void intel_dp_print_rates(struct intel_dp
> *intel_dp)
>  	seq_buf_print_array(&s, intel_dp->sink_rates, intel_dp-
> >num_sink_rates);
>  	drm_dbg_kms(display->drm, "sink rates: %s\n", seq_buf_str(&s));
> 
> -	seq_buf_clear(&s);
> -	seq_buf_print_array(&s, intel_dp->common_rates, intel_dp-
> >num_common_rates);
> -	drm_dbg_kms(display->drm, "common rates: %s\n",
> seq_buf_str(&s));
> +	intel_dp_link_caps_print_common_rates(intel_dp->link.caps);
>  }
> 
>  int
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 679d59cc256c9..13f9bfd5d7bad 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -6,6 +6,7 @@
>  #include <linux/bitops.h>
>  #include <linux/debugfs.h>
>  #include <linux/log2.h>
> +#include <linux/seq_buf.h>
>  #include <linux/slab.h>
>  #include <linux/sort.h>
>  #include <linux/string.h>
> @@ -66,6 +67,19 @@ int intel_dp_max_common_rate(struct intel_dp
> *intel_dp)
>  	return intel_dp_common_rate(intel_dp, intel_dp-
> >num_common_rates - 1);  }
> 
> +void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps
> +*link_caps) {
> +	struct intel_dp *intel_dp = link_caps->dp;
> +	struct intel_display *display = to_intel_display(intel_dp);
> +	DECLARE_SEQ_BUF(s, 128);
> +	int i;
> +
> +	for (i = 0; i < intel_dp->num_common_rates; i++)
> +		seq_buf_printf(&s, "%s%d", i ? ", " : "", intel_dp-
> >common_rates[i]);
> +
> +	drm_dbg_kms(display->drm, "common rates: %s\n",
> seq_buf_str(&s)); }
> +
>  static int forced_lane_count(struct intel_dp *intel_dp)  {
>  	struct intel_dp_link_caps *link_caps = intel_dp->link.caps; diff --git
> a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 09e580bc5c9b3..7333df6b82f97 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -16,6 +16,8 @@ int intel_dp_common_len_rate_limit(const struct
> intel_dp *intel_dp,  int intel_dp_common_rate(struct intel_dp *intel_dp, int
> index);  int intel_dp_max_common_rate(struct intel_dp *intel_dp);
> 
> +void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps
> +*link_caps);
> +
LGTM,
Reviewed-by: Nemesa Garg <nemesa.garg@intel.com>

>  void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps
> *link_caps,
>  					  struct intel_dp_link_config
> *forced_params);
> 
> --
> 2.49.1


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

* RE: [PATCH v2 27/28] drm/i915/dp_link_caps: Pass link_caps to config update/lookup helpers
  2026-06-16 20:08 ` [PATCH v2 27/28] drm/i915/dp_link_caps: Pass link_caps to config update/lookup helpers Imre Deak
@ 2026-06-23  5:25   ` Garg, Nemesa
  0 siblings, 0 replies; 68+ messages in thread
From: Garg, Nemesa @ 2026-06-23  5:25 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org



> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre
> Deak
> Sent: Wednesday, June 17, 2026 1:39 AM
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 27/28] drm/i915/dp_link_caps: Pass link_caps to config
> update/lookup helpers
> 
> Pass the link_caps pointer to the update/lookup helpers in
> intel_dp_link_caps.c, as it holds the state with the relevant information.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c            |  2 +-
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.c  | 14 +++++++-------
> drivers/gpu/drm/i915/display/intel_dp_link_caps.h  |  8 +++++---
> .../gpu/drm/i915/display/intel_dp_link_training.c  |  5 +++--
>  4 files changed, 16 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index b63c6f047f83a..07266f4e6835b 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -699,7 +699,7 @@ static bool intel_dp_set_common_link_params(struct
> intel_dp *intel_dp)
>  	bool params_changed = false;
> 
>  	intel_dp_get_common_rates(intel_dp, common_rates,
> &num_common_rates);
> -	if (intel_dp_link_caps_update(intel_dp,
> +	if (intel_dp_link_caps_update(intel_dp->link.caps,
>  				      common_rates, num_common_rates,
> 
> intel_dp_get_max_common_lane_count(intel_dp)))
>  		params_changed = true;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index fc1061149ef2e..c5701f02fbf69 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -266,10 +266,10 @@ static int link_config_cmp_by_bw(const void *a,
> const void *b, const void *p)  }
> 
>  /* Return %true if the supported link parameters have changed. */ -bool
> intel_dp_link_caps_update(struct intel_dp *intel_dp,
> +bool intel_dp_link_caps_update(struct intel_dp_link_caps *link_caps,
>  			       const int *rates, int num_rates, int
> max_lane_count)  {
> -	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp *intel_dp = link_caps->dp;
>  	struct intel_display *display = to_intel_display(intel_dp);
>  	struct intel_dp_link_config_entry *lc;
>  	bool link_params_changed = false;
> @@ -322,10 +322,10 @@ bool intel_dp_link_caps_update(struct intel_dp
> *intel_dp,
>  	return link_params_changed;
>  }
> 
> -void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate,
> int *lane_count)
> +void intel_dp_link_config_get(struct intel_dp_link_caps *link_caps,
> +			      int idx, int *link_rate, int *lane_count)
>  {
> -	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> -	struct intel_display *display = to_intel_display(intel_dp);
> +	struct intel_display *display = to_intel_display(link_caps->dp);
>  	const struct intel_dp_link_config_entry *lc;
> 
>  	if (drm_WARN_ON(display->drm, idx < 0 || idx >= link_caps-
> >num_configs)) @@ -337,9 +337,9 @@ void intel_dp_link_config_get(struct
> intel_dp *intel_dp, int idx, int *link_rate
>  	*lane_count = intel_dp_link_config_lane_count(lc);
>  }
> 
> -int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int
> lane_count)
> +int intel_dp_link_config_index(struct intel_dp_link_caps *link_caps,
> +			       int link_rate, int lane_count)
>  {
> -	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	int link_rate_idx = intel_dp_rate_index(link_caps->rates, link_caps-
> >num_rates,
>  						link_rate);
>  	int lane_count_exp = ilog2(lane_count); diff --git
> a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index fa45a46723059..9256f02fed11e 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -24,8 +24,10 @@ void intel_dp_link_caps_print_common_rates(struct
> intel_dp_link_caps *link_caps)  void
> intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
>  					  struct intel_dp_link_config
> *forced_params);
> 
> -int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int
> lane_count); -void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx,
> int *link_rate, int *lane_count);
> +int intel_dp_link_config_index(struct intel_dp_link_caps *link_caps,
> +			       int link_rate, int lane_count); void
> +intel_dp_link_config_get(struct intel_dp_link_caps *link_caps,
> +			      int idx, int *link_rate, int *lane_count);
> 
>  void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
>  				       struct intel_dp_link_config
> *max_link_limits); @@ -33,7 +35,7 @@ bool
> intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
>  				       const struct intel_dp_link_config
> *max_link_limits);  void intel_dp_link_caps_reset_max_limits(struct
> intel_dp_link_caps *link_caps);
> 
> -bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
> +bool intel_dp_link_caps_update(struct intel_dp_link_caps *link_caps,
>  			       const int *rates, int num_rates, int
> max_lane_count);  void intel_dp_link_caps_reset(struct intel_dp_link_caps
> *link_caps);
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> index 9d9911ebad439..0d4a0bf1dac53 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -1858,9 +1858,10 @@ static bool
> reduce_link_params_in_bw_order(struct intel_dp *intel_dp,
> 
>  	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> 
> -	i = intel_dp_link_config_index(intel_dp, crtc_state->port_clock,
> crtc_state->lane_count);
> +	i = intel_dp_link_config_index(intel_dp->link.caps,
> +				       crtc_state->port_clock, crtc_state-
> >lane_count);
>  	for (i--; i >= 0; i--) {
> -		intel_dp_link_config_get(intel_dp, i, &link_rate, &lane_count);
> +		intel_dp_link_config_get(intel_dp->link.caps, i, &link_rate,
> +&lane_count);
> 
LGTM,
Reviewed-by: Nemesa Garg <nemesa.garg@intel.com>

>  		if ((forced_params.rate &&
>  		     forced_params.rate != link_rate) ||
> --
> 2.49.1


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

* RE: [PATCH v2 26/28] drm/i915/dp_link_caps: Pass link_caps to static functions
  2026-06-16 20:08 ` [PATCH v2 26/28] drm/i915/dp_link_caps: Pass link_caps to static functions Imre Deak
@ 2026-06-23  5:29   ` Garg, Nemesa
  0 siblings, 0 replies; 68+ messages in thread
From: Garg, Nemesa @ 2026-06-23  5:29 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre
> Deak
> Sent: Wednesday, June 17, 2026 1:39 AM
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 26/28] drm/i915/dp_link_caps: Pass link_caps to static
> functions
> 
> Pass the link_caps pointer to static functions in intel_dp_link_caps.c, as it
> holds the state with the relevant information.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 37 ++++++++++---------
>  1 file changed, 19 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 43427e7cf422a..fc1061149ef2e 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -118,10 +118,8 @@ int
> intel_dp_link_caps_max_common_lane_count(struct intel_dp_link_caps
> *link_cap
>  	return link_caps->max_lane_count;
>  }
> 
> -static int forced_lane_count(struct intel_dp *intel_dp)
> +static int forced_lane_count(struct intel_dp_link_caps *link_caps)
>  {
> -	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> -
>  	if (!link_caps->forced_params.lane_count)
>  		return 0;
> 
> @@ -129,9 +127,9 @@ static int forced_lane_count(struct intel_dp *intel_dp)
>  		     1,
> intel_dp_link_caps_max_common_lane_count(link_caps));
>  }
> 
> -static int forced_link_rate(struct intel_dp *intel_dp)
> +static int forced_link_rate(struct intel_dp_link_caps *link_caps)
>  {
> -	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp *intel_dp = link_caps->dp;
>  	int len;
> 
>  	if (!link_caps->forced_params.rate)
> @@ -147,14 +145,14 @@ static int forced_link_rate(struct intel_dp *intel_dp)
> void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps
> *link_caps,
>  					  struct intel_dp_link_config
> *forced_params)  {
> -	forced_params->rate = forced_link_rate(link_caps->dp);
> -	forced_params->lane_count = forced_lane_count(link_caps->dp);
> +	forced_params->rate = forced_link_rate(link_caps);
> +	forced_params->lane_count = forced_lane_count(link_caps);
>  }
> 
> -static int intel_dp_link_config_rate(struct intel_dp *intel_dp,
> +static int intel_dp_link_config_rate(struct intel_dp_link_caps
> +*link_caps,
>  				     const struct intel_dp_link_config_entry *lc)
> {
> -	return intel_dp_common_rate(intel_dp, lc->link_rate_idx);
> +	return intel_dp_common_rate(link_caps->dp, lc->link_rate_idx);
>  }
> 
>  static int intel_dp_link_config_lane_count(const struct
> intel_dp_link_config_entry *lc) @@ -243,26 +241,28 @@ void
> intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps)
>  	reset_max_link_limits_no_update(link_caps);
>  }
> 
> -static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
> +static int intel_dp_link_config_bw(struct intel_dp_link_caps
> +*link_caps,
>  				   const struct intel_dp_link_config_entry *lc)
> {
> -	return
> drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(intel_dp, lc),
> +	return
> drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(link_caps,
> +lc),
>  					 intel_dp_link_config_lane_count(lc));
>  }
> 
>  static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
> {
>  	struct intel_dp *intel_dp = (struct intel_dp *)p;	/* remove const */
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +
>  	const struct intel_dp_link_config_entry *lc_a = a;
>  	const struct intel_dp_link_config_entry *lc_b = b;
> -	int bw_a = intel_dp_link_config_bw(intel_dp, lc_a);
> -	int bw_b = intel_dp_link_config_bw(intel_dp, lc_b);
> +	int bw_a = intel_dp_link_config_bw(link_caps, lc_a);
> +	int bw_b = intel_dp_link_config_bw(link_caps, lc_b);
> 
>  	if (bw_a != bw_b)
>  		return bw_a - bw_b;
> 
> -	return intel_dp_link_config_rate(intel_dp, lc_a) -
> -	       intel_dp_link_config_rate(intel_dp, lc_b);
> +	return intel_dp_link_config_rate(link_caps, lc_a) -
> +	       intel_dp_link_config_rate(link_caps, lc_b);
>  }
> 
>  /* Return %true if the supported link parameters have changed. */ @@ -
> 333,7 +333,7 @@ void intel_dp_link_config_get(struct intel_dp *intel_dp, int
> idx, int *link_rate
> 
>  	lc = &link_caps->configs[idx];
> 
> -	*link_rate = intel_dp_link_config_rate(intel_dp, lc);
> +	*link_rate = intel_dp_link_config_rate(link_caps, lc);
>  	*lane_count = intel_dp_link_config_lane_count(lc);
>  }
> 
> @@ -414,8 +414,9 @@ static int i915_dp_force_link_rate_show(struct
> seq_file *m, void *data)
>  	return 0;
>  }
> 
> -static int parse_link_rate(struct intel_dp *intel_dp, const char __user *ubuf,
> size_t len)
> +static int parse_link_rate(struct intel_dp_link_caps *link_caps, const
> +char __user *ubuf, size_t len)
>  {
> +	struct intel_dp *intel_dp = link_caps->dp;
>  	char *kbuf;
>  	const char *p;
>  	int rate;
> @@ -458,7 +459,7 @@ static ssize_t i915_dp_force_link_rate_write(struct file
> *file,
>  	int rate;
>  	int err;
> 
> -	rate = parse_link_rate(intel_dp, ubuf, len);
> +	rate = parse_link_rate(link_caps, ubuf, len);
>  	if (rate < 0)
>  		return rate;
> 
LGTM,
Reviewed-by: Nemesa Garg <nemesa.garg@intel.com>

> --
> 2.49.1


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

* RE: [PATCH v2 25/28] drm/i915/dp_link_caps: Move max link limits to link_caps
  2026-06-16 20:08 ` [PATCH v2 25/28] drm/i915/dp_link_caps: Move max link limits to link_caps Imre Deak
@ 2026-06-23  5:34   ` Garg, Nemesa
  0 siblings, 0 replies; 68+ messages in thread
From: Garg, Nemesa @ 2026-06-23  5:34 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre
> Deak
> Sent: Wednesday, June 17, 2026 1:39 AM
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 25/28] drm/i915/dp_link_caps: Move max link limits to
> link_caps
> 
> Now that all users access the max link limits via helpers, move tracking of
> these limits from struct intel_dp to the link_caps state.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  .../drm/i915/display/intel_display_types.h    |  4 ----
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 21 ++++++++++++-------
>  2 files changed, 13 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 19c66b3a81509..8f9c8309b33e6 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1837,10 +1837,6 @@ struct intel_dp {
>  	struct {
>  		/* TODO: move the rest of link specific fields to here */
>  		bool active;
> -		/* Max lane count for the current link */
> -		int max_lane_count;
> -		/* Max rate for the current link */
> -		int max_rate;
>  		/*
>  		 * Link parameters for which the MST topology was probed.
>  		 * Tracking these ensures that the MST path resources are diff
> --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 9b7da5a64ee25..43427e7cf422a 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -46,6 +46,17 @@ struct intel_dp_link_caps {
>  	 * disconnects.
>  	 */
>  	struct intel_dp_link_config forced_params;
> +
> +	/*
> +	 * User set maximum limits. These limits constrain the currently
> +	 * allowed set of configurations and are not adjusted when sink
> +	 * capabilities change.
> +	 *
> +	 * max_limits.rate/lane_count may come from different allowed
> +	 * configurations, i.e. the (max_limits.rate, max_limits.lane_count)
> +	 * tuple itself may not be an allowed configuration.
> +	 */
> +	struct intel_dp_link_config max_limits;
>  };
> 
>  /* Get length of common rates array potentially limited by max_rate. */ @@ -
> 154,10 +165,7 @@ static int intel_dp_link_config_lane_count(const struct
> intel_dp_link_config_ent  static void set_max_link_limits_no_update(struct
> intel_dp_link_caps *link_caps,
>  					  const struct intel_dp_link_config
> *max_link_limits)  {
> -	struct intel_dp *intel_dp = link_caps->dp;
> -
> -	intel_dp->link.max_rate = max_link_limits->rate;
> -	intel_dp->link.max_lane_count = max_link_limits->lane_count;
> +	link_caps->max_limits = *max_link_limits;
>  }
> 
>  static void reset_max_link_limits_no_update(struct intel_dp_link_caps
> *link_caps) @@ -194,10 +202,7 @@ static void
> reset_max_link_limits_no_update(struct intel_dp_link_caps *link_caps  void
> intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
>  				       struct intel_dp_link_config
> *max_link_limits)  {
> -	struct intel_dp *intel_dp = link_caps->dp;
> -
> -	max_link_limits->rate = intel_dp->link.max_rate;
> -	max_link_limits->lane_count = intel_dp->link.max_lane_count;
> +	*max_link_limits = link_caps->max_limits;
>  }
> 
LGTM,
Reviewed-by: Nemesa Garg <nemesa.garg@intel.com>

>  /**
> --
> 2.49.1


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

* RE: [PATCH v2 28/28] drm/i915/dp_link_caps: Pass link_caps to common rate helpers
  2026-06-16 20:08 ` [PATCH v2 28/28] drm/i915/dp_link_caps: Pass link_caps to common rate helpers Imre Deak
@ 2026-06-23  5:39   ` Garg, Nemesa
  0 siblings, 0 replies; 68+ messages in thread
From: Garg, Nemesa @ 2026-06-23  5:39 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org



> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre
> Deak
> Sent: Wednesday, June 17, 2026 1:39 AM
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 28/28] drm/i915/dp_link_caps: Pass link_caps to common
> rate helpers
> 
> Pass the link_caps pointer to the common rate helpers in
> intel_dp_link_caps.c, as it holds the state with the relevant information.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c       | 13 ++++++----
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 26 +++++++------------
> .../gpu/drm/i915/display/intel_dp_link_caps.h |  6 ++---
> .../drm/i915/display/intel_dp_link_training.c |  5 ++--
>  .../gpu/drm/i915/display/intel_dp_tunnel.c    |  2 +-
>  5 files changed, 25 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index 07266f4e6835b..66346b74b2c04 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1551,14 +1551,15 @@ intel_dp_max_link_rate(struct intel_dp
> *intel_dp)
>  		return forced_params.rate;
> 
>  	intel_dp_link_caps_get_max_limits(link_caps, &max_link_limits);
> -	len = intel_dp_common_len_rate_limit(intel_dp,
> max_link_limits.rate);
> +	len = intel_dp_common_len_rate_limit(link_caps,
> max_link_limits.rate);
> 
> -	return intel_dp_common_rate(intel_dp, len - 1);
> +	return intel_dp_common_rate(link_caps, len - 1);
>  }
> 
>  static int
>  intel_dp_min_link_rate(struct intel_dp *intel_dp)  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	struct intel_dp_link_config forced_params;
> 
>  	intel_dp_link_caps_get_forced_params(intel_dp->link.caps,
> &forced_params); @@ -1566,7 +1567,7 @@ intel_dp_min_link_rate(struct
> intel_dp *intel_dp)
>  	if (forced_params.rate)
>  		return forced_params.rate;
> 
> -	return intel_dp_common_rate(intel_dp, 0);
> +	return intel_dp_common_rate(link_caps, 0);
>  }
> 
>  int intel_dp_rate_select(struct intel_dp *intel_dp, int rate) @@ -1750,6
> +1751,7 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
>  				  const struct drm_connector_state
> *conn_state,
>  				  const struct link_config_limits *limits)  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	int bpp, i, lane_count, clock = intel_dp_mode_clock(pipe_config,
> conn_state);
>  	int link_rate, link_avail;
> 
> @@ -1760,7 +1762,7 @@ intel_dp_compute_link_config_wide(struct intel_dp
> *intel_dp,
>  			intel_dp_output_format_link_bpp_x16(pipe_config-
> >output_format, bpp);
> 
>  		for (i = 0; i <
> intel_dp_link_caps_num_common_rates(intel_dp->link.caps); i++) {
> -			link_rate = intel_dp_common_rate(intel_dp, i);
> +			link_rate = intel_dp_common_rate(link_caps, i);
>  			if (link_rate < limits->min_rate ||
>  			    link_rate > limits->max_rate)
>  				continue;
> @@ -1984,12 +1986,13 @@ static int dsc_compute_link_config(struct
> intel_dp *intel_dp,
>  				   const struct link_config_limits *limits,
>  				   int dsc_bpp_x16)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	const struct drm_display_mode *adjusted_mode = &pipe_config-
> >hw.adjusted_mode;
>  	int link_rate, lane_count;
>  	int i;
> 
>  	for (i = 0; i < intel_dp_link_caps_num_common_rates(intel_dp-
> >link.caps); i++) {
> -		link_rate = intel_dp_common_rate(intel_dp, i);
> +		link_rate = intel_dp_common_rate(link_caps, i);
>  		if (link_rate < limits->min_rate || link_rate > limits->max_rate)
>  			continue;
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index c5701f02fbf69..0917e7f51a26d 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -60,19 +60,16 @@ struct intel_dp_link_caps {  };
> 
>  /* Get length of common rates array potentially limited by max_rate. */ -int
> intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
> +int intel_dp_common_len_rate_limit(struct intel_dp_link_caps
> +*link_caps,
>  				   int max_rate)
>  {
> -	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> -
>  	return intel_dp_rate_limit_len(link_caps->rates,
>  				       link_caps->num_rates, max_rate);  }
> 
> -int intel_dp_common_rate(struct intel_dp *intel_dp, int index)
> +int intel_dp_common_rate(struct intel_dp_link_caps *link_caps, int
> +index)
>  {
> -	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> -	struct intel_display *display = to_intel_display(intel_dp);
> +	struct intel_display *display = to_intel_display(link_caps->dp);
> 
>  	if (drm_WARN_ON(display->drm,
>  			index < 0 || index >= link_caps->num_rates)) @@ -
> 89,11 +86,9 @@ int intel_dp_link_caps_common_rate_idx(struct
> intel_dp_link_caps *link_caps, int  }
> 
>  /* Theoretical max between source and sink */ -int
> intel_dp_max_common_rate(struct intel_dp *intel_dp)
> +int intel_dp_max_common_rate(struct intel_dp_link_caps *link_caps)
>  {
> -	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> -
> -	return intel_dp_common_rate(intel_dp, link_caps->num_rates - 1);
> +	return intel_dp_common_rate(link_caps, link_caps->num_rates - 1);
>  }
> 
>  int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps
> *link_caps) @@ -129,17 +124,16 @@ static int forced_lane_count(struct
> intel_dp_link_caps *link_caps)
> 
>  static int forced_link_rate(struct intel_dp_link_caps *link_caps)  {
> -	struct intel_dp *intel_dp = link_caps->dp;
>  	int len;
> 
>  	if (!link_caps->forced_params.rate)
>  		return 0;
> 
> -	len = intel_dp_common_len_rate_limit(intel_dp, link_caps-
> >forced_params.rate);
> +	len = intel_dp_common_len_rate_limit(link_caps,
> +link_caps->forced_params.rate);
>  	if (len == 0)
> -		return intel_dp_common_rate(intel_dp, 0);
> +		return intel_dp_common_rate(link_caps, 0);
> 
> -	return intel_dp_common_rate(intel_dp, len - 1);
> +	return intel_dp_common_rate(link_caps, len - 1);
>  }
> 
>  void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps
> *link_caps, @@ -152,7 +146,7 @@ void
> intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
> static int intel_dp_link_config_rate(struct intel_dp_link_caps *link_caps,
>  				     const struct intel_dp_link_config_entry *lc)
> {
> -	return intel_dp_common_rate(link_caps->dp, lc->link_rate_idx);
> +	return intel_dp_common_rate(link_caps, lc->link_rate_idx);
>  }
> 
>  static int intel_dp_link_config_lane_count(const struct
> intel_dp_link_config_entry *lc) @@ -169,7 +163,7 @@ static void
> set_max_link_limits_no_update(struct intel_dp_link_caps *link_caps,  static
> void reset_max_link_limits_no_update(struct intel_dp_link_caps *link_caps)  {
>  	struct intel_dp_link_config max_link_limits = {
> -		.rate = intel_dp_max_common_rate(link_caps->dp),
> +		.rate = intel_dp_max_common_rate(link_caps),
>  		.lane_count =
> intel_dp_link_caps_max_common_lane_count(link_caps),
>  	};
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 9256f02fed11e..af9028e7cb987 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -11,11 +11,11 @@ struct intel_dp;
>  struct intel_dp_link_caps;
>  struct intel_dp_link_config;
> 
> -int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
> +int intel_dp_common_len_rate_limit(struct intel_dp_link_caps
> +*link_caps,
>  				   int max_rate);
> -int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
> +int intel_dp_common_rate(struct intel_dp_link_caps *link_caps, int
> +index);
>  int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps
> *link_caps, int rate); -int intel_dp_max_common_rate(struct intel_dp
> *intel_dp);
> +int intel_dp_max_common_rate(struct intel_dp_link_caps *link_caps);
>  int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps
> *link_caps);  int intel_dp_link_caps_max_common_lane_count(struct
> intel_dp_link_caps *link_caps);
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> index 0d4a0bf1dac53..b521dd11b62a7 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -1898,7 +1898,7 @@ static int reduce_link_rate(struct intel_dp *intel_dp,
> int current_rate)
>  	if (rate_index <= 0)
>  		return -1;
> 
> -	new_rate = intel_dp_common_rate(intel_dp, rate_index - 1);
> +	new_rate = intel_dp_common_rate(link_caps, rate_index - 1);
> 
>  	/* TODO: Make switching from UHBR to non-UHBR rates work. */
>  	if (drm_dp_is_uhbr_rate(current_rate) !=
> drm_dp_is_uhbr_rate(new_rate)) @@ -1925,6 +1925,7 @@ static bool
> reduce_link_params_in_rate_lane_order(struct intel_dp *intel_dp,
>  						  const struct intel_crtc_state
> *crtc_state,
>  						  int *new_link_rate, int
> *new_lane_count)  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	int link_rate;
>  	int lane_count;
> 
> @@ -1932,7 +1933,7 @@ static bool
> reduce_link_params_in_rate_lane_order(struct intel_dp *intel_dp,
>  	link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
>  	if (link_rate < 0) {
>  		lane_count = reduce_lane_count(intel_dp, crtc_state-
> >lane_count);
> -		link_rate = intel_dp_max_common_rate(intel_dp);
> +		link_rate = intel_dp_max_common_rate(link_caps);
>  	}
> 
>  	if (lane_count < 0)
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
> b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
> index 9d9d8d04742bc..76e9753766b9f 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
> @@ -58,7 +58,7 @@ static int kbytes_to_mbits(int kbytes)  static int
> get_current_link_bw(struct intel_dp *intel_dp)  {
>  	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> -	int rate = intel_dp_max_common_rate(intel_dp);
> +	int rate = intel_dp_max_common_rate(link_caps);
>  	int lane_count =
> intel_dp_link_caps_max_common_lane_count(link_caps);
> 
>  	return intel_dp_max_link_data_rate(intel_dp, rate, lane_count);
> --
LGTM,
Reviewed-by: Nemesa Garg <nemesa.garg@intel.com>

> 2.49.1


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

* RE: [PATCH v2 04/28] drm/i915/dp_link_caps: Move common rate helpers to link caps
  2026-06-16 20:08 ` [PATCH v2 04/28] drm/i915/dp_link_caps: Move common rate helpers to link caps Imre Deak
@ 2026-06-23  7:27   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-23  7:27 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.08
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 04/28] drm/i915/dp_link_caps: Move common rate helpers to link caps
> 
> Move the helpers handling common link rates to intel_dp_link_caps.c.
> Their functionality is part of the link capability logic and will be
> updated to use the link capability state in follow-up changes.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c       | 27 +----------------
>  drivers/gpu/drm/i915/display/intel_dp.h       |  3 +-
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 30 +++++++++++++++++++
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 ++++
>  .../drm/i915/display/intel_dp_link_training.c |  1 +
>  .../gpu/drm/i915/display/intel_dp_tunnel.c    |  1 +
>  6 files changed, 39 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index fa095c4db7fe6..a34d3704a5667 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -314,7 +314,7 @@ static void intel_dp_set_max_sink_lane_count(struct intel_dp *intel_dp)
>  }
> 
>  /* Get length of rates array potentially limited by max_rate. */
> -static int intel_dp_rate_limit_len(const int *rates, int len, int max_rate)
> +int intel_dp_rate_limit_len(const int *rates, int len, int max_rate)
>  {
>  	int i;
> 
> @@ -327,31 +327,6 @@ static int intel_dp_rate_limit_len(const int *rates, int len, int max_rate)
>  	return 0;
>  }
> 
> -/* Get length of common rates array potentially limited by max_rate. */
> -static int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
> -					  int max_rate)
> -{
> -	return intel_dp_rate_limit_len(intel_dp->common_rates,
> -				       intel_dp->num_common_rates, max_rate);
> -}
> -
> -int intel_dp_common_rate(struct intel_dp *intel_dp, int index)
> -{
> -	struct intel_display *display = to_intel_display(intel_dp);
> -
> -	if (drm_WARN_ON(display->drm,
> -			index < 0 || index >= intel_dp->num_common_rates))
> -		return 162000;
> -
> -	return intel_dp->common_rates[index];
> -}
> -
> -/* Theoretical max between source and sink */
> -int intel_dp_max_common_rate(struct intel_dp *intel_dp)
> -{
> -	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
> -}
> -
>  int intel_dp_max_source_lane_count(struct intel_digital_port *dig_port)
>  {
>  	int vbt_max_lanes = intel_bios_dp_max_lane_count(dig_port->base.devdata);
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
> index 92ce048523267..8cc6ea04e000c 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp.h
> @@ -100,14 +100,13 @@ void intel_edp_backlight_off(const struct drm_connector_state *conn_state);
>  void intel_edp_fixup_vbt_bpp(struct intel_encoder *encoder, int pipe_bpp);
>  void intel_dp_mst_suspend(struct intel_display *display);
>  void intel_dp_mst_resume(struct intel_display *display);
> +int intel_dp_rate_limit_len(const int *rates, int len, int max_rate);
>  int intel_dp_max_source_lane_count(struct intel_digital_port *dig_port);
>  int intel_dp_max_link_rate(struct intel_dp *intel_dp);
>  int intel_dp_max_lane_count(struct intel_dp *intel_dp);
>  int intel_dp_config_required_rate(const struct intel_crtc_state *crtc_state);
>  int intel_dp_rate_select(struct intel_dp *intel_dp, int rate);
> -int intel_dp_max_common_rate(struct intel_dp *intel_dp);
>  int intel_dp_max_common_lane_count(struct intel_dp *intel_dp);
> -int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
>  int intel_dp_rate_index(const int *rates, int len, int rate);
>  int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
>  void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 63989d97effd7..37ffd714c6a42 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -5,12 +5,42 @@
> 
>  #include <linux/slab.h>
> 
> +#include <drm/drm_print.h>
> +
> +#include "intel_display_core.h"
> +#include "intel_display_types.h"
> +#include "intel_dp.h"
>  #include "intel_dp_link_caps.h"
> 
>  struct intel_dp_link_caps {
>  	struct intel_dp *dp;
>  };
> 
> +/* Get length of common rates array potentially limited by max_rate. */
> +int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
> +				   int max_rate)
> +{
> +	return intel_dp_rate_limit_len(intel_dp->common_rates,
> +				       intel_dp->num_common_rates, max_rate);
> +}
> +
> +int intel_dp_common_rate(struct intel_dp *intel_dp, int index)
> +{
> +	struct intel_display *display = to_intel_display(intel_dp);
> +
> +	if (drm_WARN_ON(display->drm,
> +			index < 0 || index >= intel_dp->num_common_rates))
> +		return 162000;
> +
> +	return intel_dp->common_rates[index];
> +}
> +
> +/* Theoretical max between source and sink */
> +int intel_dp_max_common_rate(struct intel_dp *intel_dp)
> +{
> +	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
> +}
> +
>  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
>  {
>  	struct intel_dp_link_caps *link_caps;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 050b279463d6e..3248777d1287f 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -6,6 +6,11 @@
> 
>  struct intel_dp;
> 
> +int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
> +				   int max_rate);
> +int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
> +int intel_dp_max_common_rate(struct intel_dp *intel_dp);
> +
>  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
>  void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> index 97cb407d084cd..b915cfdeabd0e 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -33,6 +33,7 @@
>  #include "intel_display_types.h"
>  #include "intel_display_utils.h"
>  #include "intel_dp.h"
> +#include "intel_dp_link_caps.h"
>  #include "intel_dp_link_training.h"
>  #include "intel_dp_mst.h"
>  #include "intel_encoder.h"
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
> index d6bd1f7e01e18..c82adfcce01d0 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
> @@ -11,6 +11,7 @@
>  #include "intel_display_limits.h"
>  #include "intel_display_types.h"
>  #include "intel_dp.h"
> +#include "intel_dp_link_caps.h"
>  #include "intel_dp_link_training.h"
>  #include "intel_dp_mst.h"
>  #include "intel_dp_tunnel.h"
> --
> 2.49.1


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

* RE: [PATCH v2 05/28] drm/i915/dp_link_caps: Move forced link param helpers to link caps
  2026-06-16 20:08 ` [PATCH v2 05/28] drm/i915/dp_link_caps: Move forced link param " Imre Deak
@ 2026-06-23  9:40   ` Kahola, Mika
  2026-06-23 10:22   ` Luca Coelho
  1 sibling, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-23  9:40 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.08
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 05/28] drm/i915/dp_link_caps: Move forced link param helpers to link caps
> 
> Move the helpers handling forced link parameters to intel_dp_link_caps.c.
> Their functionality is part of the link capability logic and will be
> updated to use the link capability state in follow-up changes.
> 
> Return the forced link rate and lane count through a
> struct intel_dp_link_config, which is the canonical way the rest of the
> link capability API will also accept and return link configurations.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c       | 39 ++++++++++---------
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 22 +++++++++++
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 +++
>  3 files changed, 47 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index a34d3704a5667..7643fe079e15b 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -364,17 +364,16 @@ int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
>  	return intel_dp->max_common_lane_count;
>  }
> 
> -static int forced_lane_count(struct intel_dp *intel_dp)
> -{
> -	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
> -}
> -
>  int intel_dp_max_lane_count(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp_link_config forced_params;
>  	int lane_count;
> 
> +	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> +
>  	if (intel_dp->link.force_lane_count)
> -		lane_count = forced_lane_count(intel_dp);
> +		lane_count = forced_params.lane_count;
>  	else
>  		lane_count = intel_dp->link.max_lane_count;
> 
> @@ -391,8 +390,12 @@ int intel_dp_max_lane_count(struct intel_dp *intel_dp)
> 
>  static int intel_dp_min_lane_count(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_config forced_params;
> +
> +	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
> +
>  	if (intel_dp->link.force_lane_count)
> -		return forced_lane_count(intel_dp);
> +		return forced_params.lane_count;
> 
>  	return 1;
>  }
> @@ -1655,23 +1658,17 @@ static void intel_dp_print_rates(struct intel_dp *intel_dp)
>  	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
>  }
> 
> -static int forced_link_rate(struct intel_dp *intel_dp)
> -{
> -	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
> -
> -	if (len == 0)
> -		return intel_dp_common_rate(intel_dp, 0);
> -
> -	return intel_dp_common_rate(intel_dp, len - 1);
> -}
> -
>  int
>  intel_dp_max_link_rate(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp_link_config forced_params;
>  	int len;
> 
> +	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> +
>  	if (intel_dp->link.force_rate)
> -		return forced_link_rate(intel_dp);
> +		return forced_params.rate;
> 
>  	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.max_rate);
> 
> @@ -1681,8 +1678,12 @@ intel_dp_max_link_rate(struct intel_dp *intel_dp)
>  static int
>  intel_dp_min_link_rate(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_config forced_params;
> +
> +	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
> +
>  	if (intel_dp->link.force_rate)
> -		return forced_link_rate(intel_dp);
> +		return forced_params.rate;
> 
>  	return intel_dp_common_rate(intel_dp, 0);
>  }
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 37ffd714c6a42..1d3a3ff007a03 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -41,6 +41,28 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
>  	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
>  }
> 
> +static int forced_lane_count(struct intel_dp *intel_dp)
> +{
> +	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
> +}
> +
> +static int forced_link_rate(struct intel_dp *intel_dp)
> +{
> +	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
> +
> +	if (len == 0)
> +		return intel_dp_common_rate(intel_dp, 0);
> +
> +	return intel_dp_common_rate(intel_dp, len - 1);
> +}
> +
> +void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
> +					  struct intel_dp_link_config *forced_params)
> +{
> +	forced_params->rate = forced_link_rate(link_caps->dp);
> +	forced_params->lane_count = forced_lane_count(link_caps->dp);
> +}
> +
>  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
>  {
>  	struct intel_dp_link_caps *link_caps;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 3248777d1287f..61dbce86ee3d0 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -5,12 +5,17 @@
>  #define __INTEL_DP_LINK_CAPS_H__
> 
>  struct intel_dp;
> +struct intel_dp_link_caps;
> +struct intel_dp_link_config;
> 
>  int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
>  				   int max_rate);
>  int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
>  int intel_dp_max_common_rate(struct intel_dp *intel_dp);
> 
> +void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
> +					  struct intel_dp_link_config *forced_params);
> +
>  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
>  void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
> 
> --
> 2.49.1


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

* RE: [PATCH v2 06/28] drm/i915/dp: Simplify querying of forced link parameters
  2026-06-16 20:08 ` [PATCH v2 06/28] drm/i915/dp: Simplify querying of forced link parameters Imre Deak
@ 2026-06-23  9:49   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-23  9:49 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.08
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 06/28] drm/i915/dp: Simplify querying of forced link parameters
> 
> Simplify querying the forced link rate and lane count by
> performing the zero checks inside the helpers, allowing callers
> to use the returned values directly.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c           | 8 ++++----
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.c | 9 ++++++++-
>  2 files changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 7643fe079e15b..c4ad386acc6db 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -372,7 +372,7 @@ int intel_dp_max_lane_count(struct intel_dp *intel_dp)
> 
>  	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> 
> -	if (intel_dp->link.force_lane_count)
> +	if (forced_params.lane_count)
>  		lane_count = forced_params.lane_count;
>  	else
>  		lane_count = intel_dp->link.max_lane_count;
> @@ -394,7 +394,7 @@ static int intel_dp_min_lane_count(struct intel_dp *intel_dp)
> 
>  	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
> 
> -	if (intel_dp->link.force_lane_count)
> +	if (forced_params.lane_count)
>  		return forced_params.lane_count;
> 
>  	return 1;
> @@ -1667,7 +1667,7 @@ intel_dp_max_link_rate(struct intel_dp *intel_dp)
> 
>  	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> 
> -	if (intel_dp->link.force_rate)
> +	if (forced_params.rate)
>  		return forced_params.rate;
> 
>  	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.max_rate);
> @@ -1682,7 +1682,7 @@ intel_dp_min_link_rate(struct intel_dp *intel_dp)
> 
>  	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
> 
> -	if (intel_dp->link.force_rate)
> +	if (forced_params.rate)
>  		return forced_params.rate;
> 
>  	return intel_dp_common_rate(intel_dp, 0);
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 1d3a3ff007a03..e39e6c99ec25f 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -43,13 +43,20 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
> 
>  static int forced_lane_count(struct intel_dp *intel_dp)
>  {
> +	if (!intel_dp->link.force_lane_count)
> +		return 0;
> +
>  	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
>  }
> 
>  static int forced_link_rate(struct intel_dp *intel_dp)
>  {
> -	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
> +	int len;
> 
> +	if (!intel_dp->link.force_rate)
> +		return 0;
> +
> +	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
>  	if (len == 0)
>  		return intel_dp_common_rate(intel_dp, 0);
> 
> --
> 2.49.1


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

* Re: [PATCH v2 05/28] drm/i915/dp_link_caps: Move forced link param helpers to link caps
  2026-06-16 20:08 ` [PATCH v2 05/28] drm/i915/dp_link_caps: Move forced link param " Imre Deak
  2026-06-23  9:40   ` Kahola, Mika
@ 2026-06-23 10:22   ` Luca Coelho
  2026-06-23 12:42     ` Imre Deak
  1 sibling, 1 reply; 68+ messages in thread
From: Luca Coelho @ 2026-06-23 10:22 UTC (permalink / raw)
  To: imre.deak, intel-gfx, intel-xe

On Tue, 2026-06-16 at 23:08 +0300, Imre Deak wrote:
> Move the helpers handling forced link parameters to intel_dp_link_caps.c.
> Their functionality is part of the link capability logic and will be
> updated to use the link capability state in follow-up changes.
> 
> Return the forced link rate and lane count through a
> struct intel_dp_link_config, which is the canonical way the rest of the
> link capability API will also accept and return link configurations.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c       | 39 ++++++++++---------
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 22 +++++++++++
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 +++
>  3 files changed, 47 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index a34d3704a5667..7643fe079e15b 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -364,17 +364,16 @@ int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
>  	return intel_dp->max_common_lane_count;
>  }
>  
> -static int forced_lane_count(struct intel_dp *intel_dp)
> -{
> -	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
> -}
> -
>  int intel_dp_max_lane_count(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp_link_config forced_params;
>  	int lane_count;
>  
> +	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> +
>  	if (intel_dp->link.force_lane_count)
> -		lane_count = forced_lane_count(intel_dp);
> +		lane_count = forced_params.lane_count;
>  	else
>  		lane_count = intel_dp->link.max_lane_count;
>  
> @@ -391,8 +390,12 @@ int intel_dp_max_lane_count(struct intel_dp *intel_dp)
>  
>  static int intel_dp_min_lane_count(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_config forced_params;
> +
> +	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
> +
>  	if (intel_dp->link.force_lane_count)
> -		return forced_lane_count(intel_dp);
> +		return forced_params.lane_count;
>  
>  	return 1;
>  }
> @@ -1655,23 +1658,17 @@ static void intel_dp_print_rates(struct intel_dp *intel_dp)
>  	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
>  }
>  
> -static int forced_link_rate(struct intel_dp *intel_dp)
> -{
> -	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
> -
> -	if (len == 0)
> -		return intel_dp_common_rate(intel_dp, 0);
> -
> -	return intel_dp_common_rate(intel_dp, len - 1);
> -}
> -
>  int
>  intel_dp_max_link_rate(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp_link_config forced_params;
>  	int len;
>  
> +	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> +
>  	if (intel_dp->link.force_rate)
> -		return forced_link_rate(intel_dp);
> +		return forced_params.rate;
>  
>  	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.max_rate);
>  
> @@ -1681,8 +1678,12 @@ intel_dp_max_link_rate(struct intel_dp *intel_dp)
>  static int
>  intel_dp_min_link_rate(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_config forced_params;
> +
> +	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
> +
>  	if (intel_dp->link.force_rate)
> -		return forced_link_rate(intel_dp);
> +		return forced_params.rate;
>  
>  	return intel_dp_common_rate(intel_dp, 0);
>  }
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 37ffd714c6a42..1d3a3ff007a03 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -41,6 +41,28 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
>  	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
>  }
>  
> +static int forced_lane_count(struct intel_dp *intel_dp)
> +{
> +	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
> +}
> +
> +static int forced_link_rate(struct intel_dp *intel_dp)
> +{
> +	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
> +
> +	if (len == 0)
> +		return intel_dp_common_rate(intel_dp, 0);
> +
> +	return intel_dp_common_rate(intel_dp, len - 1);
> +}
> +
> +void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
> +					  struct intel_dp_link_config *forced_params)

Is this really _get_? Usually "get" in the function name in my head
returns something (which in this case would be the forced_params), but
here we're actually setting them.

Should it be _set_, or maybe "parse"?


> +{
> +	forced_params->rate = forced_link_rate(link_caps->dp);
> +	forced_params->lane_count = forced_lane_count(link_caps->dp);
> +}
> +
>  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
>  {
>  	struct intel_dp_link_caps *link_caps;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 3248777d1287f..61dbce86ee3d0 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -5,12 +5,17 @@
>  #define __INTEL_DP_LINK_CAPS_H__
>  
>  struct intel_dp;
> +struct intel_dp_link_caps;
> +struct intel_dp_link_config;
>  
>  int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
>  				   int max_rate);
>  int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
>  int intel_dp_max_common_rate(struct intel_dp *intel_dp);
>  
> +void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
> +					  struct intel_dp_link_config *forced_params);
> +
>  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
>  void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
>  

--
Cheers,
Luca.

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

* Re: [PATCH v2 07/28] drm/i915/dp_link_caps: Move forced and max link debugfs entries to link caps
  2026-06-16 20:08 ` [PATCH v2 07/28] drm/i915/dp_link_caps: Move forced and max link debugfs entries to link caps Imre Deak
@ 2026-06-23 10:28   ` Luca Coelho
  2026-06-23 10:29   ` Luca Coelho
  1 sibling, 0 replies; 68+ messages in thread
From: Luca Coelho @ 2026-06-23 10:28 UTC (permalink / raw)
  To: Imre Deak, intel-gfx, intel-xe

On Tue, 2026-06-16 at 23:08 +0300, Imre Deak wrote:
> Move the debugfs entries for the forced and max DP link parameters to
> intel_dp_link_caps. Their functionality is part of the link capability
> logic and will be updated to use the link capability state in follow-up
> changes.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>

Reviewed-by: Luca Coelho <luciano.coelho@intel.com>

--
Cheers,
Luca.


> ---
>  .../drm/i915/display/intel_display_debugfs.c  |   2 +
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 280 ++++++++++++++++++
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |   3 +
>  .../drm/i915/display/intel_dp_link_training.c | 263 ----------------
>  4 files changed, 285 insertions(+), 263 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> index 08004c1ba03f4..3f02868ef105b 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> @@ -32,6 +32,7 @@
>  #include "intel_display_types.h"
>  #include "intel_dmc.h"
>  #include "intel_dp.h"
> +#include "intel_dp_link_caps.h"
>  #include "intel_dp_link_training.h"
>  #include "intel_dp_mst.h"
>  #include "intel_dp_test.h"
> @@ -1342,6 +1343,7 @@ void intel_connector_debugfs_add(struct intel_connector *connector)
>  	intel_psr_connector_debugfs_add(connector);
>  	intel_alpm_lobf_debugfs_add(connector);
>  	intel_dp_link_training_debugfs_add(connector);
> +	intel_dp_link_caps_debugfs_add(connector);
>  	intel_link_bw_connector_debugfs_add(connector);
>  
>  	if (DISPLAY_VER(display) >= 11 &&
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index e39e6c99ec25f..ea90e84500a89 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -3,6 +3,7 @@
>   * Copyright © 2026 Intel Corporation
>   */
>  
> +#include <linux/debugfs.h>
>  #include <linux/slab.h>
>  
>  #include <drm/drm_print.h>
> @@ -70,6 +71,285 @@ void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
>  	forced_params->lane_count = forced_lane_count(link_caps->dp);
>  }
>  
> +static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
> +{
> +	struct intel_connector *connector = to_intel_connector(m->private);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int current_rate = -1;
> +	int force_rate;
> +	int err;
> +	int i;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	if (intel_dp->link.active)
> +		current_rate = intel_dp->link_rate;
> +
> +	force_rate = intel_dp->link.force_rate;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	seq_printf(m, "%sauto%s",
> +		   force_rate == 0 ? "[" : "",
> +		   force_rate == 0 ? "]" : "");
> +
> +	for (i = 0; i < intel_dp->num_source_rates; i++)
> +		seq_printf(m, " %s%d%s%s",
> +			   intel_dp->source_rates[i] == force_rate ? "[" : "",
> +			   intel_dp->source_rates[i],
> +			   intel_dp->source_rates[i] == current_rate ? "*" : "",
> +			   intel_dp->source_rates[i] == force_rate ? "]" : "");
> +
> +	seq_putc(m, '\n');
> +
> +	return 0;
> +}
> +
> +static int parse_link_rate(struct intel_dp *intel_dp, const char __user *ubuf, size_t len)
> +{
> +	char *kbuf;
> +	const char *p;
> +	int rate;
> +	int ret = 0;
> +
> +	kbuf = memdup_user_nul(ubuf, len);
> +	if (IS_ERR(kbuf))
> +		return PTR_ERR(kbuf);
> +
> +	p = strim(kbuf);
> +
> +	if (!strcmp(p, "auto")) {
> +		rate = 0;
> +	} else {
> +		ret = kstrtoint(p, 0, &rate);
> +		if (ret < 0)
> +			goto out_free;
> +
> +		if (intel_dp_rate_index(intel_dp->source_rates,
> +					intel_dp->num_source_rates,
> +					rate) < 0)
> +			ret = -EINVAL;
> +	}
> +
> +out_free:
> +	kfree(kbuf);
> +
> +	return ret < 0 ? ret : rate;
> +}
> +
> +static ssize_t i915_dp_force_link_rate_write(struct file *file,
> +					     const char __user *ubuf,
> +					     size_t len, loff_t *offp)
> +{
> +	struct seq_file *m = file->private_data;
> +	struct intel_connector *connector = to_intel_connector(m->private);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int rate;
> +	int err;
> +
> +	rate = parse_link_rate(intel_dp, ubuf, len);
> +	if (rate < 0)
> +		return rate;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	intel_dp_reset_link_params(intel_dp);
> +	intel_dp->link.force_rate = rate;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	*offp += len;
> +
> +	return len;
> +}
> +DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_link_rate);
> +
> +static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
> +{
> +	struct intel_connector *connector = to_intel_connector(m->private);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int current_lane_count = -1;
> +	int force_lane_count;
> +	int err;
> +	int i;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	if (intel_dp->link.active)
> +		current_lane_count = intel_dp->lane_count;
> +	force_lane_count = intel_dp->link.force_lane_count;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	seq_printf(m, "%sauto%s",
> +		   force_lane_count == 0 ? "[" : "",
> +		   force_lane_count == 0 ? "]" : "");
> +
> +	for (i = 1; i <= 4; i <<= 1)
> +		seq_printf(m, " %s%d%s%s",
> +			   i == force_lane_count ? "[" : "",
> +			   i,
> +			   i == current_lane_count ? "*" : "",
> +			   i == force_lane_count ? "]" : "");
> +
> +	seq_putc(m, '\n');
> +
> +	return 0;
> +}
> +
> +static int parse_lane_count(const char __user *ubuf, size_t len)
> +{
> +	char *kbuf;
> +	const char *p;
> +	int lane_count;
> +	int ret = 0;
> +
> +	kbuf = memdup_user_nul(ubuf, len);
> +	if (IS_ERR(kbuf))
> +		return PTR_ERR(kbuf);
> +
> +	p = strim(kbuf);
> +
> +	if (!strcmp(p, "auto")) {
> +		lane_count = 0;
> +	} else {
> +		ret = kstrtoint(p, 0, &lane_count);
> +		if (ret < 0)
> +			goto out_free;
> +
> +		switch (lane_count) {
> +		case 1:
> +		case 2:
> +		case 4:
> +			break;
> +		default:
> +			ret = -EINVAL;
> +		}
> +	}
> +
> +out_free:
> +	kfree(kbuf);
> +
> +	return ret < 0 ? ret : lane_count;
> +}
> +
> +static ssize_t i915_dp_force_lane_count_write(struct file *file,
> +					      const char __user *ubuf,
> +					      size_t len, loff_t *offp)
> +{
> +	struct seq_file *m = file->private_data;
> +	struct intel_connector *connector = to_intel_connector(m->private);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int lane_count;
> +	int err;
> +
> +	lane_count = parse_lane_count(ubuf, len);
> +	if (lane_count < 0)
> +		return lane_count;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	intel_dp_reset_link_params(intel_dp);
> +	intel_dp->link.force_lane_count = lane_count;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	*offp += len;
> +
> +	return len;
> +}
> +DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_lane_count);
> +
> +static int i915_dp_max_link_rate_show(void *data, u64 *val)
> +{
> +	struct intel_connector *connector = to_intel_connector(data);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int err;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	*val = intel_dp->link.max_rate;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	return 0;
> +}
> +DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_link_rate_fops, i915_dp_max_link_rate_show, NULL, "%llu\n");
> +
> +static int i915_dp_max_lane_count_show(void *data, u64 *val)
> +{
> +	struct intel_connector *connector = to_intel_connector(data);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int err;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	*val = intel_dp->link.max_lane_count;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	return 0;
> +}
> +DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_lane_count_fops, i915_dp_max_lane_count_show, NULL, "%llu\n");
> +
> +
> +/**
> + * intel_dp_link_caps_debugfs_add - add link caps debugfs files for a connector
> + * @connector: connector to add the debugfs files for
> + *
> + * Add the link-capability debugfs files for a DP @connector.
> + */
> +void intel_dp_link_caps_debugfs_add(struct intel_connector *connector)
> +{
> +	struct dentry *root = connector->base.debugfs_entry;
> +
> +	if (connector->base.connector_type != DRM_MODE_CONNECTOR_DisplayPort &&
> +	    connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
> +		return;
> +
> +	debugfs_create_file("i915_dp_force_link_rate", 0644, root,
> +			    connector, &i915_dp_force_link_rate_fops);
> +
> +	debugfs_create_file("i915_dp_force_lane_count", 0644, root,
> +			    connector, &i915_dp_force_lane_count_fops);
> +
> +	debugfs_create_file("i915_dp_max_link_rate", 0444, root,
> +			    connector, &i915_dp_max_link_rate_fops);
> +
> +	debugfs_create_file("i915_dp_max_lane_count", 0444, root,
> +			    connector, &i915_dp_max_lane_count_fops);
> +}
> +
>  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
>  {
>  	struct intel_dp_link_caps *link_caps;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 61dbce86ee3d0..c6a84891db464 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -4,6 +4,7 @@
>  #ifndef __INTEL_DP_LINK_CAPS_H__
>  #define __INTEL_DP_LINK_CAPS_H__
>  
> +struct intel_connector;
>  struct intel_dp;
>  struct intel_dp_link_caps;
>  struct intel_dp_link_config;
> @@ -16,6 +17,8 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp);
>  void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
>  					  struct intel_dp_link_config *forced_params);
>  
> +void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
> +
>  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
>  void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
>  
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> index b915cfdeabd0e..cbef3d45baf9c 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -2660,257 +2660,6 @@ void intel_dp_check_link_state(struct intel_dp *intel_dp)
>  	intel_encoder_link_check_queue_work(encoder, 0);
>  }
>  
> -static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
> -{
> -	struct intel_connector *connector = to_intel_connector(m->private);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int current_rate = -1;
> -	int force_rate;
> -	int err;
> -	int i;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	if (intel_dp->link.active)
> -		current_rate = intel_dp->link_rate;
> -
> -	force_rate = intel_dp->link.force_rate;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	seq_printf(m, "%sauto%s",
> -		   force_rate == 0 ? "[" : "",
> -		   force_rate == 0 ? "]" : "");
> -
> -	for (i = 0; i < intel_dp->num_source_rates; i++)
> -		seq_printf(m, " %s%d%s%s",
> -			   intel_dp->source_rates[i] == force_rate ? "[" : "",
> -			   intel_dp->source_rates[i],
> -			   intel_dp->source_rates[i] == current_rate ? "*" : "",
> -			   intel_dp->source_rates[i] == force_rate ? "]" : "");
> -
> -	seq_putc(m, '\n');
> -
> -	return 0;
> -}
> -
> -static int parse_link_rate(struct intel_dp *intel_dp, const char __user *ubuf, size_t len)
> -{
> -	char *kbuf;
> -	const char *p;
> -	int rate;
> -	int ret = 0;
> -
> -	kbuf = memdup_user_nul(ubuf, len);
> -	if (IS_ERR(kbuf))
> -		return PTR_ERR(kbuf);
> -
> -	p = strim(kbuf);
> -
> -	if (!strcmp(p, "auto")) {
> -		rate = 0;
> -	} else {
> -		ret = kstrtoint(p, 0, &rate);
> -		if (ret < 0)
> -			goto out_free;
> -
> -		if (intel_dp_rate_index(intel_dp->source_rates,
> -					intel_dp->num_source_rates,
> -					rate) < 0)
> -			ret = -EINVAL;
> -	}
> -
> -out_free:
> -	kfree(kbuf);
> -
> -	return ret < 0 ? ret : rate;
> -}
> -
> -static ssize_t i915_dp_force_link_rate_write(struct file *file,
> -					     const char __user *ubuf,
> -					     size_t len, loff_t *offp)
> -{
> -	struct seq_file *m = file->private_data;
> -	struct intel_connector *connector = to_intel_connector(m->private);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int rate;
> -	int err;
> -
> -	rate = parse_link_rate(intel_dp, ubuf, len);
> -	if (rate < 0)
> -		return rate;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	intel_dp_reset_link_params(intel_dp);
> -	intel_dp->link.force_rate = rate;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	*offp += len;
> -
> -	return len;
> -}
> -DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_link_rate);
> -
> -static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
> -{
> -	struct intel_connector *connector = to_intel_connector(m->private);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int current_lane_count = -1;
> -	int force_lane_count;
> -	int err;
> -	int i;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	if (intel_dp->link.active)
> -		current_lane_count = intel_dp->lane_count;
> -	force_lane_count = intel_dp->link.force_lane_count;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	seq_printf(m, "%sauto%s",
> -		   force_lane_count == 0 ? "[" : "",
> -		   force_lane_count == 0 ? "]" : "");
> -
> -	for (i = 1; i <= 4; i <<= 1)
> -		seq_printf(m, " %s%d%s%s",
> -			   i == force_lane_count ? "[" : "",
> -			   i,
> -			   i == current_lane_count ? "*" : "",
> -			   i == force_lane_count ? "]" : "");
> -
> -	seq_putc(m, '\n');
> -
> -	return 0;
> -}
> -
> -static int parse_lane_count(const char __user *ubuf, size_t len)
> -{
> -	char *kbuf;
> -	const char *p;
> -	int lane_count;
> -	int ret = 0;
> -
> -	kbuf = memdup_user_nul(ubuf, len);
> -	if (IS_ERR(kbuf))
> -		return PTR_ERR(kbuf);
> -
> -	p = strim(kbuf);
> -
> -	if (!strcmp(p, "auto")) {
> -		lane_count = 0;
> -	} else {
> -		ret = kstrtoint(p, 0, &lane_count);
> -		if (ret < 0)
> -			goto out_free;
> -
> -		switch (lane_count) {
> -		case 1:
> -		case 2:
> -		case 4:
> -			break;
> -		default:
> -			ret = -EINVAL;
> -		}
> -	}
> -
> -out_free:
> -	kfree(kbuf);
> -
> -	return ret < 0 ? ret : lane_count;
> -}
> -
> -static ssize_t i915_dp_force_lane_count_write(struct file *file,
> -					      const char __user *ubuf,
> -					      size_t len, loff_t *offp)
> -{
> -	struct seq_file *m = file->private_data;
> -	struct intel_connector *connector = to_intel_connector(m->private);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int lane_count;
> -	int err;
> -
> -	lane_count = parse_lane_count(ubuf, len);
> -	if (lane_count < 0)
> -		return lane_count;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	intel_dp_reset_link_params(intel_dp);
> -	intel_dp->link.force_lane_count = lane_count;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	*offp += len;
> -
> -	return len;
> -}
> -DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_lane_count);
> -
> -static int i915_dp_max_link_rate_show(void *data, u64 *val)
> -{
> -	struct intel_connector *connector = to_intel_connector(data);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int err;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	*val = intel_dp->link.max_rate;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	return 0;
> -}
> -DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_link_rate_fops, i915_dp_max_link_rate_show, NULL, "%llu\n");
> -
> -static int i915_dp_max_lane_count_show(void *data, u64 *val)
> -{
> -	struct intel_connector *connector = to_intel_connector(data);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int err;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	*val = intel_dp->link.max_lane_count;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	return 0;
> -}
> -DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_lane_count_fops, i915_dp_max_lane_count_show, NULL, "%llu\n");
> -
>  static int i915_dp_force_link_training_failure_show(void *data, u64 *val)
>  {
>  	struct intel_connector *connector = to_intel_connector(data);
> @@ -3033,18 +2782,6 @@ void intel_dp_link_training_debugfs_add(struct intel_connector *connector)
>  	    connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
>  		return;
>  
> -	debugfs_create_file("i915_dp_force_link_rate", 0644, root,
> -			    connector, &i915_dp_force_link_rate_fops);
> -
> -	debugfs_create_file("i915_dp_force_lane_count", 0644, root,
> -			    connector, &i915_dp_force_lane_count_fops);
> -
> -	debugfs_create_file("i915_dp_max_link_rate", 0444, root,
> -			    connector, &i915_dp_max_link_rate_fops);
> -
> -	debugfs_create_file("i915_dp_max_lane_count", 0444, root,
> -			    connector, &i915_dp_max_lane_count_fops);
> -
>  	debugfs_create_file("i915_dp_force_link_training_failure", 0644, root,
>  			    connector, &i915_dp_force_link_training_failure_fops);
>  

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

* Re: [PATCH v2 07/28] drm/i915/dp_link_caps: Move forced and max link debugfs entries to link caps
  2026-06-16 20:08 ` [PATCH v2 07/28] drm/i915/dp_link_caps: Move forced and max link debugfs entries to link caps Imre Deak
  2026-06-23 10:28   ` Luca Coelho
@ 2026-06-23 10:29   ` Luca Coelho
  1 sibling, 0 replies; 68+ messages in thread
From: Luca Coelho @ 2026-06-23 10:29 UTC (permalink / raw)
  To: Imre Deak, intel-gfx, intel-xe

On Tue, 2026-06-16 at 23:08 +0300, Imre Deak wrote:
> Move the debugfs entries for the forced and max DP link parameters to
> intel_dp_link_caps. Their functionality is part of the link capability
> logic and will be updated to use the link capability state in follow-up
> changes.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---

Reviewed-by: Luca Coelho <luciano.coelho@intel.com>

--
Cheers,
Luca.



>  .../drm/i915/display/intel_display_debugfs.c  |   2 +
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 280 ++++++++++++++++++
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |   3 +
>  .../drm/i915/display/intel_dp_link_training.c | 263 ----------------
>  4 files changed, 285 insertions(+), 263 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> index 08004c1ba03f4..3f02868ef105b 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c
> @@ -32,6 +32,7 @@
>  #include "intel_display_types.h"
>  #include "intel_dmc.h"
>  #include "intel_dp.h"
> +#include "intel_dp_link_caps.h"
>  #include "intel_dp_link_training.h"
>  #include "intel_dp_mst.h"
>  #include "intel_dp_test.h"
> @@ -1342,6 +1343,7 @@ void intel_connector_debugfs_add(struct intel_connector *connector)
>  	intel_psr_connector_debugfs_add(connector);
>  	intel_alpm_lobf_debugfs_add(connector);
>  	intel_dp_link_training_debugfs_add(connector);
> +	intel_dp_link_caps_debugfs_add(connector);
>  	intel_link_bw_connector_debugfs_add(connector);
>  
>  	if (DISPLAY_VER(display) >= 11 &&
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index e39e6c99ec25f..ea90e84500a89 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -3,6 +3,7 @@
>   * Copyright © 2026 Intel Corporation
>   */
>  
> +#include <linux/debugfs.h>
>  #include <linux/slab.h>
>  
>  #include <drm/drm_print.h>
> @@ -70,6 +71,285 @@ void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
>  	forced_params->lane_count = forced_lane_count(link_caps->dp);
>  }
>  
> +static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
> +{
> +	struct intel_connector *connector = to_intel_connector(m->private);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int current_rate = -1;
> +	int force_rate;
> +	int err;
> +	int i;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	if (intel_dp->link.active)
> +		current_rate = intel_dp->link_rate;
> +
> +	force_rate = intel_dp->link.force_rate;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	seq_printf(m, "%sauto%s",
> +		   force_rate == 0 ? "[" : "",
> +		   force_rate == 0 ? "]" : "");
> +
> +	for (i = 0; i < intel_dp->num_source_rates; i++)
> +		seq_printf(m, " %s%d%s%s",
> +			   intel_dp->source_rates[i] == force_rate ? "[" : "",
> +			   intel_dp->source_rates[i],
> +			   intel_dp->source_rates[i] == current_rate ? "*" : "",
> +			   intel_dp->source_rates[i] == force_rate ? "]" : "");
> +
> +	seq_putc(m, '\n');
> +
> +	return 0;
> +}
> +
> +static int parse_link_rate(struct intel_dp *intel_dp, const char __user *ubuf, size_t len)
> +{
> +	char *kbuf;
> +	const char *p;
> +	int rate;
> +	int ret = 0;
> +
> +	kbuf = memdup_user_nul(ubuf, len);
> +	if (IS_ERR(kbuf))
> +		return PTR_ERR(kbuf);
> +
> +	p = strim(kbuf);
> +
> +	if (!strcmp(p, "auto")) {
> +		rate = 0;
> +	} else {
> +		ret = kstrtoint(p, 0, &rate);
> +		if (ret < 0)
> +			goto out_free;
> +
> +		if (intel_dp_rate_index(intel_dp->source_rates,
> +					intel_dp->num_source_rates,
> +					rate) < 0)
> +			ret = -EINVAL;
> +	}
> +
> +out_free:
> +	kfree(kbuf);
> +
> +	return ret < 0 ? ret : rate;
> +}
> +
> +static ssize_t i915_dp_force_link_rate_write(struct file *file,
> +					     const char __user *ubuf,
> +					     size_t len, loff_t *offp)
> +{
> +	struct seq_file *m = file->private_data;
> +	struct intel_connector *connector = to_intel_connector(m->private);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int rate;
> +	int err;
> +
> +	rate = parse_link_rate(intel_dp, ubuf, len);
> +	if (rate < 0)
> +		return rate;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	intel_dp_reset_link_params(intel_dp);
> +	intel_dp->link.force_rate = rate;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	*offp += len;
> +
> +	return len;
> +}
> +DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_link_rate);
> +
> +static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
> +{
> +	struct intel_connector *connector = to_intel_connector(m->private);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int current_lane_count = -1;
> +	int force_lane_count;
> +	int err;
> +	int i;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	if (intel_dp->link.active)
> +		current_lane_count = intel_dp->lane_count;
> +	force_lane_count = intel_dp->link.force_lane_count;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	seq_printf(m, "%sauto%s",
> +		   force_lane_count == 0 ? "[" : "",
> +		   force_lane_count == 0 ? "]" : "");
> +
> +	for (i = 1; i <= 4; i <<= 1)
> +		seq_printf(m, " %s%d%s%s",
> +			   i == force_lane_count ? "[" : "",
> +			   i,
> +			   i == current_lane_count ? "*" : "",
> +			   i == force_lane_count ? "]" : "");
> +
> +	seq_putc(m, '\n');
> +
> +	return 0;
> +}
> +
> +static int parse_lane_count(const char __user *ubuf, size_t len)
> +{
> +	char *kbuf;
> +	const char *p;
> +	int lane_count;
> +	int ret = 0;
> +
> +	kbuf = memdup_user_nul(ubuf, len);
> +	if (IS_ERR(kbuf))
> +		return PTR_ERR(kbuf);
> +
> +	p = strim(kbuf);
> +
> +	if (!strcmp(p, "auto")) {
> +		lane_count = 0;
> +	} else {
> +		ret = kstrtoint(p, 0, &lane_count);
> +		if (ret < 0)
> +			goto out_free;
> +
> +		switch (lane_count) {
> +		case 1:
> +		case 2:
> +		case 4:
> +			break;
> +		default:
> +			ret = -EINVAL;
> +		}
> +	}
> +
> +out_free:
> +	kfree(kbuf);
> +
> +	return ret < 0 ? ret : lane_count;
> +}
> +
> +static ssize_t i915_dp_force_lane_count_write(struct file *file,
> +					      const char __user *ubuf,
> +					      size_t len, loff_t *offp)
> +{
> +	struct seq_file *m = file->private_data;
> +	struct intel_connector *connector = to_intel_connector(m->private);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int lane_count;
> +	int err;
> +
> +	lane_count = parse_lane_count(ubuf, len);
> +	if (lane_count < 0)
> +		return lane_count;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	intel_dp_reset_link_params(intel_dp);
> +	intel_dp->link.force_lane_count = lane_count;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	*offp += len;
> +
> +	return len;
> +}
> +DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_lane_count);
> +
> +static int i915_dp_max_link_rate_show(void *data, u64 *val)
> +{
> +	struct intel_connector *connector = to_intel_connector(data);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int err;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	*val = intel_dp->link.max_rate;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	return 0;
> +}
> +DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_link_rate_fops, i915_dp_max_link_rate_show, NULL, "%llu\n");
> +
> +static int i915_dp_max_lane_count_show(void *data, u64 *val)
> +{
> +	struct intel_connector *connector = to_intel_connector(data);
> +	struct intel_display *display = to_intel_display(connector);
> +	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	int err;
> +
> +	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> +	if (err)
> +		return err;
> +
> +	intel_dp_flush_connector_commits(connector);
> +
> +	*val = intel_dp->link.max_lane_count;
> +
> +	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> +
> +	return 0;
> +}
> +DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_lane_count_fops, i915_dp_max_lane_count_show, NULL, "%llu\n");
> +
> +
> +/**
> + * intel_dp_link_caps_debugfs_add - add link caps debugfs files for a connector
> + * @connector: connector to add the debugfs files for
> + *
> + * Add the link-capability debugfs files for a DP @connector.
> + */
> +void intel_dp_link_caps_debugfs_add(struct intel_connector *connector)
> +{
> +	struct dentry *root = connector->base.debugfs_entry;
> +
> +	if (connector->base.connector_type != DRM_MODE_CONNECTOR_DisplayPort &&
> +	    connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
> +		return;
> +
> +	debugfs_create_file("i915_dp_force_link_rate", 0644, root,
> +			    connector, &i915_dp_force_link_rate_fops);
> +
> +	debugfs_create_file("i915_dp_force_lane_count", 0644, root,
> +			    connector, &i915_dp_force_lane_count_fops);
> +
> +	debugfs_create_file("i915_dp_max_link_rate", 0444, root,
> +			    connector, &i915_dp_max_link_rate_fops);
> +
> +	debugfs_create_file("i915_dp_max_lane_count", 0444, root,
> +			    connector, &i915_dp_max_lane_count_fops);
> +}
> +
>  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
>  {
>  	struct intel_dp_link_caps *link_caps;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 61dbce86ee3d0..c6a84891db464 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -4,6 +4,7 @@
>  #ifndef __INTEL_DP_LINK_CAPS_H__
>  #define __INTEL_DP_LINK_CAPS_H__
>  
> +struct intel_connector;
>  struct intel_dp;
>  struct intel_dp_link_caps;
>  struct intel_dp_link_config;
> @@ -16,6 +17,8 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp);
>  void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
>  					  struct intel_dp_link_config *forced_params);
>  
> +void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
> +
>  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
>  void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
>  
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> index b915cfdeabd0e..cbef3d45baf9c 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -2660,257 +2660,6 @@ void intel_dp_check_link_state(struct intel_dp *intel_dp)
>  	intel_encoder_link_check_queue_work(encoder, 0);
>  }
>  
> -static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
> -{
> -	struct intel_connector *connector = to_intel_connector(m->private);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int current_rate = -1;
> -	int force_rate;
> -	int err;
> -	int i;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	if (intel_dp->link.active)
> -		current_rate = intel_dp->link_rate;
> -
> -	force_rate = intel_dp->link.force_rate;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	seq_printf(m, "%sauto%s",
> -		   force_rate == 0 ? "[" : "",
> -		   force_rate == 0 ? "]" : "");
> -
> -	for (i = 0; i < intel_dp->num_source_rates; i++)
> -		seq_printf(m, " %s%d%s%s",
> -			   intel_dp->source_rates[i] == force_rate ? "[" : "",
> -			   intel_dp->source_rates[i],
> -			   intel_dp->source_rates[i] == current_rate ? "*" : "",
> -			   intel_dp->source_rates[i] == force_rate ? "]" : "");
> -
> -	seq_putc(m, '\n');
> -
> -	return 0;
> -}
> -
> -static int parse_link_rate(struct intel_dp *intel_dp, const char __user *ubuf, size_t len)
> -{
> -	char *kbuf;
> -	const char *p;
> -	int rate;
> -	int ret = 0;
> -
> -	kbuf = memdup_user_nul(ubuf, len);
> -	if (IS_ERR(kbuf))
> -		return PTR_ERR(kbuf);
> -
> -	p = strim(kbuf);
> -
> -	if (!strcmp(p, "auto")) {
> -		rate = 0;
> -	} else {
> -		ret = kstrtoint(p, 0, &rate);
> -		if (ret < 0)
> -			goto out_free;
> -
> -		if (intel_dp_rate_index(intel_dp->source_rates,
> -					intel_dp->num_source_rates,
> -					rate) < 0)
> -			ret = -EINVAL;
> -	}
> -
> -out_free:
> -	kfree(kbuf);
> -
> -	return ret < 0 ? ret : rate;
> -}
> -
> -static ssize_t i915_dp_force_link_rate_write(struct file *file,
> -					     const char __user *ubuf,
> -					     size_t len, loff_t *offp)
> -{
> -	struct seq_file *m = file->private_data;
> -	struct intel_connector *connector = to_intel_connector(m->private);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int rate;
> -	int err;
> -
> -	rate = parse_link_rate(intel_dp, ubuf, len);
> -	if (rate < 0)
> -		return rate;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	intel_dp_reset_link_params(intel_dp);
> -	intel_dp->link.force_rate = rate;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	*offp += len;
> -
> -	return len;
> -}
> -DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_link_rate);
> -
> -static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
> -{
> -	struct intel_connector *connector = to_intel_connector(m->private);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int current_lane_count = -1;
> -	int force_lane_count;
> -	int err;
> -	int i;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	if (intel_dp->link.active)
> -		current_lane_count = intel_dp->lane_count;
> -	force_lane_count = intel_dp->link.force_lane_count;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	seq_printf(m, "%sauto%s",
> -		   force_lane_count == 0 ? "[" : "",
> -		   force_lane_count == 0 ? "]" : "");
> -
> -	for (i = 1; i <= 4; i <<= 1)
> -		seq_printf(m, " %s%d%s%s",
> -			   i == force_lane_count ? "[" : "",
> -			   i,
> -			   i == current_lane_count ? "*" : "",
> -			   i == force_lane_count ? "]" : "");
> -
> -	seq_putc(m, '\n');
> -
> -	return 0;
> -}
> -
> -static int parse_lane_count(const char __user *ubuf, size_t len)
> -{
> -	char *kbuf;
> -	const char *p;
> -	int lane_count;
> -	int ret = 0;
> -
> -	kbuf = memdup_user_nul(ubuf, len);
> -	if (IS_ERR(kbuf))
> -		return PTR_ERR(kbuf);
> -
> -	p = strim(kbuf);
> -
> -	if (!strcmp(p, "auto")) {
> -		lane_count = 0;
> -	} else {
> -		ret = kstrtoint(p, 0, &lane_count);
> -		if (ret < 0)
> -			goto out_free;
> -
> -		switch (lane_count) {
> -		case 1:
> -		case 2:
> -		case 4:
> -			break;
> -		default:
> -			ret = -EINVAL;
> -		}
> -	}
> -
> -out_free:
> -	kfree(kbuf);
> -
> -	return ret < 0 ? ret : lane_count;
> -}
> -
> -static ssize_t i915_dp_force_lane_count_write(struct file *file,
> -					      const char __user *ubuf,
> -					      size_t len, loff_t *offp)
> -{
> -	struct seq_file *m = file->private_data;
> -	struct intel_connector *connector = to_intel_connector(m->private);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int lane_count;
> -	int err;
> -
> -	lane_count = parse_lane_count(ubuf, len);
> -	if (lane_count < 0)
> -		return lane_count;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	intel_dp_reset_link_params(intel_dp);
> -	intel_dp->link.force_lane_count = lane_count;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	*offp += len;
> -
> -	return len;
> -}
> -DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_lane_count);
> -
> -static int i915_dp_max_link_rate_show(void *data, u64 *val)
> -{
> -	struct intel_connector *connector = to_intel_connector(data);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int err;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	*val = intel_dp->link.max_rate;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	return 0;
> -}
> -DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_link_rate_fops, i915_dp_max_link_rate_show, NULL, "%llu\n");
> -
> -static int i915_dp_max_lane_count_show(void *data, u64 *val)
> -{
> -	struct intel_connector *connector = to_intel_connector(data);
> -	struct intel_display *display = to_intel_display(connector);
> -	struct intel_dp *intel_dp = intel_attached_dp(connector);
> -	int err;
> -
> -	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> -	if (err)
> -		return err;
> -
> -	intel_dp_flush_connector_commits(connector);
> -
> -	*val = intel_dp->link.max_lane_count;
> -
> -	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> -
> -	return 0;
> -}
> -DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_lane_count_fops, i915_dp_max_lane_count_show, NULL, "%llu\n");
> -
>  static int i915_dp_force_link_training_failure_show(void *data, u64 *val)
>  {
>  	struct intel_connector *connector = to_intel_connector(data);
> @@ -3033,18 +2782,6 @@ void intel_dp_link_training_debugfs_add(struct intel_connector *connector)
>  	    connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
>  		return;
>  
> -	debugfs_create_file("i915_dp_force_link_rate", 0644, root,
> -			    connector, &i915_dp_force_link_rate_fops);
> -
> -	debugfs_create_file("i915_dp_force_lane_count", 0644, root,
> -			    connector, &i915_dp_force_lane_count_fops);
> -
> -	debugfs_create_file("i915_dp_max_link_rate", 0444, root,
> -			    connector, &i915_dp_max_link_rate_fops);
> -
> -	debugfs_create_file("i915_dp_max_lane_count", 0444, root,
> -			    connector, &i915_dp_max_lane_count_fops);
> -
>  	debugfs_create_file("i915_dp_force_link_training_failure", 0644, root,
>  			    connector, &i915_dp_force_link_training_failure_fops);
>  

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

* Re: [PATCH v2 08/28] drm/i915/dp_link_training: Use helpers to get forced link params
  2026-06-16 20:08 ` [PATCH v2 08/28] drm/i915/dp_link_training: Use helpers to get forced link params Imre Deak
@ 2026-06-23 10:31   ` Luca Coelho
  0 siblings, 0 replies; 68+ messages in thread
From: Luca Coelho @ 2026-06-23 10:31 UTC (permalink / raw)
  To: Imre Deak, intel-gfx, intel-xe

On Tue, 2026-06-16 at 23:08 +0300, Imre Deak wrote:
> Use intel_dp_link_caps_get_forced_params() in the link training fallback
> code instead of directly accessing the state. This allows the link caps
> module to track changes to forced parameters internally.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---

Reviewed-by: Luca Coelho <luciano.coelho@intel.com>

--
Cheers,
Luca.



>  .../drm/i915/display/intel_dp_link_training.c | 22 ++++++++++++++-----
>  1 file changed, 16 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> index cbef3d45baf9c..61ada34ab9c8e 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -1850,18 +1850,22 @@ static bool reduce_link_params_in_bw_order(struct intel_dp *intel_dp,
>  					   const struct intel_crtc_state *crtc_state,
>  					   int *new_link_rate, int *new_lane_count)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp_link_config forced_params;
>  	int link_rate;
>  	int lane_count;
>  	int i;
>  
> +	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> +
>  	i = intel_dp_link_config_index(intel_dp, crtc_state->port_clock, crtc_state->lane_count);
>  	for (i--; i >= 0; i--) {
>  		intel_dp_link_config_get(intel_dp, i, &link_rate, &lane_count);
>  
> -		if ((intel_dp->link.force_rate &&
> -		     intel_dp->link.force_rate != link_rate) ||
> -		    (intel_dp->link.force_lane_count &&
> -		     intel_dp->link.force_lane_count != lane_count))
> +		if ((forced_params.rate &&
> +		     forced_params.rate != link_rate) ||
> +		    (forced_params.lane_count &&
> +		     forced_params.lane_count != lane_count))
>  			continue;
>  
>  		break;
> @@ -1878,10 +1882,13 @@ static bool reduce_link_params_in_bw_order(struct intel_dp *intel_dp,
>  
>  static int reduce_link_rate(struct intel_dp *intel_dp, int current_rate)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp_link_config forced_params;
>  	int rate_index;
>  	int new_rate;
>  
> -	if (intel_dp->link.force_rate)
> +	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> +	if (forced_params.rate)
>  		return -1;
>  
>  	rate_index = intel_dp_rate_index(intel_dp->common_rates,
> @@ -1902,7 +1909,10 @@ static int reduce_link_rate(struct intel_dp *intel_dp, int current_rate)
>  
>  static int reduce_lane_count(struct intel_dp *intel_dp, int current_lane_count)
>  {
> -	if (intel_dp->link.force_lane_count)
> +	struct intel_dp_link_config forced_params;
> +
> +	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
> +	if (forced_params.lane_count)
>  		return -1;
>  
>  	if (current_lane_count == 1)

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

* Re: [PATCH v2 09/28] drm/i915/dp_link_caps: Move forced link params to link_caps
  2026-06-16 20:08 ` [PATCH v2 09/28] drm/i915/dp_link_caps: Move forced link params to link_caps Imre Deak
@ 2026-06-23 10:32   ` Luca Coelho
  0 siblings, 0 replies; 68+ messages in thread
From: Luca Coelho @ 2026-06-23 10:32 UTC (permalink / raw)
  To: Imre Deak, intel-gfx, intel-xe

On Tue, 2026-06-16 at 23:08 +0300, Imre Deak wrote:
> Move tracking of the forced link parameters from struct intel_dp to
> struct intel_dp_link_caps.
> 
> Previous changes made all users access these parameters through the link
> caps helpers, so the state can now be kept internal to the link caps
> module.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---

Reviewed-by: Luca Coelho <luciano.coelho@intel.com>

--
Cheers,
Luca.


>  .../drm/i915/display/intel_display_types.h    |  2 --
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 30 ++++++++++++++-----
>  2 files changed, 22 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 10933ccdeb31e..c84ef29529373 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1865,8 +1865,6 @@ struct intel_dp {
>  		 */
>  		int mst_probed_lane_count;
>  		int mst_probed_rate;
> -		int force_lane_count;
> -		int force_rate;
>  		struct intel_dp_link_training *training;
>  		struct intel_dp_link_caps *caps;
>  	} link;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index ea90e84500a89..8ecdc01af70eb 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -15,6 +15,12 @@
>  
>  struct intel_dp_link_caps {
>  	struct intel_dp *dp;
> +
> +	/*
> +	 * Forced parameters requested via debugfs. Remains set across sink
> +	 * disconnects.
> +	 */
> +	struct intel_dp_link_config forced_params;
>  };
>  
>  /* Get length of common rates array potentially limited by max_rate. */
> @@ -44,20 +50,24 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
>  
>  static int forced_lane_count(struct intel_dp *intel_dp)
>  {
> -	if (!intel_dp->link.force_lane_count)
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +
> +	if (!link_caps->forced_params.lane_count)
>  		return 0;
>  
> -	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
> +	return clamp(link_caps->forced_params.lane_count,
> +		     1, intel_dp_max_common_lane_count(intel_dp));
>  }
>  
>  static int forced_link_rate(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	int len;
>  
> -	if (!intel_dp->link.force_rate)
> +	if (!link_caps->forced_params.rate)
>  		return 0;
>  
> -	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
> +	len = intel_dp_common_len_rate_limit(intel_dp, link_caps->forced_params.rate);
>  	if (len == 0)
>  		return intel_dp_common_rate(intel_dp, 0);
>  
> @@ -76,6 +86,7 @@ static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
>  	struct intel_connector *connector = to_intel_connector(m->private);
>  	struct intel_display *display = to_intel_display(connector);
>  	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	int current_rate = -1;
>  	int force_rate;
>  	int err;
> @@ -90,7 +101,7 @@ static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
>  	if (intel_dp->link.active)
>  		current_rate = intel_dp->link_rate;
>  
> -	force_rate = intel_dp->link.force_rate;
> +	force_rate = link_caps->forced_params.rate;
>  
>  	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
>  
> @@ -150,6 +161,7 @@ static ssize_t i915_dp_force_link_rate_write(struct file *file,
>  	struct intel_connector *connector = to_intel_connector(m->private);
>  	struct intel_display *display = to_intel_display(connector);
>  	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	int rate;
>  	int err;
>  
> @@ -164,7 +176,7 @@ static ssize_t i915_dp_force_link_rate_write(struct file *file,
>  	intel_dp_flush_connector_commits(connector);
>  
>  	intel_dp_reset_link_params(intel_dp);
> -	intel_dp->link.force_rate = rate;
> +	link_caps->forced_params.rate = rate;
>  
>  	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
>  
> @@ -179,6 +191,7 @@ static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
>  	struct intel_connector *connector = to_intel_connector(m->private);
>  	struct intel_display *display = to_intel_display(connector);
>  	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	int current_lane_count = -1;
>  	int force_lane_count;
>  	int err;
> @@ -192,7 +205,7 @@ static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
>  
>  	if (intel_dp->link.active)
>  		current_lane_count = intel_dp->lane_count;
> -	force_lane_count = intel_dp->link.force_lane_count;
> +	force_lane_count = link_caps->forced_params.lane_count;
>  
>  	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
>  
> @@ -256,6 +269,7 @@ static ssize_t i915_dp_force_lane_count_write(struct file *file,
>  	struct intel_connector *connector = to_intel_connector(m->private);
>  	struct intel_display *display = to_intel_display(connector);
>  	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	int lane_count;
>  	int err;
>  
> @@ -270,7 +284,7 @@ static ssize_t i915_dp_force_lane_count_write(struct file *file,
>  	intel_dp_flush_connector_commits(connector);
>  
>  	intel_dp_reset_link_params(intel_dp);
> -	intel_dp->link.force_lane_count = lane_count;
> +	link_caps->forced_params.lane_count = lane_count;
>  
>  	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
>  

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

* Re: [PATCH v2 10/28] drm/i915/dp_link_caps: Move link config helpers to link caps
  2026-06-16 20:08 ` [PATCH v2 10/28] drm/i915/dp_link_caps: Move link config helpers to link caps Imre Deak
@ 2026-06-23 10:34   ` Luca Coelho
  0 siblings, 0 replies; 68+ messages in thread
From: Luca Coelho @ 2026-06-23 10:34 UTC (permalink / raw)
  To: Imre Deak, intel-gfx, intel-xe

On Tue, 2026-06-16 at 23:08 +0300, Imre Deak wrote:
> Move the helpers handling link configurations to intel_dp_link_caps.c.
> Their functionality is part of the link capability logic and will be
> updated to use the link capability state in follow-up changes.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---

Reviewed-by: Luca Coelho <luciano.coelho@intel.com>

--
Cheers,
Luca.



>  drivers/gpu/drm/i915/display/intel_dp.c       | 101 -----------------
>  drivers/gpu/drm/i915/display/intel_dp.h       |   2 -
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 102 ++++++++++++++++++
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |   5 +
>  4 files changed, 107 insertions(+), 103 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index c4ad386acc6db..c4b650431eff5 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -33,7 +33,6 @@
>  #include <linux/notifier.h>
>  #include <linux/seq_buf.h>
>  #include <linux/slab.h>
> -#include <linux/sort.h>
>  #include <linux/string_helpers.h>
>  #include <linux/timekeeping.h>
>  #include <linux/types.h>
> @@ -677,106 +676,6 @@ int intel_dp_rate_index(const int *rates, int len, int rate)
>  	return -1;
>  }
>  
> -static int intel_dp_link_config_rate(struct intel_dp *intel_dp,
> -				     const struct intel_dp_link_config_entry *lc)
> -{
> -	return intel_dp_common_rate(intel_dp, lc->link_rate_idx);
> -}
> -
> -static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lc)
> -{
> -	return 1 << lc->lane_count_exp;
> -}
> -
> -static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
> -				   const struct intel_dp_link_config_entry *lc)
> -{
> -	return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(intel_dp, lc),
> -					 intel_dp_link_config_lane_count(lc));
> -}
> -
> -static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
> -{
> -	struct intel_dp *intel_dp = (struct intel_dp *)p;	/* remove const */
> -	const struct intel_dp_link_config_entry *lc_a = a;
> -	const struct intel_dp_link_config_entry *lc_b = b;
> -	int bw_a = intel_dp_link_config_bw(intel_dp, lc_a);
> -	int bw_b = intel_dp_link_config_bw(intel_dp, lc_b);
> -
> -	if (bw_a != bw_b)
> -		return bw_a - bw_b;
> -
> -	return intel_dp_link_config_rate(intel_dp, lc_a) -
> -	       intel_dp_link_config_rate(intel_dp, lc_b);
> -}
> -
> -static void intel_dp_link_config_init(struct intel_dp *intel_dp)
> -{
> -	struct intel_display *display = to_intel_display(intel_dp);
> -	struct intel_dp_link_config_entry *lc;
> -	int num_common_lane_configs;
> -	int i;
> -	int j;
> -
> -	if (drm_WARN_ON(display->drm, !is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
> -		return;
> -
> -	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
> -
> -	if (drm_WARN_ON(display->drm, intel_dp->num_common_rates * num_common_lane_configs >
> -				    ARRAY_SIZE(intel_dp->link.configs)))
> -		return;
> -
> -	intel_dp->link.num_configs = intel_dp->num_common_rates * num_common_lane_configs;
> -
> -	lc = &intel_dp->link.configs[0];
> -	for (i = 0; i < intel_dp->num_common_rates; i++) {
> -		for (j = 0; j < num_common_lane_configs; j++) {
> -			lc->lane_count_exp = j;
> -			lc->link_rate_idx = i;
> -
> -			lc++;
> -		}
> -	}
> -
> -	sort_r(intel_dp->link.configs, intel_dp->link.num_configs,
> -	       sizeof(intel_dp->link.configs[0]),
> -	       link_config_cmp_by_bw, NULL,
> -	       intel_dp);
> -}
> -
> -void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
> -{
> -	struct intel_display *display = to_intel_display(intel_dp);
> -	const struct intel_dp_link_config_entry *lc;
> -
> -	if (drm_WARN_ON(display->drm, idx < 0 || idx >= intel_dp->link.num_configs))
> -		idx = 0;
> -
> -	lc = &intel_dp->link.configs[idx];
> -
> -	*link_rate = intel_dp_link_config_rate(intel_dp, lc);
> -	*lane_count = intel_dp_link_config_lane_count(lc);
> -}
> -
> -int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count)
> -{
> -	int link_rate_idx = intel_dp_rate_index(intel_dp->common_rates, intel_dp->num_common_rates,
> -						link_rate);
> -	int lane_count_exp = ilog2(lane_count);
> -	int i;
> -
> -	for (i = 0; i < intel_dp->link.num_configs; i++) {
> -		const struct intel_dp_link_config_entry *lc = &intel_dp->link.configs[i];
> -
> -		if (lc->lane_count_exp == lane_count_exp &&
> -		    lc->link_rate_idx == link_rate_idx)
> -			return i;
> -	}
> -
> -	return -1;
> -}
> -
>  /* Return %true if the common rates changed. */
>  static bool intel_dp_set_common_rates(struct intel_dp *intel_dp)
>  {
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
> index 8cc6ea04e000c..fdf9bd88859e7 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp.h
> @@ -108,8 +108,6 @@ int intel_dp_config_required_rate(const struct intel_crtc_state *crtc_state);
>  int intel_dp_rate_select(struct intel_dp *intel_dp, int rate);
>  int intel_dp_max_common_lane_count(struct intel_dp *intel_dp);
>  int intel_dp_rate_index(const int *rates, int len, int rate);
> -int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
> -void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
>  void intel_dp_update_sink_caps(struct intel_dp *intel_dp);
>  void intel_dp_reset_link_params(struct intel_dp *intel_dp);
>  
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 8ecdc01af70eb..6a37ba8c35e27 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -4,7 +4,9 @@
>   */
>  
>  #include <linux/debugfs.h>
> +#include <linux/log2.h>
>  #include <linux/slab.h>
> +#include <linux/sort.h>
>  
>  #include <drm/drm_print.h>
>  
> @@ -81,6 +83,106 @@ void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
>  	forced_params->lane_count = forced_lane_count(link_caps->dp);
>  }
>  
> +static int intel_dp_link_config_rate(struct intel_dp *intel_dp,
> +				     const struct intel_dp_link_config_entry *lc)
> +{
> +	return intel_dp_common_rate(intel_dp, lc->link_rate_idx);
> +}
> +
> +static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lc)
> +{
> +	return 1 << lc->lane_count_exp;
> +}
> +
> +static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
> +				   const struct intel_dp_link_config_entry *lc)
> +{
> +	return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(intel_dp, lc),
> +					 intel_dp_link_config_lane_count(lc));
> +}
> +
> +static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
> +{
> +	struct intel_dp *intel_dp = (struct intel_dp *)p;	/* remove const */
> +	const struct intel_dp_link_config_entry *lc_a = a;
> +	const struct intel_dp_link_config_entry *lc_b = b;
> +	int bw_a = intel_dp_link_config_bw(intel_dp, lc_a);
> +	int bw_b = intel_dp_link_config_bw(intel_dp, lc_b);
> +
> +	if (bw_a != bw_b)
> +		return bw_a - bw_b;
> +
> +	return intel_dp_link_config_rate(intel_dp, lc_a) -
> +	       intel_dp_link_config_rate(intel_dp, lc_b);
> +}
> +
> +void intel_dp_link_config_init(struct intel_dp *intel_dp)
> +{
> +	struct intel_display *display = to_intel_display(intel_dp);
> +	struct intel_dp_link_config_entry *lc;
> +	int num_common_lane_configs;
> +	int i;
> +	int j;
> +
> +	if (drm_WARN_ON(display->drm, !is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
> +		return;
> +
> +	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
> +
> +	if (drm_WARN_ON(display->drm, intel_dp->num_common_rates * num_common_lane_configs >
> +				    ARRAY_SIZE(intel_dp->link.configs)))
> +		return;
> +
> +	intel_dp->link.num_configs = intel_dp->num_common_rates * num_common_lane_configs;
> +
> +	lc = &intel_dp->link.configs[0];
> +	for (i = 0; i < intel_dp->num_common_rates; i++) {
> +		for (j = 0; j < num_common_lane_configs; j++) {
> +			lc->lane_count_exp = j;
> +			lc->link_rate_idx = i;
> +
> +			lc++;
> +		}
> +	}
> +
> +	sort_r(intel_dp->link.configs, intel_dp->link.num_configs,
> +	       sizeof(intel_dp->link.configs[0]),
> +	       link_config_cmp_by_bw, NULL,
> +	       intel_dp);
> +}
> +
> +void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
> +{
> +	struct intel_display *display = to_intel_display(intel_dp);
> +	const struct intel_dp_link_config_entry *lc;
> +
> +	if (drm_WARN_ON(display->drm, idx < 0 || idx >= intel_dp->link.num_configs))
> +		idx = 0;
> +
> +	lc = &intel_dp->link.configs[idx];
> +
> +	*link_rate = intel_dp_link_config_rate(intel_dp, lc);
> +	*lane_count = intel_dp_link_config_lane_count(lc);
> +}
> +
> +int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count)
> +{
> +	int link_rate_idx = intel_dp_rate_index(intel_dp->common_rates, intel_dp->num_common_rates,
> +						link_rate);
> +	int lane_count_exp = ilog2(lane_count);
> +	int i;
> +
> +	for (i = 0; i < intel_dp->link.num_configs; i++) {
> +		const struct intel_dp_link_config_entry *lc = &intel_dp->link.configs[i];
> +
> +		if (lc->lane_count_exp == lane_count_exp &&
> +		    lc->link_rate_idx == link_rate_idx)
> +			return i;
> +	}
> +
> +	return -1;
> +}
> +
>  static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
>  {
>  	struct intel_connector *connector = to_intel_connector(m->private);
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index c6a84891db464..dab956e804b95 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -17,6 +17,11 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp);
>  void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
>  					  struct intel_dp_link_config *forced_params);
>  
> +int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
> +void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
> +
> +void intel_dp_link_config_init(struct intel_dp *intel_dp);
> +
>  void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
>  
>  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);

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

* RE: [PATCH v2 11/28] drm/i915/dp_link_caps: Move link config tracking to link_caps
  2026-06-16 20:08 ` [PATCH v2 11/28] drm/i915/dp_link_caps: Move link config tracking to link_caps Imre Deak
@ 2026-06-23 11:17   ` Kahola, Mika
  2026-06-24 11:15   ` Luca Coelho
  1 sibling, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-23 11:17 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 11/28] drm/i915/dp_link_caps: Move link config tracking to link_caps
> 
> Move tracking of the link configurations from struct intel_dp to struct
> intel_dp_link_caps.
> 
> Previous changes moved the helpers operating on configurations to the
> link caps module, so the state can now be kept internal to that module.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  .../drm/i915/display/intel_display_types.h    | 12 -------
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 36 ++++++++++++++-----
>  2 files changed, 27 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index c84ef29529373..443bb3b5e9fa3 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1841,18 +1841,6 @@ struct intel_dp {
>  	struct {
>  		/* TODO: move the rest of link specific fields to here */
>  		bool active;
> -		/* common rate,lane_count configs in bw order */
> -		int num_configs;
> -#define INTEL_DP_MAX_LANE_COUNT			4
> -#define INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS	(ilog2(INTEL_DP_MAX_LANE_COUNT) + 1)
> -#define INTEL_DP_LANE_COUNT_EXP_BITS		order_base_2(INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
> -#define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
> -#define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
> -						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
> -		struct intel_dp_link_config_entry {
> -			u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
> -			u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
> -		} configs[INTEL_DP_MAX_LINK_CONFIGS];
>  		/* Max lane count for the current link */
>  		int max_lane_count;
>  		/* Max rate for the current link */
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 6a37ba8c35e27..05ec933c74407 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -3,10 +3,12 @@
>   * Copyright © 2026 Intel Corporation
>   */
> 
> +#include <linux/bitops.h>
>  #include <linux/debugfs.h>
>  #include <linux/log2.h>
>  #include <linux/slab.h>
>  #include <linux/sort.h>
> +#include <linux/types.h>
> 
>  #include <drm/drm_print.h>
> 
> @@ -18,6 +20,19 @@
>  struct intel_dp_link_caps {
>  	struct intel_dp *dp;
> 
> +	/* common rate,lane_count configs in bw order */
> +	int num_configs;
> +#define INTEL_DP_MAX_LANE_COUNT			4
> +#define INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS	(ilog2(INTEL_DP_MAX_LANE_COUNT) + 1)
> +#define INTEL_DP_LANE_COUNT_EXP_BITS		order_base_2(INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
> +#define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
> +#define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
> +						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
> +	struct intel_dp_link_config_entry {
> +		u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
> +		u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
> +	} configs[INTEL_DP_MAX_LINK_CONFIGS];
> +
>  	/*
>  	 * Forced parameters requested via debugfs. Remains set across sink
>  	 * disconnects.
> @@ -118,6 +133,7 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
> 
>  void intel_dp_link_config_init(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	struct intel_display *display = to_intel_display(intel_dp);
>  	struct intel_dp_link_config_entry *lc;
>  	int num_common_lane_configs;
> @@ -130,12 +146,12 @@ void intel_dp_link_config_init(struct intel_dp *intel_dp)
>  	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
> 
>  	if (drm_WARN_ON(display->drm, intel_dp->num_common_rates * num_common_lane_configs >
> -				    ARRAY_SIZE(intel_dp->link.configs)))
> +				    ARRAY_SIZE(link_caps->configs)))
>  		return;
> 
> -	intel_dp->link.num_configs = intel_dp->num_common_rates * num_common_lane_configs;
> +	link_caps->num_configs = intel_dp->num_common_rates * num_common_lane_configs;
> 
> -	lc = &intel_dp->link.configs[0];
> +	lc = &link_caps->configs[0];
>  	for (i = 0; i < intel_dp->num_common_rates; i++) {
>  		for (j = 0; j < num_common_lane_configs; j++) {
>  			lc->lane_count_exp = j;
> @@ -145,21 +161,22 @@ void intel_dp_link_config_init(struct intel_dp *intel_dp)
>  		}
>  	}
> 
> -	sort_r(intel_dp->link.configs, intel_dp->link.num_configs,
> -	       sizeof(intel_dp->link.configs[0]),
> +	sort_r(link_caps->configs, link_caps->num_configs,
> +	       sizeof(link_caps->configs[0]),
>  	       link_config_cmp_by_bw, NULL,
>  	       intel_dp);
>  }
> 
>  void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	struct intel_display *display = to_intel_display(intel_dp);
>  	const struct intel_dp_link_config_entry *lc;
> 
> -	if (drm_WARN_ON(display->drm, idx < 0 || idx >= intel_dp->link.num_configs))
> +	if (drm_WARN_ON(display->drm, idx < 0 || idx >= link_caps->num_configs))
>  		idx = 0;
> 
> -	lc = &intel_dp->link.configs[idx];
> +	lc = &link_caps->configs[idx];
> 
>  	*link_rate = intel_dp_link_config_rate(intel_dp, lc);
>  	*lane_count = intel_dp_link_config_lane_count(lc);
> @@ -167,13 +184,14 @@ void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate
> 
>  int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	int link_rate_idx = intel_dp_rate_index(intel_dp->common_rates, intel_dp->num_common_rates,
>  						link_rate);
>  	int lane_count_exp = ilog2(lane_count);
>  	int i;
> 
> -	for (i = 0; i < intel_dp->link.num_configs; i++) {
> -		const struct intel_dp_link_config_entry *lc = &intel_dp->link.configs[i];
> +	for (i = 0; i < link_caps->num_configs; i++) {
> +		const struct intel_dp_link_config_entry *lc = &link_caps->configs[i];
> 
>  		if (lc->lane_count_exp == lane_count_exp &&
>  		    lc->link_rate_idx == link_rate_idx)
> --
> 2.49.1


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

* Re: [PATCH v2 05/28] drm/i915/dp_link_caps: Move forced link param helpers to link caps
  2026-06-23 10:22   ` Luca Coelho
@ 2026-06-23 12:42     ` Imre Deak
  2026-06-23 12:47       ` Luca Coelho
  0 siblings, 1 reply; 68+ messages in thread
From: Imre Deak @ 2026-06-23 12:42 UTC (permalink / raw)
  To: Luca Coelho; +Cc: intel-gfx, intel-xe

On Tue, Jun 23, 2026 at 01:22:41PM +0300, Luca Coelho wrote:
> On Tue, 2026-06-16 at 23:08 +0300, Imre Deak wrote:
> > Move the helpers handling forced link parameters to intel_dp_link_caps.c.
> > Their functionality is part of the link capability logic and will be
> > updated to use the link capability state in follow-up changes.
> > 
> > Return the forced link rate and lane count through a
> > struct intel_dp_link_config, which is the canonical way the rest of the
> > link capability API will also accept and return link configurations.
> > 
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_dp.c       | 39 ++++++++++---------
> >  .../gpu/drm/i915/display/intel_dp_link_caps.c | 22 +++++++++++
> >  .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 +++
> >  3 files changed, 47 insertions(+), 19 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> > index a34d3704a5667..7643fe079e15b 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -364,17 +364,16 @@ int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
> >  	return intel_dp->max_common_lane_count;
> >  }
> >  
> > -static int forced_lane_count(struct intel_dp *intel_dp)
> > -{
> > -	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
> > -}
> > -
> >  int intel_dp_max_lane_count(struct intel_dp *intel_dp)
> >  {
> > +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> > +	struct intel_dp_link_config forced_params;
> >  	int lane_count;
> >  
> > +	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> > +
> >  	if (intel_dp->link.force_lane_count)
> > -		lane_count = forced_lane_count(intel_dp);
> > +		lane_count = forced_params.lane_count;
> >  	else
> >  		lane_count = intel_dp->link.max_lane_count;
> >  
> > @@ -391,8 +390,12 @@ int intel_dp_max_lane_count(struct intel_dp *intel_dp)
> >  
> >  static int intel_dp_min_lane_count(struct intel_dp *intel_dp)
> >  {
> > +	struct intel_dp_link_config forced_params;
> > +
> > +	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
> > +
> >  	if (intel_dp->link.force_lane_count)
> > -		return forced_lane_count(intel_dp);
> > +		return forced_params.lane_count;
> >  
> >  	return 1;
> >  }
> > @@ -1655,23 +1658,17 @@ static void intel_dp_print_rates(struct intel_dp *intel_dp)
> >  	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
> >  }
> >  
> > -static int forced_link_rate(struct intel_dp *intel_dp)
> > -{
> > -	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
> > -
> > -	if (len == 0)
> > -		return intel_dp_common_rate(intel_dp, 0);
> > -
> > -	return intel_dp_common_rate(intel_dp, len - 1);
> > -}
> > -
> >  int
> >  intel_dp_max_link_rate(struct intel_dp *intel_dp)
> >  {
> > +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> > +	struct intel_dp_link_config forced_params;
> >  	int len;
> >  
> > +	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> > +
> >  	if (intel_dp->link.force_rate)
> > -		return forced_link_rate(intel_dp);
> > +		return forced_params.rate;
> >  
> >  	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.max_rate);
> >  
> > @@ -1681,8 +1678,12 @@ intel_dp_max_link_rate(struct intel_dp *intel_dp)
> >  static int
> >  intel_dp_min_link_rate(struct intel_dp *intel_dp)
> >  {
> > +	struct intel_dp_link_config forced_params;
> > +
> > +	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
> > +
> >  	if (intel_dp->link.force_rate)
> > -		return forced_link_rate(intel_dp);
> > +		return forced_params.rate;
> >  
> >  	return intel_dp_common_rate(intel_dp, 0);
> >  }
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> > index 37ffd714c6a42..1d3a3ff007a03 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> > @@ -41,6 +41,28 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
> >  	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
> >  }
> >  
> > +static int forced_lane_count(struct intel_dp *intel_dp)
> > +{
> > +	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
> > +}
> > +
> > +static int forced_link_rate(struct intel_dp *intel_dp)
> > +{
> > +	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
> > +
> > +	if (len == 0)
> > +		return intel_dp_common_rate(intel_dp, 0);
> > +
> > +	return intel_dp_common_rate(intel_dp, len - 1);
> > +}
> > +
> > +void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
> > +					  struct intel_dp_link_config *forced_params)
> 
> Is this really _get_? Usually "get" in the function name in my head
> returns something (which in this case would be the forced_params), but
> here we're actually setting them.

The function really just returns the forced params tracked in link_caps
and the returning happens via the forced_params struct pointer passed to
the function; so get is the proper name for the function. "set" would
set the forced params in link_caps.

> 
> Should it be _set_, or maybe "parse"?
> 
> 
> > +{
> > +	forced_params->rate = forced_link_rate(link_caps->dp);
> > +	forced_params->lane_count = forced_lane_count(link_caps->dp);
> > +}
> > +
> >  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
> >  {
> >  	struct intel_dp_link_caps *link_caps;
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> > index 3248777d1287f..61dbce86ee3d0 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> > @@ -5,12 +5,17 @@
> >  #define __INTEL_DP_LINK_CAPS_H__
> >  
> >  struct intel_dp;
> > +struct intel_dp_link_caps;
> > +struct intel_dp_link_config;
> >  
> >  int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
> >  				   int max_rate);
> >  int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
> >  int intel_dp_max_common_rate(struct intel_dp *intel_dp);
> >  
> > +void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
> > +					  struct intel_dp_link_config *forced_params);
> > +
> >  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
> >  void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
> >  
> 
> --
> Cheers,
> Luca.

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

* Re: [PATCH v2 05/28] drm/i915/dp_link_caps: Move forced link param helpers to link caps
  2026-06-23 12:42     ` Imre Deak
@ 2026-06-23 12:47       ` Luca Coelho
  0 siblings, 0 replies; 68+ messages in thread
From: Luca Coelho @ 2026-06-23 12:47 UTC (permalink / raw)
  To: imre.deak; +Cc: intel-gfx, intel-xe

On Tue, 2026-06-23 at 15:42 +0300, Imre Deak wrote:
> On Tue, Jun 23, 2026 at 01:22:41PM +0300, Luca Coelho wrote:
> > On Tue, 2026-06-16 at 23:08 +0300, Imre Deak wrote:
> > > Move the helpers handling forced link parameters to intel_dp_link_caps.c.
> > > Their functionality is part of the link capability logic and will be
> > > updated to use the link capability state in follow-up changes.
> > > 
> > > Return the forced link rate and lane count through a
> > > struct intel_dp_link_config, which is the canonical way the rest of the
> > > link capability API will also accept and return link configurations.
> > > 
> > > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > > ---
> > >  drivers/gpu/drm/i915/display/intel_dp.c       | 39 ++++++++++---------
> > >  .../gpu/drm/i915/display/intel_dp_link_caps.c | 22 +++++++++++
> > >  .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 +++
> > >  3 files changed, 47 insertions(+), 19 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> > > index a34d3704a5667..7643fe079e15b 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > > @@ -364,17 +364,16 @@ int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
> > >  	return intel_dp->max_common_lane_count;
> > >  }
> > >  
> > > -static int forced_lane_count(struct intel_dp *intel_dp)
> > > -{
> > > -	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
> > > -}
> > > -
> > >  int intel_dp_max_lane_count(struct intel_dp *intel_dp)
> > >  {
> > > +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> > > +	struct intel_dp_link_config forced_params;
> > >  	int lane_count;
> > >  
> > > +	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> > > +
> > >  	if (intel_dp->link.force_lane_count)
> > > -		lane_count = forced_lane_count(intel_dp);
> > > +		lane_count = forced_params.lane_count;
> > >  	else
> > >  		lane_count = intel_dp->link.max_lane_count;
> > >  
> > > @@ -391,8 +390,12 @@ int intel_dp_max_lane_count(struct intel_dp *intel_dp)
> > >  
> > >  static int intel_dp_min_lane_count(struct intel_dp *intel_dp)
> > >  {
> > > +	struct intel_dp_link_config forced_params;
> > > +
> > > +	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
> > > +
> > >  	if (intel_dp->link.force_lane_count)
> > > -		return forced_lane_count(intel_dp);
> > > +		return forced_params.lane_count;
> > >  
> > >  	return 1;
> > >  }
> > > @@ -1655,23 +1658,17 @@ static void intel_dp_print_rates(struct intel_dp *intel_dp)
> > >  	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
> > >  }
> > >  
> > > -static int forced_link_rate(struct intel_dp *intel_dp)
> > > -{
> > > -	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
> > > -
> > > -	if (len == 0)
> > > -		return intel_dp_common_rate(intel_dp, 0);
> > > -
> > > -	return intel_dp_common_rate(intel_dp, len - 1);
> > > -}
> > > -
> > >  int
> > >  intel_dp_max_link_rate(struct intel_dp *intel_dp)
> > >  {
> > > +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> > > +	struct intel_dp_link_config forced_params;
> > >  	int len;
> > >  
> > > +	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> > > +
> > >  	if (intel_dp->link.force_rate)
> > > -		return forced_link_rate(intel_dp);
> > > +		return forced_params.rate;
> > >  
> > >  	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.max_rate);
> > >  
> > > @@ -1681,8 +1678,12 @@ intel_dp_max_link_rate(struct intel_dp *intel_dp)
> > >  static int
> > >  intel_dp_min_link_rate(struct intel_dp *intel_dp)
> > >  {
> > > +	struct intel_dp_link_config forced_params;
> > > +
> > > +	intel_dp_link_caps_get_forced_params(intel_dp->link.caps, &forced_params);
> > > +
> > >  	if (intel_dp->link.force_rate)
> > > -		return forced_link_rate(intel_dp);
> > > +		return forced_params.rate;
> > >  
> > >  	return intel_dp_common_rate(intel_dp, 0);
> > >  }
> > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> > > index 37ffd714c6a42..1d3a3ff007a03 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> > > @@ -41,6 +41,28 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
> > >  	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
> > >  }
> > >  
> > > +static int forced_lane_count(struct intel_dp *intel_dp)
> > > +{
> > > +	return clamp(intel_dp->link.force_lane_count, 1, intel_dp_max_common_lane_count(intel_dp));
> > > +}
> > > +
> > > +static int forced_link_rate(struct intel_dp *intel_dp)
> > > +{
> > > +	int len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.force_rate);
> > > +
> > > +	if (len == 0)
> > > +		return intel_dp_common_rate(intel_dp, 0);
> > > +
> > > +	return intel_dp_common_rate(intel_dp, len - 1);
> > > +}
> > > +
> > > +void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
> > > +					  struct intel_dp_link_config *forced_params)
> > 
> > Is this really _get_? Usually "get" in the function name in my head
> > returns something (which in this case would be the forced_params), but
> > here we're actually setting them.
> 
> The function really just returns the forced params tracked in link_caps
> and the returning happens via the forced_params struct pointer passed to
> the function; so get is the proper name for the function. "set" would
> set the forced params in link_caps.

Okay, fair enough.  This looks a bit clumsy at first, but in any case:

Reviewed-by: Luca Coelho <luciano.coelho@intel.com>

--
Cheers,
Luca.


> 
> > 
> > Should it be _set_, or maybe "parse"?
> > 
> > 
> > > +{
> > > +	forced_params->rate = forced_link_rate(link_caps->dp);
> > > +	forced_params->lane_count = forced_lane_count(link_caps->dp);
> > > +}
> > > +
> > >  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
> > >  {
> > >  	struct intel_dp_link_caps *link_caps;
> > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> > > index 3248777d1287f..61dbce86ee3d0 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> > > @@ -5,12 +5,17 @@
> > >  #define __INTEL_DP_LINK_CAPS_H__
> > >  
> > >  struct intel_dp;
> > > +struct intel_dp_link_caps;
> > > +struct intel_dp_link_config;
> > >  
> > >  int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
> > >  				   int max_rate);
> > >  int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
> > >  int intel_dp_max_common_rate(struct intel_dp *intel_dp);
> > >  
> > > +void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
> > > +					  struct intel_dp_link_config *forced_params);
> > > +
> > >  struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
> > >  void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
> > >  
> > 
> > --
> > Cheers,
> > Luca.

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

* RE: [PATCH v2 13/28] drm/i915/dp: Factor out helper to get link rate capabilities
  2026-06-16 20:08 ` [PATCH v2 13/28] drm/i915/dp: Factor out helper to get link rate capabilities Imre Deak
@ 2026-06-24  8:29   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-24  8:29 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 13/28] drm/i915/dp: Factor out helper to get link rate capabilities
> 
> Factor out a helper to get the supported link rates. This allows to
> gather all the link capabilities and pass these to the link capability
> module from a single place. A follow-up change will extend this to
> gather and pass the maximum lane count capability in the same way.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c | 37 +++++++++++++++----------
>  1 file changed, 22 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 65a13b2f7584d..635e3ede0d41e 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -676,33 +676,40 @@ int intel_dp_rate_index(const int *rates, int len, int rate)
>  	return -1;
>  }
> 
> -/* Return %true if the common rates changed. */
> -static bool intel_dp_set_common_rates(struct intel_dp *intel_dp)
> +static void intel_dp_get_common_rates(struct intel_dp *intel_dp,
> +				      int common_rates[DP_MAX_SUPPORTED_RATES],
> +				      int *num_common_rates)
>  {
>  	struct intel_display *display = to_intel_display(intel_dp);
> -	int num_old_common_rates = intel_dp->num_common_rates;
> -	int old_common_rates[DP_MAX_SUPPORTED_RATES];
> 
>  	drm_WARN_ON(display->drm,
>  		    !intel_dp->num_source_rates || !intel_dp->num_sink_rates);
> 
> +	*num_common_rates = intersect_rates(intel_dp->source_rates,
> +					    intel_dp->num_source_rates,
> +					    intel_dp->sink_rates,
> +					    intel_dp->num_sink_rates,
> +					    common_rates);
> +
> +	/* Paranoia, there should always be something in common. */
> +	if (drm_WARN_ON(display->drm, *num_common_rates == 0)) {
> +		common_rates[0] = 162000;
> +		*num_common_rates = 1;
> +	}
> +}
> +
> +static bool intel_dp_set_common_rates(struct intel_dp *intel_dp)
> +{
> +	int num_old_common_rates = intel_dp->num_common_rates;
> +	int old_common_rates[DP_MAX_SUPPORTED_RATES];
> +
>  	/* TODO: Add a struct containing both rates and number of rates. */
>  	static_assert(__same_type(old_common_rates[0], intel_dp->common_rates[0]) &&
>  		      sizeof(old_common_rates) == sizeof(intel_dp->common_rates));
>  	memcpy(old_common_rates, intel_dp->common_rates,
>  	       num_old_common_rates * sizeof(old_common_rates[0]));
> 
> -	intel_dp->num_common_rates = intersect_rates(intel_dp->source_rates,
> -						     intel_dp->num_source_rates,
> -						     intel_dp->sink_rates,
> -						     intel_dp->num_sink_rates,
> -						     intel_dp->common_rates);
> -
> -	/* Paranoia, there should always be something in common. */
> -	if (drm_WARN_ON(display->drm, intel_dp->num_common_rates == 0)) {
> -		intel_dp->common_rates[0] = 162000;
> -		intel_dp->num_common_rates = 1;
> -	}
> +	intel_dp_get_common_rates(intel_dp, intel_dp->common_rates, &intel_dp->num_common_rates);
> 
>  	return num_old_common_rates != intel_dp->num_common_rates ||
>  	       memcmp(old_common_rates, intel_dp->common_rates,
> --
> 2.49.1


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

* RE: [PATCH v2 14/28] drm/i915/dp_link_caps: Pass supported link rates to link caps update
  2026-06-16 20:08 ` [PATCH v2 14/28] drm/i915/dp_link_caps: Pass supported link rates to link caps update Imre Deak
@ 2026-06-24  8:32   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-24  8:32 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 14/28] drm/i915/dp_link_caps: Pass supported link rates to link caps update
> 
> Pass the supported link rates explicitly to intel_dp_link_caps_update().
> This prepares for tracking these capabilities internally within the
> link caps module.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c       | 28 ++++---------------
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 28 +++++++++++++++----
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 +++-
>  3 files changed, 33 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 635e3ede0d41e..d2b9b6fce2b32 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -698,36 +698,20 @@ static void intel_dp_get_common_rates(struct intel_dp *intel_dp,
>  	}
>  }
> 
> -static bool intel_dp_set_common_rates(struct intel_dp *intel_dp)
> -{
> -	int num_old_common_rates = intel_dp->num_common_rates;
> -	int old_common_rates[DP_MAX_SUPPORTED_RATES];
> -
> -	/* TODO: Add a struct containing both rates and number of rates. */
> -	static_assert(__same_type(old_common_rates[0], intel_dp->common_rates[0]) &&
> -		      sizeof(old_common_rates) == sizeof(intel_dp->common_rates));
> -	memcpy(old_common_rates, intel_dp->common_rates,
> -	       num_old_common_rates * sizeof(old_common_rates[0]));
> -
> -	intel_dp_get_common_rates(intel_dp, intel_dp->common_rates, &intel_dp->num_common_rates);
> -
> -	return num_old_common_rates != intel_dp->num_common_rates ||
> -	       memcmp(old_common_rates, intel_dp->common_rates,
> -		      num_old_common_rates * sizeof(old_common_rates[0]));
> -}
> -
>  /* Return %true if any common link param changed. */
>  static bool intel_dp_set_common_link_params(struct intel_dp *intel_dp)
>  {
> +	int num_common_rates;
> +	int common_rates[DP_MAX_SUPPORTED_RATES];
>  	bool params_changed = false;
> 
> -	if (intel_dp_set_common_rates(intel_dp))
> -		params_changed = true;
> -
>  	if (intel_dp_set_max_common_lane_count(intel_dp))
>  		params_changed = true;
> 
> -	intel_dp_link_caps_update(intel_dp);
> +	intel_dp_get_common_rates(intel_dp, common_rates, &num_common_rates);
> +	if (intel_dp_link_caps_update(intel_dp,
> +				      common_rates, num_common_rates))
> +		params_changed = true;
> 
>  	return params_changed;
>  }
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 2074952931738..679d59cc256c9 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -8,6 +8,7 @@
>  #include <linux/log2.h>
>  #include <linux/slab.h>
>  #include <linux/sort.h>
> +#include <linux/string.h>
>  #include <linux/types.h>
> 
>  #include <drm/drm_print.h>
> @@ -131,25 +132,39 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
>  	       intel_dp_link_config_rate(intel_dp, lc_b);
>  }
> 
> -void intel_dp_link_caps_update(struct intel_dp *intel_dp)
> +/* Return %true if the supported link parameters have changed. */
> +bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
> +			       const int *rates, int num_rates)
>  {
>  	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	struct intel_display *display = to_intel_display(intel_dp);
>  	struct intel_dp_link_config_entry *lc;
> +	bool link_params_changed = false;
>  	int num_common_lane_configs;
>  	int i;
>  	int j;
> 
>  	if (drm_WARN_ON(display->drm, !is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
> -		return;
> +		return false;
> +
> +	if (drm_WARN_ON(display->drm, num_rates > ARRAY_SIZE(intel_dp->common_rates)))
> +		return false;
> 
>  	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
> 
> -	if (drm_WARN_ON(display->drm, intel_dp->num_common_rates * num_common_lane_configs >
> +	if (drm_WARN_ON(display->drm, num_rates * num_common_lane_configs >
>  				    ARRAY_SIZE(link_caps->configs)))
> -		return;
> +		return false;
> 
> -	link_caps->num_configs = intel_dp->num_common_rates * num_common_lane_configs;
> +	/* TODO: Add a struct containing both rates and number of rates. */
> +	static_assert(__same_type(rates[0], intel_dp->common_rates[0]));
> +	if (num_rates != intel_dp->num_common_rates ||
> +	    memcmp(rates, intel_dp->common_rates, num_rates * sizeof(rates[0])))
> +		link_params_changed = true;
> +
> +	memcpy(intel_dp->common_rates, rates, num_rates * sizeof(rates[0]));
> +	intel_dp->num_common_rates = num_rates;
> +	link_caps->num_configs = num_rates * num_common_lane_configs;
> 
>  	lc = &link_caps->configs[0];
>  	for (i = 0; i < intel_dp->num_common_rates; i++) {
> @@ -165,6 +180,9 @@ void intel_dp_link_caps_update(struct intel_dp *intel_dp)
>  	       sizeof(link_caps->configs[0]),
>  	       link_config_cmp_by_bw, NULL,
>  	       intel_dp);
> +
> +	/* TODO: Also detect a change in the max lane count. */
> +	return link_params_changed;
>  }
> 
>  void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index aed2122a05d24..09e580bc5c9b3 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -4,6 +4,8 @@
>  #ifndef __INTEL_DP_LINK_CAPS_H__
>  #define __INTEL_DP_LINK_CAPS_H__
> 
> +#include <linux/types.h>
> +
>  struct intel_connector;
>  struct intel_dp;
>  struct intel_dp_link_caps;
> @@ -20,7 +22,8 @@ void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
>  int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
>  void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
> 
> -void intel_dp_link_caps_update(struct intel_dp *intel_dp);
> +bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
> +			       const int *rates, int num_rates);
> 
>  void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
> 
> --
> 2.49.1


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

* RE: [PATCH v2 16/28] drm/i915/dp_link_caps: Add helper to get the number of supported link rates
  2026-06-16 20:08 ` [PATCH v2 16/28] drm/i915/dp_link_caps: Add helper to get the number of " Imre Deak
@ 2026-06-24  8:34   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-24  8:34 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 16/28] drm/i915/dp_link_caps: Add helper to get the number of supported link rates
> 
> Add intel_dp_link_caps_num_common_rates() to return the number of
> supported link rates tracked by the link_caps module. This prepares for
> tracking these capabilities internally within the link caps module.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c           | 4 ++--
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.c | 5 +++++
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.h | 1 +
>  3 files changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index f9c3d3561c417..84640c8394534 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1766,7 +1766,7 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
>  		int link_bpp_x16 =
>  			intel_dp_output_format_link_bpp_x16(pipe_config->output_format, bpp);
> 
> -		for (i = 0; i < intel_dp->num_common_rates; i++) {
> +		for (i = 0; i < intel_dp_link_caps_num_common_rates(intel_dp->link.caps); i++) {
>  			link_rate = intel_dp_common_rate(intel_dp, i);
>  			if (link_rate < limits->min_rate ||
>  			    link_rate > limits->max_rate)
> @@ -1995,7 +1995,7 @@ static int dsc_compute_link_config(struct intel_dp *intel_dp,
>  	int link_rate, lane_count;
>  	int i;
> 
> -	for (i = 0; i < intel_dp->num_common_rates; i++) {
> +	for (i = 0; i < intel_dp_link_caps_num_common_rates(intel_dp->link.caps); i++) {
>  		link_rate = intel_dp_common_rate(intel_dp, i);
>  		if (link_rate < limits->min_rate || link_rate > limits->max_rate)
>  			continue;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 13f9bfd5d7bad..09b60a0cd6fbb 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -67,6 +67,11 @@ int intel_dp_max_common_rate(struct intel_dp *intel_dp)
>  	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
>  }
> 
> +int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps)
> +{
> +	return link_caps->dp->num_common_rates;
> +}
> +
>  void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps)
>  {
>  	struct intel_dp *intel_dp = link_caps->dp;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 7333df6b82f97..3413f6f760453 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -15,6 +15,7 @@ int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
>  				   int max_rate);
>  int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
>  int intel_dp_max_common_rate(struct intel_dp *intel_dp);
> +int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps);
> 
>  void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps);
> 
> --
> 2.49.1


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

* RE: [PATCH v2 17/28] drm/i915/dp_link_caps: Add helper to get common rate index
  2026-06-16 20:08 ` [PATCH v2 17/28] drm/i915/dp_link_caps: Add helper to get common rate index Imre Deak
@ 2026-06-24  9:02   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-24  9:02 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 17/28] drm/i915/dp_link_caps: Add helper to get common rate index
> 
> Add intel_dp_link_caps_common_rate_idx() to look up supported link rates
> tracked by the link_caps module by rate. This prepares for tracking these
> capabilities internally within the link caps module.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.c     | 9 +++++++++
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.h     | 1 +
>  drivers/gpu/drm/i915/display/intel_dp_link_training.c | 5 ++---
>  drivers/gpu/drm/i915/display/intel_dp_test.c          | 7 ++++---
>  4 files changed, 16 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 09b60a0cd6fbb..84d9636f4adb4 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -61,6 +61,15 @@ int intel_dp_common_rate(struct intel_dp *intel_dp, int index)
>  	return intel_dp->common_rates[index];
>  }
> 
> +int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, int rate)
> +{
> +	struct intel_dp *intel_dp = link_caps->dp;
> +
> +	return intel_dp_rate_index(intel_dp->common_rates,
> +				   intel_dp->num_common_rates,
> +				   rate);
> +}
> +
>  /* Theoretical max between source and sink */
>  int intel_dp_max_common_rate(struct intel_dp *intel_dp)
>  {
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 3413f6f760453..7d7d3d11ba3fe 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -14,6 +14,7 @@ struct intel_dp_link_config;
>  int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
>  				   int max_rate);
>  int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
> +int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, int rate);
>  int intel_dp_max_common_rate(struct intel_dp *intel_dp);
>  int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps);
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> index 61ada34ab9c8e..ec9bd9b4c800b 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -1891,9 +1891,8 @@ static int reduce_link_rate(struct intel_dp *intel_dp, int current_rate)
>  	if (forced_params.rate)
>  		return -1;
> 
> -	rate_index = intel_dp_rate_index(intel_dp->common_rates,
> -					 intel_dp->num_common_rates,
> -					 current_rate);
> +	rate_index = intel_dp_link_caps_common_rate_idx(link_caps,
> +							current_rate);
> 
>  	if (rate_index <= 0)
>  		return -1;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_test.c b/drivers/gpu/drm/i915/display/intel_dp_test.c
> index ba44769c9cfbe..da7632536dace 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_test.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_test.c
> @@ -14,6 +14,7 @@
>  #include "intel_display_regs.h"
>  #include "intel_display_types.h"
>  #include "intel_dp.h"
> +#include "intel_dp_link_caps.h"
>  #include "intel_dp_link_training.h"
>  #include "intel_dp_mst.h"
>  #include "intel_dp_test.h"
> @@ -32,6 +33,7 @@ void intel_dp_test_compute_config(struct intel_dp *intel_dp,
>  				  struct intel_crtc_state *pipe_config,
>  				  struct link_config_limits *limits)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	struct intel_display *display = to_intel_display(intel_dp);
> 
>  	/* For DP Compliance we override the computed bpp for the pipe */
> @@ -54,9 +56,8 @@ void intel_dp_test_compute_config(struct intel_dp *intel_dp,
>  		 */
>  		if (intel_dp_link_params_valid(intel_dp, intel_dp->compliance.test_link_rate,
>  					       intel_dp->compliance.test_lane_count)) {
> -			index = intel_dp_rate_index(intel_dp->common_rates,
> -						    intel_dp->num_common_rates,
> -						    intel_dp->compliance.test_link_rate);
> +			index = intel_dp_link_caps_common_rate_idx(link_caps,
> +								   intel_dp->compliance.test_link_rate);
>  			if (index >= 0) {
>  				limits->min_rate = intel_dp->compliance.test_link_rate;
>  				limits->max_rate = intel_dp->compliance.test_link_rate;
> --
> 2.49.1


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

* RE: [PATCH v2 18/28] drm/i915/dp_link_caps: Move tracking of common rates to link_caps struct
  2026-06-16 20:08 ` [PATCH v2 18/28] drm/i915/dp_link_caps: Move tracking of common rates to link_caps struct Imre Deak
@ 2026-06-24  9:22   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-24  9:22 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 18/28] drm/i915/dp_link_caps: Move tracking of common rates to link_caps struct
> 
> Now that all users access the supported link rates via helpers, move
> tracking of these rates from struct intel_dp to the link_caps state.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  .../drm/i915/display/intel_display_types.h    |  3 --
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 51 +++++++++++--------
>  2 files changed, 29 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 443bb3b5e9fa3..dd43c7ee8f143 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1834,9 +1834,6 @@ struct intel_dp {
>  	bool use_rate_select;
>  	/* Max sink lane count as reported by DP_MAX_LANE_COUNT */
>  	int max_sink_lane_count;
> -	/* intersection of source and sink rates */
> -	int num_common_rates;
> -	int common_rates[DP_MAX_SUPPORTED_RATES];
>  	int max_common_lane_count;
>  	struct {
>  		/* TODO: move the rest of link specific fields to here */
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 84d9636f4adb4..e28f7308283ce 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -22,6 +22,10 @@
>  struct intel_dp_link_caps {
>  	struct intel_dp *dp;
> 
> +	/* Rate, lane count caps common to source and sink. */
> +	int num_rates;
> +	int rates[DP_MAX_SUPPORTED_RATES];
> +
>  	/* common rate,lane_count configs in bw order */
>  	int num_configs;
>  #define INTEL_DP_MAX_LANE_COUNT			4
> @@ -31,6 +35,7 @@ struct intel_dp_link_caps {
>  #define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
>  						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
>  	struct intel_dp_link_config_entry {
> +		/* index into rates[] */
>  		u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
>  		u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
>  	} configs[INTEL_DP_MAX_LINK_CONFIGS];
> @@ -46,50 +51,52 @@ struct intel_dp_link_caps {
>  int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp,
>  				   int max_rate)
>  {
> -	return intel_dp_rate_limit_len(intel_dp->common_rates,
> -				       intel_dp->num_common_rates, max_rate);
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +
> +	return intel_dp_rate_limit_len(link_caps->rates,
> +				       link_caps->num_rates, max_rate);
>  }
> 
>  int intel_dp_common_rate(struct intel_dp *intel_dp, int index)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	struct intel_display *display = to_intel_display(intel_dp);
> 
>  	if (drm_WARN_ON(display->drm,
> -			index < 0 || index >= intel_dp->num_common_rates))
> +			index < 0 || index >= link_caps->num_rates))
>  		return 162000;
> 
> -	return intel_dp->common_rates[index];
> +	return link_caps->rates[index];
>  }
> 
>  int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, int rate)
>  {
> -	struct intel_dp *intel_dp = link_caps->dp;
> -
> -	return intel_dp_rate_index(intel_dp->common_rates,
> -				   intel_dp->num_common_rates,
> +	return intel_dp_rate_index(link_caps->rates,
> +				   link_caps->num_rates,
>  				   rate);
>  }
> 
>  /* Theoretical max between source and sink */
>  int intel_dp_max_common_rate(struct intel_dp *intel_dp)
>  {
> -	return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +
> +	return intel_dp_common_rate(intel_dp, link_caps->num_rates - 1);
>  }
> 
>  int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps)
>  {
> -	return link_caps->dp->num_common_rates;
> +	return link_caps->num_rates;
>  }
> 
>  void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps)
>  {
> -	struct intel_dp *intel_dp = link_caps->dp;
> -	struct intel_display *display = to_intel_display(intel_dp);
> +	struct intel_display *display = to_intel_display(link_caps->dp);
>  	DECLARE_SEQ_BUF(s, 128);
>  	int i;
> 
> -	for (i = 0; i < intel_dp->num_common_rates; i++)
> -		seq_buf_printf(&s, "%s%d", i ? ", " : "", intel_dp->common_rates[i]);
> +	for (i = 0; i < link_caps->num_rates; i++)
> +		seq_buf_printf(&s, "%s%d", i ? ", " : "", link_caps->rates[i]);
> 
>  	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
>  }
> @@ -175,7 +182,7 @@ bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
>  	if (drm_WARN_ON(display->drm, !is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
>  		return false;
> 
> -	if (drm_WARN_ON(display->drm, num_rates > ARRAY_SIZE(intel_dp->common_rates)))
> +	if (drm_WARN_ON(display->drm, num_rates > ARRAY_SIZE(link_caps->rates)))
>  		return false;
> 
>  	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
> @@ -185,17 +192,17 @@ bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
>  		return false;
> 
>  	/* TODO: Add a struct containing both rates and number of rates. */
> -	static_assert(__same_type(rates[0], intel_dp->common_rates[0]));
> -	if (num_rates != intel_dp->num_common_rates ||
> -	    memcmp(rates, intel_dp->common_rates, num_rates * sizeof(rates[0])))
> +	static_assert(__same_type(rates[0], link_caps->rates[0]));
> +	if (num_rates != link_caps->num_rates ||
> +	    memcmp(rates, link_caps->rates, num_rates * sizeof(rates[0])))
>  		link_params_changed = true;
> 
> -	memcpy(intel_dp->common_rates, rates, num_rates * sizeof(rates[0]));
> -	intel_dp->num_common_rates = num_rates;
> +	memcpy(link_caps->rates, rates, num_rates * sizeof(rates[0]));
> +	link_caps->num_rates = num_rates;
>  	link_caps->num_configs = num_rates * num_common_lane_configs;
> 
>  	lc = &link_caps->configs[0];
> -	for (i = 0; i < intel_dp->num_common_rates; i++) {
> +	for (i = 0; i < link_caps->num_rates; i++) {
>  		for (j = 0; j < num_common_lane_configs; j++) {
>  			lc->lane_count_exp = j;
>  			lc->link_rate_idx = i;
> @@ -231,7 +238,7 @@ void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate
>  int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count)
>  {
>  	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> -	int link_rate_idx = intel_dp_rate_index(intel_dp->common_rates, intel_dp->num_common_rates,
> +	int link_rate_idx = intel_dp_rate_index(link_caps->rates, link_caps->num_rates,
>  						link_rate);
>  	int lane_count_exp = ilog2(lane_count);
>  	int i;
> --
> 2.49.1


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

* RE: [PATCH v2 19/28] drm/i915/dp_link_caps: Track max common lane count in link_caps
  2026-06-16 20:08 ` [PATCH v2 19/28] drm/i915/dp_link_caps: Track max common lane count in link_caps Imre Deak
@ 2026-06-24  9:46   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-24  9:46 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 19/28] drm/i915/dp_link_caps: Track max common lane count in link_caps
> 
> Pass the maximum common lane count to intel_dp_link_caps_update() and
> track it together with the supported link rates. This prepares for
> converting all users of intel_dp_max_common_lane_count() to query the
> value from the link caps module instead.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c           | 14 +++++---------
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.c | 13 +++++++++----
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.h |  2 +-
>  3 files changed, 15 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 84640c8394534..2873b2df29f84 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -339,23 +339,19 @@ int intel_dp_max_source_lane_count(struct intel_digital_port *dig_port)
> 
>  /*
>   * Theoretical max between source and sink.
> - * Return %true if the max common lane count changed.
>   */
> -static bool intel_dp_set_max_common_lane_count(struct intel_dp *intel_dp)
> +static int intel_dp_get_max_common_lane_count(struct intel_dp *intel_dp)
>  {
>  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
>  	int source_max = intel_dp_max_source_lane_count(dig_port);
>  	int sink_max = intel_dp->max_sink_lane_count;
>  	int lane_max = intel_tc_port_max_lane_count(dig_port);
>  	int lttpr_max = drm_dp_lttpr_max_lane_count(intel_dp->lttpr_common_caps);
> -	int old_max_common_lane_count = intel_dp->max_common_lane_count;
> 
>  	if (lttpr_max)
>  		sink_max = min(sink_max, lttpr_max);
> 
> -	intel_dp->max_common_lane_count = min3(source_max, sink_max, lane_max);
> -
> -	return intel_dp->max_common_lane_count != old_max_common_lane_count;
> +	return min3(source_max, sink_max, lane_max);
>  }
> 
>  int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
> @@ -705,12 +701,12 @@ static bool intel_dp_set_common_link_params(struct intel_dp *intel_dp)
>  	int common_rates[DP_MAX_SUPPORTED_RATES];
>  	bool params_changed = false;
> 
> -	if (intel_dp_set_max_common_lane_count(intel_dp))
> -		params_changed = true;
> +	intel_dp->max_common_lane_count = intel_dp_get_max_common_lane_count(intel_dp);
> 
>  	intel_dp_get_common_rates(intel_dp, common_rates, &num_common_rates);
>  	if (intel_dp_link_caps_update(intel_dp,
> -				      common_rates, num_common_rates))
> +				      common_rates, num_common_rates,
> +				      intel_dp_get_max_common_lane_count(intel_dp)))
>  		params_changed = true;
> 
>  	return params_changed;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index e28f7308283ce..bb727bcf4de18 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -25,6 +25,7 @@ struct intel_dp_link_caps {
>  	/* Rate, lane count caps common to source and sink. */
>  	int num_rates;
>  	int rates[DP_MAX_SUPPORTED_RATES];
> +	int max_lane_count;
> 
>  	/* common rate,lane_count configs in bw order */
>  	int num_configs;
> @@ -169,7 +170,7 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
> 
>  /* Return %true if the supported link parameters have changed. */
>  bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
> -			       const int *rates, int num_rates)
> +			       const int *rates, int num_rates, int max_lane_count)
>  {
>  	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	struct intel_display *display = to_intel_display(intel_dp);
> @@ -179,13 +180,13 @@ bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
>  	int i;
>  	int j;
> 
> -	if (drm_WARN_ON(display->drm, !is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
> +	if (drm_WARN_ON(display->drm, !is_power_of_2(max_lane_count)))
>  		return false;
> 
>  	if (drm_WARN_ON(display->drm, num_rates > ARRAY_SIZE(link_caps->rates)))
>  		return false;
> 
> -	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
> +	num_common_lane_configs = ilog2(max_lane_count) + 1;
> 
>  	if (drm_WARN_ON(display->drm, num_rates * num_common_lane_configs >
>  				    ARRAY_SIZE(link_caps->configs)))
> @@ -197,8 +198,13 @@ bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
>  	    memcmp(rates, link_caps->rates, num_rates * sizeof(rates[0])))
>  		link_params_changed = true;
> 
> +	if (max_lane_count != link_caps->max_lane_count)
> +		link_params_changed = true;
> +
>  	memcpy(link_caps->rates, rates, num_rates * sizeof(rates[0]));
>  	link_caps->num_rates = num_rates;
> +	link_caps->max_lane_count = max_lane_count;
> +
>  	link_caps->num_configs = num_rates * num_common_lane_configs;
> 
>  	lc = &link_caps->configs[0];
> @@ -216,7 +222,6 @@ bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
>  	       link_config_cmp_by_bw, NULL,
>  	       intel_dp);
> 
> -	/* TODO: Also detect a change in the max lane count. */
>  	return link_params_changed;
>  }
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 7d7d3d11ba3fe..e2f53eb167a8e 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -27,7 +27,7 @@ int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lan
>  void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
> 
>  bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
> -			       const int *rates, int num_rates);
> +			       const int *rates, int num_rates, int max_lane_count);
> 
>  void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
> 
> --
> 2.49.1


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

* Re: [PATCH v2 11/28] drm/i915/dp_link_caps: Move link config tracking to link_caps
  2026-06-16 20:08 ` [PATCH v2 11/28] drm/i915/dp_link_caps: Move link config tracking to link_caps Imre Deak
  2026-06-23 11:17   ` Kahola, Mika
@ 2026-06-24 11:15   ` Luca Coelho
  1 sibling, 0 replies; 68+ messages in thread
From: Luca Coelho @ 2026-06-24 11:15 UTC (permalink / raw)
  To: Imre Deak, intel-gfx, intel-xe

On Tue, 2026-06-16 at 23:08 +0300, Imre Deak wrote:
> Move tracking of the link configurations from struct intel_dp to struct
> intel_dp_link_caps.
> 
> Previous changes moved the helpers operating on configurations to the
> link caps module, so the state can now be kept internal to that module.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---

Reviewed-by: Luca Coelho <luciano.coelho@intel.com>

--
Cheers,
Luca.



>  .../drm/i915/display/intel_display_types.h    | 12 -------
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 36 ++++++++++++++-----
>  2 files changed, 27 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index c84ef29529373..443bb3b5e9fa3 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1841,18 +1841,6 @@ struct intel_dp {
>  	struct {
>  		/* TODO: move the rest of link specific fields to here */
>  		bool active;
> -		/* common rate,lane_count configs in bw order */
> -		int num_configs;
> -#define INTEL_DP_MAX_LANE_COUNT			4
> -#define INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS	(ilog2(INTEL_DP_MAX_LANE_COUNT) + 1)
> -#define INTEL_DP_LANE_COUNT_EXP_BITS		order_base_2(INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
> -#define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
> -#define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
> -						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
> -		struct intel_dp_link_config_entry {
> -			u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
> -			u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
> -		} configs[INTEL_DP_MAX_LINK_CONFIGS];
>  		/* Max lane count for the current link */
>  		int max_lane_count;
>  		/* Max rate for the current link */
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 6a37ba8c35e27..05ec933c74407 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -3,10 +3,12 @@
>   * Copyright © 2026 Intel Corporation
>   */
>  
> +#include <linux/bitops.h>
>  #include <linux/debugfs.h>
>  #include <linux/log2.h>
>  #include <linux/slab.h>
>  #include <linux/sort.h>
> +#include <linux/types.h>
>  
>  #include <drm/drm_print.h>
>  
> @@ -18,6 +20,19 @@
>  struct intel_dp_link_caps {
>  	struct intel_dp *dp;
>  
> +	/* common rate,lane_count configs in bw order */
> +	int num_configs;
> +#define INTEL_DP_MAX_LANE_COUNT			4
> +#define INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS	(ilog2(INTEL_DP_MAX_LANE_COUNT) + 1)
> +#define INTEL_DP_LANE_COUNT_EXP_BITS		order_base_2(INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
> +#define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
> +#define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
> +						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
> +	struct intel_dp_link_config_entry {
> +		u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
> +		u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
> +	} configs[INTEL_DP_MAX_LINK_CONFIGS];
> +
>  	/*
>  	 * Forced parameters requested via debugfs. Remains set across sink
>  	 * disconnects.
> @@ -118,6 +133,7 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
>  
>  void intel_dp_link_config_init(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	struct intel_display *display = to_intel_display(intel_dp);
>  	struct intel_dp_link_config_entry *lc;
>  	int num_common_lane_configs;
> @@ -130,12 +146,12 @@ void intel_dp_link_config_init(struct intel_dp *intel_dp)
>  	num_common_lane_configs = ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
>  
>  	if (drm_WARN_ON(display->drm, intel_dp->num_common_rates * num_common_lane_configs >
> -				    ARRAY_SIZE(intel_dp->link.configs)))
> +				    ARRAY_SIZE(link_caps->configs)))
>  		return;
>  
> -	intel_dp->link.num_configs = intel_dp->num_common_rates * num_common_lane_configs;
> +	link_caps->num_configs = intel_dp->num_common_rates * num_common_lane_configs;
>  
> -	lc = &intel_dp->link.configs[0];
> +	lc = &link_caps->configs[0];
>  	for (i = 0; i < intel_dp->num_common_rates; i++) {
>  		for (j = 0; j < num_common_lane_configs; j++) {
>  			lc->lane_count_exp = j;
> @@ -145,21 +161,22 @@ void intel_dp_link_config_init(struct intel_dp *intel_dp)
>  		}
>  	}
>  
> -	sort_r(intel_dp->link.configs, intel_dp->link.num_configs,
> -	       sizeof(intel_dp->link.configs[0]),
> +	sort_r(link_caps->configs, link_caps->num_configs,
> +	       sizeof(link_caps->configs[0]),
>  	       link_config_cmp_by_bw, NULL,
>  	       intel_dp);
>  }
>  
>  void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	struct intel_display *display = to_intel_display(intel_dp);
>  	const struct intel_dp_link_config_entry *lc;
>  
> -	if (drm_WARN_ON(display->drm, idx < 0 || idx >= intel_dp->link.num_configs))
> +	if (drm_WARN_ON(display->drm, idx < 0 || idx >= link_caps->num_configs))
>  		idx = 0;
>  
> -	lc = &intel_dp->link.configs[idx];
> +	lc = &link_caps->configs[idx];
>  
>  	*link_rate = intel_dp_link_config_rate(intel_dp, lc);
>  	*lane_count = intel_dp_link_config_lane_count(lc);
> @@ -167,13 +184,14 @@ void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate
>  
>  int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	int link_rate_idx = intel_dp_rate_index(intel_dp->common_rates, intel_dp->num_common_rates,
>  						link_rate);
>  	int lane_count_exp = ilog2(lane_count);
>  	int i;
>  
> -	for (i = 0; i < intel_dp->link.num_configs; i++) {
> -		const struct intel_dp_link_config_entry *lc = &intel_dp->link.configs[i];
> +	for (i = 0; i < link_caps->num_configs; i++) {
> +		const struct intel_dp_link_config_entry *lc = &link_caps->configs[i];
>  
>  		if (lc->lane_count_exp == lane_count_exp &&
>  		    lc->link_rate_idx == link_rate_idx)

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

* RE: [PATCH v2 20/28] drm/i915/dp_link_caps: Use max common lane count from link_caps
  2026-06-16 20:08 ` [PATCH v2 20/28] drm/i915/dp_link_caps: Use max common lane count from link_caps Imre Deak
@ 2026-06-24 11:29   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-24 11:29 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 20/28] drm/i915/dp_link_caps: Use max common lane count from link_caps
> 
> Convert all users of intel_dp_max_common_lane_count() to query the
> maximum common lane count via the link capability API, in common with
> the link rate queries.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display_types.h | 1 -
>  drivers/gpu/drm/i915/display/intel_dp.c            | 9 +--------
>  drivers/gpu/drm/i915/display/intel_dp.h            | 1 -
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.c  | 7 ++++++-
>  drivers/gpu/drm/i915/display/intel_dp_link_caps.h  | 1 +
>  drivers/gpu/drm/i915/display/intel_dp_tunnel.c     | 3 ++-
>  6 files changed, 10 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index dd43c7ee8f143..19c66b3a81509 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1834,7 +1834,6 @@ struct intel_dp {
>  	bool use_rate_select;
>  	/* Max sink lane count as reported by DP_MAX_LANE_COUNT */
>  	int max_sink_lane_count;
> -	int max_common_lane_count;
>  	struct {
>  		/* TODO: move the rest of link specific fields to here */
>  		bool active;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 2873b2df29f84..0d7ec7a8898c9 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -354,11 +354,6 @@ static int intel_dp_get_max_common_lane_count(struct intel_dp *intel_dp)
>  	return min3(source_max, sink_max, lane_max);
>  }
> 
> -int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
> -{
> -	return intel_dp->max_common_lane_count;
> -}
> -
>  int intel_dp_max_lane_count(struct intel_dp *intel_dp)
>  {
>  	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> @@ -701,8 +696,6 @@ static bool intel_dp_set_common_link_params(struct intel_dp *intel_dp)
>  	int common_rates[DP_MAX_SUPPORTED_RATES];
>  	bool params_changed = false;
> 
> -	intel_dp->max_common_lane_count = intel_dp_get_max_common_lane_count(intel_dp);
> -
>  	intel_dp_get_common_rates(intel_dp, common_rates, &num_common_rates);
>  	if (intel_dp_link_caps_update(intel_dp,
>  				      common_rates, num_common_rates,
> @@ -3613,7 +3606,7 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp,
> 
>  void intel_dp_reset_link_params(struct intel_dp *intel_dp)
>  {
> -	intel_dp->link.max_lane_count = intel_dp_max_common_lane_count(intel_dp);
> +	intel_dp->link.max_lane_count = intel_dp_link_caps_max_common_lane_count(intel_dp->link.caps);
>  	intel_dp->link.max_rate = intel_dp_max_common_rate(intel_dp);
>  	intel_dp->link.mst_probed_lane_count = 0;
>  	intel_dp->link.mst_probed_rate = 0;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
> index fdf9bd88859e7..f776bec7c4254 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp.h
> @@ -106,7 +106,6 @@ int intel_dp_max_link_rate(struct intel_dp *intel_dp);
>  int intel_dp_max_lane_count(struct intel_dp *intel_dp);
>  int intel_dp_config_required_rate(const struct intel_crtc_state *crtc_state);
>  int intel_dp_rate_select(struct intel_dp *intel_dp, int rate);
> -int intel_dp_max_common_lane_count(struct intel_dp *intel_dp);
>  int intel_dp_rate_index(const int *rates, int len, int rate);
>  void intel_dp_update_sink_caps(struct intel_dp *intel_dp);
>  void intel_dp_reset_link_params(struct intel_dp *intel_dp);
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index bb727bcf4de18..b227c9a55f63b 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -102,6 +102,11 @@ void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps)
>  	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
>  }
> 
> +int intel_dp_link_caps_max_common_lane_count(struct intel_dp_link_caps *link_caps)
> +{
> +	return link_caps->max_lane_count;
> +}
> +
>  static int forced_lane_count(struct intel_dp *intel_dp)
>  {
>  	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> @@ -110,7 +115,7 @@ static int forced_lane_count(struct intel_dp *intel_dp)
>  		return 0;
> 
>  	return clamp(link_caps->forced_params.lane_count,
> -		     1, intel_dp_max_common_lane_count(intel_dp));
> +		     1, intel_dp_link_caps_max_common_lane_count(link_caps));
>  }
> 
>  static int forced_link_rate(struct intel_dp *intel_dp)
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index e2f53eb167a8e..9218cb5de2c71 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -17,6 +17,7 @@ int intel_dp_common_rate(struct intel_dp *intel_dp, int index);
>  int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, int rate);
>  int intel_dp_max_common_rate(struct intel_dp *intel_dp);
>  int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps);
> +int intel_dp_link_caps_max_common_lane_count(struct intel_dp_link_caps *link_caps);
> 
>  void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps);
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
> index c82adfcce01d0..9d9d8d04742bc 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c
> @@ -57,8 +57,9 @@ static int kbytes_to_mbits(int kbytes)
> 
>  static int get_current_link_bw(struct intel_dp *intel_dp)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>  	int rate = intel_dp_max_common_rate(intel_dp);
> -	int lane_count = intel_dp_max_common_lane_count(intel_dp);
> +	int lane_count = intel_dp_link_caps_max_common_lane_count(link_caps);
> 
>  	return intel_dp_max_link_data_rate(intel_dp, rate, lane_count);
>  }
> --
> 2.49.1


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

* RE: [PATCH v2 21/28] drm/i915/dp_link_caps: Add helpers to get max link limits
  2026-06-16 20:08 ` [PATCH v2 21/28] drm/i915/dp_link_caps: Add helpers to get max link limits Imre Deak
@ 2026-06-24 12:44   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-24 12:44 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 21/28] drm/i915/dp_link_caps: Add helpers to get max link limits
> 
> Add intel_dp_link_caps_get_max_limits() to query the current maximum
> link limits (max bound over all allowed configurations) through the
> link caps API instead of direct accesses.
> 
> This allows tracking the state internally within the link caps module.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c       |  8 +++-
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 38 ++++++++++++++++++-
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |  3 ++
>  .../drm/i915/display/intel_dp_link_training.c |  8 +++-
>  4 files changed, 51 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 0d7ec7a8898c9..3b3c31122452d 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -357,15 +357,17 @@ static int intel_dp_get_max_common_lane_count(struct intel_dp *intel_dp)
>  int intel_dp_max_lane_count(struct intel_dp *intel_dp)
>  {
>  	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp_link_config max_link_limits;
>  	struct intel_dp_link_config forced_params;
>  	int lane_count;
> 
> +	intel_dp_link_caps_get_max_limits(link_caps, &max_link_limits);
>  	intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> 
>  	if (forced_params.lane_count)
>  		lane_count = forced_params.lane_count;
>  	else
> -		lane_count = intel_dp->link.max_lane_count;
> +		lane_count = max_link_limits.lane_count;
> 
>  	switch (lane_count) {
>  	case 1:
> @@ -1539,6 +1541,7 @@ int
>  intel_dp_max_link_rate(struct intel_dp *intel_dp)
>  {
>  	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp_link_config max_link_limits;
>  	struct intel_dp_link_config forced_params;
>  	int len;
> 
> @@ -1547,7 +1550,8 @@ intel_dp_max_link_rate(struct intel_dp *intel_dp)
>  	if (forced_params.rate)
>  		return forced_params.rate;
> 
> -	len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.max_rate);
> +	intel_dp_link_caps_get_max_limits(link_caps, &max_link_limits);
> +	len = intel_dp_common_len_rate_limit(intel_dp, max_link_limits.rate);
> 
>  	return intel_dp_common_rate(intel_dp, len - 1);
>  }
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index b227c9a55f63b..fa7dabc94ddf1 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -151,6 +151,36 @@ static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_ent
>  	return 1 << lc->lane_count_exp;
>  }
> 
> +/**
> + * intel_dp_link_caps_get_max_limits - get the current maximum link limits
> + * @link_caps: link capabilities state
> + * @max_link_limits: returned maximum link limits
> + *
> + * Return the current maximum rate and lane count limits in
> + * @max_link_limits.
> + *
> + * These limits constrain the set of allowed configurations.
> + *
> + * The limits are set to the maximum common supported values after
> + * intel_dp_link_caps_reset() is called, and can later be modified by
> + * intel_dp_link_caps_set_max_limits(). The max rate and lane count
> + * parameters are independent limits, so the pair does not necessarily
> + * define a valid configuration.
> + *
> + * This function may be called without serializing against updates to
> + * @link_caps. However, without such serialization the returned value may be
> + * an out-of-sync (link rate, lane count) tuple, i.e. the parameters may
> + * belong to different update snapshots in time.
> + */
> +void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
> +				       struct intel_dp_link_config *max_link_limits)
> +{
> +	struct intel_dp *intel_dp = link_caps->dp;
> +
> +	max_link_limits->rate = intel_dp->link.max_rate;
> +	max_link_limits->lane_count = intel_dp->link.max_lane_count;
> +}
> +
>  static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
>  				   const struct intel_dp_link_config_entry *lc)
>  {
> @@ -482,6 +512,7 @@ static int i915_dp_max_link_rate_show(void *data, u64 *val)
>  	struct intel_connector *connector = to_intel_connector(data);
>  	struct intel_display *display = to_intel_display(connector);
>  	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	struct intel_dp_link_config max_link_limits;
>  	int err;
> 
>  	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> @@ -490,7 +521,8 @@ static int i915_dp_max_link_rate_show(void *data, u64 *val)
> 
>  	intel_dp_flush_connector_commits(connector);
> 
> -	*val = intel_dp->link.max_rate;
> +	intel_dp_link_caps_get_max_limits(intel_dp->link.caps, &max_link_limits);
> +	*val = max_link_limits.rate;
> 
>  	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> 
> @@ -503,6 +535,7 @@ static int i915_dp_max_lane_count_show(void *data, u64 *val)
>  	struct intel_connector *connector = to_intel_connector(data);
>  	struct intel_display *display = to_intel_display(connector);
>  	struct intel_dp *intel_dp = intel_attached_dp(connector);
> +	struct intel_dp_link_config max_link_limits;
>  	int err;
> 
>  	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
> @@ -511,7 +544,8 @@ static int i915_dp_max_lane_count_show(void *data, u64 *val)
> 
>  	intel_dp_flush_connector_commits(connector);
> 
> -	*val = intel_dp->link.max_lane_count;
> +	intel_dp_link_caps_get_max_limits(intel_dp->link.caps, &max_link_limits);
> +	*val = max_link_limits.lane_count;
> 
>  	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 9218cb5de2c71..376dbd9bd5aba 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -27,6 +27,9 @@ void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
>  int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lane_count);
>  void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count);
> 
> +void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
> +				       struct intel_dp_link_config *max_link_limits);
> +
>  bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
>  			       const int *rates, int num_rates, int max_lane_count);
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> index ec9bd9b4c800b..7145f2d0ad6d3 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -2389,6 +2389,8 @@ void intel_dp_128b132b_sdp_crc16(struct intel_dp *intel_dp,
>  bool intel_dp_link_params_valid(struct intel_dp *intel_dp, int link_rate,
>  				u8 lane_count)
>  {
> +	struct intel_dp_link_config max_link_limits;
> +
>  	/*
>  	 * FIXME: we need to synchronize the current link parameters with
>  	 * hardware readout. Currently fast link training doesn't work on
> @@ -2411,12 +2413,14 @@ bool intel_dp_link_params_valid(struct intel_dp *intel_dp, int link_rate,
>  	 * configuration. Although that happens to be true for now, it will
>  	 * stop being guaranteed once fallback depends only on disabled configs.
>  	 */
> +	intel_dp_link_caps_get_max_limits(intel_dp->link.caps, &max_link_limits);
> +
>  	if (link_rate == 0 ||
> -	    link_rate > intel_dp->link.max_rate)
> +	    link_rate > max_link_limits.rate)
>  		return false;
> 
>  	if (lane_count == 0 ||
> -	    lane_count > intel_dp_max_lane_count(intel_dp))
> +	    lane_count > max_link_limits.lane_count)
>  		return false;
> 
>  	return true;
> --
> 2.49.1


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

* RE: [PATCH v2 22/28] drm/i915/dp_link_caps: Add helpers to set max link limits
  2026-06-16 20:08 ` [PATCH v2 22/28] drm/i915/dp_link_caps: Add helpers to set " Imre Deak
@ 2026-06-24 12:47   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-24 12:47 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 22/28] drm/i915/dp_link_caps: Add helpers to set max link limits
> 
> Add intel_dp_link_caps_set_max_limits() to set the current maximum link
> limits (max bound over all allowed configurations) through the link caps
> API instead of direct accesses.
> 
> This allows tracking the state internally within the link caps module.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 35 +++++++++++++++++++
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |  2 ++
>  .../drm/i915/display/intel_dp_link_training.c |  9 +++--
>  3 files changed, 44 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index fa7dabc94ddf1..e568f00720d31 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -151,6 +151,15 @@ static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_ent
>  	return 1 << lc->lane_count_exp;
>  }
> 
> +static void set_max_link_limits_no_update(struct intel_dp_link_caps *link_caps,
> +					  const struct intel_dp_link_config *max_link_limits)
> +{
> +	struct intel_dp *intel_dp = link_caps->dp;
> +
> +	intel_dp->link.max_rate = max_link_limits->rate;
> +	intel_dp->link.max_lane_count = max_link_limits->lane_count;
> +}
> +
>  /**
>   * intel_dp_link_caps_get_max_limits - get the current maximum link limits
>   * @link_caps: link capabilities state
> @@ -181,6 +190,32 @@ void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
>  	max_link_limits->lane_count = intel_dp->link.max_lane_count;
>  }
> 
> +/**
> + * intel_dp_link_caps_set_max_limits - set the current maximum link limits
> + * @link_caps: link capabilities state
> + * @max_link_limits: new maximum link limits
> + *
> + * Set the current maximum rate and lane count limits to @max_link_limits,
> + * constraining the set of allowed configurations.
> + *
> + * Unlike intel_dp_link_caps_get_max_limits(), the caller must serialize
> + * this call against concurrent queries and updates to @link_caps, in line
> + * with the rest of the API.
> + *
> + * Return:
> + * - %true  if the @link_caps cached max limits value got updated with
> + *          @max_link_limits.
> + * - %false if @max_link_limits is invalid.
> + */
> +bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
> +				       const struct intel_dp_link_config *max_link_limits)
> +{
> +	set_max_link_limits_no_update(link_caps, max_link_limits);
> +
> +	/* TODO: validate max_link_limits */
> +	return true;
> +}
> +
>  static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
>  				   const struct intel_dp_link_config_entry *lc)
>  {
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 376dbd9bd5aba..c6c60b7888874 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -29,6 +29,8 @@ void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate
> 
>  void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
>  				       struct intel_dp_link_config *max_link_limits);
> +bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
> +				       const struct intel_dp_link_config *max_link_limits);
> 
>  bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
>  			       const int *rates, int num_rates, int max_lane_count);
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> index 7145f2d0ad6d3..9d9911ebad439 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -1958,6 +1958,8 @@ static bool reduce_link_params(struct intel_dp *intel_dp, const struct intel_crt
>  static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
>  						   const struct intel_crtc_state *crtc_state)
>  {
> +	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +	struct intel_dp_link_config max_link_limits;
>  	int new_link_rate;
>  	int new_lane_count;
> 
> @@ -1983,8 +1985,11 @@ static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
>  	       crtc_state->lane_count, crtc_state->port_clock,
>  	       new_lane_count, new_link_rate);
> 
> -	intel_dp->link.max_rate = new_link_rate;
> -	intel_dp->link.max_lane_count = new_lane_count;
> +	max_link_limits.rate = new_link_rate;
> +	max_link_limits.lane_count = new_lane_count;
> +
> +	/* TODO: handle an update failure */
> +	intel_dp_link_caps_set_max_limits(link_caps, &max_link_limits);
> 
>  	return 0;
>  }
> --
> 2.49.1


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

* RE: [PATCH v2 23/28] drm/i915/dp_link_caps: Add helper to reset max link limits
  2026-06-16 20:08 ` [PATCH v2 23/28] drm/i915/dp_link_caps: Add helper to reset " Imre Deak
@ 2026-06-24 12:49   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-24 12:49 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 23/28] drm/i915/dp_link_caps: Add helper to reset max link limits
> 
> Add a helper to reset the link_caps::max_limits max link limits to the
> maximum common supported rate and lane count.
> 
> This is needed by a follow-up change in the link training fallback code,
> which temporarily resets max_limits before searching for a fallback
> configuration.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 22 +++++++++++++++++++
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |  1 +
>  2 files changed, 23 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index e568f00720d31..ae10200bdd934 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -160,6 +160,16 @@ static void set_max_link_limits_no_update(struct intel_dp_link_caps *link_caps,
>  	intel_dp->link.max_lane_count = max_link_limits->lane_count;
>  }
> 
> +static void reset_max_link_limits_no_update(struct intel_dp_link_caps *link_caps)
> +{
> +	struct intel_dp_link_config max_link_limits = {
> +		.rate = intel_dp_max_common_rate(link_caps->dp),
> +		.lane_count = intel_dp_link_caps_max_common_lane_count(link_caps),
> +	};
> +
> +	set_max_link_limits_no_update(link_caps, &max_link_limits);
> +}
> +
>  /**
>   * intel_dp_link_caps_get_max_limits - get the current maximum link limits
>   * @link_caps: link capabilities state
> @@ -216,6 +226,18 @@ bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
>  	return true;
>  }
> 
> +/**
> + * intel_dp_link_caps_reset_max_limits - reset the current maximum link limits
> + * @link_caps: link capabilities state
> + *
> + * Reset the current maximum link limits to the maximum supported common link
> + * rate and lane count.
> + */
> +void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps)
> +{
> +	reset_max_link_limits_no_update(link_caps);
> +}
> +
>  static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
>  				   const struct intel_dp_link_config_entry *lc)
>  {
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index c6c60b7888874..7baeb4359d2d4 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -31,6 +31,7 @@ void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
>  				       struct intel_dp_link_config *max_link_limits);
>  bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
>  				       const struct intel_dp_link_config *max_link_limits);
> +void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps);
> 
>  bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
>  			       const int *rates, int num_rates, int max_lane_count);
> --
> 2.49.1


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

* RE: [PATCH v2 24/28] drm/i915/dp_link_caps: Add helper to reset link_caps state
  2026-06-16 20:08 ` [PATCH v2 24/28] drm/i915/dp_link_caps: Add helper to reset link_caps state Imre Deak
@ 2026-06-24 12:55   ` Kahola, Mika
  0 siblings, 0 replies; 68+ messages in thread
From: Kahola, Mika @ 2026-06-24 12:55 UTC (permalink / raw)
  To: Deak, Imre, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org

> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Subject: [PATCH v2 24/28] drm/i915/dp_link_caps: Add helper to reset link_caps state
> 
> Add a helper to reset the link_caps state, removing all restrictions
> except user-forced parameters, re-allowing all supported
> configurations. Currently this only resets the maximum link limits,
> but follow-up changes will also re-enable configurations previously
> disabled on a per-configuration basis by fallback or other logic.
> 

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c        |  3 +--
>  .../gpu/drm/i915/display/intel_dp_link_caps.c  | 18 ++++++++++++++++++
>  .../gpu/drm/i915/display/intel_dp_link_caps.h  |  1 +
>  3 files changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 3b3c31122452d..b63c6f047f83a 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -3610,8 +3610,7 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp,
> 
>  void intel_dp_reset_link_params(struct intel_dp *intel_dp)
>  {
> -	intel_dp->link.max_lane_count = intel_dp_link_caps_max_common_lane_count(intel_dp->link.caps);
> -	intel_dp->link.max_rate = intel_dp_max_common_rate(intel_dp);
> +	intel_dp_link_caps_reset(intel_dp->link.caps);
>  	intel_dp->link.mst_probed_lane_count = 0;
>  	intel_dp->link.mst_probed_rate = 0;
>  	intel_dp_link_training_reset(intel_dp->link.training);
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index ae10200bdd934..9b7da5a64ee25 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -351,6 +351,24 @@ int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lan
>  	return -1;
>  }
> 
> +/**
> + * intel_dp_link_caps_reset - reset link capability restrictions
> + * @link_caps: link capabilities state
> + *
> + * Reset all current restrictions except for the user requested forced
> + * parameters, thus updating the set of allowed configurations and the
> + * derived maximum link information accordingly.
> + *
> + * This function is regularly called after a sink is connected, either
> + * for the first time to the connector or after a previous sink was
> + * disconnected from it, and intel_dp_link_caps_update() was called.
> + */
> +void intel_dp_link_caps_reset(struct intel_dp_link_caps *link_caps)
> +{
> +	/* TODO: Update the maximum link information. */
> +	reset_max_link_limits_no_update(link_caps);
> +}
> +
>  static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
>  {
>  	struct intel_connector *connector = to_intel_connector(m->private);
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index 7baeb4359d2d4..fa45a46723059 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -35,6 +35,7 @@ void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps);
> 
>  bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
>  			       const int *rates, int num_rates, int max_lane_count);
> +void intel_dp_link_caps_reset(struct intel_dp_link_caps *link_caps);
> 
>  void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
> 
> --
> 2.49.1


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

* Re: [PATCH v2 01/28] drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry
  2026-06-22 21:53   ` Michał Grzelak
@ 2026-06-24 15:32     ` Imre Deak
  0 siblings, 0 replies; 68+ messages in thread
From: Imre Deak @ 2026-06-24 15:32 UTC (permalink / raw)
  To: Michał Grzelak
  Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org

On Mon, Jun 22, 2026 at 11:53:04PM +0200, Michał Grzelak wrote:
> On Tue, 16 Jun 2026, Imre Deak wrote:
> > Rename intel_dp_link_config to intel_dp_link_config_entry to prepare
> > for tracking a link configuration in both an internal packed and a
> > public unpacked format. A follow-up change will add
> > struct intel_dp_link_config representing the public unpacked format.
> > 
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > ---
> > .../gpu/drm/i915/display/intel_display_types.h   |  2 +-
> > drivers/gpu/drm/i915/display/intel_dp.c          | 16 ++++++++--------
> > 2 files changed, 9 insertions(+), 9 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> > index 6cd102a3b610c..c71edea145878 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> > @@ -1840,7 +1840,7 @@ struct intel_dp {
> > #define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
> > #define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
> > 						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
> > -		struct intel_dp_link_config {
> > +		struct intel_dp_link_config_entry {
> > 			u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
> > 			u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
> > 		} configs[INTEL_DP_MAX_LINK_CONFIGS];
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> > index 3569e61e7feea..00eb3f5103383 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -699,18 +699,18 @@ int intel_dp_rate_index(const int *rates, int len, int rate)
> > }
> > 
> > static int intel_dp_link_config_rate(struct intel_dp *intel_dp,
> > -				     const struct intel_dp_link_config *lc)
> > +				     const struct intel_dp_link_config_entry *lc)
> > {
> > 	return intel_dp_common_rate(intel_dp, lc->link_rate_idx);
> 
> I'm wondering about s/lc/lce/ and s/lc_/lce_/ since I assume the var
> name derives from link_config, and now it will be changed. This could be
> beneficial given that next patch introduces back struct
> intel_dp_link_config.

Yes, this makes sense, but it's simpler to do that as a follow-up.

> Whether it applies or not:
> 
> Reviewed-by: Michał Grzelak <michal.grzelak@intel.com>

Thanks.

> 
> BR,
> Michał
> 
> > }
> > 
> > -static int intel_dp_link_config_lane_count(const struct intel_dp_link_config *lc)
> > +static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lc)
> > {
> > 	return 1 << lc->lane_count_exp;
> > }
> > 
> > static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
> > -				   const struct intel_dp_link_config *lc)
> > +				   const struct intel_dp_link_config_entry *lc)
> > {
> > 	return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(intel_dp, lc),
> > 					 intel_dp_link_config_lane_count(lc));
> > @@ -719,8 +719,8 @@ static int intel_dp_link_config_bw(struct intel_dp *intel_dp,
> > static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
> > {
> > 	struct intel_dp *intel_dp = (struct intel_dp *)p;	/* remove const */
> > -	const struct intel_dp_link_config *lc_a = a;
> > -	const struct intel_dp_link_config *lc_b = b;
> > +	const struct intel_dp_link_config_entry *lc_a = a;
> > +	const struct intel_dp_link_config_entry *lc_b = b;
> > 	int bw_a = intel_dp_link_config_bw(intel_dp, lc_a);
> > 	int bw_b = intel_dp_link_config_bw(intel_dp, lc_b);
> > 
> > @@ -734,7 +734,7 @@ static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
> > static void intel_dp_link_config_init(struct intel_dp *intel_dp)
> > {
> > 	struct intel_display *display = to_intel_display(intel_dp);
> > -	struct intel_dp_link_config *lc;
> > +	struct intel_dp_link_config_entry *lc;
> > 	int num_common_lane_configs;
> > 	int i;
> > 	int j;
> > @@ -769,7 +769,7 @@ static void intel_dp_link_config_init(struct intel_dp *intel_dp)
> > void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int *link_rate, int *lane_count)
> > {
> > 	struct intel_display *display = to_intel_display(intel_dp);
> > -	const struct intel_dp_link_config *lc;
> > +	const struct intel_dp_link_config_entry *lc;
> > 
> > 	if (drm_WARN_ON(display->drm, idx < 0 || idx >= intel_dp->link.num_configs))
> > 		idx = 0;
> > @@ -788,7 +788,7 @@ int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int lan
> > 	int i;
> > 
> > 	for (i = 0; i < intel_dp->link.num_configs; i++) {
> > -		const struct intel_dp_link_config *lc = &intel_dp->link.configs[i];
> > +		const struct intel_dp_link_config_entry *lc = &intel_dp->link.configs[i];
> > 
> > 		if (lc->lane_count_exp == lane_count_exp &&
> > 		    lc->link_rate_idx == link_rate_idx)
> > -- 
> > 2.49.1
> > 
> > 


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

end of thread, other threads:[~2026-06-24 15:32 UTC | newest]

Thread overview: 68+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-16 20:08 [PATCH v2 00/28] drm/i915/dp_link: Refactor DP link capability logic part1 Imre Deak
2026-06-16 20:08 ` [PATCH v2 01/28] drm/i915/dp: Rename intel_dp_link_config to intel_dp_link_config_entry Imre Deak
2026-06-22 13:11   ` Kahola, Mika
2026-06-22 21:53   ` Michał Grzelak
2026-06-24 15:32     ` Imre Deak
2026-06-16 20:08 ` [PATCH v2 02/28] drm/i915/dp: Add struct intel_dp_link_config Imre Deak
2026-06-22 13:11   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 03/28] drm/i915/dp_link_caps: Introduce DP link capability module Imre Deak
2026-06-22 13:21   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 04/28] drm/i915/dp_link_caps: Move common rate helpers to link caps Imre Deak
2026-06-23  7:27   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 05/28] drm/i915/dp_link_caps: Move forced link param " Imre Deak
2026-06-23  9:40   ` Kahola, Mika
2026-06-23 10:22   ` Luca Coelho
2026-06-23 12:42     ` Imre Deak
2026-06-23 12:47       ` Luca Coelho
2026-06-16 20:08 ` [PATCH v2 06/28] drm/i915/dp: Simplify querying of forced link parameters Imre Deak
2026-06-23  9:49   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 07/28] drm/i915/dp_link_caps: Move forced and max link debugfs entries to link caps Imre Deak
2026-06-23 10:28   ` Luca Coelho
2026-06-23 10:29   ` Luca Coelho
2026-06-16 20:08 ` [PATCH v2 08/28] drm/i915/dp_link_training: Use helpers to get forced link params Imre Deak
2026-06-23 10:31   ` Luca Coelho
2026-06-16 20:08 ` [PATCH v2 09/28] drm/i915/dp_link_caps: Move forced link params to link_caps Imre Deak
2026-06-23 10:32   ` Luca Coelho
2026-06-16 20:08 ` [PATCH v2 10/28] drm/i915/dp_link_caps: Move link config helpers to link caps Imre Deak
2026-06-23 10:34   ` Luca Coelho
2026-06-16 20:08 ` [PATCH v2 11/28] drm/i915/dp_link_caps: Move link config tracking to link_caps Imre Deak
2026-06-23 11:17   ` Kahola, Mika
2026-06-24 11:15   ` Luca Coelho
2026-06-16 20:08 ` [PATCH v2 12/28] drm/i915/dp_link_caps: Rename helper updating the link configurations Imre Deak
2026-06-23  5:11   ` Garg, Nemesa
2026-06-16 20:08 ` [PATCH v2 13/28] drm/i915/dp: Factor out helper to get link rate capabilities Imre Deak
2026-06-24  8:29   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 14/28] drm/i915/dp_link_caps: Pass supported link rates to link caps update Imre Deak
2026-06-24  8:32   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 15/28] drm/i915/dp_link_caps: Add helper to print all supported link rates Imre Deak
2026-06-23  5:21   ` Garg, Nemesa
2026-06-16 20:08 ` [PATCH v2 16/28] drm/i915/dp_link_caps: Add helper to get the number of " Imre Deak
2026-06-24  8:34   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 17/28] drm/i915/dp_link_caps: Add helper to get common rate index Imre Deak
2026-06-24  9:02   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 18/28] drm/i915/dp_link_caps: Move tracking of common rates to link_caps struct Imre Deak
2026-06-24  9:22   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 19/28] drm/i915/dp_link_caps: Track max common lane count in link_caps Imre Deak
2026-06-24  9:46   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 20/28] drm/i915/dp_link_caps: Use max common lane count from link_caps Imre Deak
2026-06-24 11:29   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 21/28] drm/i915/dp_link_caps: Add helpers to get max link limits Imre Deak
2026-06-24 12:44   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 22/28] drm/i915/dp_link_caps: Add helpers to set " Imre Deak
2026-06-24 12:47   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 23/28] drm/i915/dp_link_caps: Add helper to reset " Imre Deak
2026-06-24 12:49   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 24/28] drm/i915/dp_link_caps: Add helper to reset link_caps state Imre Deak
2026-06-24 12:55   ` Kahola, Mika
2026-06-16 20:08 ` [PATCH v2 25/28] drm/i915/dp_link_caps: Move max link limits to link_caps Imre Deak
2026-06-23  5:34   ` Garg, Nemesa
2026-06-16 20:08 ` [PATCH v2 26/28] drm/i915/dp_link_caps: Pass link_caps to static functions Imre Deak
2026-06-23  5:29   ` Garg, Nemesa
2026-06-16 20:08 ` [PATCH v2 27/28] drm/i915/dp_link_caps: Pass link_caps to config update/lookup helpers Imre Deak
2026-06-23  5:25   ` Garg, Nemesa
2026-06-16 20:08 ` [PATCH v2 28/28] drm/i915/dp_link_caps: Pass link_caps to common rate helpers Imre Deak
2026-06-23  5:39   ` Garg, Nemesa
2026-06-16 20:20 ` ✗ CI.checkpatch: warning for drm/i915/dp_link: Refactor DP link capability logic part1 Patchwork
2026-06-16 20:21 ` ✓ CI.KUnit: success " Patchwork
2026-06-16 21:18 ` ✓ Xe.CI.BAT: " Patchwork
2026-06-17  1:46 ` ✓ Xe.CI.FULL: " Patchwork

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