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