dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Maxime Ripard <mripard@kernel.org>
To: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	 Thomas Zimmermann <tzimmermann@suse.de>,
	David Airlie <airlied@gmail.com>,
	 Simona Vetter <simona@ffwll.ch>
Cc: dri-devel@lists.freedesktop.org, Maxime Ripard <mripard@kernel.org>
Subject: [PATCH v2 03/16] drm/atomic: Add new atomic_create_state callback to drm_private_obj
Date: Tue, 14 Oct 2025 11:31:47 +0200	[thread overview]
Message-ID: <20251014-drm-private-obj-reset-v2-3-6dd60e985e9d@kernel.org> (raw)
In-Reply-To: <20251014-drm-private-obj-reset-v2-0-6dd60e985e9d@kernel.org>

The drm_private_obj initialization was inconsistent with the rest of the
KMS objects. Indeed, it required to pass a preallocated state in
drm_private_obj_init(), while all the others objects would have a reset
callback that would be called later on to create the state.

However, reset really is meant to reset the hardware and software state.
That it creates an initial state is a side-effect that has been used in
all objects but drm_private_obj. This is made more complex since some
drm_private_obj, the DisplayPort ones in particular, need to be
persistent across and suspend/resume cycle, and such a cycle would call
drm_mode_config_reset().

Thus, we need to add a new callback to allocate a pristine state for a
given private object.

This discussion has also came up during the atomic state readout
discussion, so it might be introduced into the other objects later on.

Until all drivers are converted to that new allocation pattern, we will
only call it if the passed state is NULL. This will be removed
eventually.

Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
 drivers/gpu/drm/drm_atomic.c | 20 ++++++++++++++++++--
 include/drm/drm_atomic.h     | 13 +++++++++++++
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index a5c5617266ae1dfe6038baeee6dfa3828c626683..36b56c71cb4e1ddc57577df724efe7d89b4fb6a9 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -793,15 +793,31 @@ int drm_atomic_private_obj_init(struct drm_device *dev,
 	memset(obj, 0, sizeof(*obj));
 
 	drm_modeset_lock_init(&obj->lock);
 
 	obj->dev = dev;
-	obj->state = state;
 	obj->funcs = funcs;
 	list_add_tail(&obj->head, &dev->mode_config.privobj_list);
 
-	state->obj = obj;
+	/*
+	 * Not all users of drm_atomic_private_obj_init have been
+	 * converted to using &drm_private_obj_funcs.reset yet. For the
+	 * time being, let's only call reset if the passed state is
+	 * NULL. Otherwise, we will fallback to the previous behaviour.
+	 */
+	if (!state) {
+		if (obj->funcs->atomic_create_state) {
+			state = obj->funcs->atomic_create_state(obj);
+			if (IS_ERR(state))
+				return PTR_ERR(state);
+
+			obj->state = state;
+		}
+	} else {
+		obj->state = state;
+		state->obj = obj;
+	}
 
 	return 0;
 }
 EXPORT_SYMBOL(drm_atomic_private_obj_init);
 
diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
index 9b3fb98b1e88c38877abdcb9df4d1c9540768833..10a71c4b6afc316f07023756be4cd3ed1d1d2974 100644
--- a/include/drm/drm_atomic.h
+++ b/include/drm/drm_atomic.h
@@ -205,10 +205,23 @@ struct drm_private_state;
  * added to the atomic states is expected to have an implementation of these
  * hooks and pass a pointer to its drm_private_state_funcs struct to
  * drm_atomic_get_private_obj_state().
  */
 struct drm_private_state_funcs {
+	/**
+	 * @atomic_create_state:
+	 *
+	 * Allocates a pristine, initialized, state for the private
+	 * object and returns it.
+	 *
+	 * RETURNS:
+	 *
+	 * A new, pristine, private state instance or an error pointer
+	 * on failure.
+	 */
+	struct drm_private_state *(*atomic_create_state)(struct drm_private_obj *obj);
+
 	/**
 	 * @atomic_duplicate_state:
 	 *
 	 * Duplicate the current state of the private object and return it. It
 	 * is an error to call this before obj->state has been initialized.

-- 
2.51.0


  parent reply	other threads:[~2025-10-14 12:00 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-14  9:31 [PATCH v2 00/16] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
2025-10-14  9:31 ` [PATCH v2 01/16] drm/atomic: Add dev pointer to drm_private_obj Maxime Ripard
2025-10-21  8:16   ` Luca Ceresoli
2025-12-08 15:37   ` (subset) " Maxime Ripard
2025-10-14  9:31 ` [PATCH v2 02/16] drm/atomic: Make drm_atomic_private_obj_init fallible Maxime Ripard
2025-10-14  9:31 ` Maxime Ripard [this message]
2025-10-14 22:49   ` [PATCH v2 03/16] drm/atomic: Add new atomic_create_state callback to drm_private_obj Dmitry Baryshkov
2025-10-15  0:17     ` Dmitry Baryshkov
2025-10-21  8:17       ` Luca Ceresoli
2025-12-08 15:48     ` Maxime Ripard
2025-10-14  9:31 ` [PATCH v2 04/16] drm/atomic-helper: Add private_obj atomic_create_state helper Maxime Ripard
2025-10-15  0:16   ` Dmitry Baryshkov
2025-10-14  9:31 ` [PATCH v2 05/16] drm/bridge: Switch private_obj initialization to atomic_create_state Maxime Ripard
2025-10-21  8:17   ` Luca Ceresoli
2025-12-08 15:43     ` Maxime Ripard
2025-10-14  9:31 ` [PATCH v2 06/16] drm/dp_mst: " Maxime Ripard
2025-10-14  9:31 ` [PATCH v2 07/16] drm/dp_tunnel: " Maxime Ripard
2025-10-14  9:31 ` [PATCH v2 08/16] drm/amdgpu: " Maxime Ripard
2025-10-14  9:31 ` [PATCH v2 09/16] drm/arm: komeda: " Maxime Ripard
2025-10-14  9:31 ` [PATCH v2 10/16] drm/ingenic: " Maxime Ripard
2025-10-14  9:31 ` [PATCH v2 11/16] drm/msm: mdp5: " Maxime Ripard
2025-10-15  0:52   ` Dmitry Baryshkov
2025-10-14  9:31 ` [PATCH v2 12/16] drm/msm: dpu1: " Maxime Ripard
2025-10-15  0:52   ` Dmitry Baryshkov
2025-10-14  9:31 ` [PATCH v2 13/16] drm/omapdrm: " Maxime Ripard
2025-10-14  9:31 ` [PATCH v2 14/16] drm/tegra: " Maxime Ripard
2025-10-14  9:31 ` [PATCH v2 15/16] drm/vc4: " Maxime Ripard
2025-10-14  9:32 ` [PATCH v2 16/16] drm/atomic: Remove state argument to drm_atomic_private_obj_init 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=20251014-drm-private-obj-reset-v2-3-6dd60e985e9d@kernel.org \
    --to=mripard@kernel.org \
    --cc=airlied@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=simona@ffwll.ch \
    --cc=tzimmermann@suse.de \
    /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