linux/include/drm/drm_atomic.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2014 Red Hat
   3 * Copyright (C) 2014 Intel Corp.
   4 *
   5 * Permission is hereby granted, free of charge, to any person obtaining a
   6 * copy of this software and associated documentation files (the "Software"),
   7 * to deal in the Software without restriction, including without limitation
   8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   9 * and/or sell copies of the Software, and to permit persons to whom the
  10 * Software is furnished to do so, subject to the following conditions:
  11 *
  12 * The above copyright notice and this permission notice shall be included in
  13 * all copies or substantial portions of the Software.
  14 *
  15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  21 * OTHER DEALINGS IN THE SOFTWARE.
  22 *
  23 * Authors:
  24 * Rob Clark <robdclark@gmail.com>
  25 * Daniel Vetter <daniel.vetter@ffwll.ch>
  26 */
  27
  28#ifndef DRM_ATOMIC_H_
  29#define DRM_ATOMIC_H_
  30
  31#include <drm/drm_crtc.h>
  32
  33/**
  34 * struct drm_crtc_commit - track modeset commits on a CRTC
  35 *
  36 * This structure is used to track pending modeset changes and atomic commit on
  37 * a per-CRTC basis. Since updating the list should never block this structure
  38 * is reference counted to allow waiters to safely wait on an event to complete,
  39 * without holding any locks.
  40 *
  41 * It has 3 different events in total to allow a fine-grained synchronization
  42 * between outstanding updates::
  43 *
  44 *      atomic commit thread                    hardware
  45 *
  46 *      write new state into hardware   ---->   ...
  47 *      signal hw_done
  48 *                                              switch to new state on next
  49 *      ...                                     v/hblank
  50 *
  51 *      wait for buffers to show up             ...
  52 *
  53 *      ...                                     send completion irq
  54 *                                              irq handler signals flip_done
  55 *      cleanup old buffers
  56 *
  57 *      signal cleanup_done
  58 *
  59 *      wait for flip_done              <----
  60 *      clean up atomic state
  61 *
  62 * The important bit to know is that cleanup_done is the terminal event, but the
  63 * ordering between flip_done and hw_done is entirely up to the specific driver
  64 * and modeset state change.
  65 *
  66 * For an implementation of how to use this look at
  67 * drm_atomic_helper_setup_commit() from the atomic helper library.
  68 */
  69struct drm_crtc_commit {
  70        /**
  71         * @crtc:
  72         *
  73         * DRM CRTC for this commit.
  74         */
  75        struct drm_crtc *crtc;
  76
  77        /**
  78         * @ref:
  79         *
  80         * Reference count for this structure. Needed to allow blocking on
  81         * completions without the risk of the completion disappearing
  82         * meanwhile.
  83         */
  84        struct kref ref;
  85
  86        /**
  87         * @flip_done:
  88         *
  89         * Will be signaled when the hardware has flipped to the new set of
  90         * buffers. Signals at the same time as when the drm event for this
  91         * commit is sent to userspace, or when an out-fence is singalled. Note
  92         * that for most hardware, in most cases this happens after @hw_done is
  93         * signalled.
  94         */
  95        struct completion flip_done;
  96
  97        /**
  98         * @hw_done:
  99         *
 100         * Will be signalled when all hw register changes for this commit have
 101         * been written out. Especially when disabling a pipe this can be much
 102         * later than than @flip_done, since that can signal already when the
 103         * screen goes black, whereas to fully shut down a pipe more register
 104         * I/O is required.
 105         *
 106         * Note that this does not need to include separately reference-counted
 107         * resources like backing storage buffer pinning, or runtime pm
 108         * management.
 109         */
 110        struct completion hw_done;
 111
 112        /**
 113         * @cleanup_done:
 114         *
 115         * Will be signalled after old buffers have been cleaned up by calling
 116         * drm_atomic_helper_cleanup_planes(). Since this can only happen after
 117         * a vblank wait completed it might be a bit later. This completion is
 118         * useful to throttle updates and avoid hardware updates getting ahead
 119         * of the buffer cleanup too much.
 120         */
 121        struct completion cleanup_done;
 122
 123        /**
 124         * @commit_entry:
 125         *
 126         * Entry on the per-CRTC &drm_crtc.commit_list. Protected by
 127         * $drm_crtc.commit_lock.
 128         */
 129        struct list_head commit_entry;
 130
 131        /**
 132         * @event:
 133         *
 134         * &drm_pending_vblank_event pointer to clean up private events.
 135         */
 136        struct drm_pending_vblank_event *event;
 137
 138        /**
 139         * @abort_completion:
 140         *
 141         * A flag that's set after drm_atomic_helper_setup_commit takes a second
 142         * reference for the completion of $drm_crtc_state.event. It's used by
 143         * the free code to remove the second reference if commit fails.
 144         */
 145        bool abort_completion;
 146};
 147
 148struct __drm_planes_state {
 149        struct drm_plane *ptr;
 150        struct drm_plane_state *state, *old_state, *new_state;
 151};
 152
 153struct __drm_crtcs_state {
 154        struct drm_crtc *ptr;
 155        struct drm_crtc_state *state, *old_state, *new_state;
 156        s32 __user *out_fence_ptr;
 157        u64 last_vblank_count;
 158};
 159
 160struct __drm_connnectors_state {
 161        struct drm_connector *ptr;
 162        struct drm_connector_state *state, *old_state, *new_state;
 163};
 164
 165struct drm_private_obj;
 166struct drm_private_state;
 167
 168/**
 169 * struct drm_private_state_funcs - atomic state functions for private objects
 170 *
 171 * These hooks are used by atomic helpers to create, swap and destroy states of
 172 * private objects. The structure itself is used as a vtable to identify the
 173 * associated private object type. Each private object type that needs to be
 174 * added to the atomic states is expected to have an implementation of these
 175 * hooks and pass a pointer to it's drm_private_state_funcs struct to
 176 * drm_atomic_get_private_obj_state().
 177 */
 178struct drm_private_state_funcs {
 179        /**
 180         * @atomic_duplicate_state:
 181         *
 182         * Duplicate the current state of the private object and return it. It
 183         * is an error to call this before obj->state has been initialized.
 184         *
 185         * RETURNS:
 186         *
 187         * Duplicated atomic state or NULL when obj->state is not
 188         * initialized or allocation failed.
 189         */
 190        struct drm_private_state *(*atomic_duplicate_state)(struct drm_private_obj *obj);
 191
 192        /**
 193         * @atomic_destroy_state:
 194         *
 195         * Frees the private object state created with @atomic_duplicate_state.
 196         */
 197        void (*atomic_destroy_state)(struct drm_private_obj *obj,
 198                                     struct drm_private_state *state);
 199};
 200
 201/**
 202 * struct drm_private_obj - base struct for driver private atomic object
 203 *
 204 * A driver private object is initialized by calling
 205 * drm_atomic_private_obj_init() and cleaned up by calling
 206 * drm_atomic_private_obj_fini().
 207 *
 208 * Currently only tracks the state update functions and the opaque driver
 209 * private state itself, but in the future might also track which
 210 * &drm_modeset_lock is required to duplicate and update this object's state.
 211 */
 212struct drm_private_obj {
 213        /**
 214         * @state: Current atomic state for this driver private object.
 215         */
 216        struct drm_private_state *state;
 217
 218        /**
 219         * @funcs:
 220         *
 221         * Functions to manipulate the state of this driver private object, see
 222         * &drm_private_state_funcs.
 223         */
 224        const struct drm_private_state_funcs *funcs;
 225};
 226
 227/**
 228 * struct drm_private_state - base struct for driver private object state
 229 * @state: backpointer to global drm_atomic_state
 230 *
 231 * Currently only contains a backpointer to the overall atomic update, but in
 232 * the future also might hold synchronization information similar to e.g.
 233 * &drm_crtc.commit.
 234 */
 235struct drm_private_state {
 236        struct drm_atomic_state *state;
 237};
 238
 239struct __drm_private_objs_state {
 240        struct drm_private_obj *ptr;
 241        struct drm_private_state *state, *old_state, *new_state;
 242};
 243
 244/**
 245 * struct drm_atomic_state - the global state object for atomic updates
 246 * @ref: count of all references to this state (will not be freed until zero)
 247 * @dev: parent DRM device
 248 * @allow_modeset: allow full modeset
 249 * @legacy_cursor_update: hint to enforce legacy cursor IOCTL semantics
 250 * @async_update: hint for asynchronous plane update
 251 * @planes: pointer to array of structures with per-plane data
 252 * @crtcs: pointer to array of CRTC pointers
 253 * @num_connector: size of the @connectors and @connector_states arrays
 254 * @connectors: pointer to array of structures with per-connector data
 255 * @num_private_objs: size of the @private_objs array
 256 * @private_objs: pointer to array of private object pointers
 257 * @acquire_ctx: acquire context for this atomic modeset state update
 258 *
 259 * States are added to an atomic update by calling drm_atomic_get_crtc_state(),
 260 * drm_atomic_get_plane_state(), drm_atomic_get_connector_state(), or for
 261 * private state structures, drm_atomic_get_private_obj_state().
 262 */
 263struct drm_atomic_state {
 264        struct kref ref;
 265
 266        struct drm_device *dev;
 267        bool allow_modeset : 1;
 268        bool legacy_cursor_update : 1;
 269        bool async_update : 1;
 270        struct __drm_planes_state *planes;
 271        struct __drm_crtcs_state *crtcs;
 272        int num_connector;
 273        struct __drm_connnectors_state *connectors;
 274        int num_private_objs;
 275        struct __drm_private_objs_state *private_objs;
 276
 277        struct drm_modeset_acquire_ctx *acquire_ctx;
 278
 279        /**
 280         * @fake_commit:
 281         *
 282         * Used for signaling unbound planes/connectors.
 283         * When a connector or plane is not bound to any CRTC, it's still important
 284         * to preserve linearity to prevent the atomic states from being freed to early.
 285         *
 286         * This commit (if set) is not bound to any crtc, but will be completed when
 287         * drm_atomic_helper_commit_hw_done() is called.
 288         */
 289        struct drm_crtc_commit *fake_commit;
 290
 291        /**
 292         * @commit_work:
 293         *
 294         * Work item which can be used by the driver or helpers to execute the
 295         * commit without blocking.
 296         */
 297        struct work_struct commit_work;
 298};
 299
 300void __drm_crtc_commit_free(struct kref *kref);
 301
 302/**
 303 * drm_crtc_commit_get - acquire a reference to the CRTC commit
 304 * @commit: CRTC commit
 305 *
 306 * Increases the reference of @commit.
 307 *
 308 * Returns:
 309 * The pointer to @commit, with reference increased.
 310 */
 311static inline struct drm_crtc_commit *drm_crtc_commit_get(struct drm_crtc_commit *commit)
 312{
 313        kref_get(&commit->ref);
 314        return commit;
 315}
 316
 317/**
 318 * drm_crtc_commit_put - release a reference to the CRTC commmit
 319 * @commit: CRTC commit
 320 *
 321 * This releases a reference to @commit which is freed after removing the
 322 * final reference. No locking required and callable from any context.
 323 */
 324static inline void drm_crtc_commit_put(struct drm_crtc_commit *commit)
 325{
 326        kref_put(&commit->ref, __drm_crtc_commit_free);
 327}
 328
 329struct drm_atomic_state * __must_check
 330drm_atomic_state_alloc(struct drm_device *dev);
 331void drm_atomic_state_clear(struct drm_atomic_state *state);
 332
 333/**
 334 * drm_atomic_state_get - acquire a reference to the atomic state
 335 * @state: The atomic state
 336 *
 337 * Returns a new reference to the @state
 338 */
 339static inline struct drm_atomic_state *
 340drm_atomic_state_get(struct drm_atomic_state *state)
 341{
 342        kref_get(&state->ref);
 343        return state;
 344}
 345
 346void __drm_atomic_state_free(struct kref *ref);
 347
 348/**
 349 * drm_atomic_state_put - release a reference to the atomic state
 350 * @state: The atomic state
 351 *
 352 * This releases a reference to @state which is freed after removing the
 353 * final reference. No locking required and callable from any context.
 354 */
 355static inline void drm_atomic_state_put(struct drm_atomic_state *state)
 356{
 357        kref_put(&state->ref, __drm_atomic_state_free);
 358}
 359
 360int  __must_check
 361drm_atomic_state_init(struct drm_device *dev, struct drm_atomic_state *state);
 362void drm_atomic_state_default_clear(struct drm_atomic_state *state);
 363void drm_atomic_state_default_release(struct drm_atomic_state *state);
 364
 365struct drm_crtc_state * __must_check
 366drm_atomic_get_crtc_state(struct drm_atomic_state *state,
 367                          struct drm_crtc *crtc);
 368int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
 369                struct drm_crtc_state *state, struct drm_property *property,
 370                uint64_t val);
 371struct drm_plane_state * __must_check
 372drm_atomic_get_plane_state(struct drm_atomic_state *state,
 373                           struct drm_plane *plane);
 374struct drm_connector_state * __must_check
 375drm_atomic_get_connector_state(struct drm_atomic_state *state,
 376                               struct drm_connector *connector);
 377
 378void drm_atomic_private_obj_init(struct drm_private_obj *obj,
 379                                 struct drm_private_state *state,
 380                                 const struct drm_private_state_funcs *funcs);
 381void drm_atomic_private_obj_fini(struct drm_private_obj *obj);
 382
 383struct drm_private_state * __must_check
 384drm_atomic_get_private_obj_state(struct drm_atomic_state *state,
 385                                 struct drm_private_obj *obj);
 386
 387/**
 388 * drm_atomic_get_existing_crtc_state - get crtc state, if it exists
 389 * @state: global atomic state object
 390 * @crtc: crtc to grab
 391 *
 392 * This function returns the crtc state for the given crtc, or NULL
 393 * if the crtc is not part of the global atomic state.
 394 *
 395 * This function is deprecated, @drm_atomic_get_old_crtc_state or
 396 * @drm_atomic_get_new_crtc_state should be used instead.
 397 */
 398static inline struct drm_crtc_state *
 399drm_atomic_get_existing_crtc_state(struct drm_atomic_state *state,
 400                                   struct drm_crtc *crtc)
 401{
 402        return state->crtcs[drm_crtc_index(crtc)].state;
 403}
 404
 405/**
 406 * drm_atomic_get_old_crtc_state - get old crtc state, if it exists
 407 * @state: global atomic state object
 408 * @crtc: crtc to grab
 409 *
 410 * This function returns the old crtc state for the given crtc, or
 411 * NULL if the crtc is not part of the global atomic state.
 412 */
 413static inline struct drm_crtc_state *
 414drm_atomic_get_old_crtc_state(struct drm_atomic_state *state,
 415                              struct drm_crtc *crtc)
 416{
 417        return state->crtcs[drm_crtc_index(crtc)].old_state;
 418}
 419/**
 420 * drm_atomic_get_new_crtc_state - get new crtc state, if it exists
 421 * @state: global atomic state object
 422 * @crtc: crtc to grab
 423 *
 424 * This function returns the new crtc state for the given crtc, or
 425 * NULL if the crtc is not part of the global atomic state.
 426 */
 427static inline struct drm_crtc_state *
 428drm_atomic_get_new_crtc_state(struct drm_atomic_state *state,
 429                              struct drm_crtc *crtc)
 430{
 431        return state->crtcs[drm_crtc_index(crtc)].new_state;
 432}
 433
 434/**
 435 * drm_atomic_get_existing_plane_state - get plane state, if it exists
 436 * @state: global atomic state object
 437 * @plane: plane to grab
 438 *
 439 * This function returns the plane state for the given plane, or NULL
 440 * if the plane is not part of the global atomic state.
 441 *
 442 * This function is deprecated, @drm_atomic_get_old_plane_state or
 443 * @drm_atomic_get_new_plane_state should be used instead.
 444 */
 445static inline struct drm_plane_state *
 446drm_atomic_get_existing_plane_state(struct drm_atomic_state *state,
 447                                    struct drm_plane *plane)
 448{
 449        return state->planes[drm_plane_index(plane)].state;
 450}
 451
 452/**
 453 * drm_atomic_get_old_plane_state - get plane state, if it exists
 454 * @state: global atomic state object
 455 * @plane: plane to grab
 456 *
 457 * This function returns the old plane state for the given plane, or
 458 * NULL if the plane is not part of the global atomic state.
 459 */
 460static inline struct drm_plane_state *
 461drm_atomic_get_old_plane_state(struct drm_atomic_state *state,
 462                               struct drm_plane *plane)
 463{
 464        return state->planes[drm_plane_index(plane)].old_state;
 465}
 466
 467/**
 468 * drm_atomic_get_new_plane_state - get plane state, if it exists
 469 * @state: global atomic state object
 470 * @plane: plane to grab
 471 *
 472 * This function returns the new plane state for the given plane, or
 473 * NULL if the plane is not part of the global atomic state.
 474 */
 475static inline struct drm_plane_state *
 476drm_atomic_get_new_plane_state(struct drm_atomic_state *state,
 477                               struct drm_plane *plane)
 478{
 479        return state->planes[drm_plane_index(plane)].new_state;
 480}
 481
 482/**
 483 * drm_atomic_get_existing_connector_state - get connector state, if it exists
 484 * @state: global atomic state object
 485 * @connector: connector to grab
 486 *
 487 * This function returns the connector state for the given connector,
 488 * or NULL if the connector is not part of the global atomic state.
 489 *
 490 * This function is deprecated, @drm_atomic_get_old_connector_state or
 491 * @drm_atomic_get_new_connector_state should be used instead.
 492 */
 493static inline struct drm_connector_state *
 494drm_atomic_get_existing_connector_state(struct drm_atomic_state *state,
 495                                        struct drm_connector *connector)
 496{
 497        int index = drm_connector_index(connector);
 498
 499        if (index >= state->num_connector)
 500                return NULL;
 501
 502        return state->connectors[index].state;
 503}
 504
 505/**
 506 * drm_atomic_get_old_connector_state - get connector state, if it exists
 507 * @state: global atomic state object
 508 * @connector: connector to grab
 509 *
 510 * This function returns the old connector state for the given connector,
 511 * or NULL if the connector is not part of the global atomic state.
 512 */
 513static inline struct drm_connector_state *
 514drm_atomic_get_old_connector_state(struct drm_atomic_state *state,
 515                                   struct drm_connector *connector)
 516{
 517        int index = drm_connector_index(connector);
 518
 519        if (index >= state->num_connector)
 520                return NULL;
 521
 522        return state->connectors[index].old_state;
 523}
 524
 525/**
 526 * drm_atomic_get_new_connector_state - get connector state, if it exists
 527 * @state: global atomic state object
 528 * @connector: connector to grab
 529 *
 530 * This function returns the new connector state for the given connector,
 531 * or NULL if the connector is not part of the global atomic state.
 532 */
 533static inline struct drm_connector_state *
 534drm_atomic_get_new_connector_state(struct drm_atomic_state *state,
 535                                   struct drm_connector *connector)
 536{
 537        int index = drm_connector_index(connector);
 538
 539        if (index >= state->num_connector)
 540                return NULL;
 541
 542        return state->connectors[index].new_state;
 543}
 544
 545/**
 546 * __drm_atomic_get_current_plane_state - get current plane state
 547 * @state: global atomic state object
 548 * @plane: plane to grab
 549 *
 550 * This function returns the plane state for the given plane, either from
 551 * @state, or if the plane isn't part of the atomic state update, from @plane.
 552 * This is useful in atomic check callbacks, when drivers need to peek at, but
 553 * not change, state of other planes, since it avoids threading an error code
 554 * back up the call chain.
 555 *
 556 * WARNING:
 557 *
 558 * Note that this function is in general unsafe since it doesn't check for the
 559 * required locking for access state structures. Drivers must ensure that it is
 560 * safe to access the returned state structure through other means. One common
 561 * example is when planes are fixed to a single CRTC, and the driver knows that
 562 * the CRTC lock is held already. In that case holding the CRTC lock gives a
 563 * read-lock on all planes connected to that CRTC. But if planes can be
 564 * reassigned things get more tricky. In that case it's better to use
 565 * drm_atomic_get_plane_state and wire up full error handling.
 566 *
 567 * Returns:
 568 *
 569 * Read-only pointer to the current plane state.
 570 */
 571static inline const struct drm_plane_state *
 572__drm_atomic_get_current_plane_state(struct drm_atomic_state *state,
 573                                     struct drm_plane *plane)
 574{
 575        if (state->planes[drm_plane_index(plane)].state)
 576                return state->planes[drm_plane_index(plane)].state;
 577
 578        return plane->state;
 579}
 580
 581int __must_check
 582drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state,
 583                             const struct drm_display_mode *mode);
 584int __must_check
 585drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state,
 586                                  struct drm_property_blob *blob);
 587int __must_check
 588drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state,
 589                              struct drm_crtc *crtc);
 590void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state,
 591                                 struct drm_framebuffer *fb);
 592void drm_atomic_set_fence_for_plane(struct drm_plane_state *plane_state,
 593                                    struct dma_fence *fence);
 594int __must_check
 595drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
 596                                  struct drm_crtc *crtc);
 597int __must_check
 598drm_atomic_add_affected_connectors(struct drm_atomic_state *state,
 599                                   struct drm_crtc *crtc);
 600int __must_check
 601drm_atomic_add_affected_planes(struct drm_atomic_state *state,
 602                               struct drm_crtc *crtc);
 603
 604void
 605drm_atomic_clean_old_fb(struct drm_device *dev, unsigned plane_mask, int ret);
 606
 607int __must_check drm_atomic_check_only(struct drm_atomic_state *state);
 608int __must_check drm_atomic_commit(struct drm_atomic_state *state);
 609int __must_check drm_atomic_nonblocking_commit(struct drm_atomic_state *state);
 610
 611void drm_state_dump(struct drm_device *dev, struct drm_printer *p);
 612
 613/**
 614 * for_each_oldnew_connector_in_state - iterate over all connectors in an atomic update
 615 * @__state: &struct drm_atomic_state pointer
 616 * @connector: &struct drm_connector iteration cursor
 617 * @old_connector_state: &struct drm_connector_state iteration cursor for the
 618 *      old state
 619 * @new_connector_state: &struct drm_connector_state iteration cursor for the
 620 *      new state
 621 * @__i: int iteration cursor, for macro-internal use
 622 *
 623 * This iterates over all connectors in an atomic update, tracking both old and
 624 * new state. This is useful in places where the state delta needs to be
 625 * considered, for example in atomic check functions.
 626 */
 627#define for_each_oldnew_connector_in_state(__state, connector, old_connector_state, new_connector_state, __i) \
 628        for ((__i) = 0;                                                         \
 629             (__i) < (__state)->num_connector;                                  \
 630             (__i)++)                                                           \
 631                for_each_if ((__state)->connectors[__i].ptr &&                  \
 632                             ((connector) = (__state)->connectors[__i].ptr,     \
 633                             (old_connector_state) = (__state)->connectors[__i].old_state,      \
 634                             (new_connector_state) = (__state)->connectors[__i].new_state, 1))
 635
 636/**
 637 * for_each_old_connector_in_state - iterate over all connectors in an atomic update
 638 * @__state: &struct drm_atomic_state pointer
 639 * @connector: &struct drm_connector iteration cursor
 640 * @old_connector_state: &struct drm_connector_state iteration cursor for the
 641 *      old state
 642 * @__i: int iteration cursor, for macro-internal use
 643 *
 644 * This iterates over all connectors in an atomic update, tracking only the old
 645 * state. This is useful in disable functions, where we need the old state the
 646 * hardware is still in.
 647 */
 648#define for_each_old_connector_in_state(__state, connector, old_connector_state, __i) \
 649        for ((__i) = 0;                                                         \
 650             (__i) < (__state)->num_connector;                                  \
 651             (__i)++)                                                           \
 652                for_each_if ((__state)->connectors[__i].ptr &&                  \
 653                             ((connector) = (__state)->connectors[__i].ptr,     \
 654                             (old_connector_state) = (__state)->connectors[__i].old_state, 1))
 655
 656/**
 657 * for_each_new_connector_in_state - iterate over all connectors in an atomic update
 658 * @__state: &struct drm_atomic_state pointer
 659 * @connector: &struct drm_connector iteration cursor
 660 * @new_connector_state: &struct drm_connector_state iteration cursor for the
 661 *      new state
 662 * @__i: int iteration cursor, for macro-internal use
 663 *
 664 * This iterates over all connectors in an atomic update, tracking only the new
 665 * state. This is useful in enable functions, where we need the new state the
 666 * hardware should be in when the atomic commit operation has completed.
 667 */
 668#define for_each_new_connector_in_state(__state, connector, new_connector_state, __i) \
 669        for ((__i) = 0;                                                         \
 670             (__i) < (__state)->num_connector;                                  \
 671             (__i)++)                                                           \
 672                for_each_if ((__state)->connectors[__i].ptr &&                  \
 673                             ((connector) = (__state)->connectors[__i].ptr,     \
 674                             (new_connector_state) = (__state)->connectors[__i].new_state, 1))
 675
 676/**
 677 * for_each_oldnew_crtc_in_state - iterate over all CRTCs in an atomic update
 678 * @__state: &struct drm_atomic_state pointer
 679 * @crtc: &struct drm_crtc iteration cursor
 680 * @old_crtc_state: &struct drm_crtc_state iteration cursor for the old state
 681 * @new_crtc_state: &struct drm_crtc_state iteration cursor for the new state
 682 * @__i: int iteration cursor, for macro-internal use
 683 *
 684 * This iterates over all CRTCs in an atomic update, tracking both old and
 685 * new state. This is useful in places where the state delta needs to be
 686 * considered, for example in atomic check functions.
 687 */
 688#define for_each_oldnew_crtc_in_state(__state, crtc, old_crtc_state, new_crtc_state, __i) \
 689        for ((__i) = 0;                                                 \
 690             (__i) < (__state)->dev->mode_config.num_crtc;              \
 691             (__i)++)                                                   \
 692                for_each_if ((__state)->crtcs[__i].ptr &&               \
 693                             ((crtc) = (__state)->crtcs[__i].ptr,       \
 694                             (old_crtc_state) = (__state)->crtcs[__i].old_state, \
 695                             (new_crtc_state) = (__state)->crtcs[__i].new_state, 1))
 696
 697/**
 698 * for_each_old_crtc_in_state - iterate over all CRTCs in an atomic update
 699 * @__state: &struct drm_atomic_state pointer
 700 * @crtc: &struct drm_crtc iteration cursor
 701 * @old_crtc_state: &struct drm_crtc_state iteration cursor for the old state
 702 * @__i: int iteration cursor, for macro-internal use
 703 *
 704 * This iterates over all CRTCs in an atomic update, tracking only the old
 705 * state. This is useful in disable functions, where we need the old state the
 706 * hardware is still in.
 707 */
 708#define for_each_old_crtc_in_state(__state, crtc, old_crtc_state, __i)  \
 709        for ((__i) = 0;                                                 \
 710             (__i) < (__state)->dev->mode_config.num_crtc;              \
 711             (__i)++)                                                   \
 712                for_each_if ((__state)->crtcs[__i].ptr &&               \
 713                             ((crtc) = (__state)->crtcs[__i].ptr,       \
 714                             (old_crtc_state) = (__state)->crtcs[__i].old_state, 1))
 715
 716/**
 717 * for_each_new_crtc_in_state - iterate over all CRTCs in an atomic update
 718 * @__state: &struct drm_atomic_state pointer
 719 * @crtc: &struct drm_crtc iteration cursor
 720 * @new_crtc_state: &struct drm_crtc_state iteration cursor for the new state
 721 * @__i: int iteration cursor, for macro-internal use
 722 *
 723 * This iterates over all CRTCs in an atomic update, tracking only the new
 724 * state. This is useful in enable functions, where we need the new state the
 725 * hardware should be in when the atomic commit operation has completed.
 726 */
 727#define for_each_new_crtc_in_state(__state, crtc, new_crtc_state, __i)  \
 728        for ((__i) = 0;                                                 \
 729             (__i) < (__state)->dev->mode_config.num_crtc;              \
 730             (__i)++)                                                   \
 731                for_each_if ((__state)->crtcs[__i].ptr &&               \
 732                             ((crtc) = (__state)->crtcs[__i].ptr,       \
 733                             (new_crtc_state) = (__state)->crtcs[__i].new_state, 1))
 734
 735/**
 736 * for_each_oldnew_plane_in_state - iterate over all planes in an atomic update
 737 * @__state: &struct drm_atomic_state pointer
 738 * @plane: &struct drm_plane iteration cursor
 739 * @old_plane_state: &struct drm_plane_state iteration cursor for the old state
 740 * @new_plane_state: &struct drm_plane_state iteration cursor for the new state
 741 * @__i: int iteration cursor, for macro-internal use
 742 *
 743 * This iterates over all planes in an atomic update, tracking both old and
 744 * new state. This is useful in places where the state delta needs to be
 745 * considered, for example in atomic check functions.
 746 */
 747#define for_each_oldnew_plane_in_state(__state, plane, old_plane_state, new_plane_state, __i) \
 748        for ((__i) = 0;                                                 \
 749             (__i) < (__state)->dev->mode_config.num_total_plane;       \
 750             (__i)++)                                                   \
 751                for_each_if ((__state)->planes[__i].ptr &&              \
 752                             ((plane) = (__state)->planes[__i].ptr,     \
 753                              (old_plane_state) = (__state)->planes[__i].old_state,\
 754                              (new_plane_state) = (__state)->planes[__i].new_state, 1))
 755
 756/**
 757 * for_each_oldnew_plane_in_state_reverse - iterate over all planes in an atomic
 758 * update in reverse order
 759 * @__state: &struct drm_atomic_state pointer
 760 * @plane: &struct drm_plane iteration cursor
 761 * @old_plane_state: &struct drm_plane_state iteration cursor for the old state
 762 * @new_plane_state: &struct drm_plane_state iteration cursor for the new state
 763 * @__i: int iteration cursor, for macro-internal use
 764 *
 765 * This iterates over all planes in an atomic update in reverse order,
 766 * tracking both old and  new state. This is useful in places where the
 767 * state delta needs to be considered, for example in atomic check functions.
 768 */
 769#define for_each_oldnew_plane_in_state_reverse(__state, plane, old_plane_state, new_plane_state, __i) \
 770        for ((__i) = ((__state)->dev->mode_config.num_total_plane - 1); \
 771             (__i) >= 0;                                                \
 772             (__i)--)                                                   \
 773                for_each_if ((__state)->planes[__i].ptr &&              \
 774                             ((plane) = (__state)->planes[__i].ptr,     \
 775                              (old_plane_state) = (__state)->planes[__i].old_state,\
 776                              (new_plane_state) = (__state)->planes[__i].new_state, 1))
 777
 778/**
 779 * for_each_old_plane_in_state - iterate over all planes in an atomic update
 780 * @__state: &struct drm_atomic_state pointer
 781 * @plane: &struct drm_plane iteration cursor
 782 * @old_plane_state: &struct drm_plane_state iteration cursor for the old state
 783 * @__i: int iteration cursor, for macro-internal use
 784 *
 785 * This iterates over all planes in an atomic update, tracking only the old
 786 * state. This is useful in disable functions, where we need the old state the
 787 * hardware is still in.
 788 */
 789#define for_each_old_plane_in_state(__state, plane, old_plane_state, __i) \
 790        for ((__i) = 0;                                                 \
 791             (__i) < (__state)->dev->mode_config.num_total_plane;       \
 792             (__i)++)                                                   \
 793                for_each_if ((__state)->planes[__i].ptr &&              \
 794                             ((plane) = (__state)->planes[__i].ptr,     \
 795                              (old_plane_state) = (__state)->planes[__i].old_state, 1))
 796/**
 797 * for_each_new_plane_in_state - iterate over all planes in an atomic update
 798 * @__state: &struct drm_atomic_state pointer
 799 * @plane: &struct drm_plane iteration cursor
 800 * @new_plane_state: &struct drm_plane_state iteration cursor for the new state
 801 * @__i: int iteration cursor, for macro-internal use
 802 *
 803 * This iterates over all planes in an atomic update, tracking only the new
 804 * state. This is useful in enable functions, where we need the new state the
 805 * hardware should be in when the atomic commit operation has completed.
 806 */
 807#define for_each_new_plane_in_state(__state, plane, new_plane_state, __i) \
 808        for ((__i) = 0;                                                 \
 809             (__i) < (__state)->dev->mode_config.num_total_plane;       \
 810             (__i)++)                                                   \
 811                for_each_if ((__state)->planes[__i].ptr &&              \
 812                             ((plane) = (__state)->planes[__i].ptr,     \
 813                              (new_plane_state) = (__state)->planes[__i].new_state, 1))
 814
 815/**
 816 * for_each_oldnew_private_obj_in_state - iterate over all private objects in an atomic update
 817 * @__state: &struct drm_atomic_state pointer
 818 * @obj: &struct drm_private_obj iteration cursor
 819 * @old_obj_state: &struct drm_private_state iteration cursor for the old state
 820 * @new_obj_state: &struct drm_private_state iteration cursor for the new state
 821 * @__i: int iteration cursor, for macro-internal use
 822 *
 823 * This iterates over all private objects in an atomic update, tracking both
 824 * old and new state. This is useful in places where the state delta needs
 825 * to be considered, for example in atomic check functions.
 826 */
 827#define for_each_oldnew_private_obj_in_state(__state, obj, old_obj_state, new_obj_state, __i) \
 828        for ((__i) = 0; \
 829             (__i) < (__state)->num_private_objs && \
 830                     ((obj) = (__state)->private_objs[__i].ptr, \
 831                      (old_obj_state) = (__state)->private_objs[__i].old_state, \
 832                      (new_obj_state) = (__state)->private_objs[__i].new_state, 1); \
 833             (__i)++)
 834
 835/**
 836 * for_each_old_private_obj_in_state - iterate over all private objects in an atomic update
 837 * @__state: &struct drm_atomic_state pointer
 838 * @obj: &struct drm_private_obj iteration cursor
 839 * @old_obj_state: &struct drm_private_state iteration cursor for the old state
 840 * @__i: int iteration cursor, for macro-internal use
 841 *
 842 * This iterates over all private objects in an atomic update, tracking only
 843 * the old state. This is useful in disable functions, where we need the old
 844 * state the hardware is still in.
 845 */
 846#define for_each_old_private_obj_in_state(__state, obj, old_obj_state, __i) \
 847        for ((__i) = 0; \
 848             (__i) < (__state)->num_private_objs && \
 849                     ((obj) = (__state)->private_objs[__i].ptr, \
 850                      (old_obj_state) = (__state)->private_objs[__i].old_state, 1); \
 851             (__i)++)
 852
 853/**
 854 * for_each_new_private_obj_in_state - iterate over all private objects in an atomic update
 855 * @__state: &struct drm_atomic_state pointer
 856 * @obj: &struct drm_private_obj iteration cursor
 857 * @new_obj_state: &struct drm_private_state iteration cursor for the new state
 858 * @__i: int iteration cursor, for macro-internal use
 859 *
 860 * This iterates over all private objects in an atomic update, tracking only
 861 * the new state. This is useful in enable functions, where we need the new state the
 862 * hardware should be in when the atomic commit operation has completed.
 863 */
 864#define for_each_new_private_obj_in_state(__state, obj, new_obj_state, __i) \
 865        for ((__i) = 0; \
 866             (__i) < (__state)->num_private_objs && \
 867                     ((obj) = (__state)->private_objs[__i].ptr, \
 868                      (new_obj_state) = (__state)->private_objs[__i].new_state, 1); \
 869             (__i)++)
 870
 871/**
 872 * drm_atomic_crtc_needs_modeset - compute combined modeset need
 873 * @state: &drm_crtc_state for the CRTC
 874 *
 875 * To give drivers flexibility &struct drm_crtc_state has 3 booleans to track
 876 * whether the state CRTC changed enough to need a full modeset cycle:
 877 * mode_changed, active_changed and connectors_changed. This helper simply
 878 * combines these three to compute the overall need for a modeset for @state.
 879 *
 880 * The atomic helper code sets these booleans, but drivers can and should
 881 * change them appropriately to accurately represent whether a modeset is
 882 * really needed. In general, drivers should avoid full modesets whenever
 883 * possible.
 884 *
 885 * For example if the CRTC mode has changed, and the hardware is able to enact
 886 * the requested mode change without going through a full modeset, the driver
 887 * should clear mode_changed in its &drm_mode_config_funcs.atomic_check
 888 * implementation.
 889 */
 890static inline bool
 891drm_atomic_crtc_needs_modeset(const struct drm_crtc_state *state)
 892{
 893        return state->mode_changed || state->active_changed ||
 894               state->connectors_changed;
 895}
 896
 897#endif /* DRM_ATOMIC_H_ */
 898