xref: /linux/drivers/gpu/drm/i915/display/intel_dp_link_caps.h (revision 4e69c1856bfd9ffb7e9d335a25842fa211628929)
1 /* SPDX-License-Identifier: MIT */
2 /* Copyright © 2026 Intel Corporation */
3 
4 #ifndef __INTEL_DP_LINK_CAPS_H__
5 #define __INTEL_DP_LINK_CAPS_H__
6 
7 #include <linux/bitops.h>
8 #include <linux/types.h>
9 
10 struct intel_connector;
11 struct intel_dp;
12 struct intel_dp_link_caps;
13 struct intel_dp_link_config;
14 
15 /**
16  * enum intel_dp_link_caps_order_key - key used to order configurations
17  * @INTEL_DP_LINK_CAPS_ORDER_KEY_BW:
18  *   Order configurations by bandwidth, then by link rate.
19  * @INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE:
20  *   Order configurations by link rate, then by lane count.
21  * @INTEL_DP_LINK_CAPS_ORDER_KEY_LANE_RATE:
22  *   Order configurations by lane count, then by link rate.
23  * @INTEL_DP_LINK_CAPS_ORDER_KEY_NUM:
24  *   Number of ordering keys.
25  *
26  * Selects how a caller wants the configuration table to be ordered,
27  * together with an &enum intel_dp_link_caps_order_direction, for
28  * iteration queries.
29  *
30  * See also:
31  *  - &struct intel_dp_link_caps_order
32  *  - intel_dp_link_caps_get_max_config()
33  */
34 enum intel_dp_link_caps_order_key {
35 	INTEL_DP_LINK_CAPS_ORDER_KEY_BW,
36 	INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE,
37 	INTEL_DP_LINK_CAPS_ORDER_KEY_LANE_RATE,
38 
39 	INTEL_DP_LINK_CAPS_ORDER_KEY_NUM
40 };
41 
42 /**
43  * enum intel_dp_link_caps_order_direction - iteration direction
44  * @INTEL_DP_LINK_CAPS_ORDER_DIR_ASC:
45  *   Iterate in ascending order according to the selected ordering key.
46  * @INTEL_DP_LINK_CAPS_ORDER_DIR_DESC:
47  *   Iterate in descending order according to the selected ordering key.
48  * @INTEL_DP_LINK_CAPS_ORDER_DIR_NUM:
49  *   Number of ordering directions.
50  *
51  * Selects the direction associated with an
52  * &enum intel_dp_link_caps_order_key for iteration queries.
53  *
54  * See also:
55  *  - &struct intel_dp_link_caps_order
56  */
57 enum intel_dp_link_caps_order_direction {
58 	INTEL_DP_LINK_CAPS_ORDER_DIR_ASC,
59 	INTEL_DP_LINK_CAPS_ORDER_DIR_DESC,
60 
61 	INTEL_DP_LINK_CAPS_ORDER_DIR_NUM
62 };
63 
64 /**
65  * struct intel_dp_link_caps_order - configuration ordering
66  * @key:
67  *   Key used to order configurations.
68  * @dir:
69  *   Direction of the selected ordering.
70  *
71  * Describes an iteration order for link configurations.
72  *
73  * See also:
74  *  - for_each_dp_link_config()
75  */
76 struct intel_dp_link_caps_order {
77 	enum intel_dp_link_caps_order_key key;
78 	enum intel_dp_link_caps_order_direction dir;
79 };
80 
81 struct intel_dp_link_caps_filter {
82 	u32 config_mask;
83 };
84 
85 #define INTEL_DP_LINK_CAPS_FILTER_NONE	\
86 	((struct intel_dp_link_caps_filter){ .config_mask = 0 })
87 #define INTEL_DP_LINK_CAPS_FILTER_ALL	\
88 	((struct intel_dp_link_caps_filter){ .config_mask = (u32)-1 })
89 
90 struct intel_dp_link_caps_iter {
91 	struct intel_dp_link_caps *link_caps;
92 	int pos;
93 	struct intel_dp_link_caps_order order;
94 	struct intel_dp_link_caps_filter filter;
95 
96 	bool (*get_next_config)(struct intel_dp_link_caps_iter *iter,
97 				struct intel_dp_link_config *config);
98 };
99 
100 /**
101  * for_each_dp_link_config - iterate allowed link configurations
102  * @__iter:
103  *   &struct intel_dp_link_caps_iter being iterated
104  * @__config:
105  *   pointer to &struct intel_dp_link_config filled for each match
106  */
107 #define for_each_dp_link_config(__iter, __config) \
108 	while ((__iter)->get_next_config((__iter), (__config)))
109 
110 void intel_dp_link_caps_iter_start(struct intel_dp_link_caps_iter *iter,
111 				   struct intel_dp_link_caps *link_caps,
112 				   struct intel_dp_link_caps_order order,
113 				   struct intel_dp_link_caps_filter filter);
114 
115 void intel_dp_link_caps_iter_end(struct intel_dp_link_caps_iter *iter);
116 
117 struct intel_dp_link_caps_order
118 intel_dp_link_caps_connector_compute_order(struct intel_connector *connector);
119 struct intel_dp_link_caps_order
120 intel_dp_link_caps_connector_fallback_order(bool is_mst);
121 
122 void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps);
123 
124 void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
125 					  struct intel_dp_link_config *forced_params);
126 
127 bool intel_dp_link_caps_filter_add(struct intel_dp_link_caps *link_caps,
128 				   struct intel_dp_link_caps_filter *filter,
129 				   const struct intel_dp_link_config *config);
130 
131 bool intel_dp_link_caps_get_max_config(struct intel_dp_link_caps *link_caps,
132 				       enum intel_dp_link_caps_order_key order_key,
133 				       struct intel_dp_link_caps_filter filter,
134 				       struct intel_dp_link_config *max_config);
135 
136 void intel_dp_link_caps_get_max_bw_config(struct intel_dp_link_caps *link_caps,
137 					  struct intel_dp_link_config *max_config);
138 
139 bool intel_dp_link_caps_disable_config(struct intel_dp_link_caps *link_caps,
140 				       const struct intel_dp_link_config *config);
141 
142 void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
143 				       struct intel_dp_link_config *max_link_limits);
144 bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
145 				       const struct intel_dp_link_config *max_link_limits);
146 void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps);
147 
148 bool intel_dp_link_caps_update(struct intel_dp_link_caps *link_caps,
149 			       const int *rates, int num_rates, int max_lane_count,
150 			       bool reset);
151 void intel_dp_link_caps_reset(struct intel_dp_link_caps *link_caps);
152 
153 void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
154 
155 struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp);
156 void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps);
157 
158 #if IS_ENABLED(CONFIG_KUNIT)
159 
160 #define INTEL_DP_LINK_CAPS_TEST_OPS_MEMBERS(__X) \
161 	__X(connector_compute_order,	intel_dp_link_caps_connector_compute_order) \
162 	__X(connector_fallback_order,	intel_dp_link_caps_connector_fallback_order) \
163 	__X(iter_start,			intel_dp_link_caps_iter_start) \
164 	__X(iter_end,			intel_dp_link_caps_iter_end) \
165 	__X(set_max_limits,		intel_dp_link_caps_set_max_limits) \
166 	__X(get_max_limits,		intel_dp_link_caps_get_max_limits) \
167 	__X(get_max_bw_config,		intel_dp_link_caps_get_max_bw_config) \
168 	__X(reset_max_limits,		intel_dp_link_caps_reset_max_limits) \
169 	__X(disable_config,		intel_dp_link_caps_disable_config) \
170 	__X(update,			intel_dp_link_caps_update) \
171 	__X(init,			intel_dp_link_caps_init) \
172 	__X(cleanup,			intel_dp_link_caps_cleanup)
173 
174 #define __DECLARE_MEMBER(__name, __fn) \
175 	typeof(__fn) *__name;
176 
177 #define INTEL_DP_LINK_CAPS_TEST_OPS_DECLARE \
178 	INTEL_DP_LINK_CAPS_TEST_OPS_MEMBERS(__DECLARE_MEMBER)
179 
180 struct intel_dp_link_caps_test_ops {
181 	INTEL_DP_LINK_CAPS_TEST_OPS_DECLARE
182 };
183 
184 #undef INTEL_DP_LINK_CAPS_TEST_OPS_DECLARE
185 #undef __DECLARE_MEMBER
186 
187 #ifdef I915
188 extern const struct intel_dp_link_caps_test_ops i915_display_dp_link_caps_test_ops;
189 #else
190 extern const struct intel_dp_link_caps_test_ops intel_display_dp_link_caps_test_ops;
191 #endif	/* I915 */
192 
193 #endif	/* CONFIG_KUNIT */
194 
195 #endif /* __INTEL_DP_LINK_CAPS_H__ */
196