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