1 /* 2 * Copyright (C) 2014 Red Hat 3 * Copyright (C) 2014 Intel Corp. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in 13 * all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 * 23 * Authors: 24 * Rob Clark <robdclark@gmail.com> 25 * Daniel Vetter <daniel.vetter@ffwll.ch> 26 */ 27 28 #include <drm/drmP.h> 29 #include <drm/drm_atomic.h> 30 #include <drm/drm_plane_helper.h> 31 #include <drm/drm_crtc_helper.h> 32 #include <drm/drm_atomic_helper.h> 33 #include <linux/fence.h> 34 35 /** 36 * DOC: overview 37 * 38 * This helper library provides implementations of check and commit functions on 39 * top of the CRTC modeset helper callbacks and the plane helper callbacks. It 40 * also provides convenience implementations for the atomic state handling 41 * callbacks for drivers which don't need to subclass the drm core structures to 42 * add their own additional internal state. 43 * 44 * This library also provides default implementations for the check callback in 45 * drm_atomic_helper_check() and for the commit callback with 46 * drm_atomic_helper_commit(). But the individual stages and callbacks are 47 * exposed to allow drivers to mix and match and e.g. use the plane helpers only 48 * together with a driver private modeset implementation. 49 * 50 * This library also provides implementations for all the legacy driver 51 * interfaces on top of the atomic interface. See drm_atomic_helper_set_config(), 52 * drm_atomic_helper_disable_plane(), drm_atomic_helper_disable_plane() and the 53 * various functions to implement set_property callbacks. New drivers must not 54 * implement these functions themselves but must use the provided helpers. 55 */ 56 static void 57 drm_atomic_helper_plane_changed(struct drm_atomic_state *state, 58 struct drm_plane_state *plane_state, 59 struct drm_plane *plane) 60 { 61 struct drm_crtc_state *crtc_state; 62 63 if (plane->state->crtc) { 64 crtc_state = state->crtc_states[drm_crtc_index(plane->state->crtc)]; 65 66 if (WARN_ON(!crtc_state)) 67 return; 68 69 crtc_state->planes_changed = true; 70 } 71 72 if (plane_state->crtc) { 73 crtc_state = 74 state->crtc_states[drm_crtc_index(plane_state->crtc)]; 75 76 if (WARN_ON(!crtc_state)) 77 return; 78 79 crtc_state->planes_changed = true; 80 } 81 } 82 83 static struct drm_crtc * 84 get_current_crtc_for_encoder(struct drm_device *dev, 85 struct drm_encoder *encoder) 86 { 87 struct drm_mode_config *config = &dev->mode_config; 88 struct drm_connector *connector; 89 90 WARN_ON(!drm_modeset_is_locked(&config->connection_mutex)); 91 92 drm_for_each_connector(connector, dev) { 93 if (connector->state->best_encoder != encoder) 94 continue; 95 96 return connector->state->crtc; 97 } 98 99 return NULL; 100 } 101 102 static int 103 steal_encoder(struct drm_atomic_state *state, 104 struct drm_encoder *encoder, 105 struct drm_crtc *encoder_crtc) 106 { 107 struct drm_mode_config *config = &state->dev->mode_config; 108 struct drm_crtc_state *crtc_state; 109 struct drm_connector *connector; 110 struct drm_connector_state *connector_state; 111 int ret; 112 113 /* 114 * We can only steal an encoder coming from a connector, which means we 115 * must already hold the connection_mutex. 116 */ 117 WARN_ON(!drm_modeset_is_locked(&config->connection_mutex)); 118 119 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d], stealing it\n", 120 encoder->base.id, encoder->name, 121 encoder_crtc->base.id); 122 123 crtc_state = drm_atomic_get_crtc_state(state, encoder_crtc); 124 if (IS_ERR(crtc_state)) 125 return PTR_ERR(crtc_state); 126 127 crtc_state->connectors_changed = true; 128 129 list_for_each_entry(connector, &config->connector_list, head) { 130 if (connector->state->best_encoder != encoder) 131 continue; 132 133 DRM_DEBUG_ATOMIC("Stealing encoder from [CONNECTOR:%d:%s]\n", 134 connector->base.id, 135 connector->name); 136 137 connector_state = drm_atomic_get_connector_state(state, 138 connector); 139 if (IS_ERR(connector_state)) 140 return PTR_ERR(connector_state); 141 142 ret = drm_atomic_set_crtc_for_connector(connector_state, NULL); 143 if (ret) 144 return ret; 145 connector_state->best_encoder = NULL; 146 } 147 148 return 0; 149 } 150 151 static int 152 update_connector_routing(struct drm_atomic_state *state, int conn_idx) 153 { 154 const struct drm_connector_helper_funcs *funcs; 155 struct drm_encoder *new_encoder; 156 struct drm_crtc *encoder_crtc; 157 struct drm_connector *connector; 158 struct drm_connector_state *connector_state; 159 struct drm_crtc_state *crtc_state; 160 int idx, ret; 161 162 connector = state->connectors[conn_idx]; 163 connector_state = state->connector_states[conn_idx]; 164 165 if (!connector) 166 return 0; 167 168 DRM_DEBUG_ATOMIC("Updating routing for [CONNECTOR:%d:%s]\n", 169 connector->base.id, 170 connector->name); 171 172 if (connector->state->crtc != connector_state->crtc) { 173 if (connector->state->crtc) { 174 idx = drm_crtc_index(connector->state->crtc); 175 176 crtc_state = state->crtc_states[idx]; 177 crtc_state->connectors_changed = true; 178 } 179 180 if (connector_state->crtc) { 181 idx = drm_crtc_index(connector_state->crtc); 182 183 crtc_state = state->crtc_states[idx]; 184 crtc_state->connectors_changed = true; 185 } 186 } 187 188 if (!connector_state->crtc) { 189 DRM_DEBUG_ATOMIC("Disabling [CONNECTOR:%d:%s]\n", 190 connector->base.id, 191 connector->name); 192 193 connector_state->best_encoder = NULL; 194 195 return 0; 196 } 197 198 funcs = connector->helper_private; 199 200 if (funcs->atomic_best_encoder) 201 new_encoder = funcs->atomic_best_encoder(connector, 202 connector_state); 203 else 204 new_encoder = funcs->best_encoder(connector); 205 206 if (!new_encoder) { 207 DRM_DEBUG_ATOMIC("No suitable encoder found for [CONNECTOR:%d:%s]\n", 208 connector->base.id, 209 connector->name); 210 return -EINVAL; 211 } 212 213 if (!drm_encoder_crtc_ok(new_encoder, connector_state->crtc)) { 214 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] incompatible with [CRTC:%d]\n", 215 new_encoder->base.id, 216 new_encoder->name, 217 connector_state->crtc->base.id); 218 return -EINVAL; 219 } 220 221 if (new_encoder == connector_state->best_encoder) { 222 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d]\n", 223 connector->base.id, 224 connector->name, 225 new_encoder->base.id, 226 new_encoder->name, 227 connector_state->crtc->base.id); 228 229 return 0; 230 } 231 232 encoder_crtc = get_current_crtc_for_encoder(state->dev, 233 new_encoder); 234 235 if (encoder_crtc) { 236 ret = steal_encoder(state, new_encoder, encoder_crtc); 237 if (ret) { 238 DRM_DEBUG_ATOMIC("Encoder stealing failed for [CONNECTOR:%d:%s]\n", 239 connector->base.id, 240 connector->name); 241 return ret; 242 } 243 } 244 245 if (WARN_ON(!connector_state->crtc)) 246 return -EINVAL; 247 248 connector_state->best_encoder = new_encoder; 249 idx = drm_crtc_index(connector_state->crtc); 250 251 crtc_state = state->crtc_states[idx]; 252 crtc_state->connectors_changed = true; 253 254 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d]\n", 255 connector->base.id, 256 connector->name, 257 new_encoder->base.id, 258 new_encoder->name, 259 connector_state->crtc->base.id); 260 261 return 0; 262 } 263 264 static int 265 mode_fixup(struct drm_atomic_state *state) 266 { 267 struct drm_crtc *crtc; 268 struct drm_crtc_state *crtc_state; 269 struct drm_connector *connector; 270 struct drm_connector_state *conn_state; 271 int i; 272 bool ret; 273 274 for_each_crtc_in_state(state, crtc, crtc_state, i) { 275 if (!crtc_state->mode_changed && 276 !crtc_state->connectors_changed) 277 continue; 278 279 drm_mode_copy(&crtc_state->adjusted_mode, &crtc_state->mode); 280 } 281 282 for_each_connector_in_state(state, connector, conn_state, i) { 283 const struct drm_encoder_helper_funcs *funcs; 284 struct drm_encoder *encoder; 285 286 WARN_ON(!!conn_state->best_encoder != !!conn_state->crtc); 287 288 if (!conn_state->crtc || !conn_state->best_encoder) 289 continue; 290 291 crtc_state = 292 state->crtc_states[drm_crtc_index(conn_state->crtc)]; 293 294 /* 295 * Each encoder has at most one connector (since we always steal 296 * it away), so we won't call ->mode_fixup twice. 297 */ 298 encoder = conn_state->best_encoder; 299 funcs = encoder->helper_private; 300 if (!funcs) 301 continue; 302 303 ret = drm_bridge_mode_fixup(encoder->bridge, &crtc_state->mode, 304 &crtc_state->adjusted_mode); 305 if (!ret) { 306 DRM_DEBUG_ATOMIC("Bridge fixup failed\n"); 307 return -EINVAL; 308 } 309 310 if (funcs->atomic_check) { 311 ret = funcs->atomic_check(encoder, crtc_state, 312 conn_state); 313 if (ret) { 314 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] check failed\n", 315 encoder->base.id, encoder->name); 316 return ret; 317 } 318 } else if (funcs->mode_fixup) { 319 ret = funcs->mode_fixup(encoder, &crtc_state->mode, 320 &crtc_state->adjusted_mode); 321 if (!ret) { 322 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] fixup failed\n", 323 encoder->base.id, encoder->name); 324 return -EINVAL; 325 } 326 } 327 } 328 329 for_each_crtc_in_state(state, crtc, crtc_state, i) { 330 const struct drm_crtc_helper_funcs *funcs; 331 332 if (!crtc_state->mode_changed && 333 !crtc_state->connectors_changed) 334 continue; 335 336 funcs = crtc->helper_private; 337 if (!funcs->mode_fixup) 338 continue; 339 340 ret = funcs->mode_fixup(crtc, &crtc_state->mode, 341 &crtc_state->adjusted_mode); 342 if (!ret) { 343 DRM_DEBUG_ATOMIC("[CRTC:%d] fixup failed\n", 344 crtc->base.id); 345 return -EINVAL; 346 } 347 } 348 349 return 0; 350 } 351 352 /** 353 * drm_atomic_helper_check_modeset - validate state object for modeset changes 354 * @dev: DRM device 355 * @state: the driver state object 356 * 357 * Check the state object to see if the requested state is physically possible. 358 * This does all the crtc and connector related computations for an atomic 359 * update and adds any additional connectors needed for full modesets and calls 360 * down into ->mode_fixup functions of the driver backend. 361 * 362 * crtc_state->mode_changed is set when the input mode is changed. 363 * crtc_state->connectors_changed is set when a connector is added or 364 * removed from the crtc. 365 * crtc_state->active_changed is set when crtc_state->active changes, 366 * which is used for dpms. 367 * 368 * IMPORTANT: 369 * 370 * Drivers which update ->mode_changed (e.g. in their ->atomic_check hooks if a 371 * plane update can't be done without a full modeset) _must_ call this function 372 * afterwards after that change. It is permitted to call this function multiple 373 * times for the same update, e.g. when the ->atomic_check functions depend upon 374 * the adjusted dotclock for fifo space allocation and watermark computation. 375 * 376 * RETURNS 377 * Zero for success or -errno 378 */ 379 int 380 drm_atomic_helper_check_modeset(struct drm_device *dev, 381 struct drm_atomic_state *state) 382 { 383 struct drm_crtc *crtc; 384 struct drm_crtc_state *crtc_state; 385 struct drm_connector *connector; 386 struct drm_connector_state *connector_state; 387 int i, ret; 388 389 for_each_crtc_in_state(state, crtc, crtc_state, i) { 390 if (!drm_mode_equal(&crtc->state->mode, &crtc_state->mode)) { 391 DRM_DEBUG_ATOMIC("[CRTC:%d] mode changed\n", 392 crtc->base.id); 393 crtc_state->mode_changed = true; 394 } 395 396 if (crtc->state->enable != crtc_state->enable) { 397 DRM_DEBUG_ATOMIC("[CRTC:%d] enable changed\n", 398 crtc->base.id); 399 400 /* 401 * For clarity this assignment is done here, but 402 * enable == 0 is only true when there are no 403 * connectors and a NULL mode. 404 * 405 * The other way around is true as well. enable != 0 406 * iff connectors are attached and a mode is set. 407 */ 408 crtc_state->mode_changed = true; 409 crtc_state->connectors_changed = true; 410 } 411 } 412 413 for_each_connector_in_state(state, connector, connector_state, i) { 414 /* 415 * This only sets crtc->mode_changed for routing changes, 416 * drivers must set crtc->mode_changed themselves when connector 417 * properties need to be updated. 418 */ 419 ret = update_connector_routing(state, i); 420 if (ret) 421 return ret; 422 } 423 424 /* 425 * After all the routing has been prepared we need to add in any 426 * connector which is itself unchanged, but who's crtc changes it's 427 * configuration. This must be done before calling mode_fixup in case a 428 * crtc only changed its mode but has the same set of connectors. 429 */ 430 for_each_crtc_in_state(state, crtc, crtc_state, i) { 431 int num_connectors; 432 433 /* 434 * We must set ->active_changed after walking connectors for 435 * otherwise an update that only changes active would result in 436 * a full modeset because update_connector_routing force that. 437 */ 438 if (crtc->state->active != crtc_state->active) { 439 DRM_DEBUG_ATOMIC("[CRTC:%d] active changed\n", 440 crtc->base.id); 441 crtc_state->active_changed = true; 442 } 443 444 if (!drm_atomic_crtc_needs_modeset(crtc_state)) 445 continue; 446 447 DRM_DEBUG_ATOMIC("[CRTC:%d] needs all connectors, enable: %c, active: %c\n", 448 crtc->base.id, 449 crtc_state->enable ? 'y' : 'n', 450 crtc_state->active ? 'y' : 'n'); 451 452 ret = drm_atomic_add_affected_connectors(state, crtc); 453 if (ret != 0) 454 return ret; 455 456 ret = drm_atomic_add_affected_planes(state, crtc); 457 if (ret != 0) 458 return ret; 459 460 num_connectors = drm_atomic_connectors_for_crtc(state, 461 crtc); 462 463 if (crtc_state->enable != !!num_connectors) { 464 DRM_DEBUG_ATOMIC("[CRTC:%d] enabled/connectors mismatch\n", 465 crtc->base.id); 466 467 return -EINVAL; 468 } 469 } 470 471 return mode_fixup(state); 472 } 473 EXPORT_SYMBOL(drm_atomic_helper_check_modeset); 474 475 /** 476 * drm_atomic_helper_check_planes - validate state object for planes changes 477 * @dev: DRM device 478 * @state: the driver state object 479 * 480 * Check the state object to see if the requested state is physically possible. 481 * This does all the plane update related checks using by calling into the 482 * ->atomic_check hooks provided by the driver. 483 * 484 * It also sets crtc_state->planes_changed to indicate that a crtc has 485 * updated planes. 486 * 487 * RETURNS 488 * Zero for success or -errno 489 */ 490 int 491 drm_atomic_helper_check_planes(struct drm_device *dev, 492 struct drm_atomic_state *state) 493 { 494 struct drm_crtc *crtc; 495 struct drm_crtc_state *crtc_state; 496 struct drm_plane *plane; 497 struct drm_plane_state *plane_state; 498 int i, ret = 0; 499 500 for_each_plane_in_state(state, plane, plane_state, i) { 501 const struct drm_plane_helper_funcs *funcs; 502 503 funcs = plane->helper_private; 504 505 drm_atomic_helper_plane_changed(state, plane_state, plane); 506 507 if (!funcs || !funcs->atomic_check) 508 continue; 509 510 ret = funcs->atomic_check(plane, plane_state); 511 if (ret) { 512 DRM_DEBUG_ATOMIC("[PLANE:%d] atomic driver check failed\n", 513 plane->base.id); 514 return ret; 515 } 516 } 517 518 for_each_crtc_in_state(state, crtc, crtc_state, i) { 519 const struct drm_crtc_helper_funcs *funcs; 520 521 funcs = crtc->helper_private; 522 523 if (!funcs || !funcs->atomic_check) 524 continue; 525 526 ret = funcs->atomic_check(crtc, state->crtc_states[i]); 527 if (ret) { 528 DRM_DEBUG_ATOMIC("[CRTC:%d] atomic driver check failed\n", 529 crtc->base.id); 530 return ret; 531 } 532 } 533 534 return ret; 535 } 536 EXPORT_SYMBOL(drm_atomic_helper_check_planes); 537 538 /** 539 * drm_atomic_helper_check - validate state object 540 * @dev: DRM device 541 * @state: the driver state object 542 * 543 * Check the state object to see if the requested state is physically possible. 544 * Only crtcs and planes have check callbacks, so for any additional (global) 545 * checking that a driver needs it can simply wrap that around this function. 546 * Drivers without such needs can directly use this as their ->atomic_check() 547 * callback. 548 * 549 * This just wraps the two parts of the state checking for planes and modeset 550 * state in the default order: First it calls drm_atomic_helper_check_modeset() 551 * and then drm_atomic_helper_check_planes(). The assumption is that the 552 * ->atomic_check functions depend upon an updated adjusted_mode.clock to 553 * e.g. properly compute watermarks. 554 * 555 * RETURNS 556 * Zero for success or -errno 557 */ 558 int drm_atomic_helper_check(struct drm_device *dev, 559 struct drm_atomic_state *state) 560 { 561 int ret; 562 563 ret = drm_atomic_helper_check_modeset(dev, state); 564 if (ret) 565 return ret; 566 567 ret = drm_atomic_helper_check_planes(dev, state); 568 if (ret) 569 return ret; 570 571 return ret; 572 } 573 EXPORT_SYMBOL(drm_atomic_helper_check); 574 575 static void 576 disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) 577 { 578 struct drm_connector *connector; 579 struct drm_connector_state *old_conn_state; 580 struct drm_crtc *crtc; 581 struct drm_crtc_state *old_crtc_state; 582 int i; 583 584 for_each_connector_in_state(old_state, connector, old_conn_state, i) { 585 const struct drm_encoder_helper_funcs *funcs; 586 struct drm_encoder *encoder; 587 struct drm_crtc_state *old_crtc_state; 588 589 /* Shut down everything that's in the changeset and currently 590 * still on. So need to check the old, saved state. */ 591 if (!old_conn_state->crtc) 592 continue; 593 594 old_crtc_state = old_state->crtc_states[drm_crtc_index(old_conn_state->crtc)]; 595 596 if (!old_crtc_state->active || 597 !drm_atomic_crtc_needs_modeset(old_conn_state->crtc->state)) 598 continue; 599 600 encoder = old_conn_state->best_encoder; 601 602 /* We shouldn't get this far if we didn't previously have 603 * an encoder.. but WARN_ON() rather than explode. 604 */ 605 if (WARN_ON(!encoder)) 606 continue; 607 608 funcs = encoder->helper_private; 609 610 DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n", 611 encoder->base.id, encoder->name); 612 613 /* 614 * Each encoder has at most one connector (since we always steal 615 * it away), so we won't call disable hooks twice. 616 */ 617 drm_bridge_disable(encoder->bridge); 618 619 /* Right function depends upon target state. */ 620 if (connector->state->crtc && funcs->prepare) 621 funcs->prepare(encoder); 622 else if (funcs->disable) 623 funcs->disable(encoder); 624 else 625 funcs->dpms(encoder, DRM_MODE_DPMS_OFF); 626 627 drm_bridge_post_disable(encoder->bridge); 628 } 629 630 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) { 631 const struct drm_crtc_helper_funcs *funcs; 632 633 /* Shut down everything that needs a full modeset. */ 634 if (!drm_atomic_crtc_needs_modeset(crtc->state)) 635 continue; 636 637 if (!old_crtc_state->active) 638 continue; 639 640 funcs = crtc->helper_private; 641 642 DRM_DEBUG_ATOMIC("disabling [CRTC:%d]\n", 643 crtc->base.id); 644 645 646 /* Right function depends upon target state. */ 647 if (crtc->state->enable && funcs->prepare) 648 funcs->prepare(crtc); 649 else if (funcs->disable) 650 funcs->disable(crtc); 651 else 652 funcs->dpms(crtc, DRM_MODE_DPMS_OFF); 653 } 654 } 655 656 /** 657 * drm_atomic_helper_update_legacy_modeset_state - update legacy modeset state 658 * @dev: DRM device 659 * @old_state: atomic state object with old state structures 660 * 661 * This function updates all the various legacy modeset state pointers in 662 * connectors, encoders and crtcs. It also updates the timestamping constants 663 * used for precise vblank timestamps by calling 664 * drm_calc_timestamping_constants(). 665 * 666 * Drivers can use this for building their own atomic commit if they don't have 667 * a pure helper-based modeset implementation. 668 */ 669 void 670 drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev, 671 struct drm_atomic_state *old_state) 672 { 673 struct drm_connector *connector; 674 struct drm_connector_state *old_conn_state; 675 struct drm_crtc *crtc; 676 struct drm_crtc_state *old_crtc_state; 677 int i; 678 679 /* clear out existing links and update dpms */ 680 for_each_connector_in_state(old_state, connector, old_conn_state, i) { 681 if (connector->encoder) { 682 WARN_ON(!connector->encoder->crtc); 683 684 connector->encoder->crtc = NULL; 685 connector->encoder = NULL; 686 } 687 688 crtc = connector->state->crtc; 689 if ((!crtc && old_conn_state->crtc) || 690 (crtc && drm_atomic_crtc_needs_modeset(crtc->state))) { 691 struct drm_property *dpms_prop = 692 dev->mode_config.dpms_property; 693 int mode = DRM_MODE_DPMS_OFF; 694 695 if (crtc && crtc->state->active) 696 mode = DRM_MODE_DPMS_ON; 697 698 connector->dpms = mode; 699 drm_object_property_set_value(&connector->base, 700 dpms_prop, mode); 701 } 702 } 703 704 /* set new links */ 705 for_each_connector_in_state(old_state, connector, old_conn_state, i) { 706 if (!connector->state->crtc) 707 continue; 708 709 if (WARN_ON(!connector->state->best_encoder)) 710 continue; 711 712 connector->encoder = connector->state->best_encoder; 713 connector->encoder->crtc = connector->state->crtc; 714 } 715 716 /* set legacy state in the crtc structure */ 717 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) { 718 struct drm_plane *primary = crtc->primary; 719 720 crtc->mode = crtc->state->mode; 721 crtc->enabled = crtc->state->enable; 722 723 if (drm_atomic_get_existing_plane_state(old_state, primary) && 724 primary->state->crtc == crtc) { 725 crtc->x = primary->state->src_x >> 16; 726 crtc->y = primary->state->src_y >> 16; 727 } 728 729 if (crtc->state->enable) 730 drm_calc_timestamping_constants(crtc, 731 &crtc->state->adjusted_mode); 732 } 733 } 734 EXPORT_SYMBOL(drm_atomic_helper_update_legacy_modeset_state); 735 736 static void 737 crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state) 738 { 739 struct drm_crtc *crtc; 740 struct drm_crtc_state *old_crtc_state; 741 struct drm_connector *connector; 742 struct drm_connector_state *old_conn_state; 743 int i; 744 745 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) { 746 const struct drm_crtc_helper_funcs *funcs; 747 748 if (!crtc->state->mode_changed) 749 continue; 750 751 funcs = crtc->helper_private; 752 753 if (crtc->state->enable && funcs->mode_set_nofb) { 754 DRM_DEBUG_ATOMIC("modeset on [CRTC:%d]\n", 755 crtc->base.id); 756 757 funcs->mode_set_nofb(crtc); 758 } 759 } 760 761 for_each_connector_in_state(old_state, connector, old_conn_state, i) { 762 const struct drm_encoder_helper_funcs *funcs; 763 struct drm_crtc_state *new_crtc_state; 764 struct drm_encoder *encoder; 765 struct drm_display_mode *mode, *adjusted_mode; 766 767 if (!connector->state->best_encoder) 768 continue; 769 770 encoder = connector->state->best_encoder; 771 funcs = encoder->helper_private; 772 new_crtc_state = connector->state->crtc->state; 773 mode = &new_crtc_state->mode; 774 adjusted_mode = &new_crtc_state->adjusted_mode; 775 776 if (!new_crtc_state->mode_changed) 777 continue; 778 779 DRM_DEBUG_ATOMIC("modeset on [ENCODER:%d:%s]\n", 780 encoder->base.id, encoder->name); 781 782 /* 783 * Each encoder has at most one connector (since we always steal 784 * it away), so we won't call mode_set hooks twice. 785 */ 786 if (funcs->mode_set) 787 funcs->mode_set(encoder, mode, adjusted_mode); 788 789 drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode); 790 } 791 } 792 793 /** 794 * drm_atomic_helper_commit_modeset_disables - modeset commit to disable outputs 795 * @dev: DRM device 796 * @old_state: atomic state object with old state structures 797 * 798 * This function shuts down all the outputs that need to be shut down and 799 * prepares them (if required) with the new mode. 800 * 801 * For compatibility with legacy crtc helpers this should be called before 802 * drm_atomic_helper_commit_planes(), which is what the default commit function 803 * does. But drivers with different needs can group the modeset commits together 804 * and do the plane commits at the end. This is useful for drivers doing runtime 805 * PM since planes updates then only happen when the CRTC is actually enabled. 806 */ 807 void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev, 808 struct drm_atomic_state *old_state) 809 { 810 disable_outputs(dev, old_state); 811 812 drm_atomic_helper_update_legacy_modeset_state(dev, old_state); 813 814 crtc_set_mode(dev, old_state); 815 } 816 EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables); 817 818 /** 819 * drm_atomic_helper_commit_modeset_enables - modeset commit to enable outputs 820 * @dev: DRM device 821 * @old_state: atomic state object with old state structures 822 * 823 * This function enables all the outputs with the new configuration which had to 824 * be turned off for the update. 825 * 826 * For compatibility with legacy crtc helpers this should be called after 827 * drm_atomic_helper_commit_planes(), which is what the default commit function 828 * does. But drivers with different needs can group the modeset commits together 829 * and do the plane commits at the end. This is useful for drivers doing runtime 830 * PM since planes updates then only happen when the CRTC is actually enabled. 831 */ 832 void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev, 833 struct drm_atomic_state *old_state) 834 { 835 struct drm_crtc *crtc; 836 struct drm_crtc_state *old_crtc_state; 837 struct drm_connector *connector; 838 struct drm_connector_state *old_conn_state; 839 int i; 840 841 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) { 842 const struct drm_crtc_helper_funcs *funcs; 843 844 /* Need to filter out CRTCs where only planes change. */ 845 if (!drm_atomic_crtc_needs_modeset(crtc->state)) 846 continue; 847 848 if (!crtc->state->active) 849 continue; 850 851 funcs = crtc->helper_private; 852 853 if (crtc->state->enable) { 854 DRM_DEBUG_ATOMIC("enabling [CRTC:%d]\n", 855 crtc->base.id); 856 857 if (funcs->enable) 858 funcs->enable(crtc); 859 else 860 funcs->commit(crtc); 861 } 862 } 863 864 for_each_connector_in_state(old_state, connector, old_conn_state, i) { 865 const struct drm_encoder_helper_funcs *funcs; 866 struct drm_encoder *encoder; 867 868 if (!connector->state->best_encoder) 869 continue; 870 871 if (!connector->state->crtc->state->active || 872 !drm_atomic_crtc_needs_modeset(connector->state->crtc->state)) 873 continue; 874 875 encoder = connector->state->best_encoder; 876 funcs = encoder->helper_private; 877 878 DRM_DEBUG_ATOMIC("enabling [ENCODER:%d:%s]\n", 879 encoder->base.id, encoder->name); 880 881 /* 882 * Each encoder has at most one connector (since we always steal 883 * it away), so we won't call enable hooks twice. 884 */ 885 drm_bridge_pre_enable(encoder->bridge); 886 887 if (funcs->enable) 888 funcs->enable(encoder); 889 else 890 funcs->commit(encoder); 891 892 drm_bridge_enable(encoder->bridge); 893 } 894 } 895 EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables); 896 897 static void wait_for_fences(struct drm_device *dev, 898 struct drm_atomic_state *state) 899 { 900 struct drm_plane *plane; 901 struct drm_plane_state *plane_state; 902 int i; 903 904 for_each_plane_in_state(state, plane, plane_state, i) { 905 if (!plane->state->fence) 906 continue; 907 908 WARN_ON(!plane->state->fb); 909 910 fence_wait(plane->state->fence, false); 911 fence_put(plane->state->fence); 912 plane->state->fence = NULL; 913 } 914 } 915 916 static bool framebuffer_changed(struct drm_device *dev, 917 struct drm_atomic_state *old_state, 918 struct drm_crtc *crtc) 919 { 920 struct drm_plane *plane; 921 struct drm_plane_state *old_plane_state; 922 int i; 923 924 for_each_plane_in_state(old_state, plane, old_plane_state, i) { 925 if (plane->state->crtc != crtc && 926 old_plane_state->crtc != crtc) 927 continue; 928 929 if (plane->state->fb != old_plane_state->fb) 930 return true; 931 } 932 933 return false; 934 } 935 936 /** 937 * drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs 938 * @dev: DRM device 939 * @old_state: atomic state object with old state structures 940 * 941 * Helper to, after atomic commit, wait for vblanks on all effected 942 * crtcs (ie. before cleaning up old framebuffers using 943 * drm_atomic_helper_cleanup_planes()). It will only wait on crtcs where the 944 * framebuffers have actually changed to optimize for the legacy cursor and 945 * plane update use-case. 946 */ 947 void 948 drm_atomic_helper_wait_for_vblanks(struct drm_device *dev, 949 struct drm_atomic_state *old_state) 950 { 951 struct drm_crtc *crtc; 952 struct drm_crtc_state *old_crtc_state; 953 int i, ret; 954 955 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) { 956 /* No one cares about the old state, so abuse it for tracking 957 * and store whether we hold a vblank reference (and should do a 958 * vblank wait) in the ->enable boolean. */ 959 old_crtc_state->enable = false; 960 961 if (!crtc->state->enable) 962 continue; 963 964 /* Legacy cursor ioctls are completely unsynced, and userspace 965 * relies on that (by doing tons of cursor updates). */ 966 if (old_state->legacy_cursor_update) 967 continue; 968 969 if (!framebuffer_changed(dev, old_state, crtc)) 970 continue; 971 972 ret = drm_crtc_vblank_get(crtc); 973 if (ret != 0) 974 continue; 975 976 old_crtc_state->enable = true; 977 old_crtc_state->last_vblank_count = drm_crtc_vblank_count(crtc); 978 } 979 980 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) { 981 if (!old_crtc_state->enable) 982 continue; 983 984 ret = wait_event_timeout(dev->vblank[i].queue, 985 old_crtc_state->last_vblank_count != 986 drm_crtc_vblank_count(crtc), 987 msecs_to_jiffies(50)); 988 989 drm_crtc_vblank_put(crtc); 990 } 991 } 992 EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks); 993 994 /** 995 * drm_atomic_helper_commit - commit validated state object 996 * @dev: DRM device 997 * @state: the driver state object 998 * @async: asynchronous commit 999 * 1000 * This function commits a with drm_atomic_helper_check() pre-validated state 1001 * object. This can still fail when e.g. the framebuffer reservation fails. For 1002 * now this doesn't implement asynchronous commits. 1003 * 1004 * Note that right now this function does not support async commits, and hence 1005 * driver writers must implement their own version for now. Also note that the 1006 * default ordering of how the various stages are called is to match the legacy 1007 * modeset helper library closest. One peculiarity of that is that it doesn't 1008 * mesh well with runtime PM at all. 1009 * 1010 * For drivers supporting runtime PM the recommended sequence is 1011 * 1012 * drm_atomic_helper_commit_modeset_disables(dev, state); 1013 * 1014 * drm_atomic_helper_commit_modeset_enables(dev, state); 1015 * 1016 * drm_atomic_helper_commit_planes(dev, state, true); 1017 * 1018 * See the kerneldoc entries for these three functions for more details. 1019 * 1020 * RETURNS 1021 * Zero for success or -errno. 1022 */ 1023 int drm_atomic_helper_commit(struct drm_device *dev, 1024 struct drm_atomic_state *state, 1025 bool async) 1026 { 1027 int ret; 1028 1029 if (async) 1030 return -EBUSY; 1031 1032 ret = drm_atomic_helper_prepare_planes(dev, state); 1033 if (ret) 1034 return ret; 1035 1036 /* 1037 * This is the point of no return - everything below never fails except 1038 * when the hw goes bonghits. Which means we can commit the new state on 1039 * the software side now. 1040 */ 1041 1042 drm_atomic_helper_swap_state(dev, state); 1043 1044 /* 1045 * Everything below can be run asynchronously without the need to grab 1046 * any modeset locks at all under one condition: It must be guaranteed 1047 * that the asynchronous work has either been cancelled (if the driver 1048 * supports it, which at least requires that the framebuffers get 1049 * cleaned up with drm_atomic_helper_cleanup_planes()) or completed 1050 * before the new state gets committed on the software side with 1051 * drm_atomic_helper_swap_state(). 1052 * 1053 * This scheme allows new atomic state updates to be prepared and 1054 * checked in parallel to the asynchronous completion of the previous 1055 * update. Which is important since compositors need to figure out the 1056 * composition of the next frame right after having submitted the 1057 * current layout. 1058 */ 1059 1060 wait_for_fences(dev, state); 1061 1062 drm_atomic_helper_commit_modeset_disables(dev, state); 1063 1064 drm_atomic_helper_commit_planes(dev, state, false); 1065 1066 drm_atomic_helper_commit_modeset_enables(dev, state); 1067 1068 drm_atomic_helper_wait_for_vblanks(dev, state); 1069 1070 drm_atomic_helper_cleanup_planes(dev, state); 1071 1072 drm_atomic_state_free(state); 1073 1074 return 0; 1075 } 1076 EXPORT_SYMBOL(drm_atomic_helper_commit); 1077 1078 /** 1079 * DOC: implementing async commit 1080 * 1081 * For now the atomic helpers don't support async commit directly. If there is 1082 * real need it could be added though, using the dma-buf fence infrastructure 1083 * for generic synchronization with outstanding rendering. 1084 * 1085 * For now drivers have to implement async commit themselves, with the following 1086 * sequence being the recommended one: 1087 * 1088 * 1. Run drm_atomic_helper_prepare_planes() first. This is the only function 1089 * which commit needs to call which can fail, so we want to run it first and 1090 * synchronously. 1091 * 1092 * 2. Synchronize with any outstanding asynchronous commit worker threads which 1093 * might be affected the new state update. This can be done by either cancelling 1094 * or flushing the work items, depending upon whether the driver can deal with 1095 * cancelled updates. Note that it is important to ensure that the framebuffer 1096 * cleanup is still done when cancelling. 1097 * 1098 * For sufficient parallelism it is recommended to have a work item per crtc 1099 * (for updates which don't touch global state) and a global one. Then we only 1100 * need to synchronize with the crtc work items for changed crtcs and the global 1101 * work item, which allows nice concurrent updates on disjoint sets of crtcs. 1102 * 1103 * 3. The software state is updated synchronously with 1104 * drm_atomic_helper_swap_state(). Doing this under the protection of all modeset 1105 * locks means concurrent callers never see inconsistent state. And doing this 1106 * while it's guaranteed that no relevant async worker runs means that async 1107 * workers do not need grab any locks. Actually they must not grab locks, for 1108 * otherwise the work flushing will deadlock. 1109 * 1110 * 4. Schedule a work item to do all subsequent steps, using the split-out 1111 * commit helpers: a) pre-plane commit b) plane commit c) post-plane commit and 1112 * then cleaning up the framebuffers after the old framebuffer is no longer 1113 * being displayed. 1114 */ 1115 1116 /** 1117 * drm_atomic_helper_prepare_planes - prepare plane resources before commit 1118 * @dev: DRM device 1119 * @state: atomic state object with new state structures 1120 * 1121 * This function prepares plane state, specifically framebuffers, for the new 1122 * configuration. If any failure is encountered this function will call 1123 * ->cleanup_fb on any already successfully prepared framebuffer. 1124 * 1125 * Returns: 1126 * 0 on success, negative error code on failure. 1127 */ 1128 int drm_atomic_helper_prepare_planes(struct drm_device *dev, 1129 struct drm_atomic_state *state) 1130 { 1131 int nplanes = dev->mode_config.num_total_plane; 1132 int ret, i; 1133 1134 for (i = 0; i < nplanes; i++) { 1135 const struct drm_plane_helper_funcs *funcs; 1136 struct drm_plane *plane = state->planes[i]; 1137 struct drm_plane_state *plane_state = state->plane_states[i]; 1138 1139 if (!plane) 1140 continue; 1141 1142 funcs = plane->helper_private; 1143 1144 if (funcs->prepare_fb) { 1145 ret = funcs->prepare_fb(plane, plane_state); 1146 if (ret) 1147 goto fail; 1148 } 1149 } 1150 1151 return 0; 1152 1153 fail: 1154 for (i--; i >= 0; i--) { 1155 const struct drm_plane_helper_funcs *funcs; 1156 struct drm_plane *plane = state->planes[i]; 1157 struct drm_plane_state *plane_state = state->plane_states[i]; 1158 1159 if (!plane) 1160 continue; 1161 1162 funcs = plane->helper_private; 1163 1164 if (funcs->cleanup_fb) 1165 funcs->cleanup_fb(plane, plane_state); 1166 1167 } 1168 1169 return ret; 1170 } 1171 EXPORT_SYMBOL(drm_atomic_helper_prepare_planes); 1172 1173 bool plane_crtc_active(struct drm_plane_state *state) 1174 { 1175 return state->crtc && state->crtc->state->active; 1176 } 1177 1178 /** 1179 * drm_atomic_helper_commit_planes - commit plane state 1180 * @dev: DRM device 1181 * @old_state: atomic state object with old state structures 1182 * @active_only: Only commit on active CRTC if set 1183 * 1184 * This function commits the new plane state using the plane and atomic helper 1185 * functions for planes and crtcs. It assumes that the atomic state has already 1186 * been pushed into the relevant object state pointers, since this step can no 1187 * longer fail. 1188 * 1189 * It still requires the global state object @old_state to know which planes and 1190 * crtcs need to be updated though. 1191 * 1192 * Note that this function does all plane updates across all CRTCs in one step. 1193 * If the hardware can't support this approach look at 1194 * drm_atomic_helper_commit_planes_on_crtc() instead. 1195 * 1196 * Plane parameters can be updated by applications while the associated CRTC is 1197 * disabled. The DRM/KMS core will store the parameters in the plane state, 1198 * which will be available to the driver when the CRTC is turned on. As a result 1199 * most drivers don't need to be immediately notified of plane updates for a 1200 * disabled CRTC. 1201 * 1202 * Unless otherwise needed, drivers are advised to set the @active_only 1203 * parameters to true in order not to receive plane update notifications related 1204 * to a disabled CRTC. This avoids the need to manually ignore plane updates in 1205 * driver code when the driver and/or hardware can't or just don't need to deal 1206 * with updates on disabled CRTCs, for example when supporting runtime PM. 1207 * 1208 * The drm_atomic_helper_commit() default implementation only sets @active_only 1209 * to false to most closely match the behaviour of the legacy helpers. This should 1210 * not be copied blindly by drivers. 1211 */ 1212 void drm_atomic_helper_commit_planes(struct drm_device *dev, 1213 struct drm_atomic_state *old_state, 1214 bool active_only) 1215 { 1216 struct drm_crtc *crtc; 1217 struct drm_crtc_state *old_crtc_state; 1218 struct drm_plane *plane; 1219 struct drm_plane_state *old_plane_state; 1220 int i; 1221 1222 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) { 1223 const struct drm_crtc_helper_funcs *funcs; 1224 1225 funcs = crtc->helper_private; 1226 1227 if (!funcs || !funcs->atomic_begin) 1228 continue; 1229 1230 if (active_only && !crtc->state->active) 1231 continue; 1232 1233 funcs->atomic_begin(crtc, old_crtc_state); 1234 } 1235 1236 for_each_plane_in_state(old_state, plane, old_plane_state, i) { 1237 const struct drm_plane_helper_funcs *funcs; 1238 bool disabling; 1239 1240 funcs = plane->helper_private; 1241 1242 if (!funcs) 1243 continue; 1244 1245 disabling = drm_atomic_plane_disabling(plane, old_plane_state); 1246 1247 if (active_only) { 1248 /* 1249 * Skip planes related to inactive CRTCs. If the plane 1250 * is enabled use the state of the current CRTC. If the 1251 * plane is being disabled use the state of the old 1252 * CRTC to avoid skipping planes being disabled on an 1253 * active CRTC. 1254 */ 1255 if (!disabling && !plane_crtc_active(plane->state)) 1256 continue; 1257 if (disabling && !plane_crtc_active(old_plane_state)) 1258 continue; 1259 } 1260 1261 /* 1262 * Special-case disabling the plane if drivers support it. 1263 */ 1264 if (disabling && funcs->atomic_disable) 1265 funcs->atomic_disable(plane, old_plane_state); 1266 else if (plane->state->crtc || disabling) 1267 funcs->atomic_update(plane, old_plane_state); 1268 } 1269 1270 for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) { 1271 const struct drm_crtc_helper_funcs *funcs; 1272 1273 funcs = crtc->helper_private; 1274 1275 if (!funcs || !funcs->atomic_flush) 1276 continue; 1277 1278 if (active_only && !crtc->state->active) 1279 continue; 1280 1281 funcs->atomic_flush(crtc, old_crtc_state); 1282 } 1283 } 1284 EXPORT_SYMBOL(drm_atomic_helper_commit_planes); 1285 1286 /** 1287 * drm_atomic_helper_commit_planes_on_crtc - commit plane state for a crtc 1288 * @old_crtc_state: atomic state object with the old crtc state 1289 * 1290 * This function commits the new plane state using the plane and atomic helper 1291 * functions for planes on the specific crtc. It assumes that the atomic state 1292 * has already been pushed into the relevant object state pointers, since this 1293 * step can no longer fail. 1294 * 1295 * This function is useful when plane updates should be done crtc-by-crtc 1296 * instead of one global step like drm_atomic_helper_commit_planes() does. 1297 * 1298 * This function can only be savely used when planes are not allowed to move 1299 * between different CRTCs because this function doesn't handle inter-CRTC 1300 * depencies. Callers need to ensure that either no such depencies exist, 1301 * resolve them through ordering of commit calls or through some other means. 1302 */ 1303 void 1304 drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state) 1305 { 1306 const struct drm_crtc_helper_funcs *crtc_funcs; 1307 struct drm_crtc *crtc = old_crtc_state->crtc; 1308 struct drm_atomic_state *old_state = old_crtc_state->state; 1309 struct drm_plane *plane; 1310 unsigned plane_mask; 1311 1312 plane_mask = old_crtc_state->plane_mask; 1313 plane_mask |= crtc->state->plane_mask; 1314 1315 crtc_funcs = crtc->helper_private; 1316 if (crtc_funcs && crtc_funcs->atomic_begin) 1317 crtc_funcs->atomic_begin(crtc, old_crtc_state); 1318 1319 drm_for_each_plane_mask(plane, crtc->dev, plane_mask) { 1320 struct drm_plane_state *old_plane_state = 1321 drm_atomic_get_existing_plane_state(old_state, plane); 1322 const struct drm_plane_helper_funcs *plane_funcs; 1323 1324 plane_funcs = plane->helper_private; 1325 1326 if (!old_plane_state || !plane_funcs) 1327 continue; 1328 1329 WARN_ON(plane->state->crtc && plane->state->crtc != crtc); 1330 1331 if (drm_atomic_plane_disabling(plane, old_plane_state) && 1332 plane_funcs->atomic_disable) 1333 plane_funcs->atomic_disable(plane, old_plane_state); 1334 else if (plane->state->crtc || 1335 drm_atomic_plane_disabling(plane, old_plane_state)) 1336 plane_funcs->atomic_update(plane, old_plane_state); 1337 } 1338 1339 if (crtc_funcs && crtc_funcs->atomic_flush) 1340 crtc_funcs->atomic_flush(crtc, old_crtc_state); 1341 } 1342 EXPORT_SYMBOL(drm_atomic_helper_commit_planes_on_crtc); 1343 1344 /** 1345 * drm_atomic_helper_cleanup_planes - cleanup plane resources after commit 1346 * @dev: DRM device 1347 * @old_state: atomic state object with old state structures 1348 * 1349 * This function cleans up plane state, specifically framebuffers, from the old 1350 * configuration. Hence the old configuration must be perserved in @old_state to 1351 * be able to call this function. 1352 * 1353 * This function must also be called on the new state when the atomic update 1354 * fails at any point after calling drm_atomic_helper_prepare_planes(). 1355 */ 1356 void drm_atomic_helper_cleanup_planes(struct drm_device *dev, 1357 struct drm_atomic_state *old_state) 1358 { 1359 struct drm_plane *plane; 1360 struct drm_plane_state *plane_state; 1361 int i; 1362 1363 for_each_plane_in_state(old_state, plane, plane_state, i) { 1364 const struct drm_plane_helper_funcs *funcs; 1365 1366 funcs = plane->helper_private; 1367 1368 if (funcs->cleanup_fb) 1369 funcs->cleanup_fb(plane, plane_state); 1370 } 1371 } 1372 EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes); 1373 1374 /** 1375 * drm_atomic_helper_swap_state - store atomic state into current sw state 1376 * @dev: DRM device 1377 * @state: atomic state 1378 * 1379 * This function stores the atomic state into the current state pointers in all 1380 * driver objects. It should be called after all failing steps have been done 1381 * and succeeded, but before the actual hardware state is committed. 1382 * 1383 * For cleanup and error recovery the current state for all changed objects will 1384 * be swaped into @state. 1385 * 1386 * With that sequence it fits perfectly into the plane prepare/cleanup sequence: 1387 * 1388 * 1. Call drm_atomic_helper_prepare_planes() with the staged atomic state. 1389 * 1390 * 2. Do any other steps that might fail. 1391 * 1392 * 3. Put the staged state into the current state pointers with this function. 1393 * 1394 * 4. Actually commit the hardware state. 1395 * 1396 * 5. Call drm_atomic_helper_cleanup_planes() with @state, which since step 3 1397 * contains the old state. Also do any other cleanup required with that state. 1398 */ 1399 void drm_atomic_helper_swap_state(struct drm_device *dev, 1400 struct drm_atomic_state *state) 1401 { 1402 int i; 1403 1404 for (i = 0; i < dev->mode_config.num_connector; i++) { 1405 struct drm_connector *connector = state->connectors[i]; 1406 1407 if (!connector) 1408 continue; 1409 1410 connector->state->state = state; 1411 swap(state->connector_states[i], connector->state); 1412 connector->state->state = NULL; 1413 } 1414 1415 for (i = 0; i < dev->mode_config.num_crtc; i++) { 1416 struct drm_crtc *crtc = state->crtcs[i]; 1417 1418 if (!crtc) 1419 continue; 1420 1421 crtc->state->state = state; 1422 swap(state->crtc_states[i], crtc->state); 1423 crtc->state->state = NULL; 1424 } 1425 1426 for (i = 0; i < dev->mode_config.num_total_plane; i++) { 1427 struct drm_plane *plane = state->planes[i]; 1428 1429 if (!plane) 1430 continue; 1431 1432 plane->state->state = state; 1433 swap(state->plane_states[i], plane->state); 1434 plane->state->state = NULL; 1435 } 1436 } 1437 EXPORT_SYMBOL(drm_atomic_helper_swap_state); 1438 1439 /** 1440 * drm_atomic_helper_update_plane - Helper for primary plane update using atomic 1441 * @plane: plane object to update 1442 * @crtc: owning CRTC of owning plane 1443 * @fb: framebuffer to flip onto plane 1444 * @crtc_x: x offset of primary plane on crtc 1445 * @crtc_y: y offset of primary plane on crtc 1446 * @crtc_w: width of primary plane rectangle on crtc 1447 * @crtc_h: height of primary plane rectangle on crtc 1448 * @src_x: x offset of @fb for panning 1449 * @src_y: y offset of @fb for panning 1450 * @src_w: width of source rectangle in @fb 1451 * @src_h: height of source rectangle in @fb 1452 * 1453 * Provides a default plane update handler using the atomic driver interface. 1454 * 1455 * RETURNS: 1456 * Zero on success, error code on failure 1457 */ 1458 int drm_atomic_helper_update_plane(struct drm_plane *plane, 1459 struct drm_crtc *crtc, 1460 struct drm_framebuffer *fb, 1461 int crtc_x, int crtc_y, 1462 unsigned int crtc_w, unsigned int crtc_h, 1463 uint32_t src_x, uint32_t src_y, 1464 uint32_t src_w, uint32_t src_h) 1465 { 1466 struct drm_atomic_state *state; 1467 struct drm_plane_state *plane_state; 1468 int ret = 0; 1469 1470 state = drm_atomic_state_alloc(plane->dev); 1471 if (!state) 1472 return -ENOMEM; 1473 1474 state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc); 1475 retry: 1476 plane_state = drm_atomic_get_plane_state(state, plane); 1477 if (IS_ERR(plane_state)) { 1478 ret = PTR_ERR(plane_state); 1479 goto fail; 1480 } 1481 1482 ret = drm_atomic_set_crtc_for_plane(plane_state, crtc); 1483 if (ret != 0) 1484 goto fail; 1485 drm_atomic_set_fb_for_plane(plane_state, fb); 1486 plane_state->crtc_x = crtc_x; 1487 plane_state->crtc_y = crtc_y; 1488 plane_state->crtc_h = crtc_h; 1489 plane_state->crtc_w = crtc_w; 1490 plane_state->src_x = src_x; 1491 plane_state->src_y = src_y; 1492 plane_state->src_h = src_h; 1493 plane_state->src_w = src_w; 1494 1495 if (plane == crtc->cursor) 1496 state->legacy_cursor_update = true; 1497 1498 ret = drm_atomic_commit(state); 1499 if (ret != 0) 1500 goto fail; 1501 1502 /* Driver takes ownership of state on successful commit. */ 1503 return 0; 1504 fail: 1505 if (ret == -EDEADLK) 1506 goto backoff; 1507 1508 drm_atomic_state_free(state); 1509 1510 return ret; 1511 backoff: 1512 drm_atomic_state_clear(state); 1513 drm_atomic_legacy_backoff(state); 1514 1515 /* 1516 * Someone might have exchanged the framebuffer while we dropped locks 1517 * in the backoff code. We need to fix up the fb refcount tracking the 1518 * core does for us. 1519 */ 1520 plane->old_fb = plane->fb; 1521 1522 goto retry; 1523 } 1524 EXPORT_SYMBOL(drm_atomic_helper_update_plane); 1525 1526 /** 1527 * drm_atomic_helper_disable_plane - Helper for primary plane disable using * atomic 1528 * @plane: plane to disable 1529 * 1530 * Provides a default plane disable handler using the atomic driver interface. 1531 * 1532 * RETURNS: 1533 * Zero on success, error code on failure 1534 */ 1535 int drm_atomic_helper_disable_plane(struct drm_plane *plane) 1536 { 1537 struct drm_atomic_state *state; 1538 struct drm_plane_state *plane_state; 1539 int ret = 0; 1540 1541 /* 1542 * FIXME: Without plane->crtc set we can't get at the implicit legacy 1543 * acquire context. The real fix will be to wire the acquire ctx through 1544 * everywhere we need it, but meanwhile prevent chaos by just skipping 1545 * this noop. The critical case is the cursor ioctls which a) only grab 1546 * crtc/cursor-plane locks (so we need the crtc to get at the right 1547 * acquire context) and b) can try to disable the plane multiple times. 1548 */ 1549 if (!plane->crtc) 1550 return 0; 1551 1552 state = drm_atomic_state_alloc(plane->dev); 1553 if (!state) 1554 return -ENOMEM; 1555 1556 state->acquire_ctx = drm_modeset_legacy_acquire_ctx(plane->crtc); 1557 retry: 1558 plane_state = drm_atomic_get_plane_state(state, plane); 1559 if (IS_ERR(plane_state)) { 1560 ret = PTR_ERR(plane_state); 1561 goto fail; 1562 } 1563 1564 if (plane_state->crtc && (plane == plane->crtc->cursor)) 1565 plane_state->state->legacy_cursor_update = true; 1566 1567 ret = __drm_atomic_helper_disable_plane(plane, plane_state); 1568 if (ret != 0) 1569 goto fail; 1570 1571 ret = drm_atomic_commit(state); 1572 if (ret != 0) 1573 goto fail; 1574 1575 /* Driver takes ownership of state on successful commit. */ 1576 return 0; 1577 fail: 1578 if (ret == -EDEADLK) 1579 goto backoff; 1580 1581 drm_atomic_state_free(state); 1582 1583 return ret; 1584 backoff: 1585 drm_atomic_state_clear(state); 1586 drm_atomic_legacy_backoff(state); 1587 1588 /* 1589 * Someone might have exchanged the framebuffer while we dropped locks 1590 * in the backoff code. We need to fix up the fb refcount tracking the 1591 * core does for us. 1592 */ 1593 plane->old_fb = plane->fb; 1594 1595 goto retry; 1596 } 1597 EXPORT_SYMBOL(drm_atomic_helper_disable_plane); 1598 1599 /* just used from fb-helper and atomic-helper: */ 1600 int __drm_atomic_helper_disable_plane(struct drm_plane *plane, 1601 struct drm_plane_state *plane_state) 1602 { 1603 int ret; 1604 1605 ret = drm_atomic_set_crtc_for_plane(plane_state, NULL); 1606 if (ret != 0) 1607 return ret; 1608 1609 drm_atomic_set_fb_for_plane(plane_state, NULL); 1610 plane_state->crtc_x = 0; 1611 plane_state->crtc_y = 0; 1612 plane_state->crtc_h = 0; 1613 plane_state->crtc_w = 0; 1614 plane_state->src_x = 0; 1615 plane_state->src_y = 0; 1616 plane_state->src_h = 0; 1617 plane_state->src_w = 0; 1618 1619 return 0; 1620 } 1621 1622 static int update_output_state(struct drm_atomic_state *state, 1623 struct drm_mode_set *set) 1624 { 1625 struct drm_device *dev = set->crtc->dev; 1626 struct drm_crtc *crtc; 1627 struct drm_crtc_state *crtc_state; 1628 struct drm_connector *connector; 1629 struct drm_connector_state *conn_state; 1630 int ret, i, j; 1631 1632 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, 1633 state->acquire_ctx); 1634 if (ret) 1635 return ret; 1636 1637 /* First grab all affected connector/crtc states. */ 1638 for (i = 0; i < set->num_connectors; i++) { 1639 conn_state = drm_atomic_get_connector_state(state, 1640 set->connectors[i]); 1641 if (IS_ERR(conn_state)) 1642 return PTR_ERR(conn_state); 1643 } 1644 1645 for_each_crtc_in_state(state, crtc, crtc_state, i) { 1646 ret = drm_atomic_add_affected_connectors(state, crtc); 1647 if (ret) 1648 return ret; 1649 } 1650 1651 /* Then recompute connector->crtc links and crtc enabling state. */ 1652 for_each_connector_in_state(state, connector, conn_state, i) { 1653 if (conn_state->crtc == set->crtc) { 1654 ret = drm_atomic_set_crtc_for_connector(conn_state, 1655 NULL); 1656 if (ret) 1657 return ret; 1658 } 1659 1660 for (j = 0; j < set->num_connectors; j++) { 1661 if (set->connectors[j] == connector) { 1662 ret = drm_atomic_set_crtc_for_connector(conn_state, 1663 set->crtc); 1664 if (ret) 1665 return ret; 1666 break; 1667 } 1668 } 1669 } 1670 1671 for_each_crtc_in_state(state, crtc, crtc_state, i) { 1672 /* Don't update ->enable for the CRTC in the set_config request, 1673 * since a mismatch would indicate a bug in the upper layers. 1674 * The actual modeset code later on will catch any 1675 * inconsistencies here. */ 1676 if (crtc == set->crtc) 1677 continue; 1678 1679 if (!drm_atomic_connectors_for_crtc(state, crtc)) { 1680 ret = drm_atomic_set_mode_prop_for_crtc(crtc_state, 1681 NULL); 1682 if (ret < 0) 1683 return ret; 1684 1685 crtc_state->active = false; 1686 } 1687 } 1688 1689 return 0; 1690 } 1691 1692 /** 1693 * drm_atomic_helper_set_config - set a new config from userspace 1694 * @set: mode set configuration 1695 * 1696 * Provides a default crtc set_config handler using the atomic driver interface. 1697 * 1698 * Returns: 1699 * Returns 0 on success, negative errno numbers on failure. 1700 */ 1701 int drm_atomic_helper_set_config(struct drm_mode_set *set) 1702 { 1703 struct drm_atomic_state *state; 1704 struct drm_crtc *crtc = set->crtc; 1705 int ret = 0; 1706 1707 state = drm_atomic_state_alloc(crtc->dev); 1708 if (!state) 1709 return -ENOMEM; 1710 1711 state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc); 1712 retry: 1713 ret = __drm_atomic_helper_set_config(set, state); 1714 if (ret != 0) 1715 goto fail; 1716 1717 ret = drm_atomic_commit(state); 1718 if (ret != 0) 1719 goto fail; 1720 1721 /* Driver takes ownership of state on successful commit. */ 1722 return 0; 1723 fail: 1724 if (ret == -EDEADLK) 1725 goto backoff; 1726 1727 drm_atomic_state_free(state); 1728 1729 return ret; 1730 backoff: 1731 drm_atomic_state_clear(state); 1732 drm_atomic_legacy_backoff(state); 1733 1734 /* 1735 * Someone might have exchanged the framebuffer while we dropped locks 1736 * in the backoff code. We need to fix up the fb refcount tracking the 1737 * core does for us. 1738 */ 1739 crtc->primary->old_fb = crtc->primary->fb; 1740 1741 goto retry; 1742 } 1743 EXPORT_SYMBOL(drm_atomic_helper_set_config); 1744 1745 /* just used from fb-helper and atomic-helper: */ 1746 int __drm_atomic_helper_set_config(struct drm_mode_set *set, 1747 struct drm_atomic_state *state) 1748 { 1749 struct drm_crtc_state *crtc_state; 1750 struct drm_plane_state *primary_state; 1751 struct drm_crtc *crtc = set->crtc; 1752 int hdisplay, vdisplay; 1753 int ret; 1754 1755 crtc_state = drm_atomic_get_crtc_state(state, crtc); 1756 if (IS_ERR(crtc_state)) 1757 return PTR_ERR(crtc_state); 1758 1759 primary_state = drm_atomic_get_plane_state(state, crtc->primary); 1760 if (IS_ERR(primary_state)) 1761 return PTR_ERR(primary_state); 1762 1763 if (!set->mode) { 1764 WARN_ON(set->fb); 1765 WARN_ON(set->num_connectors); 1766 1767 ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL); 1768 if (ret != 0) 1769 return ret; 1770 1771 crtc_state->active = false; 1772 1773 ret = drm_atomic_set_crtc_for_plane(primary_state, NULL); 1774 if (ret != 0) 1775 return ret; 1776 1777 drm_atomic_set_fb_for_plane(primary_state, NULL); 1778 1779 goto commit; 1780 } 1781 1782 WARN_ON(!set->fb); 1783 WARN_ON(!set->num_connectors); 1784 1785 ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode); 1786 if (ret != 0) 1787 return ret; 1788 1789 crtc_state->active = true; 1790 1791 ret = drm_atomic_set_crtc_for_plane(primary_state, crtc); 1792 if (ret != 0) 1793 return ret; 1794 1795 drm_crtc_get_hv_timing(set->mode, &hdisplay, &vdisplay); 1796 1797 drm_atomic_set_fb_for_plane(primary_state, set->fb); 1798 primary_state->crtc_x = 0; 1799 primary_state->crtc_y = 0; 1800 primary_state->crtc_h = vdisplay; 1801 primary_state->crtc_w = hdisplay; 1802 primary_state->src_x = set->x << 16; 1803 primary_state->src_y = set->y << 16; 1804 if (primary_state->rotation & (BIT(DRM_ROTATE_90) | BIT(DRM_ROTATE_270))) { 1805 primary_state->src_h = hdisplay << 16; 1806 primary_state->src_w = vdisplay << 16; 1807 } else { 1808 primary_state->src_h = vdisplay << 16; 1809 primary_state->src_w = hdisplay << 16; 1810 } 1811 1812 commit: 1813 ret = update_output_state(state, set); 1814 if (ret) 1815 return ret; 1816 1817 return 0; 1818 } 1819 1820 /** 1821 * drm_atomic_helper_crtc_set_property - helper for crtc properties 1822 * @crtc: DRM crtc 1823 * @property: DRM property 1824 * @val: value of property 1825 * 1826 * Provides a default crtc set_property handler using the atomic driver 1827 * interface. 1828 * 1829 * RETURNS: 1830 * Zero on success, error code on failure 1831 */ 1832 int 1833 drm_atomic_helper_crtc_set_property(struct drm_crtc *crtc, 1834 struct drm_property *property, 1835 uint64_t val) 1836 { 1837 struct drm_atomic_state *state; 1838 struct drm_crtc_state *crtc_state; 1839 int ret = 0; 1840 1841 state = drm_atomic_state_alloc(crtc->dev); 1842 if (!state) 1843 return -ENOMEM; 1844 1845 /* ->set_property is always called with all locks held. */ 1846 state->acquire_ctx = crtc->dev->mode_config.acquire_ctx; 1847 retry: 1848 crtc_state = drm_atomic_get_crtc_state(state, crtc); 1849 if (IS_ERR(crtc_state)) { 1850 ret = PTR_ERR(crtc_state); 1851 goto fail; 1852 } 1853 1854 ret = drm_atomic_crtc_set_property(crtc, crtc_state, 1855 property, val); 1856 if (ret) 1857 goto fail; 1858 1859 ret = drm_atomic_commit(state); 1860 if (ret != 0) 1861 goto fail; 1862 1863 /* Driver takes ownership of state on successful commit. */ 1864 return 0; 1865 fail: 1866 if (ret == -EDEADLK) 1867 goto backoff; 1868 1869 drm_atomic_state_free(state); 1870 1871 return ret; 1872 backoff: 1873 drm_atomic_state_clear(state); 1874 drm_atomic_legacy_backoff(state); 1875 1876 goto retry; 1877 } 1878 EXPORT_SYMBOL(drm_atomic_helper_crtc_set_property); 1879 1880 /** 1881 * drm_atomic_helper_plane_set_property - helper for plane properties 1882 * @plane: DRM plane 1883 * @property: DRM property 1884 * @val: value of property 1885 * 1886 * Provides a default plane set_property handler using the atomic driver 1887 * interface. 1888 * 1889 * RETURNS: 1890 * Zero on success, error code on failure 1891 */ 1892 int 1893 drm_atomic_helper_plane_set_property(struct drm_plane *plane, 1894 struct drm_property *property, 1895 uint64_t val) 1896 { 1897 struct drm_atomic_state *state; 1898 struct drm_plane_state *plane_state; 1899 int ret = 0; 1900 1901 state = drm_atomic_state_alloc(plane->dev); 1902 if (!state) 1903 return -ENOMEM; 1904 1905 /* ->set_property is always called with all locks held. */ 1906 state->acquire_ctx = plane->dev->mode_config.acquire_ctx; 1907 retry: 1908 plane_state = drm_atomic_get_plane_state(state, plane); 1909 if (IS_ERR(plane_state)) { 1910 ret = PTR_ERR(plane_state); 1911 goto fail; 1912 } 1913 1914 ret = drm_atomic_plane_set_property(plane, plane_state, 1915 property, val); 1916 if (ret) 1917 goto fail; 1918 1919 ret = drm_atomic_commit(state); 1920 if (ret != 0) 1921 goto fail; 1922 1923 /* Driver takes ownership of state on successful commit. */ 1924 return 0; 1925 fail: 1926 if (ret == -EDEADLK) 1927 goto backoff; 1928 1929 drm_atomic_state_free(state); 1930 1931 return ret; 1932 backoff: 1933 drm_atomic_state_clear(state); 1934 drm_atomic_legacy_backoff(state); 1935 1936 goto retry; 1937 } 1938 EXPORT_SYMBOL(drm_atomic_helper_plane_set_property); 1939 1940 /** 1941 * drm_atomic_helper_connector_set_property - helper for connector properties 1942 * @connector: DRM connector 1943 * @property: DRM property 1944 * @val: value of property 1945 * 1946 * Provides a default connector set_property handler using the atomic driver 1947 * interface. 1948 * 1949 * RETURNS: 1950 * Zero on success, error code on failure 1951 */ 1952 int 1953 drm_atomic_helper_connector_set_property(struct drm_connector *connector, 1954 struct drm_property *property, 1955 uint64_t val) 1956 { 1957 struct drm_atomic_state *state; 1958 struct drm_connector_state *connector_state; 1959 int ret = 0; 1960 1961 state = drm_atomic_state_alloc(connector->dev); 1962 if (!state) 1963 return -ENOMEM; 1964 1965 /* ->set_property is always called with all locks held. */ 1966 state->acquire_ctx = connector->dev->mode_config.acquire_ctx; 1967 retry: 1968 connector_state = drm_atomic_get_connector_state(state, connector); 1969 if (IS_ERR(connector_state)) { 1970 ret = PTR_ERR(connector_state); 1971 goto fail; 1972 } 1973 1974 ret = drm_atomic_connector_set_property(connector, connector_state, 1975 property, val); 1976 if (ret) 1977 goto fail; 1978 1979 ret = drm_atomic_commit(state); 1980 if (ret != 0) 1981 goto fail; 1982 1983 /* Driver takes ownership of state on successful commit. */ 1984 return 0; 1985 fail: 1986 if (ret == -EDEADLK) 1987 goto backoff; 1988 1989 drm_atomic_state_free(state); 1990 1991 return ret; 1992 backoff: 1993 drm_atomic_state_clear(state); 1994 drm_atomic_legacy_backoff(state); 1995 1996 goto retry; 1997 } 1998 EXPORT_SYMBOL(drm_atomic_helper_connector_set_property); 1999 2000 /** 2001 * drm_atomic_helper_page_flip - execute a legacy page flip 2002 * @crtc: DRM crtc 2003 * @fb: DRM framebuffer 2004 * @event: optional DRM event to signal upon completion 2005 * @flags: flip flags for non-vblank sync'ed updates 2006 * 2007 * Provides a default page flip implementation using the atomic driver interface. 2008 * 2009 * Note that for now so called async page flips (i.e. updates which are not 2010 * synchronized to vblank) are not supported, since the atomic interfaces have 2011 * no provisions for this yet. 2012 * 2013 * Returns: 2014 * Returns 0 on success, negative errno numbers on failure. 2015 */ 2016 int drm_atomic_helper_page_flip(struct drm_crtc *crtc, 2017 struct drm_framebuffer *fb, 2018 struct drm_pending_vblank_event *event, 2019 uint32_t flags) 2020 { 2021 struct drm_plane *plane = crtc->primary; 2022 struct drm_atomic_state *state; 2023 struct drm_plane_state *plane_state; 2024 struct drm_crtc_state *crtc_state; 2025 int ret = 0; 2026 2027 if (flags & DRM_MODE_PAGE_FLIP_ASYNC) 2028 return -EINVAL; 2029 2030 state = drm_atomic_state_alloc(plane->dev); 2031 if (!state) 2032 return -ENOMEM; 2033 2034 state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc); 2035 retry: 2036 crtc_state = drm_atomic_get_crtc_state(state, crtc); 2037 if (IS_ERR(crtc_state)) { 2038 ret = PTR_ERR(crtc_state); 2039 goto fail; 2040 } 2041 crtc_state->event = event; 2042 2043 plane_state = drm_atomic_get_plane_state(state, plane); 2044 if (IS_ERR(plane_state)) { 2045 ret = PTR_ERR(plane_state); 2046 goto fail; 2047 } 2048 2049 ret = drm_atomic_set_crtc_for_plane(plane_state, crtc); 2050 if (ret != 0) 2051 goto fail; 2052 drm_atomic_set_fb_for_plane(plane_state, fb); 2053 2054 ret = drm_atomic_async_commit(state); 2055 if (ret != 0) 2056 goto fail; 2057 2058 /* Driver takes ownership of state on successful async commit. */ 2059 return 0; 2060 fail: 2061 if (ret == -EDEADLK) 2062 goto backoff; 2063 2064 drm_atomic_state_free(state); 2065 2066 return ret; 2067 backoff: 2068 drm_atomic_state_clear(state); 2069 drm_atomic_legacy_backoff(state); 2070 2071 /* 2072 * Someone might have exchanged the framebuffer while we dropped locks 2073 * in the backoff code. We need to fix up the fb refcount tracking the 2074 * core does for us. 2075 */ 2076 plane->old_fb = plane->fb; 2077 2078 goto retry; 2079 } 2080 EXPORT_SYMBOL(drm_atomic_helper_page_flip); 2081 2082 /** 2083 * drm_atomic_helper_connector_dpms() - connector dpms helper implementation 2084 * @connector: affected connector 2085 * @mode: DPMS mode 2086 * 2087 * This is the main helper function provided by the atomic helper framework for 2088 * implementing the legacy DPMS connector interface. It computes the new desired 2089 * ->active state for the corresponding CRTC (if the connector is enabled) and 2090 * updates it. 2091 * 2092 * Returns: 2093 * Returns 0 on success, negative errno numbers on failure. 2094 */ 2095 int drm_atomic_helper_connector_dpms(struct drm_connector *connector, 2096 int mode) 2097 { 2098 struct drm_mode_config *config = &connector->dev->mode_config; 2099 struct drm_atomic_state *state; 2100 struct drm_crtc_state *crtc_state; 2101 struct drm_crtc *crtc; 2102 struct drm_connector *tmp_connector; 2103 int ret; 2104 bool active = false; 2105 int old_mode = connector->dpms; 2106 2107 if (mode != DRM_MODE_DPMS_ON) 2108 mode = DRM_MODE_DPMS_OFF; 2109 2110 connector->dpms = mode; 2111 crtc = connector->state->crtc; 2112 2113 if (!crtc) 2114 return 0; 2115 2116 state = drm_atomic_state_alloc(connector->dev); 2117 if (!state) 2118 return -ENOMEM; 2119 2120 state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc); 2121 retry: 2122 crtc_state = drm_atomic_get_crtc_state(state, crtc); 2123 if (IS_ERR(crtc_state)) { 2124 ret = PTR_ERR(crtc_state); 2125 goto fail; 2126 } 2127 2128 WARN_ON(!drm_modeset_is_locked(&config->connection_mutex)); 2129 2130 drm_for_each_connector(tmp_connector, connector->dev) { 2131 if (tmp_connector->state->crtc != crtc) 2132 continue; 2133 2134 if (tmp_connector->dpms == DRM_MODE_DPMS_ON) { 2135 active = true; 2136 break; 2137 } 2138 } 2139 crtc_state->active = active; 2140 2141 ret = drm_atomic_commit(state); 2142 if (ret != 0) 2143 goto fail; 2144 2145 /* Driver takes ownership of state on successful commit. */ 2146 return 0; 2147 fail: 2148 if (ret == -EDEADLK) 2149 goto backoff; 2150 2151 connector->dpms = old_mode; 2152 drm_atomic_state_free(state); 2153 2154 return ret; 2155 backoff: 2156 drm_atomic_state_clear(state); 2157 drm_atomic_legacy_backoff(state); 2158 2159 goto retry; 2160 } 2161 EXPORT_SYMBOL(drm_atomic_helper_connector_dpms); 2162 2163 /** 2164 * DOC: atomic state reset and initialization 2165 * 2166 * Both the drm core and the atomic helpers assume that there is always the full 2167 * and correct atomic software state for all connectors, CRTCs and planes 2168 * available. Which is a bit a problem on driver load and also after system 2169 * suspend. One way to solve this is to have a hardware state read-out 2170 * infrastructure which reconstructs the full software state (e.g. the i915 2171 * driver). 2172 * 2173 * The simpler solution is to just reset the software state to everything off, 2174 * which is easiest to do by calling drm_mode_config_reset(). To facilitate this 2175 * the atomic helpers provide default reset implementations for all hooks. 2176 */ 2177 2178 /** 2179 * drm_atomic_helper_crtc_reset - default ->reset hook for CRTCs 2180 * @crtc: drm CRTC 2181 * 2182 * Resets the atomic state for @crtc by freeing the state pointer (which might 2183 * be NULL, e.g. at driver load time) and allocating a new empty state object. 2184 */ 2185 void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc) 2186 { 2187 if (crtc->state && crtc->state->mode_blob) 2188 drm_property_unreference_blob(crtc->state->mode_blob); 2189 kfree(crtc->state); 2190 crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL); 2191 2192 if (crtc->state) 2193 crtc->state->crtc = crtc; 2194 } 2195 EXPORT_SYMBOL(drm_atomic_helper_crtc_reset); 2196 2197 /** 2198 * __drm_atomic_helper_crtc_duplicate_state - copy atomic CRTC state 2199 * @crtc: CRTC object 2200 * @state: atomic CRTC state 2201 * 2202 * Copies atomic state from a CRTC's current state and resets inferred values. 2203 * This is useful for drivers that subclass the CRTC state. 2204 */ 2205 void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc, 2206 struct drm_crtc_state *state) 2207 { 2208 memcpy(state, crtc->state, sizeof(*state)); 2209 2210 if (state->mode_blob) 2211 drm_property_reference_blob(state->mode_blob); 2212 state->mode_changed = false; 2213 state->active_changed = false; 2214 state->planes_changed = false; 2215 state->connectors_changed = false; 2216 state->event = NULL; 2217 } 2218 EXPORT_SYMBOL(__drm_atomic_helper_crtc_duplicate_state); 2219 2220 /** 2221 * drm_atomic_helper_crtc_duplicate_state - default state duplicate hook 2222 * @crtc: drm CRTC 2223 * 2224 * Default CRTC state duplicate hook for drivers which don't have their own 2225 * subclassed CRTC state structure. 2226 */ 2227 struct drm_crtc_state * 2228 drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc) 2229 { 2230 struct drm_crtc_state *state; 2231 2232 if (WARN_ON(!crtc->state)) 2233 return NULL; 2234 2235 state = kmalloc(sizeof(*state), GFP_KERNEL); 2236 if (state) 2237 __drm_atomic_helper_crtc_duplicate_state(crtc, state); 2238 2239 return state; 2240 } 2241 EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state); 2242 2243 /** 2244 * __drm_atomic_helper_crtc_destroy_state - release CRTC state 2245 * @crtc: CRTC object 2246 * @state: CRTC state object to release 2247 * 2248 * Releases all resources stored in the CRTC state without actually freeing 2249 * the memory of the CRTC state. This is useful for drivers that subclass the 2250 * CRTC state. 2251 */ 2252 void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc, 2253 struct drm_crtc_state *state) 2254 { 2255 if (state->mode_blob) 2256 drm_property_unreference_blob(state->mode_blob); 2257 } 2258 EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state); 2259 2260 /** 2261 * drm_atomic_helper_crtc_destroy_state - default state destroy hook 2262 * @crtc: drm CRTC 2263 * @state: CRTC state object to release 2264 * 2265 * Default CRTC state destroy hook for drivers which don't have their own 2266 * subclassed CRTC state structure. 2267 */ 2268 void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc, 2269 struct drm_crtc_state *state) 2270 { 2271 __drm_atomic_helper_crtc_destroy_state(crtc, state); 2272 kfree(state); 2273 } 2274 EXPORT_SYMBOL(drm_atomic_helper_crtc_destroy_state); 2275 2276 /** 2277 * drm_atomic_helper_plane_reset - default ->reset hook for planes 2278 * @plane: drm plane 2279 * 2280 * Resets the atomic state for @plane by freeing the state pointer (which might 2281 * be NULL, e.g. at driver load time) and allocating a new empty state object. 2282 */ 2283 void drm_atomic_helper_plane_reset(struct drm_plane *plane) 2284 { 2285 if (plane->state && plane->state->fb) 2286 drm_framebuffer_unreference(plane->state->fb); 2287 2288 kfree(plane->state); 2289 plane->state = kzalloc(sizeof(*plane->state), GFP_KERNEL); 2290 2291 if (plane->state) 2292 plane->state->plane = plane; 2293 } 2294 EXPORT_SYMBOL(drm_atomic_helper_plane_reset); 2295 2296 /** 2297 * __drm_atomic_helper_plane_duplicate_state - copy atomic plane state 2298 * @plane: plane object 2299 * @state: atomic plane state 2300 * 2301 * Copies atomic state from a plane's current state. This is useful for 2302 * drivers that subclass the plane state. 2303 */ 2304 void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane, 2305 struct drm_plane_state *state) 2306 { 2307 memcpy(state, plane->state, sizeof(*state)); 2308 2309 if (state->fb) 2310 drm_framebuffer_reference(state->fb); 2311 } 2312 EXPORT_SYMBOL(__drm_atomic_helper_plane_duplicate_state); 2313 2314 /** 2315 * drm_atomic_helper_plane_duplicate_state - default state duplicate hook 2316 * @plane: drm plane 2317 * 2318 * Default plane state duplicate hook for drivers which don't have their own 2319 * subclassed plane state structure. 2320 */ 2321 struct drm_plane_state * 2322 drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane) 2323 { 2324 struct drm_plane_state *state; 2325 2326 if (WARN_ON(!plane->state)) 2327 return NULL; 2328 2329 state = kmalloc(sizeof(*state), GFP_KERNEL); 2330 if (state) 2331 __drm_atomic_helper_plane_duplicate_state(plane, state); 2332 2333 return state; 2334 } 2335 EXPORT_SYMBOL(drm_atomic_helper_plane_duplicate_state); 2336 2337 /** 2338 * __drm_atomic_helper_plane_destroy_state - release plane state 2339 * @plane: plane object 2340 * @state: plane state object to release 2341 * 2342 * Releases all resources stored in the plane state without actually freeing 2343 * the memory of the plane state. This is useful for drivers that subclass the 2344 * plane state. 2345 */ 2346 void __drm_atomic_helper_plane_destroy_state(struct drm_plane *plane, 2347 struct drm_plane_state *state) 2348 { 2349 if (state->fb) 2350 drm_framebuffer_unreference(state->fb); 2351 } 2352 EXPORT_SYMBOL(__drm_atomic_helper_plane_destroy_state); 2353 2354 /** 2355 * drm_atomic_helper_plane_destroy_state - default state destroy hook 2356 * @plane: drm plane 2357 * @state: plane state object to release 2358 * 2359 * Default plane state destroy hook for drivers which don't have their own 2360 * subclassed plane state structure. 2361 */ 2362 void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane, 2363 struct drm_plane_state *state) 2364 { 2365 __drm_atomic_helper_plane_destroy_state(plane, state); 2366 kfree(state); 2367 } 2368 EXPORT_SYMBOL(drm_atomic_helper_plane_destroy_state); 2369 2370 /** 2371 * drm_atomic_helper_connector_reset - default ->reset hook for connectors 2372 * @connector: drm connector 2373 * 2374 * Resets the atomic state for @connector by freeing the state pointer (which 2375 * might be NULL, e.g. at driver load time) and allocating a new empty state 2376 * object. 2377 */ 2378 void drm_atomic_helper_connector_reset(struct drm_connector *connector) 2379 { 2380 kfree(connector->state); 2381 connector->state = kzalloc(sizeof(*connector->state), GFP_KERNEL); 2382 2383 if (connector->state) 2384 connector->state->connector = connector; 2385 } 2386 EXPORT_SYMBOL(drm_atomic_helper_connector_reset); 2387 2388 /** 2389 * __drm_atomic_helper_connector_duplicate_state - copy atomic connector state 2390 * @connector: connector object 2391 * @state: atomic connector state 2392 * 2393 * Copies atomic state from a connector's current state. This is useful for 2394 * drivers that subclass the connector state. 2395 */ 2396 void 2397 __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector, 2398 struct drm_connector_state *state) 2399 { 2400 memcpy(state, connector->state, sizeof(*state)); 2401 } 2402 EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state); 2403 2404 /** 2405 * drm_atomic_helper_connector_duplicate_state - default state duplicate hook 2406 * @connector: drm connector 2407 * 2408 * Default connector state duplicate hook for drivers which don't have their own 2409 * subclassed connector state structure. 2410 */ 2411 struct drm_connector_state * 2412 drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector) 2413 { 2414 struct drm_connector_state *state; 2415 2416 if (WARN_ON(!connector->state)) 2417 return NULL; 2418 2419 state = kmalloc(sizeof(*state), GFP_KERNEL); 2420 if (state) 2421 __drm_atomic_helper_connector_duplicate_state(connector, state); 2422 2423 return state; 2424 } 2425 EXPORT_SYMBOL(drm_atomic_helper_connector_duplicate_state); 2426 2427 /** 2428 * drm_atomic_helper_duplicate_state - duplicate an atomic state object 2429 * @dev: DRM device 2430 * @ctx: lock acquisition context 2431 * 2432 * Makes a copy of the current atomic state by looping over all objects and 2433 * duplicating their respective states. 2434 * 2435 * Note that this treats atomic state as persistent between save and restore. 2436 * Drivers must make sure that this is possible and won't result in confusion 2437 * or erroneous behaviour. 2438 * 2439 * Note that if callers haven't already acquired all modeset locks this might 2440 * return -EDEADLK, which must be handled by calling drm_modeset_backoff(). 2441 * 2442 * Returns: 2443 * A pointer to the copy of the atomic state object on success or an 2444 * ERR_PTR()-encoded error code on failure. 2445 */ 2446 struct drm_atomic_state * 2447 drm_atomic_helper_duplicate_state(struct drm_device *dev, 2448 struct drm_modeset_acquire_ctx *ctx) 2449 { 2450 struct drm_atomic_state *state; 2451 struct drm_connector *conn; 2452 struct drm_plane *plane; 2453 struct drm_crtc *crtc; 2454 int err = 0; 2455 2456 state = drm_atomic_state_alloc(dev); 2457 if (!state) 2458 return ERR_PTR(-ENOMEM); 2459 2460 state->acquire_ctx = ctx; 2461 2462 drm_for_each_crtc(crtc, dev) { 2463 struct drm_crtc_state *crtc_state; 2464 2465 crtc_state = drm_atomic_get_crtc_state(state, crtc); 2466 if (IS_ERR(crtc_state)) { 2467 err = PTR_ERR(crtc_state); 2468 goto free; 2469 } 2470 } 2471 2472 drm_for_each_plane(plane, dev) { 2473 struct drm_plane_state *plane_state; 2474 2475 plane_state = drm_atomic_get_plane_state(state, plane); 2476 if (IS_ERR(plane_state)) { 2477 err = PTR_ERR(plane_state); 2478 goto free; 2479 } 2480 } 2481 2482 drm_for_each_connector(conn, dev) { 2483 struct drm_connector_state *conn_state; 2484 2485 conn_state = drm_atomic_get_connector_state(state, conn); 2486 if (IS_ERR(conn_state)) { 2487 err = PTR_ERR(conn_state); 2488 goto free; 2489 } 2490 } 2491 2492 /* clear the acquire context so that it isn't accidentally reused */ 2493 state->acquire_ctx = NULL; 2494 2495 free: 2496 if (err < 0) { 2497 drm_atomic_state_free(state); 2498 state = ERR_PTR(err); 2499 } 2500 2501 return state; 2502 } 2503 EXPORT_SYMBOL(drm_atomic_helper_duplicate_state); 2504 2505 /** 2506 * __drm_atomic_helper_connector_destroy_state - release connector state 2507 * @connector: connector object 2508 * @state: connector state object to release 2509 * 2510 * Releases all resources stored in the connector state without actually 2511 * freeing the memory of the connector state. This is useful for drivers that 2512 * subclass the connector state. 2513 */ 2514 void 2515 __drm_atomic_helper_connector_destroy_state(struct drm_connector *connector, 2516 struct drm_connector_state *state) 2517 { 2518 /* 2519 * This is currently a placeholder so that drivers that subclass the 2520 * state will automatically do the right thing if code is ever added 2521 * to this function. 2522 */ 2523 } 2524 EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state); 2525 2526 /** 2527 * drm_atomic_helper_connector_destroy_state - default state destroy hook 2528 * @connector: drm connector 2529 * @state: connector state object to release 2530 * 2531 * Default connector state destroy hook for drivers which don't have their own 2532 * subclassed connector state structure. 2533 */ 2534 void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector, 2535 struct drm_connector_state *state) 2536 { 2537 __drm_atomic_helper_connector_destroy_state(connector, state); 2538 kfree(state); 2539 } 2540 EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state); 2541