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