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 | */ |
72 | struct 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 | |
160 | struct __drm_planes_state { |
161 | struct drm_plane *ptr; |
162 | struct drm_plane_state *state, *old_state, *new_state; |
163 | }; |
164 | |
165 | struct __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 | |
183 | struct __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 | |
196 | struct drm_private_obj; |
197 | struct 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 | */ |
209 | struct 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 | */ |
286 | struct 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 | */ |
331 | struct 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 | |
343 | struct __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 - Atomic commit structure |
350 | * |
351 | * This structure is the kernel counterpart of @drm_mode_atomic and represents |
352 | * an atomic commit that transitions from an old to a new display state. It |
353 | * contains all the objects affected by the atomic commit and both the new |
354 | * state structures and pointers to the old state structures for |
355 | * these. |
356 | * |
357 | * States are added to an atomic update by calling drm_atomic_get_crtc_state(), |
358 | * drm_atomic_get_plane_state(), drm_atomic_get_connector_state(), or for |
359 | * private state structures, drm_atomic_get_private_obj_state(). |
360 | * |
361 | * NOTE: struct drm_atomic_state first started as a single collection of |
362 | * entities state pointers (drm_plane_state, drm_crtc_state, etc.). |
363 | * |
364 | * At atomic_check time, you could get the state about to be committed |
365 | * from drm_atomic_state, and the one currently running from the |
366 | * entities state pointer (drm_crtc.state, for example). After the call |
367 | * to drm_atomic_helper_swap_state(), the entities state pointer would |
368 | * contain the state previously checked, and the drm_atomic_state |
369 | * structure the old state. |
370 | * |
371 | * Over time, and in order to avoid confusion, drm_atomic_state has |
372 | * grown to have both the old state (ie, the state we replace) and the |
373 | * new state (ie, the state we want to apply). Those names are stable |
374 | * during the commit process, which makes it easier to reason about. |
375 | * |
376 | * You can still find some traces of that evolution through some hooks |
377 | * or callbacks taking a drm_atomic_state parameter called names like |
378 | * "old_state". This doesn't necessarily mean that the previous |
379 | * drm_atomic_state is passed, but rather that this used to be the state |
380 | * collection we were replacing after drm_atomic_helper_swap_state(), |
381 | * but the variable name was never updated. |
382 | * |
383 | * Some atomic operations implementations followed a similar process. We |
384 | * first started to pass the entity state only. However, it was pretty |
385 | * cumbersome for drivers, and especially CRTCs, to retrieve the states |
386 | * of other components. Thus, we switched to passing the whole |
387 | * drm_atomic_state as a parameter to those operations. Similarly, the |
388 | * transition isn't complete yet, and one might still find atomic |
389 | * operations taking a drm_atomic_state pointer, or a component state |
390 | * pointer. The former is the preferred form. |
391 | */ |
392 | struct drm_atomic_state { |
393 | /** |
394 | * @ref: |
395 | * |
396 | * Count of all references to this update (will not be freed until zero). |
397 | */ |
398 | struct kref ref; |
399 | |
400 | /** |
401 | * @dev: Parent DRM Device. |
402 | */ |
403 | struct drm_device *dev; |
404 | |
405 | /** |
406 | * @allow_modeset: |
407 | * |
408 | * Allow full modeset. This is used by the ATOMIC IOCTL handler to |
409 | * implement the DRM_MODE_ATOMIC_ALLOW_MODESET flag. Drivers should |
410 | * generally not consult this flag, but instead look at the output of |
411 | * drm_atomic_crtc_needs_modeset(). The detailed rules are: |
412 | * |
413 | * - Drivers must not consult @allow_modeset in the atomic commit path. |
414 | * Use drm_atomic_crtc_needs_modeset() instead. |
415 | * |
416 | * - Drivers must consult @allow_modeset before adding unrelated struct |
417 | * drm_crtc_state to this commit by calling |
418 | * drm_atomic_get_crtc_state(). See also the warning in the |
419 | * documentation for that function. |
420 | * |
421 | * - Drivers must never change this flag, it is under the exclusive |
422 | * control of userspace. |
423 | * |
424 | * - Drivers may consult @allow_modeset in the atomic check path, if |
425 | * they have the choice between an optimal hardware configuration |
426 | * which requires a modeset, and a less optimal configuration which |
427 | * can be committed without a modeset. An example would be suboptimal |
428 | * scanout FIFO allocation resulting in increased idle power |
429 | * consumption. This allows userspace to avoid flickering and delays |
430 | * for the normal composition loop at reasonable cost. |
431 | */ |
432 | bool allow_modeset : 1; |
433 | /** |
434 | * @legacy_cursor_update: |
435 | * |
436 | * Hint to enforce legacy cursor IOCTL semantics. |
437 | * |
438 | * WARNING: This is thoroughly broken and pretty much impossible to |
439 | * implement correctly. Drivers must ignore this and should instead |
440 | * implement &drm_plane_helper_funcs.atomic_async_check and |
441 | * &drm_plane_helper_funcs.atomic_async_commit hooks. New users of this |
442 | * flag are not allowed. |
443 | */ |
444 | bool legacy_cursor_update : 1; |
445 | |
446 | /** |
447 | * @async_update: hint for asynchronous plane update |
448 | */ |
449 | bool async_update : 1; |
450 | |
451 | /** |
452 | * @duplicated: |
453 | * |
454 | * Indicates whether or not this atomic state was duplicated using |
455 | * drm_atomic_helper_duplicate_state(). Drivers and atomic helpers |
456 | * should use this to fixup normal inconsistencies in duplicated |
457 | * states. |
458 | */ |
459 | bool duplicated : 1; |
460 | |
461 | /** |
462 | * @planes: |
463 | * |
464 | * Pointer to array of @drm_plane and @drm_plane_state part of this |
465 | * update. |
466 | */ |
467 | struct __drm_planes_state *planes; |
468 | |
469 | /** |
470 | * @crtcs: |
471 | * |
472 | * Pointer to array of @drm_crtc and @drm_crtc_state part of this |
473 | * update. |
474 | */ |
475 | struct __drm_crtcs_state *crtcs; |
476 | |
477 | /** |
478 | * @num_connector: size of the @connectors array |
479 | */ |
480 | int num_connector; |
481 | |
482 | /** |
483 | * @connectors: |
484 | * |
485 | * Pointer to array of @drm_connector and @drm_connector_state part of |
486 | * this update. |
487 | */ |
488 | struct __drm_connnectors_state *connectors; |
489 | |
490 | /** |
491 | * @num_private_objs: size of the @private_objs array |
492 | */ |
493 | int num_private_objs; |
494 | |
495 | /** |
496 | * @private_objs: |
497 | * |
498 | * Pointer to array of @drm_private_obj and @drm_private_obj_state part |
499 | * of this update. |
500 | */ |
501 | struct __drm_private_objs_state *private_objs; |
502 | |
503 | /** |
504 | * @acquire_ctx: acquire context for this atomic modeset state update |
505 | */ |
506 | struct drm_modeset_acquire_ctx *acquire_ctx; |
507 | |
508 | /** |
509 | * @fake_commit: |
510 | * |
511 | * Used for signaling unbound planes/connectors. |
512 | * When a connector or plane is not bound to any CRTC, it's still important |
513 | * to preserve linearity to prevent the atomic states from being freed too early. |
514 | * |
515 | * This commit (if set) is not bound to any CRTC, but will be completed when |
516 | * drm_atomic_helper_commit_hw_done() is called. |
517 | */ |
518 | struct drm_crtc_commit *fake_commit; |
519 | |
520 | /** |
521 | * @commit_work: |
522 | * |
523 | * Work item which can be used by the driver or helpers to execute the |
524 | * commit without blocking. |
525 | */ |
526 | struct work_struct commit_work; |
527 | }; |
528 | |
529 | void __drm_crtc_commit_free(struct kref *kref); |
530 | |
531 | /** |
532 | * drm_crtc_commit_get - acquire a reference to the CRTC commit |
533 | * @commit: CRTC commit |
534 | * |
535 | * Increases the reference of @commit. |
536 | * |
537 | * Returns: |
538 | * The pointer to @commit, with reference increased. |
539 | */ |
540 | static inline struct drm_crtc_commit *drm_crtc_commit_get(struct drm_crtc_commit *commit) |
541 | { |
542 | kref_get(kref: &commit->ref); |
543 | return commit; |
544 | } |
545 | |
546 | /** |
547 | * drm_crtc_commit_put - release a reference to the CRTC commmit |
548 | * @commit: CRTC commit |
549 | * |
550 | * This releases a reference to @commit which is freed after removing the |
551 | * final reference. No locking required and callable from any context. |
552 | */ |
553 | static inline void drm_crtc_commit_put(struct drm_crtc_commit *commit) |
554 | { |
555 | kref_put(kref: &commit->ref, release: __drm_crtc_commit_free); |
556 | } |
557 | |
558 | int drm_crtc_commit_wait(struct drm_crtc_commit *commit); |
559 | |
560 | struct drm_atomic_state * __must_check |
561 | drm_atomic_state_alloc(struct drm_device *dev); |
562 | void drm_atomic_state_clear(struct drm_atomic_state *state); |
563 | |
564 | /** |
565 | * drm_atomic_state_get - acquire a reference to the atomic state |
566 | * @state: The atomic state |
567 | * |
568 | * Returns a new reference to the @state |
569 | */ |
570 | static inline struct drm_atomic_state * |
571 | drm_atomic_state_get(struct drm_atomic_state *state) |
572 | { |
573 | kref_get(kref: &state->ref); |
574 | return state; |
575 | } |
576 | |
577 | void __drm_atomic_state_free(struct kref *ref); |
578 | |
579 | /** |
580 | * drm_atomic_state_put - release a reference to the atomic state |
581 | * @state: The atomic state |
582 | * |
583 | * This releases a reference to @state which is freed after removing the |
584 | * final reference. No locking required and callable from any context. |
585 | */ |
586 | static inline void drm_atomic_state_put(struct drm_atomic_state *state) |
587 | { |
588 | kref_put(kref: &state->ref, release: __drm_atomic_state_free); |
589 | } |
590 | |
591 | int __must_check |
592 | drm_atomic_state_init(struct drm_device *dev, struct drm_atomic_state *state); |
593 | void drm_atomic_state_default_clear(struct drm_atomic_state *state); |
594 | void drm_atomic_state_default_release(struct drm_atomic_state *state); |
595 | |
596 | struct drm_crtc_state * __must_check |
597 | drm_atomic_get_crtc_state(struct drm_atomic_state *state, |
598 | struct drm_crtc *crtc); |
599 | struct drm_plane_state * __must_check |
600 | drm_atomic_get_plane_state(struct drm_atomic_state *state, |
601 | struct drm_plane *plane); |
602 | struct drm_connector_state * __must_check |
603 | drm_atomic_get_connector_state(struct drm_atomic_state *state, |
604 | struct drm_connector *connector); |
605 | |
606 | void drm_atomic_private_obj_init(struct drm_device *dev, |
607 | struct drm_private_obj *obj, |
608 | struct drm_private_state *state, |
609 | const struct drm_private_state_funcs *funcs); |
610 | void drm_atomic_private_obj_fini(struct drm_private_obj *obj); |
611 | |
612 | struct drm_private_state * __must_check |
613 | drm_atomic_get_private_obj_state(struct drm_atomic_state *state, |
614 | struct drm_private_obj *obj); |
615 | struct drm_private_state * |
616 | drm_atomic_get_old_private_obj_state(const struct drm_atomic_state *state, |
617 | struct drm_private_obj *obj); |
618 | struct drm_private_state * |
619 | drm_atomic_get_new_private_obj_state(const struct drm_atomic_state *state, |
620 | struct drm_private_obj *obj); |
621 | |
622 | struct drm_connector * |
623 | drm_atomic_get_old_connector_for_encoder(const struct drm_atomic_state *state, |
624 | struct drm_encoder *encoder); |
625 | struct drm_connector * |
626 | drm_atomic_get_new_connector_for_encoder(const struct drm_atomic_state *state, |
627 | struct drm_encoder *encoder); |
628 | struct drm_connector * |
629 | drm_atomic_get_connector_for_encoder(const struct drm_encoder *encoder, |
630 | struct drm_modeset_acquire_ctx *ctx); |
631 | |
632 | struct drm_crtc * |
633 | drm_atomic_get_old_crtc_for_encoder(struct drm_atomic_state *state, |
634 | struct drm_encoder *encoder); |
635 | struct drm_crtc * |
636 | drm_atomic_get_new_crtc_for_encoder(struct drm_atomic_state *state, |
637 | struct drm_encoder *encoder); |
638 | |
639 | /** |
640 | * drm_atomic_get_existing_crtc_state - get CRTC state, if it exists |
641 | * @state: global atomic state object |
642 | * @crtc: CRTC to grab |
643 | * |
644 | * This function returns the CRTC state for the given CRTC, or NULL |
645 | * if the CRTC is not part of the global atomic state. |
646 | * |
647 | * This function is deprecated, @drm_atomic_get_old_crtc_state or |
648 | * @drm_atomic_get_new_crtc_state should be used instead. |
649 | */ |
650 | static inline struct drm_crtc_state * |
651 | drm_atomic_get_existing_crtc_state(const struct drm_atomic_state *state, |
652 | struct drm_crtc *crtc) |
653 | { |
654 | return state->crtcs[drm_crtc_index(crtc)].state; |
655 | } |
656 | |
657 | /** |
658 | * drm_atomic_get_old_crtc_state - get old CRTC state, if it exists |
659 | * @state: global atomic state object |
660 | * @crtc: CRTC to grab |
661 | * |
662 | * This function returns the old CRTC state for the given CRTC, or |
663 | * NULL if the CRTC is not part of the global atomic state. |
664 | */ |
665 | static inline struct drm_crtc_state * |
666 | drm_atomic_get_old_crtc_state(const struct drm_atomic_state *state, |
667 | struct drm_crtc *crtc) |
668 | { |
669 | return state->crtcs[drm_crtc_index(crtc)].old_state; |
670 | } |
671 | /** |
672 | * drm_atomic_get_new_crtc_state - get new CRTC state, if it exists |
673 | * @state: global atomic state object |
674 | * @crtc: CRTC to grab |
675 | * |
676 | * This function returns the new CRTC state for the given CRTC, or |
677 | * NULL if the CRTC is not part of the global atomic state. |
678 | */ |
679 | static inline struct drm_crtc_state * |
680 | drm_atomic_get_new_crtc_state(const struct drm_atomic_state *state, |
681 | struct drm_crtc *crtc) |
682 | { |
683 | return state->crtcs[drm_crtc_index(crtc)].new_state; |
684 | } |
685 | |
686 | /** |
687 | * drm_atomic_get_existing_plane_state - get plane state, if it exists |
688 | * @state: global atomic state object |
689 | * @plane: plane to grab |
690 | * |
691 | * This function returns the plane state for the given plane, or NULL |
692 | * if the plane is not part of the global atomic state. |
693 | * |
694 | * This function is deprecated, @drm_atomic_get_old_plane_state or |
695 | * @drm_atomic_get_new_plane_state should be used instead. |
696 | */ |
697 | static inline struct drm_plane_state * |
698 | drm_atomic_get_existing_plane_state(const struct drm_atomic_state *state, |
699 | struct drm_plane *plane) |
700 | { |
701 | return state->planes[drm_plane_index(plane)].state; |
702 | } |
703 | |
704 | /** |
705 | * drm_atomic_get_old_plane_state - get plane state, if it exists |
706 | * @state: global atomic state object |
707 | * @plane: plane to grab |
708 | * |
709 | * This function returns the old plane state for the given plane, or |
710 | * NULL if the plane is not part of the global atomic state. |
711 | */ |
712 | static inline struct drm_plane_state * |
713 | drm_atomic_get_old_plane_state(const struct drm_atomic_state *state, |
714 | struct drm_plane *plane) |
715 | { |
716 | return state->planes[drm_plane_index(plane)].old_state; |
717 | } |
718 | |
719 | /** |
720 | * drm_atomic_get_new_plane_state - get plane state, if it exists |
721 | * @state: global atomic state object |
722 | * @plane: plane to grab |
723 | * |
724 | * This function returns the new plane state for the given plane, or |
725 | * NULL if the plane is not part of the global atomic state. |
726 | */ |
727 | static inline struct drm_plane_state * |
728 | drm_atomic_get_new_plane_state(const struct drm_atomic_state *state, |
729 | struct drm_plane *plane) |
730 | { |
731 | return state->planes[drm_plane_index(plane)].new_state; |
732 | } |
733 | |
734 | /** |
735 | * drm_atomic_get_existing_connector_state - get connector state, if it exists |
736 | * @state: global atomic state object |
737 | * @connector: connector to grab |
738 | * |
739 | * This function returns the connector state for the given connector, |
740 | * or NULL if the connector is not part of the global atomic state. |
741 | * |
742 | * This function is deprecated, @drm_atomic_get_old_connector_state or |
743 | * @drm_atomic_get_new_connector_state should be used instead. |
744 | */ |
745 | static inline struct drm_connector_state * |
746 | drm_atomic_get_existing_connector_state(const struct drm_atomic_state *state, |
747 | struct drm_connector *connector) |
748 | { |
749 | int index = drm_connector_index(connector); |
750 | |
751 | if (index >= state->num_connector) |
752 | return NULL; |
753 | |
754 | return state->connectors[index].state; |
755 | } |
756 | |
757 | /** |
758 | * drm_atomic_get_old_connector_state - get connector state, if it exists |
759 | * @state: global atomic state object |
760 | * @connector: connector to grab |
761 | * |
762 | * This function returns the old connector state for the given connector, |
763 | * or NULL if the connector is not part of the global atomic state. |
764 | */ |
765 | static inline struct drm_connector_state * |
766 | drm_atomic_get_old_connector_state(const struct drm_atomic_state *state, |
767 | struct drm_connector *connector) |
768 | { |
769 | int index = drm_connector_index(connector); |
770 | |
771 | if (index >= state->num_connector) |
772 | return NULL; |
773 | |
774 | return state->connectors[index].old_state; |
775 | } |
776 | |
777 | /** |
778 | * drm_atomic_get_new_connector_state - get connector state, if it exists |
779 | * @state: global atomic state object |
780 | * @connector: connector to grab |
781 | * |
782 | * This function returns the new connector state for the given connector, |
783 | * or NULL if the connector is not part of the global atomic state. |
784 | */ |
785 | static inline struct drm_connector_state * |
786 | drm_atomic_get_new_connector_state(const struct drm_atomic_state *state, |
787 | struct drm_connector *connector) |
788 | { |
789 | int index = drm_connector_index(connector); |
790 | |
791 | if (index >= state->num_connector) |
792 | return NULL; |
793 | |
794 | return state->connectors[index].new_state; |
795 | } |
796 | |
797 | /** |
798 | * __drm_atomic_get_current_plane_state - get current plane state |
799 | * @state: global atomic state object |
800 | * @plane: plane to grab |
801 | * |
802 | * This function returns the plane state for the given plane, either from |
803 | * @state, or if the plane isn't part of the atomic state update, from @plane. |
804 | * This is useful in atomic check callbacks, when drivers need to peek at, but |
805 | * not change, state of other planes, since it avoids threading an error code |
806 | * back up the call chain. |
807 | * |
808 | * WARNING: |
809 | * |
810 | * Note that this function is in general unsafe since it doesn't check for the |
811 | * required locking for access state structures. Drivers must ensure that it is |
812 | * safe to access the returned state structure through other means. One common |
813 | * example is when planes are fixed to a single CRTC, and the driver knows that |
814 | * the CRTC lock is held already. In that case holding the CRTC lock gives a |
815 | * read-lock on all planes connected to that CRTC. But if planes can be |
816 | * reassigned things get more tricky. In that case it's better to use |
817 | * drm_atomic_get_plane_state and wire up full error handling. |
818 | * |
819 | * Returns: |
820 | * |
821 | * Read-only pointer to the current plane state. |
822 | */ |
823 | static inline const struct drm_plane_state * |
824 | __drm_atomic_get_current_plane_state(const struct drm_atomic_state *state, |
825 | struct drm_plane *plane) |
826 | { |
827 | if (state->planes[drm_plane_index(plane)].state) |
828 | return state->planes[drm_plane_index(plane)].state; |
829 | |
830 | return plane->state; |
831 | } |
832 | |
833 | int __must_check |
834 | drm_atomic_add_encoder_bridges(struct drm_atomic_state *state, |
835 | struct drm_encoder *encoder); |
836 | int __must_check |
837 | drm_atomic_add_affected_connectors(struct drm_atomic_state *state, |
838 | struct drm_crtc *crtc); |
839 | int __must_check |
840 | drm_atomic_add_affected_planes(struct drm_atomic_state *state, |
841 | struct drm_crtc *crtc); |
842 | |
843 | int __must_check drm_atomic_check_only(struct drm_atomic_state *state); |
844 | int __must_check drm_atomic_commit(struct drm_atomic_state *state); |
845 | int __must_check drm_atomic_nonblocking_commit(struct drm_atomic_state *state); |
846 | |
847 | void drm_state_dump(struct drm_device *dev, struct drm_printer *p); |
848 | |
849 | /** |
850 | * for_each_oldnew_connector_in_state - iterate over all connectors in an atomic update |
851 | * @__state: &struct drm_atomic_state pointer |
852 | * @connector: &struct drm_connector iteration cursor |
853 | * @old_connector_state: &struct drm_connector_state iteration cursor for the |
854 | * old state |
855 | * @new_connector_state: &struct drm_connector_state iteration cursor for the |
856 | * new state |
857 | * @__i: int iteration cursor, for macro-internal use |
858 | * |
859 | * This iterates over all connectors in an atomic update, tracking both old and |
860 | * new state. This is useful in places where the state delta needs to be |
861 | * considered, for example in atomic check functions. |
862 | */ |
863 | #define for_each_oldnew_connector_in_state(__state, connector, old_connector_state, new_connector_state, __i) \ |
864 | for ((__i) = 0; \ |
865 | (__i) < (__state)->num_connector; \ |
866 | (__i)++) \ |
867 | for_each_if ((__state)->connectors[__i].ptr && \ |
868 | ((connector) = (__state)->connectors[__i].ptr, \ |
869 | (void)(connector) /* Only to avoid unused-but-set-variable warning */, \ |
870 | (old_connector_state) = (__state)->connectors[__i].old_state, \ |
871 | (new_connector_state) = (__state)->connectors[__i].new_state, 1)) |
872 | |
873 | /** |
874 | * for_each_old_connector_in_state - iterate over all connectors in an atomic update |
875 | * @__state: &struct drm_atomic_state pointer |
876 | * @connector: &struct drm_connector iteration cursor |
877 | * @old_connector_state: &struct drm_connector_state iteration cursor for the |
878 | * old state |
879 | * @__i: int iteration cursor, for macro-internal use |
880 | * |
881 | * This iterates over all connectors in an atomic update, tracking only the old |
882 | * state. This is useful in disable functions, where we need the old state the |
883 | * hardware is still in. |
884 | */ |
885 | #define for_each_old_connector_in_state(__state, connector, old_connector_state, __i) \ |
886 | for ((__i) = 0; \ |
887 | (__i) < (__state)->num_connector; \ |
888 | (__i)++) \ |
889 | for_each_if ((__state)->connectors[__i].ptr && \ |
890 | ((connector) = (__state)->connectors[__i].ptr, \ |
891 | (void)(connector) /* Only to avoid unused-but-set-variable warning */, \ |
892 | (old_connector_state) = (__state)->connectors[__i].old_state, 1)) |
893 | |
894 | /** |
895 | * for_each_new_connector_in_state - iterate over all connectors in an atomic update |
896 | * @__state: &struct drm_atomic_state pointer |
897 | * @connector: &struct drm_connector iteration cursor |
898 | * @new_connector_state: &struct drm_connector_state iteration cursor for the |
899 | * new state |
900 | * @__i: int iteration cursor, for macro-internal use |
901 | * |
902 | * This iterates over all connectors in an atomic update, tracking only the new |
903 | * state. This is useful in enable functions, where we need the new state the |
904 | * hardware should be in when the atomic commit operation has completed. |
905 | */ |
906 | #define for_each_new_connector_in_state(__state, connector, new_connector_state, __i) \ |
907 | for ((__i) = 0; \ |
908 | (__i) < (__state)->num_connector; \ |
909 | (__i)++) \ |
910 | for_each_if ((__state)->connectors[__i].ptr && \ |
911 | ((connector) = (__state)->connectors[__i].ptr, \ |
912 | (void)(connector) /* Only to avoid unused-but-set-variable warning */, \ |
913 | (new_connector_state) = (__state)->connectors[__i].new_state, \ |
914 | (void)(new_connector_state) /* Only to avoid unused-but-set-variable warning */, 1)) |
915 | |
916 | /** |
917 | * for_each_oldnew_crtc_in_state - iterate over all CRTCs in an atomic update |
918 | * @__state: &struct drm_atomic_state pointer |
919 | * @crtc: &struct drm_crtc iteration cursor |
920 | * @old_crtc_state: &struct drm_crtc_state iteration cursor for the old state |
921 | * @new_crtc_state: &struct drm_crtc_state iteration cursor for the new state |
922 | * @__i: int iteration cursor, for macro-internal use |
923 | * |
924 | * This iterates over all CRTCs in an atomic update, tracking both old and |
925 | * new state. This is useful in places where the state delta needs to be |
926 | * considered, for example in atomic check functions. |
927 | */ |
928 | #define for_each_oldnew_crtc_in_state(__state, crtc, old_crtc_state, new_crtc_state, __i) \ |
929 | for ((__i) = 0; \ |
930 | (__i) < (__state)->dev->mode_config.num_crtc; \ |
931 | (__i)++) \ |
932 | for_each_if ((__state)->crtcs[__i].ptr && \ |
933 | ((crtc) = (__state)->crtcs[__i].ptr, \ |
934 | (void)(crtc) /* Only to avoid unused-but-set-variable warning */, \ |
935 | (old_crtc_state) = (__state)->crtcs[__i].old_state, \ |
936 | (void)(old_crtc_state) /* Only to avoid unused-but-set-variable warning */, \ |
937 | (new_crtc_state) = (__state)->crtcs[__i].new_state, \ |
938 | (void)(new_crtc_state) /* Only to avoid unused-but-set-variable warning */, 1)) |
939 | |
940 | /** |
941 | * for_each_old_crtc_in_state - iterate over all CRTCs in an atomic update |
942 | * @__state: &struct drm_atomic_state pointer |
943 | * @crtc: &struct drm_crtc iteration cursor |
944 | * @old_crtc_state: &struct drm_crtc_state iteration cursor for the old state |
945 | * @__i: int iteration cursor, for macro-internal use |
946 | * |
947 | * This iterates over all CRTCs in an atomic update, tracking only the old |
948 | * state. This is useful in disable functions, where we need the old state the |
949 | * hardware is still in. |
950 | */ |
951 | #define for_each_old_crtc_in_state(__state, crtc, old_crtc_state, __i) \ |
952 | for ((__i) = 0; \ |
953 | (__i) < (__state)->dev->mode_config.num_crtc; \ |
954 | (__i)++) \ |
955 | for_each_if ((__state)->crtcs[__i].ptr && \ |
956 | ((crtc) = (__state)->crtcs[__i].ptr, \ |
957 | (void)(crtc) /* Only to avoid unused-but-set-variable warning */, \ |
958 | (old_crtc_state) = (__state)->crtcs[__i].old_state, 1)) |
959 | |
960 | /** |
961 | * for_each_new_crtc_in_state - iterate over all CRTCs in an atomic update |
962 | * @__state: &struct drm_atomic_state pointer |
963 | * @crtc: &struct drm_crtc iteration cursor |
964 | * @new_crtc_state: &struct drm_crtc_state iteration cursor for the new state |
965 | * @__i: int iteration cursor, for macro-internal use |
966 | * |
967 | * This iterates over all CRTCs in an atomic update, tracking only the new |
968 | * state. This is useful in enable functions, where we need the new state the |
969 | * hardware should be in when the atomic commit operation has completed. |
970 | */ |
971 | #define for_each_new_crtc_in_state(__state, crtc, new_crtc_state, __i) \ |
972 | for ((__i) = 0; \ |
973 | (__i) < (__state)->dev->mode_config.num_crtc; \ |
974 | (__i)++) \ |
975 | for_each_if ((__state)->crtcs[__i].ptr && \ |
976 | ((crtc) = (__state)->crtcs[__i].ptr, \ |
977 | (void)(crtc) /* Only to avoid unused-but-set-variable warning */, \ |
978 | (new_crtc_state) = (__state)->crtcs[__i].new_state, \ |
979 | (void)(new_crtc_state) /* Only to avoid unused-but-set-variable warning */, 1)) |
980 | |
981 | /** |
982 | * for_each_oldnew_plane_in_state - iterate over all planes in an atomic update |
983 | * @__state: &struct drm_atomic_state pointer |
984 | * @plane: &struct drm_plane iteration cursor |
985 | * @old_plane_state: &struct drm_plane_state iteration cursor for the old state |
986 | * @new_plane_state: &struct drm_plane_state iteration cursor for the new state |
987 | * @__i: int iteration cursor, for macro-internal use |
988 | * |
989 | * This iterates over all planes in an atomic update, tracking both old and |
990 | * new state. This is useful in places where the state delta needs to be |
991 | * considered, for example in atomic check functions. |
992 | */ |
993 | #define for_each_oldnew_plane_in_state(__state, plane, old_plane_state, new_plane_state, __i) \ |
994 | for ((__i) = 0; \ |
995 | (__i) < (__state)->dev->mode_config.num_total_plane; \ |
996 | (__i)++) \ |
997 | for_each_if ((__state)->planes[__i].ptr && \ |
998 | ((plane) = (__state)->planes[__i].ptr, \ |
999 | (void)(plane) /* Only to avoid unused-but-set-variable warning */, \ |
1000 | (old_plane_state) = (__state)->planes[__i].old_state,\ |
1001 | (new_plane_state) = (__state)->planes[__i].new_state, 1)) |
1002 | |
1003 | /** |
1004 | * for_each_oldnew_plane_in_state_reverse - iterate over all planes in an atomic |
1005 | * update in reverse order |
1006 | * @__state: &struct drm_atomic_state pointer |
1007 | * @plane: &struct drm_plane iteration cursor |
1008 | * @old_plane_state: &struct drm_plane_state iteration cursor for the old state |
1009 | * @new_plane_state: &struct drm_plane_state iteration cursor for the new state |
1010 | * @__i: int iteration cursor, for macro-internal use |
1011 | * |
1012 | * This iterates over all planes in an atomic update in reverse order, |
1013 | * tracking both old and new state. This is useful in places where the |
1014 | * state delta needs to be considered, for example in atomic check functions. |
1015 | */ |
1016 | #define for_each_oldnew_plane_in_state_reverse(__state, plane, old_plane_state, new_plane_state, __i) \ |
1017 | for ((__i) = ((__state)->dev->mode_config.num_total_plane - 1); \ |
1018 | (__i) >= 0; \ |
1019 | (__i)--) \ |
1020 | for_each_if ((__state)->planes[__i].ptr && \ |
1021 | ((plane) = (__state)->planes[__i].ptr, \ |
1022 | (old_plane_state) = (__state)->planes[__i].old_state,\ |
1023 | (new_plane_state) = (__state)->planes[__i].new_state, 1)) |
1024 | |
1025 | /** |
1026 | * for_each_new_plane_in_state_reverse - other than only tracking new state, |
1027 | * it's the same as for_each_oldnew_plane_in_state_reverse |
1028 | * @__state: &struct drm_atomic_state pointer |
1029 | * @plane: &struct drm_plane iteration cursor |
1030 | * @new_plane_state: &struct drm_plane_state iteration cursor for the new state |
1031 | * @__i: int iteration cursor, for macro-internal use |
1032 | */ |
1033 | #define for_each_new_plane_in_state_reverse(__state, plane, new_plane_state, __i) \ |
1034 | for ((__i) = ((__state)->dev->mode_config.num_total_plane - 1); \ |
1035 | (__i) >= 0; \ |
1036 | (__i)--) \ |
1037 | for_each_if ((__state)->planes[__i].ptr && \ |
1038 | ((plane) = (__state)->planes[__i].ptr, \ |
1039 | (new_plane_state) = (__state)->planes[__i].new_state, 1)) |
1040 | |
1041 | /** |
1042 | * for_each_old_plane_in_state - iterate over all planes in an atomic update |
1043 | * @__state: &struct drm_atomic_state pointer |
1044 | * @plane: &struct drm_plane iteration cursor |
1045 | * @old_plane_state: &struct drm_plane_state iteration cursor for the old state |
1046 | * @__i: int iteration cursor, for macro-internal use |
1047 | * |
1048 | * This iterates over all planes in an atomic update, tracking only the old |
1049 | * state. This is useful in disable functions, where we need the old state the |
1050 | * hardware is still in. |
1051 | */ |
1052 | #define for_each_old_plane_in_state(__state, plane, old_plane_state, __i) \ |
1053 | for ((__i) = 0; \ |
1054 | (__i) < (__state)->dev->mode_config.num_total_plane; \ |
1055 | (__i)++) \ |
1056 | for_each_if ((__state)->planes[__i].ptr && \ |
1057 | ((plane) = (__state)->planes[__i].ptr, \ |
1058 | (old_plane_state) = (__state)->planes[__i].old_state, 1)) |
1059 | /** |
1060 | * for_each_new_plane_in_state - iterate over all planes in an atomic update |
1061 | * @__state: &struct drm_atomic_state pointer |
1062 | * @plane: &struct drm_plane iteration cursor |
1063 | * @new_plane_state: &struct drm_plane_state iteration cursor for the new state |
1064 | * @__i: int iteration cursor, for macro-internal use |
1065 | * |
1066 | * This iterates over all planes in an atomic update, tracking only the new |
1067 | * state. This is useful in enable functions, where we need the new state the |
1068 | * hardware should be in when the atomic commit operation has completed. |
1069 | */ |
1070 | #define for_each_new_plane_in_state(__state, plane, new_plane_state, __i) \ |
1071 | for ((__i) = 0; \ |
1072 | (__i) < (__state)->dev->mode_config.num_total_plane; \ |
1073 | (__i)++) \ |
1074 | for_each_if ((__state)->planes[__i].ptr && \ |
1075 | ((plane) = (__state)->planes[__i].ptr, \ |
1076 | (void)(plane) /* Only to avoid unused-but-set-variable warning */, \ |
1077 | (new_plane_state) = (__state)->planes[__i].new_state, \ |
1078 | (void)(new_plane_state) /* Only to avoid unused-but-set-variable warning */, 1)) |
1079 | |
1080 | /** |
1081 | * for_each_oldnew_private_obj_in_state - iterate over all private objects in an atomic update |
1082 | * @__state: &struct drm_atomic_state pointer |
1083 | * @obj: &struct drm_private_obj iteration cursor |
1084 | * @old_obj_state: &struct drm_private_state iteration cursor for the old state |
1085 | * @new_obj_state: &struct drm_private_state iteration cursor for the new state |
1086 | * @__i: int iteration cursor, for macro-internal use |
1087 | * |
1088 | * This iterates over all private objects in an atomic update, tracking both |
1089 | * old and new state. This is useful in places where the state delta needs |
1090 | * to be considered, for example in atomic check functions. |
1091 | */ |
1092 | #define for_each_oldnew_private_obj_in_state(__state, obj, old_obj_state, new_obj_state, __i) \ |
1093 | for ((__i) = 0; \ |
1094 | (__i) < (__state)->num_private_objs && \ |
1095 | ((obj) = (__state)->private_objs[__i].ptr, \ |
1096 | (old_obj_state) = (__state)->private_objs[__i].old_state, \ |
1097 | (new_obj_state) = (__state)->private_objs[__i].new_state, 1); \ |
1098 | (__i)++) |
1099 | |
1100 | /** |
1101 | * for_each_old_private_obj_in_state - iterate over all private objects in an atomic update |
1102 | * @__state: &struct drm_atomic_state pointer |
1103 | * @obj: &struct drm_private_obj iteration cursor |
1104 | * @old_obj_state: &struct drm_private_state iteration cursor for the old state |
1105 | * @__i: int iteration cursor, for macro-internal use |
1106 | * |
1107 | * This iterates over all private objects in an atomic update, tracking only |
1108 | * the old state. This is useful in disable functions, where we need the old |
1109 | * state the hardware is still in. |
1110 | */ |
1111 | #define for_each_old_private_obj_in_state(__state, obj, old_obj_state, __i) \ |
1112 | for ((__i) = 0; \ |
1113 | (__i) < (__state)->num_private_objs && \ |
1114 | ((obj) = (__state)->private_objs[__i].ptr, \ |
1115 | (old_obj_state) = (__state)->private_objs[__i].old_state, 1); \ |
1116 | (__i)++) |
1117 | |
1118 | /** |
1119 | * for_each_new_private_obj_in_state - iterate over all private objects in an atomic update |
1120 | * @__state: &struct drm_atomic_state pointer |
1121 | * @obj: &struct drm_private_obj iteration cursor |
1122 | * @new_obj_state: &struct drm_private_state iteration cursor for the new state |
1123 | * @__i: int iteration cursor, for macro-internal use |
1124 | * |
1125 | * This iterates over all private objects in an atomic update, tracking only |
1126 | * the new state. This is useful in enable functions, where we need the new state the |
1127 | * hardware should be in when the atomic commit operation has completed. |
1128 | */ |
1129 | #define for_each_new_private_obj_in_state(__state, obj, new_obj_state, __i) \ |
1130 | for ((__i) = 0; \ |
1131 | (__i) < (__state)->num_private_objs && \ |
1132 | ((obj) = (__state)->private_objs[__i].ptr, \ |
1133 | (void)(obj) /* Only to avoid unused-but-set-variable warning */, \ |
1134 | (new_obj_state) = (__state)->private_objs[__i].new_state, 1); \ |
1135 | (__i)++) |
1136 | |
1137 | /** |
1138 | * drm_atomic_crtc_needs_modeset - compute combined modeset need |
1139 | * @state: &drm_crtc_state for the CRTC |
1140 | * |
1141 | * To give drivers flexibility &struct drm_crtc_state has 3 booleans to track |
1142 | * whether the state CRTC changed enough to need a full modeset cycle: |
1143 | * mode_changed, active_changed and connectors_changed. This helper simply |
1144 | * combines these three to compute the overall need for a modeset for @state. |
1145 | * |
1146 | * The atomic helper code sets these booleans, but drivers can and should |
1147 | * change them appropriately to accurately represent whether a modeset is |
1148 | * really needed. In general, drivers should avoid full modesets whenever |
1149 | * possible. |
1150 | * |
1151 | * For example if the CRTC mode has changed, and the hardware is able to enact |
1152 | * the requested mode change without going through a full modeset, the driver |
1153 | * should clear mode_changed in its &drm_mode_config_funcs.atomic_check |
1154 | * implementation. |
1155 | */ |
1156 | static inline bool |
1157 | drm_atomic_crtc_needs_modeset(const struct drm_crtc_state *state) |
1158 | { |
1159 | return state->mode_changed || state->active_changed || |
1160 | state->connectors_changed; |
1161 | } |
1162 | |
1163 | /** |
1164 | * drm_atomic_crtc_effectively_active - compute whether CRTC is actually active |
1165 | * @state: &drm_crtc_state for the CRTC |
1166 | * |
1167 | * When in self refresh mode, the crtc_state->active value will be false, since |
1168 | * the CRTC is off. However in some cases we're interested in whether the CRTC |
1169 | * is active, or effectively active (ie: it's connected to an active display). |
1170 | * In these cases, use this function instead of just checking active. |
1171 | */ |
1172 | static inline bool |
1173 | drm_atomic_crtc_effectively_active(const struct drm_crtc_state *state) |
1174 | { |
1175 | return state->active || state->self_refresh_active; |
1176 | } |
1177 | |
1178 | /** |
1179 | * struct drm_bus_cfg - bus configuration |
1180 | * |
1181 | * This structure stores the configuration of a physical bus between two |
1182 | * components in an output pipeline, usually between two bridges, an encoder |
1183 | * and a bridge, or a bridge and a connector. |
1184 | * |
1185 | * The bus configuration is stored in &drm_bridge_state separately for the |
1186 | * input and output buses, as seen from the point of view of each bridge. The |
1187 | * bus configuration of a bridge output is usually identical to the |
1188 | * configuration of the next bridge's input, but may differ if the signals are |
1189 | * modified between the two bridges, for instance by an inverter on the board. |
1190 | * The input and output configurations of a bridge may differ if the bridge |
1191 | * modifies the signals internally, for instance by performing format |
1192 | * conversion, or modifying signals polarities. |
1193 | */ |
1194 | struct drm_bus_cfg { |
1195 | /** |
1196 | * @format: format used on this bus (one of the MEDIA_BUS_FMT_* format) |
1197 | * |
1198 | * This field should not be directly modified by drivers |
1199 | * (drm_atomic_bridge_chain_select_bus_fmts() takes care of the bus |
1200 | * format negotiation). |
1201 | */ |
1202 | u32 format; |
1203 | |
1204 | /** |
1205 | * @flags: DRM_BUS_* flags used on this bus |
1206 | */ |
1207 | u32 flags; |
1208 | }; |
1209 | |
1210 | /** |
1211 | * struct drm_bridge_state - Atomic bridge state object |
1212 | */ |
1213 | struct drm_bridge_state { |
1214 | /** |
1215 | * @base: inherit from &drm_private_state |
1216 | */ |
1217 | struct drm_private_state base; |
1218 | |
1219 | /** |
1220 | * @bridge: the bridge this state refers to |
1221 | */ |
1222 | struct drm_bridge *bridge; |
1223 | |
1224 | /** |
1225 | * @input_bus_cfg: input bus configuration |
1226 | */ |
1227 | struct drm_bus_cfg input_bus_cfg; |
1228 | |
1229 | /** |
1230 | * @output_bus_cfg: output bus configuration |
1231 | */ |
1232 | struct drm_bus_cfg output_bus_cfg; |
1233 | }; |
1234 | |
1235 | static inline struct drm_bridge_state * |
1236 | drm_priv_to_bridge_state(struct drm_private_state *priv) |
1237 | { |
1238 | return container_of(priv, struct drm_bridge_state, base); |
1239 | } |
1240 | |
1241 | struct drm_bridge_state * |
1242 | drm_atomic_get_bridge_state(struct drm_atomic_state *state, |
1243 | struct drm_bridge *bridge); |
1244 | struct drm_bridge_state * |
1245 | drm_atomic_get_old_bridge_state(const struct drm_atomic_state *state, |
1246 | struct drm_bridge *bridge); |
1247 | struct drm_bridge_state * |
1248 | drm_atomic_get_new_bridge_state(const struct drm_atomic_state *state, |
1249 | struct drm_bridge *bridge); |
1250 | |
1251 | #endif /* DRM_ATOMIC_H_ */ |
1252 |
Definitions
- drm_crtc_commit
- __drm_planes_state
- __drm_crtcs_state
- __drm_connnectors_state
- drm_private_state_funcs
- drm_private_obj
- drm_private_state
- __drm_private_objs_state
- drm_atomic_state
- drm_crtc_commit_get
- drm_crtc_commit_put
- drm_atomic_state_get
- drm_atomic_state_put
- drm_atomic_get_existing_crtc_state
- drm_atomic_get_old_crtc_state
- drm_atomic_get_new_crtc_state
- drm_atomic_get_existing_plane_state
- drm_atomic_get_old_plane_state
- drm_atomic_get_new_plane_state
- drm_atomic_get_existing_connector_state
- drm_atomic_get_old_connector_state
- drm_atomic_get_new_connector_state
- __drm_atomic_get_current_plane_state
- drm_atomic_crtc_needs_modeset
- drm_atomic_crtc_effectively_active
- drm_bus_cfg
- drm_bridge_state
Improve your Profiling and Debugging skills
Find out more