This source file includes following definitions.
- drm_atomic_helper_plane_changed
- pick_single_encoder_for_connector
- handle_conflicting_encoders
- set_best_encoder
- steal_encoder
- update_connector_routing
- mode_fixup
- mode_valid_path
- mode_valid
- drm_atomic_helper_check_modeset
- drm_atomic_helper_check_plane_state
- drm_atomic_helper_check_planes
- drm_atomic_helper_check
- crtc_needs_disable
- disable_outputs
- drm_atomic_helper_update_legacy_modeset_state
- crtc_set_mode
- drm_atomic_helper_commit_modeset_disables
- drm_atomic_helper_commit_writebacks
- drm_atomic_helper_commit_modeset_enables
- drm_atomic_helper_wait_for_fences
- drm_atomic_helper_wait_for_vblanks
- drm_atomic_helper_wait_for_flip_done
- drm_atomic_helper_commit_tail
- drm_atomic_helper_commit_tail_rpm
- commit_tail
- commit_work
- drm_atomic_helper_async_check
- drm_atomic_helper_async_commit
- drm_atomic_helper_commit
- stall_checks
- release_crtc_commit
- init_commit
- crtc_or_fake_commit
- drm_atomic_helper_setup_commit
- drm_atomic_helper_wait_for_dependencies
- drm_atomic_helper_fake_vblank
- drm_atomic_helper_commit_hw_done
- drm_atomic_helper_commit_cleanup_done
- drm_atomic_helper_prepare_planes
- plane_crtc_active
- drm_atomic_helper_commit_planes
- drm_atomic_helper_commit_planes_on_crtc
- drm_atomic_helper_disable_planes_on_crtc
- drm_atomic_helper_cleanup_planes
- drm_atomic_helper_swap_state
- drm_atomic_helper_update_plane
- drm_atomic_helper_disable_plane
- drm_atomic_helper_set_config
- drm_atomic_helper_disable_all
- drm_atomic_helper_shutdown
- drm_atomic_helper_duplicate_state
- drm_atomic_helper_suspend
- drm_atomic_helper_commit_duplicated_state
- drm_atomic_helper_resume
- page_flip_common
- drm_atomic_helper_page_flip
- drm_atomic_helper_page_flip_target
- drm_atomic_helper_legacy_gamma_set
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 #include <linux/dma-fence.h>
  29 #include <linux/ktime.h>
  30 
  31 #include <drm/drm_atomic.h>
  32 #include <drm/drm_atomic_helper.h>
  33 #include <drm/drm_atomic_uapi.h>
  34 #include <drm/drm_damage_helper.h>
  35 #include <drm/drm_device.h>
  36 #include <drm/drm_plane_helper.h>
  37 #include <drm/drm_print.h>
  38 #include <drm/drm_self_refresh_helper.h>
  39 #include <drm/drm_vblank.h>
  40 #include <drm/drm_writeback.h>
  41 
  42 #include "drm_crtc_helper_internal.h"
  43 #include "drm_crtc_internal.h"
  44 
  45 
  46 
  47 
  48 
  49 
  50 
  51 
  52 
  53 
  54 
  55 
  56 
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 
  65 
  66 
  67 
  68 
  69 
  70 
  71 
  72 static void
  73 drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
  74                                 struct drm_plane_state *old_plane_state,
  75                                 struct drm_plane_state *plane_state,
  76                                 struct drm_plane *plane)
  77 {
  78         struct drm_crtc_state *crtc_state;
  79 
  80         if (old_plane_state->crtc) {
  81                 crtc_state = drm_atomic_get_new_crtc_state(state,
  82                                                            old_plane_state->crtc);
  83 
  84                 if (WARN_ON(!crtc_state))
  85                         return;
  86 
  87                 crtc_state->planes_changed = true;
  88         }
  89 
  90         if (plane_state->crtc) {
  91                 crtc_state = drm_atomic_get_new_crtc_state(state, plane_state->crtc);
  92 
  93                 if (WARN_ON(!crtc_state))
  94                         return;
  95 
  96                 crtc_state->planes_changed = true;
  97         }
  98 }
  99 
 100 
 101 
 102 
 103 
 104 static struct drm_encoder *
 105 pick_single_encoder_for_connector(struct drm_connector *connector)
 106 {
 107         WARN_ON(connector->encoder_ids[1]);
 108         return drm_encoder_find(connector->dev, NULL, connector->encoder_ids[0]);
 109 }
 110 
 111 static int handle_conflicting_encoders(struct drm_atomic_state *state,
 112                                        bool disable_conflicting_encoders)
 113 {
 114         struct drm_connector_state *new_conn_state;
 115         struct drm_connector *connector;
 116         struct drm_connector_list_iter conn_iter;
 117         struct drm_encoder *encoder;
 118         unsigned encoder_mask = 0;
 119         int i, ret = 0;
 120 
 121         
 122 
 123 
 124 
 125 
 126         for_each_new_connector_in_state(state, connector, new_conn_state, i) {
 127                 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
 128                 struct drm_encoder *new_encoder;
 129 
 130                 if (!new_conn_state->crtc)
 131                         continue;
 132 
 133                 if (funcs->atomic_best_encoder)
 134                         new_encoder = funcs->atomic_best_encoder(connector, new_conn_state);
 135                 else if (funcs->best_encoder)
 136                         new_encoder = funcs->best_encoder(connector);
 137                 else
 138                         new_encoder = pick_single_encoder_for_connector(connector);
 139 
 140                 if (new_encoder) {
 141                         if (encoder_mask & drm_encoder_mask(new_encoder)) {
 142                                 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] on [CONNECTOR:%d:%s] already assigned\n",
 143                                         new_encoder->base.id, new_encoder->name,
 144                                         connector->base.id, connector->name);
 145 
 146                                 return -EINVAL;
 147                         }
 148 
 149                         encoder_mask |= drm_encoder_mask(new_encoder);
 150                 }
 151         }
 152 
 153         if (!encoder_mask)
 154                 return 0;
 155 
 156         
 157 
 158 
 159 
 160 
 161 
 162 
 163 
 164 
 165 
 166 
 167         drm_connector_list_iter_begin(state->dev, &conn_iter);
 168         drm_for_each_connector_iter(connector, &conn_iter) {
 169                 struct drm_crtc_state *crtc_state;
 170 
 171                 if (drm_atomic_get_new_connector_state(state, connector))
 172                         continue;
 173 
 174                 encoder = connector->state->best_encoder;
 175                 if (!encoder || !(encoder_mask & drm_encoder_mask(encoder)))
 176                         continue;
 177 
 178                 if (!disable_conflicting_encoders) {
 179                         DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s] by [CONNECTOR:%d:%s]\n",
 180                                          encoder->base.id, encoder->name,
 181                                          connector->state->crtc->base.id,
 182                                          connector->state->crtc->name,
 183                                          connector->base.id, connector->name);
 184                         ret = -EINVAL;
 185                         goto out;
 186                 }
 187 
 188                 new_conn_state = drm_atomic_get_connector_state(state, connector);
 189                 if (IS_ERR(new_conn_state)) {
 190                         ret = PTR_ERR(new_conn_state);
 191                         goto out;
 192                 }
 193 
 194                 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], disabling [CONNECTOR:%d:%s]\n",
 195                                  encoder->base.id, encoder->name,
 196                                  new_conn_state->crtc->base.id, new_conn_state->crtc->name,
 197                                  connector->base.id, connector->name);
 198 
 199                 crtc_state = drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
 200 
 201                 ret = drm_atomic_set_crtc_for_connector(new_conn_state, NULL);
 202                 if (ret)
 203                         goto out;
 204 
 205                 if (!crtc_state->connector_mask) {
 206                         ret = drm_atomic_set_mode_prop_for_crtc(crtc_state,
 207                                                                 NULL);
 208                         if (ret < 0)
 209                                 goto out;
 210 
 211                         crtc_state->active = false;
 212                 }
 213         }
 214 out:
 215         drm_connector_list_iter_end(&conn_iter);
 216 
 217         return ret;
 218 }
 219 
 220 static void
 221 set_best_encoder(struct drm_atomic_state *state,
 222                  struct drm_connector_state *conn_state,
 223                  struct drm_encoder *encoder)
 224 {
 225         struct drm_crtc_state *crtc_state;
 226         struct drm_crtc *crtc;
 227 
 228         if (conn_state->best_encoder) {
 229                 
 230                 crtc = conn_state->connector->state->crtc;
 231 
 232                 
 233 
 234 
 235 
 236 
 237 
 238                 WARN_ON(!crtc && encoder != conn_state->best_encoder);
 239                 if (crtc) {
 240                         crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
 241 
 242                         crtc_state->encoder_mask &=
 243                                 ~drm_encoder_mask(conn_state->best_encoder);
 244                 }
 245         }
 246 
 247         if (encoder) {
 248                 crtc = conn_state->crtc;
 249                 WARN_ON(!crtc);
 250                 if (crtc) {
 251                         crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
 252 
 253                         crtc_state->encoder_mask |=
 254                                 drm_encoder_mask(encoder);
 255                 }
 256         }
 257 
 258         conn_state->best_encoder = encoder;
 259 }
 260 
 261 static void
 262 steal_encoder(struct drm_atomic_state *state,
 263               struct drm_encoder *encoder)
 264 {
 265         struct drm_crtc_state *crtc_state;
 266         struct drm_connector *connector;
 267         struct drm_connector_state *old_connector_state, *new_connector_state;
 268         int i;
 269 
 270         for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
 271                 struct drm_crtc *encoder_crtc;
 272 
 273                 if (new_connector_state->best_encoder != encoder)
 274                         continue;
 275 
 276                 encoder_crtc = old_connector_state->crtc;
 277 
 278                 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], stealing it\n",
 279                                  encoder->base.id, encoder->name,
 280                                  encoder_crtc->base.id, encoder_crtc->name);
 281 
 282                 set_best_encoder(state, new_connector_state, NULL);
 283 
 284                 crtc_state = drm_atomic_get_new_crtc_state(state, encoder_crtc);
 285                 crtc_state->connectors_changed = true;
 286 
 287                 return;
 288         }
 289 }
 290 
 291 static int
 292 update_connector_routing(struct drm_atomic_state *state,
 293                          struct drm_connector *connector,
 294                          struct drm_connector_state *old_connector_state,
 295                          struct drm_connector_state *new_connector_state)
 296 {
 297         const struct drm_connector_helper_funcs *funcs;
 298         struct drm_encoder *new_encoder;
 299         struct drm_crtc_state *crtc_state;
 300 
 301         DRM_DEBUG_ATOMIC("Updating routing for [CONNECTOR:%d:%s]\n",
 302                          connector->base.id,
 303                          connector->name);
 304 
 305         if (old_connector_state->crtc != new_connector_state->crtc) {
 306                 if (old_connector_state->crtc) {
 307                         crtc_state = drm_atomic_get_new_crtc_state(state, old_connector_state->crtc);
 308                         crtc_state->connectors_changed = true;
 309                 }
 310 
 311                 if (new_connector_state->crtc) {
 312                         crtc_state = drm_atomic_get_new_crtc_state(state, new_connector_state->crtc);
 313                         crtc_state->connectors_changed = true;
 314                 }
 315         }
 316 
 317         if (!new_connector_state->crtc) {
 318                 DRM_DEBUG_ATOMIC("Disabling [CONNECTOR:%d:%s]\n",
 319                                 connector->base.id,
 320                                 connector->name);
 321 
 322                 set_best_encoder(state, new_connector_state, NULL);
 323 
 324                 return 0;
 325         }
 326 
 327         crtc_state = drm_atomic_get_new_crtc_state(state,
 328                                                    new_connector_state->crtc);
 329         
 330 
 331 
 332 
 333 
 334 
 335 
 336 
 337 
 338 
 339 
 340 
 341 
 342 
 343 
 344 
 345 
 346 
 347         if (!state->duplicated && drm_connector_is_unregistered(connector) &&
 348             crtc_state->active) {
 349                 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] is not registered\n",
 350                                  connector->base.id, connector->name);
 351                 return -EINVAL;
 352         }
 353 
 354         funcs = connector->helper_private;
 355 
 356         if (funcs->atomic_best_encoder)
 357                 new_encoder = funcs->atomic_best_encoder(connector,
 358                                                          new_connector_state);
 359         else if (funcs->best_encoder)
 360                 new_encoder = funcs->best_encoder(connector);
 361         else
 362                 new_encoder = pick_single_encoder_for_connector(connector);
 363 
 364         if (!new_encoder) {
 365                 DRM_DEBUG_ATOMIC("No suitable encoder found for [CONNECTOR:%d:%s]\n",
 366                                  connector->base.id,
 367                                  connector->name);
 368                 return -EINVAL;
 369         }
 370 
 371         if (!drm_encoder_crtc_ok(new_encoder, new_connector_state->crtc)) {
 372                 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] incompatible with [CRTC:%d:%s]\n",
 373                                  new_encoder->base.id,
 374                                  new_encoder->name,
 375                                  new_connector_state->crtc->base.id,
 376                                  new_connector_state->crtc->name);
 377                 return -EINVAL;
 378         }
 379 
 380         if (new_encoder == new_connector_state->best_encoder) {
 381                 set_best_encoder(state, new_connector_state, new_encoder);
 382 
 383                 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d:%s]\n",
 384                                  connector->base.id,
 385                                  connector->name,
 386                                  new_encoder->base.id,
 387                                  new_encoder->name,
 388                                  new_connector_state->crtc->base.id,
 389                                  new_connector_state->crtc->name);
 390 
 391                 return 0;
 392         }
 393 
 394         steal_encoder(state, new_encoder);
 395 
 396         set_best_encoder(state, new_connector_state, new_encoder);
 397 
 398         crtc_state->connectors_changed = true;
 399 
 400         DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n",
 401                          connector->base.id,
 402                          connector->name,
 403                          new_encoder->base.id,
 404                          new_encoder->name,
 405                          new_connector_state->crtc->base.id,
 406                          new_connector_state->crtc->name);
 407 
 408         return 0;
 409 }
 410 
 411 static int
 412 mode_fixup(struct drm_atomic_state *state)
 413 {
 414         struct drm_crtc *crtc;
 415         struct drm_crtc_state *new_crtc_state;
 416         struct drm_connector *connector;
 417         struct drm_connector_state *new_conn_state;
 418         int i;
 419         int ret;
 420 
 421         for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
 422                 if (!new_crtc_state->mode_changed &&
 423                     !new_crtc_state->connectors_changed)
 424                         continue;
 425 
 426                 drm_mode_copy(&new_crtc_state->adjusted_mode, &new_crtc_state->mode);
 427         }
 428 
 429         for_each_new_connector_in_state(state, connector, new_conn_state, i) {
 430                 const struct drm_encoder_helper_funcs *funcs;
 431                 struct drm_encoder *encoder;
 432 
 433                 WARN_ON(!!new_conn_state->best_encoder != !!new_conn_state->crtc);
 434 
 435                 if (!new_conn_state->crtc || !new_conn_state->best_encoder)
 436                         continue;
 437 
 438                 new_crtc_state =
 439                         drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
 440 
 441                 
 442 
 443 
 444 
 445                 encoder = new_conn_state->best_encoder;
 446                 funcs = encoder->helper_private;
 447 
 448                 ret = drm_bridge_mode_fixup(encoder->bridge, &new_crtc_state->mode,
 449                                 &new_crtc_state->adjusted_mode);
 450                 if (!ret) {
 451                         DRM_DEBUG_ATOMIC("Bridge fixup failed\n");
 452                         return -EINVAL;
 453                 }
 454 
 455                 if (funcs && funcs->atomic_check) {
 456                         ret = funcs->atomic_check(encoder, new_crtc_state,
 457                                                   new_conn_state);
 458                         if (ret) {
 459                                 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] check failed\n",
 460                                                  encoder->base.id, encoder->name);
 461                                 return ret;
 462                         }
 463                 } else if (funcs && funcs->mode_fixup) {
 464                         ret = funcs->mode_fixup(encoder, &new_crtc_state->mode,
 465                                                 &new_crtc_state->adjusted_mode);
 466                         if (!ret) {
 467                                 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] fixup failed\n",
 468                                                  encoder->base.id, encoder->name);
 469                                 return -EINVAL;
 470                         }
 471                 }
 472         }
 473 
 474         for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
 475                 const struct drm_crtc_helper_funcs *funcs;
 476 
 477                 if (!new_crtc_state->enable)
 478                         continue;
 479 
 480                 if (!new_crtc_state->mode_changed &&
 481                     !new_crtc_state->connectors_changed)
 482                         continue;
 483 
 484                 funcs = crtc->helper_private;
 485                 if (!funcs->mode_fixup)
 486                         continue;
 487 
 488                 ret = funcs->mode_fixup(crtc, &new_crtc_state->mode,
 489                                         &new_crtc_state->adjusted_mode);
 490                 if (!ret) {
 491                         DRM_DEBUG_ATOMIC("[CRTC:%d:%s] fixup failed\n",
 492                                          crtc->base.id, crtc->name);
 493                         return -EINVAL;
 494                 }
 495         }
 496 
 497         return 0;
 498 }
 499 
 500 static enum drm_mode_status mode_valid_path(struct drm_connector *connector,
 501                                             struct drm_encoder *encoder,
 502                                             struct drm_crtc *crtc,
 503                                             const struct drm_display_mode *mode)
 504 {
 505         enum drm_mode_status ret;
 506 
 507         ret = drm_encoder_mode_valid(encoder, mode);
 508         if (ret != MODE_OK) {
 509                 DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] mode_valid() failed\n",
 510                                 encoder->base.id, encoder->name);
 511                 return ret;
 512         }
 513 
 514         ret = drm_bridge_mode_valid(encoder->bridge, mode);
 515         if (ret != MODE_OK) {
 516                 DRM_DEBUG_ATOMIC("[BRIDGE] mode_valid() failed\n");
 517                 return ret;
 518         }
 519 
 520         ret = drm_crtc_mode_valid(crtc, mode);
 521         if (ret != MODE_OK) {
 522                 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] mode_valid() failed\n",
 523                                 crtc->base.id, crtc->name);
 524                 return ret;
 525         }
 526 
 527         return ret;
 528 }
 529 
 530 static int
 531 mode_valid(struct drm_atomic_state *state)
 532 {
 533         struct drm_connector_state *conn_state;
 534         struct drm_connector *connector;
 535         int i;
 536 
 537         for_each_new_connector_in_state(state, connector, conn_state, i) {
 538                 struct drm_encoder *encoder = conn_state->best_encoder;
 539                 struct drm_crtc *crtc = conn_state->crtc;
 540                 struct drm_crtc_state *crtc_state;
 541                 enum drm_mode_status mode_status;
 542                 const struct drm_display_mode *mode;
 543 
 544                 if (!crtc || !encoder)
 545                         continue;
 546 
 547                 crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
 548                 if (!crtc_state)
 549                         continue;
 550                 if (!crtc_state->mode_changed && !crtc_state->connectors_changed)
 551                         continue;
 552 
 553                 mode = &crtc_state->mode;
 554 
 555                 mode_status = mode_valid_path(connector, encoder, crtc, mode);
 556                 if (mode_status != MODE_OK)
 557                         return -EINVAL;
 558         }
 559 
 560         return 0;
 561 }
 562 
 563 
 564 
 565 
 566 
 567 
 568 
 569 
 570 
 571 
 572 
 573 
 574 
 575 
 576 
 577 
 578 
 579 
 580 
 581 
 582 
 583 
 584 
 585 
 586 
 587 
 588 
 589 
 590 
 591 
 592 
 593 
 594 
 595 
 596 
 597 
 598 
 599 
 600 
 601 
 602 
 603 
 604 
 605 
 606 int
 607 drm_atomic_helper_check_modeset(struct drm_device *dev,
 608                                 struct drm_atomic_state *state)
 609 {
 610         struct drm_crtc *crtc;
 611         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
 612         struct drm_connector *connector;
 613         struct drm_connector_state *old_connector_state, *new_connector_state;
 614         int i, ret;
 615         unsigned connectors_mask = 0;
 616 
 617         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
 618                 bool has_connectors =
 619                         !!new_crtc_state->connector_mask;
 620 
 621                 WARN_ON(!drm_modeset_is_locked(&crtc->mutex));
 622 
 623                 if (!drm_mode_equal(&old_crtc_state->mode, &new_crtc_state->mode)) {
 624                         DRM_DEBUG_ATOMIC("[CRTC:%d:%s] mode changed\n",
 625                                          crtc->base.id, crtc->name);
 626                         new_crtc_state->mode_changed = true;
 627                 }
 628 
 629                 if (old_crtc_state->enable != new_crtc_state->enable) {
 630                         DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enable changed\n",
 631                                          crtc->base.id, crtc->name);
 632 
 633                         
 634 
 635 
 636 
 637 
 638 
 639 
 640 
 641                         new_crtc_state->mode_changed = true;
 642                         new_crtc_state->connectors_changed = true;
 643                 }
 644 
 645                 if (old_crtc_state->active != new_crtc_state->active) {
 646                         DRM_DEBUG_ATOMIC("[CRTC:%d:%s] active changed\n",
 647                                          crtc->base.id, crtc->name);
 648                         new_crtc_state->active_changed = true;
 649                 }
 650 
 651                 if (new_crtc_state->enable != has_connectors) {
 652                         DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enabled/connectors mismatch\n",
 653                                          crtc->base.id, crtc->name);
 654 
 655                         return -EINVAL;
 656                 }
 657         }
 658 
 659         ret = handle_conflicting_encoders(state, false);
 660         if (ret)
 661                 return ret;
 662 
 663         for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
 664                 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
 665 
 666                 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
 667 
 668                 
 669 
 670 
 671 
 672 
 673                 ret = update_connector_routing(state, connector,
 674                                                old_connector_state,
 675                                                new_connector_state);
 676                 if (ret)
 677                         return ret;
 678                 if (old_connector_state->crtc) {
 679                         new_crtc_state = drm_atomic_get_new_crtc_state(state,
 680                                                                        old_connector_state->crtc);
 681                         if (old_connector_state->link_status !=
 682                             new_connector_state->link_status)
 683                                 new_crtc_state->connectors_changed = true;
 684 
 685                         if (old_connector_state->max_requested_bpc !=
 686                             new_connector_state->max_requested_bpc)
 687                                 new_crtc_state->connectors_changed = true;
 688                 }
 689 
 690                 if (funcs->atomic_check)
 691                         ret = funcs->atomic_check(connector, state);
 692                 if (ret)
 693                         return ret;
 694 
 695                 connectors_mask |= BIT(i);
 696         }
 697 
 698         
 699 
 700 
 701 
 702 
 703 
 704         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
 705                 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
 706                         continue;
 707 
 708                 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] needs all connectors, enable: %c, active: %c\n",
 709                                  crtc->base.id, crtc->name,
 710                                  new_crtc_state->enable ? 'y' : 'n',
 711                                  new_crtc_state->active ? 'y' : 'n');
 712 
 713                 ret = drm_atomic_add_affected_connectors(state, crtc);
 714                 if (ret != 0)
 715                         return ret;
 716 
 717                 ret = drm_atomic_add_affected_planes(state, crtc);
 718                 if (ret != 0)
 719                         return ret;
 720         }
 721 
 722         
 723 
 724 
 725 
 726         for_each_oldnew_connector_in_state(state, connector, old_connector_state, new_connector_state, i) {
 727                 const struct drm_connector_helper_funcs *funcs = connector->helper_private;
 728 
 729                 if (connectors_mask & BIT(i))
 730                         continue;
 731 
 732                 if (funcs->atomic_check)
 733                         ret = funcs->atomic_check(connector, state);
 734                 if (ret)
 735                         return ret;
 736         }
 737 
 738         ret = mode_valid(state);
 739         if (ret)
 740                 return ret;
 741 
 742         return mode_fixup(state);
 743 }
 744 EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
 745 
 746 
 747 
 748 
 749 
 750 
 751 
 752 
 753 
 754 
 755 
 756 
 757 
 758 
 759 
 760 
 761 
 762 
 763 
 764 
 765 
 766 
 767 int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
 768                                         const struct drm_crtc_state *crtc_state,
 769                                         int min_scale,
 770                                         int max_scale,
 771                                         bool can_position,
 772                                         bool can_update_disabled)
 773 {
 774         struct drm_framebuffer *fb = plane_state->fb;
 775         struct drm_rect *src = &plane_state->src;
 776         struct drm_rect *dst = &plane_state->dst;
 777         unsigned int rotation = plane_state->rotation;
 778         struct drm_rect clip = {};
 779         int hscale, vscale;
 780 
 781         WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
 782 
 783         *src = drm_plane_state_src(plane_state);
 784         *dst = drm_plane_state_dest(plane_state);
 785 
 786         if (!fb) {
 787                 plane_state->visible = false;
 788                 return 0;
 789         }
 790 
 791         
 792         if (WARN_ON(!plane_state->crtc)) {
 793                 plane_state->visible = false;
 794                 return 0;
 795         }
 796 
 797         if (!crtc_state->enable && !can_update_disabled) {
 798                 DRM_DEBUG_KMS("Cannot update plane of a disabled CRTC.\n");
 799                 return -EINVAL;
 800         }
 801 
 802         drm_rect_rotate(src, fb->width << 16, fb->height << 16, rotation);
 803 
 804         
 805         hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
 806         vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
 807         if (hscale < 0 || vscale < 0) {
 808                 DRM_DEBUG_KMS("Invalid scaling of plane\n");
 809                 drm_rect_debug_print("src: ", &plane_state->src, true);
 810                 drm_rect_debug_print("dst: ", &plane_state->dst, false);
 811                 return -ERANGE;
 812         }
 813 
 814         if (crtc_state->enable)
 815                 drm_mode_get_hv_timing(&crtc_state->mode, &clip.x2, &clip.y2);
 816 
 817         plane_state->visible = drm_rect_clip_scaled(src, dst, &clip);
 818 
 819         drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16, rotation);
 820 
 821         if (!plane_state->visible)
 822                 
 823 
 824 
 825 
 826 
 827 
 828 
 829                 return 0;
 830 
 831         if (!can_position && !drm_rect_equals(dst, &clip)) {
 832                 DRM_DEBUG_KMS("Plane must cover entire CRTC\n");
 833                 drm_rect_debug_print("dst: ", dst, false);
 834                 drm_rect_debug_print("clip: ", &clip, false);
 835                 return -EINVAL;
 836         }
 837 
 838         return 0;
 839 }
 840 EXPORT_SYMBOL(drm_atomic_helper_check_plane_state);
 841 
 842 
 843 
 844 
 845 
 846 
 847 
 848 
 849 
 850 
 851 
 852 
 853 
 854 
 855 
 856 
 857 
 858 int
 859 drm_atomic_helper_check_planes(struct drm_device *dev,
 860                                struct drm_atomic_state *state)
 861 {
 862         struct drm_crtc *crtc;
 863         struct drm_crtc_state *new_crtc_state;
 864         struct drm_plane *plane;
 865         struct drm_plane_state *new_plane_state, *old_plane_state;
 866         int i, ret = 0;
 867 
 868         for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
 869                 const struct drm_plane_helper_funcs *funcs;
 870 
 871                 WARN_ON(!drm_modeset_is_locked(&plane->mutex));
 872 
 873                 funcs = plane->helper_private;
 874 
 875                 drm_atomic_helper_plane_changed(state, old_plane_state, new_plane_state, plane);
 876 
 877                 drm_atomic_helper_check_plane_damage(state, new_plane_state);
 878 
 879                 if (!funcs || !funcs->atomic_check)
 880                         continue;
 881 
 882                 ret = funcs->atomic_check(plane, new_plane_state);
 883                 if (ret) {
 884                         DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic driver check failed\n",
 885                                          plane->base.id, plane->name);
 886                         return ret;
 887                 }
 888         }
 889 
 890         for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
 891                 const struct drm_crtc_helper_funcs *funcs;
 892 
 893                 funcs = crtc->helper_private;
 894 
 895                 if (!funcs || !funcs->atomic_check)
 896                         continue;
 897 
 898                 ret = funcs->atomic_check(crtc, new_crtc_state);
 899                 if (ret) {
 900                         DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic driver check failed\n",
 901                                          crtc->base.id, crtc->name);
 902                         return ret;
 903                 }
 904         }
 905 
 906         return ret;
 907 }
 908 EXPORT_SYMBOL(drm_atomic_helper_check_planes);
 909 
 910 
 911 
 912 
 913 
 914 
 915 
 916 
 917 
 918 
 919 
 920 
 921 
 922 
 923 
 924 
 925 
 926 
 927 
 928 
 929 
 930 
 931 
 932 
 933 
 934 
 935 
 936 int drm_atomic_helper_check(struct drm_device *dev,
 937                             struct drm_atomic_state *state)
 938 {
 939         int ret;
 940 
 941         ret = drm_atomic_helper_check_modeset(dev, state);
 942         if (ret)
 943                 return ret;
 944 
 945         if (dev->mode_config.normalize_zpos) {
 946                 ret = drm_atomic_normalize_zpos(dev, state);
 947                 if (ret)
 948                         return ret;
 949         }
 950 
 951         ret = drm_atomic_helper_check_planes(dev, state);
 952         if (ret)
 953                 return ret;
 954 
 955         if (state->legacy_cursor_update)
 956                 state->async_update = !drm_atomic_helper_async_check(dev, state);
 957 
 958         drm_self_refresh_helper_alter_state(state);
 959 
 960         return ret;
 961 }
 962 EXPORT_SYMBOL(drm_atomic_helper_check);
 963 
 964 static bool
 965 crtc_needs_disable(struct drm_crtc_state *old_state,
 966                    struct drm_crtc_state *new_state)
 967 {
 968         
 969 
 970 
 971 
 972         if (!new_state)
 973                 return drm_atomic_crtc_effectively_active(old_state);
 974 
 975         
 976 
 977 
 978 
 979 
 980         return old_state->active ||
 981                (old_state->self_refresh_active && !new_state->enable) ||
 982                new_state->self_refresh_active;
 983 }
 984 
 985 static void
 986 disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
 987 {
 988         struct drm_connector *connector;
 989         struct drm_connector_state *old_conn_state, *new_conn_state;
 990         struct drm_crtc *crtc;
 991         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
 992         int i;
 993 
 994         for_each_oldnew_connector_in_state(old_state, connector, old_conn_state, new_conn_state, i) {
 995                 const struct drm_encoder_helper_funcs *funcs;
 996                 struct drm_encoder *encoder;
 997 
 998                 
 999 
1000                 if (!old_conn_state->crtc)
1001                         continue;
1002 
1003                 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, old_conn_state->crtc);
1004 
1005                 if (new_conn_state->crtc)
1006                         new_crtc_state = drm_atomic_get_new_crtc_state(
1007                                                 old_state,
1008                                                 new_conn_state->crtc);
1009                 else
1010                         new_crtc_state = NULL;
1011 
1012                 if (!crtc_needs_disable(old_crtc_state, new_crtc_state) ||
1013                     !drm_atomic_crtc_needs_modeset(old_conn_state->crtc->state))
1014                         continue;
1015 
1016                 encoder = old_conn_state->best_encoder;
1017 
1018                 
1019 
1020 
1021                 if (WARN_ON(!encoder))
1022                         continue;
1023 
1024                 funcs = encoder->helper_private;
1025 
1026                 DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n",
1027                                  encoder->base.id, encoder->name);
1028 
1029                 
1030 
1031 
1032 
1033                 drm_atomic_bridge_disable(encoder->bridge, old_state);
1034 
1035                 
1036                 if (funcs) {
1037                         if (funcs->atomic_disable)
1038                                 funcs->atomic_disable(encoder, old_state);
1039                         else if (new_conn_state->crtc && funcs->prepare)
1040                                 funcs->prepare(encoder);
1041                         else if (funcs->disable)
1042                                 funcs->disable(encoder);
1043                         else if (funcs->dpms)
1044                                 funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
1045                 }
1046 
1047                 drm_atomic_bridge_post_disable(encoder->bridge, old_state);
1048         }
1049 
1050         for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
1051                 const struct drm_crtc_helper_funcs *funcs;
1052                 int ret;
1053 
1054                 
1055                 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
1056                         continue;
1057 
1058                 if (!crtc_needs_disable(old_crtc_state, new_crtc_state))
1059                         continue;
1060 
1061                 funcs = crtc->helper_private;
1062 
1063                 DRM_DEBUG_ATOMIC("disabling [CRTC:%d:%s]\n",
1064                                  crtc->base.id, crtc->name);
1065 
1066 
1067                 
1068                 if (new_crtc_state->enable && funcs->prepare)
1069                         funcs->prepare(crtc);
1070                 else if (funcs->atomic_disable)
1071                         funcs->atomic_disable(crtc, old_crtc_state);
1072                 else if (funcs->disable)
1073                         funcs->disable(crtc);
1074                 else if (funcs->dpms)
1075                         funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
1076 
1077                 if (!(dev->irq_enabled && dev->num_crtcs))
1078                         continue;
1079 
1080                 ret = drm_crtc_vblank_get(crtc);
1081                 WARN_ONCE(ret != -EINVAL, "driver forgot to call drm_crtc_vblank_off()\n");
1082                 if (ret == 0)
1083                         drm_crtc_vblank_put(crtc);
1084         }
1085 }
1086 
1087 
1088 
1089 
1090 
1091 
1092 
1093 
1094 
1095 
1096 
1097 
1098 
1099 
1100 
1101 
1102 
1103 
1104 
1105 
1106 void
1107 drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev,
1108                                               struct drm_atomic_state *old_state)
1109 {
1110         struct drm_connector *connector;
1111         struct drm_connector_state *old_conn_state, *new_conn_state;
1112         struct drm_crtc *crtc;
1113         struct drm_crtc_state *new_crtc_state;
1114         int i;
1115 
1116         
1117         for_each_oldnew_connector_in_state(old_state, connector, old_conn_state, new_conn_state, i) {
1118                 if (connector->encoder) {
1119                         WARN_ON(!connector->encoder->crtc);
1120 
1121                         connector->encoder->crtc = NULL;
1122                         connector->encoder = NULL;
1123                 }
1124 
1125                 crtc = new_conn_state->crtc;
1126                 if ((!crtc && old_conn_state->crtc) ||
1127                     (crtc && drm_atomic_crtc_needs_modeset(crtc->state))) {
1128                         int mode = DRM_MODE_DPMS_OFF;
1129 
1130                         if (crtc && crtc->state->active)
1131                                 mode = DRM_MODE_DPMS_ON;
1132 
1133                         connector->dpms = mode;
1134                 }
1135         }
1136 
1137         
1138         for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
1139                 if (!new_conn_state->crtc)
1140                         continue;
1141 
1142                 if (WARN_ON(!new_conn_state->best_encoder))
1143                         continue;
1144 
1145                 connector->encoder = new_conn_state->best_encoder;
1146                 connector->encoder->crtc = new_conn_state->crtc;
1147         }
1148 
1149         
1150         for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
1151                 struct drm_plane *primary = crtc->primary;
1152                 struct drm_plane_state *new_plane_state;
1153 
1154                 crtc->mode = new_crtc_state->mode;
1155                 crtc->enabled = new_crtc_state->enable;
1156 
1157                 new_plane_state =
1158                         drm_atomic_get_new_plane_state(old_state, primary);
1159 
1160                 if (new_plane_state && new_plane_state->crtc == crtc) {
1161                         crtc->x = new_plane_state->src_x >> 16;
1162                         crtc->y = new_plane_state->src_y >> 16;
1163                 }
1164 
1165                 if (new_crtc_state->enable)
1166                         drm_calc_timestamping_constants(crtc,
1167                                                         &new_crtc_state->adjusted_mode);
1168         }
1169 }
1170 EXPORT_SYMBOL(drm_atomic_helper_update_legacy_modeset_state);
1171 
1172 static void
1173 crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
1174 {
1175         struct drm_crtc *crtc;
1176         struct drm_crtc_state *new_crtc_state;
1177         struct drm_connector *connector;
1178         struct drm_connector_state *new_conn_state;
1179         int i;
1180 
1181         for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
1182                 const struct drm_crtc_helper_funcs *funcs;
1183 
1184                 if (!new_crtc_state->mode_changed)
1185                         continue;
1186 
1187                 funcs = crtc->helper_private;
1188 
1189                 if (new_crtc_state->enable && funcs->mode_set_nofb) {
1190                         DRM_DEBUG_ATOMIC("modeset on [CRTC:%d:%s]\n",
1191                                          crtc->base.id, crtc->name);
1192 
1193                         funcs->mode_set_nofb(crtc);
1194                 }
1195         }
1196 
1197         for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
1198                 const struct drm_encoder_helper_funcs *funcs;
1199                 struct drm_encoder *encoder;
1200                 struct drm_display_mode *mode, *adjusted_mode;
1201 
1202                 if (!new_conn_state->best_encoder)
1203                         continue;
1204 
1205                 encoder = new_conn_state->best_encoder;
1206                 funcs = encoder->helper_private;
1207                 new_crtc_state = new_conn_state->crtc->state;
1208                 mode = &new_crtc_state->mode;
1209                 adjusted_mode = &new_crtc_state->adjusted_mode;
1210 
1211                 if (!new_crtc_state->mode_changed)
1212                         continue;
1213 
1214                 DRM_DEBUG_ATOMIC("modeset on [ENCODER:%d:%s]\n",
1215                                  encoder->base.id, encoder->name);
1216 
1217                 
1218 
1219 
1220 
1221                 if (funcs && funcs->atomic_mode_set) {
1222                         funcs->atomic_mode_set(encoder, new_crtc_state,
1223                                                new_conn_state);
1224                 } else if (funcs && funcs->mode_set) {
1225                         funcs->mode_set(encoder, mode, adjusted_mode);
1226                 }
1227 
1228                 drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode);
1229         }
1230 }
1231 
1232 
1233 
1234 
1235 
1236 
1237 
1238 
1239 
1240 
1241 
1242 
1243 
1244 
1245 
1246 void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
1247                                                struct drm_atomic_state *old_state)
1248 {
1249         disable_outputs(dev, old_state);
1250 
1251         drm_atomic_helper_update_legacy_modeset_state(dev, old_state);
1252 
1253         crtc_set_mode(dev, old_state);
1254 }
1255 EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables);
1256 
1257 static void drm_atomic_helper_commit_writebacks(struct drm_device *dev,
1258                                                 struct drm_atomic_state *old_state)
1259 {
1260         struct drm_connector *connector;
1261         struct drm_connector_state *new_conn_state;
1262         int i;
1263 
1264         for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
1265                 const struct drm_connector_helper_funcs *funcs;
1266 
1267                 funcs = connector->helper_private;
1268                 if (!funcs->atomic_commit)
1269                         continue;
1270 
1271                 if (new_conn_state->writeback_job && new_conn_state->writeback_job->fb) {
1272                         WARN_ON(connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK);
1273                         funcs->atomic_commit(connector, new_conn_state);
1274                 }
1275         }
1276 }
1277 
1278 
1279 
1280 
1281 
1282 
1283 
1284 
1285 
1286 
1287 
1288 
1289 
1290 
1291 
1292 void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
1293                                               struct drm_atomic_state *old_state)
1294 {
1295         struct drm_crtc *crtc;
1296         struct drm_crtc_state *old_crtc_state;
1297         struct drm_crtc_state *new_crtc_state;
1298         struct drm_connector *connector;
1299         struct drm_connector_state *new_conn_state;
1300         int i;
1301 
1302         for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
1303                 const struct drm_crtc_helper_funcs *funcs;
1304 
1305                 
1306                 if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
1307                         continue;
1308 
1309                 if (!new_crtc_state->active)
1310                         continue;
1311 
1312                 funcs = crtc->helper_private;
1313 
1314                 if (new_crtc_state->enable) {
1315                         DRM_DEBUG_ATOMIC("enabling [CRTC:%d:%s]\n",
1316                                          crtc->base.id, crtc->name);
1317                         if (funcs->atomic_enable)
1318                                 funcs->atomic_enable(crtc, old_crtc_state);
1319                         else if (funcs->commit)
1320                                 funcs->commit(crtc);
1321                 }
1322         }
1323 
1324         for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
1325                 const struct drm_encoder_helper_funcs *funcs;
1326                 struct drm_encoder *encoder;
1327 
1328                 if (!new_conn_state->best_encoder)
1329                         continue;
1330 
1331                 if (!new_conn_state->crtc->state->active ||
1332                     !drm_atomic_crtc_needs_modeset(new_conn_state->crtc->state))
1333                         continue;
1334 
1335                 encoder = new_conn_state->best_encoder;
1336                 funcs = encoder->helper_private;
1337 
1338                 DRM_DEBUG_ATOMIC("enabling [ENCODER:%d:%s]\n",
1339                                  encoder->base.id, encoder->name);
1340 
1341                 
1342 
1343 
1344 
1345                 drm_atomic_bridge_pre_enable(encoder->bridge, old_state);
1346 
1347                 if (funcs) {
1348                         if (funcs->atomic_enable)
1349                                 funcs->atomic_enable(encoder, old_state);
1350                         else if (funcs->enable)
1351                                 funcs->enable(encoder);
1352                         else if (funcs->commit)
1353                                 funcs->commit(encoder);
1354                 }
1355 
1356                 drm_atomic_bridge_enable(encoder->bridge, old_state);
1357         }
1358 
1359         drm_atomic_helper_commit_writebacks(dev, old_state);
1360 }
1361 EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
1362 
1363 
1364 
1365 
1366 
1367 
1368 
1369 
1370 
1371 
1372 
1373 
1374 
1375 
1376 
1377 
1378 
1379 
1380 
1381 
1382 
1383 
1384 int drm_atomic_helper_wait_for_fences(struct drm_device *dev,
1385                                       struct drm_atomic_state *state,
1386                                       bool pre_swap)
1387 {
1388         struct drm_plane *plane;
1389         struct drm_plane_state *new_plane_state;
1390         int i, ret;
1391 
1392         for_each_new_plane_in_state(state, plane, new_plane_state, i) {
1393                 if (!new_plane_state->fence)
1394                         continue;
1395 
1396                 WARN_ON(!new_plane_state->fb);
1397 
1398                 
1399 
1400 
1401 
1402 
1403                 ret = dma_fence_wait(new_plane_state->fence, pre_swap);
1404                 if (ret)
1405                         return ret;
1406 
1407                 dma_fence_put(new_plane_state->fence);
1408                 new_plane_state->fence = NULL;
1409         }
1410 
1411         return 0;
1412 }
1413 EXPORT_SYMBOL(drm_atomic_helper_wait_for_fences);
1414 
1415 
1416 
1417 
1418 
1419 
1420 
1421 
1422 
1423 
1424 
1425 
1426 
1427 
1428 
1429 
1430 void
1431 drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
1432                 struct drm_atomic_state *old_state)
1433 {
1434         struct drm_crtc *crtc;
1435         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
1436         int i, ret;
1437         unsigned crtc_mask = 0;
1438 
1439          
1440 
1441 
1442 
1443         if (old_state->legacy_cursor_update)
1444                 return;
1445 
1446         for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
1447                 if (!new_crtc_state->active)
1448                         continue;
1449 
1450                 ret = drm_crtc_vblank_get(crtc);
1451                 if (ret != 0)
1452                         continue;
1453 
1454                 crtc_mask |= drm_crtc_mask(crtc);
1455                 old_state->crtcs[i].last_vblank_count = drm_crtc_vblank_count(crtc);
1456         }
1457 
1458         for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
1459                 if (!(crtc_mask & drm_crtc_mask(crtc)))
1460                         continue;
1461 
1462                 ret = wait_event_timeout(dev->vblank[i].queue,
1463                                 old_state->crtcs[i].last_vblank_count !=
1464                                         drm_crtc_vblank_count(crtc),
1465                                 msecs_to_jiffies(100));
1466 
1467                 WARN(!ret, "[CRTC:%d:%s] vblank wait timed out\n",
1468                      crtc->base.id, crtc->name);
1469 
1470                 drm_crtc_vblank_put(crtc);
1471         }
1472 }
1473 EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks);
1474 
1475 
1476 
1477 
1478 
1479 
1480 
1481 
1482 
1483 
1484 
1485 
1486 
1487 
1488 
1489 
1490 void drm_atomic_helper_wait_for_flip_done(struct drm_device *dev,
1491                                           struct drm_atomic_state *old_state)
1492 {
1493         struct drm_crtc *crtc;
1494         int i;
1495 
1496         for (i = 0; i < dev->mode_config.num_crtc; i++) {
1497                 struct drm_crtc_commit *commit = old_state->crtcs[i].commit;
1498                 int ret;
1499 
1500                 crtc = old_state->crtcs[i].ptr;
1501 
1502                 if (!crtc || !commit)
1503                         continue;
1504 
1505                 ret = wait_for_completion_timeout(&commit->flip_done, 10 * HZ);
1506                 if (ret == 0)
1507                         DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
1508                                   crtc->base.id, crtc->name);
1509         }
1510 
1511         if (old_state->fake_commit)
1512                 complete_all(&old_state->fake_commit->flip_done);
1513 }
1514 EXPORT_SYMBOL(drm_atomic_helper_wait_for_flip_done);
1515 
1516 
1517 
1518 
1519 
1520 
1521 
1522 
1523 
1524 
1525 
1526 
1527 
1528 
1529 void drm_atomic_helper_commit_tail(struct drm_atomic_state *old_state)
1530 {
1531         struct drm_device *dev = old_state->dev;
1532 
1533         drm_atomic_helper_commit_modeset_disables(dev, old_state);
1534 
1535         drm_atomic_helper_commit_planes(dev, old_state, 0);
1536 
1537         drm_atomic_helper_commit_modeset_enables(dev, old_state);
1538 
1539         drm_atomic_helper_fake_vblank(old_state);
1540 
1541         drm_atomic_helper_commit_hw_done(old_state);
1542 
1543         drm_atomic_helper_wait_for_vblanks(dev, old_state);
1544 
1545         drm_atomic_helper_cleanup_planes(dev, old_state);
1546 }
1547 EXPORT_SYMBOL(drm_atomic_helper_commit_tail);
1548 
1549 
1550 
1551 
1552 
1553 
1554 
1555 
1556 
1557 
1558 
1559 void drm_atomic_helper_commit_tail_rpm(struct drm_atomic_state *old_state)
1560 {
1561         struct drm_device *dev = old_state->dev;
1562 
1563         drm_atomic_helper_commit_modeset_disables(dev, old_state);
1564 
1565         drm_atomic_helper_commit_modeset_enables(dev, old_state);
1566 
1567         drm_atomic_helper_commit_planes(dev, old_state,
1568                                         DRM_PLANE_COMMIT_ACTIVE_ONLY);
1569 
1570         drm_atomic_helper_fake_vblank(old_state);
1571 
1572         drm_atomic_helper_commit_hw_done(old_state);
1573 
1574         drm_atomic_helper_wait_for_vblanks(dev, old_state);
1575 
1576         drm_atomic_helper_cleanup_planes(dev, old_state);
1577 }
1578 EXPORT_SYMBOL(drm_atomic_helper_commit_tail_rpm);
1579 
1580 static void commit_tail(struct drm_atomic_state *old_state)
1581 {
1582         struct drm_device *dev = old_state->dev;
1583         const struct drm_mode_config_helper_funcs *funcs;
1584         struct drm_crtc_state *new_crtc_state;
1585         struct drm_crtc *crtc;
1586         ktime_t start;
1587         s64 commit_time_ms;
1588         unsigned int i, new_self_refresh_mask = 0;
1589 
1590         funcs = dev->mode_config.helper_private;
1591 
1592         
1593 
1594 
1595 
1596 
1597 
1598 
1599 
1600 
1601 
1602         start = ktime_get();
1603 
1604         drm_atomic_helper_wait_for_fences(dev, old_state, false);
1605 
1606         drm_atomic_helper_wait_for_dependencies(old_state);
1607 
1608         
1609 
1610 
1611 
1612 
1613         for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i)
1614                 if (new_crtc_state->self_refresh_active)
1615                         new_self_refresh_mask |= BIT(i);
1616 
1617         if (funcs && funcs->atomic_commit_tail)
1618                 funcs->atomic_commit_tail(old_state);
1619         else
1620                 drm_atomic_helper_commit_tail(old_state);
1621 
1622         commit_time_ms = ktime_ms_delta(ktime_get(), start);
1623         if (commit_time_ms > 0)
1624                 drm_self_refresh_helper_update_avg_times(old_state,
1625                                                  (unsigned long)commit_time_ms,
1626                                                  new_self_refresh_mask);
1627 
1628         drm_atomic_helper_commit_cleanup_done(old_state);
1629 
1630         drm_atomic_state_put(old_state);
1631 }
1632 
1633 static void commit_work(struct work_struct *work)
1634 {
1635         struct drm_atomic_state *state = container_of(work,
1636                                                       struct drm_atomic_state,
1637                                                       commit_work);
1638         commit_tail(state);
1639 }
1640 
1641 
1642 
1643 
1644 
1645 
1646 
1647 
1648 
1649 
1650 
1651 
1652 
1653 
1654 int drm_atomic_helper_async_check(struct drm_device *dev,
1655                                    struct drm_atomic_state *state)
1656 {
1657         struct drm_crtc *crtc;
1658         struct drm_crtc_state *crtc_state;
1659         struct drm_plane *plane = NULL;
1660         struct drm_plane_state *old_plane_state = NULL;
1661         struct drm_plane_state *new_plane_state = NULL;
1662         const struct drm_plane_helper_funcs *funcs;
1663         int i, n_planes = 0;
1664 
1665         for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
1666                 if (drm_atomic_crtc_needs_modeset(crtc_state))
1667                         return -EINVAL;
1668         }
1669 
1670         for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i)
1671                 n_planes++;
1672 
1673         
1674         if (n_planes != 1)
1675                 return -EINVAL;
1676 
1677         if (!new_plane_state->crtc ||
1678             old_plane_state->crtc != new_plane_state->crtc)
1679                 return -EINVAL;
1680 
1681         funcs = plane->helper_private;
1682         if (!funcs->atomic_async_update)
1683                 return -EINVAL;
1684 
1685         if (new_plane_state->fence)
1686                 return -EINVAL;
1687 
1688         
1689 
1690 
1691 
1692 
1693         if (old_plane_state->commit &&
1694             !try_wait_for_completion(&old_plane_state->commit->hw_done))
1695                 return -EBUSY;
1696 
1697         return funcs->atomic_async_check(plane, new_plane_state);
1698 }
1699 EXPORT_SYMBOL(drm_atomic_helper_async_check);
1700 
1701 
1702 
1703 
1704 
1705 
1706 
1707 
1708 
1709 
1710 
1711 
1712 
1713 
1714 void drm_atomic_helper_async_commit(struct drm_device *dev,
1715                                     struct drm_atomic_state *state)
1716 {
1717         struct drm_plane *plane;
1718         struct drm_plane_state *plane_state;
1719         const struct drm_plane_helper_funcs *funcs;
1720         int i;
1721 
1722         for_each_new_plane_in_state(state, plane, plane_state, i) {
1723                 struct drm_framebuffer *new_fb = plane_state->fb;
1724                 struct drm_framebuffer *old_fb = plane->state->fb;
1725 
1726                 funcs = plane->helper_private;
1727                 funcs->atomic_async_update(plane, plane_state);
1728 
1729                 
1730 
1731 
1732 
1733 
1734                 WARN_ON_ONCE(plane->state->fb != new_fb);
1735                 WARN_ON_ONCE(plane->state->crtc_x != plane_state->crtc_x);
1736                 WARN_ON_ONCE(plane->state->crtc_y != plane_state->crtc_y);
1737                 WARN_ON_ONCE(plane->state->src_x != plane_state->src_x);
1738                 WARN_ON_ONCE(plane->state->src_y != plane_state->src_y);
1739 
1740                 
1741 
1742 
1743 
1744                 WARN_ON_ONCE(plane_state->fb != old_fb);
1745         }
1746 }
1747 EXPORT_SYMBOL(drm_atomic_helper_async_commit);
1748 
1749 
1750 
1751 
1752 
1753 
1754 
1755 
1756 
1757 
1758 
1759 
1760 
1761 
1762 
1763 
1764 
1765 
1766 
1767 int drm_atomic_helper_commit(struct drm_device *dev,
1768                              struct drm_atomic_state *state,
1769                              bool nonblock)
1770 {
1771         int ret;
1772 
1773         if (state->async_update) {
1774                 ret = drm_atomic_helper_prepare_planes(dev, state);
1775                 if (ret)
1776                         return ret;
1777 
1778                 drm_atomic_helper_async_commit(dev, state);
1779                 drm_atomic_helper_cleanup_planes(dev, state);
1780 
1781                 return 0;
1782         }
1783 
1784         ret = drm_atomic_helper_setup_commit(state, nonblock);
1785         if (ret)
1786                 return ret;
1787 
1788         INIT_WORK(&state->commit_work, commit_work);
1789 
1790         ret = drm_atomic_helper_prepare_planes(dev, state);
1791         if (ret)
1792                 return ret;
1793 
1794         if (!nonblock) {
1795                 ret = drm_atomic_helper_wait_for_fences(dev, state, true);
1796                 if (ret)
1797                         goto err;
1798         }
1799 
1800         
1801 
1802 
1803 
1804 
1805 
1806         ret = drm_atomic_helper_swap_state(state, true);
1807         if (ret)
1808                 goto err;
1809 
1810         
1811 
1812 
1813 
1814 
1815 
1816 
1817 
1818 
1819 
1820 
1821 
1822 
1823 
1824 
1825 
1826 
1827 
1828 
1829 
1830         drm_atomic_state_get(state);
1831         if (nonblock)
1832                 queue_work(system_unbound_wq, &state->commit_work);
1833         else
1834                 commit_tail(state);
1835 
1836         return 0;
1837 
1838 err:
1839         drm_atomic_helper_cleanup_planes(dev, state);
1840         return ret;
1841 }
1842 EXPORT_SYMBOL(drm_atomic_helper_commit);
1843 
1844 
1845 
1846 
1847 
1848 
1849 
1850 
1851 
1852 
1853 
1854 
1855 
1856 
1857 
1858 
1859 
1860 
1861 
1862 
1863 
1864 
1865 
1866 
1867 
1868 
1869 
1870 
1871 
1872 
1873 
1874 
1875 
1876 
1877 
1878 
1879 
1880 
1881 
1882 
1883 
1884 
1885 static int stall_checks(struct drm_crtc *crtc, bool nonblock)
1886 {
1887         struct drm_crtc_commit *commit, *stall_commit = NULL;
1888         bool completed = true;
1889         int i;
1890         long ret = 0;
1891 
1892         spin_lock(&crtc->commit_lock);
1893         i = 0;
1894         list_for_each_entry(commit, &crtc->commit_list, commit_entry) {
1895                 if (i == 0) {
1896                         completed = try_wait_for_completion(&commit->flip_done);
1897                         
1898 
1899                         if (!completed && nonblock) {
1900                                 spin_unlock(&crtc->commit_lock);
1901                                 return -EBUSY;
1902                         }
1903                 } else if (i == 1) {
1904                         stall_commit = drm_crtc_commit_get(commit);
1905                         break;
1906                 }
1907 
1908                 i++;
1909         }
1910         spin_unlock(&crtc->commit_lock);
1911 
1912         if (!stall_commit)
1913                 return 0;
1914 
1915         
1916 
1917 
1918         ret = wait_for_completion_interruptible_timeout(&stall_commit->cleanup_done,
1919                                                         10*HZ);
1920         if (ret == 0)
1921                 DRM_ERROR("[CRTC:%d:%s] cleanup_done timed out\n",
1922                           crtc->base.id, crtc->name);
1923 
1924         drm_crtc_commit_put(stall_commit);
1925 
1926         return ret < 0 ? ret : 0;
1927 }
1928 
1929 static void release_crtc_commit(struct completion *completion)
1930 {
1931         struct drm_crtc_commit *commit = container_of(completion,
1932                                                       typeof(*commit),
1933                                                       flip_done);
1934 
1935         drm_crtc_commit_put(commit);
1936 }
1937 
1938 static void init_commit(struct drm_crtc_commit *commit, struct drm_crtc *crtc)
1939 {
1940         init_completion(&commit->flip_done);
1941         init_completion(&commit->hw_done);
1942         init_completion(&commit->cleanup_done);
1943         INIT_LIST_HEAD(&commit->commit_entry);
1944         kref_init(&commit->ref);
1945         commit->crtc = crtc;
1946 }
1947 
1948 static struct drm_crtc_commit *
1949 crtc_or_fake_commit(struct drm_atomic_state *state, struct drm_crtc *crtc)
1950 {
1951         if (crtc) {
1952                 struct drm_crtc_state *new_crtc_state;
1953 
1954                 new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
1955 
1956                 return new_crtc_state->commit;
1957         }
1958 
1959         if (!state->fake_commit) {
1960                 state->fake_commit = kzalloc(sizeof(*state->fake_commit), GFP_KERNEL);
1961                 if (!state->fake_commit)
1962                         return NULL;
1963 
1964                 init_commit(state->fake_commit, NULL);
1965         }
1966 
1967         return state->fake_commit;
1968 }
1969 
1970 
1971 
1972 
1973 
1974 
1975 
1976 
1977 
1978 
1979 
1980 
1981 
1982 
1983 
1984 
1985 
1986 
1987 
1988 
1989 
1990 
1991 
1992 
1993 
1994 
1995 
1996 
1997 
1998 
1999 
2000 
2001 
2002 
2003 
2004 
2005 
2006 
2007 
2008 
2009 
2010 
2011 
2012 
2013 int drm_atomic_helper_setup_commit(struct drm_atomic_state *state,
2014                                    bool nonblock)
2015 {
2016         struct drm_crtc *crtc;
2017         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
2018         struct drm_connector *conn;
2019         struct drm_connector_state *old_conn_state, *new_conn_state;
2020         struct drm_plane *plane;
2021         struct drm_plane_state *old_plane_state, *new_plane_state;
2022         struct drm_crtc_commit *commit;
2023         int i, ret;
2024 
2025         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
2026                 commit = kzalloc(sizeof(*commit), GFP_KERNEL);
2027                 if (!commit)
2028                         return -ENOMEM;
2029 
2030                 init_commit(commit, crtc);
2031 
2032                 new_crtc_state->commit = commit;
2033 
2034                 ret = stall_checks(crtc, nonblock);
2035                 if (ret)
2036                         return ret;
2037 
2038                 
2039 
2040 
2041                 if (!old_crtc_state->active && !new_crtc_state->active) {
2042                         complete_all(&commit->flip_done);
2043                         continue;
2044                 }
2045 
2046                 
2047                 if (state->legacy_cursor_update) {
2048                         complete_all(&commit->flip_done);
2049                         continue;
2050                 }
2051 
2052                 if (!new_crtc_state->event) {
2053                         commit->event = kzalloc(sizeof(*commit->event),
2054                                                 GFP_KERNEL);
2055                         if (!commit->event)
2056                                 return -ENOMEM;
2057 
2058                         new_crtc_state->event = commit->event;
2059                 }
2060 
2061                 new_crtc_state->event->base.completion = &commit->flip_done;
2062                 new_crtc_state->event->base.completion_release = release_crtc_commit;
2063                 drm_crtc_commit_get(commit);
2064 
2065                 commit->abort_completion = true;
2066 
2067                 state->crtcs[i].commit = commit;
2068                 drm_crtc_commit_get(commit);
2069         }
2070 
2071         for_each_oldnew_connector_in_state(state, conn, old_conn_state, new_conn_state, i) {
2072                 
2073 
2074                 if (nonblock && old_conn_state->commit &&
2075                     !try_wait_for_completion(&old_conn_state->commit->flip_done))
2076                         return -EBUSY;
2077 
2078                 
2079                 commit = crtc_or_fake_commit(state, new_conn_state->crtc ?: old_conn_state->crtc);
2080                 if (!commit)
2081                         return -ENOMEM;
2082 
2083                 new_conn_state->commit = drm_crtc_commit_get(commit);
2084         }
2085 
2086         for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
2087                 
2088 
2089                 if (nonblock && old_plane_state->commit &&
2090                     !try_wait_for_completion(&old_plane_state->commit->flip_done))
2091                         return -EBUSY;
2092 
2093                 
2094                 commit = crtc_or_fake_commit(state, new_plane_state->crtc ?: old_plane_state->crtc);
2095                 if (!commit)
2096                         return -ENOMEM;
2097 
2098                 new_plane_state->commit = drm_crtc_commit_get(commit);
2099         }
2100 
2101         return 0;
2102 }
2103 EXPORT_SYMBOL(drm_atomic_helper_setup_commit);
2104 
2105 
2106 
2107 
2108 
2109 
2110 
2111 
2112 
2113 
2114 
2115 
2116 
2117 void drm_atomic_helper_wait_for_dependencies(struct drm_atomic_state *old_state)
2118 {
2119         struct drm_crtc *crtc;
2120         struct drm_crtc_state *old_crtc_state;
2121         struct drm_plane *plane;
2122         struct drm_plane_state *old_plane_state;
2123         struct drm_connector *conn;
2124         struct drm_connector_state *old_conn_state;
2125         struct drm_crtc_commit *commit;
2126         int i;
2127         long ret;
2128 
2129         for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
2130                 commit = old_crtc_state->commit;
2131 
2132                 if (!commit)
2133                         continue;
2134 
2135                 ret = wait_for_completion_timeout(&commit->hw_done,
2136                                                   10*HZ);
2137                 if (ret == 0)
2138                         DRM_ERROR("[CRTC:%d:%s] hw_done timed out\n",
2139                                   crtc->base.id, crtc->name);
2140 
2141                 
2142 
2143                 ret = wait_for_completion_timeout(&commit->flip_done,
2144                                                   10*HZ);
2145                 if (ret == 0)
2146                         DRM_ERROR("[CRTC:%d:%s] flip_done timed out\n",
2147                                   crtc->base.id, crtc->name);
2148         }
2149 
2150         for_each_old_connector_in_state(old_state, conn, old_conn_state, i) {
2151                 commit = old_conn_state->commit;
2152 
2153                 if (!commit)
2154                         continue;
2155 
2156                 ret = wait_for_completion_timeout(&commit->hw_done,
2157                                                   10*HZ);
2158                 if (ret == 0)
2159                         DRM_ERROR("[CONNECTOR:%d:%s] hw_done timed out\n",
2160                                   conn->base.id, conn->name);
2161 
2162                 
2163 
2164                 ret = wait_for_completion_timeout(&commit->flip_done,
2165                                                   10*HZ);
2166                 if (ret == 0)
2167                         DRM_ERROR("[CONNECTOR:%d:%s] flip_done timed out\n",
2168                                   conn->base.id, conn->name);
2169         }
2170 
2171         for_each_old_plane_in_state(old_state, plane, old_plane_state, i) {
2172                 commit = old_plane_state->commit;
2173 
2174                 if (!commit)
2175                         continue;
2176 
2177                 ret = wait_for_completion_timeout(&commit->hw_done,
2178                                                   10*HZ);
2179                 if (ret == 0)
2180                         DRM_ERROR("[PLANE:%d:%s] hw_done timed out\n",
2181                                   plane->base.id, plane->name);
2182 
2183                 
2184 
2185                 ret = wait_for_completion_timeout(&commit->flip_done,
2186                                                   10*HZ);
2187                 if (ret == 0)
2188                         DRM_ERROR("[PLANE:%d:%s] flip_done timed out\n",
2189                                   plane->base.id, plane->name);
2190         }
2191 }
2192 EXPORT_SYMBOL(drm_atomic_helper_wait_for_dependencies);
2193 
2194 
2195 
2196 
2197 
2198 
2199 
2200 
2201 
2202 
2203 
2204 
2205 
2206 
2207 
2208 
2209 
2210 void drm_atomic_helper_fake_vblank(struct drm_atomic_state *old_state)
2211 {
2212         struct drm_crtc_state *new_crtc_state;
2213         struct drm_crtc *crtc;
2214         int i;
2215 
2216         for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
2217                 unsigned long flags;
2218 
2219                 if (!new_crtc_state->no_vblank)
2220                         continue;
2221 
2222                 spin_lock_irqsave(&old_state->dev->event_lock, flags);
2223                 if (new_crtc_state->event) {
2224                         drm_crtc_send_vblank_event(crtc,
2225                                                    new_crtc_state->event);
2226                         new_crtc_state->event = NULL;
2227                 }
2228                 spin_unlock_irqrestore(&old_state->dev->event_lock, flags);
2229         }
2230 }
2231 EXPORT_SYMBOL(drm_atomic_helper_fake_vblank);
2232 
2233 
2234 
2235 
2236 
2237 
2238 
2239 
2240 
2241 
2242 
2243 
2244 
2245 
2246 
2247 
2248 void drm_atomic_helper_commit_hw_done(struct drm_atomic_state *old_state)
2249 {
2250         struct drm_crtc *crtc;
2251         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
2252         struct drm_crtc_commit *commit;
2253         int i;
2254 
2255         for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
2256                 commit = new_crtc_state->commit;
2257                 if (!commit)
2258                         continue;
2259 
2260                 
2261 
2262 
2263 
2264 
2265                 if (old_crtc_state->commit)
2266                         drm_crtc_commit_put(old_crtc_state->commit);
2267 
2268                 old_crtc_state->commit = drm_crtc_commit_get(commit);
2269 
2270                 
2271                 WARN_ON(new_crtc_state->event);
2272                 complete_all(&commit->hw_done);
2273         }
2274 
2275         if (old_state->fake_commit) {
2276                 complete_all(&old_state->fake_commit->hw_done);
2277                 complete_all(&old_state->fake_commit->flip_done);
2278         }
2279 }
2280 EXPORT_SYMBOL(drm_atomic_helper_commit_hw_done);
2281 
2282 
2283 
2284 
2285 
2286 
2287 
2288 
2289 
2290 
2291 
2292 
2293 void drm_atomic_helper_commit_cleanup_done(struct drm_atomic_state *old_state)
2294 {
2295         struct drm_crtc *crtc;
2296         struct drm_crtc_state *old_crtc_state;
2297         struct drm_crtc_commit *commit;
2298         int i;
2299 
2300         for_each_old_crtc_in_state(old_state, crtc, old_crtc_state, i) {
2301                 commit = old_crtc_state->commit;
2302                 if (WARN_ON(!commit))
2303                         continue;
2304 
2305                 complete_all(&commit->cleanup_done);
2306                 WARN_ON(!try_wait_for_completion(&commit->hw_done));
2307 
2308                 spin_lock(&crtc->commit_lock);
2309                 list_del(&commit->commit_entry);
2310                 spin_unlock(&crtc->commit_lock);
2311         }
2312 
2313         if (old_state->fake_commit) {
2314                 complete_all(&old_state->fake_commit->cleanup_done);
2315                 WARN_ON(!try_wait_for_completion(&old_state->fake_commit->hw_done));
2316         }
2317 }
2318 EXPORT_SYMBOL(drm_atomic_helper_commit_cleanup_done);
2319 
2320 
2321 
2322 
2323 
2324 
2325 
2326 
2327 
2328 
2329 
2330 
2331 
2332 
2333 int drm_atomic_helper_prepare_planes(struct drm_device *dev,
2334                                      struct drm_atomic_state *state)
2335 {
2336         struct drm_connector *connector;
2337         struct drm_connector_state *new_conn_state;
2338         struct drm_plane *plane;
2339         struct drm_plane_state *new_plane_state;
2340         int ret, i, j;
2341 
2342         for_each_new_connector_in_state(state, connector, new_conn_state, i) {
2343                 if (!new_conn_state->writeback_job)
2344                         continue;
2345 
2346                 ret = drm_writeback_prepare_job(new_conn_state->writeback_job);
2347                 if (ret < 0)
2348                         return ret;
2349         }
2350 
2351         for_each_new_plane_in_state(state, plane, new_plane_state, i) {
2352                 const struct drm_plane_helper_funcs *funcs;
2353 
2354                 funcs = plane->helper_private;
2355 
2356                 if (funcs->prepare_fb) {
2357                         ret = funcs->prepare_fb(plane, new_plane_state);
2358                         if (ret)
2359                                 goto fail;
2360                 }
2361         }
2362 
2363         return 0;
2364 
2365 fail:
2366         for_each_new_plane_in_state(state, plane, new_plane_state, j) {
2367                 const struct drm_plane_helper_funcs *funcs;
2368 
2369                 if (j >= i)
2370                         continue;
2371 
2372                 funcs = plane->helper_private;
2373 
2374                 if (funcs->cleanup_fb)
2375                         funcs->cleanup_fb(plane, new_plane_state);
2376         }
2377 
2378         return ret;
2379 }
2380 EXPORT_SYMBOL(drm_atomic_helper_prepare_planes);
2381 
2382 static bool plane_crtc_active(const struct drm_plane_state *state)
2383 {
2384         return state->crtc && state->crtc->state->active;
2385 }
2386 
2387 
2388 
2389 
2390 
2391 
2392 
2393 
2394 
2395 
2396 
2397 
2398 
2399 
2400 
2401 
2402 
2403 
2404 
2405 
2406 
2407 
2408 
2409 
2410 
2411 
2412 
2413 
2414 
2415 
2416 
2417 
2418 
2419 
2420 
2421 
2422 
2423 
2424 
2425 
2426 
2427 
2428 void drm_atomic_helper_commit_planes(struct drm_device *dev,
2429                                      struct drm_atomic_state *old_state,
2430                                      uint32_t flags)
2431 {
2432         struct drm_crtc *crtc;
2433         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
2434         struct drm_plane *plane;
2435         struct drm_plane_state *old_plane_state, *new_plane_state;
2436         int i;
2437         bool active_only = flags & DRM_PLANE_COMMIT_ACTIVE_ONLY;
2438         bool no_disable = flags & DRM_PLANE_COMMIT_NO_DISABLE_AFTER_MODESET;
2439 
2440         for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
2441                 const struct drm_crtc_helper_funcs *funcs;
2442 
2443                 funcs = crtc->helper_private;
2444 
2445                 if (!funcs || !funcs->atomic_begin)
2446                         continue;
2447 
2448                 if (active_only && !new_crtc_state->active)
2449                         continue;
2450 
2451                 funcs->atomic_begin(crtc, old_crtc_state);
2452         }
2453 
2454         for_each_oldnew_plane_in_state(old_state, plane, old_plane_state, new_plane_state, i) {
2455                 const struct drm_plane_helper_funcs *funcs;
2456                 bool disabling;
2457 
2458                 funcs = plane->helper_private;
2459 
2460                 if (!funcs)
2461                         continue;
2462 
2463                 disabling = drm_atomic_plane_disabling(old_plane_state,
2464                                                        new_plane_state);
2465 
2466                 if (active_only) {
2467                         
2468 
2469 
2470 
2471 
2472 
2473 
2474                         if (!disabling && !plane_crtc_active(new_plane_state))
2475                                 continue;
2476                         if (disabling && !plane_crtc_active(old_plane_state))
2477                                 continue;
2478                 }
2479 
2480                 
2481 
2482 
2483                 if (disabling && funcs->atomic_disable) {
2484                         struct drm_crtc_state *crtc_state;
2485 
2486                         crtc_state = old_plane_state->crtc->state;
2487 
2488                         if (drm_atomic_crtc_needs_modeset(crtc_state) &&
2489                             no_disable)
2490                                 continue;
2491 
2492                         funcs->atomic_disable(plane, old_plane_state);
2493                 } else if (new_plane_state->crtc || disabling) {
2494                         funcs->atomic_update(plane, old_plane_state);
2495                 }
2496         }
2497 
2498         for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
2499                 const struct drm_crtc_helper_funcs *funcs;
2500 
2501                 funcs = crtc->helper_private;
2502 
2503                 if (!funcs || !funcs->atomic_flush)
2504                         continue;
2505 
2506                 if (active_only && !new_crtc_state->active)
2507                         continue;
2508 
2509                 funcs->atomic_flush(crtc, old_crtc_state);
2510         }
2511 }
2512 EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
2513 
2514 
2515 
2516 
2517 
2518 
2519 
2520 
2521 
2522 
2523 
2524 
2525 
2526 
2527 
2528 
2529 
2530 
2531 void
2532 drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state)
2533 {
2534         const struct drm_crtc_helper_funcs *crtc_funcs;
2535         struct drm_crtc *crtc = old_crtc_state->crtc;
2536         struct drm_atomic_state *old_state = old_crtc_state->state;
2537         struct drm_crtc_state *new_crtc_state =
2538                 drm_atomic_get_new_crtc_state(old_state, crtc);
2539         struct drm_plane *plane;
2540         unsigned plane_mask;
2541 
2542         plane_mask = old_crtc_state->plane_mask;
2543         plane_mask |= new_crtc_state->plane_mask;
2544 
2545         crtc_funcs = crtc->helper_private;
2546         if (crtc_funcs && crtc_funcs->atomic_begin)
2547                 crtc_funcs->atomic_begin(crtc, old_crtc_state);
2548 
2549         drm_for_each_plane_mask(plane, crtc->dev, plane_mask) {
2550                 struct drm_plane_state *old_plane_state =
2551                         drm_atomic_get_old_plane_state(old_state, plane);
2552                 struct drm_plane_state *new_plane_state =
2553                         drm_atomic_get_new_plane_state(old_state, plane);
2554                 const struct drm_plane_helper_funcs *plane_funcs;
2555 
2556                 plane_funcs = plane->helper_private;
2557 
2558                 if (!old_plane_state || !plane_funcs)
2559                         continue;
2560 
2561                 WARN_ON(new_plane_state->crtc &&
2562                         new_plane_state->crtc != crtc);
2563 
2564                 if (drm_atomic_plane_disabling(old_plane_state, new_plane_state) &&
2565                     plane_funcs->atomic_disable)
2566                         plane_funcs->atomic_disable(plane, old_plane_state);
2567                 else if (new_plane_state->crtc ||
2568                          drm_atomic_plane_disabling(old_plane_state, new_plane_state))
2569                         plane_funcs->atomic_update(plane, old_plane_state);
2570         }
2571 
2572         if (crtc_funcs && crtc_funcs->atomic_flush)
2573                 crtc_funcs->atomic_flush(crtc, old_crtc_state);
2574 }
2575 EXPORT_SYMBOL(drm_atomic_helper_commit_planes_on_crtc);
2576 
2577 
2578 
2579 
2580 
2581 
2582 
2583 
2584 
2585 
2586 
2587 
2588 
2589 
2590 
2591 
2592 
2593 void
2594 drm_atomic_helper_disable_planes_on_crtc(struct drm_crtc_state *old_crtc_state,
2595                                          bool atomic)
2596 {
2597         struct drm_crtc *crtc = old_crtc_state->crtc;
2598         const struct drm_crtc_helper_funcs *crtc_funcs =
2599                 crtc->helper_private;
2600         struct drm_plane *plane;
2601 
2602         if (atomic && crtc_funcs && crtc_funcs->atomic_begin)
2603                 crtc_funcs->atomic_begin(crtc, NULL);
2604 
2605         drm_atomic_crtc_state_for_each_plane(plane, old_crtc_state) {
2606                 const struct drm_plane_helper_funcs *plane_funcs =
2607                         plane->helper_private;
2608 
2609                 if (!plane_funcs)
2610                         continue;
2611 
2612                 WARN_ON(!plane_funcs->atomic_disable);
2613                 if (plane_funcs->atomic_disable)
2614                         plane_funcs->atomic_disable(plane, NULL);
2615         }
2616 
2617         if (atomic && crtc_funcs && crtc_funcs->atomic_flush)
2618                 crtc_funcs->atomic_flush(crtc, NULL);
2619 }
2620 EXPORT_SYMBOL(drm_atomic_helper_disable_planes_on_crtc);
2621 
2622 
2623 
2624 
2625 
2626 
2627 
2628 
2629 
2630 
2631 
2632 
2633 
2634 void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
2635                                       struct drm_atomic_state *old_state)
2636 {
2637         struct drm_plane *plane;
2638         struct drm_plane_state *old_plane_state, *new_plane_state;
2639         int i;
2640 
2641         for_each_oldnew_plane_in_state(old_state, plane, old_plane_state, new_plane_state, i) {
2642                 const struct drm_plane_helper_funcs *funcs;
2643                 struct drm_plane_state *plane_state;
2644 
2645                 
2646 
2647 
2648 
2649                 if (old_plane_state == plane->state)
2650                         plane_state = new_plane_state;
2651                 else
2652                         plane_state = old_plane_state;
2653 
2654                 funcs = plane->helper_private;
2655 
2656                 if (funcs->cleanup_fb)
2657                         funcs->cleanup_fb(plane, plane_state);
2658         }
2659 }
2660 EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes);
2661 
2662 
2663 
2664 
2665 
2666 
2667 
2668 
2669 
2670 
2671 
2672 
2673 
2674 
2675 
2676 
2677 
2678 
2679 
2680 
2681 
2682 
2683 
2684 
2685 
2686 
2687 
2688 
2689 
2690 
2691 
2692 
2693 
2694 
2695 
2696 
2697 int drm_atomic_helper_swap_state(struct drm_atomic_state *state,
2698                                   bool stall)
2699 {
2700         int i, ret;
2701         struct drm_connector *connector;
2702         struct drm_connector_state *old_conn_state, *new_conn_state;
2703         struct drm_crtc *crtc;
2704         struct drm_crtc_state *old_crtc_state, *new_crtc_state;
2705         struct drm_plane *plane;
2706         struct drm_plane_state *old_plane_state, *new_plane_state;
2707         struct drm_crtc_commit *commit;
2708         struct drm_private_obj *obj;
2709         struct drm_private_state *old_obj_state, *new_obj_state;
2710 
2711         if (stall) {
2712                 
2713 
2714 
2715 
2716 
2717 
2718 
2719 
2720 
2721                 for_each_old_crtc_in_state(state, crtc, old_crtc_state, i) {
2722                         commit = old_crtc_state->commit;
2723 
2724                         if (!commit)
2725                                 continue;
2726 
2727                         ret = wait_for_completion_interruptible(&commit->hw_done);
2728                         if (ret)
2729                                 return ret;
2730                 }
2731 
2732                 for_each_old_connector_in_state(state, connector, old_conn_state, i) {
2733                         commit = old_conn_state->commit;
2734 
2735                         if (!commit)
2736                                 continue;
2737 
2738                         ret = wait_for_completion_interruptible(&commit->hw_done);
2739                         if (ret)
2740                                 return ret;
2741                 }
2742 
2743                 for_each_old_plane_in_state(state, plane, old_plane_state, i) {
2744                         commit = old_plane_state->commit;
2745 
2746                         if (!commit)
2747                                 continue;
2748 
2749                         ret = wait_for_completion_interruptible(&commit->hw_done);
2750                         if (ret)
2751                                 return ret;
2752                 }
2753         }
2754 
2755         for_each_oldnew_connector_in_state(state, connector, old_conn_state, new_conn_state, i) {
2756                 WARN_ON(connector->state != old_conn_state);
2757 
2758                 old_conn_state->state = state;
2759                 new_conn_state->state = NULL;
2760 
2761                 state->connectors[i].state = old_conn_state;
2762                 connector->state = new_conn_state;
2763         }
2764 
2765         for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
2766                 WARN_ON(crtc->state != old_crtc_state);
2767 
2768                 old_crtc_state->state = state;
2769                 new_crtc_state->state = NULL;
2770 
2771                 state->crtcs[i].state = old_crtc_state;
2772                 crtc->state = new_crtc_state;
2773 
2774                 if (new_crtc_state->commit) {
2775                         spin_lock(&crtc->commit_lock);
2776                         list_add(&new_crtc_state->commit->commit_entry,
2777                                  &crtc->commit_list);
2778                         spin_unlock(&crtc->commit_lock);
2779 
2780                         new_crtc_state->commit->event = NULL;
2781                 }
2782         }
2783 
2784         for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
2785                 WARN_ON(plane->state != old_plane_state);
2786 
2787                 old_plane_state->state = state;
2788                 new_plane_state->state = NULL;
2789 
2790                 state->planes[i].state = old_plane_state;
2791                 plane->state = new_plane_state;
2792         }
2793 
2794         for_each_oldnew_private_obj_in_state(state, obj, old_obj_state, new_obj_state, i) {
2795                 WARN_ON(obj->state != old_obj_state);
2796 
2797                 old_obj_state->state = state;
2798                 new_obj_state->state = NULL;
2799 
2800                 state->private_objs[i].state = old_obj_state;
2801                 obj->state = new_obj_state;
2802         }
2803 
2804         return 0;
2805 }
2806 EXPORT_SYMBOL(drm_atomic_helper_swap_state);
2807 
2808 
2809 
2810 
2811 
2812 
2813 
2814 
2815 
2816 
2817 
2818 
2819 
2820 
2821 
2822 
2823 
2824 
2825 
2826 
2827 
2828 int drm_atomic_helper_update_plane(struct drm_plane *plane,
2829                                    struct drm_crtc *crtc,
2830                                    struct drm_framebuffer *fb,
2831                                    int crtc_x, int crtc_y,
2832                                    unsigned int crtc_w, unsigned int crtc_h,
2833                                    uint32_t src_x, uint32_t src_y,
2834                                    uint32_t src_w, uint32_t src_h,
2835                                    struct drm_modeset_acquire_ctx *ctx)
2836 {
2837         struct drm_atomic_state *state;
2838         struct drm_plane_state *plane_state;
2839         int ret = 0;
2840 
2841         state = drm_atomic_state_alloc(plane->dev);
2842         if (!state)
2843                 return -ENOMEM;
2844 
2845         state->acquire_ctx = ctx;
2846         plane_state = drm_atomic_get_plane_state(state, plane);
2847         if (IS_ERR(plane_state)) {
2848                 ret = PTR_ERR(plane_state);
2849                 goto fail;
2850         }
2851 
2852         ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
2853         if (ret != 0)
2854                 goto fail;
2855         drm_atomic_set_fb_for_plane(plane_state, fb);
2856         plane_state->crtc_x = crtc_x;
2857         plane_state->crtc_y = crtc_y;
2858         plane_state->crtc_w = crtc_w;
2859         plane_state->crtc_h = crtc_h;
2860         plane_state->src_x = src_x;
2861         plane_state->src_y = src_y;
2862         plane_state->src_w = src_w;
2863         plane_state->src_h = src_h;
2864 
2865         if (plane == crtc->cursor)
2866                 state->legacy_cursor_update = true;
2867 
2868         ret = drm_atomic_commit(state);
2869 fail:
2870         drm_atomic_state_put(state);
2871         return ret;
2872 }
2873 EXPORT_SYMBOL(drm_atomic_helper_update_plane);
2874 
2875 
2876 
2877 
2878 
2879 
2880 
2881 
2882 
2883 
2884 
2885 int drm_atomic_helper_disable_plane(struct drm_plane *plane,
2886                                     struct drm_modeset_acquire_ctx *ctx)
2887 {
2888         struct drm_atomic_state *state;
2889         struct drm_plane_state *plane_state;
2890         int ret = 0;
2891 
2892         state = drm_atomic_state_alloc(plane->dev);
2893         if (!state)
2894                 return -ENOMEM;
2895 
2896         state->acquire_ctx = ctx;
2897         plane_state = drm_atomic_get_plane_state(state, plane);
2898         if (IS_ERR(plane_state)) {
2899                 ret = PTR_ERR(plane_state);
2900                 goto fail;
2901         }
2902 
2903         if (plane_state->crtc && plane_state->crtc->cursor == plane)
2904                 plane_state->state->legacy_cursor_update = true;
2905 
2906         ret = __drm_atomic_helper_disable_plane(plane, plane_state);
2907         if (ret != 0)
2908                 goto fail;
2909 
2910         ret = drm_atomic_commit(state);
2911 fail:
2912         drm_atomic_state_put(state);
2913         return ret;
2914 }
2915 EXPORT_SYMBOL(drm_atomic_helper_disable_plane);
2916 
2917 
2918 
2919 
2920 
2921 
2922 
2923 
2924 
2925 
2926 
2927 
2928 
2929 
2930 
2931 
2932 
2933 int drm_atomic_helper_set_config(struct drm_mode_set *set,
2934                                  struct drm_modeset_acquire_ctx *ctx)
2935 {
2936         struct drm_atomic_state *state;
2937         struct drm_crtc *crtc = set->crtc;
2938         int ret = 0;
2939 
2940         state = drm_atomic_state_alloc(crtc->dev);
2941         if (!state)
2942                 return -ENOMEM;
2943 
2944         state->acquire_ctx = ctx;
2945         ret = __drm_atomic_helper_set_config(set, state);
2946         if (ret != 0)
2947                 goto fail;
2948 
2949         ret = handle_conflicting_encoders(state, true);
2950         if (ret)
2951                 return ret;
2952 
2953         ret = drm_atomic_commit(state);
2954 
2955 fail:
2956         drm_atomic_state_put(state);
2957         return ret;
2958 }
2959 EXPORT_SYMBOL(drm_atomic_helper_set_config);
2960 
2961 
2962 
2963 
2964 
2965 
2966 
2967 
2968 
2969 
2970 
2971 
2972 
2973 
2974 
2975 
2976 
2977 
2978 
2979 
2980 
2981 
2982 
2983 
2984 int drm_atomic_helper_disable_all(struct drm_device *dev,
2985                                   struct drm_modeset_acquire_ctx *ctx)
2986 {
2987         struct drm_atomic_state *state;
2988         struct drm_connector_state *conn_state;
2989         struct drm_connector *conn;
2990         struct drm_plane_state *plane_state;
2991         struct drm_plane *plane;
2992         struct drm_crtc_state *crtc_state;
2993         struct drm_crtc *crtc;
2994         int ret, i;
2995 
2996         state = drm_atomic_state_alloc(dev);
2997         if (!state)
2998                 return -ENOMEM;
2999 
3000         state->acquire_ctx = ctx;
3001 
3002         drm_for_each_crtc(crtc, dev) {
3003                 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3004                 if (IS_ERR(crtc_state)) {
3005                         ret = PTR_ERR(crtc_state);
3006                         goto free;
3007                 }
3008 
3009                 crtc_state->active = false;
3010 
3011                 ret = drm_atomic_set_mode_prop_for_crtc(crtc_state, NULL);
3012                 if (ret < 0)
3013                         goto free;
3014 
3015                 ret = drm_atomic_add_affected_planes(state, crtc);
3016                 if (ret < 0)
3017                         goto free;
3018 
3019                 ret = drm_atomic_add_affected_connectors(state, crtc);
3020                 if (ret < 0)
3021                         goto free;
3022         }
3023 
3024         for_each_new_connector_in_state(state, conn, conn_state, i) {
3025                 ret = drm_atomic_set_crtc_for_connector(conn_state, NULL);
3026                 if (ret < 0)
3027                         goto free;
3028         }
3029 
3030         for_each_new_plane_in_state(state, plane, plane_state, i) {
3031                 ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
3032                 if (ret < 0)
3033                         goto free;
3034 
3035                 drm_atomic_set_fb_for_plane(plane_state, NULL);
3036         }
3037 
3038         ret = drm_atomic_commit(state);
3039 free:
3040         drm_atomic_state_put(state);
3041         return ret;
3042 }
3043 EXPORT_SYMBOL(drm_atomic_helper_disable_all);
3044 
3045 
3046 
3047 
3048 
3049 
3050 
3051 
3052 
3053 
3054 
3055 
3056 void drm_atomic_helper_shutdown(struct drm_device *dev)
3057 {
3058         struct drm_modeset_acquire_ctx ctx;
3059         int ret;
3060 
3061         DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, 0, ret);
3062 
3063         ret = drm_atomic_helper_disable_all(dev, &ctx);
3064         if (ret)
3065                 DRM_ERROR("Disabling all crtc's during unload failed with %i\n", ret);
3066 
3067         DRM_MODESET_LOCK_ALL_END(ctx, ret);
3068 }
3069 EXPORT_SYMBOL(drm_atomic_helper_shutdown);
3070 
3071 
3072 
3073 
3074 
3075 
3076 
3077 
3078 
3079 
3080 
3081 
3082 
3083 
3084 
3085 
3086 
3087 
3088 
3089 
3090 
3091 
3092 
3093 
3094 
3095 struct drm_atomic_state *
3096 drm_atomic_helper_duplicate_state(struct drm_device *dev,
3097                                   struct drm_modeset_acquire_ctx *ctx)
3098 {
3099         struct drm_atomic_state *state;
3100         struct drm_connector *conn;
3101         struct drm_connector_list_iter conn_iter;
3102         struct drm_plane *plane;
3103         struct drm_crtc *crtc;
3104         int err = 0;
3105 
3106         state = drm_atomic_state_alloc(dev);
3107         if (!state)
3108                 return ERR_PTR(-ENOMEM);
3109 
3110         state->acquire_ctx = ctx;
3111         state->duplicated = true;
3112 
3113         drm_for_each_crtc(crtc, dev) {
3114                 struct drm_crtc_state *crtc_state;
3115 
3116                 crtc_state = drm_atomic_get_crtc_state(state, crtc);
3117                 if (IS_ERR(crtc_state)) {
3118                         err = PTR_ERR(crtc_state);
3119                         goto free;
3120                 }
3121         }
3122 
3123         drm_for_each_plane(plane, dev) {
3124                 struct drm_plane_state *plane_state;
3125 
3126                 plane_state = drm_atomic_get_plane_state(state, plane);
3127                 if (IS_ERR(plane_state)) {
3128                         err = PTR_ERR(plane_state);
3129                         goto free;
3130                 }
3131         }
3132 
3133         drm_connector_list_iter_begin(dev, &conn_iter);
3134         drm_for_each_connector_iter(conn, &conn_iter) {
3135                 struct drm_connector_state *conn_state;
3136 
3137                 conn_state = drm_atomic_get_connector_state(state, conn);
3138                 if (IS_ERR(conn_state)) {
3139                         err = PTR_ERR(conn_state);
3140                         drm_connector_list_iter_end(&conn_iter);
3141                         goto free;
3142                 }
3143         }
3144         drm_connector_list_iter_end(&conn_iter);
3145 
3146         
3147         state->acquire_ctx = NULL;
3148 
3149 free:
3150         if (err < 0) {
3151                 drm_atomic_state_put(state);
3152                 state = ERR_PTR(err);
3153         }
3154 
3155         return state;
3156 }
3157 EXPORT_SYMBOL(drm_atomic_helper_duplicate_state);
3158 
3159 
3160 
3161 
3162 
3163 
3164 
3165 
3166 
3167 
3168 
3169 
3170 
3171 
3172 
3173 
3174 
3175 
3176 
3177 
3178 
3179 
3180 
3181 
3182 
3183 
3184 struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev)
3185 {
3186         struct drm_modeset_acquire_ctx ctx;
3187         struct drm_atomic_state *state;
3188         int err;
3189 
3190         
3191         state = ERR_PTR(-EINVAL);
3192 
3193         DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, 0, err);
3194 
3195         state = drm_atomic_helper_duplicate_state(dev, &ctx);
3196         if (IS_ERR(state))
3197                 goto unlock;
3198 
3199         err = drm_atomic_helper_disable_all(dev, &ctx);
3200         if (err < 0) {
3201                 drm_atomic_state_put(state);
3202                 state = ERR_PTR(err);
3203                 goto unlock;
3204         }
3205 
3206 unlock:
3207         DRM_MODESET_LOCK_ALL_END(ctx, err);
3208         if (err)
3209                 return ERR_PTR(err);
3210 
3211         return state;
3212 }
3213 EXPORT_SYMBOL(drm_atomic_helper_suspend);
3214 
3215 
3216 
3217 
3218 
3219 
3220 
3221 
3222 
3223 
3224 
3225 
3226 
3227 
3228 
3229 
3230 int drm_atomic_helper_commit_duplicated_state(struct drm_atomic_state *state,
3231                                               struct drm_modeset_acquire_ctx *ctx)
3232 {
3233         int i, ret;
3234         struct drm_plane *plane;
3235         struct drm_plane_state *new_plane_state;
3236         struct drm_connector *connector;
3237         struct drm_connector_state *new_conn_state;
3238         struct drm_crtc *crtc;
3239         struct drm_crtc_state *new_crtc_state;
3240 
3241         state->acquire_ctx = ctx;
3242 
3243         for_each_new_plane_in_state(state, plane, new_plane_state, i)
3244                 state->planes[i].old_state = plane->state;
3245 
3246         for_each_new_crtc_in_state(state, crtc, new_crtc_state, i)
3247                 state->crtcs[i].old_state = crtc->state;
3248 
3249         for_each_new_connector_in_state(state, connector, new_conn_state, i)
3250                 state->connectors[i].old_state = connector->state;
3251 
3252         ret = drm_atomic_commit(state);
3253 
3254         state->acquire_ctx = NULL;
3255 
3256         return ret;
3257 }
3258 EXPORT_SYMBOL(drm_atomic_helper_commit_duplicated_state);
3259 
3260 
3261 
3262 
3263 
3264 
3265 
3266 
3267 
3268 
3269 
3270 
3271 
3272 
3273 
3274 
3275 
3276 int drm_atomic_helper_resume(struct drm_device *dev,
3277                              struct drm_atomic_state *state)
3278 {
3279         struct drm_modeset_acquire_ctx ctx;
3280         int err;
3281 
3282         drm_mode_config_reset(dev);
3283 
3284         DRM_MODESET_LOCK_ALL_BEGIN(dev, ctx, 0, err);
3285 
3286         err = drm_atomic_helper_commit_duplicated_state(state, &ctx);
3287 
3288         DRM_MODESET_LOCK_ALL_END(ctx, err);
3289         drm_atomic_state_put(state);
3290 
3291         return err;
3292 }
3293 EXPORT_SYMBOL(drm_atomic_helper_resume);
3294 
3295 static int page_flip_common(struct drm_atomic_state *state,
3296                             struct drm_crtc *crtc,
3297                             struct drm_framebuffer *fb,
3298                             struct drm_pending_vblank_event *event,
3299                             uint32_t flags)
3300 {
3301         struct drm_plane *plane = crtc->primary;
3302         struct drm_plane_state *plane_state;
3303         struct drm_crtc_state *crtc_state;
3304         int ret = 0;
3305 
3306         crtc_state = drm_atomic_get_crtc_state(state, crtc);
3307         if (IS_ERR(crtc_state))
3308                 return PTR_ERR(crtc_state);
3309 
3310         crtc_state->event = event;
3311         crtc_state->async_flip = flags & DRM_MODE_PAGE_FLIP_ASYNC;
3312 
3313         plane_state = drm_atomic_get_plane_state(state, plane);
3314         if (IS_ERR(plane_state))
3315                 return PTR_ERR(plane_state);
3316 
3317         ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
3318         if (ret != 0)
3319                 return ret;
3320         drm_atomic_set_fb_for_plane(plane_state, fb);
3321 
3322         
3323         state->allow_modeset = false;
3324         if (!crtc_state->active) {
3325                 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] disabled, rejecting legacy flip\n",
3326                                  crtc->base.id, crtc->name);
3327                 return -EINVAL;
3328         }
3329 
3330         return ret;
3331 }
3332 
3333 
3334 
3335 
3336 
3337 
3338 
3339 
3340 
3341 
3342 
3343 
3344 
3345 
3346 
3347 
3348 
3349 
3350 int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
3351                                 struct drm_framebuffer *fb,
3352                                 struct drm_pending_vblank_event *event,
3353                                 uint32_t flags,
3354                                 struct drm_modeset_acquire_ctx *ctx)
3355 {
3356         struct drm_plane *plane = crtc->primary;
3357         struct drm_atomic_state *state;
3358         int ret = 0;
3359 
3360         state = drm_atomic_state_alloc(plane->dev);
3361         if (!state)
3362                 return -ENOMEM;
3363 
3364         state->acquire_ctx = ctx;
3365 
3366         ret = page_flip_common(state, crtc, fb, event, flags);
3367         if (ret != 0)
3368                 goto fail;
3369 
3370         ret = drm_atomic_nonblocking_commit(state);
3371 fail:
3372         drm_atomic_state_put(state);
3373         return ret;
3374 }
3375 EXPORT_SYMBOL(drm_atomic_helper_page_flip);
3376 
3377 
3378 
3379 
3380 
3381 
3382 
3383 
3384 
3385 
3386 
3387 
3388 
3389 
3390 
3391 
3392 
3393 int drm_atomic_helper_page_flip_target(struct drm_crtc *crtc,
3394                                        struct drm_framebuffer *fb,
3395                                        struct drm_pending_vblank_event *event,
3396                                        uint32_t flags,
3397                                        uint32_t target,
3398                                        struct drm_modeset_acquire_ctx *ctx)
3399 {
3400         struct drm_plane *plane = crtc->primary;
3401         struct drm_atomic_state *state;
3402         struct drm_crtc_state *crtc_state;
3403         int ret = 0;
3404 
3405         state = drm_atomic_state_alloc(plane->dev);
3406         if (!state)
3407                 return -ENOMEM;
3408 
3409         state->acquire_ctx = ctx;
3410 
3411         ret = page_flip_common(state, crtc, fb, event, flags);
3412         if (ret != 0)
3413                 goto fail;
3414 
3415         crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
3416         if (WARN_ON(!crtc_state)) {
3417                 ret = -EINVAL;
3418                 goto fail;
3419         }
3420         crtc_state->target_vblank = target;
3421 
3422         ret = drm_atomic_nonblocking_commit(state);
3423 fail:
3424         drm_atomic_state_put(state);
3425         return ret;
3426 }
3427 EXPORT_SYMBOL(drm_atomic_helper_page_flip_target);
3428 
3429 
3430 
3431 
3432 
3433 
3434 
3435 
3436 
3437 
3438 
3439 
3440 
3441 
3442 
3443 int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
3444                                        u16 *red, u16 *green, u16 *blue,
3445                                        uint32_t size,
3446                                        struct drm_modeset_acquire_ctx *ctx)
3447 {
3448         struct drm_device *dev = crtc->dev;
3449         struct drm_atomic_state *state;
3450         struct drm_crtc_state *crtc_state;
3451         struct drm_property_blob *blob = NULL;
3452         struct drm_color_lut *blob_data;
3453         int i, ret = 0;
3454         bool replaced;
3455 
3456         state = drm_atomic_state_alloc(crtc->dev);
3457         if (!state)
3458                 return -ENOMEM;
3459 
3460         blob = drm_property_create_blob(dev,
3461                                         sizeof(struct drm_color_lut) * size,
3462                                         NULL);
3463         if (IS_ERR(blob)) {
3464                 ret = PTR_ERR(blob);
3465                 blob = NULL;
3466                 goto fail;
3467         }
3468 
3469         
3470         blob_data = blob->data;
3471         for (i = 0; i < size; i++) {
3472                 blob_data[i].red = red[i];
3473                 blob_data[i].green = green[i];
3474                 blob_data[i].blue = blue[i];
3475         }
3476 
3477         state->acquire_ctx = ctx;
3478         crtc_state = drm_atomic_get_crtc_state(state, crtc);
3479         if (IS_ERR(crtc_state)) {
3480                 ret = PTR_ERR(crtc_state);
3481                 goto fail;
3482         }
3483 
3484         
3485         replaced  = drm_property_replace_blob(&crtc_state->degamma_lut, NULL);
3486         replaced |= drm_property_replace_blob(&crtc_state->ctm, NULL);
3487         replaced |= drm_property_replace_blob(&crtc_state->gamma_lut, blob);
3488         crtc_state->color_mgmt_changed |= replaced;
3489 
3490         ret = drm_atomic_commit(state);
3491 
3492 fail:
3493         drm_atomic_state_put(state);
3494         drm_property_blob_put(blob);
3495         return ret;
3496 }
3497 EXPORT_SYMBOL(drm_atomic_helper_legacy_gamma_set);