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