1 // SPDX-License-Identifier: MIT
2 /*
3 * Copyright © 2026 Intel Corporation
4 */
5
6 #include <kunit/visibility.h>
7
8 #include <linux/bitops.h>
9 #include <linux/debugfs.h>
10 #include <linux/log2.h>
11 #include <linux/seq_buf.h>
12 #include <linux/slab.h>
13 #include <linux/sort.h>
14 #include <linux/string.h>
15 #include <linux/types.h>
16
17 #include <drm/drm_print.h>
18
19 #include "intel_display_core.h"
20 #include "intel_display_types.h"
21 #include "intel_display_utils.h"
22 #include "intel_dp.h"
23 #include "intel_dp_link_caps.h"
24
25 /**
26 * DOC: DisplayPort link capabilities
27 *
28 * The Intel DP link caps API tracks the supported and allowed
29 * DisplayPort link configurations for a DP encoder and its attached
30 * connectors, and provides helpers to iterate over the allowed
31 * configurations and constrain them by filtering, disabling, or
32 * limiting them to maximum link parameters.
33 *
34 * Locking
35 * -------
36 *
37 * All accesses to this API must be serialized. The only exception
38 * is intel_dp_link_caps_get_max_limits(), which allow lockless
39 * lookup. Such lookups may observe an out-of-sync &struct
40 * intel_dp_link_config tuple, i.e. a rate from one state and a lane
41 * count from another.
42 *
43 * The Intel i915/xe drivers ensure the above serialization by holding
44 * &drm_mode_config.connection_mutex and, while holding the lock,
45 * waiting for any pending asynchronous atomic commits. This also allows
46 * use of the API from the tails of asynchronous atomic commits, which
47 * cannot hold the lock.
48 *
49 * Iterating and restricting link configurations
50 * ---------------------------------------------
51 *
52 * The link configuration iterators can iterate the ``allowed
53 * configurations`` during modeset configuration selection or link
54 * training fallback handling in a configurable order.
55 *
56 * The iteration order can depend on connector type (eDP, DP SST,
57 * DP MST) and modeset-specific conditions or driver policies, such
58 * as DSC vs. non-DSC modes, power saving vs. better user experience,
59 * or policy changes after a link training failure.
60 *
61 * The configurations exposed via the iterators can be additionally
62 * constrained in the following ways:
63 *
64 * - Filtered for a given modeset based on modeset-specific conditions.
65 * Examples for such conditions include driver policies preferring
66 * power saving or better user experience, post-link training failure
67 * preference changes, or sink automated test requests limiting the
68 * usable configurations.
69 *
70 * - Disabled permanently for the connected sink. Examples of reasons
71 * to disable a configuration include a link training failure for a
72 * given configuration or a driver workaround preventing the use of
73 * a particular configuration.
74 *
75 * - Limited via a maximum link rate and lane count. For example, after
76 * a link training failure, subsequent modesets may be limited to
77 * configurations at or below the failed parameters.
78 *
79 * This mechanism exists for backward compatibility only. Eventually,
80 * it will be removed in favor of relying solely on individually
81 * disabled configurations, as described above.
82 *
83 * Terminology
84 * -----------
85 *
86 * ``Common link capabilities`` (or ``common caps``) refer to the link
87 * rates and maximum lane count supported by both the source and the
88 * sink, i.e. the intersection of their respective capabilities.
89 *
90 * ``Supported configurations`` are all configurations defined by the
91 * ``Common link capabilities``' link rates and maximum lane count.
92 *
93 * ``Disabled configurations`` are ``Supported configurations`` disabled
94 * via this API.
95 *
96 * ``Enabled configurations`` are ``Supported configurations`` that are
97 * not disabled.
98 *
99 * ``Forced configurations`` are ``Enabled configurations`` forced via
100 * forced link parameter debugfs entries.
101 *
102 * ``Allowed configurations`` are the ``Enabled configurations``, or if
103 * forcing is in effect the ``Forced configurations``, constrained by a
104 * maximum rate and lane count set via the API.
105 */
106 struct intel_dp_link_caps {
107 struct intel_dp *dp;
108
109 /* Rate, lane count caps common to source and sink. */
110 int num_rates;
111 int rates[DP_MAX_SUPPORTED_RATES];
112 int max_lane_count;
113
114 /* common rate,lane_count configs in bw order */
115 int num_configs;
116 #define INTEL_DP_MAX_LANE_COUNT 4
117 #define INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS (ilog2(INTEL_DP_MAX_LANE_COUNT) + 1)
118 #define INTEL_DP_LANE_COUNT_EXP_BITS order_base_2(INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
119 #define INTEL_DP_LINK_RATE_IDX_BITS (BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
120 #define INTEL_DP_MAX_LINK_CONFIGS (DP_MAX_SUPPORTED_RATES * \
121 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
122 struct intel_dp_link_config_entry {
123 /* index into rates[] */
124 u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
125 u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
126 } configs[INTEL_DP_MAX_LINK_CONFIGS];
127
128 /*
129 * Indices to intel_dp_link_caps::configs[] in rate/lane count,
130 * lane_count/rate order.
131 */
132 u8 rate_lane_map[INTEL_DP_MAX_LINK_CONFIGS];
133 u8 lane_rate_map[INTEL_DP_MAX_LINK_CONFIGS];
134
135 /*
136 * Filter of configurations enabled for the current sink
137 * connection.
138 *
139 * Each bit in the filter's configuration mask corresponds to a
140 * configuration index in the intel_dp_link_caps::configs[] array.
141 *
142 * All configurations start out enabled in the filter after a
143 * new sink is connected. Users disable configurations afterwards
144 * via the link caps API. All configurations get re-enabled
145 * internally in the following cases:
146 * - when forcing a link rate or lane count
147 * - when intel_dp_link_caps_update(reset=true) is called after
148 * a new sink is connected
149 * - when intel_dp_link_caps_update(reset=false) with changed
150 * link capabilities is called
151 * - when intel_dp_link_caps_reset() is called after a new sink
152 * is connected
153 */
154 struct intel_dp_link_caps_filter enabled_configs;
155
156 /*
157 * Allowed configurations are the supported configurations defined by
158 * config_table.rates and config_table.max_lane_count, constrained by
159 * config_table.enabled_configs and the forced_params and
160 * max_limits values below.
161 *
162 * See get_allowed_config_filter() for the filter of these
163 * configurations.
164 */
165
166 /*
167 * Forced parameters requested via debugfs. Remains set across sink
168 * disconnects.
169 */
170 struct intel_dp_link_config forced_params;
171
172 /*
173 * User set maximum limits. These limits constrain the currently
174 * allowed set of configurations and are not adjusted when sink
175 * capabilities change.
176 *
177 * max_limits.rate/lane_count may come from different allowed
178 * configurations, i.e. the (max_limits.rate, max_limits.lane_count)
179 * tuple itself may not be an allowed configuration.
180 */
181 struct intel_dp_link_config max_limits;
182 };
183 static_assert(BITS_PER_TYPE(((struct intel_dp_link_caps_filter *)NULL)->config_mask) >=
184 ARRAY_SIZE(((struct intel_dp_link_caps *)NULL)->configs));
185
bw_desc_config_order(void)186 static struct intel_dp_link_caps_order bw_desc_config_order(void)
187 {
188 struct intel_dp_link_caps_order order = {
189 .key = INTEL_DP_LINK_CAPS_ORDER_KEY_BW,
190 .dir = INTEL_DP_LINK_CAPS_ORDER_DIR_DESC,
191 };
192
193 return order;
194 }
195
196 static enum intel_dp_link_caps_order_key
connector_compute_order_key(bool is_mst)197 connector_compute_order_key(bool is_mst)
198 {
199 if (is_mst)
200 return INTEL_DP_LINK_CAPS_ORDER_KEY_BW;
201 else
202 return INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE;
203 }
204
205 static enum intel_dp_link_caps_order_key
connector_fallback_order_key(bool is_mst)206 connector_fallback_order_key(bool is_mst)
207 {
208 if (is_mst)
209 return INTEL_DP_LINK_CAPS_ORDER_KEY_BW;
210 else
211 return INTEL_DP_LINK_CAPS_ORDER_KEY_LANE_RATE;
212 }
213
214 static enum intel_dp_link_caps_order_direction
connector_compute_order_dir(bool is_mst,bool use_max_params)215 connector_compute_order_dir(bool is_mst, bool use_max_params)
216 {
217 if (is_mst || use_max_params)
218 return INTEL_DP_LINK_CAPS_ORDER_DIR_DESC;
219 else
220 return INTEL_DP_LINK_CAPS_ORDER_DIR_ASC;
221 }
222
223 struct intel_dp_link_caps_order
intel_dp_link_caps_connector_compute_order(struct intel_connector * connector)224 intel_dp_link_caps_connector_compute_order(struct intel_connector *connector)
225 {
226 struct intel_dp *intel_dp = intel_attached_dp(connector);
227 struct intel_dp_link_caps_order order = {
228 .key = connector_compute_order_key(connector->mst.dp),
229 .dir = connector_compute_order_dir(connector->mst.dp, intel_dp->use_max_params)
230 };
231
232 return order;
233 }
234
235 struct intel_dp_link_caps_order
intel_dp_link_caps_connector_fallback_order(bool is_mst)236 intel_dp_link_caps_connector_fallback_order(bool is_mst)
237 {
238 struct intel_dp_link_caps_order order = {
239 .key = connector_fallback_order_key(is_mst),
240 .dir = INTEL_DP_LINK_CAPS_ORDER_DIR_DESC,
241 };
242
243 return order;
244 }
245
246 /* Get length of common rates array potentially limited by max_rate. */
intel_dp_common_len_rate_limit(struct intel_dp_link_caps * link_caps,int max_rate)247 static int intel_dp_common_len_rate_limit(struct intel_dp_link_caps *link_caps,
248 int max_rate)
249 {
250 return intel_dp_rate_limit_len(link_caps->rates,
251 link_caps->num_rates, max_rate);
252 }
253
intel_dp_common_rate(struct intel_dp_link_caps * link_caps,int index)254 static int intel_dp_common_rate(struct intel_dp_link_caps *link_caps, int index)
255 {
256 struct intel_display *display = to_intel_display(link_caps->dp);
257
258 if (drm_WARN_ON(display->drm,
259 index < 0 || index >= link_caps->num_rates))
260 return 162000;
261
262 return link_caps->rates[index];
263 }
264
265 /* Theoretical max between source and sink */
intel_dp_max_common_rate(struct intel_dp_link_caps * link_caps)266 static int intel_dp_max_common_rate(struct intel_dp_link_caps *link_caps)
267 {
268 return intel_dp_common_rate(link_caps, link_caps->num_rates - 1);
269 }
270
intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps * link_caps)271 void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps)
272 {
273 struct intel_display *display = to_intel_display(link_caps->dp);
274 DECLARE_SEQ_BUF(s, 128);
275 int i;
276
277 for (i = 0; i < link_caps->num_rates; i++)
278 seq_buf_printf(&s, "%s%d", i ? ", " : "", link_caps->rates[i]);
279
280 drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
281 }
282
intel_dp_link_caps_max_common_lane_count(struct intel_dp_link_caps * link_caps)283 static int intel_dp_link_caps_max_common_lane_count(struct intel_dp_link_caps *link_caps)
284 {
285 return link_caps->max_lane_count;
286 }
287
forced_lane_count(struct intel_dp_link_caps * link_caps)288 static int forced_lane_count(struct intel_dp_link_caps *link_caps)
289 {
290 if (!link_caps->forced_params.lane_count)
291 return 0;
292
293 return clamp(link_caps->forced_params.lane_count,
294 1, intel_dp_link_caps_max_common_lane_count(link_caps));
295 }
296
forced_link_rate(struct intel_dp_link_caps * link_caps)297 static int forced_link_rate(struct intel_dp_link_caps *link_caps)
298 {
299 int len;
300
301 if (!link_caps->forced_params.rate)
302 return 0;
303
304 len = intel_dp_common_len_rate_limit(link_caps, link_caps->forced_params.rate);
305 if (len == 0)
306 return intel_dp_common_rate(link_caps, 0);
307
308 return intel_dp_common_rate(link_caps, len - 1);
309 }
310
intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps * link_caps,struct intel_dp_link_config * forced_params)311 void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
312 struct intel_dp_link_config *forced_params)
313 {
314 forced_params->rate = forced_link_rate(link_caps);
315 forced_params->lane_count = forced_lane_count(link_caps);
316 }
317
intel_dp_link_config_rate(struct intel_dp_link_caps * link_caps,const struct intel_dp_link_config_entry * lce)318 static int intel_dp_link_config_rate(struct intel_dp_link_caps *link_caps,
319 const struct intel_dp_link_config_entry *lce)
320 {
321 return intel_dp_common_rate(link_caps, lce->link_rate_idx);
322 }
323
intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry * lce)324 static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lce)
325 {
326 return 1 << lce->lane_count_exp;
327 }
328
329 static void
to_intel_dp_link_config(struct intel_dp_link_caps * link_caps,int config_idx,struct intel_dp_link_config * config)330 to_intel_dp_link_config(struct intel_dp_link_caps *link_caps,
331 int config_idx, struct intel_dp_link_config *config)
332 {
333 const struct intel_dp_link_config_entry *lce = &link_caps->configs[config_idx];
334
335 config->rate = intel_dp_link_config_rate(link_caps, lce);
336 config->lane_count = intel_dp_link_config_lane_count(lce);
337 }
338
339 static int
iter_pos_to_idx(struct intel_dp_link_caps * link_caps,struct intel_dp_link_caps_order config_order,int iter_pos)340 iter_pos_to_idx(struct intel_dp_link_caps *link_caps,
341 struct intel_dp_link_caps_order config_order,
342 int iter_pos)
343 {
344 int config_idx;
345
346 if (!in_range(iter_pos, 0, link_caps->num_configs))
347 return -1;
348
349 switch (config_order.dir) {
350 case INTEL_DP_LINK_CAPS_ORDER_DIR_ASC:
351 break;
352 case INTEL_DP_LINK_CAPS_ORDER_DIR_DESC:
353 iter_pos = link_caps->num_configs - 1 - iter_pos;
354
355 break;
356 default:
357 MISSING_CASE(config_order.dir);
358
359 return -1;
360 }
361
362 switch (config_order.key) {
363 case INTEL_DP_LINK_CAPS_ORDER_KEY_BW:
364 config_idx = iter_pos;
365
366 break;
367 case INTEL_DP_LINK_CAPS_ORDER_KEY_RATE_LANE:
368 config_idx = link_caps->rate_lane_map[iter_pos];
369
370 break;
371 case INTEL_DP_LINK_CAPS_ORDER_KEY_LANE_RATE:
372 config_idx = link_caps->lane_rate_map[iter_pos];
373
374 break;
375 default:
376 MISSING_CASE(config_order.key);
377
378 return -1;
379 }
380
381 return config_idx;
382 }
383
iter_get_next_config(struct intel_dp_link_caps_iter * iter,struct intel_dp_link_config * config)384 static bool iter_get_next_config(struct intel_dp_link_caps_iter *iter,
385 struct intel_dp_link_config *config)
386 {
387 while (true) {
388 int config_idx;
389
390 iter->pos++;
391
392 config_idx = iter_pos_to_idx(iter->link_caps, iter->order, iter->pos);
393 if (config_idx < 0) {
394 iter->pos = -1;
395 *config = INTEL_DP_LINK_CONFIG_NULL;
396
397 break;
398 }
399
400 if (!(BIT(config_idx) & iter->filter.config_mask))
401 continue;
402
403 to_intel_dp_link_config(iter->link_caps, config_idx, config);
404
405 break;
406 }
407
408 return iter->pos >= 0;
409 }
410
iter_start(struct intel_dp_link_caps_iter * iter,struct intel_dp_link_caps * link_caps,struct intel_dp_link_caps_order order,struct intel_dp_link_caps_filter filter)411 static void iter_start(struct intel_dp_link_caps_iter *iter,
412 struct intel_dp_link_caps *link_caps,
413 struct intel_dp_link_caps_order order,
414 struct intel_dp_link_caps_filter filter)
415 {
416 iter->link_caps = link_caps;
417 iter->pos = -1;
418 iter->order = order;
419 iter->filter = filter;
420
421 iter->get_next_config = iter_get_next_config;
422 }
423
424 static struct intel_dp_link_caps_filter
calc_allowed_config_filter(struct intel_dp_link_caps * link_caps,struct intel_dp_link_caps_filter enabled_configs,const struct intel_dp_link_config * max_limits,const struct intel_dp_link_config * forced_params)425 calc_allowed_config_filter(struct intel_dp_link_caps *link_caps,
426 struct intel_dp_link_caps_filter enabled_configs,
427 const struct intel_dp_link_config *max_limits,
428 const struct intel_dp_link_config *forced_params)
429 {
430 struct intel_dp_link_caps_filter allowed_configs = INTEL_DP_LINK_CAPS_FILTER_NONE;
431 struct intel_display *display = to_intel_display(link_caps->dp);
432 struct intel_dp_link_caps_order order = bw_desc_config_order();
433 struct intel_dp_link_caps_iter iter;
434 struct intel_dp_link_config config;
435
436 iter_start(&iter, link_caps, order, enabled_configs);
437 for_each_dp_link_config(&iter, &config) {
438 int config_idx;
439
440 if (forced_params->rate &&
441 forced_params->rate != config.rate)
442 continue;
443
444 if (forced_params->lane_count &&
445 forced_params->lane_count != config.lane_count)
446 continue;
447
448 if (config.rate > max_limits->rate)
449 continue;
450
451 if (config.lane_count > max_limits->lane_count)
452 continue;
453
454 config_idx = iter_pos_to_idx(link_caps, order, iter.pos);
455 if (drm_WARN_ON(display->drm, config_idx < 0))
456 continue;
457
458 allowed_configs.config_mask |= BIT(config_idx);
459 }
460 intel_dp_link_caps_iter_end(&iter);
461
462 return allowed_configs;
463 }
464
465 /*
466 * get_allowed_config_filter - get filter for the currently allowed configs
467 * @link_caps: link capabilities state
468 *
469 * Return:
470 * Filter of link configurations allowed after applying the current
471 * maximum link limits, and further narrowing them by removing any disabled
472 * configuration and limiting to forced link parameters.
473 *
474 * See also:
475 * - intel_dp_link_caps_get_max_limits()
476 * - intel_dp_link_caps_get_forced_params()
477 */
478 static struct intel_dp_link_caps_filter
get_allowed_config_filter(struct intel_dp_link_caps * link_caps)479 get_allowed_config_filter(struct intel_dp_link_caps *link_caps)
480 {
481 struct intel_dp_link_config forced_params;
482
483 intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
484
485 return calc_allowed_config_filter(link_caps, link_caps->enabled_configs,
486 &link_caps->max_limits, &forced_params);
487 }
488
intel_dp_link_caps_iter_start(struct intel_dp_link_caps_iter * iter,struct intel_dp_link_caps * link_caps,struct intel_dp_link_caps_order order,struct intel_dp_link_caps_filter filter)489 void intel_dp_link_caps_iter_start(struct intel_dp_link_caps_iter *iter,
490 struct intel_dp_link_caps *link_caps,
491 struct intel_dp_link_caps_order order,
492 struct intel_dp_link_caps_filter filter)
493 {
494 filter.config_mask &= get_allowed_config_filter(link_caps).config_mask;
495
496 iter_start(iter, link_caps, order, filter);
497 }
498
intel_dp_link_caps_iter_end(struct intel_dp_link_caps_iter * iter)499 void intel_dp_link_caps_iter_end(struct intel_dp_link_caps_iter *iter)
500 {
501 memset(iter, 0, sizeof(*iter));
502 }
503
504 /**
505 * intel_dp_link_caps_get_max_config - get the maximum config in a given order
506 * @link_caps: link capabilities state
507 * @order_key: ordering key used to rank candidate configurations
508 * @filter: filter for candidate configurations
509 * @max_config: returned maximum link configuration
510 *
511 * Find the last configuration among the currently allowed
512 * configurations filtered by @filter in the iteration order
513 * selected by @order_key, and store it in @max_config.
514 *
515 * See also:
516 * - &enum intel_dp_link_caps_order_key
517 *
518 * Returns:
519 * %true if a maximum config is returned
520 * %false otherwise.
521 */
intel_dp_link_caps_get_max_config(struct intel_dp_link_caps * link_caps,enum intel_dp_link_caps_order_key order_key,struct intel_dp_link_caps_filter filter,struct intel_dp_link_config * max_config)522 bool intel_dp_link_caps_get_max_config(struct intel_dp_link_caps *link_caps,
523 enum intel_dp_link_caps_order_key order_key,
524 struct intel_dp_link_caps_filter filter,
525 struct intel_dp_link_config *max_config)
526 {
527 struct intel_dp_link_caps_order order = {
528 .key = order_key,
529 .dir = INTEL_DP_LINK_CAPS_ORDER_DIR_DESC
530 };
531 struct intel_dp_link_config iter_config;
532 struct intel_dp_link_caps_iter iter;
533 bool found = false;
534
535 intel_dp_link_caps_iter_start(&iter, link_caps, order, filter);
536 for_each_dp_link_config(&iter, &iter_config) {
537 found = true;
538 break;
539 }
540 intel_dp_link_caps_iter_end(&iter);
541
542 if (!found)
543 return false;
544
545 *max_config = iter_config;
546
547 return true;
548 }
549
550 /**
551 * intel_dp_link_caps_get_max_bw_config - get maximum BW link configuration
552 * @link_caps: link capabilities state
553 * @max_config: returned maximum link configuration
554 *
555 * Return the maximum BW link configuration among the currently
556 * allowed configurations.
557 */
intel_dp_link_caps_get_max_bw_config(struct intel_dp_link_caps * link_caps,struct intel_dp_link_config * max_config)558 void intel_dp_link_caps_get_max_bw_config(struct intel_dp_link_caps *link_caps,
559 struct intel_dp_link_config *max_config)
560 {
561 if (!intel_dp_link_caps_get_max_config(link_caps,
562 bw_desc_config_order().key, INTEL_DP_LINK_CAPS_FILTER_ALL,
563 max_config))
564 *max_config = INTEL_DP_LINK_CONFIG_NULL;
565 }
566
find_config_idx(struct intel_dp_link_caps * link_caps,struct intel_dp_link_caps_filter filter,const struct intel_dp_link_config * link_config)567 static int find_config_idx(struct intel_dp_link_caps *link_caps,
568 struct intel_dp_link_caps_filter filter,
569 const struct intel_dp_link_config *link_config)
570 {
571 struct intel_dp_link_caps_order order = bw_desc_config_order();
572 struct intel_dp_link_config iter_config;
573 struct intel_dp_link_caps_iter iter;
574 int pos = -1;
575
576 intel_dp_link_caps_iter_start(&iter, link_caps, order, filter);
577 for_each_dp_link_config(&iter, &iter_config) {
578 if (iter_config.rate == link_config->rate &&
579 iter_config.lane_count == link_config->lane_count) {
580 pos = iter.pos;
581
582 break;
583 }
584 }
585 intel_dp_link_caps_iter_end(&iter);
586
587 if (pos < 0)
588 return pos;
589
590 return iter_pos_to_idx(link_caps, order, pos);
591 }
592
intel_dp_link_caps_filter_add(struct intel_dp_link_caps * link_caps,struct intel_dp_link_caps_filter * filter,const struct intel_dp_link_config * config)593 bool intel_dp_link_caps_filter_add(struct intel_dp_link_caps *link_caps,
594 struct intel_dp_link_caps_filter *filter,
595 const struct intel_dp_link_config *config)
596 {
597 int idx;
598
599 idx = find_config_idx(link_caps, get_allowed_config_filter(link_caps), config);
600 if (idx < 0)
601 return false;
602
603 filter->config_mask |= BIT(idx);
604
605 return true;
606 }
607
intel_dp_link_caps_filter_remove(struct intel_dp_link_caps * link_caps,struct intel_dp_link_caps_filter * filter,const struct intel_dp_link_config * config)608 static bool intel_dp_link_caps_filter_remove(struct intel_dp_link_caps *link_caps,
609 struct intel_dp_link_caps_filter *filter,
610 const struct intel_dp_link_config *config)
611 {
612 int idx;
613
614 idx = find_config_idx(link_caps, get_allowed_config_filter(link_caps), config);
615 if (idx < 0)
616 return false;
617
618 filter->config_mask &= ~BIT(idx);
619
620 return true;
621 }
622
set_max_link_limits(struct intel_dp_link_caps * link_caps,const struct intel_dp_link_config * max_link_limits)623 static void set_max_link_limits(struct intel_dp_link_caps *link_caps,
624 const struct intel_dp_link_config *max_link_limits)
625 {
626 link_caps->max_limits = *max_link_limits;
627 }
628
reset_max_link_limits(struct intel_dp_link_caps * link_caps)629 static void reset_max_link_limits(struct intel_dp_link_caps *link_caps)
630 {
631 struct intel_dp_link_config max_link_limits = {
632 .rate = intel_dp_max_common_rate(link_caps),
633 .lane_count = intel_dp_link_caps_max_common_lane_count(link_caps),
634 };
635
636 set_max_link_limits(link_caps, &max_link_limits);
637 }
638
reset_max_link_limits_reenable_all(struct intel_dp_link_caps * link_caps)639 static void reset_max_link_limits_reenable_all(struct intel_dp_link_caps *link_caps)
640 {
641 link_caps->enabled_configs = INTEL_DP_LINK_CAPS_FILTER_ALL;
642 reset_max_link_limits(link_caps);
643 }
644
645 /**
646 * intel_dp_link_caps_disable_config - disable a configuration
647 * @link_caps: link capabilities state
648 * @config: configuration to disable
649 *
650 * Disable the configuration identified by @config. This removes the
651 * configuration from the set of allowed configurations. The disabling
652 * shouldn't leave the remaining configuration set empty.
653 *
654 * The configuration remains disallowed until intel_dp_link_caps() with
655 * reset=%true or changed sink capabilities is called, or
656 * intel_dp_link_caps_reset() is called. Each of these happens after a
657 * new sink is connected or the currently connected sink changes its
658 * capabilities.
659 *
660 * Return:
661 * - %true if @config was valid and the derived state was updated.
662 * - %false if @config was invalid or the remaining configuration set
663 * would remain empty.
664 */
intel_dp_link_caps_disable_config(struct intel_dp_link_caps * link_caps,const struct intel_dp_link_config * config)665 bool intel_dp_link_caps_disable_config(struct intel_dp_link_caps *link_caps,
666 const struct intel_dp_link_config *config)
667 {
668 struct intel_dp_link_caps_filter enabled_configs = link_caps->enabled_configs;
669 struct intel_dp_link_config forced_params;
670
671 if (!intel_dp_link_caps_filter_remove(link_caps, &enabled_configs, config))
672 return false;
673
674 intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
675
676 if (!calc_allowed_config_filter(link_caps, enabled_configs,
677 &link_caps->max_limits, &forced_params).config_mask)
678 return false;
679
680 link_caps->enabled_configs = enabled_configs;
681
682 return true;
683 }
684
685 /**
686 * intel_dp_link_caps_get_max_limits - get the current maximum link limits
687 * @link_caps: link capabilities state
688 * @max_link_limits: returned maximum link limits
689 *
690 * Return the current maximum rate and lane count limits in
691 * @max_link_limits.
692 *
693 * These limits constrain the set of allowed configurations.
694 *
695 * The limits are set to the maximum common supported values after
696 * intel_dp_link_caps_reset() is called, and can later be modified by
697 * intel_dp_link_caps_set_max_limits(). The max rate and lane count
698 * parameters are independent limits, so the pair does not necessarily
699 * define a valid configuration.
700 *
701 * This function may be called without serializing against updates to
702 * @link_caps. However, without such serialization the returned value may be
703 * an out-of-sync (link rate, lane count) tuple, i.e. the parameters may
704 * belong to different update snapshots in time.
705 */
intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps * link_caps,struct intel_dp_link_config * max_link_limits)706 void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
707 struct intel_dp_link_config *max_link_limits)
708 {
709 *max_link_limits = link_caps->max_limits;
710 }
711
max_link_limits_valid(struct intel_dp_link_caps * link_caps,const struct intel_dp_link_config * max_link_limits)712 static bool max_link_limits_valid(struct intel_dp_link_caps *link_caps,
713 const struct intel_dp_link_config *max_link_limits)
714 {
715 struct intel_dp_link_caps_filter allowed_configs;
716 struct intel_dp_link_config forced_params;
717
718 if (max_link_limits->lane_count > INTEL_DP_MAX_LANE_COUNT ||
719 !is_power_of_2(max_link_limits->lane_count))
720 return false;
721
722 /* TODO: Validate max_link_limits->rate against the source supported rates. */
723
724 intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
725 allowed_configs = calc_allowed_config_filter(link_caps, link_caps->enabled_configs,
726 max_link_limits, &forced_params);
727
728 return allowed_configs.config_mask != 0;
729 }
730
731 /**
732 * intel_dp_link_caps_set_max_limits - set the current maximum link limits
733 * @link_caps: link capabilities state
734 * @max_link_limits: new maximum link limits
735 *
736 * Set the current maximum rate and lane count limits to @max_link_limits,
737 * constraining the set of allowed configurations.
738 *
739 * The new limits must leave at least one configuration allowed: the limits
740 * must not be below the currently active forced parameters or below all the
741 * configurations that remain after disabled configurations are excluded.
742 *
743 * Unlike intel_dp_link_caps_get_max_limits(), the caller must serialize
744 * this call against concurrent queries and updates to @link_caps, in line
745 * with the rest of the API.
746 *
747 * Return:
748 * - %true if the @link_caps cached max limits value got updated with
749 * @max_link_limits.
750 * - %false if @max_link_limits is invalid.
751 */
intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps * link_caps,const struct intel_dp_link_config * max_link_limits)752 bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
753 const struct intel_dp_link_config *max_link_limits)
754 {
755 if (!max_link_limits_valid(link_caps, max_link_limits))
756 return false;
757
758 set_max_link_limits(link_caps, max_link_limits);
759
760 return true;
761 }
762
763 /**
764 * intel_dp_link_caps_reset_max_limits - reset the current maximum link limits
765 * @link_caps: link capabilities state
766 *
767 * Reset the current maximum link limits to the maximum supported common link
768 * rate and lane count.
769 */
intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps * link_caps)770 void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps)
771 {
772 reset_max_link_limits(link_caps);
773 }
774
intel_dp_link_config_bw(struct intel_dp_link_caps * link_caps,const struct intel_dp_link_config_entry * lce)775 static int intel_dp_link_config_bw(struct intel_dp_link_caps *link_caps,
776 const struct intel_dp_link_config_entry *lce)
777 {
778 return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(link_caps, lce),
779 intel_dp_link_config_lane_count(lce));
780 }
781
link_config_cmp_by_bw(const void * a,const void * b,const void * p)782 static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
783 {
784 struct intel_dp *intel_dp = (struct intel_dp *)p; /* remove const */
785 struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
786
787 const struct intel_dp_link_config_entry *lce_a = a;
788 const struct intel_dp_link_config_entry *lce_b = b;
789 int bw_a = intel_dp_link_config_bw(link_caps, lce_a);
790 int bw_b = intel_dp_link_config_bw(link_caps, lce_b);
791
792 if (bw_a != bw_b)
793 return bw_a - bw_b;
794
795 return intel_dp_link_config_rate(link_caps, lce_a) -
796 intel_dp_link_config_rate(link_caps, lce_b);
797 }
798
link_config_cmp_by_rate_lane(const void * a,const void * b,const void * p)799 static int link_config_cmp_by_rate_lane(const void *a, const void *b, const void *p)
800 {
801 const struct intel_dp_link_caps *link_caps = p;
802 u8 *lce_a_idx = (u8 *)a;
803 u8 *lce_b_idx = (u8 *)b;
804 const struct intel_dp_link_config_entry *lce_a = &link_caps->configs[*lce_a_idx];
805 const struct intel_dp_link_config_entry *lce_b = &link_caps->configs[*lce_b_idx];
806
807 if (lce_a->link_rate_idx != lce_b->link_rate_idx)
808 return lce_a->link_rate_idx - lce_b->link_rate_idx;
809
810 return lce_a->lane_count_exp - lce_b->lane_count_exp;
811 }
812
link_config_cmp_by_lane_rate(const void * a,const void * b,const void * p)813 static int link_config_cmp_by_lane_rate(const void *a, const void *b, const void *p)
814 {
815 const struct intel_dp_link_caps *link_caps = p;
816 u8 *lce_a_idx = (u8 *)a;
817 u8 *lce_b_idx = (u8 *)b;
818 const struct intel_dp_link_config_entry *lce_a = &link_caps->configs[*lce_a_idx];
819 const struct intel_dp_link_config_entry *lce_b = &link_caps->configs[*lce_b_idx];
820
821 if (lce_a->lane_count_exp != lce_b->lane_count_exp)
822 return lce_a->lane_count_exp - lce_b->lane_count_exp;
823
824 return lce_a->link_rate_idx - lce_b->link_rate_idx;
825 }
826
827 /**
828 * intel_dp_link_caps_update - rebuild the supported link configuration state
829 * @link_caps: link capabilities state
830 * @rates: supported common link rates
831 * @num_rates: number of entries in @rates
832 * @max_lane_count: supported maximum lane count
833 * @reset: reset limits and disabled configs
834 *
835 * Rebuild the supported link configuration state from @rates and
836 * @max_lane_count.
837 *
838 * If @reset is %true, reset the maximum link limits to the maximum
839 * supported rate and lane count, and re-enable all configurations.
840 *
841 * This function is called regularly, at least after a sink is connected,
842 * but it may also be called later whenever the sink capabilities may have
843 * changed, for example in response to HPD IRQ / RX_CAP_CHANGED signaling.
844 *
845 * In the Intel driver this function is currently called whenever the
846 * connector detect handler runs, after reading the sink capabilities. This
847 * may change if those capabilities are cached until the sink is
848 * disconnected, or until RX_CAP_CHANGED is signaled. In any case, this
849 * function should be called whenever the sink capabilities were read out
850 * and may have changed.
851 *
852 * Returns:
853 * - %true if the link capabilities have changed, %false otherwise.
854 */
intel_dp_link_caps_update(struct intel_dp_link_caps * link_caps,const int * rates,int num_rates,int max_lane_count,bool reset)855 bool intel_dp_link_caps_update(struct intel_dp_link_caps *link_caps,
856 const int *rates, int num_rates, int max_lane_count,
857 bool reset)
858 {
859 struct intel_dp *intel_dp = link_caps->dp;
860 struct intel_display *display = to_intel_display(intel_dp);
861 struct intel_dp_link_config_entry *lce;
862 bool link_params_changed = reset;
863 int num_common_lane_configs;
864 int i;
865 int j;
866
867 if (drm_WARN_ON(display->drm, !is_power_of_2(max_lane_count)))
868 return false;
869
870 if (drm_WARN_ON(display->drm, num_rates > ARRAY_SIZE(link_caps->rates)))
871 return false;
872
873 num_common_lane_configs = ilog2(max_lane_count) + 1;
874
875 if (drm_WARN_ON(display->drm, num_rates * num_common_lane_configs >
876 ARRAY_SIZE(link_caps->configs)))
877 return false;
878
879 /* TODO: Add a struct containing both rates and number of rates. */
880 static_assert(__same_type(rates[0], link_caps->rates[0]));
881 if (num_rates != link_caps->num_rates ||
882 memcmp(rates, link_caps->rates, num_rates * sizeof(rates[0])))
883 link_params_changed = true;
884
885 if (max_lane_count != link_caps->max_lane_count)
886 link_params_changed = true;
887
888 memcpy(link_caps->rates, rates, num_rates * sizeof(rates[0]));
889 link_caps->num_rates = num_rates;
890 link_caps->max_lane_count = max_lane_count;
891
892 link_caps->num_configs = num_rates * num_common_lane_configs;
893
894 lce = &link_caps->configs[0];
895 for (i = 0; i < link_caps->num_rates; i++) {
896 for (j = 0; j < num_common_lane_configs; j++) {
897 lce->lane_count_exp = j;
898 lce->link_rate_idx = i;
899
900 lce++;
901 }
902 }
903
904 sort_r(link_caps->configs, link_caps->num_configs,
905 sizeof(link_caps->configs[0]),
906 link_config_cmp_by_bw, NULL,
907 intel_dp);
908
909 for (i = 0; i < link_caps->num_configs; i++) {
910 link_caps->rate_lane_map[i] = i;
911 link_caps->lane_rate_map[i] = i;
912 }
913
914 sort_r(link_caps->rate_lane_map, link_caps->num_configs,
915 sizeof(link_caps->rate_lane_map[0]),
916 link_config_cmp_by_rate_lane, NULL,
917 link_caps);
918
919 sort_r(link_caps->lane_rate_map, link_caps->num_configs,
920 sizeof(link_caps->lane_rate_map[0]),
921 link_config_cmp_by_lane_rate, NULL,
922 link_caps);
923
924 if (link_params_changed)
925 reset_max_link_limits_reenable_all(link_caps);
926
927 return link_params_changed;
928 }
929
930 /**
931 * intel_dp_link_caps_reset - reset link capability restrictions
932 * @link_caps: link capabilities state
933 *
934 * Reset all current restrictions except for the user requested forced
935 * parameters, thus updating the set of allowed configurations and the
936 * derived maximum link information accordingly.
937 *
938 * This function is regularly called after a sink is connected, either
939 * for the first time to the connector or after a previous sink was
940 * disconnected from it, and intel_dp_link_caps_update() was called.
941 */
intel_dp_link_caps_reset(struct intel_dp_link_caps * link_caps)942 void intel_dp_link_caps_reset(struct intel_dp_link_caps *link_caps)
943 {
944 reset_max_link_limits_reenable_all(link_caps);
945 }
946
i915_dp_force_link_rate_show(struct seq_file * m,void * data)947 static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
948 {
949 struct intel_connector *connector = to_intel_connector(m->private);
950 struct intel_display *display = to_intel_display(connector);
951 struct intel_dp *intel_dp = intel_attached_dp(connector);
952 struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
953 int current_rate = -1;
954 int force_rate;
955 int err;
956 int i;
957
958 err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
959 if (err)
960 return err;
961
962 intel_dp_flush_connector_commits(connector);
963
964 if (intel_dp->link.active)
965 current_rate = intel_dp->link_rate;
966
967 force_rate = link_caps->forced_params.rate;
968
969 drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
970
971 seq_printf(m, "%sauto%s",
972 force_rate == 0 ? "[" : "",
973 force_rate == 0 ? "]" : "");
974
975 for (i = 0; i < intel_dp->num_source_rates; i++)
976 seq_printf(m, " %s%d%s%s",
977 intel_dp->source_rates[i] == force_rate ? "[" : "",
978 intel_dp->source_rates[i],
979 intel_dp->source_rates[i] == current_rate ? "*" : "",
980 intel_dp->source_rates[i] == force_rate ? "]" : "");
981
982 seq_putc(m, '\n');
983
984 return 0;
985 }
986
parse_link_rate(struct intel_dp_link_caps * link_caps,const char __user * ubuf,size_t len)987 static int parse_link_rate(struct intel_dp_link_caps *link_caps, const char __user *ubuf, size_t len)
988 {
989 struct intel_dp *intel_dp = link_caps->dp;
990 char *kbuf;
991 const char *p;
992 int rate;
993 int ret = 0;
994
995 kbuf = memdup_user_nul(ubuf, len);
996 if (IS_ERR(kbuf))
997 return PTR_ERR(kbuf);
998
999 p = strim(kbuf);
1000
1001 if (!strcmp(p, "auto")) {
1002 rate = 0;
1003 } else {
1004 ret = kstrtoint(p, 0, &rate);
1005 if (ret < 0)
1006 goto out_free;
1007
1008 if (intel_dp_rate_index(intel_dp->source_rates,
1009 intel_dp->num_source_rates,
1010 rate) < 0)
1011 ret = -EINVAL;
1012 }
1013
1014 out_free:
1015 kfree(kbuf);
1016
1017 return ret < 0 ? ret : rate;
1018 }
1019
i915_dp_force_link_rate_write(struct file * file,const char __user * ubuf,size_t len,loff_t * offp)1020 static ssize_t i915_dp_force_link_rate_write(struct file *file,
1021 const char __user *ubuf,
1022 size_t len, loff_t *offp)
1023 {
1024 struct seq_file *m = file->private_data;
1025 struct intel_connector *connector = to_intel_connector(m->private);
1026 struct intel_display *display = to_intel_display(connector);
1027 struct intel_dp *intel_dp = intel_attached_dp(connector);
1028 struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
1029 int rate;
1030 int err;
1031
1032 rate = parse_link_rate(link_caps, ubuf, len);
1033 if (rate < 0)
1034 return rate;
1035
1036 err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
1037 if (err)
1038 return err;
1039
1040 intel_dp_flush_connector_commits(connector);
1041
1042 intel_dp_reset_link_params(intel_dp);
1043 link_caps->forced_params.rate = rate;
1044
1045 drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
1046
1047 *offp += len;
1048
1049 return len;
1050 }
1051 DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_link_rate);
1052
i915_dp_force_lane_count_show(struct seq_file * m,void * data)1053 static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
1054 {
1055 struct intel_connector *connector = to_intel_connector(m->private);
1056 struct intel_display *display = to_intel_display(connector);
1057 struct intel_dp *intel_dp = intel_attached_dp(connector);
1058 struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
1059 int current_lane_count = -1;
1060 int force_lane_count;
1061 int err;
1062 int i;
1063
1064 err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
1065 if (err)
1066 return err;
1067
1068 intel_dp_flush_connector_commits(connector);
1069
1070 if (intel_dp->link.active)
1071 current_lane_count = intel_dp->lane_count;
1072 force_lane_count = link_caps->forced_params.lane_count;
1073
1074 drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
1075
1076 seq_printf(m, "%sauto%s",
1077 force_lane_count == 0 ? "[" : "",
1078 force_lane_count == 0 ? "]" : "");
1079
1080 for (i = 1; i <= 4; i <<= 1)
1081 seq_printf(m, " %s%d%s%s",
1082 i == force_lane_count ? "[" : "",
1083 i,
1084 i == current_lane_count ? "*" : "",
1085 i == force_lane_count ? "]" : "");
1086
1087 seq_putc(m, '\n');
1088
1089 return 0;
1090 }
1091
parse_lane_count(const char __user * ubuf,size_t len)1092 static int parse_lane_count(const char __user *ubuf, size_t len)
1093 {
1094 char *kbuf;
1095 const char *p;
1096 int lane_count;
1097 int ret = 0;
1098
1099 kbuf = memdup_user_nul(ubuf, len);
1100 if (IS_ERR(kbuf))
1101 return PTR_ERR(kbuf);
1102
1103 p = strim(kbuf);
1104
1105 if (!strcmp(p, "auto")) {
1106 lane_count = 0;
1107 } else {
1108 ret = kstrtoint(p, 0, &lane_count);
1109 if (ret < 0)
1110 goto out_free;
1111
1112 switch (lane_count) {
1113 case 1:
1114 case 2:
1115 case 4:
1116 break;
1117 default:
1118 ret = -EINVAL;
1119 }
1120 }
1121
1122 out_free:
1123 kfree(kbuf);
1124
1125 return ret < 0 ? ret : lane_count;
1126 }
1127
i915_dp_force_lane_count_write(struct file * file,const char __user * ubuf,size_t len,loff_t * offp)1128 static ssize_t i915_dp_force_lane_count_write(struct file *file,
1129 const char __user *ubuf,
1130 size_t len, loff_t *offp)
1131 {
1132 struct seq_file *m = file->private_data;
1133 struct intel_connector *connector = to_intel_connector(m->private);
1134 struct intel_display *display = to_intel_display(connector);
1135 struct intel_dp *intel_dp = intel_attached_dp(connector);
1136 struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
1137 int lane_count;
1138 int err;
1139
1140 lane_count = parse_lane_count(ubuf, len);
1141 if (lane_count < 0)
1142 return lane_count;
1143
1144 err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
1145 if (err)
1146 return err;
1147
1148 intel_dp_flush_connector_commits(connector);
1149
1150 intel_dp_reset_link_params(intel_dp);
1151 link_caps->forced_params.lane_count = lane_count;
1152
1153 drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
1154
1155 *offp += len;
1156
1157 return len;
1158 }
1159 DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_lane_count);
1160
i915_dp_max_link_rate_show(void * data,u64 * val)1161 static int i915_dp_max_link_rate_show(void *data, u64 *val)
1162 {
1163 struct intel_connector *connector = to_intel_connector(data);
1164 struct intel_display *display = to_intel_display(connector);
1165 struct intel_dp *intel_dp = intel_attached_dp(connector);
1166 struct intel_dp_link_config max_link_limits;
1167 int err;
1168
1169 err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
1170 if (err)
1171 return err;
1172
1173 intel_dp_flush_connector_commits(connector);
1174
1175 intel_dp_link_caps_get_max_limits(intel_dp->link.caps, &max_link_limits);
1176 *val = max_link_limits.rate;
1177
1178 drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
1179
1180 return 0;
1181 }
1182 DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_link_rate_fops, i915_dp_max_link_rate_show, NULL, "%llu\n");
1183
i915_dp_max_lane_count_show(void * data,u64 * val)1184 static int i915_dp_max_lane_count_show(void *data, u64 *val)
1185 {
1186 struct intel_connector *connector = to_intel_connector(data);
1187 struct intel_display *display = to_intel_display(connector);
1188 struct intel_dp *intel_dp = intel_attached_dp(connector);
1189 struct intel_dp_link_config max_link_limits;
1190 int err;
1191
1192 err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
1193 if (err)
1194 return err;
1195
1196 intel_dp_flush_connector_commits(connector);
1197
1198 intel_dp_link_caps_get_max_limits(intel_dp->link.caps, &max_link_limits);
1199 *val = max_link_limits.lane_count;
1200
1201 drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
1202
1203 return 0;
1204 }
1205 DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_lane_count_fops, i915_dp_max_lane_count_show, NULL, "%llu\n");
1206
intel_dp_allowed_link_configs_show(struct seq_file * m,void * data)1207 static int intel_dp_allowed_link_configs_show(struct seq_file *m, void *data)
1208 {
1209 struct intel_connector *connector = to_intel_connector(m->private);
1210 struct intel_display *display = to_intel_display(connector);
1211 struct intel_dp *intel_dp = intel_attached_dp(connector);
1212 struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
1213 struct intel_dp_link_config link_config;
1214 struct intel_dp_link_caps_iter iter;
1215 int err;
1216 int i;
1217
1218 err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
1219 if (err)
1220 return err;
1221
1222 intel_dp_flush_connector_commits(connector);
1223
1224 i = 0;
1225 intel_dp_link_caps_iter_start(&iter,
1226 link_caps,
1227 intel_dp_link_caps_connector_compute_order(connector),
1228 INTEL_DP_LINK_CAPS_FILTER_ALL);
1229 for_each_dp_link_config(&iter, &link_config) {
1230 seq_printf(m, "%s%dx%d",
1231 i ? " " : "",
1232 link_config.lane_count, link_config.rate);
1233 i++;
1234 }
1235 intel_dp_link_caps_iter_end(&iter);
1236
1237 drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
1238
1239 seq_putc(m, '\n');
1240
1241 return 0;
1242 }
1243 DEFINE_SHOW_ATTRIBUTE(intel_dp_allowed_link_configs);
1244
1245 /**
1246 * intel_dp_link_caps_debugfs_add - add link caps debugfs files for a connector
1247 * @connector: connector to add the debugfs files for
1248 *
1249 * Add the link-capability debugfs files for a DP @connector.
1250 */
intel_dp_link_caps_debugfs_add(struct intel_connector * connector)1251 void intel_dp_link_caps_debugfs_add(struct intel_connector *connector)
1252 {
1253 struct dentry *root = connector->base.debugfs_entry;
1254
1255 if (connector->base.connector_type != DRM_MODE_CONNECTOR_DisplayPort &&
1256 connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
1257 return;
1258
1259 debugfs_create_file("i915_dp_force_link_rate", 0644, root,
1260 connector, &i915_dp_force_link_rate_fops);
1261
1262 debugfs_create_file("i915_dp_force_lane_count", 0644, root,
1263 connector, &i915_dp_force_lane_count_fops);
1264
1265 debugfs_create_file("i915_dp_max_link_rate", 0444, root,
1266 connector, &i915_dp_max_link_rate_fops);
1267
1268 debugfs_create_file("i915_dp_max_lane_count", 0444, root,
1269 connector, &i915_dp_max_lane_count_fops);
1270
1271 debugfs_create_file("intel_dp_allowed_link_configs", 0444, root,
1272 connector, &intel_dp_allowed_link_configs_fops);
1273 }
1274
intel_dp_link_caps_init(struct intel_dp * intel_dp)1275 struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
1276 {
1277 struct intel_dp_link_caps *link_caps;
1278
1279 link_caps = kzalloc_obj(*link_caps);
1280 if (!link_caps)
1281 return NULL;
1282
1283 link_caps->dp = intel_dp;
1284 link_caps->enabled_configs = INTEL_DP_LINK_CAPS_FILTER_ALL;
1285
1286 return link_caps;
1287 }
1288
intel_dp_link_caps_cleanup(struct intel_dp_link_caps * link_caps)1289 void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps)
1290 {
1291 kfree(link_caps);
1292 }
1293
1294 #if IS_ENABLED(CONFIG_KUNIT)
1295
1296 #define __INIT_MEMBER(__name, __fn) \
1297 .__name = __fn,
1298
1299 #define INTEL_DP_LINK_CAPS_TEST_OPS_INIT \
1300 INTEL_DP_LINK_CAPS_TEST_OPS_MEMBERS(__INIT_MEMBER)
1301
1302 #ifdef I915
1303
1304 const struct intel_dp_link_caps_test_ops i915_display_dp_link_caps_test_ops = {
1305 INTEL_DP_LINK_CAPS_TEST_OPS_INIT
1306 };
1307 EXPORT_SYMBOL_IF_KUNIT(i915_display_dp_link_caps_test_ops);
1308
1309 #else
1310
1311 const struct intel_dp_link_caps_test_ops intel_display_dp_link_caps_test_ops = {
1312 INTEL_DP_LINK_CAPS_TEST_OPS_INIT
1313 };
1314 EXPORT_SYMBOL_IF_KUNIT(intel_display_dp_link_caps_test_ops);
1315
1316 #endif /* I915 */
1317
1318 #undef INTEL_DP_LINK_CAPS_TEST_OPS_INIT
1319 #undef __INIT_MEMBER
1320
1321 #endif /* CONFIG_KUNIT */
1322