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>
30 #include <drm/drm_atomic.h>
31 #include <drm/drm_mode.h>
32 #include <drm/drm_print.h>
33 #include <linux/sync_file.h>
35 #include "drm_crtc_internal.h"
36 #include "drm_internal.h"
38 void __drm_crtc_commit_free(struct kref
*kref
)
40 struct drm_crtc_commit
*commit
=
41 container_of(kref
, struct drm_crtc_commit
, ref
);
45 EXPORT_SYMBOL(__drm_crtc_commit_free
);
48 * drm_atomic_state_default_release -
49 * release memory initialized by drm_atomic_state_init
50 * @state: atomic state
52 * Free all the memory allocated by drm_atomic_state_init.
53 * This should only be used by drivers which are still subclassing
54 * &drm_atomic_state and haven't switched to &drm_private_state yet.
56 void drm_atomic_state_default_release(struct drm_atomic_state
*state
)
58 kfree(state
->connectors
);
61 kfree(state
->private_objs
);
63 EXPORT_SYMBOL(drm_atomic_state_default_release
);
66 * drm_atomic_state_init - init new atomic state
68 * @state: atomic state
70 * Default implementation for filling in a new atomic state.
71 * This should only be used by drivers which are still subclassing
72 * &drm_atomic_state and haven't switched to &drm_private_state yet.
75 drm_atomic_state_init(struct drm_device
*dev
, struct drm_atomic_state
*state
)
77 kref_init(&state
->ref
);
79 /* TODO legacy paths should maybe do a better job about
80 * setting this appropriately?
82 state
->allow_modeset
= true;
84 state
->crtcs
= kcalloc(dev
->mode_config
.num_crtc
,
85 sizeof(*state
->crtcs
), GFP_KERNEL
);
88 state
->planes
= kcalloc(dev
->mode_config
.num_total_plane
,
89 sizeof(*state
->planes
), GFP_KERNEL
);
95 DRM_DEBUG_ATOMIC("Allocated atomic state %p\n", state
);
99 drm_atomic_state_default_release(state
);
102 EXPORT_SYMBOL(drm_atomic_state_init
);
105 * drm_atomic_state_alloc - allocate atomic state
108 * This allocates an empty atomic state to track updates.
110 struct drm_atomic_state
*
111 drm_atomic_state_alloc(struct drm_device
*dev
)
113 struct drm_mode_config
*config
= &dev
->mode_config
;
115 if (!config
->funcs
->atomic_state_alloc
) {
116 struct drm_atomic_state
*state
;
118 state
= kzalloc(sizeof(*state
), GFP_KERNEL
);
121 if (drm_atomic_state_init(dev
, state
) < 0) {
128 return config
->funcs
->atomic_state_alloc(dev
);
130 EXPORT_SYMBOL(drm_atomic_state_alloc
);
133 * drm_atomic_state_default_clear - clear base atomic state
134 * @state: atomic state
136 * Default implementation for clearing atomic state.
137 * This should only be used by drivers which are still subclassing
138 * &drm_atomic_state and haven't switched to &drm_private_state yet.
140 void drm_atomic_state_default_clear(struct drm_atomic_state
*state
)
142 struct drm_device
*dev
= state
->dev
;
143 struct drm_mode_config
*config
= &dev
->mode_config
;
146 DRM_DEBUG_ATOMIC("Clearing atomic state %p\n", state
);
148 for (i
= 0; i
< state
->num_connector
; i
++) {
149 struct drm_connector
*connector
= state
->connectors
[i
].ptr
;
154 connector
->funcs
->atomic_destroy_state(connector
,
155 state
->connectors
[i
].state
);
156 state
->connectors
[i
].ptr
= NULL
;
157 state
->connectors
[i
].state
= NULL
;
158 drm_connector_put(connector
);
161 for (i
= 0; i
< config
->num_crtc
; i
++) {
162 struct drm_crtc
*crtc
= state
->crtcs
[i
].ptr
;
167 crtc
->funcs
->atomic_destroy_state(crtc
,
168 state
->crtcs
[i
].state
);
170 state
->crtcs
[i
].ptr
= NULL
;
171 state
->crtcs
[i
].state
= NULL
;
174 for (i
= 0; i
< config
->num_total_plane
; i
++) {
175 struct drm_plane
*plane
= state
->planes
[i
].ptr
;
180 plane
->funcs
->atomic_destroy_state(plane
,
181 state
->planes
[i
].state
);
182 state
->planes
[i
].ptr
= NULL
;
183 state
->planes
[i
].state
= NULL
;
186 for (i
= 0; i
< state
->num_private_objs
; i
++) {
187 struct drm_private_obj
*obj
= state
->private_objs
[i
].ptr
;
189 obj
->funcs
->atomic_destroy_state(obj
,
190 state
->private_objs
[i
].state
);
191 state
->private_objs
[i
].ptr
= NULL
;
192 state
->private_objs
[i
].state
= NULL
;
194 state
->num_private_objs
= 0;
196 if (state
->fake_commit
) {
197 drm_crtc_commit_put(state
->fake_commit
);
198 state
->fake_commit
= NULL
;
201 EXPORT_SYMBOL(drm_atomic_state_default_clear
);
204 * drm_atomic_state_clear - clear state object
205 * @state: atomic state
207 * When the w/w mutex algorithm detects a deadlock we need to back off and drop
208 * all locks. So someone else could sneak in and change the current modeset
209 * configuration. Which means that all the state assembled in @state is no
210 * longer an atomic update to the current state, but to some arbitrary earlier
211 * state. Which could break assumptions the driver's
212 * &drm_mode_config_funcs.atomic_check likely relies on.
214 * Hence we must clear all cached state and completely start over, using this
217 void drm_atomic_state_clear(struct drm_atomic_state
*state
)
219 struct drm_device
*dev
= state
->dev
;
220 struct drm_mode_config
*config
= &dev
->mode_config
;
222 if (config
->funcs
->atomic_state_clear
)
223 config
->funcs
->atomic_state_clear(state
);
225 drm_atomic_state_default_clear(state
);
227 EXPORT_SYMBOL(drm_atomic_state_clear
);
230 * __drm_atomic_state_free - free all memory for an atomic state
231 * @ref: This atomic state to deallocate
233 * This frees all memory associated with an atomic state, including all the
234 * per-object state for planes, crtcs and connectors.
236 void __drm_atomic_state_free(struct kref
*ref
)
238 struct drm_atomic_state
*state
= container_of(ref
, typeof(*state
), ref
);
239 struct drm_mode_config
*config
= &state
->dev
->mode_config
;
241 drm_atomic_state_clear(state
);
243 DRM_DEBUG_ATOMIC("Freeing atomic state %p\n", state
);
245 if (config
->funcs
->atomic_state_free
) {
246 config
->funcs
->atomic_state_free(state
);
248 drm_atomic_state_default_release(state
);
252 EXPORT_SYMBOL(__drm_atomic_state_free
);
255 * drm_atomic_get_crtc_state - get crtc state
256 * @state: global atomic state object
257 * @crtc: crtc to get state object for
259 * This function returns the crtc state for the given crtc, allocating it if
260 * needed. It will also grab the relevant crtc lock to make sure that the state
265 * Either the allocated state or the error code encoded into the pointer. When
266 * the error is EDEADLK then the w/w mutex code has detected a deadlock and the
267 * entire atomic sequence must be restarted. All other errors are fatal.
269 struct drm_crtc_state
*
270 drm_atomic_get_crtc_state(struct drm_atomic_state
*state
,
271 struct drm_crtc
*crtc
)
273 int ret
, index
= drm_crtc_index(crtc
);
274 struct drm_crtc_state
*crtc_state
;
276 WARN_ON(!state
->acquire_ctx
);
278 crtc_state
= drm_atomic_get_existing_crtc_state(state
, crtc
);
282 ret
= drm_modeset_lock(&crtc
->mutex
, state
->acquire_ctx
);
286 crtc_state
= crtc
->funcs
->atomic_duplicate_state(crtc
);
288 return ERR_PTR(-ENOMEM
);
290 state
->crtcs
[index
].state
= crtc_state
;
291 state
->crtcs
[index
].old_state
= crtc
->state
;
292 state
->crtcs
[index
].new_state
= crtc_state
;
293 state
->crtcs
[index
].ptr
= crtc
;
294 crtc_state
->state
= state
;
296 DRM_DEBUG_ATOMIC("Added [CRTC:%d:%s] %p state to %p\n",
297 crtc
->base
.id
, crtc
->name
, crtc_state
, state
);
301 EXPORT_SYMBOL(drm_atomic_get_crtc_state
);
303 static void set_out_fence_for_crtc(struct drm_atomic_state
*state
,
304 struct drm_crtc
*crtc
, s32 __user
*fence_ptr
)
306 state
->crtcs
[drm_crtc_index(crtc
)].out_fence_ptr
= fence_ptr
;
309 static s32 __user
*get_out_fence_for_crtc(struct drm_atomic_state
*state
,
310 struct drm_crtc
*crtc
)
312 s32 __user
*fence_ptr
;
314 fence_ptr
= state
->crtcs
[drm_crtc_index(crtc
)].out_fence_ptr
;
315 state
->crtcs
[drm_crtc_index(crtc
)].out_fence_ptr
= NULL
;
321 * drm_atomic_set_mode_for_crtc - set mode for CRTC
322 * @state: the CRTC whose incoming state to update
323 * @mode: kernel-internal mode to use for the CRTC, or NULL to disable
325 * Set a mode (originating from the kernel) on the desired CRTC state and update
326 * the enable property.
329 * Zero on success, error code on failure. Cannot return -EDEADLK.
331 int drm_atomic_set_mode_for_crtc(struct drm_crtc_state
*state
,
332 const struct drm_display_mode
*mode
)
334 struct drm_mode_modeinfo umode
;
336 /* Early return for no change. */
337 if (mode
&& memcmp(&state
->mode
, mode
, sizeof(*mode
)) == 0)
340 drm_property_blob_put(state
->mode_blob
);
341 state
->mode_blob
= NULL
;
344 drm_mode_convert_to_umode(&umode
, mode
);
346 drm_property_create_blob(state
->crtc
->dev
,
349 if (IS_ERR(state
->mode_blob
))
350 return PTR_ERR(state
->mode_blob
);
352 drm_mode_copy(&state
->mode
, mode
);
353 state
->enable
= true;
354 DRM_DEBUG_ATOMIC("Set [MODE:%s] for CRTC state %p\n",
357 memset(&state
->mode
, 0, sizeof(state
->mode
));
358 state
->enable
= false;
359 DRM_DEBUG_ATOMIC("Set [NOMODE] for CRTC state %p\n",
365 EXPORT_SYMBOL(drm_atomic_set_mode_for_crtc
);
368 * drm_atomic_set_mode_prop_for_crtc - set mode for CRTC
369 * @state: the CRTC whose incoming state to update
370 * @blob: pointer to blob property to use for mode
372 * Set a mode (originating from a blob property) on the desired CRTC state.
373 * This function will take a reference on the blob property for the CRTC state,
374 * and release the reference held on the state's existing mode property, if any
378 * Zero on success, error code on failure. Cannot return -EDEADLK.
380 int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state
*state
,
381 struct drm_property_blob
*blob
)
383 if (blob
== state
->mode_blob
)
386 drm_property_blob_put(state
->mode_blob
);
387 state
->mode_blob
= NULL
;
389 memset(&state
->mode
, 0, sizeof(state
->mode
));
392 if (blob
->length
!= sizeof(struct drm_mode_modeinfo
) ||
393 drm_mode_convert_umode(&state
->mode
,
394 (const struct drm_mode_modeinfo
*)
398 state
->mode_blob
= drm_property_blob_get(blob
);
399 state
->enable
= true;
400 DRM_DEBUG_ATOMIC("Set [MODE:%s] for CRTC state %p\n",
401 state
->mode
.name
, state
);
403 state
->enable
= false;
404 DRM_DEBUG_ATOMIC("Set [NOMODE] for CRTC state %p\n",
410 EXPORT_SYMBOL(drm_atomic_set_mode_prop_for_crtc
);
413 drm_atomic_replace_property_blob_from_id(struct drm_device
*dev
,
414 struct drm_property_blob
**blob
,
416 ssize_t expected_size
,
419 struct drm_property_blob
*new_blob
= NULL
;
422 new_blob
= drm_property_lookup_blob(dev
, blob_id
);
423 if (new_blob
== NULL
)
426 if (expected_size
> 0 && expected_size
!= new_blob
->length
) {
427 drm_property_blob_put(new_blob
);
432 *replaced
|= drm_property_replace_blob(blob
, new_blob
);
433 drm_property_blob_put(new_blob
);
439 * drm_atomic_crtc_set_property - set property on CRTC
440 * @crtc: the drm CRTC to set a property on
441 * @state: the state object to update with the new property value
442 * @property: the property to set
443 * @val: the new property value
445 * This function handles generic/core properties and calls out to driver's
446 * &drm_crtc_funcs.atomic_set_property for driver properties. To ensure
447 * consistent behavior you must call this function rather than the driver hook
451 * Zero on success, error code on failure
453 int drm_atomic_crtc_set_property(struct drm_crtc
*crtc
,
454 struct drm_crtc_state
*state
, struct drm_property
*property
,
457 struct drm_device
*dev
= crtc
->dev
;
458 struct drm_mode_config
*config
= &dev
->mode_config
;
459 bool replaced
= false;
462 if (property
== config
->prop_active
)
464 else if (property
== config
->prop_mode_id
) {
465 struct drm_property_blob
*mode
=
466 drm_property_lookup_blob(dev
, val
);
467 ret
= drm_atomic_set_mode_prop_for_crtc(state
, mode
);
468 drm_property_blob_put(mode
);
470 } else if (property
== config
->degamma_lut_property
) {
471 ret
= drm_atomic_replace_property_blob_from_id(dev
,
476 state
->color_mgmt_changed
|= replaced
;
478 } else if (property
== config
->ctm_property
) {
479 ret
= drm_atomic_replace_property_blob_from_id(dev
,
482 sizeof(struct drm_color_ctm
),
484 state
->color_mgmt_changed
|= replaced
;
486 } else if (property
== config
->gamma_lut_property
) {
487 ret
= drm_atomic_replace_property_blob_from_id(dev
,
492 state
->color_mgmt_changed
|= replaced
;
494 } else if (property
== config
->prop_out_fence_ptr
) {
495 s32 __user
*fence_ptr
= u64_to_user_ptr(val
);
500 if (put_user(-1, fence_ptr
))
503 set_out_fence_for_crtc(state
->state
, crtc
, fence_ptr
);
504 } else if (crtc
->funcs
->atomic_set_property
)
505 return crtc
->funcs
->atomic_set_property(crtc
, state
, property
, val
);
511 EXPORT_SYMBOL(drm_atomic_crtc_set_property
);
514 * drm_atomic_crtc_get_property - get property value from CRTC state
515 * @crtc: the drm CRTC to set a property on
516 * @state: the state object to get the property value from
517 * @property: the property to set
518 * @val: return location for the property value
520 * This function handles generic/core properties and calls out to driver's
521 * &drm_crtc_funcs.atomic_get_property for driver properties. To ensure
522 * consistent behavior you must call this function rather than the driver hook
526 * Zero on success, error code on failure
529 drm_atomic_crtc_get_property(struct drm_crtc
*crtc
,
530 const struct drm_crtc_state
*state
,
531 struct drm_property
*property
, uint64_t *val
)
533 struct drm_device
*dev
= crtc
->dev
;
534 struct drm_mode_config
*config
= &dev
->mode_config
;
536 if (property
== config
->prop_active
)
537 *val
= state
->active
;
538 else if (property
== config
->prop_mode_id
)
539 *val
= (state
->mode_blob
) ? state
->mode_blob
->base
.id
: 0;
540 else if (property
== config
->degamma_lut_property
)
541 *val
= (state
->degamma_lut
) ? state
->degamma_lut
->base
.id
: 0;
542 else if (property
== config
->ctm_property
)
543 *val
= (state
->ctm
) ? state
->ctm
->base
.id
: 0;
544 else if (property
== config
->gamma_lut_property
)
545 *val
= (state
->gamma_lut
) ? state
->gamma_lut
->base
.id
: 0;
546 else if (property
== config
->prop_out_fence_ptr
)
548 else if (crtc
->funcs
->atomic_get_property
)
549 return crtc
->funcs
->atomic_get_property(crtc
, state
, property
, val
);
557 * drm_atomic_crtc_check - check crtc state
558 * @crtc: crtc to check
559 * @state: crtc state to check
561 * Provides core sanity checks for crtc state.
564 * Zero on success, error code on failure
566 static int drm_atomic_crtc_check(struct drm_crtc
*crtc
,
567 struct drm_crtc_state
*state
)
569 /* NOTE: we explicitly don't enforce constraints such as primary
570 * layer covering entire screen, since that is something we want
571 * to allow (on hw that supports it). For hw that does not, it
572 * should be checked in driver's crtc->atomic_check() vfunc.
574 * TODO: Add generic modeset state checks once we support those.
577 if (state
->active
&& !state
->enable
) {
578 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] active without enabled\n",
579 crtc
->base
.id
, crtc
->name
);
583 /* The state->enable vs. state->mode_blob checks can be WARN_ON,
584 * as this is a kernel-internal detail that userspace should never
585 * be able to trigger. */
586 if (drm_core_check_feature(crtc
->dev
, DRIVER_ATOMIC
) &&
587 WARN_ON(state
->enable
&& !state
->mode_blob
)) {
588 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enabled without mode blob\n",
589 crtc
->base
.id
, crtc
->name
);
593 if (drm_core_check_feature(crtc
->dev
, DRIVER_ATOMIC
) &&
594 WARN_ON(!state
->enable
&& state
->mode_blob
)) {
595 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] disabled with mode blob\n",
596 crtc
->base
.id
, crtc
->name
);
601 * Reject event generation for when a CRTC is off and stays off.
602 * It wouldn't be hard to implement this, but userspace has a track
603 * record of happily burning through 100% cpu (or worse, crash) when the
604 * display pipe is suspended. To avoid all that fun just reject updates
605 * that ask for events since likely that indicates a bug in the
606 * compositor's drawing loop. This is consistent with the vblank IOCTL
607 * and legacy page_flip IOCTL which also reject service on a disabled
610 if (state
->event
&& !state
->active
&& !crtc
->state
->active
) {
611 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] requesting event but off\n",
612 crtc
->base
.id
, crtc
->name
);
619 static void drm_atomic_crtc_print_state(struct drm_printer
*p
,
620 const struct drm_crtc_state
*state
)
622 struct drm_crtc
*crtc
= state
->crtc
;
624 drm_printf(p
, "crtc[%u]: %s\n", crtc
->base
.id
, crtc
->name
);
625 drm_printf(p
, "\tenable=%d\n", state
->enable
);
626 drm_printf(p
, "\tactive=%d\n", state
->active
);
627 drm_printf(p
, "\tplanes_changed=%d\n", state
->planes_changed
);
628 drm_printf(p
, "\tmode_changed=%d\n", state
->mode_changed
);
629 drm_printf(p
, "\tactive_changed=%d\n", state
->active_changed
);
630 drm_printf(p
, "\tconnectors_changed=%d\n", state
->connectors_changed
);
631 drm_printf(p
, "\tcolor_mgmt_changed=%d\n", state
->color_mgmt_changed
);
632 drm_printf(p
, "\tplane_mask=%x\n", state
->plane_mask
);
633 drm_printf(p
, "\tconnector_mask=%x\n", state
->connector_mask
);
634 drm_printf(p
, "\tencoder_mask=%x\n", state
->encoder_mask
);
635 drm_printf(p
, "\tmode: " DRM_MODE_FMT
"\n", DRM_MODE_ARG(&state
->mode
));
637 if (crtc
->funcs
->atomic_print_state
)
638 crtc
->funcs
->atomic_print_state(p
, state
);
642 * drm_atomic_get_plane_state - get plane state
643 * @state: global atomic state object
644 * @plane: plane to get state object for
646 * This function returns the plane state for the given plane, allocating it if
647 * needed. It will also grab the relevant plane lock to make sure that the state
652 * Either the allocated state or the error code encoded into the pointer. When
653 * the error is EDEADLK then the w/w mutex code has detected a deadlock and the
654 * entire atomic sequence must be restarted. All other errors are fatal.
656 struct drm_plane_state
*
657 drm_atomic_get_plane_state(struct drm_atomic_state
*state
,
658 struct drm_plane
*plane
)
660 int ret
, index
= drm_plane_index(plane
);
661 struct drm_plane_state
*plane_state
;
663 WARN_ON(!state
->acquire_ctx
);
665 plane_state
= drm_atomic_get_existing_plane_state(state
, plane
);
669 ret
= drm_modeset_lock(&plane
->mutex
, state
->acquire_ctx
);
673 plane_state
= plane
->funcs
->atomic_duplicate_state(plane
);
675 return ERR_PTR(-ENOMEM
);
677 state
->planes
[index
].state
= plane_state
;
678 state
->planes
[index
].ptr
= plane
;
679 state
->planes
[index
].old_state
= plane
->state
;
680 state
->planes
[index
].new_state
= plane_state
;
681 plane_state
->state
= state
;
683 DRM_DEBUG_ATOMIC("Added [PLANE:%d:%s] %p state to %p\n",
684 plane
->base
.id
, plane
->name
, plane_state
, state
);
686 if (plane_state
->crtc
) {
687 struct drm_crtc_state
*crtc_state
;
689 crtc_state
= drm_atomic_get_crtc_state(state
,
691 if (IS_ERR(crtc_state
))
692 return ERR_CAST(crtc_state
);
697 EXPORT_SYMBOL(drm_atomic_get_plane_state
);
700 * drm_atomic_plane_set_property - set property on plane
701 * @plane: the drm plane to set a property on
702 * @state: the state object to update with the new property value
703 * @property: the property to set
704 * @val: the new property value
706 * This function handles generic/core properties and calls out to driver's
707 * &drm_plane_funcs.atomic_set_property for driver properties. To ensure
708 * consistent behavior you must call this function rather than the driver hook
712 * Zero on success, error code on failure
714 static int drm_atomic_plane_set_property(struct drm_plane
*plane
,
715 struct drm_plane_state
*state
, struct drm_property
*property
,
718 struct drm_device
*dev
= plane
->dev
;
719 struct drm_mode_config
*config
= &dev
->mode_config
;
721 if (property
== config
->prop_fb_id
) {
722 struct drm_framebuffer
*fb
= drm_framebuffer_lookup(dev
, NULL
, val
);
723 drm_atomic_set_fb_for_plane(state
, fb
);
725 drm_framebuffer_put(fb
);
726 } else if (property
== config
->prop_in_fence_fd
) {
730 if (U642I64(val
) == -1)
733 state
->fence
= sync_file_get_fence(val
);
737 } else if (property
== config
->prop_crtc_id
) {
738 struct drm_crtc
*crtc
= drm_crtc_find(dev
, NULL
, val
);
739 return drm_atomic_set_crtc_for_plane(state
, crtc
);
740 } else if (property
== config
->prop_crtc_x
) {
741 state
->crtc_x
= U642I64(val
);
742 } else if (property
== config
->prop_crtc_y
) {
743 state
->crtc_y
= U642I64(val
);
744 } else if (property
== config
->prop_crtc_w
) {
746 } else if (property
== config
->prop_crtc_h
) {
748 } else if (property
== config
->prop_src_x
) {
750 } else if (property
== config
->prop_src_y
) {
752 } else if (property
== config
->prop_src_w
) {
754 } else if (property
== config
->prop_src_h
) {
756 } else if (property
== plane
->rotation_property
) {
757 if (!is_power_of_2(val
& DRM_MODE_ROTATE_MASK
))
759 state
->rotation
= val
;
760 } else if (property
== plane
->zpos_property
) {
762 } else if (plane
->funcs
->atomic_set_property
) {
763 return plane
->funcs
->atomic_set_property(plane
, state
,
773 * drm_atomic_plane_get_property - get property value from plane state
774 * @plane: the drm plane to set a property on
775 * @state: the state object to get the property value from
776 * @property: the property to set
777 * @val: return location for the property value
779 * This function handles generic/core properties and calls out to driver's
780 * &drm_plane_funcs.atomic_get_property for driver properties. To ensure
781 * consistent behavior you must call this function rather than the driver hook
785 * Zero on success, error code on failure
788 drm_atomic_plane_get_property(struct drm_plane
*plane
,
789 const struct drm_plane_state
*state
,
790 struct drm_property
*property
, uint64_t *val
)
792 struct drm_device
*dev
= plane
->dev
;
793 struct drm_mode_config
*config
= &dev
->mode_config
;
795 if (property
== config
->prop_fb_id
) {
796 *val
= (state
->fb
) ? state
->fb
->base
.id
: 0;
797 } else if (property
== config
->prop_in_fence_fd
) {
799 } else if (property
== config
->prop_crtc_id
) {
800 *val
= (state
->crtc
) ? state
->crtc
->base
.id
: 0;
801 } else if (property
== config
->prop_crtc_x
) {
802 *val
= I642U64(state
->crtc_x
);
803 } else if (property
== config
->prop_crtc_y
) {
804 *val
= I642U64(state
->crtc_y
);
805 } else if (property
== config
->prop_crtc_w
) {
806 *val
= state
->crtc_w
;
807 } else if (property
== config
->prop_crtc_h
) {
808 *val
= state
->crtc_h
;
809 } else if (property
== config
->prop_src_x
) {
811 } else if (property
== config
->prop_src_y
) {
813 } else if (property
== config
->prop_src_w
) {
815 } else if (property
== config
->prop_src_h
) {
817 } else if (property
== plane
->rotation_property
) {
818 *val
= state
->rotation
;
819 } else if (property
== plane
->zpos_property
) {
821 } else if (plane
->funcs
->atomic_get_property
) {
822 return plane
->funcs
->atomic_get_property(plane
, state
, property
, val
);
831 plane_switching_crtc(struct drm_atomic_state
*state
,
832 struct drm_plane
*plane
,
833 struct drm_plane_state
*plane_state
)
835 if (!plane
->state
->crtc
|| !plane_state
->crtc
)
838 if (plane
->state
->crtc
== plane_state
->crtc
)
841 /* This could be refined, but currently there's no helper or driver code
842 * to implement direct switching of active planes nor userspace to take
843 * advantage of more direct plane switching without the intermediate
850 * drm_atomic_plane_check - check plane state
851 * @plane: plane to check
852 * @state: plane state to check
854 * Provides core sanity checks for plane state.
857 * Zero on success, error code on failure
859 static int drm_atomic_plane_check(struct drm_plane
*plane
,
860 struct drm_plane_state
*state
)
862 unsigned int fb_width
, fb_height
;
865 /* either *both* CRTC and FB must be set, or neither */
866 if (WARN_ON(state
->crtc
&& !state
->fb
)) {
867 DRM_DEBUG_ATOMIC("CRTC set but no FB\n");
869 } else if (WARN_ON(state
->fb
&& !state
->crtc
)) {
870 DRM_DEBUG_ATOMIC("FB set but no CRTC\n");
874 /* if disabled, we don't care about the rest of the state: */
878 /* Check whether this plane is usable on this CRTC */
879 if (!(plane
->possible_crtcs
& drm_crtc_mask(state
->crtc
))) {
880 DRM_DEBUG_ATOMIC("Invalid crtc for plane\n");
884 /* Check whether this plane supports the fb pixel format. */
885 ret
= drm_plane_check_pixel_format(plane
, state
->fb
->format
->format
);
887 struct drm_format_name_buf format_name
;
888 DRM_DEBUG_ATOMIC("Invalid pixel format %s\n",
889 drm_get_format_name(state
->fb
->format
->format
,
894 /* Give drivers some help against integer overflows */
895 if (state
->crtc_w
> INT_MAX
||
896 state
->crtc_x
> INT_MAX
- (int32_t) state
->crtc_w
||
897 state
->crtc_h
> INT_MAX
||
898 state
->crtc_y
> INT_MAX
- (int32_t) state
->crtc_h
) {
899 DRM_DEBUG_ATOMIC("Invalid CRTC coordinates %ux%u+%d+%d\n",
900 state
->crtc_w
, state
->crtc_h
,
901 state
->crtc_x
, state
->crtc_y
);
905 fb_width
= state
->fb
->width
<< 16;
906 fb_height
= state
->fb
->height
<< 16;
908 /* Make sure source coordinates are inside the fb. */
909 if (state
->src_w
> fb_width
||
910 state
->src_x
> fb_width
- state
->src_w
||
911 state
->src_h
> fb_height
||
912 state
->src_y
> fb_height
- state
->src_h
) {
913 DRM_DEBUG_ATOMIC("Invalid source coordinates "
914 "%u.%06ux%u.%06u+%u.%06u+%u.%06u (fb %ux%u)\n",
915 state
->src_w
>> 16, ((state
->src_w
& 0xffff) * 15625) >> 10,
916 state
->src_h
>> 16, ((state
->src_h
& 0xffff) * 15625) >> 10,
917 state
->src_x
>> 16, ((state
->src_x
& 0xffff) * 15625) >> 10,
918 state
->src_y
>> 16, ((state
->src_y
& 0xffff) * 15625) >> 10,
919 state
->fb
->width
, state
->fb
->height
);
923 if (plane_switching_crtc(state
->state
, plane
, state
)) {
924 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] switching CRTC directly\n",
925 plane
->base
.id
, plane
->name
);
932 static void drm_atomic_plane_print_state(struct drm_printer
*p
,
933 const struct drm_plane_state
*state
)
935 struct drm_plane
*plane
= state
->plane
;
936 struct drm_rect src
= drm_plane_state_src(state
);
937 struct drm_rect dest
= drm_plane_state_dest(state
);
939 drm_printf(p
, "plane[%u]: %s\n", plane
->base
.id
, plane
->name
);
940 drm_printf(p
, "\tcrtc=%s\n", state
->crtc
? state
->crtc
->name
: "(null)");
941 drm_printf(p
, "\tfb=%u\n", state
->fb
? state
->fb
->base
.id
: 0);
943 drm_framebuffer_print_info(p
, 2, state
->fb
);
944 drm_printf(p
, "\tcrtc-pos=" DRM_RECT_FMT
"\n", DRM_RECT_ARG(&dest
));
945 drm_printf(p
, "\tsrc-pos=" DRM_RECT_FP_FMT
"\n", DRM_RECT_FP_ARG(&src
));
946 drm_printf(p
, "\trotation=%x\n", state
->rotation
);
948 if (plane
->funcs
->atomic_print_state
)
949 plane
->funcs
->atomic_print_state(p
, state
);
953 * DOC: handling driver private state
955 * Very often the DRM objects exposed to userspace in the atomic modeset api
956 * (&drm_connector, &drm_crtc and &drm_plane) do not map neatly to the
957 * underlying hardware. Especially for any kind of shared resources (e.g. shared
958 * clocks, scaler units, bandwidth and fifo limits shared among a group of
959 * planes or CRTCs, and so on) it makes sense to model these as independent
960 * objects. Drivers then need to do similar state tracking and commit ordering for
961 * such private (since not exposed to userpace) objects as the atomic core and
962 * helpers already provide for connectors, planes and CRTCs.
964 * To make this easier on drivers the atomic core provides some support to track
965 * driver private state objects using struct &drm_private_obj, with the
966 * associated state struct &drm_private_state.
968 * Similar to userspace-exposed objects, private state structures can be
969 * acquired by calling drm_atomic_get_private_obj_state(). Since this function
970 * does not take care of locking, drivers should wrap it for each type of
971 * private state object they have with the required call to drm_modeset_lock()
972 * for the corresponding &drm_modeset_lock.
974 * All private state structures contained in a &drm_atomic_state update can be
975 * iterated using for_each_oldnew_private_obj_in_state(),
976 * for_each_new_private_obj_in_state() and for_each_old_private_obj_in_state().
977 * Drivers are recommended to wrap these for each type of driver private state
978 * object they have, filtering on &drm_private_obj.funcs using for_each_if(), at
979 * least if they want to iterate over all objects of a given type.
981 * An earlier way to handle driver private state was by subclassing struct
982 * &drm_atomic_state. But since that encourages non-standard ways to implement
983 * the check/commit split atomic requires (by using e.g. "check and rollback or
984 * commit instead" of "duplicate state, check, then either commit or release
985 * duplicated state) it is deprecated in favour of using &drm_private_state.
989 * drm_atomic_private_obj_init - initialize private object
990 * @obj: private object
991 * @state: initial private object state
992 * @funcs: pointer to the struct of function pointers that identify the object
995 * Initialize the private object, which can be embedded into any
996 * driver private object that needs its own atomic state.
999 drm_atomic_private_obj_init(struct drm_private_obj
*obj
,
1000 struct drm_private_state
*state
,
1001 const struct drm_private_state_funcs
*funcs
)
1003 memset(obj
, 0, sizeof(*obj
));
1008 EXPORT_SYMBOL(drm_atomic_private_obj_init
);
1011 * drm_atomic_private_obj_fini - finalize private object
1012 * @obj: private object
1014 * Finalize the private object.
1017 drm_atomic_private_obj_fini(struct drm_private_obj
*obj
)
1019 obj
->funcs
->atomic_destroy_state(obj
, obj
->state
);
1021 EXPORT_SYMBOL(drm_atomic_private_obj_fini
);
1024 * drm_atomic_get_private_obj_state - get private object state
1025 * @state: global atomic state
1026 * @obj: private object to get the state for
1028 * This function returns the private object state for the given private object,
1029 * allocating the state if needed. It does not grab any locks as the caller is
1030 * expected to care of any required locking.
1034 * Either the allocated state or the error code encoded into a pointer.
1036 struct drm_private_state
*
1037 drm_atomic_get_private_obj_state(struct drm_atomic_state
*state
,
1038 struct drm_private_obj
*obj
)
1040 int index
, num_objs
, i
;
1042 struct __drm_private_objs_state
*arr
;
1043 struct drm_private_state
*obj_state
;
1045 for (i
= 0; i
< state
->num_private_objs
; i
++)
1046 if (obj
== state
->private_objs
[i
].ptr
)
1047 return state
->private_objs
[i
].state
;
1049 num_objs
= state
->num_private_objs
+ 1;
1050 size
= sizeof(*state
->private_objs
) * num_objs
;
1051 arr
= krealloc(state
->private_objs
, size
, GFP_KERNEL
);
1053 return ERR_PTR(-ENOMEM
);
1055 state
->private_objs
= arr
;
1056 index
= state
->num_private_objs
;
1057 memset(&state
->private_objs
[index
], 0, sizeof(*state
->private_objs
));
1059 obj_state
= obj
->funcs
->atomic_duplicate_state(obj
);
1061 return ERR_PTR(-ENOMEM
);
1063 state
->private_objs
[index
].state
= obj_state
;
1064 state
->private_objs
[index
].old_state
= obj
->state
;
1065 state
->private_objs
[index
].new_state
= obj_state
;
1066 state
->private_objs
[index
].ptr
= obj
;
1068 state
->num_private_objs
= num_objs
;
1070 DRM_DEBUG_ATOMIC("Added new private object %p state %p to %p\n",
1071 obj
, obj_state
, state
);
1075 EXPORT_SYMBOL(drm_atomic_get_private_obj_state
);
1078 * drm_atomic_get_connector_state - get connector state
1079 * @state: global atomic state object
1080 * @connector: connector to get state object for
1082 * This function returns the connector state for the given connector,
1083 * allocating it if needed. It will also grab the relevant connector lock to
1084 * make sure that the state is consistent.
1088 * Either the allocated state or the error code encoded into the pointer. When
1089 * the error is EDEADLK then the w/w mutex code has detected a deadlock and the
1090 * entire atomic sequence must be restarted. All other errors are fatal.
1092 struct drm_connector_state
*
1093 drm_atomic_get_connector_state(struct drm_atomic_state
*state
,
1094 struct drm_connector
*connector
)
1097 struct drm_mode_config
*config
= &connector
->dev
->mode_config
;
1098 struct drm_connector_state
*connector_state
;
1100 WARN_ON(!state
->acquire_ctx
);
1102 ret
= drm_modeset_lock(&config
->connection_mutex
, state
->acquire_ctx
);
1104 return ERR_PTR(ret
);
1106 index
= drm_connector_index(connector
);
1108 if (index
>= state
->num_connector
) {
1109 struct __drm_connnectors_state
*c
;
1110 int alloc
= max(index
+ 1, config
->num_connector
);
1112 c
= krealloc(state
->connectors
, alloc
* sizeof(*state
->connectors
), GFP_KERNEL
);
1114 return ERR_PTR(-ENOMEM
);
1116 state
->connectors
= c
;
1117 memset(&state
->connectors
[state
->num_connector
], 0,
1118 sizeof(*state
->connectors
) * (alloc
- state
->num_connector
));
1120 state
->num_connector
= alloc
;
1123 if (state
->connectors
[index
].state
)
1124 return state
->connectors
[index
].state
;
1126 connector_state
= connector
->funcs
->atomic_duplicate_state(connector
);
1127 if (!connector_state
)
1128 return ERR_PTR(-ENOMEM
);
1130 drm_connector_get(connector
);
1131 state
->connectors
[index
].state
= connector_state
;
1132 state
->connectors
[index
].old_state
= connector
->state
;
1133 state
->connectors
[index
].new_state
= connector_state
;
1134 state
->connectors
[index
].ptr
= connector
;
1135 connector_state
->state
= state
;
1137 DRM_DEBUG_ATOMIC("Added [CONNECTOR:%d:%s] %p state to %p\n",
1138 connector
->base
.id
, connector
->name
,
1139 connector_state
, state
);
1141 if (connector_state
->crtc
) {
1142 struct drm_crtc_state
*crtc_state
;
1144 crtc_state
= drm_atomic_get_crtc_state(state
,
1145 connector_state
->crtc
);
1146 if (IS_ERR(crtc_state
))
1147 return ERR_CAST(crtc_state
);
1150 return connector_state
;
1152 EXPORT_SYMBOL(drm_atomic_get_connector_state
);
1155 * drm_atomic_connector_set_property - set property on connector.
1156 * @connector: the drm connector to set a property on
1157 * @state: the state object to update with the new property value
1158 * @property: the property to set
1159 * @val: the new property value
1161 * This function handles generic/core properties and calls out to driver's
1162 * &drm_connector_funcs.atomic_set_property for driver properties. To ensure
1163 * consistent behavior you must call this function rather than the driver hook
1167 * Zero on success, error code on failure
1169 static int drm_atomic_connector_set_property(struct drm_connector
*connector
,
1170 struct drm_connector_state
*state
, struct drm_property
*property
,
1173 struct drm_device
*dev
= connector
->dev
;
1174 struct drm_mode_config
*config
= &dev
->mode_config
;
1176 if (property
== config
->prop_crtc_id
) {
1177 struct drm_crtc
*crtc
= drm_crtc_find(dev
, NULL
, val
);
1178 return drm_atomic_set_crtc_for_connector(state
, crtc
);
1179 } else if (property
== config
->dpms_property
) {
1180 /* setting DPMS property requires special handling, which
1181 * is done in legacy setprop path for us. Disallow (for
1182 * now?) atomic writes to DPMS property:
1185 } else if (property
== config
->tv_select_subconnector_property
) {
1186 state
->tv
.subconnector
= val
;
1187 } else if (property
== config
->tv_left_margin_property
) {
1188 state
->tv
.margins
.left
= val
;
1189 } else if (property
== config
->tv_right_margin_property
) {
1190 state
->tv
.margins
.right
= val
;
1191 } else if (property
== config
->tv_top_margin_property
) {
1192 state
->tv
.margins
.top
= val
;
1193 } else if (property
== config
->tv_bottom_margin_property
) {
1194 state
->tv
.margins
.bottom
= val
;
1195 } else if (property
== config
->tv_mode_property
) {
1196 state
->tv
.mode
= val
;
1197 } else if (property
== config
->tv_brightness_property
) {
1198 state
->tv
.brightness
= val
;
1199 } else if (property
== config
->tv_contrast_property
) {
1200 state
->tv
.contrast
= val
;
1201 } else if (property
== config
->tv_flicker_reduction_property
) {
1202 state
->tv
.flicker_reduction
= val
;
1203 } else if (property
== config
->tv_overscan_property
) {
1204 state
->tv
.overscan
= val
;
1205 } else if (property
== config
->tv_saturation_property
) {
1206 state
->tv
.saturation
= val
;
1207 } else if (property
== config
->tv_hue_property
) {
1208 state
->tv
.hue
= val
;
1209 } else if (property
== config
->link_status_property
) {
1210 /* Never downgrade from GOOD to BAD on userspace's request here,
1211 * only hw issues can do that.
1213 * For an atomic property the userspace doesn't need to be able
1214 * to understand all the properties, but needs to be able to
1215 * restore the state it wants on VT switch. So if the userspace
1216 * tries to change the link_status from GOOD to BAD, driver
1217 * silently rejects it and returns a 0. This prevents userspace
1218 * from accidently breaking the display when it restores the
1221 if (state
->link_status
!= DRM_LINK_STATUS_GOOD
)
1222 state
->link_status
= val
;
1223 } else if (property
== config
->aspect_ratio_property
) {
1224 state
->picture_aspect_ratio
= val
;
1225 } else if (property
== connector
->scaling_mode_property
) {
1226 state
->scaling_mode
= val
;
1227 } else if (connector
->funcs
->atomic_set_property
) {
1228 return connector
->funcs
->atomic_set_property(connector
,
1229 state
, property
, val
);
1237 static void drm_atomic_connector_print_state(struct drm_printer
*p
,
1238 const struct drm_connector_state
*state
)
1240 struct drm_connector
*connector
= state
->connector
;
1242 drm_printf(p
, "connector[%u]: %s\n", connector
->base
.id
, connector
->name
);
1243 drm_printf(p
, "\tcrtc=%s\n", state
->crtc
? state
->crtc
->name
: "(null)");
1245 if (connector
->funcs
->atomic_print_state
)
1246 connector
->funcs
->atomic_print_state(p
, state
);
1250 * drm_atomic_connector_get_property - get property value from connector state
1251 * @connector: the drm connector to set a property on
1252 * @state: the state object to get the property value from
1253 * @property: the property to set
1254 * @val: return location for the property value
1256 * This function handles generic/core properties and calls out to driver's
1257 * &drm_connector_funcs.atomic_get_property for driver properties. To ensure
1258 * consistent behavior you must call this function rather than the driver hook
1262 * Zero on success, error code on failure
1265 drm_atomic_connector_get_property(struct drm_connector
*connector
,
1266 const struct drm_connector_state
*state
,
1267 struct drm_property
*property
, uint64_t *val
)
1269 struct drm_device
*dev
= connector
->dev
;
1270 struct drm_mode_config
*config
= &dev
->mode_config
;
1272 if (property
== config
->prop_crtc_id
) {
1273 *val
= (state
->crtc
) ? state
->crtc
->base
.id
: 0;
1274 } else if (property
== config
->dpms_property
) {
1275 *val
= connector
->dpms
;
1276 } else if (property
== config
->tv_select_subconnector_property
) {
1277 *val
= state
->tv
.subconnector
;
1278 } else if (property
== config
->tv_left_margin_property
) {
1279 *val
= state
->tv
.margins
.left
;
1280 } else if (property
== config
->tv_right_margin_property
) {
1281 *val
= state
->tv
.margins
.right
;
1282 } else if (property
== config
->tv_top_margin_property
) {
1283 *val
= state
->tv
.margins
.top
;
1284 } else if (property
== config
->tv_bottom_margin_property
) {
1285 *val
= state
->tv
.margins
.bottom
;
1286 } else if (property
== config
->tv_mode_property
) {
1287 *val
= state
->tv
.mode
;
1288 } else if (property
== config
->tv_brightness_property
) {
1289 *val
= state
->tv
.brightness
;
1290 } else if (property
== config
->tv_contrast_property
) {
1291 *val
= state
->tv
.contrast
;
1292 } else if (property
== config
->tv_flicker_reduction_property
) {
1293 *val
= state
->tv
.flicker_reduction
;
1294 } else if (property
== config
->tv_overscan_property
) {
1295 *val
= state
->tv
.overscan
;
1296 } else if (property
== config
->tv_saturation_property
) {
1297 *val
= state
->tv
.saturation
;
1298 } else if (property
== config
->tv_hue_property
) {
1299 *val
= state
->tv
.hue
;
1300 } else if (property
== config
->link_status_property
) {
1301 *val
= state
->link_status
;
1302 } else if (property
== config
->aspect_ratio_property
) {
1303 *val
= state
->picture_aspect_ratio
;
1304 } else if (property
== connector
->scaling_mode_property
) {
1305 *val
= state
->scaling_mode
;
1306 } else if (connector
->funcs
->atomic_get_property
) {
1307 return connector
->funcs
->atomic_get_property(connector
,
1308 state
, property
, val
);
1316 int drm_atomic_get_property(struct drm_mode_object
*obj
,
1317 struct drm_property
*property
, uint64_t *val
)
1319 struct drm_device
*dev
= property
->dev
;
1322 switch (obj
->type
) {
1323 case DRM_MODE_OBJECT_CONNECTOR
: {
1324 struct drm_connector
*connector
= obj_to_connector(obj
);
1325 WARN_ON(!drm_modeset_is_locked(&dev
->mode_config
.connection_mutex
));
1326 ret
= drm_atomic_connector_get_property(connector
,
1327 connector
->state
, property
, val
);
1330 case DRM_MODE_OBJECT_CRTC
: {
1331 struct drm_crtc
*crtc
= obj_to_crtc(obj
);
1332 WARN_ON(!drm_modeset_is_locked(&crtc
->mutex
));
1333 ret
= drm_atomic_crtc_get_property(crtc
,
1334 crtc
->state
, property
, val
);
1337 case DRM_MODE_OBJECT_PLANE
: {
1338 struct drm_plane
*plane
= obj_to_plane(obj
);
1339 WARN_ON(!drm_modeset_is_locked(&plane
->mutex
));
1340 ret
= drm_atomic_plane_get_property(plane
,
1341 plane
->state
, property
, val
);
1353 * drm_atomic_set_crtc_for_plane - set crtc for plane
1354 * @plane_state: the plane whose incoming state to update
1355 * @crtc: crtc to use for the plane
1357 * Changing the assigned crtc for a plane requires us to grab the lock and state
1358 * for the new crtc, as needed. This function takes care of all these details
1359 * besides updating the pointer in the state object itself.
1362 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
1363 * then the w/w mutex code has detected a deadlock and the entire atomic
1364 * sequence must be restarted. All other errors are fatal.
1367 drm_atomic_set_crtc_for_plane(struct drm_plane_state
*plane_state
,
1368 struct drm_crtc
*crtc
)
1370 struct drm_plane
*plane
= plane_state
->plane
;
1371 struct drm_crtc_state
*crtc_state
;
1373 if (plane_state
->crtc
) {
1374 crtc_state
= drm_atomic_get_crtc_state(plane_state
->state
,
1376 if (WARN_ON(IS_ERR(crtc_state
)))
1377 return PTR_ERR(crtc_state
);
1379 crtc_state
->plane_mask
&= ~(1 << drm_plane_index(plane
));
1382 plane_state
->crtc
= crtc
;
1385 crtc_state
= drm_atomic_get_crtc_state(plane_state
->state
,
1387 if (IS_ERR(crtc_state
))
1388 return PTR_ERR(crtc_state
);
1389 crtc_state
->plane_mask
|= (1 << drm_plane_index(plane
));
1393 DRM_DEBUG_ATOMIC("Link plane state %p to [CRTC:%d:%s]\n",
1394 plane_state
, crtc
->base
.id
, crtc
->name
);
1396 DRM_DEBUG_ATOMIC("Link plane state %p to [NOCRTC]\n",
1401 EXPORT_SYMBOL(drm_atomic_set_crtc_for_plane
);
1404 * drm_atomic_set_fb_for_plane - set framebuffer for plane
1405 * @plane_state: atomic state object for the plane
1406 * @fb: fb to use for the plane
1408 * Changing the assigned framebuffer for a plane requires us to grab a reference
1409 * to the new fb and drop the reference to the old fb, if there is one. This
1410 * function takes care of all these details besides updating the pointer in the
1411 * state object itself.
1414 drm_atomic_set_fb_for_plane(struct drm_plane_state
*plane_state
,
1415 struct drm_framebuffer
*fb
)
1418 DRM_DEBUG_ATOMIC("Set [FB:%d] for plane state %p\n",
1419 fb
->base
.id
, plane_state
);
1421 DRM_DEBUG_ATOMIC("Set [NOFB] for plane state %p\n",
1424 drm_framebuffer_assign(&plane_state
->fb
, fb
);
1426 EXPORT_SYMBOL(drm_atomic_set_fb_for_plane
);
1429 * drm_atomic_set_fence_for_plane - set fence for plane
1430 * @plane_state: atomic state object for the plane
1431 * @fence: dma_fence to use for the plane
1433 * Helper to setup the plane_state fence in case it is not set yet.
1434 * By using this drivers doesn't need to worry if the user choose
1435 * implicit or explicit fencing.
1437 * This function will not set the fence to the state if it was set
1438 * via explicit fencing interfaces on the atomic ioctl. In that case it will
1439 * drop the reference to the fence as we are not storing it anywhere.
1440 * Otherwise, if &drm_plane_state.fence is not set this function we just set it
1441 * with the received implicit fence. In both cases this function consumes a
1442 * reference for @fence.
1445 drm_atomic_set_fence_for_plane(struct drm_plane_state
*plane_state
,
1446 struct dma_fence
*fence
)
1448 if (plane_state
->fence
) {
1449 dma_fence_put(fence
);
1453 plane_state
->fence
= fence
;
1455 EXPORT_SYMBOL(drm_atomic_set_fence_for_plane
);
1458 * drm_atomic_set_crtc_for_connector - set crtc for connector
1459 * @conn_state: atomic state object for the connector
1460 * @crtc: crtc to use for the connector
1462 * Changing the assigned crtc for a connector requires us to grab the lock and
1463 * state for the new crtc, as needed. This function takes care of all these
1464 * details besides updating the pointer in the state object itself.
1467 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
1468 * then the w/w mutex code has detected a deadlock and the entire atomic
1469 * sequence must be restarted. All other errors are fatal.
1472 drm_atomic_set_crtc_for_connector(struct drm_connector_state
*conn_state
,
1473 struct drm_crtc
*crtc
)
1475 struct drm_crtc_state
*crtc_state
;
1477 if (conn_state
->crtc
== crtc
)
1480 if (conn_state
->crtc
) {
1481 crtc_state
= drm_atomic_get_new_crtc_state(conn_state
->state
,
1484 crtc_state
->connector_mask
&=
1485 ~(1 << drm_connector_index(conn_state
->connector
));
1487 drm_connector_put(conn_state
->connector
);
1488 conn_state
->crtc
= NULL
;
1492 crtc_state
= drm_atomic_get_crtc_state(conn_state
->state
, crtc
);
1493 if (IS_ERR(crtc_state
))
1494 return PTR_ERR(crtc_state
);
1496 crtc_state
->connector_mask
|=
1497 1 << drm_connector_index(conn_state
->connector
);
1499 drm_connector_get(conn_state
->connector
);
1500 conn_state
->crtc
= crtc
;
1502 DRM_DEBUG_ATOMIC("Link connector state %p to [CRTC:%d:%s]\n",
1503 conn_state
, crtc
->base
.id
, crtc
->name
);
1505 DRM_DEBUG_ATOMIC("Link connector state %p to [NOCRTC]\n",
1511 EXPORT_SYMBOL(drm_atomic_set_crtc_for_connector
);
1514 * drm_atomic_add_affected_connectors - add connectors for crtc
1515 * @state: atomic state
1518 * This function walks the current configuration and adds all connectors
1519 * currently using @crtc to the atomic configuration @state. Note that this
1520 * function must acquire the connection mutex. This can potentially cause
1521 * unneeded seralization if the update is just for the planes on one crtc. Hence
1522 * drivers and helpers should only call this when really needed (e.g. when a
1523 * full modeset needs to happen due to some change).
1526 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
1527 * then the w/w mutex code has detected a deadlock and the entire atomic
1528 * sequence must be restarted. All other errors are fatal.
1531 drm_atomic_add_affected_connectors(struct drm_atomic_state
*state
,
1532 struct drm_crtc
*crtc
)
1534 struct drm_mode_config
*config
= &state
->dev
->mode_config
;
1535 struct drm_connector
*connector
;
1536 struct drm_connector_state
*conn_state
;
1537 struct drm_connector_list_iter conn_iter
;
1538 struct drm_crtc_state
*crtc_state
;
1541 crtc_state
= drm_atomic_get_crtc_state(state
, crtc
);
1542 if (IS_ERR(crtc_state
))
1543 return PTR_ERR(crtc_state
);
1545 ret
= drm_modeset_lock(&config
->connection_mutex
, state
->acquire_ctx
);
1549 DRM_DEBUG_ATOMIC("Adding all current connectors for [CRTC:%d:%s] to %p\n",
1550 crtc
->base
.id
, crtc
->name
, state
);
1553 * Changed connectors are already in @state, so only need to look
1554 * at the connector_mask in crtc_state.
1556 drm_connector_list_iter_begin(state
->dev
, &conn_iter
);
1557 drm_for_each_connector_iter(connector
, &conn_iter
) {
1558 if (!(crtc_state
->connector_mask
& (1 << drm_connector_index(connector
))))
1561 conn_state
= drm_atomic_get_connector_state(state
, connector
);
1562 if (IS_ERR(conn_state
)) {
1563 drm_connector_list_iter_end(&conn_iter
);
1564 return PTR_ERR(conn_state
);
1567 drm_connector_list_iter_end(&conn_iter
);
1571 EXPORT_SYMBOL(drm_atomic_add_affected_connectors
);
1574 * drm_atomic_add_affected_planes - add planes for crtc
1575 * @state: atomic state
1578 * This function walks the current configuration and adds all planes
1579 * currently used by @crtc to the atomic configuration @state. This is useful
1580 * when an atomic commit also needs to check all currently enabled plane on
1581 * @crtc, e.g. when changing the mode. It's also useful when re-enabling a CRTC
1582 * to avoid special code to force-enable all planes.
1584 * Since acquiring a plane state will always also acquire the w/w mutex of the
1585 * current CRTC for that plane (if there is any) adding all the plane states for
1586 * a CRTC will not reduce parallism of atomic updates.
1589 * 0 on success or can fail with -EDEADLK or -ENOMEM. When the error is EDEADLK
1590 * then the w/w mutex code has detected a deadlock and the entire atomic
1591 * sequence must be restarted. All other errors are fatal.
1594 drm_atomic_add_affected_planes(struct drm_atomic_state
*state
,
1595 struct drm_crtc
*crtc
)
1597 struct drm_plane
*plane
;
1599 WARN_ON(!drm_atomic_get_new_crtc_state(state
, crtc
));
1601 drm_for_each_plane_mask(plane
, state
->dev
, crtc
->state
->plane_mask
) {
1602 struct drm_plane_state
*plane_state
=
1603 drm_atomic_get_plane_state(state
, plane
);
1605 if (IS_ERR(plane_state
))
1606 return PTR_ERR(plane_state
);
1610 EXPORT_SYMBOL(drm_atomic_add_affected_planes
);
1613 * drm_atomic_check_only - check whether a given config would work
1614 * @state: atomic configuration to check
1616 * Note that this function can return -EDEADLK if the driver needed to acquire
1617 * more locks but encountered a deadlock. The caller must then do the usual w/w
1618 * backoff dance and restart. All other errors are fatal.
1621 * 0 on success, negative error code on failure.
1623 int drm_atomic_check_only(struct drm_atomic_state
*state
)
1625 struct drm_device
*dev
= state
->dev
;
1626 struct drm_mode_config
*config
= &dev
->mode_config
;
1627 struct drm_plane
*plane
;
1628 struct drm_plane_state
*plane_state
;
1629 struct drm_crtc
*crtc
;
1630 struct drm_crtc_state
*crtc_state
;
1633 DRM_DEBUG_ATOMIC("checking %p\n", state
);
1635 for_each_new_plane_in_state(state
, plane
, plane_state
, i
) {
1636 ret
= drm_atomic_plane_check(plane
, plane_state
);
1638 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic core check failed\n",
1639 plane
->base
.id
, plane
->name
);
1644 for_each_new_crtc_in_state(state
, crtc
, crtc_state
, i
) {
1645 ret
= drm_atomic_crtc_check(crtc
, crtc_state
);
1647 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic core check failed\n",
1648 crtc
->base
.id
, crtc
->name
);
1653 if (config
->funcs
->atomic_check
)
1654 ret
= config
->funcs
->atomic_check(state
->dev
, state
);
1659 if (!state
->allow_modeset
) {
1660 for_each_new_crtc_in_state(state
, crtc
, crtc_state
, i
) {
1661 if (drm_atomic_crtc_needs_modeset(crtc_state
)) {
1662 DRM_DEBUG_ATOMIC("[CRTC:%d:%s] requires full modeset\n",
1663 crtc
->base
.id
, crtc
->name
);
1671 EXPORT_SYMBOL(drm_atomic_check_only
);
1674 * drm_atomic_commit - commit configuration atomically
1675 * @state: atomic configuration to check
1677 * Note that this function can return -EDEADLK if the driver needed to acquire
1678 * more locks but encountered a deadlock. The caller must then do the usual w/w
1679 * backoff dance and restart. All other errors are fatal.
1681 * This function will take its own reference on @state.
1682 * Callers should always release their reference with drm_atomic_state_put().
1685 * 0 on success, negative error code on failure.
1687 int drm_atomic_commit(struct drm_atomic_state
*state
)
1689 struct drm_mode_config
*config
= &state
->dev
->mode_config
;
1692 ret
= drm_atomic_check_only(state
);
1696 DRM_DEBUG_ATOMIC("committing %p\n", state
);
1698 return config
->funcs
->atomic_commit(state
->dev
, state
, false);
1700 EXPORT_SYMBOL(drm_atomic_commit
);
1703 * drm_atomic_nonblocking_commit - atomic nonblocking commit
1704 * @state: atomic configuration to check
1706 * Note that this function can return -EDEADLK if the driver needed to acquire
1707 * more locks but encountered a deadlock. The caller must then do the usual w/w
1708 * backoff dance and restart. All other errors are fatal.
1710 * This function will take its own reference on @state.
1711 * Callers should always release their reference with drm_atomic_state_put().
1714 * 0 on success, negative error code on failure.
1716 int drm_atomic_nonblocking_commit(struct drm_atomic_state
*state
)
1718 struct drm_mode_config
*config
= &state
->dev
->mode_config
;
1721 ret
= drm_atomic_check_only(state
);
1725 DRM_DEBUG_ATOMIC("committing %p nonblocking\n", state
);
1727 return config
->funcs
->atomic_commit(state
->dev
, state
, true);
1729 EXPORT_SYMBOL(drm_atomic_nonblocking_commit
);
1731 static void drm_atomic_print_state(const struct drm_atomic_state
*state
)
1733 struct drm_printer p
= drm_info_printer(state
->dev
->dev
);
1734 struct drm_plane
*plane
;
1735 struct drm_plane_state
*plane_state
;
1736 struct drm_crtc
*crtc
;
1737 struct drm_crtc_state
*crtc_state
;
1738 struct drm_connector
*connector
;
1739 struct drm_connector_state
*connector_state
;
1742 DRM_DEBUG_ATOMIC("checking %p\n", state
);
1744 for_each_new_plane_in_state(state
, plane
, plane_state
, i
)
1745 drm_atomic_plane_print_state(&p
, plane_state
);
1747 for_each_new_crtc_in_state(state
, crtc
, crtc_state
, i
)
1748 drm_atomic_crtc_print_state(&p
, crtc_state
);
1750 for_each_new_connector_in_state(state
, connector
, connector_state
, i
)
1751 drm_atomic_connector_print_state(&p
, connector_state
);
1754 static void __drm_state_dump(struct drm_device
*dev
, struct drm_printer
*p
,
1757 struct drm_mode_config
*config
= &dev
->mode_config
;
1758 struct drm_plane
*plane
;
1759 struct drm_crtc
*crtc
;
1760 struct drm_connector
*connector
;
1761 struct drm_connector_list_iter conn_iter
;
1763 if (!drm_core_check_feature(dev
, DRIVER_ATOMIC
))
1766 list_for_each_entry(plane
, &config
->plane_list
, head
) {
1768 drm_modeset_lock(&plane
->mutex
, NULL
);
1769 drm_atomic_plane_print_state(p
, plane
->state
);
1771 drm_modeset_unlock(&plane
->mutex
);
1774 list_for_each_entry(crtc
, &config
->crtc_list
, head
) {
1776 drm_modeset_lock(&crtc
->mutex
, NULL
);
1777 drm_atomic_crtc_print_state(p
, crtc
->state
);
1779 drm_modeset_unlock(&crtc
->mutex
);
1782 drm_connector_list_iter_begin(dev
, &conn_iter
);
1784 drm_modeset_lock(&dev
->mode_config
.connection_mutex
, NULL
);
1785 drm_for_each_connector_iter(connector
, &conn_iter
)
1786 drm_atomic_connector_print_state(p
, connector
->state
);
1788 drm_modeset_unlock(&dev
->mode_config
.connection_mutex
);
1789 drm_connector_list_iter_end(&conn_iter
);
1793 * drm_state_dump - dump entire device atomic state
1794 * @dev: the drm device
1795 * @p: where to print the state to
1797 * Just for debugging. Drivers might want an option to dump state
1798 * to dmesg in case of error irq's. (Hint, you probably want to
1801 * The caller must drm_modeset_lock_all(), or if this is called
1802 * from error irq handler, it should not be enabled by default.
1803 * (Ie. if you are debugging errors you might not care that this
1804 * is racey. But calling this without all modeset locks held is
1805 * not inherently safe.)
1807 void drm_state_dump(struct drm_device
*dev
, struct drm_printer
*p
)
1809 __drm_state_dump(dev
, p
, false);
1811 EXPORT_SYMBOL(drm_state_dump
);
1813 #ifdef CONFIG_DEBUG_FS
1814 static int drm_state_info(struct seq_file
*m
, void *data
)
1816 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
1817 struct drm_device
*dev
= node
->minor
->dev
;
1818 struct drm_printer p
= drm_seq_file_printer(m
);
1820 __drm_state_dump(dev
, &p
, true);
1825 /* any use in debugfs files to dump individual planes/crtc/etc? */
1826 static const struct drm_info_list drm_atomic_debugfs_list
[] = {
1827 {"state", drm_state_info
, 0},
1830 int drm_atomic_debugfs_init(struct drm_minor
*minor
)
1832 return drm_debugfs_create_files(drm_atomic_debugfs_list
,
1833 ARRAY_SIZE(drm_atomic_debugfs_list
),
1834 minor
->debugfs_root
, minor
);
1839 * The big monster ioctl
1842 static struct drm_pending_vblank_event
*create_vblank_event(
1843 struct drm_crtc
*crtc
, uint64_t user_data
)
1845 struct drm_pending_vblank_event
*e
= NULL
;
1847 e
= kzalloc(sizeof *e
, GFP_KERNEL
);
1851 e
->event
.base
.type
= DRM_EVENT_FLIP_COMPLETE
;
1852 e
->event
.base
.length
= sizeof(e
->event
);
1853 e
->event
.vbl
.crtc_id
= crtc
->base
.id
;
1854 e
->event
.vbl
.user_data
= user_data
;
1859 int drm_atomic_connector_commit_dpms(struct drm_atomic_state
*state
,
1860 struct drm_connector
*connector
,
1863 struct drm_connector
*tmp_connector
;
1864 struct drm_connector_state
*new_conn_state
;
1865 struct drm_crtc
*crtc
;
1866 struct drm_crtc_state
*crtc_state
;
1867 int i
, ret
, old_mode
= connector
->dpms
;
1868 bool active
= false;
1870 ret
= drm_modeset_lock(&state
->dev
->mode_config
.connection_mutex
,
1871 state
->acquire_ctx
);
1875 if (mode
!= DRM_MODE_DPMS_ON
)
1876 mode
= DRM_MODE_DPMS_OFF
;
1877 connector
->dpms
= mode
;
1879 crtc
= connector
->state
->crtc
;
1882 ret
= drm_atomic_add_affected_connectors(state
, crtc
);
1886 crtc_state
= drm_atomic_get_crtc_state(state
, crtc
);
1887 if (IS_ERR(crtc_state
)) {
1888 ret
= PTR_ERR(crtc_state
);
1892 for_each_new_connector_in_state(state
, tmp_connector
, new_conn_state
, i
) {
1893 if (new_conn_state
->crtc
!= crtc
)
1895 if (tmp_connector
->dpms
== DRM_MODE_DPMS_ON
) {
1901 crtc_state
->active
= active
;
1902 ret
= drm_atomic_commit(state
);
1905 connector
->dpms
= old_mode
;
1909 int drm_atomic_set_property(struct drm_atomic_state
*state
,
1910 struct drm_mode_object
*obj
,
1911 struct drm_property
*prop
,
1912 uint64_t prop_value
)
1914 struct drm_mode_object
*ref
;
1917 if (!drm_property_change_valid_get(prop
, prop_value
, &ref
))
1920 switch (obj
->type
) {
1921 case DRM_MODE_OBJECT_CONNECTOR
: {
1922 struct drm_connector
*connector
= obj_to_connector(obj
);
1923 struct drm_connector_state
*connector_state
;
1925 connector_state
= drm_atomic_get_connector_state(state
, connector
);
1926 if (IS_ERR(connector_state
)) {
1927 ret
= PTR_ERR(connector_state
);
1931 ret
= drm_atomic_connector_set_property(connector
,
1932 connector_state
, prop
, prop_value
);
1935 case DRM_MODE_OBJECT_CRTC
: {
1936 struct drm_crtc
*crtc
= obj_to_crtc(obj
);
1937 struct drm_crtc_state
*crtc_state
;
1939 crtc_state
= drm_atomic_get_crtc_state(state
, crtc
);
1940 if (IS_ERR(crtc_state
)) {
1941 ret
= PTR_ERR(crtc_state
);
1945 ret
= drm_atomic_crtc_set_property(crtc
,
1946 crtc_state
, prop
, prop_value
);
1949 case DRM_MODE_OBJECT_PLANE
: {
1950 struct drm_plane
*plane
= obj_to_plane(obj
);
1951 struct drm_plane_state
*plane_state
;
1953 plane_state
= drm_atomic_get_plane_state(state
, plane
);
1954 if (IS_ERR(plane_state
)) {
1955 ret
= PTR_ERR(plane_state
);
1959 ret
= drm_atomic_plane_set_property(plane
,
1960 plane_state
, prop
, prop_value
);
1968 drm_property_change_valid_put(prop
, ref
);
1973 * drm_atomic_clean_old_fb -- Unset old_fb pointers and set plane->fb pointers.
1975 * @dev: drm device to check.
1976 * @plane_mask: plane mask for planes that were updated.
1977 * @ret: return value, can be -EDEADLK for a retry.
1979 * Before doing an update &drm_plane.old_fb is set to &drm_plane.fb, but before
1980 * dropping the locks old_fb needs to be set to NULL and plane->fb updated. This
1981 * is a common operation for each atomic update, so this call is split off as a
1984 void drm_atomic_clean_old_fb(struct drm_device
*dev
,
1985 unsigned plane_mask
,
1988 struct drm_plane
*plane
;
1990 /* if succeeded, fixup legacy plane crtc/fb ptrs before dropping
1991 * locks (ie. while it is still safe to deref plane->state). We
1992 * need to do this here because the driver entry points cannot
1993 * distinguish between legacy and atomic ioctls.
1995 drm_for_each_plane_mask(plane
, dev
, plane_mask
) {
1997 struct drm_framebuffer
*new_fb
= plane
->state
->fb
;
1999 drm_framebuffer_get(new_fb
);
2001 plane
->crtc
= plane
->state
->crtc
;
2004 drm_framebuffer_put(plane
->old_fb
);
2006 plane
->old_fb
= NULL
;
2009 EXPORT_SYMBOL(drm_atomic_clean_old_fb
);
2012 * DOC: explicit fencing properties
2014 * Explicit fencing allows userspace to control the buffer synchronization
2015 * between devices. A Fence or a group of fences are transfered to/from
2016 * userspace using Sync File fds and there are two DRM properties for that.
2017 * IN_FENCE_FD on each DRM Plane to send fences to the kernel and
2018 * OUT_FENCE_PTR on each DRM CRTC to receive fences from the kernel.
2020 * As a contrast, with implicit fencing the kernel keeps track of any
2021 * ongoing rendering, and automatically ensures that the atomic update waits
2022 * for any pending rendering to complete. For shared buffers represented with
2023 * a &struct dma_buf this is tracked in &struct reservation_object.
2024 * Implicit syncing is how Linux traditionally worked (e.g. DRI2/3 on X.org),
2025 * whereas explicit fencing is what Android wants.
2028 * Use this property to pass a fence that DRM should wait on before
2029 * proceeding with the Atomic Commit request and show the framebuffer for
2030 * the plane on the screen. The fence can be either a normal fence or a
2031 * merged one, the sync_file framework will handle both cases and use a
2032 * fence_array if a merged fence is received. Passing -1 here means no
2033 * fences to wait on.
2035 * If the Atomic Commit request has the DRM_MODE_ATOMIC_TEST_ONLY flag
2036 * it will only check if the Sync File is a valid one.
2038 * On the driver side the fence is stored on the @fence parameter of
2039 * &struct drm_plane_state. Drivers which also support implicit fencing
2040 * should set the implicit fence using drm_atomic_set_fence_for_plane(),
2041 * to make sure there's consistent behaviour between drivers in precedence
2042 * of implicit vs. explicit fencing.
2045 * Use this property to pass a file descriptor pointer to DRM. Once the
2046 * Atomic Commit request call returns OUT_FENCE_PTR will be filled with
2047 * the file descriptor number of a Sync File. This Sync File contains the
2048 * CRTC fence that will be signaled when all framebuffers present on the
2049 * Atomic Commit * request for that given CRTC are scanned out on the
2052 * The Atomic Commit request fails if a invalid pointer is passed. If the
2053 * Atomic Commit request fails for any other reason the out fence fd
2054 * returned will be -1. On a Atomic Commit with the
2055 * DRM_MODE_ATOMIC_TEST_ONLY flag the out fence will also be set to -1.
2057 * Note that out-fences don't have a special interface to drivers and are
2058 * internally represented by a &struct drm_pending_vblank_event in struct
2059 * &drm_crtc_state, which is also used by the nonblocking atomic commit
2060 * helpers and for the DRM event handling for existing userspace.
2063 struct drm_out_fence_state
{
2064 s32 __user
*out_fence_ptr
;
2065 struct sync_file
*sync_file
;
2069 static int setup_out_fence(struct drm_out_fence_state
*fence_state
,
2070 struct dma_fence
*fence
)
2072 fence_state
->fd
= get_unused_fd_flags(O_CLOEXEC
);
2073 if (fence_state
->fd
< 0)
2074 return fence_state
->fd
;
2076 if (put_user(fence_state
->fd
, fence_state
->out_fence_ptr
))
2079 fence_state
->sync_file
= sync_file_create(fence
);
2080 if (!fence_state
->sync_file
)
2086 static int prepare_crtc_signaling(struct drm_device
*dev
,
2087 struct drm_atomic_state
*state
,
2088 struct drm_mode_atomic
*arg
,
2089 struct drm_file
*file_priv
,
2090 struct drm_out_fence_state
**fence_state
,
2091 unsigned int *num_fences
)
2093 struct drm_crtc
*crtc
;
2094 struct drm_crtc_state
*crtc_state
;
2097 if (arg
->flags
& DRM_MODE_ATOMIC_TEST_ONLY
)
2100 for_each_new_crtc_in_state(state
, crtc
, crtc_state
, i
) {
2101 s32 __user
*fence_ptr
;
2103 fence_ptr
= get_out_fence_for_crtc(crtc_state
->state
, crtc
);
2105 if (arg
->flags
& DRM_MODE_PAGE_FLIP_EVENT
|| fence_ptr
) {
2106 struct drm_pending_vblank_event
*e
;
2108 e
= create_vblank_event(crtc
, arg
->user_data
);
2112 crtc_state
->event
= e
;
2115 if (arg
->flags
& DRM_MODE_PAGE_FLIP_EVENT
) {
2116 struct drm_pending_vblank_event
*e
= crtc_state
->event
;
2121 ret
= drm_event_reserve_init(dev
, file_priv
, &e
->base
,
2125 crtc_state
->event
= NULL
;
2131 struct dma_fence
*fence
;
2132 struct drm_out_fence_state
*f
;
2134 f
= krealloc(*fence_state
, sizeof(**fence_state
) *
2135 (*num_fences
+ 1), GFP_KERNEL
);
2139 memset(&f
[*num_fences
], 0, sizeof(*f
));
2141 f
[*num_fences
].out_fence_ptr
= fence_ptr
;
2144 fence
= drm_crtc_create_fence(crtc
);
2148 ret
= setup_out_fence(&f
[(*num_fences
)++], fence
);
2150 dma_fence_put(fence
);
2154 crtc_state
->event
->base
.fence
= fence
;
2161 * Having this flag means user mode pends on event which will never
2162 * reach due to lack of at least one CRTC for signaling
2164 if (c
== 0 && (arg
->flags
& DRM_MODE_PAGE_FLIP_EVENT
))
2170 static void complete_crtc_signaling(struct drm_device
*dev
,
2171 struct drm_atomic_state
*state
,
2172 struct drm_out_fence_state
*fence_state
,
2173 unsigned int num_fences
,
2176 struct drm_crtc
*crtc
;
2177 struct drm_crtc_state
*crtc_state
;
2181 for (i
= 0; i
< num_fences
; i
++)
2182 fd_install(fence_state
[i
].fd
,
2183 fence_state
[i
].sync_file
->file
);
2189 for_each_new_crtc_in_state(state
, crtc
, crtc_state
, i
) {
2190 struct drm_pending_vblank_event
*event
= crtc_state
->event
;
2192 * Free the allocated event. drm_atomic_helper_setup_commit
2193 * can allocate an event too, so only free it if it's ours
2194 * to prevent a double free in drm_atomic_state_clear.
2196 if (event
&& (event
->base
.fence
|| event
->base
.file_priv
)) {
2197 drm_event_cancel_free(dev
, &event
->base
);
2198 crtc_state
->event
= NULL
;
2205 for (i
= 0; i
< num_fences
; i
++) {
2206 if (fence_state
[i
].sync_file
)
2207 fput(fence_state
[i
].sync_file
->file
);
2208 if (fence_state
[i
].fd
>= 0)
2209 put_unused_fd(fence_state
[i
].fd
);
2211 /* If this fails log error to the user */
2212 if (fence_state
[i
].out_fence_ptr
&&
2213 put_user(-1, fence_state
[i
].out_fence_ptr
))
2214 DRM_DEBUG_ATOMIC("Couldn't clear out_fence_ptr\n");
2220 int drm_mode_atomic_ioctl(struct drm_device
*dev
,
2221 void *data
, struct drm_file
*file_priv
)
2223 struct drm_mode_atomic
*arg
= data
;
2224 uint32_t __user
*objs_ptr
= (uint32_t __user
*)(unsigned long)(arg
->objs_ptr
);
2225 uint32_t __user
*count_props_ptr
= (uint32_t __user
*)(unsigned long)(arg
->count_props_ptr
);
2226 uint32_t __user
*props_ptr
= (uint32_t __user
*)(unsigned long)(arg
->props_ptr
);
2227 uint64_t __user
*prop_values_ptr
= (uint64_t __user
*)(unsigned long)(arg
->prop_values_ptr
);
2228 unsigned int copied_objs
, copied_props
;
2229 struct drm_atomic_state
*state
;
2230 struct drm_modeset_acquire_ctx ctx
;
2231 struct drm_plane
*plane
;
2232 struct drm_out_fence_state
*fence_state
;
2233 unsigned plane_mask
;
2235 unsigned int i
, j
, num_fences
;
2237 /* disallow for drivers not supporting atomic: */
2238 if (!drm_core_check_feature(dev
, DRIVER_ATOMIC
))
2241 /* disallow for userspace that has not enabled atomic cap (even
2242 * though this may be a bit overkill, since legacy userspace
2243 * wouldn't know how to call this ioctl)
2245 if (!file_priv
->atomic
)
2248 if (arg
->flags
& ~DRM_MODE_ATOMIC_FLAGS
)
2254 if ((arg
->flags
& DRM_MODE_PAGE_FLIP_ASYNC
) &&
2255 !dev
->mode_config
.async_page_flip
)
2258 /* can't test and expect an event at the same time. */
2259 if ((arg
->flags
& DRM_MODE_ATOMIC_TEST_ONLY
) &&
2260 (arg
->flags
& DRM_MODE_PAGE_FLIP_EVENT
))
2263 drm_modeset_acquire_init(&ctx
, DRM_MODESET_ACQUIRE_INTERRUPTIBLE
);
2265 state
= drm_atomic_state_alloc(dev
);
2269 state
->acquire_ctx
= &ctx
;
2270 state
->allow_modeset
= !!(arg
->flags
& DRM_MODE_ATOMIC_ALLOW_MODESET
);
2279 for (i
= 0; i
< arg
->count_objs
; i
++) {
2280 uint32_t obj_id
, count_props
;
2281 struct drm_mode_object
*obj
;
2283 if (get_user(obj_id
, objs_ptr
+ copied_objs
)) {
2288 obj
= drm_mode_object_find(dev
, file_priv
, obj_id
, DRM_MODE_OBJECT_ANY
);
2294 if (!obj
->properties
) {
2295 drm_mode_object_put(obj
);
2300 if (get_user(count_props
, count_props_ptr
+ copied_objs
)) {
2301 drm_mode_object_put(obj
);
2308 for (j
= 0; j
< count_props
; j
++) {
2310 uint64_t prop_value
;
2311 struct drm_property
*prop
;
2313 if (get_user(prop_id
, props_ptr
+ copied_props
)) {
2314 drm_mode_object_put(obj
);
2319 prop
= drm_mode_obj_find_prop_id(obj
, prop_id
);
2321 drm_mode_object_put(obj
);
2326 if (copy_from_user(&prop_value
,
2327 prop_values_ptr
+ copied_props
,
2328 sizeof(prop_value
))) {
2329 drm_mode_object_put(obj
);
2334 ret
= drm_atomic_set_property(state
, obj
, prop
,
2337 drm_mode_object_put(obj
);
2344 if (obj
->type
== DRM_MODE_OBJECT_PLANE
&& count_props
&&
2345 !(arg
->flags
& DRM_MODE_ATOMIC_TEST_ONLY
)) {
2346 plane
= obj_to_plane(obj
);
2347 plane_mask
|= (1 << drm_plane_index(plane
));
2348 plane
->old_fb
= plane
->fb
;
2350 drm_mode_object_put(obj
);
2353 ret
= prepare_crtc_signaling(dev
, state
, arg
, file_priv
, &fence_state
,
2358 if (arg
->flags
& DRM_MODE_ATOMIC_TEST_ONLY
) {
2359 ret
= drm_atomic_check_only(state
);
2360 } else if (arg
->flags
& DRM_MODE_ATOMIC_NONBLOCK
) {
2361 ret
= drm_atomic_nonblocking_commit(state
);
2363 if (unlikely(drm_debug
& DRM_UT_STATE
))
2364 drm_atomic_print_state(state
);
2366 ret
= drm_atomic_commit(state
);
2370 drm_atomic_clean_old_fb(dev
, plane_mask
, ret
);
2372 complete_crtc_signaling(dev
, state
, fence_state
, num_fences
, !ret
);
2374 if (ret
== -EDEADLK
) {
2375 drm_atomic_state_clear(state
);
2376 ret
= drm_modeset_backoff(&ctx
);
2381 drm_atomic_state_put(state
);
2383 drm_modeset_drop_locks(&ctx
);
2384 drm_modeset_acquire_fini(&ctx
);