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