Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright (C) 2014 Red Hat
0003  * Copyright (C) 2014 Intel Corp.
0004  *
0005  * Permission is hereby granted, free of charge, to any person obtaining a
0006  * copy of this software and associated documentation files (the "Software"),
0007  * to deal in the Software without restriction, including without limitation
0008  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0009  * and/or sell copies of the Software, and to permit persons to whom the
0010  * Software is furnished to do so, subject to the following conditions:
0011  *
0012  * The above copyright notice and this permission notice shall be included in
0013  * all copies or substantial portions of the Software.
0014  *
0015  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0016  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0017  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
0018  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
0019  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
0020  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0021  * OTHER DEALINGS IN THE SOFTWARE.
0022  *
0023  * Authors:
0024  * Rob Clark <robdclark@gmail.com>
0025  * Daniel Vetter <daniel.vetter@ffwll.ch>
0026  */
0027 
0028 #ifndef DRM_ATOMIC_H_
0029 #define DRM_ATOMIC_H_
0030 
0031 #include <drm/drm_crtc.h>
0032 #include <drm/drm_util.h>
0033 
0034 /**
0035  * struct drm_crtc_commit - track modeset commits on a CRTC
0036  *
0037  * This structure is used to track pending modeset changes and atomic commit on
0038  * a per-CRTC basis. Since updating the list should never block, this structure
0039  * is reference counted to allow waiters to safely wait on an event to complete,
0040  * without holding any locks.
0041  *
0042  * It has 3 different events in total to allow a fine-grained synchronization
0043  * between outstanding updates::
0044  *
0045  *  atomic commit thread            hardware
0046  *
0047  *  write new state into hardware   ---->   ...
0048  *  signal hw_done
0049  *                      switch to new state on next
0050  *  ...                 v/hblank
0051  *
0052  *  wait for buffers to show up     ...
0053  *
0054  *  ...                 send completion irq
0055  *                      irq handler signals flip_done
0056  *  cleanup old buffers
0057  *
0058  *  signal cleanup_done
0059  *
0060  *  wait for flip_done      <----
0061  *  clean up atomic state
0062  *
0063  * The important bit to know is that &cleanup_done is the terminal event, but the
0064  * ordering between &flip_done and &hw_done is entirely up to the specific driver
0065  * and modeset state change.
0066  *
0067  * For an implementation of how to use this look at
0068  * drm_atomic_helper_setup_commit() from the atomic helper library.
0069  *
0070  * See also drm_crtc_commit_wait().
0071  */
0072 struct drm_crtc_commit {
0073     /**
0074      * @crtc:
0075      *
0076      * DRM CRTC for this commit.
0077      */
0078     struct drm_crtc *crtc;
0079 
0080     /**
0081      * @ref:
0082      *
0083      * Reference count for this structure. Needed to allow blocking on
0084      * completions without the risk of the completion disappearing
0085      * meanwhile.
0086      */
0087     struct kref ref;
0088 
0089     /**
0090      * @flip_done:
0091      *
0092      * Will be signaled when the hardware has flipped to the new set of
0093      * buffers. Signals at the same time as when the drm event for this
0094      * commit is sent to userspace, or when an out-fence is singalled. Note
0095      * that for most hardware, in most cases this happens after @hw_done is
0096      * signalled.
0097      *
0098      * Completion of this stage is signalled implicitly by calling
0099      * drm_crtc_send_vblank_event() on &drm_crtc_state.event.
0100      */
0101     struct completion flip_done;
0102 
0103     /**
0104      * @hw_done:
0105      *
0106      * Will be signalled when all hw register changes for this commit have
0107      * been written out. Especially when disabling a pipe this can be much
0108      * later than @flip_done, since that can signal already when the
0109      * screen goes black, whereas to fully shut down a pipe more register
0110      * I/O is required.
0111      *
0112      * Note that this does not need to include separately reference-counted
0113      * resources like backing storage buffer pinning, or runtime pm
0114      * management.
0115      *
0116      * Drivers should call drm_atomic_helper_commit_hw_done() to signal
0117      * completion of this stage.
0118      */
0119     struct completion hw_done;
0120 
0121     /**
0122      * @cleanup_done:
0123      *
0124      * Will be signalled after old buffers have been cleaned up by calling
0125      * drm_atomic_helper_cleanup_planes(). Since this can only happen after
0126      * a vblank wait completed it might be a bit later. This completion is
0127      * useful to throttle updates and avoid hardware updates getting ahead
0128      * of the buffer cleanup too much.
0129      *
0130      * Drivers should call drm_atomic_helper_commit_cleanup_done() to signal
0131      * completion of this stage.
0132      */
0133     struct completion cleanup_done;
0134 
0135     /**
0136      * @commit_entry:
0137      *
0138      * Entry on the per-CRTC &drm_crtc.commit_list. Protected by
0139      * $drm_crtc.commit_lock.
0140      */
0141     struct list_head commit_entry;
0142 
0143     /**
0144      * @event:
0145      *
0146      * &drm_pending_vblank_event pointer to clean up private events.
0147      */
0148     struct drm_pending_vblank_event *event;
0149 
0150     /**
0151      * @abort_completion:
0152      *
0153      * A flag that's set after drm_atomic_helper_setup_commit() takes a
0154      * second reference for the completion of $drm_crtc_state.event. It's
0155      * used by the free code to remove the second reference if commit fails.
0156      */
0157     bool abort_completion;
0158 };
0159 
0160 struct __drm_planes_state {
0161     struct drm_plane *ptr;
0162     struct drm_plane_state *state, *old_state, *new_state;
0163 };
0164 
0165 struct __drm_crtcs_state {
0166     struct drm_crtc *ptr;
0167     struct drm_crtc_state *state, *old_state, *new_state;
0168 
0169     /**
0170      * @commit:
0171      *
0172      * A reference to the CRTC commit object that is kept for use by
0173      * drm_atomic_helper_wait_for_flip_done() after
0174      * drm_atomic_helper_commit_hw_done() is called. This ensures that a
0175      * concurrent commit won't free a commit object that is still in use.
0176      */
0177     struct drm_crtc_commit *commit;
0178 
0179     s32 __user *out_fence_ptr;
0180     u64 last_vblank_count;
0181 };
0182 
0183 struct __drm_connnectors_state {
0184     struct drm_connector *ptr;
0185     struct drm_connector_state *state, *old_state, *new_state;
0186     /**
0187      * @out_fence_ptr:
0188      *
0189      * User-provided pointer which the kernel uses to return a sync_file
0190      * file descriptor. Used by writeback connectors to signal completion of
0191      * the writeback.
0192      */
0193     s32 __user *out_fence_ptr;
0194 };
0195 
0196 struct drm_private_obj;
0197 struct drm_private_state;
0198 
0199 /**
0200  * struct drm_private_state_funcs - atomic state functions for private objects
0201  *
0202  * These hooks are used by atomic helpers to create, swap and destroy states of
0203  * private objects. The structure itself is used as a vtable to identify the
0204  * associated private object type. Each private object type that needs to be
0205  * added to the atomic states is expected to have an implementation of these
0206  * hooks and pass a pointer to its drm_private_state_funcs struct to
0207  * drm_atomic_get_private_obj_state().
0208  */
0209 struct drm_private_state_funcs {
0210     /**
0211      * @atomic_duplicate_state:
0212      *
0213      * Duplicate the current state of the private object and return it. It
0214      * is an error to call this before obj->state has been initialized.
0215      *
0216      * RETURNS:
0217      *
0218      * Duplicated atomic state or NULL when obj->state is not
0219      * initialized or allocation failed.
0220      */
0221     struct drm_private_state *(*atomic_duplicate_state)(struct drm_private_obj *obj);
0222 
0223     /**
0224      * @atomic_destroy_state:
0225      *
0226      * Frees the private object state created with @atomic_duplicate_state.
0227      */
0228     void (*atomic_destroy_state)(struct drm_private_obj *obj,
0229                      struct drm_private_state *state);
0230 
0231     /**
0232      * @atomic_print_state:
0233      *
0234      * If driver subclasses &struct drm_private_state, it should implement
0235      * this optional hook for printing additional driver specific state.
0236      *
0237      * Do not call this directly, use drm_atomic_private_obj_print_state()
0238      * instead.
0239      */
0240     void (*atomic_print_state)(struct drm_printer *p,
0241                    const struct drm_private_state *state);
0242 };
0243 
0244 /**
0245  * struct drm_private_obj - base struct for driver private atomic object
0246  *
0247  * A driver private object is initialized by calling
0248  * drm_atomic_private_obj_init() and cleaned up by calling
0249  * drm_atomic_private_obj_fini().
0250  *
0251  * Currently only tracks the state update functions and the opaque driver
0252  * private state itself, but in the future might also track which
0253  * &drm_modeset_lock is required to duplicate and update this object's state.
0254  *
0255  * All private objects must be initialized before the DRM device they are
0256  * attached to is registered to the DRM subsystem (call to drm_dev_register())
0257  * and should stay around until this DRM device is unregistered (call to
0258  * drm_dev_unregister()). In other words, private objects lifetime is tied
0259  * to the DRM device lifetime. This implies that:
0260  *
0261  * 1/ all calls to drm_atomic_private_obj_init() must be done before calling
0262  *    drm_dev_register()
0263  * 2/ all calls to drm_atomic_private_obj_fini() must be done after calling
0264  *    drm_dev_unregister()
0265  *
0266  * If that private object is used to store a state shared by multiple
0267  * CRTCs, proper care must be taken to ensure that non-blocking commits are
0268  * properly ordered to avoid a use-after-free issue.
0269  *
0270  * Indeed, assuming a sequence of two non-blocking &drm_atomic_commit on two
0271  * different &drm_crtc using different &drm_plane and &drm_connector, so with no
0272  * resources shared, there's no guarantee on which commit is going to happen
0273  * first. However, the second &drm_atomic_commit will consider the first
0274  * &drm_private_obj its old state, and will be in charge of freeing it whenever
0275  * the second &drm_atomic_commit is done.
0276  *
0277  * If the first &drm_atomic_commit happens after it, it will consider its
0278  * &drm_private_obj the new state and will be likely to access it, resulting in
0279  * an access to a freed memory region. Drivers should store (and get a reference
0280  * to) the &drm_crtc_commit structure in our private state in
0281  * &drm_mode_config_helper_funcs.atomic_commit_setup, and then wait for that
0282  * commit to complete as the first step of
0283  * &drm_mode_config_helper_funcs.atomic_commit_tail, similar to
0284  * drm_atomic_helper_wait_for_dependencies().
0285  */
0286 struct drm_private_obj {
0287     /**
0288      * @head: List entry used to attach a private object to a &drm_device
0289      * (queued to &drm_mode_config.privobj_list).
0290      */
0291     struct list_head head;
0292 
0293     /**
0294      * @lock: Modeset lock to protect the state object.
0295      */
0296     struct drm_modeset_lock lock;
0297 
0298     /**
0299      * @state: Current atomic state for this driver private object.
0300      */
0301     struct drm_private_state *state;
0302 
0303     /**
0304      * @funcs:
0305      *
0306      * Functions to manipulate the state of this driver private object, see
0307      * &drm_private_state_funcs.
0308      */
0309     const struct drm_private_state_funcs *funcs;
0310 };
0311 
0312 /**
0313  * drm_for_each_privobj() - private object iterator
0314  *
0315  * @privobj: pointer to the current private object. Updated after each
0316  *       iteration
0317  * @dev: the DRM device we want get private objects from
0318  *
0319  * Allows one to iterate over all private objects attached to @dev
0320  */
0321 #define drm_for_each_privobj(privobj, dev) \
0322     list_for_each_entry(privobj, &(dev)->mode_config.privobj_list, head)
0323 
0324 /**
0325  * struct drm_private_state - base struct for driver private object state
0326  *
0327  * Currently only contains a backpointer to the overall atomic update,
0328  * and the relevant private object but in the future also might hold
0329  * synchronization information similar to e.g. &drm_crtc.commit.
0330  */
0331 struct drm_private_state {
0332     /**
0333      * @state: backpointer to global drm_atomic_state
0334      */
0335     struct drm_atomic_state *state;
0336 
0337     /**
0338      * @obj: backpointer to the private object
0339      */
0340     struct drm_private_obj *obj;
0341 };
0342 
0343 struct __drm_private_objs_state {
0344     struct drm_private_obj *ptr;
0345     struct drm_private_state *state, *old_state, *new_state;
0346 };
0347 
0348 /**
0349  * struct drm_atomic_state - the global state object for atomic updates
0350  * @ref: count of all references to this state (will not be freed until zero)
0351  * @dev: parent DRM device
0352  * @async_update: hint for asynchronous plane update
0353  * @planes: pointer to array of structures with per-plane data
0354  * @crtcs: pointer to array of CRTC pointers
0355  * @num_connector: size of the @connectors and @connector_states arrays
0356  * @connectors: pointer to array of structures with per-connector data
0357  * @num_private_objs: size of the @private_objs array
0358  * @private_objs: pointer to array of private object pointers
0359  * @acquire_ctx: acquire context for this atomic modeset state update
0360  *
0361  * States are added to an atomic update by calling drm_atomic_get_crtc_state(),
0362  * drm_atomic_get_plane_state(), drm_atomic_get_connector_state(), or for
0363  * private state structures, drm_atomic_get_private_obj_state().
0364  */
0365 struct drm_atomic_state {
0366     struct kref ref;
0367 
0368     struct drm_device *dev;
0369 
0370     /**
0371      * @allow_modeset:
0372      *
0373      * Allow full modeset. This is used by the ATOMIC IOCTL handler to
0374      * implement the DRM_MODE_ATOMIC_ALLOW_MODESET flag. Drivers should
0375      * never consult this flag, instead looking at the output of
0376      * drm_atomic_crtc_needs_modeset().
0377      */
0378     bool allow_modeset : 1;
0379     /**
0380      * @legacy_cursor_update:
0381      *
0382      * Hint to enforce legacy cursor IOCTL semantics.
0383      *
0384      * WARNING: This is thoroughly broken and pretty much impossible to
0385      * implement correctly. Drivers must ignore this and should instead
0386      * implement &drm_plane_helper_funcs.atomic_async_check and
0387      * &drm_plane_helper_funcs.atomic_async_commit hooks. New users of this
0388      * flag are not allowed.
0389      */
0390     bool legacy_cursor_update : 1;
0391     bool async_update : 1;
0392     /**
0393      * @duplicated:
0394      *
0395      * Indicates whether or not this atomic state was duplicated using
0396      * drm_atomic_helper_duplicate_state(). Drivers and atomic helpers
0397      * should use this to fixup normal  inconsistencies in duplicated
0398      * states.
0399      */
0400     bool duplicated : 1;
0401     struct __drm_planes_state *planes;
0402     struct __drm_crtcs_state *crtcs;
0403     int num_connector;
0404     struct __drm_connnectors_state *connectors;
0405     int num_private_objs;
0406     struct __drm_private_objs_state *private_objs;
0407 
0408     struct drm_modeset_acquire_ctx *acquire_ctx;
0409 
0410     /**
0411      * @fake_commit:
0412      *
0413      * Used for signaling unbound planes/connectors.
0414      * When a connector or plane is not bound to any CRTC, it's still important
0415      * to preserve linearity to prevent the atomic states from being freed to early.
0416      *
0417      * This commit (if set) is not bound to any CRTC, but will be completed when
0418      * drm_atomic_helper_commit_hw_done() is called.
0419      */
0420     struct drm_crtc_commit *fake_commit;
0421 
0422     /**
0423      * @commit_work:
0424      *
0425      * Work item which can be used by the driver or helpers to execute the
0426      * commit without blocking.
0427      */
0428     struct work_struct commit_work;
0429 };
0430 
0431 void __drm_crtc_commit_free(struct kref *kref);
0432 
0433 /**
0434  * drm_crtc_commit_get - acquire a reference to the CRTC commit
0435  * @commit: CRTC commit
0436  *
0437  * Increases the reference of @commit.
0438  *
0439  * Returns:
0440  * The pointer to @commit, with reference increased.
0441  */
0442 static inline struct drm_crtc_commit *drm_crtc_commit_get(struct drm_crtc_commit *commit)
0443 {
0444     kref_get(&commit->ref);
0445     return commit;
0446 }
0447 
0448 /**
0449  * drm_crtc_commit_put - release a reference to the CRTC commmit
0450  * @commit: CRTC commit
0451  *
0452  * This releases a reference to @commit which is freed after removing the
0453  * final reference. No locking required and callable from any context.
0454  */
0455 static inline void drm_crtc_commit_put(struct drm_crtc_commit *commit)
0456 {
0457     kref_put(&commit->ref, __drm_crtc_commit_free);
0458 }
0459 
0460 int drm_crtc_commit_wait(struct drm_crtc_commit *commit);
0461 
0462 struct drm_atomic_state * __must_check
0463 drm_atomic_state_alloc(struct drm_device *dev);
0464 void drm_atomic_state_clear(struct drm_atomic_state *state);
0465 
0466 /**
0467  * drm_atomic_state_get - acquire a reference to the atomic state
0468  * @state: The atomic state
0469  *
0470  * Returns a new reference to the @state
0471  */
0472 static inline struct drm_atomic_state *
0473 drm_atomic_state_get(struct drm_atomic_state *state)
0474 {
0475     kref_get(&state->ref);
0476     return state;
0477 }
0478 
0479 void __drm_atomic_state_free(struct kref *ref);
0480 
0481 /**
0482  * drm_atomic_state_put - release a reference to the atomic state
0483  * @state: The atomic state
0484  *
0485  * This releases a reference to @state which is freed after removing the
0486  * final reference. No locking required and callable from any context.
0487  */
0488 static inline void drm_atomic_state_put(struct drm_atomic_state *state)
0489 {
0490     kref_put(&state->ref, __drm_atomic_state_free);
0491 }
0492 
0493 int  __must_check
0494 drm_atomic_state_init(struct drm_device *dev, struct drm_atomic_state *state);
0495 void drm_atomic_state_default_clear(struct drm_atomic_state *state);
0496 void drm_atomic_state_default_release(struct drm_atomic_state *state);
0497 
0498 struct drm_crtc_state * __must_check
0499 drm_atomic_get_crtc_state(struct drm_atomic_state *state,
0500               struct drm_crtc *crtc);
0501 struct drm_plane_state * __must_check
0502 drm_atomic_get_plane_state(struct drm_atomic_state *state,
0503                struct drm_plane *plane);
0504 struct drm_connector_state * __must_check
0505 drm_atomic_get_connector_state(struct drm_atomic_state *state,
0506                    struct drm_connector *connector);
0507 
0508 void drm_atomic_private_obj_init(struct drm_device *dev,
0509                  struct drm_private_obj *obj,
0510                  struct drm_private_state *state,
0511                  const struct drm_private_state_funcs *funcs);
0512 void drm_atomic_private_obj_fini(struct drm_private_obj *obj);
0513 
0514 struct drm_private_state * __must_check
0515 drm_atomic_get_private_obj_state(struct drm_atomic_state *state,
0516                  struct drm_private_obj *obj);
0517 struct drm_private_state *
0518 drm_atomic_get_old_private_obj_state(struct drm_atomic_state *state,
0519                      struct drm_private_obj *obj);
0520 struct drm_private_state *
0521 drm_atomic_get_new_private_obj_state(struct drm_atomic_state *state,
0522                      struct drm_private_obj *obj);
0523 
0524 struct drm_connector *
0525 drm_atomic_get_old_connector_for_encoder(struct drm_atomic_state *state,
0526                      struct drm_encoder *encoder);
0527 struct drm_connector *
0528 drm_atomic_get_new_connector_for_encoder(struct drm_atomic_state *state,
0529                      struct drm_encoder *encoder);
0530 
0531 /**
0532  * drm_atomic_get_existing_crtc_state - get CRTC state, if it exists
0533  * @state: global atomic state object
0534  * @crtc: CRTC to grab
0535  *
0536  * This function returns the CRTC state for the given CRTC, or NULL
0537  * if the CRTC is not part of the global atomic state.
0538  *
0539  * This function is deprecated, @drm_atomic_get_old_crtc_state or
0540  * @drm_atomic_get_new_crtc_state should be used instead.
0541  */
0542 static inline struct drm_crtc_state *
0543 drm_atomic_get_existing_crtc_state(struct drm_atomic_state *state,
0544                    struct drm_crtc *crtc)
0545 {
0546     return state->crtcs[drm_crtc_index(crtc)].state;
0547 }
0548 
0549 /**
0550  * drm_atomic_get_old_crtc_state - get old CRTC state, if it exists
0551  * @state: global atomic state object
0552  * @crtc: CRTC to grab
0553  *
0554  * This function returns the old CRTC state for the given CRTC, or
0555  * NULL if the CRTC is not part of the global atomic state.
0556  */
0557 static inline struct drm_crtc_state *
0558 drm_atomic_get_old_crtc_state(struct drm_atomic_state *state,
0559                   struct drm_crtc *crtc)
0560 {
0561     return state->crtcs[drm_crtc_index(crtc)].old_state;
0562 }
0563 /**
0564  * drm_atomic_get_new_crtc_state - get new CRTC state, if it exists
0565  * @state: global atomic state object
0566  * @crtc: CRTC to grab
0567  *
0568  * This function returns the new CRTC state for the given CRTC, or
0569  * NULL if the CRTC is not part of the global atomic state.
0570  */
0571 static inline struct drm_crtc_state *
0572 drm_atomic_get_new_crtc_state(struct drm_atomic_state *state,
0573                   struct drm_crtc *crtc)
0574 {
0575     return state->crtcs[drm_crtc_index(crtc)].new_state;
0576 }
0577 
0578 /**
0579  * drm_atomic_get_existing_plane_state - get plane state, if it exists
0580  * @state: global atomic state object
0581  * @plane: plane to grab
0582  *
0583  * This function returns the plane state for the given plane, or NULL
0584  * if the plane is not part of the global atomic state.
0585  *
0586  * This function is deprecated, @drm_atomic_get_old_plane_state or
0587  * @drm_atomic_get_new_plane_state should be used instead.
0588  */
0589 static inline struct drm_plane_state *
0590 drm_atomic_get_existing_plane_state(struct drm_atomic_state *state,
0591                     struct drm_plane *plane)
0592 {
0593     return state->planes[drm_plane_index(plane)].state;
0594 }
0595 
0596 /**
0597  * drm_atomic_get_old_plane_state - get plane state, if it exists
0598  * @state: global atomic state object
0599  * @plane: plane to grab
0600  *
0601  * This function returns the old plane state for the given plane, or
0602  * NULL if the plane is not part of the global atomic state.
0603  */
0604 static inline struct drm_plane_state *
0605 drm_atomic_get_old_plane_state(struct drm_atomic_state *state,
0606                    struct drm_plane *plane)
0607 {
0608     return state->planes[drm_plane_index(plane)].old_state;
0609 }
0610 
0611 /**
0612  * drm_atomic_get_new_plane_state - get plane state, if it exists
0613  * @state: global atomic state object
0614  * @plane: plane to grab
0615  *
0616  * This function returns the new plane state for the given plane, or
0617  * NULL if the plane is not part of the global atomic state.
0618  */
0619 static inline struct drm_plane_state *
0620 drm_atomic_get_new_plane_state(struct drm_atomic_state *state,
0621                    struct drm_plane *plane)
0622 {
0623     return state->planes[drm_plane_index(plane)].new_state;
0624 }
0625 
0626 /**
0627  * drm_atomic_get_existing_connector_state - get connector state, if it exists
0628  * @state: global atomic state object
0629  * @connector: connector to grab
0630  *
0631  * This function returns the connector state for the given connector,
0632  * or NULL if the connector is not part of the global atomic state.
0633  *
0634  * This function is deprecated, @drm_atomic_get_old_connector_state or
0635  * @drm_atomic_get_new_connector_state should be used instead.
0636  */
0637 static inline struct drm_connector_state *
0638 drm_atomic_get_existing_connector_state(struct drm_atomic_state *state,
0639                     struct drm_connector *connector)
0640 {
0641     int index = drm_connector_index(connector);
0642 
0643     if (index >= state->num_connector)
0644         return NULL;
0645 
0646     return state->connectors[index].state;
0647 }
0648 
0649 /**
0650  * drm_atomic_get_old_connector_state - get connector state, if it exists
0651  * @state: global atomic state object
0652  * @connector: connector to grab
0653  *
0654  * This function returns the old connector state for the given connector,
0655  * or NULL if the connector is not part of the global atomic state.
0656  */
0657 static inline struct drm_connector_state *
0658 drm_atomic_get_old_connector_state(struct drm_atomic_state *state,
0659                    struct drm_connector *connector)
0660 {
0661     int index = drm_connector_index(connector);
0662 
0663     if (index >= state->num_connector)
0664         return NULL;
0665 
0666     return state->connectors[index].old_state;
0667 }
0668 
0669 /**
0670  * drm_atomic_get_new_connector_state - get connector state, if it exists
0671  * @state: global atomic state object
0672  * @connector: connector to grab
0673  *
0674  * This function returns the new connector state for the given connector,
0675  * or NULL if the connector is not part of the global atomic state.
0676  */
0677 static inline struct drm_connector_state *
0678 drm_atomic_get_new_connector_state(struct drm_atomic_state *state,
0679                    struct drm_connector *connector)
0680 {
0681     int index = drm_connector_index(connector);
0682 
0683     if (index >= state->num_connector)
0684         return NULL;
0685 
0686     return state->connectors[index].new_state;
0687 }
0688 
0689 /**
0690  * __drm_atomic_get_current_plane_state - get current plane state
0691  * @state: global atomic state object
0692  * @plane: plane to grab
0693  *
0694  * This function returns the plane state for the given plane, either from
0695  * @state, or if the plane isn't part of the atomic state update, from @plane.
0696  * This is useful in atomic check callbacks, when drivers need to peek at, but
0697  * not change, state of other planes, since it avoids threading an error code
0698  * back up the call chain.
0699  *
0700  * WARNING:
0701  *
0702  * Note that this function is in general unsafe since it doesn't check for the
0703  * required locking for access state structures. Drivers must ensure that it is
0704  * safe to access the returned state structure through other means. One common
0705  * example is when planes are fixed to a single CRTC, and the driver knows that
0706  * the CRTC lock is held already. In that case holding the CRTC lock gives a
0707  * read-lock on all planes connected to that CRTC. But if planes can be
0708  * reassigned things get more tricky. In that case it's better to use
0709  * drm_atomic_get_plane_state and wire up full error handling.
0710  *
0711  * Returns:
0712  *
0713  * Read-only pointer to the current plane state.
0714  */
0715 static inline const struct drm_plane_state *
0716 __drm_atomic_get_current_plane_state(struct drm_atomic_state *state,
0717                      struct drm_plane *plane)
0718 {
0719     if (state->planes[drm_plane_index(plane)].state)
0720         return state->planes[drm_plane_index(plane)].state;
0721 
0722     return plane->state;
0723 }
0724 
0725 int __must_check
0726 drm_atomic_add_encoder_bridges(struct drm_atomic_state *state,
0727                    struct drm_encoder *encoder);
0728 int __must_check
0729 drm_atomic_add_affected_connectors(struct drm_atomic_state *state,
0730                    struct drm_crtc *crtc);
0731 int __must_check
0732 drm_atomic_add_affected_planes(struct drm_atomic_state *state,
0733                    struct drm_crtc *crtc);
0734 
0735 int __must_check drm_atomic_check_only(struct drm_atomic_state *state);
0736 int __must_check drm_atomic_commit(struct drm_atomic_state *state);
0737 int __must_check drm_atomic_nonblocking_commit(struct drm_atomic_state *state);
0738 
0739 void drm_state_dump(struct drm_device *dev, struct drm_printer *p);
0740 
0741 /**
0742  * for_each_oldnew_connector_in_state - iterate over all connectors in an atomic update
0743  * @__state: &struct drm_atomic_state pointer
0744  * @connector: &struct drm_connector iteration cursor
0745  * @old_connector_state: &struct drm_connector_state iteration cursor for the
0746  *  old state
0747  * @new_connector_state: &struct drm_connector_state iteration cursor for the
0748  *  new state
0749  * @__i: int iteration cursor, for macro-internal use
0750  *
0751  * This iterates over all connectors in an atomic update, tracking both old and
0752  * new state. This is useful in places where the state delta needs to be
0753  * considered, for example in atomic check functions.
0754  */
0755 #define for_each_oldnew_connector_in_state(__state, connector, old_connector_state, new_connector_state, __i) \
0756     for ((__i) = 0;                             \
0757          (__i) < (__state)->num_connector;                  \
0758          (__i)++)                               \
0759         for_each_if ((__state)->connectors[__i].ptr &&          \
0760                  ((connector) = (__state)->connectors[__i].ptr, \
0761                  (void)(connector) /* Only to avoid unused-but-set-variable warning */, \
0762                  (old_connector_state) = (__state)->connectors[__i].old_state,  \
0763                  (new_connector_state) = (__state)->connectors[__i].new_state, 1))
0764 
0765 /**
0766  * for_each_old_connector_in_state - iterate over all connectors in an atomic update
0767  * @__state: &struct drm_atomic_state pointer
0768  * @connector: &struct drm_connector iteration cursor
0769  * @old_connector_state: &struct drm_connector_state iteration cursor for the
0770  *  old state
0771  * @__i: int iteration cursor, for macro-internal use
0772  *
0773  * This iterates over all connectors in an atomic update, tracking only the old
0774  * state. This is useful in disable functions, where we need the old state the
0775  * hardware is still in.
0776  */
0777 #define for_each_old_connector_in_state(__state, connector, old_connector_state, __i) \
0778     for ((__i) = 0;                             \
0779          (__i) < (__state)->num_connector;                  \
0780          (__i)++)                               \
0781         for_each_if ((__state)->connectors[__i].ptr &&          \
0782                  ((connector) = (__state)->connectors[__i].ptr, \
0783                  (void)(connector) /* Only to avoid unused-but-set-variable warning */, \
0784                  (old_connector_state) = (__state)->connectors[__i].old_state, 1))
0785 
0786 /**
0787  * for_each_new_connector_in_state - iterate over all connectors in an atomic update
0788  * @__state: &struct drm_atomic_state pointer
0789  * @connector: &struct drm_connector iteration cursor
0790  * @new_connector_state: &struct drm_connector_state iteration cursor for the
0791  *  new state
0792  * @__i: int iteration cursor, for macro-internal use
0793  *
0794  * This iterates over all connectors in an atomic update, tracking only the new
0795  * state. This is useful in enable functions, where we need the new state the
0796  * hardware should be in when the atomic commit operation has completed.
0797  */
0798 #define for_each_new_connector_in_state(__state, connector, new_connector_state, __i) \
0799     for ((__i) = 0;                             \
0800          (__i) < (__state)->num_connector;                  \
0801          (__i)++)                               \
0802         for_each_if ((__state)->connectors[__i].ptr &&          \
0803                  ((connector) = (__state)->connectors[__i].ptr, \
0804                  (void)(connector) /* Only to avoid unused-but-set-variable warning */, \
0805                  (new_connector_state) = (__state)->connectors[__i].new_state, \
0806                  (void)(new_connector_state) /* Only to avoid unused-but-set-variable warning */, 1))
0807 
0808 /**
0809  * for_each_oldnew_crtc_in_state - iterate over all CRTCs in an atomic update
0810  * @__state: &struct drm_atomic_state pointer
0811  * @crtc: &struct drm_crtc iteration cursor
0812  * @old_crtc_state: &struct drm_crtc_state iteration cursor for the old state
0813  * @new_crtc_state: &struct drm_crtc_state iteration cursor for the new state
0814  * @__i: int iteration cursor, for macro-internal use
0815  *
0816  * This iterates over all CRTCs in an atomic update, tracking both old and
0817  * new state. This is useful in places where the state delta needs to be
0818  * considered, for example in atomic check functions.
0819  */
0820 #define for_each_oldnew_crtc_in_state(__state, crtc, old_crtc_state, new_crtc_state, __i) \
0821     for ((__i) = 0;                         \
0822          (__i) < (__state)->dev->mode_config.num_crtc;      \
0823          (__i)++)                           \
0824         for_each_if ((__state)->crtcs[__i].ptr &&       \
0825                  ((crtc) = (__state)->crtcs[__i].ptr,   \
0826                   (void)(crtc) /* Only to avoid unused-but-set-variable warning */, \
0827                  (old_crtc_state) = (__state)->crtcs[__i].old_state, \
0828                  (void)(old_crtc_state) /* Only to avoid unused-but-set-variable warning */, \
0829                  (new_crtc_state) = (__state)->crtcs[__i].new_state, \
0830                  (void)(new_crtc_state) /* Only to avoid unused-but-set-variable warning */, 1))
0831 
0832 /**
0833  * for_each_old_crtc_in_state - iterate over all CRTCs in an atomic update
0834  * @__state: &struct drm_atomic_state pointer
0835  * @crtc: &struct drm_crtc iteration cursor
0836  * @old_crtc_state: &struct drm_crtc_state iteration cursor for the old state
0837  * @__i: int iteration cursor, for macro-internal use
0838  *
0839  * This iterates over all CRTCs in an atomic update, tracking only the old
0840  * state. This is useful in disable functions, where we need the old state the
0841  * hardware is still in.
0842  */
0843 #define for_each_old_crtc_in_state(__state, crtc, old_crtc_state, __i)  \
0844     for ((__i) = 0;                         \
0845          (__i) < (__state)->dev->mode_config.num_crtc;      \
0846          (__i)++)                           \
0847         for_each_if ((__state)->crtcs[__i].ptr &&       \
0848                  ((crtc) = (__state)->crtcs[__i].ptr,   \
0849                  (void)(crtc) /* Only to avoid unused-but-set-variable warning */, \
0850                  (old_crtc_state) = (__state)->crtcs[__i].old_state, 1))
0851 
0852 /**
0853  * for_each_new_crtc_in_state - iterate over all CRTCs in an atomic update
0854  * @__state: &struct drm_atomic_state pointer
0855  * @crtc: &struct drm_crtc iteration cursor
0856  * @new_crtc_state: &struct drm_crtc_state iteration cursor for the new state
0857  * @__i: int iteration cursor, for macro-internal use
0858  *
0859  * This iterates over all CRTCs in an atomic update, tracking only the new
0860  * state. This is useful in enable functions, where we need the new state the
0861  * hardware should be in when the atomic commit operation has completed.
0862  */
0863 #define for_each_new_crtc_in_state(__state, crtc, new_crtc_state, __i)  \
0864     for ((__i) = 0;                         \
0865          (__i) < (__state)->dev->mode_config.num_crtc;      \
0866          (__i)++)                           \
0867         for_each_if ((__state)->crtcs[__i].ptr &&       \
0868                  ((crtc) = (__state)->crtcs[__i].ptr,   \
0869                  (void)(crtc) /* Only to avoid unused-but-set-variable warning */, \
0870                  (new_crtc_state) = (__state)->crtcs[__i].new_state, \
0871                  (void)(new_crtc_state) /* Only to avoid unused-but-set-variable warning */, 1))
0872 
0873 /**
0874  * for_each_oldnew_plane_in_state - iterate over all planes in an atomic update
0875  * @__state: &struct drm_atomic_state pointer
0876  * @plane: &struct drm_plane iteration cursor
0877  * @old_plane_state: &struct drm_plane_state iteration cursor for the old state
0878  * @new_plane_state: &struct drm_plane_state iteration cursor for the new state
0879  * @__i: int iteration cursor, for macro-internal use
0880  *
0881  * This iterates over all planes in an atomic update, tracking both old and
0882  * new state. This is useful in places where the state delta needs to be
0883  * considered, for example in atomic check functions.
0884  */
0885 #define for_each_oldnew_plane_in_state(__state, plane, old_plane_state, new_plane_state, __i) \
0886     for ((__i) = 0;                         \
0887          (__i) < (__state)->dev->mode_config.num_total_plane;   \
0888          (__i)++)                           \
0889         for_each_if ((__state)->planes[__i].ptr &&      \
0890                  ((plane) = (__state)->planes[__i].ptr, \
0891                   (void)(plane) /* Only to avoid unused-but-set-variable warning */, \
0892                   (old_plane_state) = (__state)->planes[__i].old_state,\
0893                   (new_plane_state) = (__state)->planes[__i].new_state, 1))
0894 
0895 /**
0896  * for_each_oldnew_plane_in_state_reverse - iterate over all planes in an atomic
0897  * update in reverse order
0898  * @__state: &struct drm_atomic_state pointer
0899  * @plane: &struct drm_plane iteration cursor
0900  * @old_plane_state: &struct drm_plane_state iteration cursor for the old state
0901  * @new_plane_state: &struct drm_plane_state iteration cursor for the new state
0902  * @__i: int iteration cursor, for macro-internal use
0903  *
0904  * This iterates over all planes in an atomic update in reverse order,
0905  * tracking both old and  new state. This is useful in places where the
0906  * state delta needs to be considered, for example in atomic check functions.
0907  */
0908 #define for_each_oldnew_plane_in_state_reverse(__state, plane, old_plane_state, new_plane_state, __i) \
0909     for ((__i) = ((__state)->dev->mode_config.num_total_plane - 1); \
0910          (__i) >= 0;                        \
0911          (__i)--)                           \
0912         for_each_if ((__state)->planes[__i].ptr &&      \
0913                  ((plane) = (__state)->planes[__i].ptr, \
0914                   (old_plane_state) = (__state)->planes[__i].old_state,\
0915                   (new_plane_state) = (__state)->planes[__i].new_state, 1))
0916 
0917 /**
0918  * for_each_new_plane_in_state_reverse - other than only tracking new state,
0919  * it's the same as for_each_oldnew_plane_in_state_reverse
0920  * @__state: &struct drm_atomic_state pointer
0921  * @plane: &struct drm_plane iteration cursor
0922  * @new_plane_state: &struct drm_plane_state iteration cursor for the new state
0923  * @__i: int iteration cursor, for macro-internal use
0924  */
0925 #define for_each_new_plane_in_state_reverse(__state, plane, new_plane_state, __i) \
0926     for ((__i) = ((__state)->dev->mode_config.num_total_plane - 1); \
0927          (__i) >= 0;                        \
0928          (__i)--)                           \
0929         for_each_if ((__state)->planes[__i].ptr &&      \
0930                  ((plane) = (__state)->planes[__i].ptr, \
0931                   (new_plane_state) = (__state)->planes[__i].new_state, 1))
0932 
0933 /**
0934  * for_each_old_plane_in_state - iterate over all planes in an atomic update
0935  * @__state: &struct drm_atomic_state pointer
0936  * @plane: &struct drm_plane iteration cursor
0937  * @old_plane_state: &struct drm_plane_state iteration cursor for the old state
0938  * @__i: int iteration cursor, for macro-internal use
0939  *
0940  * This iterates over all planes in an atomic update, tracking only the old
0941  * state. This is useful in disable functions, where we need the old state the
0942  * hardware is still in.
0943  */
0944 #define for_each_old_plane_in_state(__state, plane, old_plane_state, __i) \
0945     for ((__i) = 0;                         \
0946          (__i) < (__state)->dev->mode_config.num_total_plane;   \
0947          (__i)++)                           \
0948         for_each_if ((__state)->planes[__i].ptr &&      \
0949                  ((plane) = (__state)->planes[__i].ptr, \
0950                   (old_plane_state) = (__state)->planes[__i].old_state, 1))
0951 /**
0952  * for_each_new_plane_in_state - iterate over all planes in an atomic update
0953  * @__state: &struct drm_atomic_state pointer
0954  * @plane: &struct drm_plane iteration cursor
0955  * @new_plane_state: &struct drm_plane_state iteration cursor for the new state
0956  * @__i: int iteration cursor, for macro-internal use
0957  *
0958  * This iterates over all planes in an atomic update, tracking only the new
0959  * state. This is useful in enable functions, where we need the new state the
0960  * hardware should be in when the atomic commit operation has completed.
0961  */
0962 #define for_each_new_plane_in_state(__state, plane, new_plane_state, __i) \
0963     for ((__i) = 0;                         \
0964          (__i) < (__state)->dev->mode_config.num_total_plane;   \
0965          (__i)++)                           \
0966         for_each_if ((__state)->planes[__i].ptr &&      \
0967                  ((plane) = (__state)->planes[__i].ptr, \
0968                   (void)(plane) /* Only to avoid unused-but-set-variable warning */, \
0969                   (new_plane_state) = (__state)->planes[__i].new_state, \
0970                   (void)(new_plane_state) /* Only to avoid unused-but-set-variable warning */, 1))
0971 
0972 /**
0973  * for_each_oldnew_private_obj_in_state - iterate over all private objects in an atomic update
0974  * @__state: &struct drm_atomic_state pointer
0975  * @obj: &struct drm_private_obj iteration cursor
0976  * @old_obj_state: &struct drm_private_state iteration cursor for the old state
0977  * @new_obj_state: &struct drm_private_state iteration cursor for the new state
0978  * @__i: int iteration cursor, for macro-internal use
0979  *
0980  * This iterates over all private objects in an atomic update, tracking both
0981  * old and new state. This is useful in places where the state delta needs
0982  * to be considered, for example in atomic check functions.
0983  */
0984 #define for_each_oldnew_private_obj_in_state(__state, obj, old_obj_state, new_obj_state, __i) \
0985     for ((__i) = 0; \
0986          (__i) < (__state)->num_private_objs && \
0987              ((obj) = (__state)->private_objs[__i].ptr, \
0988               (old_obj_state) = (__state)->private_objs[__i].old_state, \
0989               (new_obj_state) = (__state)->private_objs[__i].new_state, 1); \
0990          (__i)++)
0991 
0992 /**
0993  * for_each_old_private_obj_in_state - iterate over all private objects in an atomic update
0994  * @__state: &struct drm_atomic_state pointer
0995  * @obj: &struct drm_private_obj iteration cursor
0996  * @old_obj_state: &struct drm_private_state iteration cursor for the old state
0997  * @__i: int iteration cursor, for macro-internal use
0998  *
0999  * This iterates over all private objects in an atomic update, tracking only
1000  * the old state. This is useful in disable functions, where we need the old
1001  * state the hardware is still in.
1002  */
1003 #define for_each_old_private_obj_in_state(__state, obj, old_obj_state, __i) \
1004     for ((__i) = 0; \
1005          (__i) < (__state)->num_private_objs && \
1006              ((obj) = (__state)->private_objs[__i].ptr, \
1007               (old_obj_state) = (__state)->private_objs[__i].old_state, 1); \
1008          (__i)++)
1009 
1010 /**
1011  * for_each_new_private_obj_in_state - iterate over all private objects in an atomic update
1012  * @__state: &struct drm_atomic_state pointer
1013  * @obj: &struct drm_private_obj iteration cursor
1014  * @new_obj_state: &struct drm_private_state iteration cursor for the new state
1015  * @__i: int iteration cursor, for macro-internal use
1016  *
1017  * This iterates over all private objects in an atomic update, tracking only
1018  * the new state. This is useful in enable functions, where we need the new state the
1019  * hardware should be in when the atomic commit operation has completed.
1020  */
1021 #define for_each_new_private_obj_in_state(__state, obj, new_obj_state, __i) \
1022     for ((__i) = 0; \
1023          (__i) < (__state)->num_private_objs && \
1024              ((obj) = (__state)->private_objs[__i].ptr, \
1025               (void)(obj) /* Only to avoid unused-but-set-variable warning */, \
1026               (new_obj_state) = (__state)->private_objs[__i].new_state, 1); \
1027          (__i)++)
1028 
1029 /**
1030  * drm_atomic_crtc_needs_modeset - compute combined modeset need
1031  * @state: &drm_crtc_state for the CRTC
1032  *
1033  * To give drivers flexibility &struct drm_crtc_state has 3 booleans to track
1034  * whether the state CRTC changed enough to need a full modeset cycle:
1035  * mode_changed, active_changed and connectors_changed. This helper simply
1036  * combines these three to compute the overall need for a modeset for @state.
1037  *
1038  * The atomic helper code sets these booleans, but drivers can and should
1039  * change them appropriately to accurately represent whether a modeset is
1040  * really needed. In general, drivers should avoid full modesets whenever
1041  * possible.
1042  *
1043  * For example if the CRTC mode has changed, and the hardware is able to enact
1044  * the requested mode change without going through a full modeset, the driver
1045  * should clear mode_changed in its &drm_mode_config_funcs.atomic_check
1046  * implementation.
1047  */
1048 static inline bool
1049 drm_atomic_crtc_needs_modeset(const struct drm_crtc_state *state)
1050 {
1051     return state->mode_changed || state->active_changed ||
1052            state->connectors_changed;
1053 }
1054 
1055 /**
1056  * drm_atomic_crtc_effectively_active - compute whether CRTC is actually active
1057  * @state: &drm_crtc_state for the CRTC
1058  *
1059  * When in self refresh mode, the crtc_state->active value will be false, since
1060  * the CRTC is off. However in some cases we're interested in whether the CRTC
1061  * is active, or effectively active (ie: it's connected to an active display).
1062  * In these cases, use this function instead of just checking active.
1063  */
1064 static inline bool
1065 drm_atomic_crtc_effectively_active(const struct drm_crtc_state *state)
1066 {
1067     return state->active || state->self_refresh_active;
1068 }
1069 
1070 /**
1071  * struct drm_bus_cfg - bus configuration
1072  *
1073  * This structure stores the configuration of a physical bus between two
1074  * components in an output pipeline, usually between two bridges, an encoder
1075  * and a bridge, or a bridge and a connector.
1076  *
1077  * The bus configuration is stored in &drm_bridge_state separately for the
1078  * input and output buses, as seen from the point of view of each bridge. The
1079  * bus configuration of a bridge output is usually identical to the
1080  * configuration of the next bridge's input, but may differ if the signals are
1081  * modified between the two bridges, for instance by an inverter on the board.
1082  * The input and output configurations of a bridge may differ if the bridge
1083  * modifies the signals internally, for instance by performing format
1084  * conversion, or modifying signals polarities.
1085  */
1086 struct drm_bus_cfg {
1087     /**
1088      * @format: format used on this bus (one of the MEDIA_BUS_FMT_* format)
1089      *
1090      * This field should not be directly modified by drivers
1091      * (drm_atomic_bridge_chain_select_bus_fmts() takes care of the bus
1092      * format negotiation).
1093      */
1094     u32 format;
1095 
1096     /**
1097      * @flags: DRM_BUS_* flags used on this bus
1098      */
1099     u32 flags;
1100 };
1101 
1102 /**
1103  * struct drm_bridge_state - Atomic bridge state object
1104  */
1105 struct drm_bridge_state {
1106     /**
1107      * @base: inherit from &drm_private_state
1108      */
1109     struct drm_private_state base;
1110 
1111     /**
1112      * @bridge: the bridge this state refers to
1113      */
1114     struct drm_bridge *bridge;
1115 
1116     /**
1117      * @input_bus_cfg: input bus configuration
1118      */
1119     struct drm_bus_cfg input_bus_cfg;
1120 
1121     /**
1122      * @output_bus_cfg: input bus configuration
1123      */
1124     struct drm_bus_cfg output_bus_cfg;
1125 };
1126 
1127 static inline struct drm_bridge_state *
1128 drm_priv_to_bridge_state(struct drm_private_state *priv)
1129 {
1130     return container_of(priv, struct drm_bridge_state, base);
1131 }
1132 
1133 struct drm_bridge_state *
1134 drm_atomic_get_bridge_state(struct drm_atomic_state *state,
1135                 struct drm_bridge *bridge);
1136 struct drm_bridge_state *
1137 drm_atomic_get_old_bridge_state(struct drm_atomic_state *state,
1138                 struct drm_bridge *bridge);
1139 struct drm_bridge_state *
1140 drm_atomic_get_new_bridge_state(struct drm_atomic_state *state,
1141                 struct drm_bridge *bridge);
1142 
1143 #endif /* DRM_ATOMIC_H_ */