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