1 /* 2 * Copyright (c) 2006-2008 Intel Corporation 3 * Copyright (c) 2007 Dave Airlie <airlied@linux.ie> 4 * 5 * DRM core CRTC related functions 6 * 7 * Permission to use, copy, modify, distribute, and sell this software and its 8 * documentation for any purpose is hereby granted without fee, provided that 9 * the above copyright notice appear in all copies and that both that copyright 10 * notice and this permission notice appear in supporting documentation, and 11 * that the name of the copyright holders not be used in advertising or 12 * publicity pertaining to distribution of the software without specific, 13 * written prior permission. The copyright holders make no representations 14 * about the suitability of this software for any purpose. It is provided "as 15 * is" without express or implied warranty. 16 * 17 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 18 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 19 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 20 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 21 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 22 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 23 * OF THIS SOFTWARE. 24 * 25 * Authors: 26 * Keith Packard 27 * Eric Anholt <eric@anholt.net> 28 * Dave Airlie <airlied@linux.ie> 29 * Jesse Barnes <jesse.barnes@intel.com> 30 */ 31 32 #include "drmP.h" 33 #include "drm_crtc.h" 34 #include "drm_crtc_helper.h" 35 36 /* 37 * Detailed mode info for 800x600@60Hz 38 */ 39 static struct drm_display_mode std_modes[] = { 40 { DRM_MODE("800x600", DRM_MODE_TYPE_DEFAULT, 40000, 800, 840, 41 968, 1056, 0, 600, 601, 605, 628, 0, 42 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 43 }; 44 45 /** 46 * drm_helper_probe_connector_modes - get complete set of display modes 47 * @dev: DRM device 48 * @maxX: max width for modes 49 * @maxY: max height for modes 50 * 51 * LOCKING: 52 * Caller must hold mode config lock. 53 * 54 * Based on @dev's mode_config layout, scan all the connectors and try to detect 55 * modes on them. Modes will first be added to the connector's probed_modes 56 * list, then culled (based on validity and the @maxX, @maxY parameters) and 57 * put into the normal modes list. 58 * 59 * Intended to be used either at bootup time or when major configuration 60 * changes have occurred. 61 * 62 * FIXME: take into account monitor limits 63 * 64 * RETURNS: 65 * Number of modes found on @connector. 66 */ 67 int drm_helper_probe_single_connector_modes(struct drm_connector *connector, 68 uint32_t maxX, uint32_t maxY) 69 { 70 struct drm_device *dev = connector->dev; 71 struct drm_display_mode *mode, *t; 72 struct drm_connector_helper_funcs *connector_funcs = 73 connector->helper_private; 74 int count = 0; 75 76 DRM_DEBUG("%s\n", drm_get_connector_name(connector)); 77 /* set all modes to the unverified state */ 78 list_for_each_entry_safe(mode, t, &connector->modes, head) 79 mode->status = MODE_UNVERIFIED; 80 81 connector->status = connector->funcs->detect(connector); 82 83 if (connector->status == connector_status_disconnected) { 84 DRM_DEBUG("%s is disconnected\n", 85 drm_get_connector_name(connector)); 86 /* TODO set EDID to NULL */ 87 return 0; 88 } 89 90 count = (*connector_funcs->get_modes)(connector); 91 if (!count) 92 return 0; 93 94 drm_mode_connector_list_update(connector); 95 96 if (maxX && maxY) 97 drm_mode_validate_size(dev, &connector->modes, maxX, 98 maxY, 0); 99 list_for_each_entry_safe(mode, t, &connector->modes, head) { 100 if (mode->status == MODE_OK) 101 mode->status = connector_funcs->mode_valid(connector, 102 mode); 103 } 104 105 106 drm_mode_prune_invalid(dev, &connector->modes, true); 107 108 if (list_empty(&connector->modes)) 109 return 0; 110 111 drm_mode_sort(&connector->modes); 112 113 DRM_DEBUG("Probed modes for %s\n", drm_get_connector_name(connector)); 114 list_for_each_entry_safe(mode, t, &connector->modes, head) { 115 mode->vrefresh = drm_mode_vrefresh(mode); 116 117 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); 118 drm_mode_debug_printmodeline(mode); 119 } 120 121 return count; 122 } 123 EXPORT_SYMBOL(drm_helper_probe_single_connector_modes); 124 125 int drm_helper_probe_connector_modes(struct drm_device *dev, uint32_t maxX, 126 uint32_t maxY) 127 { 128 struct drm_connector *connector; 129 int count = 0; 130 131 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 132 count += drm_helper_probe_single_connector_modes(connector, 133 maxX, maxY); 134 } 135 136 return count; 137 } 138 EXPORT_SYMBOL(drm_helper_probe_connector_modes); 139 140 static void drm_helper_add_std_modes(struct drm_device *dev, 141 struct drm_connector *connector) 142 { 143 struct drm_display_mode *mode, *t; 144 int i; 145 146 for (i = 0; i < ARRAY_SIZE(std_modes); i++) { 147 struct drm_display_mode *stdmode; 148 149 /* 150 * When no valid EDID modes are available we end up 151 * here and bailed in the past, now we add some standard 152 * modes and move on. 153 */ 154 stdmode = drm_mode_duplicate(dev, &std_modes[i]); 155 drm_mode_probed_add(connector, stdmode); 156 drm_mode_list_concat(&connector->probed_modes, 157 &connector->modes); 158 159 DRM_DEBUG("Adding mode %s to %s\n", stdmode->name, 160 drm_get_connector_name(connector)); 161 } 162 drm_mode_sort(&connector->modes); 163 164 DRM_DEBUG("Added std modes on %s\n", drm_get_connector_name(connector)); 165 list_for_each_entry_safe(mode, t, &connector->modes, head) { 166 mode->vrefresh = drm_mode_vrefresh(mode); 167 168 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); 169 drm_mode_debug_printmodeline(mode); 170 } 171 } 172 173 /** 174 * drm_helper_crtc_in_use - check if a given CRTC is in a mode_config 175 * @crtc: CRTC to check 176 * 177 * LOCKING: 178 * Caller must hold mode config lock. 179 * 180 * Walk @crtc's DRM device's mode_config and see if it's in use. 181 * 182 * RETURNS: 183 * True if @crtc is part of the mode_config, false otherwise. 184 */ 185 bool drm_helper_crtc_in_use(struct drm_crtc *crtc) 186 { 187 struct drm_encoder *encoder; 188 struct drm_device *dev = crtc->dev; 189 /* FIXME: Locking around list access? */ 190 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) 191 if (encoder->crtc == crtc) 192 return true; 193 return false; 194 } 195 EXPORT_SYMBOL(drm_helper_crtc_in_use); 196 197 /** 198 * drm_disable_unused_functions - disable unused objects 199 * @dev: DRM device 200 * 201 * LOCKING: 202 * Caller must hold mode config lock. 203 * 204 * If an connector or CRTC isn't part of @dev's mode_config, it can be disabled 205 * by calling its dpms function, which should power it off. 206 */ 207 void drm_helper_disable_unused_functions(struct drm_device *dev) 208 { 209 struct drm_encoder *encoder; 210 struct drm_encoder_helper_funcs *encoder_funcs; 211 struct drm_crtc *crtc; 212 213 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 214 encoder_funcs = encoder->helper_private; 215 if (!encoder->crtc) 216 (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF); 217 } 218 219 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 220 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 221 crtc->enabled = drm_helper_crtc_in_use(crtc); 222 if (!crtc->enabled) { 223 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); 224 crtc->fb = NULL; 225 } 226 } 227 } 228 EXPORT_SYMBOL(drm_helper_disable_unused_functions); 229 230 static struct drm_display_mode *drm_has_preferred_mode(struct drm_connector *connector, int width, int height) 231 { 232 struct drm_display_mode *mode; 233 234 list_for_each_entry(mode, &connector->modes, head) { 235 if (drm_mode_width(mode) > width || 236 drm_mode_height(mode) > height) 237 continue; 238 if (mode->type & DRM_MODE_TYPE_PREFERRED) 239 return mode; 240 } 241 return NULL; 242 } 243 244 static bool drm_connector_enabled(struct drm_connector *connector, bool strict) 245 { 246 bool enable; 247 248 if (strict) { 249 enable = connector->status == connector_status_connected; 250 } else { 251 enable = connector->status != connector_status_disconnected; 252 } 253 return enable; 254 } 255 256 static void drm_enable_connectors(struct drm_device *dev, bool *enabled) 257 { 258 bool any_enabled = false; 259 struct drm_connector *connector; 260 int i = 0; 261 262 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 263 enabled[i] = drm_connector_enabled(connector, true); 264 DRM_DEBUG("connector %d enabled? %s\n", connector->base.id, 265 enabled[i] ? "yes" : "no"); 266 any_enabled |= enabled[i]; 267 i++; 268 } 269 270 if (any_enabled) 271 return; 272 273 i = 0; 274 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 275 enabled[i] = drm_connector_enabled(connector, false); 276 i++; 277 } 278 } 279 280 static bool drm_target_preferred(struct drm_device *dev, 281 struct drm_display_mode **modes, 282 bool *enabled, int width, int height) 283 { 284 struct drm_connector *connector; 285 int i = 0; 286 287 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 288 289 if (enabled[i] == false) { 290 i++; 291 continue; 292 } 293 294 DRM_DEBUG("looking for preferred mode on connector %d\n", 295 connector->base.id); 296 297 modes[i] = drm_has_preferred_mode(connector, width, height); 298 /* No preferred modes, pick one off the list */ 299 if (!modes[i] && !list_empty(&connector->modes)) { 300 list_for_each_entry(modes[i], &connector->modes, head) 301 break; 302 } 303 DRM_DEBUG("found mode %s\n", modes[i] ? modes[i]->name : 304 "none"); 305 i++; 306 } 307 return true; 308 } 309 310 static int drm_pick_crtcs(struct drm_device *dev, 311 struct drm_crtc **best_crtcs, 312 struct drm_display_mode **modes, 313 int n, int width, int height) 314 { 315 int c, o; 316 struct drm_connector *connector; 317 struct drm_connector_helper_funcs *connector_funcs; 318 struct drm_encoder *encoder; 319 struct drm_crtc *best_crtc; 320 int my_score, best_score, score; 321 struct drm_crtc **crtcs, *crtc; 322 323 if (n == dev->mode_config.num_connector) 324 return 0; 325 c = 0; 326 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 327 if (c == n) 328 break; 329 c++; 330 } 331 332 best_crtcs[n] = NULL; 333 best_crtc = NULL; 334 best_score = drm_pick_crtcs(dev, best_crtcs, modes, n+1, width, height); 335 if (modes[n] == NULL) 336 return best_score; 337 338 crtcs = kmalloc(dev->mode_config.num_connector * 339 sizeof(struct drm_crtc *), GFP_KERNEL); 340 if (!crtcs) 341 return best_score; 342 343 my_score = 1; 344 if (connector->status == connector_status_connected) 345 my_score++; 346 if (drm_has_preferred_mode(connector, width, height)) 347 my_score++; 348 349 connector_funcs = connector->helper_private; 350 encoder = connector_funcs->best_encoder(connector); 351 if (!encoder) 352 goto out; 353 354 connector->encoder = encoder; 355 356 /* select a crtc for this connector and then attempt to configure 357 remaining connectors */ 358 c = 0; 359 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 360 361 if ((connector->encoder->possible_crtcs & (1 << c)) == 0) { 362 c++; 363 continue; 364 } 365 366 for (o = 0; o < n; o++) 367 if (best_crtcs[o] == crtc) 368 break; 369 370 if (o < n) { 371 /* ignore cloning for now */ 372 c++; 373 continue; 374 } 375 376 crtcs[n] = crtc; 377 memcpy(crtcs, best_crtcs, n * sizeof(struct drm_crtc *)); 378 score = my_score + drm_pick_crtcs(dev, crtcs, modes, n + 1, 379 width, height); 380 if (score > best_score) { 381 best_crtc = crtc; 382 best_score = score; 383 memcpy(best_crtcs, crtcs, 384 dev->mode_config.num_connector * 385 sizeof(struct drm_crtc *)); 386 } 387 c++; 388 } 389 out: 390 kfree(crtcs); 391 return best_score; 392 } 393 394 static void drm_setup_crtcs(struct drm_device *dev) 395 { 396 struct drm_crtc **crtcs; 397 struct drm_display_mode **modes; 398 struct drm_encoder *encoder; 399 struct drm_connector *connector; 400 bool *enabled; 401 int width, height; 402 int i, ret; 403 404 DRM_DEBUG("\n"); 405 406 width = dev->mode_config.max_width; 407 height = dev->mode_config.max_height; 408 409 /* clean out all the encoder/crtc combos */ 410 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 411 encoder->crtc = NULL; 412 } 413 414 crtcs = kcalloc(dev->mode_config.num_connector, 415 sizeof(struct drm_crtc *), GFP_KERNEL); 416 modes = kcalloc(dev->mode_config.num_connector, 417 sizeof(struct drm_display_mode *), GFP_KERNEL); 418 enabled = kcalloc(dev->mode_config.num_connector, 419 sizeof(bool), GFP_KERNEL); 420 421 drm_enable_connectors(dev, enabled); 422 423 ret = drm_target_preferred(dev, modes, enabled, width, height); 424 if (!ret) 425 DRM_ERROR("Unable to find initial modes\n"); 426 427 DRM_DEBUG("picking CRTCs for %dx%d config\n", width, height); 428 429 drm_pick_crtcs(dev, crtcs, modes, 0, width, height); 430 431 i = 0; 432 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 433 struct drm_display_mode *mode = modes[i]; 434 struct drm_crtc *crtc = crtcs[i]; 435 436 if (connector->encoder == NULL) { 437 i++; 438 continue; 439 } 440 441 if (mode && crtc) { 442 DRM_DEBUG("desired mode %s set on crtc %d\n", 443 mode->name, crtc->base.id); 444 crtc->desired_mode = mode; 445 connector->encoder->crtc = crtc; 446 } else 447 connector->encoder->crtc = NULL; 448 i++; 449 } 450 451 kfree(crtcs); 452 kfree(modes); 453 kfree(enabled); 454 } 455 456 /** 457 * drm_encoder_crtc_ok - can a given crtc drive a given encoder? 458 * @encoder: encoder to test 459 * @crtc: crtc to test 460 * 461 * Return false if @encoder can't be driven by @crtc, true otherwise. 462 */ 463 static bool drm_encoder_crtc_ok(struct drm_encoder *encoder, 464 struct drm_crtc *crtc) 465 { 466 struct drm_device *dev; 467 struct drm_crtc *tmp; 468 int crtc_mask = 1; 469 470 WARN(!crtc, "checking null crtc?"); 471 472 dev = crtc->dev; 473 474 list_for_each_entry(tmp, &dev->mode_config.crtc_list, head) { 475 if (tmp == crtc) 476 break; 477 crtc_mask <<= 1; 478 } 479 480 if (encoder->possible_crtcs & crtc_mask) 481 return true; 482 return false; 483 } 484 485 /* 486 * Check the CRTC we're going to map each output to vs. its current 487 * CRTC. If they don't match, we have to disable the output and the CRTC 488 * since the driver will have to re-route things. 489 */ 490 static void 491 drm_crtc_prepare_encoders(struct drm_device *dev) 492 { 493 struct drm_encoder_helper_funcs *encoder_funcs; 494 struct drm_encoder *encoder; 495 496 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 497 encoder_funcs = encoder->helper_private; 498 /* Disable unused encoders */ 499 if (encoder->crtc == NULL) 500 (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF); 501 /* Disable encoders whose CRTC is about to change */ 502 if (encoder_funcs->get_crtc && 503 encoder->crtc != (*encoder_funcs->get_crtc)(encoder)) 504 (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF); 505 } 506 } 507 508 /** 509 * drm_crtc_set_mode - set a mode 510 * @crtc: CRTC to program 511 * @mode: mode to use 512 * @x: width of mode 513 * @y: height of mode 514 * 515 * LOCKING: 516 * Caller must hold mode config lock. 517 * 518 * Try to set @mode on @crtc. Give @crtc and its associated connectors a chance 519 * to fixup or reject the mode prior to trying to set it. 520 * 521 * RETURNS: 522 * True if the mode was set successfully, or false otherwise. 523 */ 524 bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, 525 struct drm_display_mode *mode, 526 int x, int y, 527 struct drm_framebuffer *old_fb) 528 { 529 struct drm_device *dev = crtc->dev; 530 struct drm_display_mode *adjusted_mode, saved_mode; 531 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 532 struct drm_encoder_helper_funcs *encoder_funcs; 533 int saved_x, saved_y; 534 struct drm_encoder *encoder; 535 bool ret = true; 536 bool depth_changed, bpp_changed; 537 538 adjusted_mode = drm_mode_duplicate(dev, mode); 539 540 crtc->enabled = drm_helper_crtc_in_use(crtc); 541 542 if (!crtc->enabled) 543 return true; 544 545 if (old_fb && crtc->fb) { 546 depth_changed = (old_fb->depth != crtc->fb->depth); 547 bpp_changed = (old_fb->bits_per_pixel != 548 crtc->fb->bits_per_pixel); 549 } else { 550 depth_changed = true; 551 bpp_changed = true; 552 } 553 554 saved_mode = crtc->mode; 555 saved_x = crtc->x; 556 saved_y = crtc->y; 557 558 /* Update crtc values up front so the driver can rely on them for mode 559 * setting. 560 */ 561 crtc->mode = *mode; 562 crtc->x = x; 563 crtc->y = y; 564 565 if (drm_mode_equal(&saved_mode, &crtc->mode)) { 566 if (saved_x != crtc->x || saved_y != crtc->y || 567 depth_changed || bpp_changed) { 568 ret = !crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y, 569 old_fb); 570 goto done; 571 } 572 } 573 574 /* Pass our mode to the connectors and the CRTC to give them a chance to 575 * adjust it according to limitations or connector properties, and also 576 * a chance to reject the mode entirely. 577 */ 578 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 579 580 if (encoder->crtc != crtc) 581 continue; 582 encoder_funcs = encoder->helper_private; 583 if (!(ret = encoder_funcs->mode_fixup(encoder, mode, 584 adjusted_mode))) { 585 goto done; 586 } 587 } 588 589 if (!(ret = crtc_funcs->mode_fixup(crtc, mode, adjusted_mode))) { 590 goto done; 591 } 592 593 /* Prepare the encoders and CRTCs before setting the mode. */ 594 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 595 596 if (encoder->crtc != crtc) 597 continue; 598 encoder_funcs = encoder->helper_private; 599 /* Disable the encoders as the first thing we do. */ 600 encoder_funcs->prepare(encoder); 601 } 602 603 drm_crtc_prepare_encoders(dev); 604 605 crtc_funcs->prepare(crtc); 606 607 /* Set up the DPLL and any encoders state that needs to adjust or depend 608 * on the DPLL. 609 */ 610 ret = !crtc_funcs->mode_set(crtc, mode, adjusted_mode, x, y, old_fb); 611 if (!ret) 612 goto done; 613 614 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 615 616 if (encoder->crtc != crtc) 617 continue; 618 619 DRM_INFO("%s: set mode %s %x\n", drm_get_encoder_name(encoder), 620 mode->name, mode->base.id); 621 encoder_funcs = encoder->helper_private; 622 encoder_funcs->mode_set(encoder, mode, adjusted_mode); 623 } 624 625 /* Now enable the clocks, plane, pipe, and connectors that we set up. */ 626 crtc_funcs->commit(crtc); 627 628 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 629 630 if (encoder->crtc != crtc) 631 continue; 632 633 encoder_funcs = encoder->helper_private; 634 encoder_funcs->commit(encoder); 635 636 } 637 638 /* XXX free adjustedmode */ 639 drm_mode_destroy(dev, adjusted_mode); 640 /* FIXME: add subpixel order */ 641 done: 642 if (!ret) { 643 crtc->mode = saved_mode; 644 crtc->x = saved_x; 645 crtc->y = saved_y; 646 } 647 648 return ret; 649 } 650 EXPORT_SYMBOL(drm_crtc_helper_set_mode); 651 652 653 /** 654 * drm_crtc_helper_set_config - set a new config from userspace 655 * @crtc: CRTC to setup 656 * @crtc_info: user provided configuration 657 * @new_mode: new mode to set 658 * @connector_set: set of connectors for the new config 659 * @fb: new framebuffer 660 * 661 * LOCKING: 662 * Caller must hold mode config lock. 663 * 664 * Setup a new configuration, provided by the user in @crtc_info, and enable 665 * it. 666 * 667 * RETURNS: 668 * Zero. (FIXME) 669 */ 670 int drm_crtc_helper_set_config(struct drm_mode_set *set) 671 { 672 struct drm_device *dev; 673 struct drm_crtc **save_crtcs, *new_crtc; 674 struct drm_encoder **save_encoders, *new_encoder; 675 struct drm_framebuffer *old_fb = NULL; 676 bool save_enabled; 677 bool mode_changed = false; 678 bool fb_changed = false; 679 struct drm_connector *connector; 680 int count = 0, ro, fail = 0; 681 struct drm_crtc_helper_funcs *crtc_funcs; 682 int ret = 0; 683 684 DRM_DEBUG("\n"); 685 686 if (!set) 687 return -EINVAL; 688 689 if (!set->crtc) 690 return -EINVAL; 691 692 if (!set->crtc->helper_private) 693 return -EINVAL; 694 695 crtc_funcs = set->crtc->helper_private; 696 697 DRM_DEBUG("crtc: %p %d fb: %p connectors: %p num_connectors: %d (x, y) (%i, %i)\n", 698 set->crtc, set->crtc->base.id, set->fb, set->connectors, 699 (int)set->num_connectors, set->x, set->y); 700 701 dev = set->crtc->dev; 702 703 /* save previous config */ 704 save_enabled = set->crtc->enabled; 705 706 /* 707 * We do mode_config.num_connectors here since we'll look at the 708 * CRTC and encoder associated with each connector later. 709 */ 710 save_crtcs = kzalloc(dev->mode_config.num_connector * 711 sizeof(struct drm_crtc *), GFP_KERNEL); 712 if (!save_crtcs) 713 return -ENOMEM; 714 715 save_encoders = kzalloc(dev->mode_config.num_connector * 716 sizeof(struct drm_encoders *), GFP_KERNEL); 717 if (!save_encoders) { 718 kfree(save_crtcs); 719 return -ENOMEM; 720 } 721 722 /* We should be able to check here if the fb has the same properties 723 * and then just flip_or_move it */ 724 if (set->crtc->fb != set->fb) { 725 /* If we have no fb then treat it as a full mode set */ 726 if (set->crtc->fb == NULL) { 727 DRM_DEBUG("crtc has no fb, full mode set\n"); 728 mode_changed = true; 729 } else if ((set->fb->bits_per_pixel != 730 set->crtc->fb->bits_per_pixel) || 731 set->fb->depth != set->crtc->fb->depth) 732 fb_changed = true; 733 else 734 fb_changed = true; 735 } 736 737 if (set->x != set->crtc->x || set->y != set->crtc->y) 738 fb_changed = true; 739 740 if (set->mode && !drm_mode_equal(set->mode, &set->crtc->mode)) { 741 DRM_DEBUG("modes are different, full mode set\n"); 742 drm_mode_debug_printmodeline(&set->crtc->mode); 743 drm_mode_debug_printmodeline(set->mode); 744 mode_changed = true; 745 } 746 747 /* a) traverse passed in connector list and get encoders for them */ 748 count = 0; 749 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 750 struct drm_connector_helper_funcs *connector_funcs = 751 connector->helper_private; 752 save_encoders[count++] = connector->encoder; 753 new_encoder = connector->encoder; 754 for (ro = 0; ro < set->num_connectors; ro++) { 755 if (set->connectors[ro] == connector) { 756 new_encoder = connector_funcs->best_encoder(connector); 757 /* if we can't get an encoder for a connector 758 we are setting now - then fail */ 759 if (new_encoder == NULL) 760 /* don't break so fail path works correct */ 761 fail = 1; 762 break; 763 } 764 } 765 766 if (new_encoder != connector->encoder) { 767 DRM_DEBUG("encoder changed, full mode switch\n"); 768 mode_changed = true; 769 connector->encoder = new_encoder; 770 } 771 } 772 773 if (fail) { 774 ret = -EINVAL; 775 goto fail_no_encoder; 776 } 777 778 count = 0; 779 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 780 if (!connector->encoder) 781 continue; 782 783 save_crtcs[count++] = connector->encoder->crtc; 784 785 if (connector->encoder->crtc == set->crtc) 786 new_crtc = NULL; 787 else 788 new_crtc = connector->encoder->crtc; 789 790 for (ro = 0; ro < set->num_connectors; ro++) { 791 if (set->connectors[ro] == connector) 792 new_crtc = set->crtc; 793 } 794 795 /* Make sure the new CRTC will work with the encoder */ 796 if (new_crtc && 797 !drm_encoder_crtc_ok(connector->encoder, new_crtc)) { 798 ret = -EINVAL; 799 goto fail_set_mode; 800 } 801 if (new_crtc != connector->encoder->crtc) { 802 DRM_DEBUG("crtc changed, full mode switch\n"); 803 mode_changed = true; 804 connector->encoder->crtc = new_crtc; 805 } 806 DRM_DEBUG("setting connector %d crtc to %p\n", 807 connector->base.id, new_crtc); 808 } 809 810 /* mode_set_base is not a required function */ 811 if (fb_changed && !crtc_funcs->mode_set_base) 812 mode_changed = true; 813 814 if (mode_changed) { 815 old_fb = set->crtc->fb; 816 set->crtc->fb = set->fb; 817 set->crtc->enabled = (set->mode != NULL); 818 if (set->mode != NULL) { 819 DRM_DEBUG("attempting to set mode from userspace\n"); 820 drm_mode_debug_printmodeline(set->mode); 821 if (!drm_crtc_helper_set_mode(set->crtc, set->mode, 822 set->x, set->y, 823 old_fb)) { 824 DRM_ERROR("failed to set mode on crtc %p\n", 825 set->crtc); 826 ret = -EINVAL; 827 goto fail_set_mode; 828 } 829 /* TODO are these needed? */ 830 set->crtc->desired_x = set->x; 831 set->crtc->desired_y = set->y; 832 set->crtc->desired_mode = set->mode; 833 } 834 drm_helper_disable_unused_functions(dev); 835 } else if (fb_changed) { 836 old_fb = set->crtc->fb; 837 if (set->crtc->fb != set->fb) 838 set->crtc->fb = set->fb; 839 ret = crtc_funcs->mode_set_base(set->crtc, 840 set->x, set->y, old_fb); 841 if (ret != 0) 842 goto fail_set_mode; 843 } 844 845 kfree(save_encoders); 846 kfree(save_crtcs); 847 return 0; 848 849 fail_set_mode: 850 set->crtc->enabled = save_enabled; 851 set->crtc->fb = old_fb; 852 count = 0; 853 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 854 if (!connector->encoder) 855 continue; 856 857 connector->encoder->crtc = save_crtcs[count++]; 858 } 859 fail_no_encoder: 860 kfree(save_crtcs); 861 count = 0; 862 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 863 connector->encoder = save_encoders[count++]; 864 } 865 kfree(save_encoders); 866 return ret; 867 } 868 EXPORT_SYMBOL(drm_crtc_helper_set_config); 869 870 bool drm_helper_plugged_event(struct drm_device *dev) 871 { 872 DRM_DEBUG("\n"); 873 874 drm_helper_probe_connector_modes(dev, dev->mode_config.max_width, 875 dev->mode_config.max_height); 876 877 drm_setup_crtcs(dev); 878 879 /* alert the driver fb layer */ 880 dev->mode_config.funcs->fb_changed(dev); 881 882 /* FIXME: send hotplug event */ 883 return true; 884 } 885 /** 886 * drm_initial_config - setup a sane initial connector configuration 887 * @dev: DRM device 888 * @can_grow: this configuration is growable 889 * 890 * LOCKING: 891 * Called at init time, must take mode config lock. 892 * 893 * Scan the CRTCs and connectors and try to put together an initial setup. 894 * At the moment, this is a cloned configuration across all heads with 895 * a new framebuffer object as the backing store. 896 * 897 * RETURNS: 898 * Zero if everything went ok, nonzero otherwise. 899 */ 900 bool drm_helper_initial_config(struct drm_device *dev, bool can_grow) 901 { 902 struct drm_connector *connector; 903 int count = 0; 904 905 count = drm_helper_probe_connector_modes(dev, 906 dev->mode_config.max_width, 907 dev->mode_config.max_height); 908 909 /* 910 * None of the available connectors had any modes, so add some 911 * and try to light them up anyway 912 */ 913 if (!count) { 914 DRM_ERROR("connectors have no modes, using standard modes\n"); 915 list_for_each_entry(connector, 916 &dev->mode_config.connector_list, 917 head) 918 drm_helper_add_std_modes(dev, connector); 919 } 920 921 drm_setup_crtcs(dev); 922 923 /* alert the driver fb layer */ 924 dev->mode_config.funcs->fb_changed(dev); 925 926 return 0; 927 } 928 EXPORT_SYMBOL(drm_helper_initial_config); 929 930 /** 931 * drm_hotplug_stage_two 932 * @dev DRM device 933 * @connector hotpluged connector 934 * 935 * LOCKING. 936 * Caller must hold mode config lock, function might grab struct lock. 937 * 938 * Stage two of a hotplug. 939 * 940 * RETURNS: 941 * Zero on success, errno on failure. 942 */ 943 int drm_helper_hotplug_stage_two(struct drm_device *dev) 944 { 945 drm_helper_plugged_event(dev); 946 947 return 0; 948 } 949 EXPORT_SYMBOL(drm_helper_hotplug_stage_two); 950 951 int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, 952 struct drm_mode_fb_cmd *mode_cmd) 953 { 954 fb->width = mode_cmd->width; 955 fb->height = mode_cmd->height; 956 fb->pitch = mode_cmd->pitch; 957 fb->bits_per_pixel = mode_cmd->bpp; 958 fb->depth = mode_cmd->depth; 959 960 return 0; 961 } 962 EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct); 963 964 int drm_helper_resume_force_mode(struct drm_device *dev) 965 { 966 struct drm_crtc *crtc; 967 int ret; 968 969 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 970 971 if (!crtc->enabled) 972 continue; 973 974 ret = drm_crtc_helper_set_mode(crtc, &crtc->mode, 975 crtc->x, crtc->y, crtc->fb); 976 977 if (ret == false) 978 DRM_ERROR("failed to set mode on crtc %p\n", crtc); 979 } 980 return 0; 981 } 982 EXPORT_SYMBOL(drm_helper_resume_force_mode); 983