xref: /linux/drivers/gpu/drm/i915/display/intel_dp_link_caps.c (revision 5c9deba5578db5a3ea05be8a3e4a59ecb08ee76f)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2026 Intel Corporation
4  */
5 
6 #include <linux/bitops.h>
7 #include <linux/debugfs.h>
8 #include <linux/log2.h>
9 #include <linux/seq_buf.h>
10 #include <linux/slab.h>
11 #include <linux/sort.h>
12 #include <linux/string.h>
13 #include <linux/types.h>
14 
15 #include <drm/drm_print.h>
16 
17 #include "intel_display_core.h"
18 #include "intel_display_types.h"
19 #include "intel_dp.h"
20 #include "intel_dp_link_caps.h"
21 
22 struct intel_dp_link_caps {
23 	struct intel_dp *dp;
24 
25 	/* Rate, lane count caps common to source and sink. */
26 	int num_rates;
27 	int rates[DP_MAX_SUPPORTED_RATES];
28 	int max_lane_count;
29 
30 	/* common rate,lane_count configs in bw order */
31 	int num_configs;
32 #define INTEL_DP_MAX_LANE_COUNT			4
33 #define INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS	(ilog2(INTEL_DP_MAX_LANE_COUNT) + 1)
34 #define INTEL_DP_LANE_COUNT_EXP_BITS		order_base_2(INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
35 #define INTEL_DP_LINK_RATE_IDX_BITS		(BITS_PER_TYPE(u8) - INTEL_DP_LANE_COUNT_EXP_BITS)
36 #define INTEL_DP_MAX_LINK_CONFIGS		(DP_MAX_SUPPORTED_RATES * \
37 						 INTEL_DP_MAX_SUPPORTED_LANE_CONFIGS)
38 	struct intel_dp_link_config_entry {
39 		/* index into rates[] */
40 		u8 link_rate_idx:INTEL_DP_LINK_RATE_IDX_BITS;
41 		u8 lane_count_exp:INTEL_DP_LANE_COUNT_EXP_BITS;
42 	} configs[INTEL_DP_MAX_LINK_CONFIGS];
43 
44 	/*
45 	 * Forced parameters requested via debugfs. Remains set across sink
46 	 * disconnects.
47 	 */
48 	struct intel_dp_link_config forced_params;
49 
50 	/*
51 	 * User set maximum limits. These limits constrain the currently
52 	 * allowed set of configurations and are not adjusted when sink
53 	 * capabilities change.
54 	 *
55 	 * max_limits.rate/lane_count may come from different allowed
56 	 * configurations, i.e. the (max_limits.rate, max_limits.lane_count)
57 	 * tuple itself may not be an allowed configuration.
58 	 */
59 	struct intel_dp_link_config max_limits;
60 };
61 
62 /* Get length of common rates array potentially limited by max_rate. */
63 int intel_dp_common_len_rate_limit(struct intel_dp_link_caps *link_caps,
64 				   int max_rate)
65 {
66 	return intel_dp_rate_limit_len(link_caps->rates,
67 				       link_caps->num_rates, max_rate);
68 }
69 
70 int intel_dp_common_rate(struct intel_dp_link_caps *link_caps, int index)
71 {
72 	struct intel_display *display = to_intel_display(link_caps->dp);
73 
74 	if (drm_WARN_ON(display->drm,
75 			index < 0 || index >= link_caps->num_rates))
76 		return 162000;
77 
78 	return link_caps->rates[index];
79 }
80 
81 int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, int rate)
82 {
83 	return intel_dp_rate_index(link_caps->rates,
84 				   link_caps->num_rates,
85 				   rate);
86 }
87 
88 /* Theoretical max between source and sink */
89 int intel_dp_max_common_rate(struct intel_dp_link_caps *link_caps)
90 {
91 	return intel_dp_common_rate(link_caps, link_caps->num_rates - 1);
92 }
93 
94 int intel_dp_link_caps_num_common_rates(struct intel_dp_link_caps *link_caps)
95 {
96 	return link_caps->num_rates;
97 }
98 
99 void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps *link_caps)
100 {
101 	struct intel_display *display = to_intel_display(link_caps->dp);
102 	DECLARE_SEQ_BUF(s, 128);
103 	int i;
104 
105 	for (i = 0; i < link_caps->num_rates; i++)
106 		seq_buf_printf(&s, "%s%d", i ? ", " : "", link_caps->rates[i]);
107 
108 	drm_dbg_kms(display->drm, "common rates: %s\n", seq_buf_str(&s));
109 }
110 
111 int intel_dp_link_caps_max_common_lane_count(struct intel_dp_link_caps *link_caps)
112 {
113 	return link_caps->max_lane_count;
114 }
115 
116 static int forced_lane_count(struct intel_dp_link_caps *link_caps)
117 {
118 	if (!link_caps->forced_params.lane_count)
119 		return 0;
120 
121 	return clamp(link_caps->forced_params.lane_count,
122 		     1, intel_dp_link_caps_max_common_lane_count(link_caps));
123 }
124 
125 static int forced_link_rate(struct intel_dp_link_caps *link_caps)
126 {
127 	int len;
128 
129 	if (!link_caps->forced_params.rate)
130 		return 0;
131 
132 	len = intel_dp_common_len_rate_limit(link_caps, link_caps->forced_params.rate);
133 	if (len == 0)
134 		return intel_dp_common_rate(link_caps, 0);
135 
136 	return intel_dp_common_rate(link_caps, len - 1);
137 }
138 
139 void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps *link_caps,
140 					  struct intel_dp_link_config *forced_params)
141 {
142 	forced_params->rate = forced_link_rate(link_caps);
143 	forced_params->lane_count = forced_lane_count(link_caps);
144 }
145 
146 static int intel_dp_link_config_rate(struct intel_dp_link_caps *link_caps,
147 				     const struct intel_dp_link_config_entry *lce)
148 {
149 	return intel_dp_common_rate(link_caps, lce->link_rate_idx);
150 }
151 
152 static int intel_dp_link_config_lane_count(const struct intel_dp_link_config_entry *lce)
153 {
154 	return 1 << lce->lane_count_exp;
155 }
156 
157 static void set_max_link_limits_no_update(struct intel_dp_link_caps *link_caps,
158 					  const struct intel_dp_link_config *max_link_limits)
159 {
160 	link_caps->max_limits = *max_link_limits;
161 }
162 
163 static void reset_max_link_limits_no_update(struct intel_dp_link_caps *link_caps)
164 {
165 	struct intel_dp_link_config max_link_limits = {
166 		.rate = intel_dp_max_common_rate(link_caps),
167 		.lane_count = intel_dp_link_caps_max_common_lane_count(link_caps),
168 	};
169 
170 	set_max_link_limits_no_update(link_caps, &max_link_limits);
171 }
172 
173 /**
174  * intel_dp_link_caps_get_max_limits - get the current maximum link limits
175  * @link_caps: link capabilities state
176  * @max_link_limits: returned maximum link limits
177  *
178  * Return the current maximum rate and lane count limits in
179  * @max_link_limits.
180  *
181  * These limits constrain the set of allowed configurations.
182  *
183  * The limits are set to the maximum common supported values after
184  * intel_dp_link_caps_reset() is called, and can later be modified by
185  * intel_dp_link_caps_set_max_limits(). The max rate and lane count
186  * parameters are independent limits, so the pair does not necessarily
187  * define a valid configuration.
188  *
189  * This function may be called without serializing against updates to
190  * @link_caps. However, without such serialization the returned value may be
191  * an out-of-sync (link rate, lane count) tuple, i.e. the parameters may
192  * belong to different update snapshots in time.
193  */
194 void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps,
195 				       struct intel_dp_link_config *max_link_limits)
196 {
197 	*max_link_limits = link_caps->max_limits;
198 }
199 
200 /**
201  * intel_dp_link_caps_set_max_limits - set the current maximum link limits
202  * @link_caps: link capabilities state
203  * @max_link_limits: new maximum link limits
204  *
205  * Set the current maximum rate and lane count limits to @max_link_limits,
206  * constraining the set of allowed configurations.
207  *
208  * Unlike intel_dp_link_caps_get_max_limits(), the caller must serialize
209  * this call against concurrent queries and updates to @link_caps, in line
210  * with the rest of the API.
211  *
212  * Return:
213  * - %true  if the @link_caps cached max limits value got updated with
214  *          @max_link_limits.
215  * - %false if @max_link_limits is invalid.
216  */
217 bool intel_dp_link_caps_set_max_limits(struct intel_dp_link_caps *link_caps,
218 				       const struct intel_dp_link_config *max_link_limits)
219 {
220 	set_max_link_limits_no_update(link_caps, max_link_limits);
221 
222 	/* TODO: validate max_link_limits */
223 	return true;
224 }
225 
226 /**
227  * intel_dp_link_caps_reset_max_limits - reset the current maximum link limits
228  * @link_caps: link capabilities state
229  *
230  * Reset the current maximum link limits to the maximum supported common link
231  * rate and lane count.
232  */
233 void intel_dp_link_caps_reset_max_limits(struct intel_dp_link_caps *link_caps)
234 {
235 	reset_max_link_limits_no_update(link_caps);
236 }
237 
238 static int intel_dp_link_config_bw(struct intel_dp_link_caps *link_caps,
239 				   const struct intel_dp_link_config_entry *lce)
240 {
241 	return drm_dp_max_dprx_data_rate(intel_dp_link_config_rate(link_caps, lce),
242 					 intel_dp_link_config_lane_count(lce));
243 }
244 
245 static int link_config_cmp_by_bw(const void *a, const void *b, const void *p)
246 {
247 	struct intel_dp *intel_dp = (struct intel_dp *)p;	/* remove const */
248 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
249 
250 	const struct intel_dp_link_config_entry *lce_a = a;
251 	const struct intel_dp_link_config_entry *lce_b = b;
252 	int bw_a = intel_dp_link_config_bw(link_caps, lce_a);
253 	int bw_b = intel_dp_link_config_bw(link_caps, lce_b);
254 
255 	if (bw_a != bw_b)
256 		return bw_a - bw_b;
257 
258 	return intel_dp_link_config_rate(link_caps, lce_a) -
259 	       intel_dp_link_config_rate(link_caps, lce_b);
260 }
261 
262 /* Return %true if the supported link parameters have changed. */
263 bool intel_dp_link_caps_update(struct intel_dp_link_caps *link_caps,
264 			       const int *rates, int num_rates, int max_lane_count)
265 {
266 	struct intel_dp *intel_dp = link_caps->dp;
267 	struct intel_display *display = to_intel_display(intel_dp);
268 	struct intel_dp_link_config_entry *lce;
269 	bool link_params_changed = false;
270 	int num_common_lane_configs;
271 	int i;
272 	int j;
273 
274 	if (drm_WARN_ON(display->drm, !is_power_of_2(max_lane_count)))
275 		return false;
276 
277 	if (drm_WARN_ON(display->drm, num_rates > ARRAY_SIZE(link_caps->rates)))
278 		return false;
279 
280 	num_common_lane_configs = ilog2(max_lane_count) + 1;
281 
282 	if (drm_WARN_ON(display->drm, num_rates * num_common_lane_configs >
283 				    ARRAY_SIZE(link_caps->configs)))
284 		return false;
285 
286 	/* TODO: Add a struct containing both rates and number of rates. */
287 	static_assert(__same_type(rates[0], link_caps->rates[0]));
288 	if (num_rates != link_caps->num_rates ||
289 	    memcmp(rates, link_caps->rates, num_rates * sizeof(rates[0])))
290 		link_params_changed = true;
291 
292 	if (max_lane_count != link_caps->max_lane_count)
293 		link_params_changed = true;
294 
295 	memcpy(link_caps->rates, rates, num_rates * sizeof(rates[0]));
296 	link_caps->num_rates = num_rates;
297 	link_caps->max_lane_count = max_lane_count;
298 
299 	link_caps->num_configs = num_rates * num_common_lane_configs;
300 
301 	lce = &link_caps->configs[0];
302 	for (i = 0; i < link_caps->num_rates; i++) {
303 		for (j = 0; j < num_common_lane_configs; j++) {
304 			lce->lane_count_exp = j;
305 			lce->link_rate_idx = i;
306 
307 			lce++;
308 		}
309 	}
310 
311 	sort_r(link_caps->configs, link_caps->num_configs,
312 	       sizeof(link_caps->configs[0]),
313 	       link_config_cmp_by_bw, NULL,
314 	       intel_dp);
315 
316 	return link_params_changed;
317 }
318 
319 void intel_dp_link_config_get(struct intel_dp_link_caps *link_caps,
320 			      int idx, int *link_rate, int *lane_count)
321 {
322 	struct intel_display *display = to_intel_display(link_caps->dp);
323 	const struct intel_dp_link_config_entry *lce;
324 
325 	if (drm_WARN_ON(display->drm, idx < 0 || idx >= link_caps->num_configs))
326 		idx = 0;
327 
328 	lce = &link_caps->configs[idx];
329 
330 	*link_rate = intel_dp_link_config_rate(link_caps, lce);
331 	*lane_count = intel_dp_link_config_lane_count(lce);
332 }
333 
334 int intel_dp_link_config_index(struct intel_dp_link_caps *link_caps,
335 			       int link_rate, int lane_count)
336 {
337 	int link_rate_idx = intel_dp_rate_index(link_caps->rates, link_caps->num_rates,
338 						link_rate);
339 	int lane_count_exp = ilog2(lane_count);
340 	int i;
341 
342 	for (i = 0; i < link_caps->num_configs; i++) {
343 		const struct intel_dp_link_config_entry *lce = &link_caps->configs[i];
344 
345 		if (lce->lane_count_exp == lane_count_exp &&
346 		    lce->link_rate_idx == link_rate_idx)
347 			return i;
348 	}
349 
350 	return -1;
351 }
352 
353 /**
354  * intel_dp_link_caps_reset - reset link capability restrictions
355  * @link_caps: link capabilities state
356  *
357  * Reset all current restrictions except for the user requested forced
358  * parameters, thus updating the set of allowed configurations and the
359  * derived maximum link information accordingly.
360  *
361  * This function is regularly called after a sink is connected, either
362  * for the first time to the connector or after a previous sink was
363  * disconnected from it, and intel_dp_link_caps_update() was called.
364  */
365 void intel_dp_link_caps_reset(struct intel_dp_link_caps *link_caps)
366 {
367 	/* TODO: Update the maximum link information. */
368 	reset_max_link_limits_no_update(link_caps);
369 }
370 
371 static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
372 {
373 	struct intel_connector *connector = to_intel_connector(m->private);
374 	struct intel_display *display = to_intel_display(connector);
375 	struct intel_dp *intel_dp = intel_attached_dp(connector);
376 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
377 	int current_rate = -1;
378 	int force_rate;
379 	int err;
380 	int i;
381 
382 	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
383 	if (err)
384 		return err;
385 
386 	intel_dp_flush_connector_commits(connector);
387 
388 	if (intel_dp->link.active)
389 		current_rate = intel_dp->link_rate;
390 
391 	force_rate = link_caps->forced_params.rate;
392 
393 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
394 
395 	seq_printf(m, "%sauto%s",
396 		   force_rate == 0 ? "[" : "",
397 		   force_rate == 0 ? "]" : "");
398 
399 	for (i = 0; i < intel_dp->num_source_rates; i++)
400 		seq_printf(m, " %s%d%s%s",
401 			   intel_dp->source_rates[i] == force_rate ? "[" : "",
402 			   intel_dp->source_rates[i],
403 			   intel_dp->source_rates[i] == current_rate ? "*" : "",
404 			   intel_dp->source_rates[i] == force_rate ? "]" : "");
405 
406 	seq_putc(m, '\n');
407 
408 	return 0;
409 }
410 
411 static int parse_link_rate(struct intel_dp_link_caps *link_caps, const char __user *ubuf, size_t len)
412 {
413 	struct intel_dp *intel_dp = link_caps->dp;
414 	char *kbuf;
415 	const char *p;
416 	int rate;
417 	int ret = 0;
418 
419 	kbuf = memdup_user_nul(ubuf, len);
420 	if (IS_ERR(kbuf))
421 		return PTR_ERR(kbuf);
422 
423 	p = strim(kbuf);
424 
425 	if (!strcmp(p, "auto")) {
426 		rate = 0;
427 	} else {
428 		ret = kstrtoint(p, 0, &rate);
429 		if (ret < 0)
430 			goto out_free;
431 
432 		if (intel_dp_rate_index(intel_dp->source_rates,
433 					intel_dp->num_source_rates,
434 					rate) < 0)
435 			ret = -EINVAL;
436 	}
437 
438 out_free:
439 	kfree(kbuf);
440 
441 	return ret < 0 ? ret : rate;
442 }
443 
444 static ssize_t i915_dp_force_link_rate_write(struct file *file,
445 					     const char __user *ubuf,
446 					     size_t len, loff_t *offp)
447 {
448 	struct seq_file *m = file->private_data;
449 	struct intel_connector *connector = to_intel_connector(m->private);
450 	struct intel_display *display = to_intel_display(connector);
451 	struct intel_dp *intel_dp = intel_attached_dp(connector);
452 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
453 	int rate;
454 	int err;
455 
456 	rate = parse_link_rate(link_caps, ubuf, len);
457 	if (rate < 0)
458 		return rate;
459 
460 	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
461 	if (err)
462 		return err;
463 
464 	intel_dp_flush_connector_commits(connector);
465 
466 	intel_dp_reset_link_params(intel_dp);
467 	link_caps->forced_params.rate = rate;
468 
469 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
470 
471 	*offp += len;
472 
473 	return len;
474 }
475 DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_link_rate);
476 
477 static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
478 {
479 	struct intel_connector *connector = to_intel_connector(m->private);
480 	struct intel_display *display = to_intel_display(connector);
481 	struct intel_dp *intel_dp = intel_attached_dp(connector);
482 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
483 	int current_lane_count = -1;
484 	int force_lane_count;
485 	int err;
486 	int i;
487 
488 	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
489 	if (err)
490 		return err;
491 
492 	intel_dp_flush_connector_commits(connector);
493 
494 	if (intel_dp->link.active)
495 		current_lane_count = intel_dp->lane_count;
496 	force_lane_count = link_caps->forced_params.lane_count;
497 
498 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
499 
500 	seq_printf(m, "%sauto%s",
501 		   force_lane_count == 0 ? "[" : "",
502 		   force_lane_count == 0 ? "]" : "");
503 
504 	for (i = 1; i <= 4; i <<= 1)
505 		seq_printf(m, " %s%d%s%s",
506 			   i == force_lane_count ? "[" : "",
507 			   i,
508 			   i == current_lane_count ? "*" : "",
509 			   i == force_lane_count ? "]" : "");
510 
511 	seq_putc(m, '\n');
512 
513 	return 0;
514 }
515 
516 static int parse_lane_count(const char __user *ubuf, size_t len)
517 {
518 	char *kbuf;
519 	const char *p;
520 	int lane_count;
521 	int ret = 0;
522 
523 	kbuf = memdup_user_nul(ubuf, len);
524 	if (IS_ERR(kbuf))
525 		return PTR_ERR(kbuf);
526 
527 	p = strim(kbuf);
528 
529 	if (!strcmp(p, "auto")) {
530 		lane_count = 0;
531 	} else {
532 		ret = kstrtoint(p, 0, &lane_count);
533 		if (ret < 0)
534 			goto out_free;
535 
536 		switch (lane_count) {
537 		case 1:
538 		case 2:
539 		case 4:
540 			break;
541 		default:
542 			ret = -EINVAL;
543 		}
544 	}
545 
546 out_free:
547 	kfree(kbuf);
548 
549 	return ret < 0 ? ret : lane_count;
550 }
551 
552 static ssize_t i915_dp_force_lane_count_write(struct file *file,
553 					      const char __user *ubuf,
554 					      size_t len, loff_t *offp)
555 {
556 	struct seq_file *m = file->private_data;
557 	struct intel_connector *connector = to_intel_connector(m->private);
558 	struct intel_display *display = to_intel_display(connector);
559 	struct intel_dp *intel_dp = intel_attached_dp(connector);
560 	struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
561 	int lane_count;
562 	int err;
563 
564 	lane_count = parse_lane_count(ubuf, len);
565 	if (lane_count < 0)
566 		return lane_count;
567 
568 	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
569 	if (err)
570 		return err;
571 
572 	intel_dp_flush_connector_commits(connector);
573 
574 	intel_dp_reset_link_params(intel_dp);
575 	link_caps->forced_params.lane_count = lane_count;
576 
577 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
578 
579 	*offp += len;
580 
581 	return len;
582 }
583 DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_lane_count);
584 
585 static int i915_dp_max_link_rate_show(void *data, u64 *val)
586 {
587 	struct intel_connector *connector = to_intel_connector(data);
588 	struct intel_display *display = to_intel_display(connector);
589 	struct intel_dp *intel_dp = intel_attached_dp(connector);
590 	struct intel_dp_link_config max_link_limits;
591 	int err;
592 
593 	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
594 	if (err)
595 		return err;
596 
597 	intel_dp_flush_connector_commits(connector);
598 
599 	intel_dp_link_caps_get_max_limits(intel_dp->link.caps, &max_link_limits);
600 	*val = max_link_limits.rate;
601 
602 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
603 
604 	return 0;
605 }
606 DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_link_rate_fops, i915_dp_max_link_rate_show, NULL, "%llu\n");
607 
608 static int i915_dp_max_lane_count_show(void *data, u64 *val)
609 {
610 	struct intel_connector *connector = to_intel_connector(data);
611 	struct intel_display *display = to_intel_display(connector);
612 	struct intel_dp *intel_dp = intel_attached_dp(connector);
613 	struct intel_dp_link_config max_link_limits;
614 	int err;
615 
616 	err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
617 	if (err)
618 		return err;
619 
620 	intel_dp_flush_connector_commits(connector);
621 
622 	intel_dp_link_caps_get_max_limits(intel_dp->link.caps, &max_link_limits);
623 	*val = max_link_limits.lane_count;
624 
625 	drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
626 
627 	return 0;
628 }
629 DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_lane_count_fops, i915_dp_max_lane_count_show, NULL, "%llu\n");
630 
631 
632 /**
633  * intel_dp_link_caps_debugfs_add - add link caps debugfs files for a connector
634  * @connector: connector to add the debugfs files for
635  *
636  * Add the link-capability debugfs files for a DP @connector.
637  */
638 void intel_dp_link_caps_debugfs_add(struct intel_connector *connector)
639 {
640 	struct dentry *root = connector->base.debugfs_entry;
641 
642 	if (connector->base.connector_type != DRM_MODE_CONNECTOR_DisplayPort &&
643 	    connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
644 		return;
645 
646 	debugfs_create_file("i915_dp_force_link_rate", 0644, root,
647 			    connector, &i915_dp_force_link_rate_fops);
648 
649 	debugfs_create_file("i915_dp_force_lane_count", 0644, root,
650 			    connector, &i915_dp_force_lane_count_fops);
651 
652 	debugfs_create_file("i915_dp_max_link_rate", 0444, root,
653 			    connector, &i915_dp_max_link_rate_fops);
654 
655 	debugfs_create_file("i915_dp_max_lane_count", 0444, root,
656 			    connector, &i915_dp_max_lane_count_fops);
657 }
658 
659 struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
660 {
661 	struct intel_dp_link_caps *link_caps;
662 
663 	link_caps = kzalloc_obj(*link_caps);
664 	if (!link_caps)
665 		return NULL;
666 
667 	link_caps->dp = intel_dp;
668 
669 	return link_caps;
670 }
671 
672 void intel_dp_link_caps_cleanup(struct intel_dp_link_caps *link_caps)
673 {
674 	kfree(link_caps);
675 }
676