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