1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright 2018 Noralf Trønnes 4 * Copyright (c) 2006-2009 Red Hat Inc. 5 * Copyright (c) 2006-2008 Intel Corporation 6 * Jesse Barnes <jesse.barnes@intel.com> 7 * Copyright (c) 2007 Dave Airlie <airlied@linux.ie> 8 */ 9 10 #include "drm/drm_modeset_lock.h" 11 12 #include <linux/export.h> 13 #include <linux/module.h> 14 #include <linux/mutex.h> 15 #include <linux/slab.h> 16 #include <linux/string_helpers.h> 17 18 #include <drm/drm_atomic.h> 19 #include <drm/drm_client.h> 20 #include <drm/drm_connector.h> 21 #include <drm/drm_crtc.h> 22 #include <drm/drm_device.h> 23 #include <drm/drm_drv.h> 24 #include <drm/drm_edid.h> 25 #include <drm/drm_encoder.h> 26 #include <drm/drm_print.h> 27 28 #include "drm_crtc_internal.h" 29 #include "drm_internal.h" 30 31 #define DRM_CLIENT_MAX_CLONED_CONNECTORS 8 32 33 struct drm_client_offset { 34 int x, y; 35 }; 36 37 int drm_client_modeset_create(struct drm_client_dev *client) 38 { 39 struct drm_device *dev = client->dev; 40 unsigned int num_crtc = dev->mode_config.num_crtc; 41 unsigned int max_connector_count = 1; 42 struct drm_mode_set *modeset; 43 struct drm_crtc *crtc; 44 int i = 0; 45 46 /* Add terminating zero entry to enable index less iteration */ 47 client->modesets = kzalloc_objs(*client->modesets, num_crtc + 1, 48 GFP_KERNEL); 49 if (!client->modesets) 50 return -ENOMEM; 51 52 mutex_init(&client->modeset_mutex); 53 54 drm_for_each_crtc(crtc, dev) 55 client->modesets[i++].crtc = crtc; 56 57 /* Cloning is only supported in the single crtc case. */ 58 if (num_crtc == 1) 59 max_connector_count = DRM_CLIENT_MAX_CLONED_CONNECTORS; 60 61 for (modeset = client->modesets; modeset->crtc; modeset++) { 62 modeset->connectors = kzalloc_objs(*modeset->connectors, 63 max_connector_count, 64 GFP_KERNEL); 65 if (!modeset->connectors) 66 goto err_free; 67 } 68 69 return 0; 70 71 err_free: 72 drm_client_modeset_free(client); 73 74 return -ENOMEM; 75 } 76 77 static void drm_client_modeset_release(struct drm_client_dev *client) 78 { 79 struct drm_mode_set *modeset; 80 81 drm_client_for_each_modeset(modeset, client) { 82 int i; 83 84 drm_mode_destroy(client->dev, modeset->mode); 85 modeset->mode = NULL; 86 modeset->fb = NULL; 87 88 for (i = 0; i < modeset->num_connectors; i++) { 89 drm_connector_put(modeset->connectors[i]); 90 modeset->connectors[i] = NULL; 91 } 92 modeset->num_connectors = 0; 93 } 94 } 95 96 void drm_client_modeset_free(struct drm_client_dev *client) 97 { 98 struct drm_mode_set *modeset; 99 100 mutex_lock(&client->modeset_mutex); 101 102 drm_client_modeset_release(client); 103 104 drm_client_for_each_modeset(modeset, client) 105 kfree(modeset->connectors); 106 107 mutex_unlock(&client->modeset_mutex); 108 109 mutex_destroy(&client->modeset_mutex); 110 kfree(client->modesets); 111 } 112 113 static struct drm_mode_set * 114 drm_client_find_modeset(struct drm_client_dev *client, struct drm_crtc *crtc) 115 { 116 struct drm_mode_set *modeset; 117 118 drm_client_for_each_modeset(modeset, client) 119 if (modeset->crtc == crtc) 120 return modeset; 121 122 return NULL; 123 } 124 125 static const struct drm_display_mode * 126 drm_connector_get_tiled_mode(struct drm_connector *connector) 127 { 128 const struct drm_display_mode *mode; 129 130 list_for_each_entry(mode, &connector->modes, head) { 131 if (mode->hdisplay == connector->tile_h_size && 132 mode->vdisplay == connector->tile_v_size) 133 return mode; 134 } 135 return NULL; 136 } 137 138 static const struct drm_display_mode * 139 drm_connector_fallback_non_tiled_mode(struct drm_connector *connector) 140 { 141 const struct drm_display_mode *mode; 142 143 list_for_each_entry(mode, &connector->modes, head) { 144 if (mode->hdisplay == connector->tile_h_size && 145 mode->vdisplay == connector->tile_v_size) 146 continue; 147 return mode; 148 } 149 return NULL; 150 } 151 152 static const struct drm_display_mode * 153 drm_connector_preferred_mode(struct drm_connector *connector, int width, int height) 154 { 155 const struct drm_display_mode *mode; 156 157 list_for_each_entry(mode, &connector->modes, head) { 158 if (mode->hdisplay > width || 159 mode->vdisplay > height) 160 continue; 161 if (mode->type & DRM_MODE_TYPE_PREFERRED) 162 return mode; 163 } 164 return NULL; 165 } 166 167 static const struct drm_display_mode * 168 drm_connector_first_mode(struct drm_connector *connector) 169 { 170 return list_first_entry_or_null(&connector->modes, 171 struct drm_display_mode, head); 172 } 173 174 static const struct drm_display_mode * 175 drm_connector_pick_cmdline_mode(struct drm_connector *connector) 176 { 177 const struct drm_cmdline_mode *cmdline_mode; 178 const struct drm_display_mode *mode; 179 bool prefer_non_interlace; 180 181 /* 182 * Find a user-defined mode. If the user gave us a valid 183 * mode on the kernel command line, it will show up in this 184 * list. 185 */ 186 187 list_for_each_entry(mode, &connector->modes, head) { 188 if (mode->type & DRM_MODE_TYPE_USERDEF) 189 return mode; 190 } 191 192 cmdline_mode = &connector->cmdline_mode; 193 if (cmdline_mode->specified == false) 194 return NULL; 195 196 /* 197 * Attempt to find a matching mode in the list of modes we 198 * have gotten so far. 199 */ 200 201 prefer_non_interlace = !cmdline_mode->interlace; 202 again: 203 list_for_each_entry(mode, &connector->modes, head) { 204 /* check width/height */ 205 if (mode->hdisplay != cmdline_mode->xres || 206 mode->vdisplay != cmdline_mode->yres) 207 continue; 208 209 if (cmdline_mode->refresh_specified) { 210 if (drm_mode_vrefresh(mode) != cmdline_mode->refresh) 211 continue; 212 } 213 214 if (cmdline_mode->interlace) { 215 if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) 216 continue; 217 } else if (prefer_non_interlace) { 218 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 219 continue; 220 } 221 return mode; 222 } 223 224 if (prefer_non_interlace) { 225 prefer_non_interlace = false; 226 goto again; 227 } 228 229 return NULL; 230 } 231 232 static bool drm_connector_enabled(struct drm_connector *connector, bool strict) 233 { 234 bool enable; 235 236 if (connector->display_info.non_desktop) 237 return false; 238 239 if (strict) 240 enable = connector->status == connector_status_connected; 241 else 242 enable = connector->status != connector_status_disconnected; 243 244 return enable; 245 } 246 247 static void drm_client_connectors_enabled(struct drm_connector *connectors[], 248 unsigned int connector_count, 249 bool enabled[]) 250 { 251 bool any_enabled = false; 252 struct drm_connector *connector; 253 int i = 0; 254 255 for (i = 0; i < connector_count; i++) { 256 connector = connectors[i]; 257 enabled[i] = drm_connector_enabled(connector, true); 258 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] enabled? %s\n", 259 connector->base.id, connector->name, 260 connector->display_info.non_desktop ? 261 "non desktop" : str_yes_no(enabled[i])); 262 263 any_enabled |= enabled[i]; 264 } 265 266 if (any_enabled) 267 return; 268 269 for (i = 0; i < connector_count; i++) 270 enabled[i] = drm_connector_enabled(connectors[i], false); 271 } 272 273 static void mode_replace(struct drm_device *dev, 274 const struct drm_display_mode **dst, 275 const struct drm_display_mode *src) 276 { 277 drm_mode_destroy(dev, (struct drm_display_mode *)*dst); 278 279 *dst = src ? drm_mode_duplicate(dev, src) : NULL; 280 } 281 282 static void modes_destroy(struct drm_device *dev, 283 const struct drm_display_mode *modes[], 284 int count) 285 { 286 int i; 287 288 for (i = 0; i < count; i++) 289 mode_replace(dev, &modes[i], NULL); 290 } 291 292 static bool drm_client_target_cloned(struct drm_device *dev, 293 struct drm_connector *connectors[], 294 unsigned int connector_count, 295 const struct drm_display_mode *modes[], 296 struct drm_client_offset offsets[], 297 bool enabled[], int width, int height) 298 { 299 int count, i; 300 bool can_clone = false; 301 struct drm_display_mode *dmt_mode; 302 303 /* only contemplate cloning in the single crtc case */ 304 if (dev->mode_config.num_crtc > 1) 305 return false; 306 307 count = 0; 308 for (i = 0; i < connector_count; i++) { 309 if (enabled[i]) 310 count++; 311 } 312 313 /* only contemplate cloning if more than one connector is enabled */ 314 if (count <= 1) 315 return false; 316 317 /* check the command line or if nothing common pick 1024x768 */ 318 can_clone = true; 319 for (i = 0; i < connector_count; i++) { 320 int j; 321 322 if (!enabled[i]) 323 continue; 324 325 mode_replace(dev, &modes[i], 326 drm_connector_pick_cmdline_mode(connectors[i])); 327 if (!modes[i]) { 328 can_clone = false; 329 break; 330 } 331 for (j = 0; j < i; j++) { 332 if (!enabled[j]) 333 continue; 334 if (!drm_mode_match(modes[j], modes[i], 335 DRM_MODE_MATCH_TIMINGS | 336 DRM_MODE_MATCH_CLOCK | 337 DRM_MODE_MATCH_FLAGS | 338 DRM_MODE_MATCH_3D_FLAGS)) 339 can_clone = false; 340 } 341 } 342 343 if (can_clone) { 344 drm_dbg_kms(dev, "can clone using command line\n"); 345 return true; 346 } 347 348 /* try and find a 1024x768 mode on each connector */ 349 can_clone = true; 350 dmt_mode = drm_mode_find_dmt(dev, 1024, 768, 60, false); 351 352 if (!dmt_mode) 353 goto fail; 354 355 for (i = 0; i < connector_count; i++) { 356 const struct drm_display_mode *mode; 357 358 if (!enabled[i]) 359 continue; 360 361 list_for_each_entry(mode, &connectors[i]->modes, head) { 362 if (drm_mode_match(mode, dmt_mode, 363 DRM_MODE_MATCH_TIMINGS | 364 DRM_MODE_MATCH_CLOCK | 365 DRM_MODE_MATCH_FLAGS | 366 DRM_MODE_MATCH_3D_FLAGS)) 367 mode_replace(dev, &modes[i], mode); 368 } 369 if (!modes[i]) 370 can_clone = false; 371 } 372 drm_mode_destroy(dev, dmt_mode); 373 374 if (can_clone) { 375 drm_dbg_kms(dev, "can clone using 1024x768\n"); 376 return true; 377 } 378 fail: 379 drm_info(dev, "kms: can't enable cloning when we probably wanted to.\n"); 380 return false; 381 } 382 383 static int drm_client_get_tile_offsets(struct drm_device *dev, 384 struct drm_connector *connectors[], 385 unsigned int connector_count, 386 const struct drm_display_mode *modes[], 387 struct drm_client_offset offsets[], 388 int idx, 389 int h_idx, int v_idx) 390 { 391 int i; 392 int hoffset = 0, voffset = 0; 393 394 for (i = 0; i < connector_count; i++) { 395 struct drm_connector *connector = connectors[i]; 396 397 if (!connector->has_tile) 398 continue; 399 400 if (!modes[i] && (h_idx || v_idx)) { 401 drm_dbg_kms(dev, 402 "[CONNECTOR:%d:%s] no modes for connector tiled %d\n", 403 connector->base.id, connector->name, i); 404 continue; 405 } 406 if (connector->tile_h_loc < h_idx) 407 hoffset += modes[i]->hdisplay; 408 409 if (connector->tile_v_loc < v_idx) 410 voffset += modes[i]->vdisplay; 411 } 412 offsets[idx].x = hoffset; 413 offsets[idx].y = voffset; 414 drm_dbg_kms(dev, "returned %d %d for %d %d\n", hoffset, voffset, h_idx, v_idx); 415 return 0; 416 } 417 418 static bool drm_client_target_preferred(struct drm_device *dev, 419 struct drm_connector *connectors[], 420 unsigned int connector_count, 421 const struct drm_display_mode *modes[], 422 struct drm_client_offset offsets[], 423 bool enabled[], int width, int height) 424 { 425 const u64 mask = BIT_ULL(connector_count) - 1; 426 u64 conn_configured = 0; 427 int tile_pass = 0; 428 int num_tiled_conns = 0; 429 int i; 430 431 for (i = 0; i < connector_count; i++) { 432 if (connectors[i]->has_tile && 433 connectors[i]->status == connector_status_connected) 434 num_tiled_conns++; 435 } 436 437 retry: 438 for (i = 0; i < connector_count; i++) { 439 struct drm_connector *connector = connectors[i]; 440 const char *mode_type; 441 442 443 if (conn_configured & BIT_ULL(i)) 444 continue; 445 446 if (enabled[i] == false) { 447 conn_configured |= BIT_ULL(i); 448 continue; 449 } 450 451 /* first pass over all the untiled connectors */ 452 if (tile_pass == 0 && connector->has_tile) 453 continue; 454 455 if (tile_pass == 1) { 456 if (connector->tile_h_loc != 0 || 457 connector->tile_v_loc != 0) 458 continue; 459 460 } else { 461 if (connector->tile_h_loc != tile_pass - 1 && 462 connector->tile_v_loc != tile_pass - 1) 463 /* if this tile_pass doesn't cover any of the tiles - keep going */ 464 continue; 465 466 /* 467 * find the tile offsets for this pass - need to find 468 * all tiles left and above 469 */ 470 drm_client_get_tile_offsets(dev, connectors, connector_count, 471 modes, offsets, i, 472 connector->tile_h_loc, connector->tile_v_loc); 473 } 474 475 mode_type = "cmdline"; 476 mode_replace(dev, &modes[i], 477 drm_connector_pick_cmdline_mode(connector)); 478 479 if (!modes[i]) { 480 mode_type = "preferred"; 481 mode_replace(dev, &modes[i], 482 drm_connector_preferred_mode(connector, width, height)); 483 } 484 485 if (!modes[i]) { 486 mode_type = "first"; 487 mode_replace(dev, &modes[i], 488 drm_connector_first_mode(connector)); 489 } 490 491 /* 492 * In case of tiled mode if all tiles not present fallback to 493 * first available non tiled mode. 494 * After all tiles are present, try to find the tiled mode 495 * for all and if tiled mode not present due to fbcon size 496 * limitations, use first non tiled mode only for 497 * tile 0,0 and set to no mode for all other tiles. 498 */ 499 if (connector->has_tile) { 500 if (num_tiled_conns < 501 connector->num_h_tile * connector->num_v_tile || 502 (connector->tile_h_loc == 0 && 503 connector->tile_v_loc == 0 && 504 !drm_connector_get_tiled_mode(connector))) { 505 mode_type = "non tiled"; 506 mode_replace(dev, &modes[i], 507 drm_connector_fallback_non_tiled_mode(connector)); 508 } else { 509 mode_type = "tiled"; 510 mode_replace(dev, &modes[i], 511 drm_connector_get_tiled_mode(connector)); 512 } 513 } 514 515 if (modes[i]) 516 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] found %s mode: %s\n", 517 connector->base.id, connector->name, 518 mode_type, modes[i]->name); 519 else 520 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] no mode found\n", 521 connector->base.id, connector->name); 522 523 conn_configured |= BIT_ULL(i); 524 } 525 526 if ((conn_configured & mask) != mask) { 527 tile_pass++; 528 goto retry; 529 } 530 return true; 531 } 532 533 static bool connector_has_possible_crtc(struct drm_connector *connector, 534 struct drm_crtc *crtc) 535 { 536 struct drm_encoder *encoder; 537 538 drm_connector_for_each_possible_encoder(connector, encoder) { 539 if (encoder->possible_crtcs & drm_crtc_mask(crtc)) 540 return true; 541 } 542 543 return false; 544 } 545 546 static int drm_client_pick_crtcs(struct drm_client_dev *client, 547 struct drm_connector *connectors[], 548 unsigned int connector_count, 549 struct drm_crtc *best_crtcs[], 550 const struct drm_display_mode *modes[], 551 int n, int width, int height) 552 { 553 struct drm_device *dev = client->dev; 554 struct drm_connector *connector; 555 int my_score, best_score, score; 556 struct drm_crtc **crtcs; 557 struct drm_mode_set *modeset; 558 559 if (n == connector_count) 560 return 0; 561 562 connector = connectors[n]; 563 564 best_crtcs[n] = NULL; 565 best_score = drm_client_pick_crtcs(client, connectors, connector_count, 566 best_crtcs, modes, n + 1, width, height); 567 if (modes[n] == NULL) 568 return best_score; 569 570 crtcs = kzalloc_objs(*crtcs, connector_count, GFP_KERNEL); 571 if (!crtcs) 572 return best_score; 573 574 my_score = 1; 575 if (connector->status == connector_status_connected) 576 my_score++; 577 if (connector->cmdline_mode.specified) 578 my_score++; 579 if (drm_connector_preferred_mode(connector, width, height)) 580 my_score++; 581 582 /* 583 * select a crtc for this connector and then attempt to configure 584 * remaining connectors 585 */ 586 drm_client_for_each_modeset(modeset, client) { 587 struct drm_crtc *crtc = modeset->crtc; 588 int o; 589 590 if (!connector_has_possible_crtc(connector, crtc)) 591 continue; 592 593 for (o = 0; o < n; o++) 594 if (best_crtcs[o] == crtc) 595 break; 596 597 if (o < n) { 598 /* ignore cloning unless only a single crtc */ 599 if (dev->mode_config.num_crtc > 1) 600 continue; 601 602 if (!drm_mode_equal(modes[o], modes[n])) 603 continue; 604 } 605 606 crtcs[n] = crtc; 607 memcpy(crtcs, best_crtcs, n * sizeof(*crtcs)); 608 score = my_score + drm_client_pick_crtcs(client, connectors, connector_count, 609 crtcs, modes, n + 1, width, height); 610 if (score > best_score) { 611 best_score = score; 612 memcpy(best_crtcs, crtcs, connector_count * sizeof(*crtcs)); 613 } 614 } 615 616 kfree(crtcs); 617 return best_score; 618 } 619 620 /* Try to read the BIOS display configuration and use it for the initial config */ 621 static bool drm_client_firmware_config(struct drm_client_dev *client, 622 struct drm_connector *connectors[], 623 unsigned int connector_count, 624 struct drm_crtc *crtcs[], 625 const struct drm_display_mode *modes[], 626 struct drm_client_offset offsets[], 627 bool enabled[], int width, int height) 628 { 629 const int count = min_t(unsigned int, connector_count, BITS_PER_LONG); 630 unsigned long conn_configured, conn_seq, mask; 631 struct drm_device *dev = client->dev; 632 int i; 633 bool *save_enabled; 634 bool fallback = true, ret = true; 635 int num_connectors_enabled = 0; 636 int num_connectors_detected = 0; 637 int num_tiled_conns = 0; 638 struct drm_modeset_acquire_ctx ctx; 639 640 if (!drm_drv_uses_atomic_modeset(dev)) 641 return false; 642 643 if (drm_WARN_ON(dev, count <= 0)) 644 return false; 645 646 save_enabled = kzalloc_objs(bool, count, GFP_KERNEL); 647 if (!save_enabled) 648 return false; 649 650 drm_modeset_acquire_init(&ctx, 0); 651 652 while (drm_modeset_lock_all_ctx(dev, &ctx) != 0) 653 drm_modeset_backoff(&ctx); 654 655 memcpy(save_enabled, enabled, count); 656 mask = GENMASK(count - 1, 0); 657 conn_configured = 0; 658 for (i = 0; i < count; i++) { 659 if (connectors[i]->has_tile && 660 connectors[i]->status == connector_status_connected) 661 num_tiled_conns++; 662 } 663 retry: 664 conn_seq = conn_configured; 665 for (i = 0; i < count; i++) { 666 struct drm_connector *connector = connectors[i]; 667 struct drm_encoder *encoder; 668 struct drm_crtc *crtc; 669 const char *mode_type; 670 int j; 671 672 if (conn_configured & BIT(i)) 673 continue; 674 675 if (conn_seq == 0 && !connector->has_tile) 676 continue; 677 678 if (connector->status == connector_status_connected) 679 num_connectors_detected++; 680 681 if (!enabled[i]) { 682 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] not enabled, skipping\n", 683 connector->base.id, connector->name); 684 conn_configured |= BIT(i); 685 continue; 686 } 687 688 if (connector->force == DRM_FORCE_OFF) { 689 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] disabled by user, skipping\n", 690 connector->base.id, connector->name); 691 enabled[i] = false; 692 continue; 693 } 694 695 encoder = connector->state->best_encoder; 696 if (!encoder || drm_WARN_ON(dev, !connector->state->crtc)) { 697 if (connector->force > DRM_FORCE_OFF) 698 goto bail; 699 700 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] has no encoder or crtc, skipping\n", 701 connector->base.id, connector->name); 702 enabled[i] = false; 703 conn_configured |= BIT(i); 704 continue; 705 } 706 707 num_connectors_enabled++; 708 709 crtc = connector->state->crtc; 710 711 /* 712 * Make sure we're not trying to drive multiple connectors 713 * with a single CRTC, since our cloning support may not 714 * match the BIOS. 715 */ 716 for (j = 0; j < count; j++) { 717 if (crtcs[j] == crtc) { 718 drm_dbg_kms(dev, "[CONNECTOR:%d:%s] fallback: cloned configuration\n", 719 connector->base.id, connector->name); 720 goto bail; 721 } 722 } 723 724 mode_type = "cmdline"; 725 mode_replace(dev, &modes[i], 726 drm_connector_pick_cmdline_mode(connector)); 727 728 if (!modes[i]) { 729 mode_type = "preferred"; 730 mode_replace(dev, &modes[i], 731 drm_connector_preferred_mode(connector, width, height)); 732 } 733 734 if (!modes[i]) { 735 mode_type = "first"; 736 mode_replace(dev, &modes[i], 737 drm_connector_first_mode(connector)); 738 } 739 740 /* last resort: use current mode */ 741 if (!modes[i]) { 742 mode_type = "current"; 743 mode_replace(dev, &modes[i], 744 &crtc->state->mode); 745 } 746 747 /* 748 * In case of tiled modes, if all tiles are not present 749 * then fallback to a non tiled mode. 750 */ 751 if (connector->has_tile && 752 num_tiled_conns < connector->num_h_tile * connector->num_v_tile) { 753 mode_type = "non tiled"; 754 mode_replace(dev, &modes[i], 755 drm_connector_fallback_non_tiled_mode(connector)); 756 } 757 crtcs[i] = crtc; 758 759 drm_dbg_kms(dev, "[CONNECTOR::%d:%s] on [CRTC:%d:%s] using %s mode: %s\n", 760 connector->base.id, connector->name, 761 crtc->base.id, crtc->name, 762 mode_type, modes[i]->name); 763 764 fallback = false; 765 conn_configured |= BIT(i); 766 } 767 768 if ((conn_configured & mask) != mask && conn_configured != conn_seq) 769 goto retry; 770 771 for (i = 0; i < count; i++) { 772 struct drm_connector *connector = connectors[i]; 773 774 if (connector->has_tile) 775 drm_client_get_tile_offsets(dev, connectors, connector_count, 776 modes, offsets, i, 777 connector->tile_h_loc, connector->tile_v_loc); 778 } 779 780 /* 781 * If the BIOS didn't enable everything it could, fall back to have the 782 * same user experiencing of lighting up as much as possible like the 783 * fbdev helper library. 784 */ 785 if (num_connectors_enabled != num_connectors_detected && 786 num_connectors_enabled < dev->mode_config.num_crtc) { 787 drm_dbg_kms(dev, "fallback: Not all outputs enabled\n"); 788 drm_dbg_kms(dev, "Enabled: %i, detected: %i\n", 789 num_connectors_enabled, num_connectors_detected); 790 fallback = true; 791 } 792 793 if (fallback) { 794 bail: 795 drm_dbg_kms(dev, "Not using firmware configuration\n"); 796 memcpy(enabled, save_enabled, count); 797 ret = false; 798 } 799 800 drm_modeset_drop_locks(&ctx); 801 drm_modeset_acquire_fini(&ctx); 802 803 kfree(save_enabled); 804 return ret; 805 } 806 807 /** 808 * drm_client_modeset_probe() - Probe for displays 809 * @client: DRM client 810 * @width: Maximum display mode width (optional) 811 * @height: Maximum display mode height (optional) 812 * 813 * This function sets up display pipelines for enabled connectors and stores the 814 * config in the client's modeset array. 815 * 816 * Returns: 817 * Zero on success or negative error code on failure. 818 */ 819 int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, unsigned int height) 820 { 821 struct drm_connector *connector, **connectors = NULL; 822 struct drm_connector_list_iter conn_iter; 823 struct drm_device *dev = client->dev; 824 unsigned int total_modes_count = 0; 825 struct drm_client_offset *offsets; 826 unsigned int connector_count = 0; 827 const struct drm_display_mode **modes; 828 struct drm_crtc **crtcs; 829 int i, ret = 0; 830 bool *enabled; 831 832 drm_dbg_kms(dev, "\n"); 833 834 if (!width) 835 width = dev->mode_config.max_width; 836 if (!height) 837 height = dev->mode_config.max_height; 838 839 drm_connector_list_iter_begin(dev, &conn_iter); 840 drm_client_for_each_connector_iter(connector, &conn_iter) { 841 struct drm_connector **tmp; 842 843 tmp = krealloc(connectors, (connector_count + 1) * sizeof(*connectors), GFP_KERNEL); 844 if (!tmp) { 845 ret = -ENOMEM; 846 goto free_connectors; 847 } 848 849 connectors = tmp; 850 drm_connector_get(connector); 851 connectors[connector_count++] = connector; 852 } 853 drm_connector_list_iter_end(&conn_iter); 854 855 if (!connector_count) 856 return 0; 857 858 crtcs = kzalloc_objs(*crtcs, connector_count, GFP_KERNEL); 859 modes = kzalloc_objs(*modes, connector_count, GFP_KERNEL); 860 offsets = kzalloc_objs(*offsets, connector_count, GFP_KERNEL); 861 enabled = kzalloc_objs(bool, connector_count, GFP_KERNEL); 862 if (!crtcs || !modes || !enabled || !offsets) { 863 ret = -ENOMEM; 864 goto out; 865 } 866 867 mutex_lock(&client->modeset_mutex); 868 869 mutex_lock(&dev->mode_config.mutex); 870 for (i = 0; i < connector_count; i++) 871 total_modes_count += connectors[i]->funcs->fill_modes(connectors[i], width, height); 872 if (!total_modes_count) 873 drm_dbg_kms(dev, "No connectors reported connected with modes\n"); 874 drm_client_connectors_enabled(connectors, connector_count, enabled); 875 876 if (!drm_client_firmware_config(client, connectors, connector_count, crtcs, 877 modes, offsets, enabled, width, height)) { 878 modes_destroy(dev, modes, connector_count); 879 memset(crtcs, 0, connector_count * sizeof(*crtcs)); 880 memset(offsets, 0, connector_count * sizeof(*offsets)); 881 882 if (!drm_client_target_cloned(dev, connectors, connector_count, modes, 883 offsets, enabled, width, height) && 884 !drm_client_target_preferred(dev, connectors, connector_count, modes, 885 offsets, enabled, width, height)) 886 drm_err(dev, "Unable to find initial modes\n"); 887 888 drm_dbg_kms(dev, "picking CRTCs for %dx%d config\n", 889 width, height); 890 891 drm_client_pick_crtcs(client, connectors, connector_count, 892 crtcs, modes, 0, width, height); 893 } 894 895 mutex_unlock(&dev->mode_config.mutex); 896 897 drm_client_modeset_release(client); 898 899 for (i = 0; i < connector_count; i++) { 900 const struct drm_display_mode *mode = modes[i]; 901 struct drm_crtc *crtc = crtcs[i]; 902 struct drm_client_offset *offset = &offsets[i]; 903 904 if (mode && crtc) { 905 struct drm_mode_set *modeset = drm_client_find_modeset(client, crtc); 906 struct drm_connector *connector = connectors[i]; 907 908 drm_dbg_kms(dev, "[CRTC:%d:%s] desired mode %s set (%d,%d)\n", 909 crtc->base.id, crtc->name, 910 mode->name, offset->x, offset->y); 911 912 if (drm_WARN_ON_ONCE(dev, modeset->num_connectors == DRM_CLIENT_MAX_CLONED_CONNECTORS || 913 (dev->mode_config.num_crtc > 1 && modeset->num_connectors == 1))) { 914 ret = -EINVAL; 915 break; 916 } 917 918 drm_mode_destroy(dev, modeset->mode); 919 modeset->mode = drm_mode_duplicate(dev, mode); 920 if (!modeset->mode) { 921 ret = -ENOMEM; 922 break; 923 } 924 925 drm_connector_get(connector); 926 modeset->connectors[modeset->num_connectors++] = connector; 927 modeset->x = offset->x; 928 modeset->y = offset->y; 929 } 930 } 931 932 mutex_unlock(&client->modeset_mutex); 933 out: 934 kfree(crtcs); 935 modes_destroy(dev, modes, connector_count); 936 kfree(modes); 937 kfree(offsets); 938 kfree(enabled); 939 free_connectors: 940 for (i = 0; i < connector_count; i++) 941 drm_connector_put(connectors[i]); 942 kfree(connectors); 943 944 return ret; 945 } 946 EXPORT_SYMBOL(drm_client_modeset_probe); 947 948 /** 949 * drm_client_rotation() - Check the initial rotation value 950 * @modeset: DRM modeset 951 * @rotation: Returned rotation value 952 * 953 * This function checks if the primary plane in @modeset can hw rotate 954 * to match the rotation needed on its connector. 955 * 956 * Note: Currently only 0 and 180 degrees are supported. 957 * 958 * Return: 959 * True if the plane can do the rotation, false otherwise. 960 */ 961 bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation) 962 { 963 struct drm_connector *connector = modeset->connectors[0]; 964 struct drm_plane *plane = modeset->crtc->primary; 965 struct drm_cmdline_mode *cmdline; 966 u64 valid_mask = 0; 967 int i; 968 969 if (!modeset->num_connectors) 970 return false; 971 972 switch (connector->display_info.panel_orientation) { 973 case DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP: 974 *rotation = DRM_MODE_ROTATE_180; 975 break; 976 case DRM_MODE_PANEL_ORIENTATION_LEFT_UP: 977 *rotation = DRM_MODE_ROTATE_90; 978 break; 979 case DRM_MODE_PANEL_ORIENTATION_RIGHT_UP: 980 *rotation = DRM_MODE_ROTATE_270; 981 break; 982 default: 983 *rotation = DRM_MODE_ROTATE_0; 984 } 985 986 /** 987 * The panel already defined the default rotation 988 * through its orientation. Whatever has been provided 989 * on the command line needs to be added to that. 990 * 991 * Unfortunately, the rotations are at different bit 992 * indices, so the math to add them up are not as 993 * trivial as they could. 994 * 995 * Reflections on the other hand are pretty trivial to deal with, a 996 * simple XOR between the two handle the addition nicely. 997 */ 998 cmdline = &connector->cmdline_mode; 999 if (cmdline->specified && cmdline->rotation_reflection) { 1000 unsigned int cmdline_rest, panel_rest; 1001 unsigned int cmdline_rot, panel_rot; 1002 unsigned int sum_rot, sum_rest; 1003 1004 panel_rot = ilog2(*rotation & DRM_MODE_ROTATE_MASK); 1005 cmdline_rot = ilog2(cmdline->rotation_reflection & DRM_MODE_ROTATE_MASK); 1006 sum_rot = (panel_rot + cmdline_rot) % 4; 1007 1008 panel_rest = *rotation & ~DRM_MODE_ROTATE_MASK; 1009 cmdline_rest = cmdline->rotation_reflection & ~DRM_MODE_ROTATE_MASK; 1010 sum_rest = panel_rest ^ cmdline_rest; 1011 1012 *rotation = (1 << sum_rot) | sum_rest; 1013 } 1014 1015 /* 1016 * TODO: support 90 / 270 degree hardware rotation, 1017 * depending on the hardware this may require the framebuffer 1018 * to be in a specific tiling format. 1019 */ 1020 if (((*rotation & DRM_MODE_ROTATE_MASK) != DRM_MODE_ROTATE_0 && 1021 (*rotation & DRM_MODE_ROTATE_MASK) != DRM_MODE_ROTATE_180) || 1022 !plane->rotation_property) 1023 return false; 1024 1025 for (i = 0; i < plane->rotation_property->num_values; i++) 1026 valid_mask |= (1ULL << plane->rotation_property->values[i]); 1027 1028 if (!(*rotation & valid_mask)) 1029 return false; 1030 1031 return true; 1032 } 1033 EXPORT_SYMBOL(drm_client_rotation); 1034 1035 static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool active, bool check) 1036 { 1037 struct drm_device *dev = client->dev; 1038 struct drm_plane *plane; 1039 struct drm_atomic_state *state; 1040 struct drm_modeset_acquire_ctx ctx; 1041 struct drm_mode_set *mode_set; 1042 int ret; 1043 1044 drm_modeset_acquire_init(&ctx, 0); 1045 1046 state = drm_atomic_state_alloc(dev); 1047 if (!state) { 1048 ret = -ENOMEM; 1049 goto out_ctx; 1050 } 1051 1052 state->acquire_ctx = &ctx; 1053 retry: 1054 drm_for_each_plane(plane, dev) { 1055 struct drm_plane_state *plane_state; 1056 1057 plane_state = drm_atomic_get_plane_state(state, plane); 1058 if (IS_ERR(plane_state)) { 1059 ret = PTR_ERR(plane_state); 1060 goto out_state; 1061 } 1062 1063 plane_state->rotation = DRM_MODE_ROTATE_0; 1064 1065 /* disable non-primary: */ 1066 if (plane->type == DRM_PLANE_TYPE_PRIMARY) 1067 continue; 1068 1069 ret = __drm_atomic_helper_disable_plane(plane, plane_state); 1070 if (ret != 0) 1071 goto out_state; 1072 } 1073 1074 drm_client_for_each_modeset(mode_set, client) { 1075 struct drm_plane *primary = mode_set->crtc->primary; 1076 unsigned int rotation; 1077 1078 if (drm_client_rotation(mode_set, &rotation)) { 1079 struct drm_plane_state *plane_state; 1080 1081 /* Cannot fail as we've already gotten the plane state above */ 1082 plane_state = drm_atomic_get_new_plane_state(state, primary); 1083 plane_state->rotation = rotation; 1084 } 1085 1086 ret = __drm_atomic_helper_set_config(mode_set, state); 1087 if (ret != 0) 1088 goto out_state; 1089 1090 /* 1091 * __drm_atomic_helper_set_config() sets active when a 1092 * mode is set, unconditionally clear it if we force DPMS off 1093 */ 1094 if (!active) { 1095 struct drm_crtc *crtc = mode_set->crtc; 1096 struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc); 1097 1098 crtc_state->active = false; 1099 } 1100 } 1101 1102 if (check) 1103 ret = drm_atomic_check_only(state); 1104 else 1105 ret = drm_atomic_commit(state); 1106 1107 out_state: 1108 if (ret == -EDEADLK) 1109 goto backoff; 1110 1111 drm_atomic_state_put(state); 1112 out_ctx: 1113 drm_modeset_drop_locks(&ctx); 1114 drm_modeset_acquire_fini(&ctx); 1115 1116 return ret; 1117 1118 backoff: 1119 drm_atomic_state_clear(state); 1120 drm_modeset_backoff(&ctx); 1121 1122 goto retry; 1123 } 1124 1125 static int drm_client_modeset_commit_legacy(struct drm_client_dev *client) 1126 { 1127 struct drm_device *dev = client->dev; 1128 struct drm_mode_set *mode_set; 1129 struct drm_plane *plane; 1130 int ret = 0; 1131 1132 drm_modeset_lock_all(dev); 1133 drm_for_each_plane(plane, dev) { 1134 if (plane->type != DRM_PLANE_TYPE_PRIMARY) 1135 drm_plane_force_disable(plane); 1136 1137 if (plane->rotation_property) 1138 drm_mode_plane_set_obj_prop(plane, 1139 plane->rotation_property, 1140 DRM_MODE_ROTATE_0); 1141 } 1142 1143 drm_client_for_each_modeset(mode_set, client) { 1144 struct drm_crtc *crtc = mode_set->crtc; 1145 1146 if (crtc->funcs->cursor_set2) { 1147 ret = crtc->funcs->cursor_set2(crtc, NULL, 0, 0, 0, 0, 0); 1148 if (ret) 1149 goto out; 1150 } else if (crtc->funcs->cursor_set) { 1151 ret = crtc->funcs->cursor_set(crtc, NULL, 0, 0, 0); 1152 if (ret) 1153 goto out; 1154 } 1155 1156 ret = drm_mode_set_config_internal(mode_set); 1157 if (ret) 1158 goto out; 1159 } 1160 out: 1161 drm_modeset_unlock_all(dev); 1162 1163 return ret; 1164 } 1165 1166 /** 1167 * drm_client_modeset_check() - Check modeset configuration 1168 * @client: DRM client 1169 * 1170 * Check modeset configuration. 1171 * 1172 * Returns: 1173 * Zero on success or negative error code on failure. 1174 */ 1175 int drm_client_modeset_check(struct drm_client_dev *client) 1176 { 1177 int ret; 1178 1179 if (!drm_drv_uses_atomic_modeset(client->dev)) 1180 return 0; 1181 1182 mutex_lock(&client->modeset_mutex); 1183 ret = drm_client_modeset_commit_atomic(client, true, true); 1184 mutex_unlock(&client->modeset_mutex); 1185 1186 return ret; 1187 } 1188 EXPORT_SYMBOL(drm_client_modeset_check); 1189 1190 /** 1191 * drm_client_modeset_commit_locked() - Force commit CRTC configuration 1192 * @client: DRM client 1193 * 1194 * Commit modeset configuration to crtcs without checking if there is a DRM 1195 * master. The assumption is that the caller already holds an internal DRM 1196 * master reference acquired with drm_master_internal_acquire(). 1197 * 1198 * Returns: 1199 * Zero on success or negative error code on failure. 1200 */ 1201 int drm_client_modeset_commit_locked(struct drm_client_dev *client) 1202 { 1203 struct drm_device *dev = client->dev; 1204 int ret; 1205 1206 mutex_lock(&client->modeset_mutex); 1207 if (drm_drv_uses_atomic_modeset(dev)) 1208 ret = drm_client_modeset_commit_atomic(client, true, false); 1209 else 1210 ret = drm_client_modeset_commit_legacy(client); 1211 mutex_unlock(&client->modeset_mutex); 1212 1213 return ret; 1214 } 1215 EXPORT_SYMBOL(drm_client_modeset_commit_locked); 1216 1217 /** 1218 * drm_client_modeset_commit() - Commit CRTC configuration 1219 * @client: DRM client 1220 * 1221 * Commit modeset configuration to crtcs. 1222 * 1223 * Returns: 1224 * Zero on success or negative error code on failure. 1225 */ 1226 int drm_client_modeset_commit(struct drm_client_dev *client) 1227 { 1228 struct drm_device *dev = client->dev; 1229 int ret; 1230 1231 if (!drm_master_internal_acquire(dev)) 1232 return -EBUSY; 1233 1234 ret = drm_client_modeset_commit_locked(client); 1235 1236 drm_master_internal_release(dev); 1237 1238 return ret; 1239 } 1240 EXPORT_SYMBOL(drm_client_modeset_commit); 1241 1242 static void drm_client_modeset_dpms_legacy(struct drm_client_dev *client, int dpms_mode) 1243 { 1244 struct drm_device *dev = client->dev; 1245 struct drm_connector *connector; 1246 struct drm_mode_set *modeset; 1247 struct drm_modeset_acquire_ctx ctx; 1248 int ret; 1249 1250 DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, 0, ret); 1251 drm_client_for_each_modeset(modeset, client) { 1252 int j; 1253 1254 if (!modeset->crtc->enabled) 1255 continue; 1256 1257 for (j = 0; j < modeset->num_connectors; j++) { 1258 connector = modeset->connectors[j]; 1259 connector->funcs->dpms(connector, dpms_mode); 1260 drm_object_property_set_value(&connector->base, 1261 dev->mode_config.dpms_property, dpms_mode); 1262 } 1263 } 1264 DRM_MODESET_LOCK_ALL_END(dev, ctx, ret); 1265 } 1266 1267 /** 1268 * drm_client_modeset_dpms() - Set DPMS mode 1269 * @client: DRM client 1270 * @mode: DPMS mode 1271 * 1272 * Note: For atomic drivers @mode is reduced to on/off. 1273 * 1274 * Returns: 1275 * Zero on success or negative error code on failure. 1276 */ 1277 int drm_client_modeset_dpms(struct drm_client_dev *client, int mode) 1278 { 1279 struct drm_device *dev = client->dev; 1280 int ret = 0; 1281 1282 if (!drm_master_internal_acquire(dev)) 1283 return -EBUSY; 1284 1285 mutex_lock(&client->modeset_mutex); 1286 if (drm_drv_uses_atomic_modeset(dev)) 1287 ret = drm_client_modeset_commit_atomic(client, mode == DRM_MODE_DPMS_ON, false); 1288 else 1289 drm_client_modeset_dpms_legacy(client, mode); 1290 mutex_unlock(&client->modeset_mutex); 1291 1292 drm_master_internal_release(dev); 1293 1294 return ret; 1295 } 1296 EXPORT_SYMBOL(drm_client_modeset_dpms); 1297 1298 /** 1299 * drm_client_modeset_wait_for_vblank() - Wait for the next VBLANK to occur 1300 * @client: DRM client 1301 * @crtc_index: The ndex of the CRTC to wait on 1302 * 1303 * Block the caller until the given CRTC has seen a VBLANK. Do nothing 1304 * if the CRTC is disabled. If there's another DRM master present, fail 1305 * with -EBUSY. 1306 * 1307 * Returns: 1308 * 0 on success, or negative error code otherwise. 1309 */ 1310 int drm_client_modeset_wait_for_vblank(struct drm_client_dev *client, unsigned int crtc_index) 1311 { 1312 struct drm_device *dev = client->dev; 1313 struct drm_crtc *crtc; 1314 int ret; 1315 1316 /* 1317 * Rate-limit update frequency to vblank. If there's a DRM master 1318 * present, it could interfere while we're waiting for the vblank 1319 * event. Don't wait in this case. 1320 */ 1321 if (!drm_master_internal_acquire(dev)) 1322 return -EBUSY; 1323 1324 crtc = client->modesets[crtc_index].crtc; 1325 1326 /* 1327 * Only wait for a vblank event if the CRTC is enabled, otherwise 1328 * just don't do anything, not even report an error. 1329 */ 1330 ret = drm_crtc_vblank_get(crtc); 1331 if (!ret) { 1332 drm_crtc_wait_one_vblank(crtc); 1333 drm_crtc_vblank_put(crtc); 1334 } 1335 1336 drm_master_internal_release(dev); 1337 1338 return 0; 1339 } 1340 EXPORT_SYMBOL(drm_client_modeset_wait_for_vblank); 1341 1342 #ifdef CONFIG_DRM_KUNIT_TEST 1343 #include "tests/drm_client_modeset_test.c" 1344 #endif 1345