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