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 29 #include <drm/drmP.h> 30 #include <drm/drm_atomic.h> 31 #include <drm/drm_plane_helper.h> 32 33 /** 34 * drm_atomic_state_default_release - 35 * release memory initialized by drm_atomic_state_init 36 * @state: atomic state 37 * 38 * Free all the memory allocated by drm_atomic_state_init. 39 * This is useful for drivers that subclass the atomic state. 40 */ 41 void drm_atomic_state_default_release(struct drm_atomic_state *state) 42 { 43 kfree(state->connectors); 44 kfree(state->connector_states); 45 kfree(state->crtcs); 46 kfree(state->crtc_states); 47 kfree(state->planes); 48 kfree(state->plane_states); 49 } 50 EXPORT_SYMBOL(drm_atomic_state_default_release); 51 52 /** 53 * drm_atomic_state_init - init new atomic state 54 * @dev: DRM device 55 * @state: atomic state 56 * 57 * Default implementation for filling in a new atomic state. 58 * This is useful for drivers that subclass the atomic state. 59 */ 60 int 61 drm_atomic_state_init(struct drm_device *dev, struct drm_atomic_state *state) 62 { 63 /* TODO legacy paths should maybe do a better job about 64 * setting this appropriately? 65 */ 66 state->allow_modeset = true; 67 68 state->num_connector = ACCESS_ONCE(dev->mode_config.num_connector); 69 70 state->crtcs = kcalloc(dev->mode_config.num_crtc, 71 sizeof(*state->crtcs), GFP_KERNEL); 72 if (!state->crtcs) 73 goto fail; 74 state->crtc_states = kcalloc(dev->mode_config.num_crtc, 75 sizeof(*state->crtc_states), GFP_KERNEL); 76 if (!state->crtc_states) 77 goto fail; 78 state->planes = kcalloc(dev->mode_config.num_total_plane, 79 sizeof(*state->planes), GFP_KERNEL); 80 if (!state->planes) 81 goto fail; 82 state->plane_states = kcalloc(dev->mode_config.num_total_plane, 83 sizeof(*state->plane_states), GFP_KERNEL); 84 if (!state->plane_states) 85 goto fail; 86 state->connectors = kcalloc(state->num_connector, 87 sizeof(*state->connectors), 88 GFP_KERNEL); 89 if (!state->connectors) 90 goto fail; 91 state->connector_states = kcalloc(state->num_connector, 92 sizeof(*state->connector_states), 93 GFP_KERNEL); 94 if (!state->connector_states) 95 goto fail; 96 97 state->dev = dev; 98 99 DRM_DEBUG_ATOMIC("Allocated atomic state %p\n", state); 100 101 return 0; 102 fail: 103 drm_atomic_state_default_release(state); 104 return -ENOMEM; 105 } 106 EXPORT_SYMBOL(drm_atomic_state_init); 107 108 /** 109 * drm_atomic_state_alloc - allocate atomic state 110 * @dev: DRM device 111 * 112 * This allocates an empty atomic state to track updates. 113 */ 114 struct drm_atomic_state * 115 drm_atomic_state_alloc(struct drm_device *dev) 116 { 117 struct drm_mode_config *config = &dev->mode_config; 118 struct drm_atomic_state *state; 119 120 if (!config->funcs->atomic_state_alloc) { 121 state = kzalloc(sizeof(*state), GFP_KERNEL); 122 if (!state) 123 return NULL; 124 if (drm_atomic_state_init(dev, state) < 0) { 125 kfree(state); 126 return NULL; 127 } 128 return state; 129 } 130 131 return config->funcs->atomic_state_alloc(dev); 132 } 133 EXPORT_SYMBOL(drm_atomic_state_alloc); 134 135 /** 136 * drm_atomic_state_default_clear - clear base atomic state 137 * @state: atomic state 138 * 139 * Default implementation for clearing atomic state. 140 * This is useful for drivers that subclass the atomic state. 141 */ 142 void drm_atomic_state_default_clear(struct drm_atomic_state *state) 143 { 144 struct drm_device *dev = state->dev; 145 struct drm_mode_config *config = &dev->mode_config; 146 int i; 147 148 DRM_DEBUG_ATOMIC("Clearing atomic state %p\n", state); 149 150 for (i = 0; i < state->num_connector; i++) { 151 struct drm_connector *connector = state->connectors[i]; 152 153 if (!connector) 154 continue; 155 156 /* 157 * FIXME: Async commits can race with connector unplugging and 158 * there's currently nothing that prevents cleanup up state for 159 * deleted connectors. As long as the callback doesn't look at 160 * the connector we'll be fine though, so make sure that's the 161 * case by setting all connector pointers to NULL. 162 */ 163 state->connector_states[i]->connector = NULL; 164 connector->funcs->atomic_destroy_state(NULL, 165 state->connector_states[i]); 166 state->connectors[i] = NULL; 167 state->connector_states[i] = NULL; 168 } 169 170 for (i = 0; i < config->num_crtc; i++) { 171 struct drm_crtc *crtc = state->crtcs[i]; 172 173 if (!crtc) 174 continue; 175 176 crtc->funcs->atomic_destroy_state(crtc, 177 state->crtc_states[i]); 178 state->crtcs[i] = NULL; 179 state->crtc_states[i] = NULL; 180 } 181 182 for (i = 0; i < config->num_total_plane; i++) { 183 struct drm_plane *plane = state->planes[i]; 184 185 if (!plane) 186 continue; 187 188 plane->funcs->atomic_destroy_state(plane, 189 state->plane_states[i]); 190 state->planes[i] = NULL; 191 state->plane_states[i] = NULL; 192 } 193 } 194 EXPORT_SYMBOL(drm_atomic_state_default_clear); 195 196 /** 197 * drm_atomic_state_clear - clear state object 198 * @state: atomic state 199 * 200 * When the w/w mutex algorithm detects a deadlock we need to back off and drop 201 * all locks. So someone else could sneak in and change the current modeset 202 * configuration. Which means that all the state assembled in @state is no 203 * longer an atomic update to the current state, but to some arbitrary earlier 204 * state. Which could break assumptions the driver's ->atomic_check likely 205 * relies on. 206 * 207 * Hence we must clear all cached state and completely start over, using this 208 * function. 209 */ 210 void drm_atomic_state_clear(struct drm_atomic_state *state) 211 { 212 struct drm_device *dev = state->dev; 213 struct drm_mode_config *config = &dev->mode_config; 214 215 if (config->funcs->atomic_state_clear) 216 config->funcs->atomic_state_clear(state); 217 else 218 drm_atomic_state_default_clear(state); 219 } 220 EXPORT_SYMBOL(drm_atomic_state_clear); 221 222 /** 223 * drm_atomic_state_free - free all memory for an atomic state 224 * @state: atomic state to deallocate 225 * 226 * This frees all memory associated with an atomic state, including all the 227 * per-object state for planes, crtcs and connectors. 228 */ 229 void drm_atomic_state_free(struct drm_atomic_state *state) 230 { 231 struct drm_device *dev; 232 struct drm_mode_config *config; 233 234 if (!state) 235 return; 236 237 dev = state->dev; 238 config = &dev->mode_config; 239 240 drm_atomic_state_clear(state); 241 242 DRM_DEBUG_ATOMIC("Freeing atomic state %p\n", state); 243 244 if (config->funcs->atomic_state_free) { 245 config->funcs->atomic_state_free(state); 246 } else { 247 drm_atomic_state_default_release(state); 248 kfree(state); 249 } 250 } 251 EXPORT_SYMBOL(drm_atomic_state_free); 252 253 /** 254 * drm_atomic_get_crtc_state - get crtc state 255 * @state: global atomic state object 256 * @crtc: crtc to get state object for 257 * 258 * This function returns the crtc state for the given crtc, allocating it if 259 * needed. It will also grab the relevant crtc lock to make sure that the state 260 * is consistent. 261 * 262 * Returns: 263 * 264 * Either the allocated state or the error code encoded into the pointer. When 265 * the error is EDEADLK then the w/w mutex code has detected a deadlock and the 266 * entire atomic sequence must be restarted. All other errors are fatal. 267 */ 268 struct drm_crtc_state * 269 drm_atomic_get_crtc_state(struct drm_atomic_state *state, 270 struct drm_crtc *crtc) 271 { 272 int ret, index = drm_crtc_index(crtc); 273 struct drm_crtc_state *crtc_state; 274 275 crtc_state = drm_atomic_get_existing_crtc_state(state, crtc); 276 if (crtc_state) 277 return crtc_state; 278 279 ret = drm_modeset_lock(&crtc->mutex, state->acquire_ctx); 280 if (ret) 281 return ERR_PTR(ret); 282 283 crtc_state = crtc->funcs->atomic_duplicate_state(crtc); 284 if (!crtc_state) 285 return ERR_PTR(-ENOMEM); 286 287 state->crtc_states[index] = crtc_state; 288 state->crtcs[index] = crtc; 289 crtc_state->state = state; 290 291 DRM_DEBUG_ATOMIC("Added [CRTC:%d:%s] %p state to %p\n", 292 crtc->base.id, crtc->name, crtc_state, state); 293 294 return crtc_state; 295 } 296 EXPORT_SYMBOL(drm_atomic_get_crtc_state); 297 298 /** 299 * drm_atomic_set_mode_for_crtc - set mode for CRTC 300 * @state: the CRTC whose incoming state to update 301 * @mode: kernel-internal mode to use for the CRTC, or NULL to disable 302 * 303 * Set a mode (originating from the kernel) on the desired CRTC state. Does 304 * not change any other state properties, including enable, active, or 305 * mode_changed. 306 * 307 * RETURNS: 308 * Zero on success, error code on failure. Cannot return -EDEADLK. 309 */ 310 int drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state, 311 struct drm_display_mode *mode) 312 { 313 struct drm_mode_modeinfo umode; 314 315 /* Early return for no change. */ 316 if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0) 317 return 0; 318 319 drm_property_unreference_blob(state->mode_blob); 320 state->mode_blob = NULL; 321 322 if (mode) { 323 drm_mode_convert_to_umode(&umode, mode); 324 state->mode_blob = 325 drm_property_create_blob(state->crtc->dev, 326 sizeof(umode), 327 &umode); 328 if (IS_ERR(state->mode_blob)) 329 return PTR_ERR(state->mode_blob); 330 331 drm_mode_copy(&state->mode, mode); 332 state->enable = true; 333 DRM_DEBUG_ATOMIC("Set [MODE:%s] for CRTC state %p\n", 334 mode->name, state); 335 } else { 336 memset(&state->mode, 0, sizeof(state->mode)); 337 state->enable = false; 338 DRM_DEBUG_ATOMIC("Set [NOMODE] for CRTC state %p\n", 339 state); 340 } 341 342 return 0; 343 } 344 EXPORT_SYMBOL(drm_atomic_set_mode_for_crtc); 345 346 /** 347 * drm_atomic_set_mode_prop_for_crtc - set mode for CRTC 348 * @state: the CRTC whose incoming state to update 349 * @blob: pointer to blob property to use for mode 350 * 351 * Set a mode (originating from a blob property) on the desired CRTC state. 352 * This function will take a reference on the blob property for the CRTC state, 353 * and release the reference held on the state's existing mode property, if any 354 * was set. 355 * 356 * RETURNS: 357 * Zero on success, error code on failure. Cannot return -EDEADLK. 358 */ 359 int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state, 360 struct drm_property_blob *blob) 361 { 362 if (blob == state->mode_blob) 363 return 0; 364 365 drm_property_unreference_blob(state->mode_blob); 366 state->mode_blob = NULL; 367 368 if (blob) { 369 if (blob->length != sizeof(struct drm_mode_modeinfo) || 370 drm_mode_convert_umode(&state->mode, 371 (const struct drm_mode_modeinfo *) 372 blob->data)) 373 return -EINVAL; 374 375 state->mode_blob = drm_property_reference_blob(blob); 376 state->enable = true; 377 DRM_DEBUG_ATOMIC("Set [MODE:%s] for CRTC state %p\n", 378 state->mode.name, state); 379 } else { 380 memset(&state->mode, 0, sizeof(state->mode)); 381 state->enable = false; 382 DRM_DEBUG_ATOMIC("Set [NOMODE] for CRTC state %p\n", 383 state); 384 } 385 386 return 0; 387 } 388 EXPORT_SYMBOL(drm_atomic_set_mode_prop_for_crtc); 389 390 /** 391 * drm_atomic_crtc_set_property - set property on CRTC 392 * @crtc: the drm CRTC to set a property on 393 * @state: the state object to update with the new property value 394 * @property: the property to set 395 * @val: the new property value 396 * 397 * Use this instead of calling crtc->atomic_set_property directly. 398 * This function handles generic/core properties and calls out to 399 * driver's ->atomic_set_property() for driver properties. To ensure 400 * consistent behavior you must call this function rather than the 401 * driver hook directly. 402 * 403 * RETURNS: 404 * Zero on success, error code on failure 405 */ 406 int drm_atomic_crtc_set_property(struct drm_crtc *crtc, 407 struct drm_crtc_state *state, struct drm_property *property, 408 uint64_t val) 409 { 410 struct drm_device *dev = crtc->dev; 411 struct drm_mode_config *config = &dev->mode_config; 412 int ret; 413 414 if (property == config->prop_active) 415 state->active = val; 416 else if (property == config->prop_mode_id) { 417 struct drm_property_blob *mode = 418 drm_property_lookup_blob(dev, val); 419 ret = drm_atomic_set_mode_prop_for_crtc(state, mode); 420 drm_property_unreference_blob(mode); 421 return ret; 422 } 423 else if (crtc->funcs->atomic_set_property) 424 return crtc->funcs->atomic_set_property(crtc, state, property, val); 425 else 426 return -EINVAL; 427 428 return 0; 429 } 430 EXPORT_SYMBOL(drm_atomic_crtc_set_property); 431 432 /** 433 * drm_atomic_crtc_get_property - get property value from CRTC state 434 * @crtc: the drm CRTC to set a property on 435 * @state: the state object to get the property value from 436 * @property: the property to set 437 * @val: return location for the property value 438 * 439 * This function handles generic/core properties and calls out to 440 * driver's ->atomic_get_property() for driver properties. To ensure 441 * consistent behavior you must call this function rather than the 442 * driver hook directly. 443 * 444 * RETURNS: 445 * Zero on success, error code on failure 446 */ 447 static int 448 drm_atomic_crtc_get_property(struct drm_crtc *crtc, 449 const struct drm_crtc_state *state, 450 struct drm_property *property, uint64_t *val) 451 { 452 struct drm_device *dev = crtc->dev; 453 struct drm_mode_config *config = &dev->mode_config; 454 455 if (property == config->prop_active) 456 *val = state->active; 457 else if (property == config->prop_mode_id) 458 *val = (state->mode_blob) ? state->mode_blob->base.id : 0; 459 else if (crtc->funcs->atomic_get_property) 460 return crtc->funcs->atomic_get_property(crtc, state, property, val); 461 else 462 return -EINVAL; 463 464 return 0; 465 } 466 467 /** 468 * drm_atomic_crtc_check - check crtc state 469 * @crtc: crtc to check 470 * @state: crtc state to check 471 * 472 * Provides core sanity checks for crtc state. 473 * 474 * RETURNS: 475 * Zero on success, error code on failure 476 */ 477 static int drm_atomic_crtc_check(struct drm_crtc *crtc, 478 struct drm_crtc_state *state) 479 { 480 /* NOTE: we explicitly don't enforce constraints such as primary 481 * layer covering entire screen, since that is something we want 482 * to allow (on hw that supports it). For hw that does not, it 483 * should be checked in driver's crtc->atomic_check() vfunc. 484 * 485 * TODO: Add generic modeset state checks once we support those. 486 */ 487 488 if (state->active && !state->enable) { 489 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] active without enabled\n", 490 crtc->base.id, crtc->name); 491 return -EINVAL; 492 } 493 494 /* The state->enable vs. state->mode_blob checks can be WARN_ON, 495 * as this is a kernel-internal detail that userspace should never 496 * be able to trigger. */ 497 if (drm_core_check_feature(crtc->dev, DRIVER_ATOMIC) && 498 WARN_ON(state->enable && !state->mode_blob)) { 499 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enabled without mode blob\n", 500 crtc->base.id, crtc->name); 501 return -EINVAL; 502 } 503 504 if (drm_core_check_feature(crtc->dev, DRIVER_ATOMIC) && 505 WARN_ON(!state->enable && state->mode_blob)) { 506 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] disabled with mode blob\n", 507 crtc->base.id, crtc->name); 508 return -EINVAL; 509 } 510 511 /* 512 * Reject event generation for when a CRTC is off and stays off. 513 * It wouldn't be hard to implement this, but userspace has a track 514 * record of happily burning through 100% cpu (or worse, crash) when the 515 * display pipe is suspended. To avoid all that fun just reject updates 516 * that ask for events since likely that indicates a bug in the 517 * compositor's drawing loop. This is consistent with the vblank IOCTL 518 * and legacy page_flip IOCTL which also reject service on a disabled 519 * pipe. 520 */ 521 if (state->event && !state->active && !crtc->state->active) { 522 DRM_DEBUG_ATOMIC("[CRTC:%d] requesting event but off\n", 523 crtc->base.id); 524 return -EINVAL; 525 } 526 527 return 0; 528 } 529 530 /** 531 * drm_atomic_get_plane_state - get plane state 532 * @state: global atomic state object 533 * @plane: plane to get state object for 534 * 535 * This function returns the plane state for the given plane, allocating it if 536 * needed. It will also grab the relevant plane lock to make sure that the state 537 * is consistent. 538 * 539 * Returns: 540 * 541 * Either the allocated state or the error code encoded into the pointer. When 542 * the error is EDEADLK then the w/w mutex code has detected a deadlock and the 543 * entire atomic sequence must be restarted. All other errors are fatal. 544 */ 545 struct drm_plane_state * 546 drm_atomic_get_plane_state(struct drm_atomic_state *state, 547 struct drm_plane *plane) 548 { 549 int ret, index = drm_plane_index(plane); 550 struct drm_plane_state *plane_state; 551 552 plane_state = drm_atomic_get_existing_plane_state(state, plane); 553 if (plane_state) 554 return plane_state; 555 556 ret = drm_modeset_lock(&plane->mutex, state->acquire_ctx); 557 if (ret) 558 return ERR_PTR(ret); 559 560 plane_state = plane->funcs->atomic_duplicate_state(plane); 561 if (!plane_state) 562 return ERR_PTR(-ENOMEM); 563 564 state->plane_states[index] = plane_state; 565 state->planes[index] = plane; 566 plane_state->state = state; 567 568 DRM_DEBUG_ATOMIC("Added [PLANE:%d:%s] %p state to %p\n", 569 plane->base.id, plane->name, plane_state, state); 570 571 if (plane_state->crtc) { 572 struct drm_crtc_state *crtc_state; 573 574 crtc_state = drm_atomic_get_crtc_state(state, 575 plane_state->crtc); 576 if (IS_ERR(crtc_state)) 577 return ERR_CAST(crtc_state); 578 } 579 580 return plane_state; 581 } 582 EXPORT_SYMBOL(drm_atomic_get_plane_state); 583 584 /** 585 * drm_atomic_plane_set_property - set property on plane 586 * @plane: the drm plane to set a property on 587 * @state: the state object to update with the new property value 588 * @property: the property to set 589 * @val: the new property value 590 * 591 * Use this instead of calling plane->atomic_set_property directly. 592 * This function handles generic/core properties and calls out to 593 * driver's ->atomic_set_property() for driver properties. To ensure 594 * consistent behavior you must call this function rather than the 595 * driver hook directly. 596 * 597 * RETURNS: 598 * Zero on success, error code on failure 599 */ 600 int drm_atomic_plane_set_property(struct drm_plane *plane, 601 struct drm_plane_state *state, struct drm_property *property, 602 uint64_t val) 603 { 604 struct drm_device *dev = plane->dev; 605 struct drm_mode_config *config = &dev->mode_config; 606 607 if (property == config->prop_fb_id) { 608 struct drm_framebuffer *fb = drm_framebuffer_lookup(dev, val); 609 drm_atomic_set_fb_for_plane(state, fb); 610 if (fb) 611 drm_framebuffer_unreference(fb); 612 } else if (property == config->prop_crtc_id) { 613 struct drm_crtc *crtc = drm_crtc_find(dev, val); 614 return drm_atomic_set_crtc_for_plane(state, crtc); 615 } else if (property == config->prop_crtc_x) { 616 state->crtc_x = U642I64(val); 617 } else if (property == config->prop_crtc_y) { 618 state->crtc_y = U642I64(val); 619 } else if (property == config->prop_crtc_w) { 620 state->crtc_w = val; 621 } else if (property == config->prop_crtc_h) { 622 state->crtc_h = val; 623 } else if (property == config->prop_src_x) { 624 state->src_x = val; 625 } else if (property == config->prop_src_y) { 626 state->src_y = val; 627 } else if (property == config->prop_src_w) { 628 state->src_w = val; 629 } else if (property == config->prop_src_h) { 630 state->src_h = val; 631 } else if (property == config->rotation_property) { 632 state->rotation = val; 633 } else if (plane->funcs->atomic_set_property) { 634 return plane->funcs->atomic_set_property(plane, state, 635 property, val); 636 } else { 637 return -EINVAL; 638 } 639 640 return 0; 641 } 642 EXPORT_SYMBOL(drm_atomic_plane_set_property); 643 644 /** 645 * drm_atomic_plane_get_property - get property value from plane state 646 * @plane: the drm plane to set a property on 647 * @state: the state object to get the property value from 648 * @property: the property to set 649 * @val: return location for the property value 650 * 651 * This function handles generic/core properties and calls out to 652 * driver's ->atomic_get_property() for driver properties. To ensure 653 * consistent behavior you must call this function rather than the 654 * driver hook directly. 655 * 656 * RETURNS: 657 * Zero on success, error code on failure 658 */ 659 static int 660 drm_atomic_plane_get_property(struct drm_plane *plane, 661 const struct drm_plane_state *state, 662 struct drm_property *property, uint64_t *val) 663 { 664 struct drm_device *dev = plane->dev; 665 struct drm_mode_config *config = &dev->mode_config; 666 667 if (property == config->prop_fb_id) { 668 *val = (state->fb) ? state->fb->base.id : 0; 669 } else if (property == config->prop_crtc_id) { 670 *val = (state->crtc) ? state->crtc->base.id : 0; 671 } else if (property == config->prop_crtc_x) { 672 *val = I642U64(state->crtc_x); 673 } else if (property == config->prop_crtc_y) { 674 *val = I642U64(state->crtc_y); 675 } else if (property == config->prop_crtc_w) { 676 *val = state->crtc_w; 677 } else if (property == config->prop_crtc_h) { 678 *val = state->crtc_h; 679 } else if (property == config->prop_src_x) { 680 *val = state->src_x; 681 } else if (property == config->prop_src_y) { 682 *val = state->src_y; 683 } else if (property == config->prop_src_w) { 684 *val = state->src_w; 685 } else if (property == config->prop_src_h) { 686 *val = state->src_h; 687 } else if (property == config->rotation_property) { 688 *val = state->rotation; 689 } else if (plane->funcs->atomic_get_property) { 690 return plane->funcs->atomic_get_property(plane, state, property, val); 691 } else { 692 return -EINVAL; 693 } 694 695 return 0; 696 } 697 698 static bool 699 plane_switching_crtc(struct drm_atomic_state *state, 700 struct drm_plane *plane, 701 struct drm_plane_state *plane_state) 702 { 703 if (!plane->state->crtc || !plane_state->crtc) 704 return false; 705 706 if (plane->state->crtc == plane_state->crtc) 707 return false; 708 709 /* This could be refined, but currently there's no helper or driver code 710 * to implement direct switching of active planes nor userspace to take 711 * advantage of more direct plane switching without the intermediate 712 * full OFF state. 713 */ 714 return true; 715 } 716 717 /** 718 * drm_atomic_plane_check - check plane state 719 * @plane: plane to check 720 * @state: plane state to check 721 * 722 * Provides core sanity checks for plane state. 723 * 724 * RETURNS: 725 * Zero on success, error code on failure 726 */ 727 static int drm_atomic_plane_check(struct drm_plane *plane, 728 struct drm_plane_state *state) 729 { 730 unsigned int fb_width, fb_height; 731 int ret; 732 733 /* either *both* CRTC and FB must be set, or neither */ 734 if (WARN_ON(state->crtc && !state->fb)) { 735 DRM_DEBUG_ATOMIC("CRTC set but no FB\n"); 736 return -EINVAL; 737 } else if (WARN_ON(state->fb && !state->crtc)) { 738 DRM_DEBUG_ATOMIC("FB set but no CRTC\n"); 739 return -EINVAL; 740 } 741 742 /* if disabled, we don't care about the rest of the state: */ 743 if (!state->crtc) 744 return 0; 745 746 /* Check whether this plane is usable on this CRTC */ 747 if (!(plane->possible_crtcs & drm_crtc_mask(state->crtc))) { 748 DRM_DEBUG_ATOMIC("Invalid crtc for plane\n"); 749 return -EINVAL; 750 } 751 752 /* Check whether this plane supports the fb pixel format. */ 753 ret = drm_plane_check_pixel_format(plane, state->fb->pixel_format); 754 if (ret) { 755 DRM_DEBUG_ATOMIC("Invalid pixel format %s\n", 756 drm_get_format_name(state->fb->pixel_format)); 757 return ret; 758 } 759 760 /* Give drivers some help against integer overflows */ 761 if (state->crtc_w > INT_MAX || 762 state->crtc_x > INT_MAX - (int32_t) state->crtc_w || 763 state->crtc_h > INT_MAX || 764 state->crtc_y > INT_MAX - (int32_t) state->crtc_h) { 765 DRM_DEBUG_ATOMIC("Invalid CRTC coordinates %ux%u+%d+%d\n", 766 state->crtc_w, state->crtc_h, 767 state->crtc_x, state->crtc_y); 768 return -ERANGE; 769 } 770 771 fb_width = state->fb->width << 16; 772 fb_height = state->fb->height << 16; 773 774 /* Make sure source coordinates are inside the fb. */ 775 if (state->src_w > fb_width || 776 state->src_x > fb_width - state->src_w || 777 state->src_h > fb_height || 778 state->src_y > fb_height - state->src_h) { 779 DRM_DEBUG_ATOMIC("Invalid source coordinates " 780 "%u.%06ux%u.%06u+%u.%06u+%u.%06u\n", 781 state->src_w >> 16, ((state->src_w & 0xffff) * 15625) >> 10, 782 state->src_h >> 16, ((state->src_h & 0xffff) * 15625) >> 10, 783 state->src_x >> 16, ((state->src_x & 0xffff) * 15625) >> 10, 784 state->src_y >> 16, ((state->src_y & 0xffff) * 15625) >> 10); 785 return -ENOSPC; 786 } 787 788 if (plane_switching_crtc(state->state, plane, state)) { 789 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] switching CRTC directly\n", 790 plane->base.id, plane->name); 791 return -EINVAL; 792 } 793 794 return 0; 795 } 796 797 /** 798 * drm_atomic_get_connector_state - get connector state 799 * @state: global atomic state object 800 * @connector: connector to get state object for 801 * 802 * This function returns the connector state for the given connector, 803 * allocating it if needed. It will also grab the relevant connector lock to 804 * make sure that the state is consistent. 805 * 806 * Returns: 807 * 808 * Either the allocated state or the error code encoded into the pointer. When 809 * the error is EDEADLK then the w/w mutex code has detected a deadlock and the 810 * entire atomic sequence must be restarted. All other errors are fatal. 811 */ 812 struct drm_connector_state * 813 drm_atomic_get_connector_state(struct drm_atomic_state *state, 814 struct drm_connector *connector) 815 { 816 int ret, index; 817 struct drm_mode_config *config = &connector->dev->mode_config; 818 struct drm_connector_state *connector_state; 819 820 ret = drm_modeset_lock(&config->connection_mutex, state->acquire_ctx); 821 if (ret) 822 return ERR_PTR(ret); 823 824 index = drm_connector_index(connector); 825 826 /* 827 * Construction of atomic state updates can race with a connector 828 * hot-add which might overflow. In this case flip the table and just 829 * restart the entire ioctl - no one is fast enough to livelock a cpu 830 * with physical hotplug events anyway. 831 * 832 * Note that we only grab the indexes once we have the right lock to 833 * prevent hotplug/unplugging of connectors. So removal is no problem, 834 * at most the array is a bit too large. 835 */ 836 if (index >= state->num_connector) { 837 DRM_DEBUG_ATOMIC("Hot-added connector would overflow state array, restarting\n"); 838 return ERR_PTR(-EAGAIN); 839 } 840 841 if (state->connector_states[index]) 842 return state->connector_states[index]; 843 844 connector_state = connector->funcs->atomic_duplicate_state(connector); 845 if (!connector_state) 846 return ERR_PTR(-ENOMEM); 847 848 state->connector_states[index] = connector_state; 849 state->connectors[index] = connector; 850 connector_state->state = state; 851 852 DRM_DEBUG_ATOMIC("Added [CONNECTOR:%d] %p state to %p\n", 853 connector->base.id, connector_state, state); 854 855 if (connector_state->crtc) { 856 struct drm_crtc_state *crtc_state; 857 858 crtc_state = drm_atomic_get_crtc_state(state, 859 connector_state->crtc); 860 if (IS_ERR(crtc_state)) 861 return ERR_CAST(crtc_state); 862 } 863 864 return connector_state; 865 } 866 EXPORT_SYMBOL(drm_atomic_get_connector_state); 867 868 /** 869 * drm_atomic_connector_set_property - set property on connector. 870 * @connector: the drm connector to set a property on 871 * @state: the state object to update with the new property value 872 * @property: the property to set 873 * @val: the new property value 874 * 875 * Use this instead of calling connector->atomic_set_property directly. 876 * This function handles generic/core properties and calls out to 877 * driver's ->atomic_set_property() for driver properties. To ensure 878 * consistent behavior you must call this function rather than the 879 * driver hook directly. 880 * 881 * RETURNS: 882 * Zero on success, error code on failure 883 */ 884 int drm_atomic_connector_set_property(struct drm_connector *connector, 885 struct drm_connector_state *state, struct drm_property *property, 886 uint64_t val) 887 { 888 struct drm_device *dev = connector->dev; 889 struct drm_mode_config *config = &dev->mode_config; 890 891 if (property == config->prop_crtc_id) { 892 struct drm_crtc *crtc = drm_crtc_find(dev, val); 893 return drm_atomic_set_crtc_for_connector(state, crtc); 894 } else if (property == config->dpms_property) { 895 /* setting DPMS property requires special handling, which 896 * is done in legacy setprop path for us. Disallow (for 897 * now?) atomic writes to DPMS property: 898 */ 899 return -EINVAL; 900 } else if (connector->funcs->atomic_set_property) { 901 return connector->funcs->atomic_set_property(connector, 902 state, property, val); 903 } else { 904 return -EINVAL; 905 } 906 } 907 EXPORT_SYMBOL(drm_atomic_connector_set_property); 908 909 /** 910 * drm_atomic_connector_get_property - get property value from connector state 911 * @connector: the drm connector to set a property on 912 * @state: the state object to get the property value from 913 * @property: the property to set 914 * @val: return location for the property value 915 * 916 * This function handles generic/core properties and calls out to 917 * driver's ->atomic_get_property() for driver properties. To ensure 918 * consistent behavior you must call this function rather than the 919 * driver hook directly. 920 * 921 * RETURNS: 922 * Zero on success, error code on failure 923 */ 924 static int 925 drm_atomic_connector_get_property(struct drm_connector *connector, 926 const struct drm_connector_state *state, 927 struct drm_property *property, uint64_t *val) 928 { 929 struct drm_device *dev = connector->dev; 930 struct drm_mode_config *config = &dev->mode_config; 931 932 if (property == config->prop_crtc_id) { 933 *val = (state->crtc) ? state->crtc->base.id : 0; 934 } else if (property == config->dpms_property) { 935 *val = connector->dpms; 936 } else if (connector->funcs->atomic_get_property) { 937 return connector->funcs->atomic_get_property(connector, 938 state, property, val); 939 } else { 940 return -EINVAL; 941 } 942 943 return 0; 944 } 945 946 int drm_atomic_get_property(struct drm_mode_object *obj, 947 struct drm_property *property, uint64_t *val) 948 { 949 struct drm_device *dev = property->dev; 950 int ret; 951 952 switch (obj->type) { 953 case DRM_MODE_OBJECT_CONNECTOR: { 954 struct drm_connector *connector = obj_to_connector(obj); 955 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); 956 ret = drm_atomic_connector_get_property(connector, 957 connector->state, property, val); 958 break; 959 } 960 case DRM_MODE_OBJECT_CRTC: { 961 struct drm_crtc *crtc = obj_to_crtc(obj); 962 WARN_ON(!drm_modeset_is_locked(&crtc->mutex)); 963 ret = drm_atomic_crtc_get_property(crtc, 964 crtc->state, property, val); 965 break; 966 } 967 case DRM_MODE_OBJECT_PLANE: { 968 struct drm_plane *plane = obj_to_plane(obj); 969 WARN_ON(!drm_modeset_is_locked(&plane->mutex)); 970 ret = drm_atomic_plane_get_property(plane, 971 plane->state, property, val); 972 break; 973 } 974 default: 975 ret = -EINVAL; 976 break; 977 } 978 979 return ret; 980 } 981 982 /** 983 * drm_atomic_set_crtc_for_plane - set crtc for plane 984 * @plane_state: the plane whose incoming state to update 985 * @crtc: crtc to use for the plane 986 * 987 * Changing the assigned crtc for a plane requires us to grab the lock and state 988 * for the new crtc, as needed. This function takes care of all these details 989 * besides updating the pointer in the state object itself. 990 * 991 * Returns: 992 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK 993 * then the w/w mutex code has detected a deadlock and the entire atomic 994 * sequence must be restarted. All other errors are fatal. 995 */ 996 int 997 drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state, 998 struct drm_crtc *crtc) 999 { 1000 struct drm_plane *plane = plane_state->plane; 1001 struct drm_crtc_state *crtc_state; 1002 1003 if (plane_state->crtc) { 1004 crtc_state = drm_atomic_get_crtc_state(plane_state->state, 1005 plane_state->crtc); 1006 if (WARN_ON(IS_ERR(crtc_state))) 1007 return PTR_ERR(crtc_state); 1008 1009 crtc_state->plane_mask &= ~(1 << drm_plane_index(plane)); 1010 } 1011 1012 plane_state->crtc = crtc; 1013 1014 if (crtc) { 1015 crtc_state = drm_atomic_get_crtc_state(plane_state->state, 1016 crtc); 1017 if (IS_ERR(crtc_state)) 1018 return PTR_ERR(crtc_state); 1019 crtc_state->plane_mask |= (1 << drm_plane_index(plane)); 1020 } 1021 1022 if (crtc) 1023 DRM_DEBUG_ATOMIC("Link plane state %p to [CRTC:%d:%s]\n", 1024 plane_state, crtc->base.id, crtc->name); 1025 else 1026 DRM_DEBUG_ATOMIC("Link plane state %p to [NOCRTC]\n", 1027 plane_state); 1028 1029 return 0; 1030 } 1031 EXPORT_SYMBOL(drm_atomic_set_crtc_for_plane); 1032 1033 /** 1034 * drm_atomic_set_fb_for_plane - set framebuffer for plane 1035 * @plane_state: atomic state object for the plane 1036 * @fb: fb to use for the plane 1037 * 1038 * Changing the assigned framebuffer for a plane requires us to grab a reference 1039 * to the new fb and drop the reference to the old fb, if there is one. This 1040 * function takes care of all these details besides updating the pointer in the 1041 * state object itself. 1042 */ 1043 void 1044 drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state, 1045 struct drm_framebuffer *fb) 1046 { 1047 if (plane_state->fb) 1048 drm_framebuffer_unreference(plane_state->fb); 1049 if (fb) 1050 drm_framebuffer_reference(fb); 1051 plane_state->fb = fb; 1052 1053 if (fb) 1054 DRM_DEBUG_ATOMIC("Set [FB:%d] for plane state %p\n", 1055 fb->base.id, plane_state); 1056 else 1057 DRM_DEBUG_ATOMIC("Set [NOFB] for plane state %p\n", 1058 plane_state); 1059 } 1060 EXPORT_SYMBOL(drm_atomic_set_fb_for_plane); 1061 1062 /** 1063 * drm_atomic_set_crtc_for_connector - set crtc for connector 1064 * @conn_state: atomic state object for the connector 1065 * @crtc: crtc to use for the connector 1066 * 1067 * Changing the assigned crtc for a connector requires us to grab the lock and 1068 * state for the new crtc, as needed. This function takes care of all these 1069 * details besides updating the pointer in the state object itself. 1070 * 1071 * Returns: 1072 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK 1073 * then the w/w mutex code has detected a deadlock and the entire atomic 1074 * sequence must be restarted. All other errors are fatal. 1075 */ 1076 int 1077 drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state, 1078 struct drm_crtc *crtc) 1079 { 1080 struct drm_crtc_state *crtc_state; 1081 1082 if (conn_state->crtc && conn_state->crtc != crtc) { 1083 crtc_state = drm_atomic_get_existing_crtc_state(conn_state->state, 1084 conn_state->crtc); 1085 1086 crtc_state->connector_mask &= 1087 ~(1 << drm_connector_index(conn_state->connector)); 1088 } 1089 1090 if (crtc) { 1091 crtc_state = drm_atomic_get_crtc_state(conn_state->state, crtc); 1092 if (IS_ERR(crtc_state)) 1093 return PTR_ERR(crtc_state); 1094 1095 crtc_state->connector_mask |= 1096 1 << drm_connector_index(conn_state->connector); 1097 } 1098 1099 conn_state->crtc = crtc; 1100 1101 if (crtc) 1102 DRM_DEBUG_ATOMIC("Link connector state %p to [CRTC:%d:%s]\n", 1103 conn_state, crtc->base.id, crtc->name); 1104 else 1105 DRM_DEBUG_ATOMIC("Link connector state %p to [NOCRTC]\n", 1106 conn_state); 1107 1108 return 0; 1109 } 1110 EXPORT_SYMBOL(drm_atomic_set_crtc_for_connector); 1111 1112 /** 1113 * drm_atomic_add_affected_connectors - add connectors for crtc 1114 * @state: atomic state 1115 * @crtc: DRM crtc 1116 * 1117 * This function walks the current configuration and adds all connectors 1118 * currently using @crtc to the atomic configuration @state. Note that this 1119 * function must acquire the connection mutex. This can potentially cause 1120 * unneeded seralization if the update is just for the planes on one crtc. Hence 1121 * drivers and helpers should only call this when really needed (e.g. when a 1122 * full modeset needs to happen due to some change). 1123 * 1124 * Returns: 1125 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK 1126 * then the w/w mutex code has detected a deadlock and the entire atomic 1127 * sequence must be restarted. All other errors are fatal. 1128 */ 1129 int 1130 drm_atomic_add_affected_connectors(struct drm_atomic_state *state, 1131 struct drm_crtc *crtc) 1132 { 1133 struct drm_mode_config *config = &state->dev->mode_config; 1134 struct drm_connector *connector; 1135 struct drm_connector_state *conn_state; 1136 int ret; 1137 1138 ret = drm_modeset_lock(&config->connection_mutex, state->acquire_ctx); 1139 if (ret) 1140 return ret; 1141 1142 DRM_DEBUG_ATOMIC("Adding all current connectors for [CRTC:%d:%s] to %p\n", 1143 crtc->base.id, crtc->name, state); 1144 1145 /* 1146 * Changed connectors are already in @state, so only need to look at the 1147 * current configuration. 1148 */ 1149 drm_for_each_connector(connector, state->dev) { 1150 if (connector->state->crtc != crtc) 1151 continue; 1152 1153 conn_state = drm_atomic_get_connector_state(state, connector); 1154 if (IS_ERR(conn_state)) 1155 return PTR_ERR(conn_state); 1156 } 1157 1158 return 0; 1159 } 1160 EXPORT_SYMBOL(drm_atomic_add_affected_connectors); 1161 1162 /** 1163 * drm_atomic_add_affected_planes - add planes for crtc 1164 * @state: atomic state 1165 * @crtc: DRM crtc 1166 * 1167 * This function walks the current configuration and adds all planes 1168 * currently used by @crtc to the atomic configuration @state. This is useful 1169 * when an atomic commit also needs to check all currently enabled plane on 1170 * @crtc, e.g. when changing the mode. It's also useful when re-enabling a CRTC 1171 * to avoid special code to force-enable all planes. 1172 * 1173 * Since acquiring a plane state will always also acquire the w/w mutex of the 1174 * current CRTC for that plane (if there is any) adding all the plane states for 1175 * a CRTC will not reduce parallism of atomic updates. 1176 * 1177 * Returns: 1178 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK 1179 * then the w/w mutex code has detected a deadlock and the entire atomic 1180 * sequence must be restarted. All other errors are fatal. 1181 */ 1182 int 1183 drm_atomic_add_affected_planes(struct drm_atomic_state *state, 1184 struct drm_crtc *crtc) 1185 { 1186 struct drm_plane *plane; 1187 1188 WARN_ON(!drm_atomic_get_existing_crtc_state(state, crtc)); 1189 1190 drm_for_each_plane_mask(plane, state->dev, crtc->state->plane_mask) { 1191 struct drm_plane_state *plane_state = 1192 drm_atomic_get_plane_state(state, plane); 1193 1194 if (IS_ERR(plane_state)) 1195 return PTR_ERR(plane_state); 1196 } 1197 return 0; 1198 } 1199 EXPORT_SYMBOL(drm_atomic_add_affected_planes); 1200 1201 /** 1202 * drm_atomic_legacy_backoff - locking backoff for legacy ioctls 1203 * @state: atomic state 1204 * 1205 * This function should be used by legacy entry points which don't understand 1206 * -EDEADLK semantics. For simplicity this one will grab all modeset locks after 1207 * the slowpath completed. 1208 */ 1209 void drm_atomic_legacy_backoff(struct drm_atomic_state *state) 1210 { 1211 int ret; 1212 1213 retry: 1214 drm_modeset_backoff(state->acquire_ctx); 1215 1216 ret = drm_modeset_lock_all_ctx(state->dev, state->acquire_ctx); 1217 if (ret) 1218 goto retry; 1219 } 1220 EXPORT_SYMBOL(drm_atomic_legacy_backoff); 1221 1222 /** 1223 * drm_atomic_check_only - check whether a given config would work 1224 * @state: atomic configuration to check 1225 * 1226 * Note that this function can return -EDEADLK if the driver needed to acquire 1227 * more locks but encountered a deadlock. The caller must then do the usual w/w 1228 * backoff dance and restart. All other errors are fatal. 1229 * 1230 * Returns: 1231 * 0 on success, negative error code on failure. 1232 */ 1233 int drm_atomic_check_only(struct drm_atomic_state *state) 1234 { 1235 struct drm_device *dev = state->dev; 1236 struct drm_mode_config *config = &dev->mode_config; 1237 struct drm_plane *plane; 1238 struct drm_plane_state *plane_state; 1239 struct drm_crtc *crtc; 1240 struct drm_crtc_state *crtc_state; 1241 int i, ret = 0; 1242 1243 DRM_DEBUG_ATOMIC("checking %p\n", state); 1244 1245 for_each_plane_in_state(state, plane, plane_state, i) { 1246 ret = drm_atomic_plane_check(plane, plane_state); 1247 if (ret) { 1248 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic core check failed\n", 1249 plane->base.id, plane->name); 1250 return ret; 1251 } 1252 } 1253 1254 for_each_crtc_in_state(state, crtc, crtc_state, i) { 1255 ret = drm_atomic_crtc_check(crtc, crtc_state); 1256 if (ret) { 1257 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic core check failed\n", 1258 crtc->base.id, crtc->name); 1259 return ret; 1260 } 1261 } 1262 1263 if (config->funcs->atomic_check) 1264 ret = config->funcs->atomic_check(state->dev, state); 1265 1266 if (!state->allow_modeset) { 1267 for_each_crtc_in_state(state, crtc, crtc_state, i) { 1268 if (drm_atomic_crtc_needs_modeset(crtc_state)) { 1269 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] requires full modeset\n", 1270 crtc->base.id, crtc->name); 1271 return -EINVAL; 1272 } 1273 } 1274 } 1275 1276 return ret; 1277 } 1278 EXPORT_SYMBOL(drm_atomic_check_only); 1279 1280 /** 1281 * drm_atomic_commit - commit configuration atomically 1282 * @state: atomic configuration to check 1283 * 1284 * Note that this function can return -EDEADLK if the driver needed to acquire 1285 * more locks but encountered a deadlock. The caller must then do the usual w/w 1286 * backoff dance and restart. All other errors are fatal. 1287 * 1288 * Also note that on successful execution ownership of @state is transferred 1289 * from the caller of this function to the function itself. The caller must not 1290 * free or in any other way access @state. If the function fails then the caller 1291 * must clean up @state itself. 1292 * 1293 * Returns: 1294 * 0 on success, negative error code on failure. 1295 */ 1296 int drm_atomic_commit(struct drm_atomic_state *state) 1297 { 1298 struct drm_mode_config *config = &state->dev->mode_config; 1299 int ret; 1300 1301 ret = drm_atomic_check_only(state); 1302 if (ret) 1303 return ret; 1304 1305 DRM_DEBUG_ATOMIC("commiting %p\n", state); 1306 1307 return config->funcs->atomic_commit(state->dev, state, false); 1308 } 1309 EXPORT_SYMBOL(drm_atomic_commit); 1310 1311 /** 1312 * drm_atomic_async_commit - atomic&async configuration commit 1313 * @state: atomic configuration to check 1314 * 1315 * Note that this function can return -EDEADLK if the driver needed to acquire 1316 * more locks but encountered a deadlock. The caller must then do the usual w/w 1317 * backoff dance and restart. All other errors are fatal. 1318 * 1319 * Also note that on successful execution ownership of @state is transferred 1320 * from the caller of this function to the function itself. The caller must not 1321 * free or in any other way access @state. If the function fails then the caller 1322 * must clean up @state itself. 1323 * 1324 * Returns: 1325 * 0 on success, negative error code on failure. 1326 */ 1327 int drm_atomic_async_commit(struct drm_atomic_state *state) 1328 { 1329 struct drm_mode_config *config = &state->dev->mode_config; 1330 int ret; 1331 1332 ret = drm_atomic_check_only(state); 1333 if (ret) 1334 return ret; 1335 1336 DRM_DEBUG_ATOMIC("commiting %p asynchronously\n", state); 1337 1338 return config->funcs->atomic_commit(state->dev, state, true); 1339 } 1340 EXPORT_SYMBOL(drm_atomic_async_commit); 1341 1342 /* 1343 * The big monstor ioctl 1344 */ 1345 1346 static struct drm_pending_vblank_event *create_vblank_event( 1347 struct drm_device *dev, struct drm_file *file_priv, uint64_t user_data) 1348 { 1349 struct drm_pending_vblank_event *e = NULL; 1350 int ret; 1351 1352 e = kzalloc(sizeof *e, GFP_KERNEL); 1353 if (!e) 1354 return NULL; 1355 1356 e->event.base.type = DRM_EVENT_FLIP_COMPLETE; 1357 e->event.base.length = sizeof(e->event); 1358 e->event.user_data = user_data; 1359 1360 ret = drm_event_reserve_init(dev, file_priv, &e->base, &e->event.base); 1361 if (ret) { 1362 kfree(e); 1363 return NULL; 1364 } 1365 1366 return e; 1367 } 1368 1369 static int atomic_set_prop(struct drm_atomic_state *state, 1370 struct drm_mode_object *obj, struct drm_property *prop, 1371 uint64_t prop_value) 1372 { 1373 struct drm_mode_object *ref; 1374 int ret; 1375 1376 if (!drm_property_change_valid_get(prop, prop_value, &ref)) 1377 return -EINVAL; 1378 1379 switch (obj->type) { 1380 case DRM_MODE_OBJECT_CONNECTOR: { 1381 struct drm_connector *connector = obj_to_connector(obj); 1382 struct drm_connector_state *connector_state; 1383 1384 connector_state = drm_atomic_get_connector_state(state, connector); 1385 if (IS_ERR(connector_state)) { 1386 ret = PTR_ERR(connector_state); 1387 break; 1388 } 1389 1390 ret = drm_atomic_connector_set_property(connector, 1391 connector_state, prop, prop_value); 1392 break; 1393 } 1394 case DRM_MODE_OBJECT_CRTC: { 1395 struct drm_crtc *crtc = obj_to_crtc(obj); 1396 struct drm_crtc_state *crtc_state; 1397 1398 crtc_state = drm_atomic_get_crtc_state(state, crtc); 1399 if (IS_ERR(crtc_state)) { 1400 ret = PTR_ERR(crtc_state); 1401 break; 1402 } 1403 1404 ret = drm_atomic_crtc_set_property(crtc, 1405 crtc_state, prop, prop_value); 1406 break; 1407 } 1408 case DRM_MODE_OBJECT_PLANE: { 1409 struct drm_plane *plane = obj_to_plane(obj); 1410 struct drm_plane_state *plane_state; 1411 1412 plane_state = drm_atomic_get_plane_state(state, plane); 1413 if (IS_ERR(plane_state)) { 1414 ret = PTR_ERR(plane_state); 1415 break; 1416 } 1417 1418 ret = drm_atomic_plane_set_property(plane, 1419 plane_state, prop, prop_value); 1420 break; 1421 } 1422 default: 1423 ret = -EINVAL; 1424 break; 1425 } 1426 1427 drm_property_change_valid_put(prop, ref); 1428 return ret; 1429 } 1430 1431 /** 1432 * drm_atomic_clean_old_fb -- Unset old_fb pointers and set plane->fb pointers. 1433 * 1434 * @dev: drm device to check. 1435 * @plane_mask: plane mask for planes that were updated. 1436 * @ret: return value, can be -EDEADLK for a retry. 1437 * 1438 * Before doing an update plane->old_fb is set to plane->fb, 1439 * but before dropping the locks old_fb needs to be set to NULL 1440 * and plane->fb updated. This is a common operation for each 1441 * atomic update, so this call is split off as a helper. 1442 */ 1443 void drm_atomic_clean_old_fb(struct drm_device *dev, 1444 unsigned plane_mask, 1445 int ret) 1446 { 1447 struct drm_plane *plane; 1448 1449 /* if succeeded, fixup legacy plane crtc/fb ptrs before dropping 1450 * locks (ie. while it is still safe to deref plane->state). We 1451 * need to do this here because the driver entry points cannot 1452 * distinguish between legacy and atomic ioctls. 1453 */ 1454 drm_for_each_plane_mask(plane, dev, plane_mask) { 1455 if (ret == 0) { 1456 struct drm_framebuffer *new_fb = plane->state->fb; 1457 if (new_fb) 1458 drm_framebuffer_reference(new_fb); 1459 plane->fb = new_fb; 1460 plane->crtc = plane->state->crtc; 1461 1462 if (plane->old_fb) 1463 drm_framebuffer_unreference(plane->old_fb); 1464 } 1465 plane->old_fb = NULL; 1466 } 1467 } 1468 EXPORT_SYMBOL(drm_atomic_clean_old_fb); 1469 1470 int drm_mode_atomic_ioctl(struct drm_device *dev, 1471 void *data, struct drm_file *file_priv) 1472 { 1473 struct drm_mode_atomic *arg = data; 1474 uint32_t __user *objs_ptr = (uint32_t __user *)(unsigned long)(arg->objs_ptr); 1475 uint32_t __user *count_props_ptr = (uint32_t __user *)(unsigned long)(arg->count_props_ptr); 1476 uint32_t __user *props_ptr = (uint32_t __user *)(unsigned long)(arg->props_ptr); 1477 uint64_t __user *prop_values_ptr = (uint64_t __user *)(unsigned long)(arg->prop_values_ptr); 1478 unsigned int copied_objs, copied_props; 1479 struct drm_atomic_state *state; 1480 struct drm_modeset_acquire_ctx ctx; 1481 struct drm_plane *plane; 1482 struct drm_crtc *crtc; 1483 struct drm_crtc_state *crtc_state; 1484 unsigned plane_mask; 1485 int ret = 0; 1486 unsigned int i, j; 1487 1488 /* disallow for drivers not supporting atomic: */ 1489 if (!drm_core_check_feature(dev, DRIVER_ATOMIC)) 1490 return -EINVAL; 1491 1492 /* disallow for userspace that has not enabled atomic cap (even 1493 * though this may be a bit overkill, since legacy userspace 1494 * wouldn't know how to call this ioctl) 1495 */ 1496 if (!file_priv->atomic) 1497 return -EINVAL; 1498 1499 if (arg->flags & ~DRM_MODE_ATOMIC_FLAGS) 1500 return -EINVAL; 1501 1502 if (arg->reserved) 1503 return -EINVAL; 1504 1505 if ((arg->flags & DRM_MODE_PAGE_FLIP_ASYNC) && 1506 !dev->mode_config.async_page_flip) 1507 return -EINVAL; 1508 1509 /* can't test and expect an event at the same time. */ 1510 if ((arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) && 1511 (arg->flags & DRM_MODE_PAGE_FLIP_EVENT)) 1512 return -EINVAL; 1513 1514 drm_modeset_acquire_init(&ctx, 0); 1515 1516 state = drm_atomic_state_alloc(dev); 1517 if (!state) 1518 return -ENOMEM; 1519 1520 state->acquire_ctx = &ctx; 1521 state->allow_modeset = !!(arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET); 1522 1523 retry: 1524 plane_mask = 0; 1525 copied_objs = 0; 1526 copied_props = 0; 1527 1528 for (i = 0; i < arg->count_objs; i++) { 1529 uint32_t obj_id, count_props; 1530 struct drm_mode_object *obj; 1531 1532 if (get_user(obj_id, objs_ptr + copied_objs)) { 1533 ret = -EFAULT; 1534 goto out; 1535 } 1536 1537 obj = drm_mode_object_find(dev, obj_id, DRM_MODE_OBJECT_ANY); 1538 if (!obj || !obj->properties) { 1539 ret = -ENOENT; 1540 goto out; 1541 } 1542 1543 if (get_user(count_props, count_props_ptr + copied_objs)) { 1544 ret = -EFAULT; 1545 goto out; 1546 } 1547 1548 copied_objs++; 1549 1550 for (j = 0; j < count_props; j++) { 1551 uint32_t prop_id; 1552 uint64_t prop_value; 1553 struct drm_property *prop; 1554 1555 if (get_user(prop_id, props_ptr + copied_props)) { 1556 ret = -EFAULT; 1557 goto out; 1558 } 1559 1560 prop = drm_property_find(dev, prop_id); 1561 if (!prop) { 1562 ret = -ENOENT; 1563 goto out; 1564 } 1565 1566 if (copy_from_user(&prop_value, 1567 prop_values_ptr + copied_props, 1568 sizeof(prop_value))) { 1569 ret = -EFAULT; 1570 goto out; 1571 } 1572 1573 ret = atomic_set_prop(state, obj, prop, prop_value); 1574 if (ret) 1575 goto out; 1576 1577 copied_props++; 1578 } 1579 1580 if (obj->type == DRM_MODE_OBJECT_PLANE && count_props && 1581 !(arg->flags & DRM_MODE_ATOMIC_TEST_ONLY)) { 1582 plane = obj_to_plane(obj); 1583 plane_mask |= (1 << drm_plane_index(plane)); 1584 plane->old_fb = plane->fb; 1585 } 1586 } 1587 1588 if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) { 1589 for_each_crtc_in_state(state, crtc, crtc_state, i) { 1590 struct drm_pending_vblank_event *e; 1591 1592 e = create_vblank_event(dev, file_priv, arg->user_data); 1593 if (!e) { 1594 ret = -ENOMEM; 1595 goto out; 1596 } 1597 1598 crtc_state->event = e; 1599 } 1600 } 1601 1602 if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) { 1603 /* 1604 * Unlike commit, check_only does not clean up state. 1605 * Below we call drm_atomic_state_free for it. 1606 */ 1607 ret = drm_atomic_check_only(state); 1608 } else if (arg->flags & DRM_MODE_ATOMIC_NONBLOCK) { 1609 ret = drm_atomic_async_commit(state); 1610 } else { 1611 ret = drm_atomic_commit(state); 1612 } 1613 1614 out: 1615 drm_atomic_clean_old_fb(dev, plane_mask, ret); 1616 1617 if (ret && arg->flags & DRM_MODE_PAGE_FLIP_EVENT) { 1618 /* 1619 * TEST_ONLY and PAGE_FLIP_EVENT are mutually exclusive, 1620 * if they weren't, this code should be called on success 1621 * for TEST_ONLY too. 1622 */ 1623 1624 for_each_crtc_in_state(state, crtc, crtc_state, i) { 1625 if (!crtc_state->event) 1626 continue; 1627 1628 drm_event_cancel_free(dev, &crtc_state->event->base); 1629 } 1630 } 1631 1632 if (ret == -EDEADLK) { 1633 drm_atomic_state_clear(state); 1634 drm_modeset_backoff(&ctx); 1635 goto retry; 1636 } 1637 1638 if (ret || arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) 1639 drm_atomic_state_free(state); 1640 1641 drm_modeset_drop_locks(&ctx); 1642 drm_modeset_acquire_fini(&ctx); 1643 1644 return ret; 1645 } 1646