![]() |
|
|||
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_ */
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.1.0 LXR engine. The LXR team |
![]() ![]() |