cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

drm_atomic.h (42249B)


      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#include <drm/drm_util.h>
     33
     34/**
     35 * struct drm_crtc_commit - track modeset commits on a CRTC
     36 *
     37 * This structure is used to track pending modeset changes and atomic commit on
     38 * a per-CRTC basis. Since updating the list should never block, this structure
     39 * is reference counted to allow waiters to safely wait on an event to complete,
     40 * without holding any locks.
     41 *
     42 * It has 3 different events in total to allow a fine-grained synchronization
     43 * between outstanding updates::
     44 *
     45 *	atomic commit thread			hardware
     46 *
     47 * 	write new state into hardware	---->	...
     48 * 	signal hw_done
     49 * 						switch to new state on next
     50 * 	...					v/hblank
     51 *
     52 *	wait for buffers to show up		...
     53 *
     54 *	...					send completion irq
     55 *						irq handler signals flip_done
     56 *	cleanup old buffers
     57 *
     58 * 	signal cleanup_done
     59 *
     60 * 	wait for flip_done		<----
     61 * 	clean up atomic state
     62 *
     63 * The important bit to know is that &cleanup_done is the terminal event, but the
     64 * ordering between &flip_done and &hw_done is entirely up to the specific driver
     65 * and modeset state change.
     66 *
     67 * For an implementation of how to use this look at
     68 * drm_atomic_helper_setup_commit() from the atomic helper library.
     69 *
     70 * See also drm_crtc_commit_wait().
     71 */
     72struct drm_crtc_commit {
     73	/**
     74	 * @crtc:
     75	 *
     76	 * DRM CRTC for this commit.
     77	 */
     78	struct drm_crtc *crtc;
     79
     80	/**
     81	 * @ref:
     82	 *
     83	 * Reference count for this structure. Needed to allow blocking on
     84	 * completions without the risk of the completion disappearing
     85	 * meanwhile.
     86	 */
     87	struct kref ref;
     88
     89	/**
     90	 * @flip_done:
     91	 *
     92	 * Will be signaled when the hardware has flipped to the new set of
     93	 * buffers. Signals at the same time as when the drm event for this
     94	 * commit is sent to userspace, or when an out-fence is singalled. Note
     95	 * that for most hardware, in most cases this happens after @hw_done is
     96	 * signalled.
     97	 *
     98	 * Completion of this stage is signalled implicitly by calling
     99	 * drm_crtc_send_vblank_event() on &drm_crtc_state.event.
    100	 */
    101	struct completion flip_done;
    102
    103	/**
    104	 * @hw_done:
    105	 *
    106	 * Will be signalled when all hw register changes for this commit have
    107	 * been written out. Especially when disabling a pipe this can be much
    108	 * later than @flip_done, since that can signal already when the
    109	 * screen goes black, whereas to fully shut down a pipe more register
    110	 * I/O is required.
    111	 *
    112	 * Note that this does not need to include separately reference-counted
    113	 * resources like backing storage buffer pinning, or runtime pm
    114	 * management.
    115	 *
    116	 * Drivers should call drm_atomic_helper_commit_hw_done() to signal
    117	 * completion of this stage.
    118	 */
    119	struct completion hw_done;
    120
    121	/**
    122	 * @cleanup_done:
    123	 *
    124	 * Will be signalled after old buffers have been cleaned up by calling
    125	 * drm_atomic_helper_cleanup_planes(). Since this can only happen after
    126	 * a vblank wait completed it might be a bit later. This completion is
    127	 * useful to throttle updates and avoid hardware updates getting ahead
    128	 * of the buffer cleanup too much.
    129	 *
    130	 * Drivers should call drm_atomic_helper_commit_cleanup_done() to signal
    131	 * completion of this stage.
    132	 */
    133	struct completion cleanup_done;
    134
    135	/**
    136	 * @commit_entry:
    137	 *
    138	 * Entry on the per-CRTC &drm_crtc.commit_list. Protected by
    139	 * $drm_crtc.commit_lock.
    140	 */
    141	struct list_head commit_entry;
    142
    143	/**
    144	 * @event:
    145	 *
    146	 * &drm_pending_vblank_event pointer to clean up private events.
    147	 */
    148	struct drm_pending_vblank_event *event;
    149
    150	/**
    151	 * @abort_completion:
    152	 *
    153	 * A flag that's set after drm_atomic_helper_setup_commit() takes a
    154	 * second reference for the completion of $drm_crtc_state.event. It's
    155	 * used by the free code to remove the second reference if commit fails.
    156	 */
    157	bool abort_completion;
    158};
    159
    160struct __drm_planes_state {
    161	struct drm_plane *ptr;
    162	struct drm_plane_state *state, *old_state, *new_state;
    163};
    164
    165struct __drm_crtcs_state {
    166	struct drm_crtc *ptr;
    167	struct drm_crtc_state *state, *old_state, *new_state;
    168
    169	/**
    170	 * @commit:
    171	 *
    172	 * A reference to the CRTC commit object that is kept for use by
    173	 * drm_atomic_helper_wait_for_flip_done() after
    174	 * drm_atomic_helper_commit_hw_done() is called. This ensures that a
    175	 * concurrent commit won't free a commit object that is still in use.
    176	 */
    177	struct drm_crtc_commit *commit;
    178
    179	s32 __user *out_fence_ptr;
    180	u64 last_vblank_count;
    181};
    182
    183struct __drm_connnectors_state {
    184	struct drm_connector *ptr;
    185	struct drm_connector_state *state, *old_state, *new_state;
    186	/**
    187	 * @out_fence_ptr:
    188	 *
    189	 * User-provided pointer which the kernel uses to return a sync_file
    190	 * file descriptor. Used by writeback connectors to signal completion of
    191	 * the writeback.
    192	 */
    193	s32 __user *out_fence_ptr;
    194};
    195
    196struct drm_private_obj;
    197struct drm_private_state;
    198
    199/**
    200 * struct drm_private_state_funcs - atomic state functions for private objects
    201 *
    202 * These hooks are used by atomic helpers to create, swap and destroy states of
    203 * private objects. The structure itself is used as a vtable to identify the
    204 * associated private object type. Each private object type that needs to be
    205 * added to the atomic states is expected to have an implementation of these
    206 * hooks and pass a pointer to its drm_private_state_funcs struct to
    207 * drm_atomic_get_private_obj_state().
    208 */
    209struct drm_private_state_funcs {
    210	/**
    211	 * @atomic_duplicate_state:
    212	 *
    213	 * Duplicate the current state of the private object and return it. It
    214	 * is an error to call this before obj->state has been initialized.
    215	 *
    216	 * RETURNS:
    217	 *
    218	 * Duplicated atomic state or NULL when obj->state is not
    219	 * initialized or allocation failed.
    220	 */
    221	struct drm_private_state *(*atomic_duplicate_state)(struct drm_private_obj *obj);
    222
    223	/**
    224	 * @atomic_destroy_state:
    225	 *
    226	 * Frees the private object state created with @atomic_duplicate_state.
    227	 */
    228	void (*atomic_destroy_state)(struct drm_private_obj *obj,
    229				     struct drm_private_state *state);
    230
    231	/**
    232	 * @atomic_print_state:
    233	 *
    234	 * If driver subclasses &struct drm_private_state, it should implement
    235	 * this optional hook for printing additional driver specific state.
    236	 *
    237	 * Do not call this directly, use drm_atomic_private_obj_print_state()
    238	 * instead.
    239	 */
    240	void (*atomic_print_state)(struct drm_printer *p,
    241				   const struct drm_private_state *state);
    242};
    243
    244/**
    245 * struct drm_private_obj - base struct for driver private atomic object
    246 *
    247 * A driver private object is initialized by calling
    248 * drm_atomic_private_obj_init() and cleaned up by calling
    249 * drm_atomic_private_obj_fini().
    250 *
    251 * Currently only tracks the state update functions and the opaque driver
    252 * private state itself, but in the future might also track which
    253 * &drm_modeset_lock is required to duplicate and update this object's state.
    254 *
    255 * All private objects must be initialized before the DRM device they are
    256 * attached to is registered to the DRM subsystem (call to drm_dev_register())
    257 * and should stay around until this DRM device is unregistered (call to
    258 * drm_dev_unregister()). In other words, private objects lifetime is tied
    259 * to the DRM device lifetime. This implies that:
    260 *
    261 * 1/ all calls to drm_atomic_private_obj_init() must be done before calling
    262 *    drm_dev_register()
    263 * 2/ all calls to drm_atomic_private_obj_fini() must be done after calling
    264 *    drm_dev_unregister()
    265 *
    266 * If that private object is used to store a state shared by multiple
    267 * CRTCs, proper care must be taken to ensure that non-blocking commits are
    268 * properly ordered to avoid a use-after-free issue.
    269 *
    270 * Indeed, assuming a sequence of two non-blocking &drm_atomic_commit on two
    271 * different &drm_crtc using different &drm_plane and &drm_connector, so with no
    272 * resources shared, there's no guarantee on which commit is going to happen
    273 * first. However, the second &drm_atomic_commit will consider the first
    274 * &drm_private_obj its old state, and will be in charge of freeing it whenever
    275 * the second &drm_atomic_commit is done.
    276 *
    277 * If the first &drm_atomic_commit happens after it, it will consider its
    278 * &drm_private_obj the new state and will be likely to access it, resulting in
    279 * an access to a freed memory region. Drivers should store (and get a reference
    280 * to) the &drm_crtc_commit structure in our private state in
    281 * &drm_mode_config_helper_funcs.atomic_commit_setup, and then wait for that
    282 * commit to complete as the first step of
    283 * &drm_mode_config_helper_funcs.atomic_commit_tail, similar to
    284 * drm_atomic_helper_wait_for_dependencies().
    285 */
    286struct drm_private_obj {
    287	/**
    288	 * @head: List entry used to attach a private object to a &drm_device
    289	 * (queued to &drm_mode_config.privobj_list).
    290	 */
    291	struct list_head head;
    292
    293	/**
    294	 * @lock: Modeset lock to protect the state object.
    295	 */
    296	struct drm_modeset_lock lock;
    297
    298	/**
    299	 * @state: Current atomic state for this driver private object.
    300	 */
    301	struct drm_private_state *state;
    302
    303	/**
    304	 * @funcs:
    305	 *
    306	 * Functions to manipulate the state of this driver private object, see
    307	 * &drm_private_state_funcs.
    308	 */
    309	const struct drm_private_state_funcs *funcs;
    310};
    311
    312/**
    313 * drm_for_each_privobj() - private object iterator
    314 *
    315 * @privobj: pointer to the current private object. Updated after each
    316 *	     iteration
    317 * @dev: the DRM device we want get private objects from
    318 *
    319 * Allows one to iterate over all private objects attached to @dev
    320 */
    321#define drm_for_each_privobj(privobj, dev) \
    322	list_for_each_entry(privobj, &(dev)->mode_config.privobj_list, head)
    323
    324/**
    325 * struct drm_private_state - base struct for driver private object state
    326 *
    327 * Currently only contains a backpointer to the overall atomic update,
    328 * and the relevant private object but in the future also might hold
    329 * synchronization information similar to e.g. &drm_crtc.commit.
    330 */
    331struct drm_private_state {
    332	/**
    333	 * @state: backpointer to global drm_atomic_state
    334	 */
    335	struct drm_atomic_state *state;
    336
    337	/**
    338	 * @obj: backpointer to the private object
    339	 */
    340	struct drm_private_obj *obj;
    341};
    342
    343struct __drm_private_objs_state {
    344	struct drm_private_obj *ptr;
    345	struct drm_private_state *state, *old_state, *new_state;
    346};
    347
    348/**
    349 * struct drm_atomic_state - the global state object for atomic updates
    350 * @ref: count of all references to this state (will not be freed until zero)
    351 * @dev: parent DRM device
    352 * @async_update: hint for asynchronous plane update
    353 * @planes: pointer to array of structures with per-plane data
    354 * @crtcs: pointer to array of CRTC pointers
    355 * @num_connector: size of the @connectors and @connector_states arrays
    356 * @connectors: pointer to array of structures with per-connector data
    357 * @num_private_objs: size of the @private_objs array
    358 * @private_objs: pointer to array of private object pointers
    359 * @acquire_ctx: acquire context for this atomic modeset state update
    360 *
    361 * States are added to an atomic update by calling drm_atomic_get_crtc_state(),
    362 * drm_atomic_get_plane_state(), drm_atomic_get_connector_state(), or for
    363 * private state structures, drm_atomic_get_private_obj_state().
    364 */
    365struct drm_atomic_state {
    366	struct kref ref;
    367
    368	struct drm_device *dev;
    369
    370	/**
    371	 * @allow_modeset:
    372	 *
    373	 * Allow full modeset. This is used by the ATOMIC IOCTL handler to
    374	 * implement the DRM_MODE_ATOMIC_ALLOW_MODESET flag. Drivers should
    375	 * never consult this flag, instead looking at the output of
    376	 * drm_atomic_crtc_needs_modeset().
    377	 */
    378	bool allow_modeset : 1;
    379	/**
    380	 * @legacy_cursor_update:
    381	 *
    382	 * Hint to enforce legacy cursor IOCTL semantics.
    383	 *
    384	 * WARNING: This is thoroughly broken and pretty much impossible to
    385	 * implement correctly. Drivers must ignore this and should instead
    386	 * implement &drm_plane_helper_funcs.atomic_async_check and
    387	 * &drm_plane_helper_funcs.atomic_async_commit hooks. New users of this
    388	 * flag are not allowed.
    389	 */
    390	bool legacy_cursor_update : 1;
    391	bool async_update : 1;
    392	/**
    393	 * @duplicated:
    394	 *
    395	 * Indicates whether or not this atomic state was duplicated using
    396	 * drm_atomic_helper_duplicate_state(). Drivers and atomic helpers
    397	 * should use this to fixup normal  inconsistencies in duplicated
    398	 * states.
    399	 */
    400	bool duplicated : 1;
    401	struct __drm_planes_state *planes;
    402	struct __drm_crtcs_state *crtcs;
    403	int num_connector;
    404	struct __drm_connnectors_state *connectors;
    405	int num_private_objs;
    406	struct __drm_private_objs_state *private_objs;
    407
    408	struct drm_modeset_acquire_ctx *acquire_ctx;
    409
    410	/**
    411	 * @fake_commit:
    412	 *
    413	 * Used for signaling unbound planes/connectors.
    414	 * When a connector or plane is not bound to any CRTC, it's still important
    415	 * to preserve linearity to prevent the atomic states from being freed to early.
    416	 *
    417	 * This commit (if set) is not bound to any CRTC, but will be completed when
    418	 * drm_atomic_helper_commit_hw_done() is called.
    419	 */
    420	struct drm_crtc_commit *fake_commit;
    421
    422	/**
    423	 * @commit_work:
    424	 *
    425	 * Work item which can be used by the driver or helpers to execute the
    426	 * commit without blocking.
    427	 */
    428	struct work_struct commit_work;
    429};
    430
    431void __drm_crtc_commit_free(struct kref *kref);
    432
    433/**
    434 * drm_crtc_commit_get - acquire a reference to the CRTC commit
    435 * @commit: CRTC commit
    436 *
    437 * Increases the reference of @commit.
    438 *
    439 * Returns:
    440 * The pointer to @commit, with reference increased.
    441 */
    442static inline struct drm_crtc_commit *drm_crtc_commit_get(struct drm_crtc_commit *commit)
    443{
    444	kref_get(&commit->ref);
    445	return commit;
    446}
    447
    448/**
    449 * drm_crtc_commit_put - release a reference to the CRTC commmit
    450 * @commit: CRTC commit
    451 *
    452 * This releases a reference to @commit which is freed after removing the
    453 * final reference. No locking required and callable from any context.
    454 */
    455static inline void drm_crtc_commit_put(struct drm_crtc_commit *commit)
    456{
    457	kref_put(&commit->ref, __drm_crtc_commit_free);
    458}
    459
    460int drm_crtc_commit_wait(struct drm_crtc_commit *commit);
    461
    462struct drm_atomic_state * __must_check
    463drm_atomic_state_alloc(struct drm_device *dev);
    464void drm_atomic_state_clear(struct drm_atomic_state *state);
    465
    466/**
    467 * drm_atomic_state_get - acquire a reference to the atomic state
    468 * @state: The atomic state
    469 *
    470 * Returns a new reference to the @state
    471 */
    472static inline struct drm_atomic_state *
    473drm_atomic_state_get(struct drm_atomic_state *state)
    474{
    475	kref_get(&state->ref);
    476	return state;
    477}
    478
    479void __drm_atomic_state_free(struct kref *ref);
    480
    481/**
    482 * drm_atomic_state_put - release a reference to the atomic state
    483 * @state: The atomic state
    484 *
    485 * This releases a reference to @state which is freed after removing the
    486 * final reference. No locking required and callable from any context.
    487 */
    488static inline void drm_atomic_state_put(struct drm_atomic_state *state)
    489{
    490	kref_put(&state->ref, __drm_atomic_state_free);
    491}
    492
    493int  __must_check
    494drm_atomic_state_init(struct drm_device *dev, struct drm_atomic_state *state);
    495void drm_atomic_state_default_clear(struct drm_atomic_state *state);
    496void drm_atomic_state_default_release(struct drm_atomic_state *state);
    497
    498struct drm_crtc_state * __must_check
    499drm_atomic_get_crtc_state(struct drm_atomic_state *state,
    500			  struct drm_crtc *crtc);
    501struct drm_plane_state * __must_check
    502drm_atomic_get_plane_state(struct drm_atomic_state *state,
    503			   struct drm_plane *plane);
    504struct drm_connector_state * __must_check
    505drm_atomic_get_connector_state(struct drm_atomic_state *state,
    506			       struct drm_connector *connector);
    507
    508void drm_atomic_private_obj_init(struct drm_device *dev,
    509				 struct drm_private_obj *obj,
    510				 struct drm_private_state *state,
    511				 const struct drm_private_state_funcs *funcs);
    512void drm_atomic_private_obj_fini(struct drm_private_obj *obj);
    513
    514struct drm_private_state * __must_check
    515drm_atomic_get_private_obj_state(struct drm_atomic_state *state,
    516				 struct drm_private_obj *obj);
    517struct drm_private_state *
    518drm_atomic_get_old_private_obj_state(struct drm_atomic_state *state,
    519				     struct drm_private_obj *obj);
    520struct drm_private_state *
    521drm_atomic_get_new_private_obj_state(struct drm_atomic_state *state,
    522				     struct drm_private_obj *obj);
    523
    524struct drm_connector *
    525drm_atomic_get_old_connector_for_encoder(struct drm_atomic_state *state,
    526					 struct drm_encoder *encoder);
    527struct drm_connector *
    528drm_atomic_get_new_connector_for_encoder(struct drm_atomic_state *state,
    529					 struct drm_encoder *encoder);
    530
    531/**
    532 * drm_atomic_get_existing_crtc_state - get CRTC state, if it exists
    533 * @state: global atomic state object
    534 * @crtc: CRTC to grab
    535 *
    536 * This function returns the CRTC state for the given CRTC, or NULL
    537 * if the CRTC is not part of the global atomic state.
    538 *
    539 * This function is deprecated, @drm_atomic_get_old_crtc_state or
    540 * @drm_atomic_get_new_crtc_state should be used instead.
    541 */
    542static inline struct drm_crtc_state *
    543drm_atomic_get_existing_crtc_state(struct drm_atomic_state *state,
    544				   struct drm_crtc *crtc)
    545{
    546	return state->crtcs[drm_crtc_index(crtc)].state;
    547}
    548
    549/**
    550 * drm_atomic_get_old_crtc_state - get old CRTC state, if it exists
    551 * @state: global atomic state object
    552 * @crtc: CRTC to grab
    553 *
    554 * This function returns the old CRTC state for the given CRTC, or
    555 * NULL if the CRTC is not part of the global atomic state.
    556 */
    557static inline struct drm_crtc_state *
    558drm_atomic_get_old_crtc_state(struct drm_atomic_state *state,
    559			      struct drm_crtc *crtc)
    560{
    561	return state->crtcs[drm_crtc_index(crtc)].old_state;
    562}
    563/**
    564 * drm_atomic_get_new_crtc_state - get new CRTC state, if it exists
    565 * @state: global atomic state object
    566 * @crtc: CRTC to grab
    567 *
    568 * This function returns the new CRTC state for the given CRTC, or
    569 * NULL if the CRTC is not part of the global atomic state.
    570 */
    571static inline struct drm_crtc_state *
    572drm_atomic_get_new_crtc_state(struct drm_atomic_state *state,
    573			      struct drm_crtc *crtc)
    574{
    575	return state->crtcs[drm_crtc_index(crtc)].new_state;
    576}
    577
    578/**
    579 * drm_atomic_get_existing_plane_state - get plane state, if it exists
    580 * @state: global atomic state object
    581 * @plane: plane to grab
    582 *
    583 * This function returns the plane state for the given plane, or NULL
    584 * if the plane is not part of the global atomic state.
    585 *
    586 * This function is deprecated, @drm_atomic_get_old_plane_state or
    587 * @drm_atomic_get_new_plane_state should be used instead.
    588 */
    589static inline struct drm_plane_state *
    590drm_atomic_get_existing_plane_state(struct drm_atomic_state *state,
    591				    struct drm_plane *plane)
    592{
    593	return state->planes[drm_plane_index(plane)].state;
    594}
    595
    596/**
    597 * drm_atomic_get_old_plane_state - get plane state, if it exists
    598 * @state: global atomic state object
    599 * @plane: plane to grab
    600 *
    601 * This function returns the old plane state for the given plane, or
    602 * NULL if the plane is not part of the global atomic state.
    603 */
    604static inline struct drm_plane_state *
    605drm_atomic_get_old_plane_state(struct drm_atomic_state *state,
    606			       struct drm_plane *plane)
    607{
    608	return state->planes[drm_plane_index(plane)].old_state;
    609}
    610
    611/**
    612 * drm_atomic_get_new_plane_state - get plane state, if it exists
    613 * @state: global atomic state object
    614 * @plane: plane to grab
    615 *
    616 * This function returns the new plane state for the given plane, or
    617 * NULL if the plane is not part of the global atomic state.
    618 */
    619static inline struct drm_plane_state *
    620drm_atomic_get_new_plane_state(struct drm_atomic_state *state,
    621			       struct drm_plane *plane)
    622{
    623	return state->planes[drm_plane_index(plane)].new_state;
    624}
    625
    626/**
    627 * drm_atomic_get_existing_connector_state - get connector state, if it exists
    628 * @state: global atomic state object
    629 * @connector: connector to grab
    630 *
    631 * This function returns the connector state for the given connector,
    632 * or NULL if the connector is not part of the global atomic state.
    633 *
    634 * This function is deprecated, @drm_atomic_get_old_connector_state or
    635 * @drm_atomic_get_new_connector_state should be used instead.
    636 */
    637static inline struct drm_connector_state *
    638drm_atomic_get_existing_connector_state(struct drm_atomic_state *state,
    639					struct drm_connector *connector)
    640{
    641	int index = drm_connector_index(connector);
    642
    643	if (index >= state->num_connector)
    644		return NULL;
    645
    646	return state->connectors[index].state;
    647}
    648
    649/**
    650 * drm_atomic_get_old_connector_state - get connector state, if it exists
    651 * @state: global atomic state object
    652 * @connector: connector to grab
    653 *
    654 * This function returns the old connector state for the given connector,
    655 * or NULL if the connector is not part of the global atomic state.
    656 */
    657static inline struct drm_connector_state *
    658drm_atomic_get_old_connector_state(struct drm_atomic_state *state,
    659				   struct drm_connector *connector)
    660{
    661	int index = drm_connector_index(connector);
    662
    663	if (index >= state->num_connector)
    664		return NULL;
    665
    666	return state->connectors[index].old_state;
    667}
    668
    669/**
    670 * drm_atomic_get_new_connector_state - get connector state, if it exists
    671 * @state: global atomic state object
    672 * @connector: connector to grab
    673 *
    674 * This function returns the new connector state for the given connector,
    675 * or NULL if the connector is not part of the global atomic state.
    676 */
    677static inline struct drm_connector_state *
    678drm_atomic_get_new_connector_state(struct drm_atomic_state *state,
    679				   struct drm_connector *connector)
    680{
    681	int index = drm_connector_index(connector);
    682
    683	if (index >= state->num_connector)
    684		return NULL;
    685
    686	return state->connectors[index].new_state;
    687}
    688
    689/**
    690 * __drm_atomic_get_current_plane_state - get current plane state
    691 * @state: global atomic state object
    692 * @plane: plane to grab
    693 *
    694 * This function returns the plane state for the given plane, either from
    695 * @state, or if the plane isn't part of the atomic state update, from @plane.
    696 * This is useful in atomic check callbacks, when drivers need to peek at, but
    697 * not change, state of other planes, since it avoids threading an error code
    698 * back up the call chain.
    699 *
    700 * WARNING:
    701 *
    702 * Note that this function is in general unsafe since it doesn't check for the
    703 * required locking for access state structures. Drivers must ensure that it is
    704 * safe to access the returned state structure through other means. One common
    705 * example is when planes are fixed to a single CRTC, and the driver knows that
    706 * the CRTC lock is held already. In that case holding the CRTC lock gives a
    707 * read-lock on all planes connected to that CRTC. But if planes can be
    708 * reassigned things get more tricky. In that case it's better to use
    709 * drm_atomic_get_plane_state and wire up full error handling.
    710 *
    711 * Returns:
    712 *
    713 * Read-only pointer to the current plane state.
    714 */
    715static inline const struct drm_plane_state *
    716__drm_atomic_get_current_plane_state(struct drm_atomic_state *state,
    717				     struct drm_plane *plane)
    718{
    719	if (state->planes[drm_plane_index(plane)].state)
    720		return state->planes[drm_plane_index(plane)].state;
    721
    722	return plane->state;
    723}
    724
    725int __must_check
    726drm_atomic_add_encoder_bridges(struct drm_atomic_state *state,
    727			       struct drm_encoder *encoder);
    728int __must_check
    729drm_atomic_add_affected_connectors(struct drm_atomic_state *state,
    730				   struct drm_crtc *crtc);
    731int __must_check
    732drm_atomic_add_affected_planes(struct drm_atomic_state *state,
    733			       struct drm_crtc *crtc);
    734
    735int __must_check drm_atomic_check_only(struct drm_atomic_state *state);
    736int __must_check drm_atomic_commit(struct drm_atomic_state *state);
    737int __must_check drm_atomic_nonblocking_commit(struct drm_atomic_state *state);
    738
    739void drm_state_dump(struct drm_device *dev, struct drm_printer *p);
    740
    741/**
    742 * for_each_oldnew_connector_in_state - iterate over all connectors in an atomic update
    743 * @__state: &struct drm_atomic_state pointer
    744 * @connector: &struct drm_connector iteration cursor
    745 * @old_connector_state: &struct drm_connector_state iteration cursor for the
    746 * 	old state
    747 * @new_connector_state: &struct drm_connector_state iteration cursor for the
    748 * 	new state
    749 * @__i: int iteration cursor, for macro-internal use
    750 *
    751 * This iterates over all connectors in an atomic update, tracking both old and
    752 * new state. This is useful in places where the state delta needs to be
    753 * considered, for example in atomic check functions.
    754 */
    755#define for_each_oldnew_connector_in_state(__state, connector, old_connector_state, new_connector_state, __i) \
    756	for ((__i) = 0;								\
    757	     (__i) < (__state)->num_connector;					\
    758	     (__i)++)								\
    759		for_each_if ((__state)->connectors[__i].ptr &&			\
    760			     ((connector) = (__state)->connectors[__i].ptr,	\
    761			     (void)(connector) /* Only to avoid unused-but-set-variable warning */, \
    762			     (old_connector_state) = (__state)->connectors[__i].old_state,	\
    763			     (new_connector_state) = (__state)->connectors[__i].new_state, 1))
    764
    765/**
    766 * for_each_old_connector_in_state - iterate over all connectors in an atomic update
    767 * @__state: &struct drm_atomic_state pointer
    768 * @connector: &struct drm_connector iteration cursor
    769 * @old_connector_state: &struct drm_connector_state iteration cursor for the
    770 * 	old state
    771 * @__i: int iteration cursor, for macro-internal use
    772 *
    773 * This iterates over all connectors in an atomic update, tracking only the old
    774 * state. This is useful in disable functions, where we need the old state the
    775 * hardware is still in.
    776 */
    777#define for_each_old_connector_in_state(__state, connector, old_connector_state, __i) \
    778	for ((__i) = 0;								\
    779	     (__i) < (__state)->num_connector;					\
    780	     (__i)++)								\
    781		for_each_if ((__state)->connectors[__i].ptr &&			\
    782			     ((connector) = (__state)->connectors[__i].ptr,	\
    783			     (void)(connector) /* Only to avoid unused-but-set-variable warning */, \
    784			     (old_connector_state) = (__state)->connectors[__i].old_state, 1))
    785
    786/**
    787 * for_each_new_connector_in_state - iterate over all connectors in an atomic update
    788 * @__state: &struct drm_atomic_state pointer
    789 * @connector: &struct drm_connector iteration cursor
    790 * @new_connector_state: &struct drm_connector_state iteration cursor for the
    791 * 	new state
    792 * @__i: int iteration cursor, for macro-internal use
    793 *
    794 * This iterates over all connectors in an atomic update, tracking only the new
    795 * state. This is useful in enable functions, where we need the new state the
    796 * hardware should be in when the atomic commit operation has completed.
    797 */
    798#define for_each_new_connector_in_state(__state, connector, new_connector_state, __i) \
    799	for ((__i) = 0;								\
    800	     (__i) < (__state)->num_connector;					\
    801	     (__i)++)								\
    802		for_each_if ((__state)->connectors[__i].ptr &&			\
    803			     ((connector) = (__state)->connectors[__i].ptr,	\
    804			     (void)(connector) /* Only to avoid unused-but-set-variable warning */, \
    805			     (new_connector_state) = (__state)->connectors[__i].new_state, \
    806			     (void)(new_connector_state) /* Only to avoid unused-but-set-variable warning */, 1))
    807
    808/**
    809 * for_each_oldnew_crtc_in_state - iterate over all CRTCs in an atomic update
    810 * @__state: &struct drm_atomic_state pointer
    811 * @crtc: &struct drm_crtc iteration cursor
    812 * @old_crtc_state: &struct drm_crtc_state iteration cursor for the old state
    813 * @new_crtc_state: &struct drm_crtc_state iteration cursor for the new state
    814 * @__i: int iteration cursor, for macro-internal use
    815 *
    816 * This iterates over all CRTCs in an atomic update, tracking both old and
    817 * new state. This is useful in places where the state delta needs to be
    818 * considered, for example in atomic check functions.
    819 */
    820#define for_each_oldnew_crtc_in_state(__state, crtc, old_crtc_state, new_crtc_state, __i) \
    821	for ((__i) = 0;							\
    822	     (__i) < (__state)->dev->mode_config.num_crtc;		\
    823	     (__i)++)							\
    824		for_each_if ((__state)->crtcs[__i].ptr &&		\
    825			     ((crtc) = (__state)->crtcs[__i].ptr,	\
    826			      (void)(crtc) /* Only to avoid unused-but-set-variable warning */, \
    827			     (old_crtc_state) = (__state)->crtcs[__i].old_state, \
    828			     (void)(old_crtc_state) /* Only to avoid unused-but-set-variable warning */, \
    829			     (new_crtc_state) = (__state)->crtcs[__i].new_state, \
    830			     (void)(new_crtc_state) /* Only to avoid unused-but-set-variable warning */, 1))
    831
    832/**
    833 * for_each_old_crtc_in_state - iterate over all CRTCs in an atomic update
    834 * @__state: &struct drm_atomic_state pointer
    835 * @crtc: &struct drm_crtc iteration cursor
    836 * @old_crtc_state: &struct drm_crtc_state iteration cursor for the old state
    837 * @__i: int iteration cursor, for macro-internal use
    838 *
    839 * This iterates over all CRTCs in an atomic update, tracking only the old
    840 * state. This is useful in disable functions, where we need the old state the
    841 * hardware is still in.
    842 */
    843#define for_each_old_crtc_in_state(__state, crtc, old_crtc_state, __i)	\
    844	for ((__i) = 0;							\
    845	     (__i) < (__state)->dev->mode_config.num_crtc;		\
    846	     (__i)++)							\
    847		for_each_if ((__state)->crtcs[__i].ptr &&		\
    848			     ((crtc) = (__state)->crtcs[__i].ptr,	\
    849			     (void)(crtc) /* Only to avoid unused-but-set-variable warning */, \
    850			     (old_crtc_state) = (__state)->crtcs[__i].old_state, 1))
    851
    852/**
    853 * for_each_new_crtc_in_state - iterate over all CRTCs in an atomic update
    854 * @__state: &struct drm_atomic_state pointer
    855 * @crtc: &struct drm_crtc iteration cursor
    856 * @new_crtc_state: &struct drm_crtc_state iteration cursor for the new state
    857 * @__i: int iteration cursor, for macro-internal use
    858 *
    859 * This iterates over all CRTCs in an atomic update, tracking only the new
    860 * state. This is useful in enable functions, where we need the new state the
    861 * hardware should be in when the atomic commit operation has completed.
    862 */
    863#define for_each_new_crtc_in_state(__state, crtc, new_crtc_state, __i)	\
    864	for ((__i) = 0;							\
    865	     (__i) < (__state)->dev->mode_config.num_crtc;		\
    866	     (__i)++)							\
    867		for_each_if ((__state)->crtcs[__i].ptr &&		\
    868			     ((crtc) = (__state)->crtcs[__i].ptr,	\
    869			     (void)(crtc) /* Only to avoid unused-but-set-variable warning */, \
    870			     (new_crtc_state) = (__state)->crtcs[__i].new_state, \
    871			     (void)(new_crtc_state) /* Only to avoid unused-but-set-variable warning */, 1))
    872
    873/**
    874 * for_each_oldnew_plane_in_state - iterate over all planes in an atomic update
    875 * @__state: &struct drm_atomic_state pointer
    876 * @plane: &struct drm_plane iteration cursor
    877 * @old_plane_state: &struct drm_plane_state iteration cursor for the old state
    878 * @new_plane_state: &struct drm_plane_state iteration cursor for the new state
    879 * @__i: int iteration cursor, for macro-internal use
    880 *
    881 * This iterates over all planes in an atomic update, tracking both old and
    882 * new state. This is useful in places where the state delta needs to be
    883 * considered, for example in atomic check functions.
    884 */
    885#define for_each_oldnew_plane_in_state(__state, plane, old_plane_state, new_plane_state, __i) \
    886	for ((__i) = 0;							\
    887	     (__i) < (__state)->dev->mode_config.num_total_plane;	\
    888	     (__i)++)							\
    889		for_each_if ((__state)->planes[__i].ptr &&		\
    890			     ((plane) = (__state)->planes[__i].ptr,	\
    891			      (void)(plane) /* Only to avoid unused-but-set-variable warning */, \
    892			      (old_plane_state) = (__state)->planes[__i].old_state,\
    893			      (new_plane_state) = (__state)->planes[__i].new_state, 1))
    894
    895/**
    896 * for_each_oldnew_plane_in_state_reverse - iterate over all planes in an atomic
    897 * update in reverse order
    898 * @__state: &struct drm_atomic_state pointer
    899 * @plane: &struct drm_plane iteration cursor
    900 * @old_plane_state: &struct drm_plane_state iteration cursor for the old state
    901 * @new_plane_state: &struct drm_plane_state iteration cursor for the new state
    902 * @__i: int iteration cursor, for macro-internal use
    903 *
    904 * This iterates over all planes in an atomic update in reverse order,
    905 * tracking both old and  new state. This is useful in places where the
    906 * state delta needs to be considered, for example in atomic check functions.
    907 */
    908#define for_each_oldnew_plane_in_state_reverse(__state, plane, old_plane_state, new_plane_state, __i) \
    909	for ((__i) = ((__state)->dev->mode_config.num_total_plane - 1);	\
    910	     (__i) >= 0;						\
    911	     (__i)--)							\
    912		for_each_if ((__state)->planes[__i].ptr &&		\
    913			     ((plane) = (__state)->planes[__i].ptr,	\
    914			      (old_plane_state) = (__state)->planes[__i].old_state,\
    915			      (new_plane_state) = (__state)->planes[__i].new_state, 1))
    916
    917/**
    918 * for_each_new_plane_in_state_reverse - other than only tracking new state,
    919 * it's the same as for_each_oldnew_plane_in_state_reverse
    920 * @__state: &struct drm_atomic_state pointer
    921 * @plane: &struct drm_plane iteration cursor
    922 * @new_plane_state: &struct drm_plane_state iteration cursor for the new state
    923 * @__i: int iteration cursor, for macro-internal use
    924 */
    925#define for_each_new_plane_in_state_reverse(__state, plane, new_plane_state, __i) \
    926	for ((__i) = ((__state)->dev->mode_config.num_total_plane - 1);	\
    927	     (__i) >= 0;						\
    928	     (__i)--)							\
    929		for_each_if ((__state)->planes[__i].ptr &&		\
    930			     ((plane) = (__state)->planes[__i].ptr,	\
    931			      (new_plane_state) = (__state)->planes[__i].new_state, 1))
    932
    933/**
    934 * for_each_old_plane_in_state - iterate over all planes in an atomic update
    935 * @__state: &struct drm_atomic_state pointer
    936 * @plane: &struct drm_plane iteration cursor
    937 * @old_plane_state: &struct drm_plane_state iteration cursor for the old state
    938 * @__i: int iteration cursor, for macro-internal use
    939 *
    940 * This iterates over all planes in an atomic update, tracking only the old
    941 * state. This is useful in disable functions, where we need the old state the
    942 * hardware is still in.
    943 */
    944#define for_each_old_plane_in_state(__state, plane, old_plane_state, __i) \
    945	for ((__i) = 0;							\
    946	     (__i) < (__state)->dev->mode_config.num_total_plane;	\
    947	     (__i)++)							\
    948		for_each_if ((__state)->planes[__i].ptr &&		\
    949			     ((plane) = (__state)->planes[__i].ptr,	\
    950			      (old_plane_state) = (__state)->planes[__i].old_state, 1))
    951/**
    952 * for_each_new_plane_in_state - iterate over all planes in an atomic update
    953 * @__state: &struct drm_atomic_state pointer
    954 * @plane: &struct drm_plane iteration cursor
    955 * @new_plane_state: &struct drm_plane_state iteration cursor for the new state
    956 * @__i: int iteration cursor, for macro-internal use
    957 *
    958 * This iterates over all planes in an atomic update, tracking only the new
    959 * state. This is useful in enable functions, where we need the new state the
    960 * hardware should be in when the atomic commit operation has completed.
    961 */
    962#define for_each_new_plane_in_state(__state, plane, new_plane_state, __i) \
    963	for ((__i) = 0;							\
    964	     (__i) < (__state)->dev->mode_config.num_total_plane;	\
    965	     (__i)++)							\
    966		for_each_if ((__state)->planes[__i].ptr &&		\
    967			     ((plane) = (__state)->planes[__i].ptr,	\
    968			      (void)(plane) /* Only to avoid unused-but-set-variable warning */, \
    969			      (new_plane_state) = (__state)->planes[__i].new_state, \
    970			      (void)(new_plane_state) /* Only to avoid unused-but-set-variable warning */, 1))
    971
    972/**
    973 * for_each_oldnew_private_obj_in_state - iterate over all private objects in an atomic update
    974 * @__state: &struct drm_atomic_state pointer
    975 * @obj: &struct drm_private_obj iteration cursor
    976 * @old_obj_state: &struct drm_private_state iteration cursor for the old state
    977 * @new_obj_state: &struct drm_private_state iteration cursor for the new state
    978 * @__i: int iteration cursor, for macro-internal use
    979 *
    980 * This iterates over all private objects in an atomic update, tracking both
    981 * old and new state. This is useful in places where the state delta needs
    982 * to be considered, for example in atomic check functions.
    983 */
    984#define for_each_oldnew_private_obj_in_state(__state, obj, old_obj_state, new_obj_state, __i) \
    985	for ((__i) = 0; \
    986	     (__i) < (__state)->num_private_objs && \
    987		     ((obj) = (__state)->private_objs[__i].ptr, \
    988		      (old_obj_state) = (__state)->private_objs[__i].old_state,	\
    989		      (new_obj_state) = (__state)->private_objs[__i].new_state, 1); \
    990	     (__i)++)
    991
    992/**
    993 * for_each_old_private_obj_in_state - iterate over all private objects in an atomic update
    994 * @__state: &struct drm_atomic_state pointer
    995 * @obj: &struct drm_private_obj iteration cursor
    996 * @old_obj_state: &struct drm_private_state iteration cursor for the old state
    997 * @__i: int iteration cursor, for macro-internal use
    998 *
    999 * 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 */
   1048static inline bool
   1049drm_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 */
   1064static inline bool
   1065drm_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 */
   1086struct 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 */
   1105struct 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
   1127static inline struct drm_bridge_state *
   1128drm_priv_to_bridge_state(struct drm_private_state *priv)
   1129{
   1130	return container_of(priv, struct drm_bridge_state, base);
   1131}
   1132
   1133struct drm_bridge_state *
   1134drm_atomic_get_bridge_state(struct drm_atomic_state *state,
   1135			    struct drm_bridge *bridge);
   1136struct drm_bridge_state *
   1137drm_atomic_get_old_bridge_state(struct drm_atomic_state *state,
   1138				struct drm_bridge *bridge);
   1139struct drm_bridge_state *
   1140drm_atomic_get_new_bridge_state(struct drm_atomic_state *state,
   1141				struct drm_bridge *bridge);
   1142
   1143#endif /* DRM_ATOMIC_H_ */