2 * Copyright (C) 2014 Red Hat
3 * Copyright (C) 2014 Intel Corp.
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:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
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.
24 * Rob Clark <robdclark@gmail.com>
25 * Daniel Vetter <daniel.vetter@ffwll.ch>
29 #include <linux/sync_file.h>
31 #include <drm/drm_atomic.h>
32 #include <drm/drm_atomic_uapi.h>
33 #include <drm/drm_debugfs.h>
34 #include <drm/drm_device.h>
35 #include <drm/drm_drv.h>
36 #include <drm/drm_file.h>
37 #include <drm/drm_fourcc.h>
38 #include <drm/drm_mode.h>
39 #include <drm/drm_print.h>
40 #include <drm/drm_writeback.h>
42 #include "drm_crtc_internal.h"
43 #include "drm_internal.h"
45 void __drm_crtc_commit_free(struct kref
*kref
)
47 struct drm_crtc_commit
*commit
=
48 container_of(kref
, struct drm_crtc_commit
, ref
);
52 EXPORT_SYMBOL(__drm_crtc_commit_free
);
55 * drm_atomic_state_default_release -
56 * release memory initialized by drm_atomic_state_init
57 * @state: atomic state
59 * Free all the memory allocated by drm_atomic_state_init.
60 * This should only be used by drivers which are still subclassing
61 * &drm_atomic_state and haven't switched to &drm_private_state yet.
63 void drm_atomic_state_default_release(struct drm_atomic_state
*state
)
65 kfree(state
->connectors
);
68 kfree(state
->private_objs
);
70 EXPORT_SYMBOL(drm_atomic_state_default_release
);
73 * drm_atomic_state_init - init new atomic state
75 * @state: atomic state
77 * Default implementation for filling in a new atomic state.
78 * This should only be used by drivers which are still subclassing
79 * &drm_atomic_state and haven't switched to &drm_private_state yet.
82 drm_atomic_state_init(struct drm_device
*dev
, struct drm_atomic_state
*state
)
84 kref_init(&state
->ref
);
86 /* TODO legacy paths should maybe do a better job about
87 * setting this appropriately?
89 state
->allow_modeset
= true;
91 state
->crtcs
= kcalloc(dev
->mode_config
.num_crtc
,
92 sizeof(*state
->crtcs
), GFP_KERNEL
);
95 state
->planes
= kcalloc(dev
->mode_config
.num_total_plane
,
96 sizeof(*state
->planes
), GFP_KERNEL
);
102 DRM_DEBUG_ATOMIC("Allocated atomic state %p\n", state
);
106 drm_atomic_state_default_release(state
);
109 EXPORT_SYMBOL(drm_atomic_state_init
);
112 * drm_atomic_state_alloc - allocate atomic state
115 * This allocates an empty atomic state to track updates.
117 struct drm_atomic_state
*
118 drm_atomic_state_alloc(struct drm_device
*dev
)
120 struct drm_mode_config
*config
= &dev
->mode_config
;
122 if (!config
->funcs
->atomic_state_alloc
) {
123 struct drm_atomic_state
*state
;
125 state
= kzalloc(sizeof(*state
), GFP_KERNEL
);
128 if (drm_atomic_state_init(dev
, state
) < 0) {
135 return config
->funcs
->atomic_state_alloc(dev
);
137 EXPORT_SYMBOL(drm_atomic_state_alloc
);
140 * drm_atomic_state_default_clear - clear base atomic state
141 * @state: atomic state
143 * Default implementation for clearing atomic state.
144 * This should only be used by drivers which are still subclassing
145 * &drm_atomic_state and haven't switched to &drm_private_state yet.
147 void drm_atomic_state_default_clear(struct drm_atomic_state
*state
)
149 struct drm_device
*dev
= state
->dev
;
150 struct drm_mode_config
*config
= &dev
->mode_config
;
153 DRM_DEBUG_ATOMIC("Clearing atomic state %p\n", state
);
155 for (i
= 0; i
< state
->num_connector
; i
++) {
156 struct drm_connector
*connector
= state
->connectors
[i
].ptr
;
161 connector
->funcs
->atomic_destroy_state(connector
,
162 state
->connectors
[i
].state
);
163 state
->connectors
[i
].ptr
= NULL
;
164 state
->connectors
[i
].state
= NULL
;
165 state
->connectors
[i
].old_state
= NULL
;
166 state
->connectors
[i
].new_state
= NULL
;
167 drm_connector_put(connector
);
170 for (i
= 0; i
< config
->num_crtc
; i
++) {
171 struct drm_crtc
*crtc
= state
->crtcs
[i
].ptr
;
176 crtc
->funcs
->atomic_destroy_state(crtc
,
177 state
->crtcs
[i
].state
);
179 state
->crtcs
[i
].ptr
= NULL
;
180 state
->crtcs
[i
].state
= NULL
;
181 state
->crtcs
[i
].old_state
= NULL
;
182 state
->crtcs
[i
].new_state
= NULL
;
184 if (state
->crtcs
[i
].commit
) {
185 drm_crtc_commit_put(state
->crtcs
[i
].commit
);
186 state
->crtcs
[i
].commit
= NULL
;
190 for (i
= 0; i
< config
->num_total_plane
; i
++) {
191 struct drm_plane
*plane
= state
->planes
[i
].ptr
;
196 plane
->funcs
->atomic_destroy_state(plane
,
197 state
->planes
[i
].state
);
198 state
->planes
[i
].ptr
= NULL
;
199 state
->planes
[i
].state
= NULL
;
200 state
->planes
[i
].old_state
= NULL
;
201 state
->planes
[i
].new_state
= NULL
;
204 for (i
= 0; i
< state
->num_private_objs
; i
++) {
205 struct drm_private_obj
*obj
= state
->private_objs
[i
].ptr
;
207 obj
->funcs
->atomic_destroy_state(obj
,
208 state
->private_objs
[i
].state
);
209 state
->private_objs
[i
].ptr
= NULL
;
210 state
->private_objs
[i
].state
= NULL
;
211 state
->private_objs
[i
].old_state
= NULL
;
212 state
->private_objs
[i
].new_state
= NULL
;
214 state
->num_private_objs
= 0;
216 if (state
->fake_commit
) {
217 drm_crtc_commit_put(state
->fake_commit
);
218 state
->fake_commit
= NULL
;
221 EXPORT_SYMBOL(drm_atomic_state_default_clear
);
224 * drm_atomic_state_clear - clear state object
225 * @state: atomic state
227 * When the w/w mutex algorithm detects a deadlock we need to back off and drop
228 * all locks. So someone else could sneak in and change the current modeset
229 * configuration. Which means that all the state assembled in @state is no
230 * longer an atomic update to the current state, but to some arbitrary earlier
231 * state. Which could break assumptions the driver's
232 * &drm_mode_config_funcs.atomic_check likely relies on.
234 * Hence we must clear all cached state and completely start over, using this
237 void drm_atomic_state_clear(struct drm_atomic_state
*state
)
239 struct drm_device
*dev
= state
->dev
;
240 struct drm_mode_config
*config
= &dev
->mode_config
;
242 if (config
->funcs
->atomic_state_clear
)
243 config
->funcs
->atomic_state_clear(state
);
245 drm_atomic_state_default_clear(state
);
247 EXPORT_SYMBOL(drm_atomic_state_clear
);
250 * __drm_atomic_state_free - free all memory for an atomic state
251 * @ref: This atomic state to deallocate
253 * This frees all memory associated with an atomic state, including all the
254 * per-object state for planes, CRTCs and connectors.
256 void __drm_atomic_state_free(struct kref
*ref
)
258 struct drm_atomic_state
*state
= container_of(ref
, typeof(*state
), ref
);
259 struct drm_mode_config
*config
= &state
->dev
->mode_config
;
261 drm_atomic_state_clear(state
);
263 DRM_DEBUG_ATOMIC("Freeing atomic state %p\n", state
);
265 if (config
->funcs
->atomic_state_free
) {
266 config
->funcs
->atomic_state_free(state
);
268 drm_atomic_state_default_release(state
);
272 EXPORT_SYMBOL(__drm_atomic_state_free
);
275 * drm_atomic_get_crtc_state - get CRTC state
276 * @state: global atomic state object
277 * @crtc: CRTC to get state object for
279 * This function returns the CRTC state for the given CRTC, allocating it if
280 * needed. It will also grab the relevant CRTC lock to make sure that the state
285 * Either the allocated state or the error code encoded into the pointer. When
286 * the error is EDEADLK then the w/w mutex code has detected a deadlock and the
287 * entire atomic sequence must be restarted. All other errors are fatal.
289 struct drm_crtc_state
*
290 drm_atomic_get_crtc_state(struct drm_atomic_state
*state
,
291 struct drm_crtc
*crtc
)
293 int ret
, index
= drm_crtc_index(crtc
);
294 struct drm_crtc_state
*crtc_state
;
296 WARN_ON(!state
->acquire_ctx
);
298 crtc_state
= drm_atomic_get_existing_crtc_state(state
, crtc
);
302 ret
= drm_modeset_lock(&crtc
->mutex
, state
->acquire_ctx
);
306 crtc_state
= crtc
->funcs
->atomic_duplicate_state(crtc
);
308 return ERR_PTR(-ENOMEM
);
310 state
->crtcs
[index
].state
= crtc_state
;
311 state
->crtcs
[index
].old_state
= crtc
->state
;
312 state
->crtcs
[index
].new_state
= crtc_state
;
313 state
->crtcs
[index
].ptr
= crtc
;
314 crtc_state
->state
= state
;
316 DRM_DEBUG_ATOMIC("Added [CRTC:%d:%s] %p state to %p\n",
317 crtc
->base
.id
, crtc
->name
, crtc_state
, state
);
321 EXPORT_SYMBOL(drm_atomic_get_crtc_state
);
323 static int drm_atomic_crtc_check(const struct drm_crtc_state
*old_crtc_state
,
324 const struct drm_crtc_state
*new_crtc_state
)
326 struct drm_crtc
*crtc
= new_crtc_state
->crtc
;
328 /* NOTE: we explicitly don't enforce constraints such as primary
329 * layer covering entire screen, since that is something we want
330 * to allow (on hw that supports it). For hw that does not, it
331 * should be checked in driver's crtc->atomic_check() vfunc.
333 * TODO: Add generic modeset state checks once we support those.
336 if (new_crtc_state
->active
&& !new_crtc_state
->enable
) {
337 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] active without enabled\n",
338 crtc
->base
.id
, crtc
->name
);
342 /* The state->enable vs. state->mode_blob checks can be WARN_ON,
343 * as this is a kernel-internal detail that userspace should never
344 * be able to trigger. */
345 if (drm_core_check_feature(crtc
->dev
, DRIVER_ATOMIC
) &&
346 WARN_ON(new_crtc_state
->enable
&& !new_crtc_state
->mode_blob
)) {
347 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enabled without mode blob\n",
348 crtc
->base
.id
, crtc
->name
);
352 if (drm_core_check_feature(crtc
->dev
, DRIVER_ATOMIC
) &&
353 WARN_ON(!new_crtc_state
->enable
&& new_crtc_state
->mode_blob
)) {
354 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] disabled with mode blob\n",
355 crtc
->base
.id
, crtc
->name
);
360 * Reject event generation for when a CRTC is off and stays off.
361 * It wouldn't be hard to implement this, but userspace has a track
362 * record of happily burning through 100% cpu (or worse, crash) when the
363 * display pipe is suspended. To avoid all that fun just reject updates
364 * that ask for events since likely that indicates a bug in the
365 * compositor's drawing loop. This is consistent with the vblank IOCTL
366 * and legacy page_flip IOCTL which also reject service on a disabled
369 if (new_crtc_state
->event
&&
370 !new_crtc_state
->active
&& !old_crtc_state
->active
) {
371 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] requesting event but off\n",
372 crtc
->base
.id
, crtc
->name
);
379 static void drm_atomic_crtc_print_state(struct drm_printer
*p
,
380 const struct drm_crtc_state
*state
)
382 struct drm_crtc
*crtc
= state
->crtc
;
384 drm_printf(p
, "crtc[%u]: %s\n", crtc
->base
.id
, crtc
->name
);
385 drm_printf(p
, "\tenable=%d\n", state
->enable
);
386 drm_printf(p
, "\tactive=%d\n", state
->active
);
387 drm_printf(p
, "\tself_refresh_active=%d\n", state
->self_refresh_active
);
388 drm_printf(p
, "\tplanes_changed=%d\n", state
->planes_changed
);
389 drm_printf(p
, "\tmode_changed=%d\n", state
->mode_changed
);
390 drm_printf(p
, "\tactive_changed=%d\n", state
->active_changed
);
391 drm_printf(p
, "\tconnectors_changed=%d\n", state
->connectors_changed
);
392 drm_printf(p
, "\tcolor_mgmt_changed=%d\n", state
->color_mgmt_changed
);
393 drm_printf(p
, "\tplane_mask=%x\n", state
->plane_mask
);
394 drm_printf(p
, "\tconnector_mask=%x\n", state
->connector_mask
);
395 drm_printf(p
, "\tencoder_mask=%x\n", state
->encoder_mask
);
396 drm_printf(p
, "\tmode: " DRM_MODE_FMT
"\n", DRM_MODE_ARG(&state
->mode
));
398 if (crtc
->funcs
->atomic_print_state
)
399 crtc
->funcs
->atomic_print_state(p
, state
);
402 static int drm_atomic_connector_check(struct drm_connector
*connector
,
403 struct drm_connector_state
*state
)
405 struct drm_crtc_state
*crtc_state
;
406 struct drm_writeback_job
*writeback_job
= state
->writeback_job
;
407 const struct drm_display_info
*info
= &connector
->display_info
;
409 state
->max_bpc
= info
->bpc
? info
->bpc
: 8;
410 if (connector
->max_bpc_property
)
411 state
->max_bpc
= min(state
->max_bpc
, state
->max_requested_bpc
);
413 if ((connector
->connector_type
!= DRM_MODE_CONNECTOR_WRITEBACK
) || !writeback_job
)
416 if (writeback_job
->fb
&& !state
->crtc
) {
417 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] framebuffer without CRTC\n",
418 connector
->base
.id
, connector
->name
);
423 crtc_state
= drm_atomic_get_existing_crtc_state(state
->state
,
426 if (writeback_job
->fb
&& !crtc_state
->active
) {
427 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] has framebuffer, but [CRTC:%d] is off\n",
428 connector
->base
.id
, connector
->name
,
429 state
->crtc
->base
.id
);
433 if (!writeback_job
->fb
) {
434 if (writeback_job
->out_fence
) {
435 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] requesting out-fence without framebuffer\n",
436 connector
->base
.id
, connector
->name
);
440 drm_writeback_cleanup_job(writeback_job
);
441 state
->writeback_job
= NULL
;
448 * drm_atomic_get_plane_state - get plane state
449 * @state: global atomic state object
450 * @plane: plane to get state object for
452 * This function returns the plane state for the given plane, allocating it if
453 * needed. It will also grab the relevant plane lock to make sure that the state
458 * Either the allocated state or the error code encoded into the pointer. When
459 * the error is EDEADLK then the w/w mutex code has detected a deadlock and the
460 * entire atomic sequence must be restarted. All other errors are fatal.
462 struct drm_plane_state
*
463 drm_atomic_get_plane_state(struct drm_atomic_state
*state
,
464 struct drm_plane
*plane
)
466 int ret
, index
= drm_plane_index(plane
);
467 struct drm_plane_state
*plane_state
;
469 WARN_ON(!state
->acquire_ctx
);
471 /* the legacy pointers should never be set */
473 WARN_ON(plane
->old_fb
);
474 WARN_ON(plane
->crtc
);
476 plane_state
= drm_atomic_get_existing_plane_state(state
, plane
);
480 ret
= drm_modeset_lock(&plane
->mutex
, state
->acquire_ctx
);
484 plane_state
= plane
->funcs
->atomic_duplicate_state(plane
);
486 return ERR_PTR(-ENOMEM
);
488 state
->planes
[index
].state
= plane_state
;
489 state
->planes
[index
].ptr
= plane
;
490 state
->planes
[index
].old_state
= plane
->state
;
491 state
->planes
[index
].new_state
= plane_state
;
492 plane_state
->state
= state
;
494 DRM_DEBUG_ATOMIC("Added [PLANE:%d:%s] %p state to %p\n",
495 plane
->base
.id
, plane
->name
, plane_state
, state
);
497 if (plane_state
->crtc
) {
498 struct drm_crtc_state
*crtc_state
;
500 crtc_state
= drm_atomic_get_crtc_state(state
,
502 if (IS_ERR(crtc_state
))
503 return ERR_CAST(crtc_state
);
508 EXPORT_SYMBOL(drm_atomic_get_plane_state
);
511 plane_switching_crtc(const struct drm_plane_state
*old_plane_state
,
512 const struct drm_plane_state
*new_plane_state
)
514 if (!old_plane_state
->crtc
|| !new_plane_state
->crtc
)
517 if (old_plane_state
->crtc
== new_plane_state
->crtc
)
520 /* This could be refined, but currently there's no helper or driver code
521 * to implement direct switching of active planes nor userspace to take
522 * advantage of more direct plane switching without the intermediate
529 * drm_atomic_plane_check - check plane state
530 * @old_plane_state: old plane state to check
531 * @new_plane_state: new plane state to check
533 * Provides core sanity checks for plane state.
536 * Zero on success, error code on failure
538 static int drm_atomic_plane_check(const struct drm_plane_state
*old_plane_state
,
539 const struct drm_plane_state
*new_plane_state
)
541 struct drm_plane
*plane
= new_plane_state
->plane
;
542 struct drm_crtc
*crtc
= new_plane_state
->crtc
;
543 const struct drm_framebuffer
*fb
= new_plane_state
->fb
;
544 unsigned int fb_width
, fb_height
;
545 struct drm_mode_rect
*clips
;
549 /* either *both* CRTC and FB must be set, or neither */
551 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] CRTC set but no FB\n",
552 plane
->base
.id
, plane
->name
);
554 } else if (fb
&& !crtc
) {
555 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] FB set but no CRTC\n",
556 plane
->base
.id
, plane
->name
);
560 /* if disabled, we don't care about the rest of the state: */
564 /* Check whether this plane is usable on this CRTC */
565 if (!(plane
->possible_crtcs
& drm_crtc_mask(crtc
))) {
566 DRM_DEBUG_ATOMIC("Invalid [CRTC:%d:%s] for [PLANE:%d:%s]\n",
567 crtc
->base
.id
, crtc
->name
,
568 plane
->base
.id
, plane
->name
);
572 /* Check whether this plane supports the fb pixel format. */
573 ret
= drm_plane_check_pixel_format(plane
, fb
->format
->format
,
576 struct drm_format_name_buf format_name
;
577 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] invalid pixel format %s, modifier 0x%llx\n",
578 plane
->base
.id
, plane
->name
,
579 drm_get_format_name(fb
->format
->format
,
585 /* Give drivers some help against integer overflows */
586 if (new_plane_state
->crtc_w
> INT_MAX
||
587 new_plane_state
->crtc_x
> INT_MAX
- (int32_t) new_plane_state
->crtc_w
||
588 new_plane_state
->crtc_h
> INT_MAX
||
589 new_plane_state
->crtc_y
> INT_MAX
- (int32_t) new_plane_state
->crtc_h
) {
590 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] invalid CRTC coordinates %ux%u+%d+%d\n",
591 plane
->base
.id
, plane
->name
,
592 new_plane_state
->crtc_w
, new_plane_state
->crtc_h
,
593 new_plane_state
->crtc_x
, new_plane_state
->crtc_y
);
597 fb_width
= fb
->width
<< 16;
598 fb_height
= fb
->height
<< 16;
600 /* Make sure source coordinates are inside the fb. */
601 if (new_plane_state
->src_w
> fb_width
||
602 new_plane_state
->src_x
> fb_width
- new_plane_state
->src_w
||
603 new_plane_state
->src_h
> fb_height
||
604 new_plane_state
->src_y
> fb_height
- new_plane_state
->src_h
) {
605 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] invalid source coordinates "
606 "%u.%06ux%u.%06u+%u.%06u+%u.%06u (fb %ux%u)\n",
607 plane
->base
.id
, plane
->name
,
608 new_plane_state
->src_w
>> 16,
609 ((new_plane_state
->src_w
& 0xffff) * 15625) >> 10,
610 new_plane_state
->src_h
>> 16,
611 ((new_plane_state
->src_h
& 0xffff) * 15625) >> 10,
612 new_plane_state
->src_x
>> 16,
613 ((new_plane_state
->src_x
& 0xffff) * 15625) >> 10,
614 new_plane_state
->src_y
>> 16,
615 ((new_plane_state
->src_y
& 0xffff) * 15625) >> 10,
616 fb
->width
, fb
->height
);
620 clips
= drm_plane_get_damage_clips(new_plane_state
);
621 num_clips
= drm_plane_get_damage_clips_count(new_plane_state
);
623 /* Make sure damage clips are valid and inside the fb. */
624 while (num_clips
> 0) {
625 if (clips
->x1
>= clips
->x2
||
626 clips
->y1
>= clips
->y2
||
629 clips
->x2
> fb_width
||
630 clips
->y2
> fb_height
) {
631 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] invalid damage clip %d %d %d %d\n",
632 plane
->base
.id
, plane
->name
, clips
->x1
,
633 clips
->y1
, clips
->x2
, clips
->y2
);
640 if (plane_switching_crtc(old_plane_state
, new_plane_state
)) {
641 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] switching CRTC directly\n",
642 plane
->base
.id
, plane
->name
);
649 static void drm_atomic_plane_print_state(struct drm_printer
*p
,
650 const struct drm_plane_state
*state
)
652 struct drm_plane
*plane
= state
->plane
;
653 struct drm_rect src
= drm_plane_state_src(state
);
654 struct drm_rect dest
= drm_plane_state_dest(state
);
656 drm_printf(p
, "plane[%u]: %s\n", plane
->base
.id
, plane
->name
);
657 drm_printf(p
, "\tcrtc=%s\n", state
->crtc
? state
->crtc
->name
: "(null)");
658 drm_printf(p
, "\tfb=%u\n", state
->fb
? state
->fb
->base
.id
: 0);
660 drm_framebuffer_print_info(p
, 2, state
->fb
);
661 drm_printf(p
, "\tcrtc-pos=" DRM_RECT_FMT
"\n", DRM_RECT_ARG(&dest
));
662 drm_printf(p
, "\tsrc-pos=" DRM_RECT_FP_FMT
"\n", DRM_RECT_FP_ARG(&src
));
663 drm_printf(p
, "\trotation=%x\n", state
->rotation
);
664 drm_printf(p
, "\tnormalized-zpos=%x\n", state
->normalized_zpos
);
665 drm_printf(p
, "\tcolor-encoding=%s\n",
666 drm_get_color_encoding_name(state
->color_encoding
));
667 drm_printf(p
, "\tcolor-range=%s\n",
668 drm_get_color_range_name(state
->color_range
));
670 if (plane
->funcs
->atomic_print_state
)
671 plane
->funcs
->atomic_print_state(p
, state
);
675 * DOC: handling driver private state
677 * Very often the DRM objects exposed to userspace in the atomic modeset api
678 * (&drm_connector, &drm_crtc and &drm_plane) do not map neatly to the
679 * underlying hardware. Especially for any kind of shared resources (e.g. shared
680 * clocks, scaler units, bandwidth and fifo limits shared among a group of
681 * planes or CRTCs, and so on) it makes sense to model these as independent
682 * objects. Drivers then need to do similar state tracking and commit ordering for
683 * such private (since not exposed to userpace) objects as the atomic core and
684 * helpers already provide for connectors, planes and CRTCs.
686 * To make this easier on drivers the atomic core provides some support to track
687 * driver private state objects using struct &drm_private_obj, with the
688 * associated state struct &drm_private_state.
690 * Similar to userspace-exposed objects, private state structures can be
691 * acquired by calling drm_atomic_get_private_obj_state(). This also takes care
692 * of locking, hence drivers should not have a need to call drm_modeset_lock()
693 * directly. Sequence of the actual hardware state commit is not handled,
694 * drivers might need to keep track of struct drm_crtc_commit within subclassed
695 * structure of &drm_private_state as necessary, e.g. similar to
696 * &drm_plane_state.commit. See also &drm_atomic_state.fake_commit.
698 * All private state structures contained in a &drm_atomic_state update can be
699 * iterated using for_each_oldnew_private_obj_in_state(),
700 * for_each_new_private_obj_in_state() and for_each_old_private_obj_in_state().
701 * Drivers are recommended to wrap these for each type of driver private state
702 * object they have, filtering on &drm_private_obj.funcs using for_each_if(), at
703 * least if they want to iterate over all objects of a given type.
705 * An earlier way to handle driver private state was by subclassing struct
706 * &drm_atomic_state. But since that encourages non-standard ways to implement
707 * the check/commit split atomic requires (by using e.g. "check and rollback or
708 * commit instead" of "duplicate state, check, then either commit or release
709 * duplicated state) it is deprecated in favour of using &drm_private_state.
713 * drm_atomic_private_obj_init - initialize private object
714 * @dev: DRM device this object will be attached to
715 * @obj: private object
716 * @state: initial private object state
717 * @funcs: pointer to the struct of function pointers that identify the object
720 * Initialize the private object, which can be embedded into any
721 * driver private object that needs its own atomic state.
724 drm_atomic_private_obj_init(struct drm_device
*dev
,
725 struct drm_private_obj
*obj
,
726 struct drm_private_state
*state
,
727 const struct drm_private_state_funcs
*funcs
)
729 memset(obj
, 0, sizeof(*obj
));
731 drm_modeset_lock_init(&obj
->lock
);
735 list_add_tail(&obj
->head
, &dev
->mode_config
.privobj_list
);
737 EXPORT_SYMBOL(drm_atomic_private_obj_init
);
740 * drm_atomic_private_obj_fini - finalize private object
741 * @obj: private object
743 * Finalize the private object.
746 drm_atomic_private_obj_fini(struct drm_private_obj
*obj
)
748 list_del(&obj
->head
);
749 obj
->funcs
->atomic_destroy_state(obj
, obj
->state
);
750 drm_modeset_lock_fini(&obj
->lock
);
752 EXPORT_SYMBOL(drm_atomic_private_obj_fini
);
755 * drm_atomic_get_private_obj_state - get private object state
756 * @state: global atomic state
757 * @obj: private object to get the state for
759 * This function returns the private object state for the given private object,
760 * allocating the state if needed. It will also grab the relevant private
761 * object lock to make sure that the state is consistent.
765 * Either the allocated state or the error code encoded into a pointer.
767 struct drm_private_state
*
768 drm_atomic_get_private_obj_state(struct drm_atomic_state
*state
,
769 struct drm_private_obj
*obj
)
771 int index
, num_objs
, i
, ret
;
773 struct __drm_private_objs_state
*arr
;
774 struct drm_private_state
*obj_state
;
776 for (i
= 0; i
< state
->num_private_objs
; i
++)
777 if (obj
== state
->private_objs
[i
].ptr
)
778 return state
->private_objs
[i
].state
;
780 ret
= drm_modeset_lock(&obj
->lock
, state
->acquire_ctx
);
784 num_objs
= state
->num_private_objs
+ 1;
785 size
= sizeof(*state
->private_objs
) * num_objs
;
786 arr
= krealloc(state
->private_objs
, size
, GFP_KERNEL
);
788 return ERR_PTR(-ENOMEM
);
790 state
->private_objs
= arr
;
791 index
= state
->num_private_objs
;
792 memset(&state
->private_objs
[index
], 0, sizeof(*state
->private_objs
));
794 obj_state
= obj
->funcs
->atomic_duplicate_state(obj
);
796 return ERR_PTR(-ENOMEM
);
798 state
->private_objs
[index
].state
= obj_state
;
799 state
->private_objs
[index
].old_state
= obj
->state
;
800 state
->private_objs
[index
].new_state
= obj_state
;
801 state
->private_objs
[index
].ptr
= obj
;
802 obj_state
->state
= state
;
804 state
->num_private_objs
= num_objs
;
806 DRM_DEBUG_ATOMIC("Added new private object %p state %p to %p\n",
807 obj
, obj_state
, state
);
811 EXPORT_SYMBOL(drm_atomic_get_private_obj_state
);
814 * drm_atomic_get_old_private_obj_state
815 * @state: global atomic state object
816 * @obj: private_obj to grab
818 * This function returns the old private object state for the given private_obj,
819 * or NULL if the private_obj is not part of the global atomic state.
821 struct drm_private_state
*
822 drm_atomic_get_old_private_obj_state(struct drm_atomic_state
*state
,
823 struct drm_private_obj
*obj
)
827 for (i
= 0; i
< state
->num_private_objs
; i
++)
828 if (obj
== state
->private_objs
[i
].ptr
)
829 return state
->private_objs
[i
].old_state
;
833 EXPORT_SYMBOL(drm_atomic_get_old_private_obj_state
);
836 * drm_atomic_get_new_private_obj_state
837 * @state: global atomic state object
838 * @obj: private_obj to grab
840 * This function returns the new private object state for the given private_obj,
841 * or NULL if the private_obj is not part of the global atomic state.
843 struct drm_private_state
*
844 drm_atomic_get_new_private_obj_state(struct drm_atomic_state
*state
,
845 struct drm_private_obj
*obj
)
849 for (i
= 0; i
< state
->num_private_objs
; i
++)
850 if (obj
== state
->private_objs
[i
].ptr
)
851 return state
->private_objs
[i
].new_state
;
855 EXPORT_SYMBOL(drm_atomic_get_new_private_obj_state
);
858 * drm_atomic_get_old_connector_for_encoder - Get old connector for an encoder
859 * @state: Atomic state
860 * @encoder: The encoder to fetch the connector state for
862 * This function finds and returns the connector that was connected to @encoder
863 * as specified by the @state.
865 * If there is no connector in @state which previously had @encoder connected to
866 * it, this function will return NULL. While this may seem like an invalid use
867 * case, it is sometimes useful to differentiate commits which had no prior
868 * connectors attached to @encoder vs ones that did (and to inspect their
869 * state). This is especially true in enable hooks because the pipeline has
872 * Returns: The old connector connected to @encoder, or NULL if the encoder is
875 struct drm_connector
*
876 drm_atomic_get_old_connector_for_encoder(struct drm_atomic_state
*state
,
877 struct drm_encoder
*encoder
)
879 struct drm_connector_state
*conn_state
;
880 struct drm_connector
*connector
;
883 for_each_old_connector_in_state(state
, connector
, conn_state
, i
) {
884 if (conn_state
->best_encoder
== encoder
)
890 EXPORT_SYMBOL(drm_atomic_get_old_connector_for_encoder
);
893 * drm_atomic_get_new_connector_for_encoder - Get new connector for an encoder
894 * @state: Atomic state
895 * @encoder: The encoder to fetch the connector state for
897 * This function finds and returns the connector that will be connected to
898 * @encoder as specified by the @state.
900 * If there is no connector in @state which will have @encoder connected to it,
901 * this function will return NULL. While this may seem like an invalid use case,
902 * it is sometimes useful to differentiate commits which have no connectors
903 * attached to @encoder vs ones that do (and to inspect their state). This is
904 * especially true in disable hooks because the pipeline will change.
906 * Returns: The new connector connected to @encoder, or NULL if the encoder is
909 struct drm_connector
*
910 drm_atomic_get_new_connector_for_encoder(struct drm_atomic_state
*state
,
911 struct drm_encoder
*encoder
)
913 struct drm_connector_state
*conn_state
;
914 struct drm_connector
*connector
;
917 for_each_new_connector_in_state(state
, connector
, conn_state
, i
) {
918 if (conn_state
->best_encoder
== encoder
)
924 EXPORT_SYMBOL(drm_atomic_get_new_connector_for_encoder
);
927 * drm_atomic_get_connector_state - get connector state
928 * @state: global atomic state object
929 * @connector: connector to get state object for
931 * This function returns the connector state for the given connector,
932 * allocating it if needed. It will also grab the relevant connector lock to
933 * make sure that the state is consistent.
937 * Either the allocated state or the error code encoded into the pointer. When
938 * the error is EDEADLK then the w/w mutex code has detected a deadlock and the
939 * entire atomic sequence must be restarted. All other errors are fatal.
941 struct drm_connector_state
*
942 drm_atomic_get_connector_state(struct drm_atomic_state
*state
,
943 struct drm_connector
*connector
)
946 struct drm_mode_config
*config
= &connector
->dev
->mode_config
;
947 struct drm_connector_state
*connector_state
;
949 WARN_ON(!state
->acquire_ctx
);
951 ret
= drm_modeset_lock(&config
->connection_mutex
, state
->acquire_ctx
);
955 index
= drm_connector_index(connector
);
957 if (index
>= state
->num_connector
) {
958 struct __drm_connnectors_state
*c
;
959 int alloc
= max(index
+ 1, config
->num_connector
);
961 c
= krealloc(state
->connectors
, alloc
* sizeof(*state
->connectors
), GFP_KERNEL
);
963 return ERR_PTR(-ENOMEM
);
965 state
->connectors
= c
;
966 memset(&state
->connectors
[state
->num_connector
], 0,
967 sizeof(*state
->connectors
) * (alloc
- state
->num_connector
));
969 state
->num_connector
= alloc
;
972 if (state
->connectors
[index
].state
)
973 return state
->connectors
[index
].state
;
975 connector_state
= connector
->funcs
->atomic_duplicate_state(connector
);
976 if (!connector_state
)
977 return ERR_PTR(-ENOMEM
);
979 drm_connector_get(connector
);
980 state
->connectors
[index
].state
= connector_state
;
981 state
->connectors
[index
].old_state
= connector
->state
;
982 state
->connectors
[index
].new_state
= connector_state
;
983 state
->connectors
[index
].ptr
= connector
;
984 connector_state
->state
= state
;
986 DRM_DEBUG_ATOMIC("Added [CONNECTOR:%d:%s] %p state to %p\n",
987 connector
->base
.id
, connector
->name
,
988 connector_state
, state
);
990 if (connector_state
->crtc
) {
991 struct drm_crtc_state
*crtc_state
;
993 crtc_state
= drm_atomic_get_crtc_state(state
,
994 connector_state
->crtc
);
995 if (IS_ERR(crtc_state
))
996 return ERR_CAST(crtc_state
);
999 return connector_state
;
1001 EXPORT_SYMBOL(drm_atomic_get_connector_state
);
1003 static void drm_atomic_connector_print_state(struct drm_printer
*p
,
1004 const struct drm_connector_state
*state
)
1006 struct drm_connector
*connector
= state
->connector
;
1008 drm_printf(p
, "connector[%u]: %s\n", connector
->base
.id
, connector
->name
);
1009 drm_printf(p
, "\tcrtc=%s\n", state
->crtc
? state
->crtc
->name
: "(null)");
1010 drm_printf(p
, "\tself_refresh_aware=%d\n", state
->self_refresh_aware
);
1012 if (connector
->connector_type
== DRM_MODE_CONNECTOR_WRITEBACK
)
1013 if (state
->writeback_job
&& state
->writeback_job
->fb
)
1014 drm_printf(p
, "\tfb=%d\n", state
->writeback_job
->fb
->base
.id
);
1016 if (connector
->funcs
->atomic_print_state
)
1017 connector
->funcs
->atomic_print_state(p
, state
);
1021 * drm_atomic_add_affected_connectors - add connectors for CRTC
1022 * @state: atomic state
1025 * This function walks the current configuration and adds all connectors
1026 * currently using @crtc to the atomic configuration @state. Note that this
1027 * function must acquire the connection mutex. This can potentially cause
1028 * unneeded seralization if the update is just for the planes on one CRTC. Hence
1029 * drivers and helpers should only call this when really needed (e.g. when a
1030 * full modeset needs to happen due to some change).
1033 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
1034 * then the w/w mutex code has detected a deadlock and the entire atomic
1035 * sequence must be restarted. All other errors are fatal.
1038 drm_atomic_add_affected_connectors(struct drm_atomic_state
*state
,
1039 struct drm_crtc
*crtc
)
1041 struct drm_mode_config
*config
= &state
->dev
->mode_config
;
1042 struct drm_connector
*connector
;
1043 struct drm_connector_state
*conn_state
;
1044 struct drm_connector_list_iter conn_iter
;
1045 struct drm_crtc_state
*crtc_state
;
1048 crtc_state
= drm_atomic_get_crtc_state(state
, crtc
);
1049 if (IS_ERR(crtc_state
))
1050 return PTR_ERR(crtc_state
);
1052 ret
= drm_modeset_lock(&config
->connection_mutex
, state
->acquire_ctx
);
1056 DRM_DEBUG_ATOMIC("Adding all current connectors for [CRTC:%d:%s] to %p\n",
1057 crtc
->base
.id
, crtc
->name
, state
);
1060 * Changed connectors are already in @state, so only need to look
1061 * at the connector_mask in crtc_state.
1063 drm_connector_list_iter_begin(state
->dev
, &conn_iter
);
1064 drm_for_each_connector_iter(connector
, &conn_iter
) {
1065 if (!(crtc_state
->connector_mask
& drm_connector_mask(connector
)))
1068 conn_state
= drm_atomic_get_connector_state(state
, connector
);
1069 if (IS_ERR(conn_state
)) {
1070 drm_connector_list_iter_end(&conn_iter
);
1071 return PTR_ERR(conn_state
);
1074 drm_connector_list_iter_end(&conn_iter
);
1078 EXPORT_SYMBOL(drm_atomic_add_affected_connectors
);
1081 * drm_atomic_add_affected_planes - add planes for CRTC
1082 * @state: atomic state
1085 * This function walks the current configuration and adds all planes
1086 * currently used by @crtc to the atomic configuration @state. This is useful
1087 * when an atomic commit also needs to check all currently enabled plane on
1088 * @crtc, e.g. when changing the mode. It's also useful when re-enabling a CRTC
1089 * to avoid special code to force-enable all planes.
1091 * Since acquiring a plane state will always also acquire the w/w mutex of the
1092 * current CRTC for that plane (if there is any) adding all the plane states for
1093 * a CRTC will not reduce parallism of atomic updates.
1096 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
1097 * then the w/w mutex code has detected a deadlock and the entire atomic
1098 * sequence must be restarted. All other errors are fatal.
1101 drm_atomic_add_affected_planes(struct drm_atomic_state
*state
,
1102 struct drm_crtc
*crtc
)
1104 const struct drm_crtc_state
*old_crtc_state
=
1105 drm_atomic_get_old_crtc_state(state
, crtc
);
1106 struct drm_plane
*plane
;
1108 WARN_ON(!drm_atomic_get_new_crtc_state(state
, crtc
));
1110 DRM_DEBUG_ATOMIC("Adding all current planes for [CRTC:%d:%s] to %p\n",
1111 crtc
->base
.id
, crtc
->name
, state
);
1113 drm_for_each_plane_mask(plane
, state
->dev
, old_crtc_state
->plane_mask
) {
1114 struct drm_plane_state
*plane_state
=
1115 drm_atomic_get_plane_state(state
, plane
);
1117 if (IS_ERR(plane_state
))
1118 return PTR_ERR(plane_state
);
1122 EXPORT_SYMBOL(drm_atomic_add_affected_planes
);
1125 * drm_atomic_check_only - check whether a given config would work
1126 * @state: atomic configuration to check
1128 * Note that this function can return -EDEADLK if the driver needed to acquire
1129 * more locks but encountered a deadlock. The caller must then do the usual w/w
1130 * backoff dance and restart. All other errors are fatal.
1133 * 0 on success, negative error code on failure.
1135 int drm_atomic_check_only(struct drm_atomic_state
*state
)
1137 struct drm_device
*dev
= state
->dev
;
1138 struct drm_mode_config
*config
= &dev
->mode_config
;
1139 struct drm_plane
*plane
;
1140 struct drm_plane_state
*old_plane_state
;
1141 struct drm_plane_state
*new_plane_state
;
1142 struct drm_crtc
*crtc
;
1143 struct drm_crtc_state
*old_crtc_state
;
1144 struct drm_crtc_state
*new_crtc_state
;
1145 struct drm_connector
*conn
;
1146 struct drm_connector_state
*conn_state
;
1149 DRM_DEBUG_ATOMIC("checking %p\n", state
);
1151 for_each_oldnew_plane_in_state(state
, plane
, old_plane_state
, new_plane_state
, i
) {
1152 ret
= drm_atomic_plane_check(old_plane_state
, new_plane_state
);
1154 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic core check failed\n",
1155 plane
->base
.id
, plane
->name
);
1160 for_each_oldnew_crtc_in_state(state
, crtc
, old_crtc_state
, new_crtc_state
, i
) {
1161 ret
= drm_atomic_crtc_check(old_crtc_state
, new_crtc_state
);
1163 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic core check failed\n",
1164 crtc
->base
.id
, crtc
->name
);
1169 for_each_new_connector_in_state(state
, conn
, conn_state
, i
) {
1170 ret
= drm_atomic_connector_check(conn
, conn_state
);
1172 DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] atomic core check failed\n",
1173 conn
->base
.id
, conn
->name
);
1178 if (config
->funcs
->atomic_check
) {
1179 ret
= config
->funcs
->atomic_check(state
->dev
, state
);
1182 DRM_DEBUG_ATOMIC("atomic driver check for %p failed: %d\n",
1188 if (!state
->allow_modeset
) {
1189 for_each_new_crtc_in_state(state
, crtc
, new_crtc_state
, i
) {
1190 if (drm_atomic_crtc_needs_modeset(new_crtc_state
)) {
1191 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] requires full modeset\n",
1192 crtc
->base
.id
, crtc
->name
);
1200 EXPORT_SYMBOL(drm_atomic_check_only
);
1203 * drm_atomic_commit - commit configuration atomically
1204 * @state: atomic configuration to check
1206 * Note that this function can return -EDEADLK if the driver needed to acquire
1207 * more locks but encountered a deadlock. The caller must then do the usual w/w
1208 * backoff dance and restart. All other errors are fatal.
1210 * This function will take its own reference on @state.
1211 * Callers should always release their reference with drm_atomic_state_put().
1214 * 0 on success, negative error code on failure.
1216 int drm_atomic_commit(struct drm_atomic_state
*state
)
1218 struct drm_mode_config
*config
= &state
->dev
->mode_config
;
1221 ret
= drm_atomic_check_only(state
);
1225 DRM_DEBUG_ATOMIC("committing %p\n", state
);
1227 return config
->funcs
->atomic_commit(state
->dev
, state
, false);
1229 EXPORT_SYMBOL(drm_atomic_commit
);
1232 * drm_atomic_nonblocking_commit - atomic nonblocking commit
1233 * @state: atomic configuration to check
1235 * Note that this function can return -EDEADLK if the driver needed to acquire
1236 * more locks but encountered a deadlock. The caller must then do the usual w/w
1237 * backoff dance and restart. All other errors are fatal.
1239 * This function will take its own reference on @state.
1240 * Callers should always release their reference with drm_atomic_state_put().
1243 * 0 on success, negative error code on failure.
1245 int drm_atomic_nonblocking_commit(struct drm_atomic_state
*state
)
1247 struct drm_mode_config
*config
= &state
->dev
->mode_config
;
1250 ret
= drm_atomic_check_only(state
);
1254 DRM_DEBUG_ATOMIC("committing %p nonblocking\n", state
);
1256 return config
->funcs
->atomic_commit(state
->dev
, state
, true);
1258 EXPORT_SYMBOL(drm_atomic_nonblocking_commit
);
1260 /* just used from drm-client and atomic-helper: */
1261 int __drm_atomic_helper_disable_plane(struct drm_plane
*plane
,
1262 struct drm_plane_state
*plane_state
)
1266 ret
= drm_atomic_set_crtc_for_plane(plane_state
, NULL
);
1270 drm_atomic_set_fb_for_plane(plane_state
, NULL
);
1271 plane_state
->crtc_x
= 0;
1272 plane_state
->crtc_y
= 0;
1273 plane_state
->crtc_w
= 0;
1274 plane_state
->crtc_h
= 0;
1275 plane_state
->src_x
= 0;
1276 plane_state
->src_y
= 0;
1277 plane_state
->src_w
= 0;
1278 plane_state
->src_h
= 0;
1282 EXPORT_SYMBOL(__drm_atomic_helper_disable_plane
);
1284 static int update_output_state(struct drm_atomic_state
*state
,
1285 struct drm_mode_set
*set
)
1287 struct drm_device
*dev
= set
->crtc
->dev
;
1288 struct drm_crtc
*crtc
;
1289 struct drm_crtc_state
*new_crtc_state
;
1290 struct drm_connector
*connector
;
1291 struct drm_connector_state
*new_conn_state
;
1294 ret
= drm_modeset_lock(&dev
->mode_config
.connection_mutex
,
1295 state
->acquire_ctx
);
1299 /* First disable all connectors on the target crtc. */
1300 ret
= drm_atomic_add_affected_connectors(state
, set
->crtc
);
1304 for_each_new_connector_in_state(state
, connector
, new_conn_state
, i
) {
1305 if (new_conn_state
->crtc
== set
->crtc
) {
1306 ret
= drm_atomic_set_crtc_for_connector(new_conn_state
,
1311 /* Make sure legacy setCrtc always re-trains */
1312 new_conn_state
->link_status
= DRM_LINK_STATUS_GOOD
;
1316 /* Then set all connectors from set->connectors on the target crtc */
1317 for (i
= 0; i
< set
->num_connectors
; i
++) {
1318 new_conn_state
= drm_atomic_get_connector_state(state
,
1319 set
->connectors
[i
]);
1320 if (IS_ERR(new_conn_state
))
1321 return PTR_ERR(new_conn_state
);
1323 ret
= drm_atomic_set_crtc_for_connector(new_conn_state
,
1329 for_each_new_crtc_in_state(state
, crtc
, new_crtc_state
, i
) {
1331 * Don't update ->enable for the CRTC in the set_config request,
1332 * since a mismatch would indicate a bug in the upper layers.
1333 * The actual modeset code later on will catch any
1334 * inconsistencies here.
1336 if (crtc
== set
->crtc
)
1339 if (!new_crtc_state
->connector_mask
) {
1340 ret
= drm_atomic_set_mode_prop_for_crtc(new_crtc_state
,
1345 new_crtc_state
->active
= false;
1352 /* just used from drm-client and atomic-helper: */
1353 int __drm_atomic_helper_set_config(struct drm_mode_set
*set
,
1354 struct drm_atomic_state
*state
)
1356 struct drm_crtc_state
*crtc_state
;
1357 struct drm_plane_state
*primary_state
;
1358 struct drm_crtc
*crtc
= set
->crtc
;
1359 int hdisplay
, vdisplay
;
1362 crtc_state
= drm_atomic_get_crtc_state(state
, crtc
);
1363 if (IS_ERR(crtc_state
))
1364 return PTR_ERR(crtc_state
);
1366 primary_state
= drm_atomic_get_plane_state(state
, crtc
->primary
);
1367 if (IS_ERR(primary_state
))
1368 return PTR_ERR(primary_state
);
1372 WARN_ON(set
->num_connectors
);
1374 ret
= drm_atomic_set_mode_for_crtc(crtc_state
, NULL
);
1378 crtc_state
->active
= false;
1380 ret
= drm_atomic_set_crtc_for_plane(primary_state
, NULL
);
1384 drm_atomic_set_fb_for_plane(primary_state
, NULL
);
1390 WARN_ON(!set
->num_connectors
);
1392 ret
= drm_atomic_set_mode_for_crtc(crtc_state
, set
->mode
);
1396 crtc_state
->active
= true;
1398 ret
= drm_atomic_set_crtc_for_plane(primary_state
, crtc
);
1402 drm_mode_get_hv_timing(set
->mode
, &hdisplay
, &vdisplay
);
1404 drm_atomic_set_fb_for_plane(primary_state
, set
->fb
);
1405 primary_state
->crtc_x
= 0;
1406 primary_state
->crtc_y
= 0;
1407 primary_state
->crtc_w
= hdisplay
;
1408 primary_state
->crtc_h
= vdisplay
;
1409 primary_state
->src_x
= set
->x
<< 16;
1410 primary_state
->src_y
= set
->y
<< 16;
1411 if (drm_rotation_90_or_270(primary_state
->rotation
)) {
1412 primary_state
->src_w
= vdisplay
<< 16;
1413 primary_state
->src_h
= hdisplay
<< 16;
1415 primary_state
->src_w
= hdisplay
<< 16;
1416 primary_state
->src_h
= vdisplay
<< 16;
1420 ret
= update_output_state(state
, set
);
1426 EXPORT_SYMBOL(__drm_atomic_helper_set_config
);
1428 void drm_atomic_print_state(const struct drm_atomic_state
*state
)
1430 struct drm_printer p
= drm_info_printer(state
->dev
->dev
);
1431 struct drm_plane
*plane
;
1432 struct drm_plane_state
*plane_state
;
1433 struct drm_crtc
*crtc
;
1434 struct drm_crtc_state
*crtc_state
;
1435 struct drm_connector
*connector
;
1436 struct drm_connector_state
*connector_state
;
1439 DRM_DEBUG_ATOMIC("checking %p\n", state
);
1441 for_each_new_plane_in_state(state
, plane
, plane_state
, i
)
1442 drm_atomic_plane_print_state(&p
, plane_state
);
1444 for_each_new_crtc_in_state(state
, crtc
, crtc_state
, i
)
1445 drm_atomic_crtc_print_state(&p
, crtc_state
);
1447 for_each_new_connector_in_state(state
, connector
, connector_state
, i
)
1448 drm_atomic_connector_print_state(&p
, connector_state
);
1451 static void __drm_state_dump(struct drm_device
*dev
, struct drm_printer
*p
,
1454 struct drm_mode_config
*config
= &dev
->mode_config
;
1455 struct drm_plane
*plane
;
1456 struct drm_crtc
*crtc
;
1457 struct drm_connector
*connector
;
1458 struct drm_connector_list_iter conn_iter
;
1460 if (!drm_drv_uses_atomic_modeset(dev
))
1463 list_for_each_entry(plane
, &config
->plane_list
, head
) {
1465 drm_modeset_lock(&plane
->mutex
, NULL
);
1466 drm_atomic_plane_print_state(p
, plane
->state
);
1468 drm_modeset_unlock(&plane
->mutex
);
1471 list_for_each_entry(crtc
, &config
->crtc_list
, head
) {
1473 drm_modeset_lock(&crtc
->mutex
, NULL
);
1474 drm_atomic_crtc_print_state(p
, crtc
->state
);
1476 drm_modeset_unlock(&crtc
->mutex
);
1479 drm_connector_list_iter_begin(dev
, &conn_iter
);
1481 drm_modeset_lock(&dev
->mode_config
.connection_mutex
, NULL
);
1482 drm_for_each_connector_iter(connector
, &conn_iter
)
1483 drm_atomic_connector_print_state(p
, connector
->state
);
1485 drm_modeset_unlock(&dev
->mode_config
.connection_mutex
);
1486 drm_connector_list_iter_end(&conn_iter
);
1490 * drm_state_dump - dump entire device atomic state
1491 * @dev: the drm device
1492 * @p: where to print the state to
1494 * Just for debugging. Drivers might want an option to dump state
1495 * to dmesg in case of error irq's. (Hint, you probably want to
1498 * The caller must drm_modeset_lock_all(), or if this is called
1499 * from error irq handler, it should not be enabled by default.
1500 * (Ie. if you are debugging errors you might not care that this
1501 * is racey. But calling this without all modeset locks held is
1502 * not inherently safe.)
1504 void drm_state_dump(struct drm_device
*dev
, struct drm_printer
*p
)
1506 __drm_state_dump(dev
, p
, false);
1508 EXPORT_SYMBOL(drm_state_dump
);
1510 #ifdef CONFIG_DEBUG_FS
1511 static int drm_state_info(struct seq_file
*m
, void *data
)
1513 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
1514 struct drm_device
*dev
= node
->minor
->dev
;
1515 struct drm_printer p
= drm_seq_file_printer(m
);
1517 __drm_state_dump(dev
, &p
, true);
1522 /* any use in debugfs files to dump individual planes/crtc/etc? */
1523 static const struct drm_info_list drm_atomic_debugfs_list
[] = {
1524 {"state", drm_state_info
, 0},
1527 int drm_atomic_debugfs_init(struct drm_minor
*minor
)
1529 return drm_debugfs_create_files(drm_atomic_debugfs_list
,
1530 ARRAY_SIZE(drm_atomic_debugfs_list
),
1531 minor
->debugfs_root
, minor
);