From: Thomas Zimmermann <tzimmermann@suse.de>
To: Maxime Ripard <mripard@kernel.org>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>
Cc: "Daniel Stone" <daniels@collabora.com>,
"Harry Wentland" <harry.wentland@amd.com>,
"Jocelyn Falempe" <jfalempe@redhat.com>,
"Jonas Ådahl" <jadahl@redhat.com>,
"Michel Dänzer" <mdaenzer@redhat.com>,
"Pekka Paalanen" <pekka.paalanen@collabora.com>,
"Sebastian Wick" <sebastian.wick@redhat.com>,
"Simon Ser" <contact@emersion.fr>,
"Victoria Brekenfeld" <victoria@system76.com>,
"Xaver Hugl" <xaver.hugl@kde.org>,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 09/11] drm/atomic-uapi: Add DRM_MODE_ATOMIC_RESET flag
Date: Wed, 9 Sep 2026 09:13:13 +0200 [thread overview]
Message-ID: <70b689d2-5876-4bb6-a784-3c0bff2e4b4e@suse.de> (raw)
In-Reply-To: <20260908-drm-reset-state-flag-v3-9-905570f387a4@kernel.org>
Am 08.09.26 um 16:35 schrieb Maxime Ripard:
> From: Sebastian Wick <sebastian.wick@redhat.com>
>
> Userspace currently has no atomic way to reset all KMS object states
> to their defaults. To bring a display pipeline to a known state, a
> compositor must explicitly set every property on every object, which
> requires tracking which properties exist and what their defaults are.
>
> Introduce DRM_MODE_ATOMIC_RESET (0x0800) which, when passed to the
> atomic ioctl, fills the commit with default states for all KMS
> objects before applying the properties supplied in the request.
> Properties not explicitly included in the commit remain at their
> defaults (CRTCs inactive, planes disabled, connectors unbound, and
> so on).
>
> The flag cannot be combined with DRM_MODE_PAGE_FLIP_ASYNC, since a
> full state reset is incompatible with an async flip.
>
> Signed-off-by: Sebastian Wick <sebastian.wick@redhat.com>
> Co-developed-by: Maxime Ripard <mripard@kernel.org>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
> drivers/gpu/drm/drm_atomic.c | 3 +++
> drivers/gpu/drm/drm_atomic_uapi.c | 13 +++++++++++++
> drivers/gpu/drm/drm_ioctl.c | 3 +++
> include/uapi/drm/drm.h | 10 ++++++++++
> include/uapi/drm/drm_mode.h | 14 +++++++++++++-
> 5 files changed, 42 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> index 4c15757308d6..d5b3a7d99239 100644
> --- a/drivers/gpu/drm/drm_atomic.c
> +++ b/drivers/gpu/drm/drm_atomic.c
> @@ -1625,10 +1625,13 @@ EXPORT_SYMBOL(drm_atomic_get_new_bridge_state);
> * the current state.
> *
> * Color operations are not checked because they always use
> * drm_atomic_helper_colorop_create_state() and do not have a per-driver hook.
> *
> + * This is used to report the %DRM_CAP_ATOMIC_RESET capability to userspace,
> + * and as a precondition in drm_atomic_commit_fill_with_defaults().
> + *
> * Returns:
> * True if all objects implement atomic_create_state, false otherwise.
> */
> bool drm_atomic_can_create_state(struct drm_device *dev)
> {
> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> index d52504d823bc..fe794a65a727 100644
> --- a/drivers/gpu/drm/drm_atomic_uapi.c
> +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> @@ -1665,10 +1665,17 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
> drm_dbg_atomic(dev,
> "commit failed: page-flip event requested with test-only commit\n");
> return -EINVAL;
> }
>
> + if ((arg->flags & DRM_MODE_ATOMIC_RESET) &&
> + (arg->flags & DRM_MODE_PAGE_FLIP_ASYNC)) {
> + drm_dbg_atomic(dev,
> + "commit failed: reset cannot be combined with async flip\n");
> + return -EINVAL;
> + }
> +
> state = drm_atomic_commit_alloc(dev);
> if (!state)
> return -ENOMEM;
>
> drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
> @@ -1680,10 +1687,16 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
> copied_objs = 0;
> copied_props = 0;
> fence_state = NULL;
> num_fences = 0;
>
> + if (arg->flags & DRM_MODE_ATOMIC_RESET) {
> + ret = drm_atomic_commit_fill_with_defaults(state);
> + if (ret)
> + goto out;
> + }
> +
> for (i = 0; i < arg->count_objs; i++) {
> uint32_t obj_id, count_props;
> struct drm_mode_object *obj;
>
> if (get_user(obj_id, objs_ptr + copied_objs)) {
> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
> index 0dbf04d4aa9e..f13bb7c490c4 100644
> --- a/drivers/gpu/drm/drm_ioctl.c
> +++ b/drivers/gpu/drm/drm_ioctl.c
> @@ -303,10 +303,13 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_
> break;
> case DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP:
> req->value = drm_core_check_feature(dev, DRIVER_ATOMIC) &&
> dev->mode_config.async_page_flip;
> break;
> + case DRM_CAP_ATOMIC_RESET:
> + req->value = drm_atomic_can_create_state(dev);
> + break;
> default:
> return -EINVAL;
> }
> return 0;
> }
> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
> index bc7ef7684099..b6e2f2edd122 100644
> --- a/include/uapi/drm/drm.h
> +++ b/include/uapi/drm/drm.h
> @@ -793,10 +793,20 @@ struct drm_gem_change_handle {
> * If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC for atomic
> * commits.
> */
> #define DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP 0x15
>
> +/**
> + * DRM_CAP_ATOMIC_RESET
> + *
> + * If set to 1, the driver supports the &DRM_MODE_ATOMIC_RESET flag in
> + * &DRM_IOCTL_MODE_ATOMIC commits. When supported, userspace can pass that
> + * flag to reset all KMS object states to their defaults before applying
> + * property changes.
> + */
> +#define DRM_CAP_ATOMIC_RESET 0x16
> +
> /* DRM_IOCTL_GET_CAP ioctl argument type */
> struct drm_get_cap {
> __u64 capability;
> __u64 value;
> };
> diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
> index ed1a660a3dfd..32eb3f650d7a 100644
> --- a/include/uapi/drm/drm_mode.h
> +++ b/include/uapi/drm/drm_mode.h
> @@ -1326,10 +1326,21 @@ struct drm_mode_destroy_dumb {
> * To the best of the driver's knowledge, visual artifacts are guaranteed to
> * not appear when this flag is not set. Some sinks might display visual
> * artifacts outside of the driver's control.
> */
> #define DRM_MODE_ATOMIC_ALLOW_MODESET 0x0400
> +/**
> + * DRM_MODE_ATOMIC_RESET
> + *
> + * Reset all KMS object states (CRTCs, planes, connectors, color operations)
> + * to their default values before applying the properties in this commit.
> + * Properties not explicitly included in the commit will remain at their
> + * defaults (CRTCs inactive, planes disabled, connectors unbound, etc.).
> + *
> + * This flag cannot be combined with &DRM_MODE_PAGE_FLIP_ASYNC.
> + */
> +#define DRM_MODE_ATOMIC_RESET 0x0800
>
> /**
> * DRM_MODE_ATOMIC_FLAGS
> *
> * Bitfield of flags accepted by the &DRM_IOCTL_MODE_ATOMIC IOCTL in
> @@ -1338,11 +1349,12 @@ struct drm_mode_destroy_dumb {
> #define DRM_MODE_ATOMIC_FLAGS (\
> DRM_MODE_PAGE_FLIP_EVENT |\
> DRM_MODE_PAGE_FLIP_ASYNC |\
> DRM_MODE_ATOMIC_TEST_ONLY |\
> DRM_MODE_ATOMIC_NONBLOCK |\
> - DRM_MODE_ATOMIC_ALLOW_MODESET)
> + DRM_MODE_ATOMIC_ALLOW_MODESET |\
> + DRM_MODE_ATOMIC_RESET)
>
> struct drm_mode_atomic {
> __u32 flags;
> __u32 count_objs;
> __u64 objs_ptr;
>
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, (HRB 36809, AG Nürnberg)
next prev parent reply other threads:[~2026-09-09 7:13 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-08 14:35 [PATCH v3 00/11] drm: " Maxime Ripard
2026-09-08 14:35 ` [PATCH v3 01/11] drm/atomic: colorop: Rename state to state_to_destroy Maxime Ripard
2026-09-09 6:28 ` Thomas Zimmermann
2026-09-11 13:27 ` (subset) " Maxime Ripard
2026-09-08 14:35 ` [PATCH v3 02/11] drm/atomic: Create function to insert CRTC state into a commit Maxime Ripard
2026-09-09 6:30 ` Thomas Zimmermann
2026-09-08 14:35 ` [PATCH v3 03/11] drm/atomic: Create function to insert plane " Maxime Ripard
2026-09-09 6:34 ` Thomas Zimmermann
2026-09-08 14:35 ` [PATCH v3 04/11] drm/atomic: Create function to insert colorop " Maxime Ripard
2026-09-09 6:35 ` Thomas Zimmermann
2026-09-08 14:35 ` [PATCH v3 05/11] drm/atomic: Create function to insert private obj " Maxime Ripard
2026-09-09 6:46 ` Thomas Zimmermann
2026-09-08 14:35 ` [PATCH v3 06/11] drm/atomic: Create function to insert connector " Maxime Ripard
2026-09-09 6:52 ` Thomas Zimmermann
2026-09-08 14:35 ` [PATCH v3 07/11] drm/atomic: Add drm_atomic_can_create_state() helper Maxime Ripard
2026-09-09 6:58 ` Thomas Zimmermann
2026-09-08 14:35 ` [PATCH v3 08/11] drm/atomic: Allow filling a commit with pristine object states Maxime Ripard
2026-09-09 7:11 ` Thomas Zimmermann
2026-09-08 14:35 ` [PATCH v3 09/11] drm/atomic-uapi: Add DRM_MODE_ATOMIC_RESET flag Maxime Ripard
2026-09-09 7:13 ` Thomas Zimmermann [this message]
2026-09-09 7:24 ` Thomas Zimmermann
2026-09-09 8:22 ` Maxime Ripard
2026-09-08 14:35 ` [PATCH v3 10/11] drm/vkms: Switch container_of helpers to container_of_const Maxime Ripard
2026-09-08 14:35 ` [PATCH v3 11/11] drm/vkms: Add driver-specific plane property for testing Maxime Ripard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=70b689d2-5876-4bb6-a784-3c0bff2e4b4e@suse.de \
--to=tzimmermann@suse.de \
--cc=airlied@gmail.com \
--cc=contact@emersion.fr \
--cc=daniels@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=harry.wentland@amd.com \
--cc=jadahl@redhat.com \
--cc=jfalempe@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mdaenzer@redhat.com \
--cc=mripard@kernel.org \
--cc=pekka.paalanen@collabora.com \
--cc=sebastian.wick@redhat.com \
--cc=simona@ffwll.ch \
--cc=victoria@system76.com \
--cc=xaver.hugl@kde.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®