* [PATCH v3 01/15] drm/atomic: Make drm_atomic_private_obj_init fallible
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
@ 2026-01-19 12:49 ` Maxime Ripard
2026-01-19 12:49 ` [PATCH v3 02/15] drm/atomic: Add new atomic_create_state callback to drm_private_obj Maxime Ripard
` (13 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:49 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Ville Syrjälä
Since we're going to move the drm_private_obj state allocation to a
callback, we need to be able to deal with its possible failure.
Make drm_private_obj_init return an error code on failure.
Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
drivers/gpu/drm/drm_atomic.c | 14 +++++++++-----
include/drm/drm_atomic.h | 8 ++++----
2 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 52738b80ddbeb124896f6124df5628e2ac27faa4..4191a8333fc4ebdfc10f664c837a3f1693eff022 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -925,16 +925,18 @@ static void drm_atomic_plane_print_state(struct drm_printer *p,
* @funcs: pointer to the struct of function pointers that identify the object
* type
*
* Initialize the private object, which can be embedded into any
* driver private object that needs its own atomic state.
+ *
+ * RETURNS:
+ * Zero on success, error code on failure
*/
-void
-drm_atomic_private_obj_init(struct drm_device *dev,
- struct drm_private_obj *obj,
- struct drm_private_state *state,
- const struct drm_private_state_funcs *funcs)
+int drm_atomic_private_obj_init(struct drm_device *dev,
+ struct drm_private_obj *obj,
+ struct drm_private_state *state,
+ const struct drm_private_state_funcs *funcs)
{
memset(obj, 0, sizeof(*obj));
drm_modeset_lock_init(&obj->lock);
@@ -942,10 +944,12 @@ drm_atomic_private_obj_init(struct drm_device *dev,
obj->state = state;
obj->funcs = funcs;
list_add_tail(&obj->head, &dev->mode_config.privobj_list);
state->obj = obj;
+
+ return 0;
}
EXPORT_SYMBOL(drm_atomic_private_obj_init);
/**
* drm_atomic_private_obj_fini - finalize private object
diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
index 178f8f62c80fc58fe42e8564a716da1a99ddb7da..712f5fb977bff8a15592a3949444d9ac306e6c54 100644
--- a/include/drm/drm_atomic.h
+++ b/include/drm/drm_atomic.h
@@ -721,14 +721,14 @@ drm_atomic_get_new_colorop_state(struct drm_atomic_state *state,
struct drm_connector_state * __must_check
drm_atomic_get_connector_state(struct drm_atomic_state *state,
struct drm_connector *connector);
-void drm_atomic_private_obj_init(struct drm_device *dev,
- struct drm_private_obj *obj,
- struct drm_private_state *state,
- const struct drm_private_state_funcs *funcs);
+int drm_atomic_private_obj_init(struct drm_device *dev,
+ struct drm_private_obj *obj,
+ struct drm_private_state *state,
+ const struct drm_private_state_funcs *funcs);
void drm_atomic_private_obj_fini(struct drm_private_obj *obj);
struct drm_private_state * __must_check
drm_atomic_get_private_obj_state(struct drm_atomic_state *state,
struct drm_private_obj *obj);
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v3 02/15] drm/atomic: Add new atomic_create_state callback to drm_private_obj
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
2026-01-19 12:49 ` [PATCH v3 01/15] drm/atomic: Make drm_atomic_private_obj_init fallible Maxime Ripard
@ 2026-01-19 12:49 ` Maxime Ripard
2026-01-19 17:25 ` Dmitry Baryshkov
2026-01-19 12:49 ` [PATCH v3 03/15] drm/atomic-helper: Add private_obj atomic_create_state helper Maxime Ripard
` (12 subsequent siblings)
14 siblings, 1 reply; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:49 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard
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 | 18 ++++++++++++++++--
include/drm/drm_atomic.h | 13 +++++++++++++
2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 4191a8333fc4ebdfc10f664c837a3f1693eff022..e3029c8f02e5a3698781117bcc80eff98407cf16 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -939,15 +939,29 @@ 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.atomic_create_state 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) {
+ 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 712f5fb977bff8a15592a3949444d9ac306e6c54..0b1b32bcd2bda1b92299fd369ba7c23b1c2d3dfa 100644
--- a/include/drm/drm_atomic.h
+++ b/include/drm/drm_atomic.h
@@ -259,10 +259,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.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 02/15] drm/atomic: Add new atomic_create_state callback to drm_private_obj
2026-01-19 12:49 ` [PATCH v3 02/15] drm/atomic: Add new atomic_create_state callback to drm_private_obj Maxime Ripard
@ 2026-01-19 17:25 ` Dmitry Baryshkov
0 siblings, 0 replies; 24+ messages in thread
From: Dmitry Baryshkov @ 2026-01-19 17:25 UTC (permalink / raw)
To: Maxime Ripard
Cc: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
dri-devel
On Mon, Jan 19, 2026 at 01:49:58PM +0100, Maxime Ripard wrote:
> 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 | 18 ++++++++++++++++--
> include/drm/drm_atomic.h | 13 +++++++++++++
> 2 files changed, 29 insertions(+), 2 deletions(-)
>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 03/15] drm/atomic-helper: Add private_obj atomic_create_state helper
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
2026-01-19 12:49 ` [PATCH v3 01/15] drm/atomic: Make drm_atomic_private_obj_init fallible Maxime Ripard
2026-01-19 12:49 ` [PATCH v3 02/15] drm/atomic: Add new atomic_create_state callback to drm_private_obj Maxime Ripard
@ 2026-01-19 12:49 ` Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 04/15] drm/bridge: Switch private_obj initialization to atomic_create_state Maxime Ripard
` (11 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:49 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Dmitry Baryshkov
Now that we have an atomic_create_state callback for drm_private_objs,
we can provide a helper for it.
It's somewhat different from the other similar helpers though, because
we definitely expect drm_private_obj to be subclassed. It wouldn't make
sense for a driver to use it as-is.
So we can't provide a straight implementation of the atomic_create_state
callback, but rather we provide the parts that will deal with the
drm_private_obj initialization, and we will leave the allocation and
initialization of the subclass to drivers.
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
drivers/gpu/drm/drm_atomic_state_helper.c | 22 ++++++++++++++++++++++
include/drm/drm_atomic_state_helper.h | 3 +++
2 files changed, 25 insertions(+)
diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c
index cee6d8fc44adda6895542d33157d965a2d3c815f..d21f32f0ad51f4305f75d01be58dc404acf7674c 100644
--- a/drivers/gpu/drm/drm_atomic_state_helper.c
+++ b/drivers/gpu/drm/drm_atomic_state_helper.c
@@ -712,10 +712,32 @@ void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
__drm_atomic_helper_connector_destroy_state(state);
kfree(state);
}
EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state);
+/**
+ * __drm_atomic_helper_private_obj_create_state - initializes private object state
+ * @obj: private object
+ * @state: new state to initialize
+ *
+ * Initializes the newly allocated @state, usually required when
+ * initializing the drivers.
+ *
+ * @obj is assumed to be zeroed.
+ *
+ * This is useful for drivers that use private states.
+ */
+void __drm_atomic_helper_private_obj_create_state(struct drm_private_obj *obj,
+ struct drm_private_state *state)
+{
+ if (state)
+ state->obj = obj;
+
+ obj->state = state;
+}
+EXPORT_SYMBOL(__drm_atomic_helper_private_obj_create_state);
+
/**
* __drm_atomic_helper_private_obj_duplicate_state - copy atomic private state
* @obj: CRTC object
* @state: new private object state
*
diff --git a/include/drm/drm_atomic_state_helper.h b/include/drm/drm_atomic_state_helper.h
index b9740edb26586d58f99a5223902bb8e333ac75a2..900672c6ea90ba9cb87e38a7c84225972aee43c5 100644
--- a/include/drm/drm_atomic_state_helper.h
+++ b/include/drm/drm_atomic_state_helper.h
@@ -82,10 +82,13 @@ struct drm_connector_state *
drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector);
void
__drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state);
void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
struct drm_connector_state *state);
+
+void __drm_atomic_helper_private_obj_create_state(struct drm_private_obj *obj,
+ struct drm_private_state *state);
void __drm_atomic_helper_private_obj_duplicate_state(struct drm_private_obj *obj,
struct drm_private_state *state);
void __drm_atomic_helper_bridge_duplicate_state(struct drm_bridge *bridge,
struct drm_bridge_state *state);
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v3 04/15] drm/bridge: Switch private_obj initialization to atomic_create_state
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (2 preceding siblings ...)
2026-01-19 12:49 ` [PATCH v3 03/15] drm/atomic-helper: Add private_obj atomic_create_state helper Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-20 9:43 ` kernel test robot
2026-01-19 12:50 ` [PATCH v3 05/15] drm/dp_mst: " Maxime Ripard
` (10 subsequent siblings)
14 siblings, 1 reply; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Dmitry Baryshkov, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec
The bridge implementation relies on a drm_private_obj, that is
initialized by allocating and initializing a state, and then passing it
to drm_private_obj_init.
Since we're gradually moving away from that pattern to the more
established one relying on a atomic_create_state implementation, let's
migrate this instance to the new pattern.
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Andrzej Hajda <andrzej.hajda@intel.com>
Cc: Neil Armstrong <neil.armstrong@linaro.org>
Cc: Robert Foss <rfoss@kernel.org>
Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
Cc: Jonas Karlman <jonas@kwiboo.se>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
---
drivers/gpu/drm/drm_bridge.c | 33 ++++++++++++++++++---------------
1 file changed, 18 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
index 6dcf8f6d3ecfa6f689dcf71dbc9bdac4dad7fd9c..316cf84519de54c4dc4bfb3bc3addc4990a200f5 100644
--- a/drivers/gpu/drm/drm_bridge.c
+++ b/drivers/gpu/drm/drm_bridge.c
@@ -458,11 +458,27 @@ drm_bridge_atomic_destroy_priv_state(struct drm_private_obj *obj,
struct drm_bridge *bridge = drm_priv_to_bridge(obj);
bridge->funcs->atomic_destroy_state(bridge, state);
}
+static struct drm_private_state *
+drm_bridge_atomic_create_priv_state(struct drm_private_obj *obj)
+{
+ struct drm_bridge *bridge = drm_priv_to_bridge(obj);
+ struct drm_bridge_state *state;
+
+ state = bridge->funcs->atomic_reset(bridge);
+ if (IS_ERR(state))
+ return ERR_CAST(state);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &state->base);
+
+ return &state->base;
+}
+
static const struct drm_private_state_funcs drm_bridge_priv_state_funcs = {
+ .atomic_create_state = drm_bridge_atomic_create_priv_state,
.atomic_duplicate_state = drm_bridge_atomic_duplicate_priv_state,
.atomic_destroy_state = drm_bridge_atomic_destroy_priv_state,
};
static bool drm_bridge_is_atomic(struct drm_bridge *bridge)
@@ -535,30 +551,17 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
ret = bridge->funcs->attach(bridge, encoder, flags);
if (ret < 0)
goto err_reset_bridge;
}
- if (drm_bridge_is_atomic(bridge)) {
- struct drm_bridge_state *state;
-
- state = bridge->funcs->atomic_reset(bridge);
- if (IS_ERR(state)) {
- ret = PTR_ERR(state);
- goto err_detach_bridge;
- }
-
+ if (drm_bridge_is_atomic(bridge))
drm_atomic_private_obj_init(bridge->dev, &bridge->base,
- &state->base,
+ NULL,
&drm_bridge_priv_state_funcs);
- }
return 0;
-err_detach_bridge:
- if (bridge->funcs->detach)
- bridge->funcs->detach(bridge);
-
err_reset_bridge:
bridge->dev = NULL;
bridge->encoder = NULL;
list_del(&bridge->chain_node);
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 04/15] drm/bridge: Switch private_obj initialization to atomic_create_state
2026-01-19 12:50 ` [PATCH v3 04/15] drm/bridge: Switch private_obj initialization to atomic_create_state Maxime Ripard
@ 2026-01-20 9:43 ` kernel test robot
0 siblings, 0 replies; 24+ messages in thread
From: kernel test robot @ 2026-01-20 9:43 UTC (permalink / raw)
To: Maxime Ripard, Maarten Lankhorst, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: llvm, oe-kbuild-all, dri-devel, Maxime Ripard, Dmitry Baryshkov,
Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
Jonas Karlman, Jernej Skrabec
Hi Maxime,
kernel test robot noticed the following build errors:
[auto build test ERROR on b36178488d479e9a53bbef2b01280378b5586e60]
url: https://github.com/intel-lab-lkp/linux/commits/Maxime-Ripard/drm-atomic-Make-drm_atomic_private_obj_init-fallible/20260119-205337
base: b36178488d479e9a53bbef2b01280378b5586e60
patch link: https://lore.kernel.org/r/20260119-drm-private-obj-reset-v3-4-b931abe3a5e3%40redhat.com
patch subject: [PATCH v3 04/15] drm/bridge: Switch private_obj initialization to atomic_create_state
config: x86_64-rhel-9.4-rust (https://download.01.org/0day-ci/archive/20260120/202601201722.632RZYWZ-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
rustc: rustc 1.88.0 (6b00bc388 2025-06-23)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260120/202601201722.632RZYWZ-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601201722.632RZYWZ-lkp@intel.com/
All errors (new ones prefixed by >>):
>> depmod: ERROR: Cycle detected: drm -> drm_kms_helper -> drm
depmod: ERROR: Found 2 modules in dependency cycles!
make[3]: *** [scripts/Makefile.modinst:132: depmod] Error 1
make[3]: Target '__modinst' not remade because of errors.
make[2]: *** [Makefile:1960: modules_install] Error 2
make[1]: *** [Makefile:248: __sub-make] Error 2
make[1]: Target 'modules_install' not remade because of errors.
make: *** [Makefile:248: __sub-make] Error 2
make: Target 'modules_install' not remade because of errors.
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 05/15] drm/dp_mst: Switch private_obj initialization to atomic_create_state
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (3 preceding siblings ...)
2026-01-19 12:50 ` [PATCH v3 04/15] drm/bridge: Switch private_obj initialization to atomic_create_state Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-19 19:48 ` Dmitry Baryshkov
2026-01-19 12:50 ` [PATCH v3 06/15] drm/dp_tunnel: " Maxime Ripard
` (9 subsequent siblings)
14 siblings, 1 reply; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard
The DP MST implementation relies on a drm_private_obj, that is
initialized by allocating and initializing a state, and then passing it
to drm_private_obj_init.
Since we're gradually moving away from that pattern to the more
established one relying on a atomic_create_state implementation, let's
migrate this instance to the new pattern.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
drivers/gpu/drm/display/drm_dp_mst_topology.c | 37 +++++++++++++++++----------
1 file changed, 24 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c
index be749dcad3b585d475730c4246b0eb9f2759dd27..1ab0233a2a18f784d8c43e61b94e40a06bd4baf6 100644
--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
@@ -5182,10 +5182,32 @@ static void drm_dp_mst_destroy_state(struct drm_private_obj *obj,
kfree(mst_state->commit_deps);
kfree(mst_state);
}
+static struct drm_private_state *
+drm_dp_mst_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct drm_dp_mst_topology_mgr *mgr =
+ to_dp_mst_topology_mgr(obj);
+ struct drm_dp_mst_topology_state *mst_state;
+
+ mst_state = kzalloc(sizeof(*mst_state), GFP_KERNEL);
+ if (!mst_state)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &mst_state->base);
+
+ mst_state->total_avail_slots = 63;
+ mst_state->start_slot = 1;
+
+ mst_state->mgr = mgr;
+ INIT_LIST_HEAD(&mst_state->payloads);
+
+ return &mst_state->base;
+}
+
static bool drm_dp_mst_port_downstream_of_branch(struct drm_dp_mst_port *port,
struct drm_dp_mst_branch *branch)
{
while (port->parent) {
if (port->parent == branch)
@@ -5618,10 +5640,11 @@ int drm_dp_mst_atomic_check(struct drm_atomic_state *state)
return ret;
}
EXPORT_SYMBOL(drm_dp_mst_atomic_check);
const struct drm_private_state_funcs drm_dp_mst_topology_state_funcs = {
+ .atomic_create_state = drm_dp_mst_atomic_create_state,
.atomic_duplicate_state = drm_dp_mst_duplicate_state,
.atomic_destroy_state = drm_dp_mst_destroy_state,
};
EXPORT_SYMBOL(drm_dp_mst_topology_state_funcs);
@@ -5706,12 +5729,10 @@ EXPORT_SYMBOL(drm_atomic_get_new_mst_topology_state);
int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
struct drm_device *dev, struct drm_dp_aux *aux,
int max_dpcd_transaction_bytes, int max_payloads,
int conn_base_id)
{
- struct drm_dp_mst_topology_state *mst_state;
-
mutex_init(&mgr->lock);
mutex_init(&mgr->qlock);
mutex_init(&mgr->delayed_destroy_lock);
mutex_init(&mgr->up_req_lock);
mutex_init(&mgr->probe_lock);
@@ -5741,22 +5762,12 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
mgr->aux = aux;
mgr->max_dpcd_transaction_bytes = max_dpcd_transaction_bytes;
mgr->max_payloads = max_payloads;
mgr->conn_base_id = conn_base_id;
- mst_state = kzalloc(sizeof(*mst_state), GFP_KERNEL);
- if (mst_state == NULL)
- return -ENOMEM;
-
- mst_state->total_avail_slots = 63;
- mst_state->start_slot = 1;
-
- mst_state->mgr = mgr;
- INIT_LIST_HEAD(&mst_state->payloads);
-
drm_atomic_private_obj_init(dev, &mgr->base,
- &mst_state->base,
+ NULL,
&drm_dp_mst_topology_state_funcs);
return 0;
}
EXPORT_SYMBOL(drm_dp_mst_topology_mgr_init);
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 05/15] drm/dp_mst: Switch private_obj initialization to atomic_create_state
2026-01-19 12:50 ` [PATCH v3 05/15] drm/dp_mst: " Maxime Ripard
@ 2026-01-19 19:48 ` Dmitry Baryshkov
0 siblings, 0 replies; 24+ messages in thread
From: Dmitry Baryshkov @ 2026-01-19 19:48 UTC (permalink / raw)
To: Maxime Ripard
Cc: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
dri-devel
On Mon, Jan 19, 2026 at 01:50:01PM +0100, Maxime Ripard wrote:
> The DP MST implementation relies on a drm_private_obj, that is
> initialized by allocating and initializing a state, and then passing it
> to drm_private_obj_init.
>
> Since we're gradually moving away from that pattern to the more
> established one relying on a atomic_create_state implementation, let's
> migrate this instance to the new pattern.
>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
> ---
> drivers/gpu/drm/display/drm_dp_mst_topology.c | 37 +++++++++++++++++----------
> 1 file changed, 24 insertions(+), 13 deletions(-)
>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 06/15] drm/dp_tunnel: Switch private_obj initialization to atomic_create_state
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (4 preceding siblings ...)
2026-01-19 12:50 ` [PATCH v3 05/15] drm/dp_mst: " Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-19 17:29 ` Dmitry Baryshkov
2026-01-19 12:50 ` [PATCH v3 07/15] drm/amdgpu: " Maxime Ripard
` (8 subsequent siblings)
14 siblings, 1 reply; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard
The DP tunnel implementation relies on a drm_private_obj, that is
initialized by allocating and initializing a state, and then passing it
to drm_private_obj_init.
Since we're gradually moving away from that pattern to the more
established one relying on a atomic_create_state implementation, let's
migrate this instance to the new pattern.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
drivers/gpu/drm/display/drm_dp_tunnel.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/display/drm_dp_tunnel.c b/drivers/gpu/drm/display/drm_dp_tunnel.c
index 43f13a7c79b931beb230f8afe20afa0ebcf5ed8d..2abd714efd19f27697770813b38194e384be87ce 100644
--- a/drivers/gpu/drm/display/drm_dp_tunnel.c
+++ b/drivers/gpu/drm/display/drm_dp_tunnel.c
@@ -1495,11 +1495,26 @@ tunnel_group_duplicate_state(struct drm_private_obj *obj)
static void tunnel_group_destroy_state(struct drm_private_obj *obj, struct drm_private_state *state)
{
free_group_state(to_group_state(state));
}
+static struct drm_private_state * tunnel_group_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct drm_dp_tunnel_group_state *group_state;
+
+ group_state = kzalloc(sizeof(*group_state), GFP_KERNEL);
+ if (!group_state)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &group_state->base);
+ INIT_LIST_HEAD(&group_state->tunnel_states);
+
+ return &group_state->base;
+}
+
static const struct drm_private_state_funcs tunnel_group_funcs = {
+ .atomic_create_state = tunnel_group_atomic_create_state,
.atomic_duplicate_state = tunnel_group_duplicate_state,
.atomic_destroy_state = tunnel_group_destroy_state,
};
/**
@@ -1579,23 +1594,15 @@ drm_dp_tunnel_atomic_get_new_state(struct drm_atomic_state *state,
}
EXPORT_SYMBOL(drm_dp_tunnel_atomic_get_new_state);
static bool init_group(struct drm_dp_tunnel_mgr *mgr, struct drm_dp_tunnel_group *group)
{
- struct drm_dp_tunnel_group_state *group_state;
-
- group_state = kzalloc(sizeof(*group_state), GFP_KERNEL);
- if (!group_state)
- return false;
-
- INIT_LIST_HEAD(&group_state->tunnel_states);
-
group->mgr = mgr;
group->available_bw = -1;
INIT_LIST_HEAD(&group->tunnels);
- drm_atomic_private_obj_init(mgr->dev, &group->base, &group_state->base,
+ drm_atomic_private_obj_init(mgr->dev, &group->base, NULL,
&tunnel_group_funcs);
return true;
}
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 06/15] drm/dp_tunnel: Switch private_obj initialization to atomic_create_state
2026-01-19 12:50 ` [PATCH v3 06/15] drm/dp_tunnel: " Maxime Ripard
@ 2026-01-19 17:29 ` Dmitry Baryshkov
0 siblings, 0 replies; 24+ messages in thread
From: Dmitry Baryshkov @ 2026-01-19 17:29 UTC (permalink / raw)
To: Maxime Ripard
Cc: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
dri-devel
On Mon, Jan 19, 2026 at 01:50:02PM +0100, Maxime Ripard wrote:
> The DP tunnel implementation relies on a drm_private_obj, that is
> initialized by allocating and initializing a state, and then passing it
> to drm_private_obj_init.
>
> Since we're gradually moving away from that pattern to the more
> established one relying on a atomic_create_state implementation, let's
> migrate this instance to the new pattern.
>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
> ---
> drivers/gpu/drm/display/drm_dp_tunnel.c | 25 ++++++++++++++++---------
> 1 file changed, 16 insertions(+), 9 deletions(-)
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 07/15] drm/amdgpu: Switch private_obj initialization to atomic_create_state
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (5 preceding siblings ...)
2026-01-19 12:50 ` [PATCH v3 06/15] drm/dp_tunnel: " Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 08/15] drm/arm: komeda: " Maxime Ripard
` (7 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Harry Wentland, Leo Li,
Rodrigo Siqueira, Alex Deucher, Christian König, amd-gfx
The amdgpu driver relies on a drm_private_obj, that is initialized by
allocating and initializing a state, and then passing it to
drm_private_obj_init.
Since we're gradually moving away from that pattern to the more
established one relying on a atomic_create_state implementation, let's
migrate this instance to the new pattern.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Harry Wentland <harry.wentland@amd.com>
Cc: Leo Li <sunpeng.li@amd.com>
Cc: Rodrigo Siqueira <siqueira@igalia.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: "Christian König" <christian.koenig@amd.com>
Cc: amd-gfx@lists.freedesktop.org
---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 52 ++++++++++++-----------
1 file changed, 28 insertions(+), 24 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 740711ac1037ce14eda589324a26f312f8560da6..a97e1bf1bfdc6384a6ac83f907878807bb3b62a0 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4880,18 +4880,41 @@ static void dm_atomic_destroy_state(struct drm_private_obj *obj,
dc_state_release(dm_state->context);
kfree(dm_state);
}
+static struct drm_private_state *
+dm_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct amdgpu_device *adev = drm_to_adev(obj->dev);
+ struct dm_atomic_state *dm_state;
+ struct dc_state *context;
+
+ dm_state = kzalloc(sizeof(*dm_state), GFP_KERNEL);
+ if (!dm_state)
+ return ERR_PTR(-ENOMEM);
+
+ context = dc_state_create_current_copy(adev->dm.dc);
+ if (!context) {
+ kfree(dm_state);
+ return ERR_PTR(-ENOMEM);
+ }
+
+ __drm_atomic_helper_private_obj_create_state(obj, &dm_state->base);
+ dm_state->context = context;
+
+ return &dm_state->base;
+}
+
static struct drm_private_state_funcs dm_atomic_state_funcs = {
+ .atomic_create_state = dm_atomic_create_state,
.atomic_duplicate_state = dm_atomic_duplicate_state,
.atomic_destroy_state = dm_atomic_destroy_state,
};
static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev)
{
- struct dm_atomic_state *state;
int r;
adev->mode_info.mode_config_initialized = true;
adev_to_drm(adev)->mode_config.funcs = (void *)&amdgpu_dm_mode_funcs;
@@ -4907,46 +4930,27 @@ static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev)
else
adev_to_drm(adev)->mode_config.prefer_shadow = 1;
/* indicates support for immediate flip */
adev_to_drm(adev)->mode_config.async_page_flip = true;
- state = kzalloc(sizeof(*state), GFP_KERNEL);
- if (!state)
- return -ENOMEM;
-
- state->context = dc_state_create_current_copy(adev->dm.dc);
- if (!state->context) {
- kfree(state);
- return -ENOMEM;
- }
-
drm_atomic_private_obj_init(adev_to_drm(adev),
&adev->dm.atomic_obj,
- &state->base,
+ NULL,
&dm_atomic_state_funcs);
r = amdgpu_display_modeset_create_props(adev);
- if (r) {
- dc_state_release(state->context);
- kfree(state);
+ if (r)
return r;
- }
#ifdef AMD_PRIVATE_COLOR
- if (amdgpu_dm_create_color_properties(adev)) {
- dc_state_release(state->context);
- kfree(state);
+ if (amdgpu_dm_create_color_properties(adev))
return -ENOMEM;
- }
#endif
r = amdgpu_dm_audio_init(adev);
- if (r) {
- dc_state_release(state->context);
- kfree(state);
+ if (r)
return r;
- }
return 0;
}
#define AMDGPU_DM_DEFAULT_MIN_BACKLIGHT 12
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v3 08/15] drm/arm: komeda: Switch private_obj initialization to atomic_create_state
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (6 preceding siblings ...)
2026-01-19 12:50 ` [PATCH v3 07/15] drm/amdgpu: " Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-19 20:10 ` Dmitry Baryshkov
2026-01-20 14:45 ` Liviu Dudau
2026-01-19 12:50 ` [PATCH v3 09/15] drm/ingenic: " Maxime Ripard
` (6 subsequent siblings)
14 siblings, 2 replies; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Liviu Dudau
The ARM komeda driver relies on a number of drm_private_objs, that are
initialized by allocating and initializing a state, and then passing it
to drm_private_obj_init.
Since we're gradually moving away from that pattern to the more
established one relying on a atomic_create_state implementation, let's
migrate this instance to the new pattern.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Liviu Dudau <liviu.dudau@arm.com>
---
.../gpu/drm/arm/display/komeda/komeda_pipeline.h | 2 +
.../drm/arm/display/komeda/komeda_private_obj.c | 208 ++++++++++++++-------
2 files changed, 146 insertions(+), 64 deletions(-)
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
index ac8725e248537e5737d16cd36860401c42073500..37b9e92202443cc72adc0666ed047d4f77d79782 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
@@ -126,10 +126,12 @@ struct komeda_component {
* @funcs: chip functions to access HW
*/
const struct komeda_component_funcs *funcs;
};
+#define to_component(o) container_of(o, struct komeda_component, obj)
+
/**
* struct komeda_component_output
*
* a component has multiple outputs, if want to know where the data
* comes from, only know the component is not enough, we still need to know
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c b/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
index 914400c4af73824e52dda76425a73a74e681a146..4994b69c6595637ea832b97629b052e3aea97ee7 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
@@ -38,26 +38,36 @@ komeda_layer_atomic_destroy_state(struct drm_private_obj *obj,
struct komeda_layer_state *st = to_layer_st(priv_to_comp_st(state));
kfree(st);
}
+static struct drm_private_state *
+komeda_layer_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct komeda_layer_state *st;
+
+ st = kzalloc(sizeof(*st), GFP_KERNEL);
+ if (!st)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
+ komeda_component_state_reset(&st->base);
+ st->base.component = to_component(obj);
+
+ return &st->base.obj;
+}
+
static const struct drm_private_state_funcs komeda_layer_obj_funcs = {
+ .atomic_create_state = komeda_layer_atomic_create_state,
.atomic_duplicate_state = komeda_layer_atomic_duplicate_state,
.atomic_destroy_state = komeda_layer_atomic_destroy_state,
};
static int komeda_layer_obj_add(struct komeda_kms_dev *kms,
struct komeda_layer *layer)
{
- struct komeda_layer_state *st;
-
- st = kzalloc(sizeof(*st), GFP_KERNEL);
- if (!st)
- return -ENOMEM;
-
- st->base.component = &layer->base;
- drm_atomic_private_obj_init(&kms->base, &layer->base.obj, &st->base.obj,
+ drm_atomic_private_obj_init(&kms->base, &layer->base.obj, NULL,
&komeda_layer_obj_funcs);
return 0;
}
static struct drm_private_state *
@@ -80,27 +90,37 @@ komeda_scaler_atomic_destroy_state(struct drm_private_obj *obj,
struct drm_private_state *state)
{
kfree(to_scaler_st(priv_to_comp_st(state)));
}
+static struct drm_private_state *
+komeda_scaler_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct komeda_scaler_state *st;
+
+ st = kzalloc(sizeof(*st), GFP_KERNEL);
+ if (!st)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
+ komeda_component_state_reset(&st->base);
+ st->base.component = to_component(obj);
+
+ return &st->base.obj;
+}
+
static const struct drm_private_state_funcs komeda_scaler_obj_funcs = {
+ .atomic_create_state = komeda_scaler_atomic_create_state,
.atomic_duplicate_state = komeda_scaler_atomic_duplicate_state,
.atomic_destroy_state = komeda_scaler_atomic_destroy_state,
};
static int komeda_scaler_obj_add(struct komeda_kms_dev *kms,
struct komeda_scaler *scaler)
{
- struct komeda_scaler_state *st;
-
- st = kzalloc(sizeof(*st), GFP_KERNEL);
- if (!st)
- return -ENOMEM;
-
- st->base.component = &scaler->base;
drm_atomic_private_obj_init(&kms->base,
- &scaler->base.obj, &st->base.obj,
+ &scaler->base.obj, NULL,
&komeda_scaler_obj_funcs);
return 0;
}
static struct drm_private_state *
@@ -123,26 +143,36 @@ komeda_compiz_atomic_destroy_state(struct drm_private_obj *obj,
struct drm_private_state *state)
{
kfree(to_compiz_st(priv_to_comp_st(state)));
}
+static struct drm_private_state *
+komeda_compiz_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct komeda_compiz_state *st;
+
+ st = kzalloc(sizeof(*st), GFP_KERNEL);
+ if (!st)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
+ komeda_component_state_reset(&st->base);
+ st->base.component = to_component(obj);
+
+ return &st->base.obj;
+}
+
static const struct drm_private_state_funcs komeda_compiz_obj_funcs = {
+ .atomic_create_state = komeda_compiz_atomic_create_state,
.atomic_duplicate_state = komeda_compiz_atomic_duplicate_state,
.atomic_destroy_state = komeda_compiz_atomic_destroy_state,
};
static int komeda_compiz_obj_add(struct komeda_kms_dev *kms,
struct komeda_compiz *compiz)
{
- struct komeda_compiz_state *st;
-
- st = kzalloc(sizeof(*st), GFP_KERNEL);
- if (!st)
- return -ENOMEM;
-
- st->base.component = &compiz->base;
- drm_atomic_private_obj_init(&kms->base, &compiz->base.obj, &st->base.obj,
+ drm_atomic_private_obj_init(&kms->base, &compiz->base.obj, NULL,
&komeda_compiz_obj_funcs);
return 0;
}
@@ -166,27 +196,37 @@ komeda_splitter_atomic_destroy_state(struct drm_private_obj *obj,
struct drm_private_state *state)
{
kfree(to_splitter_st(priv_to_comp_st(state)));
}
+static struct drm_private_state *
+komeda_splitter_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct komeda_splitter_state *st;
+
+ st = kzalloc(sizeof(*st), GFP_KERNEL);
+ if (!st)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
+ komeda_component_state_reset(&st->base);
+ st->base.component = to_component(obj);
+
+ return &st->base.obj;
+}
+
static const struct drm_private_state_funcs komeda_splitter_obj_funcs = {
+ .atomic_create_state = komeda_splitter_atomic_create_state,
.atomic_duplicate_state = komeda_splitter_atomic_duplicate_state,
.atomic_destroy_state = komeda_splitter_atomic_destroy_state,
};
static int komeda_splitter_obj_add(struct komeda_kms_dev *kms,
struct komeda_splitter *splitter)
{
- struct komeda_splitter_state *st;
-
- st = kzalloc(sizeof(*st), GFP_KERNEL);
- if (!st)
- return -ENOMEM;
-
- st->base.component = &splitter->base;
drm_atomic_private_obj_init(&kms->base,
- &splitter->base.obj, &st->base.obj,
+ &splitter->base.obj, NULL,
&komeda_splitter_obj_funcs);
return 0;
}
@@ -209,27 +249,37 @@ static void komeda_merger_atomic_destroy_state(struct drm_private_obj *obj,
struct drm_private_state *state)
{
kfree(to_merger_st(priv_to_comp_st(state)));
}
+static struct drm_private_state *
+komeda_merger_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct komeda_merger_state *st;
+
+ st = kzalloc(sizeof(*st), GFP_KERNEL);
+ if (!st)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
+ komeda_component_state_reset(&st->base);
+ st->base.component = to_component(obj);
+
+ return &st->base.obj;
+}
+
static const struct drm_private_state_funcs komeda_merger_obj_funcs = {
+ .atomic_create_state = komeda_merger_atomic_create_state,
.atomic_duplicate_state = komeda_merger_atomic_duplicate_state,
.atomic_destroy_state = komeda_merger_atomic_destroy_state,
};
static int komeda_merger_obj_add(struct komeda_kms_dev *kms,
struct komeda_merger *merger)
{
- struct komeda_merger_state *st;
-
- st = kzalloc(sizeof(*st), GFP_KERNEL);
- if (!st)
- return -ENOMEM;
-
- st->base.component = &merger->base;
drm_atomic_private_obj_init(&kms->base,
- &merger->base.obj, &st->base.obj,
+ &merger->base.obj, NULL,
&komeda_merger_obj_funcs);
return 0;
}
@@ -253,26 +303,36 @@ komeda_improc_atomic_destroy_state(struct drm_private_obj *obj,
struct drm_private_state *state)
{
kfree(to_improc_st(priv_to_comp_st(state)));
}
+static struct drm_private_state *
+komeda_improc_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct komeda_improc_state *st;
+
+ st = kzalloc(sizeof(*st), GFP_KERNEL);
+ if (!st)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
+ komeda_component_state_reset(&st->base);
+ st->base.component = to_component(obj);
+
+ return &st->base.obj;
+}
+
static const struct drm_private_state_funcs komeda_improc_obj_funcs = {
+ .atomic_create_state = komeda_improc_atomic_create_state,
.atomic_duplicate_state = komeda_improc_atomic_duplicate_state,
.atomic_destroy_state = komeda_improc_atomic_destroy_state,
};
static int komeda_improc_obj_add(struct komeda_kms_dev *kms,
struct komeda_improc *improc)
{
- struct komeda_improc_state *st;
-
- st = kzalloc(sizeof(*st), GFP_KERNEL);
- if (!st)
- return -ENOMEM;
-
- st->base.component = &improc->base;
- drm_atomic_private_obj_init(&kms->base, &improc->base.obj, &st->base.obj,
+ drm_atomic_private_obj_init(&kms->base, &improc->base.obj, NULL,
&komeda_improc_obj_funcs);
return 0;
}
@@ -296,26 +356,36 @@ komeda_timing_ctrlr_atomic_destroy_state(struct drm_private_obj *obj,
struct drm_private_state *state)
{
kfree(to_ctrlr_st(priv_to_comp_st(state)));
}
+static struct drm_private_state *
+komeda_timing_ctrlr_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct komeda_timing_ctrlr_state *st;
+
+ st = kzalloc(sizeof(*st), GFP_KERNEL);
+ if (!st)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
+ komeda_component_state_reset(&st->base);
+ st->base.component = to_component(obj);
+
+ return &st->base.obj;
+}
+
static const struct drm_private_state_funcs komeda_timing_ctrlr_obj_funcs = {
+ .atomic_create_state = komeda_timing_ctrlr_atomic_create_state,
.atomic_duplicate_state = komeda_timing_ctrlr_atomic_duplicate_state,
.atomic_destroy_state = komeda_timing_ctrlr_atomic_destroy_state,
};
static int komeda_timing_ctrlr_obj_add(struct komeda_kms_dev *kms,
struct komeda_timing_ctrlr *ctrlr)
{
- struct komeda_compiz_state *st;
-
- st = kzalloc(sizeof(*st), GFP_KERNEL);
- if (!st)
- return -ENOMEM;
-
- st->base.component = &ctrlr->base;
- drm_atomic_private_obj_init(&kms->base, &ctrlr->base.obj, &st->base.obj,
+ drm_atomic_private_obj_init(&kms->base, &ctrlr->base.obj, NULL,
&komeda_timing_ctrlr_obj_funcs);
return 0;
}
@@ -340,26 +410,36 @@ komeda_pipeline_atomic_destroy_state(struct drm_private_obj *obj,
struct drm_private_state *state)
{
kfree(priv_to_pipe_st(state));
}
+static struct drm_private_state *
+komeda_pipeline_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct komeda_pipeline_state *st;
+
+ st = kzalloc(sizeof(*st), GFP_KERNEL);
+ if (!st)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &st->obj);
+ st->active_comps = 0;
+ st->pipe = container_of(obj, struct komeda_pipeline, obj);
+
+ return &st->obj;
+}
+
static const struct drm_private_state_funcs komeda_pipeline_obj_funcs = {
+ .atomic_create_state = komeda_pipeline_atomic_create_state,
.atomic_duplicate_state = komeda_pipeline_atomic_duplicate_state,
.atomic_destroy_state = komeda_pipeline_atomic_destroy_state,
};
static int komeda_pipeline_obj_add(struct komeda_kms_dev *kms,
struct komeda_pipeline *pipe)
{
- struct komeda_pipeline_state *st;
-
- st = kzalloc(sizeof(*st), GFP_KERNEL);
- if (!st)
- return -ENOMEM;
-
- st->pipe = pipe;
- drm_atomic_private_obj_init(&kms->base, &pipe->obj, &st->obj,
+ drm_atomic_private_obj_init(&kms->base, &pipe->obj, NULL,
&komeda_pipeline_obj_funcs);
return 0;
}
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 08/15] drm/arm: komeda: Switch private_obj initialization to atomic_create_state
2026-01-19 12:50 ` [PATCH v3 08/15] drm/arm: komeda: " Maxime Ripard
@ 2026-01-19 20:10 ` Dmitry Baryshkov
2026-01-20 14:45 ` Liviu Dudau
1 sibling, 0 replies; 24+ messages in thread
From: Dmitry Baryshkov @ 2026-01-19 20:10 UTC (permalink / raw)
To: Maxime Ripard
Cc: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
dri-devel, Liviu Dudau
On Mon, Jan 19, 2026 at 01:50:04PM +0100, Maxime Ripard wrote:
> The ARM komeda driver relies on a number of drm_private_objs, that are
> initialized by allocating and initializing a state, and then passing it
> to drm_private_obj_init.
>
> Since we're gradually moving away from that pattern to the more
> established one relying on a atomic_create_state implementation, let's
> migrate this instance to the new pattern.
>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
>
> ---
>
> Cc: Liviu Dudau <liviu.dudau@arm.com>
> ---
> .../gpu/drm/arm/display/komeda/komeda_pipeline.h | 2 +
> .../drm/arm/display/komeda/komeda_private_obj.c | 208 ++++++++++++++-------
> 2 files changed, 146 insertions(+), 64 deletions(-)
>
Acked-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v3 08/15] drm/arm: komeda: Switch private_obj initialization to atomic_create_state
2026-01-19 12:50 ` [PATCH v3 08/15] drm/arm: komeda: " Maxime Ripard
2026-01-19 20:10 ` Dmitry Baryshkov
@ 2026-01-20 14:45 ` Liviu Dudau
1 sibling, 0 replies; 24+ messages in thread
From: Liviu Dudau @ 2026-01-20 14:45 UTC (permalink / raw)
To: Maxime Ripard
Cc: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
dri-devel
On Mon, Jan 19, 2026 at 01:50:04PM +0100, Maxime Ripard wrote:
> The ARM komeda driver relies on a number of drm_private_objs, that are
> initialized by allocating and initializing a state, and then passing it
> to drm_private_obj_init.
>
> Since we're gradually moving away from that pattern to the more
> established one relying on a atomic_create_state implementation, let's
> migrate this instance to the new pattern.
>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
>
> ---
>
> Cc: Liviu Dudau <liviu.dudau@arm.com>
Acked-by: Liviu Dudau <liviu.dudau@arm.com>
Best regards,
Liviu
> ---
> .../gpu/drm/arm/display/komeda/komeda_pipeline.h | 2 +
> .../drm/arm/display/komeda/komeda_private_obj.c | 208 ++++++++++++++-------
> 2 files changed, 146 insertions(+), 64 deletions(-)
>
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
> index ac8725e248537e5737d16cd36860401c42073500..37b9e92202443cc72adc0666ed047d4f77d79782 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
> @@ -126,10 +126,12 @@ struct komeda_component {
> * @funcs: chip functions to access HW
> */
> const struct komeda_component_funcs *funcs;
> };
>
> +#define to_component(o) container_of(o, struct komeda_component, obj)
> +
> /**
> * struct komeda_component_output
> *
> * a component has multiple outputs, if want to know where the data
> * comes from, only know the component is not enough, we still need to know
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c b/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
> index 914400c4af73824e52dda76425a73a74e681a146..4994b69c6595637ea832b97629b052e3aea97ee7 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
> @@ -38,26 +38,36 @@ komeda_layer_atomic_destroy_state(struct drm_private_obj *obj,
> struct komeda_layer_state *st = to_layer_st(priv_to_comp_st(state));
>
> kfree(st);
> }
>
> +static struct drm_private_state *
> +komeda_layer_atomic_create_state(struct drm_private_obj *obj)
> +{
> + struct komeda_layer_state *st;
> +
> + st = kzalloc(sizeof(*st), GFP_KERNEL);
> + if (!st)
> + return ERR_PTR(-ENOMEM);
> +
> + __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> + komeda_component_state_reset(&st->base);
> + st->base.component = to_component(obj);
> +
> + return &st->base.obj;
> +}
> +
> static const struct drm_private_state_funcs komeda_layer_obj_funcs = {
> + .atomic_create_state = komeda_layer_atomic_create_state,
> .atomic_duplicate_state = komeda_layer_atomic_duplicate_state,
> .atomic_destroy_state = komeda_layer_atomic_destroy_state,
> };
>
> static int komeda_layer_obj_add(struct komeda_kms_dev *kms,
> struct komeda_layer *layer)
> {
> - struct komeda_layer_state *st;
> -
> - st = kzalloc(sizeof(*st), GFP_KERNEL);
> - if (!st)
> - return -ENOMEM;
> -
> - st->base.component = &layer->base;
> - drm_atomic_private_obj_init(&kms->base, &layer->base.obj, &st->base.obj,
> + drm_atomic_private_obj_init(&kms->base, &layer->base.obj, NULL,
> &komeda_layer_obj_funcs);
> return 0;
> }
>
> static struct drm_private_state *
> @@ -80,27 +90,37 @@ komeda_scaler_atomic_destroy_state(struct drm_private_obj *obj,
> struct drm_private_state *state)
> {
> kfree(to_scaler_st(priv_to_comp_st(state)));
> }
>
> +static struct drm_private_state *
> +komeda_scaler_atomic_create_state(struct drm_private_obj *obj)
> +{
> + struct komeda_scaler_state *st;
> +
> + st = kzalloc(sizeof(*st), GFP_KERNEL);
> + if (!st)
> + return ERR_PTR(-ENOMEM);
> +
> + __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> + komeda_component_state_reset(&st->base);
> + st->base.component = to_component(obj);
> +
> + return &st->base.obj;
> +}
> +
> static const struct drm_private_state_funcs komeda_scaler_obj_funcs = {
> + .atomic_create_state = komeda_scaler_atomic_create_state,
> .atomic_duplicate_state = komeda_scaler_atomic_duplicate_state,
> .atomic_destroy_state = komeda_scaler_atomic_destroy_state,
> };
>
> static int komeda_scaler_obj_add(struct komeda_kms_dev *kms,
> struct komeda_scaler *scaler)
> {
> - struct komeda_scaler_state *st;
> -
> - st = kzalloc(sizeof(*st), GFP_KERNEL);
> - if (!st)
> - return -ENOMEM;
> -
> - st->base.component = &scaler->base;
> drm_atomic_private_obj_init(&kms->base,
> - &scaler->base.obj, &st->base.obj,
> + &scaler->base.obj, NULL,
> &komeda_scaler_obj_funcs);
> return 0;
> }
>
> static struct drm_private_state *
> @@ -123,26 +143,36 @@ komeda_compiz_atomic_destroy_state(struct drm_private_obj *obj,
> struct drm_private_state *state)
> {
> kfree(to_compiz_st(priv_to_comp_st(state)));
> }
>
> +static struct drm_private_state *
> +komeda_compiz_atomic_create_state(struct drm_private_obj *obj)
> +{
> + struct komeda_compiz_state *st;
> +
> + st = kzalloc(sizeof(*st), GFP_KERNEL);
> + if (!st)
> + return ERR_PTR(-ENOMEM);
> +
> + __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> + komeda_component_state_reset(&st->base);
> + st->base.component = to_component(obj);
> +
> + return &st->base.obj;
> +}
> +
> static const struct drm_private_state_funcs komeda_compiz_obj_funcs = {
> + .atomic_create_state = komeda_compiz_atomic_create_state,
> .atomic_duplicate_state = komeda_compiz_atomic_duplicate_state,
> .atomic_destroy_state = komeda_compiz_atomic_destroy_state,
> };
>
> static int komeda_compiz_obj_add(struct komeda_kms_dev *kms,
> struct komeda_compiz *compiz)
> {
> - struct komeda_compiz_state *st;
> -
> - st = kzalloc(sizeof(*st), GFP_KERNEL);
> - if (!st)
> - return -ENOMEM;
> -
> - st->base.component = &compiz->base;
> - drm_atomic_private_obj_init(&kms->base, &compiz->base.obj, &st->base.obj,
> + drm_atomic_private_obj_init(&kms->base, &compiz->base.obj, NULL,
> &komeda_compiz_obj_funcs);
>
> return 0;
> }
>
> @@ -166,27 +196,37 @@ komeda_splitter_atomic_destroy_state(struct drm_private_obj *obj,
> struct drm_private_state *state)
> {
> kfree(to_splitter_st(priv_to_comp_st(state)));
> }
>
> +static struct drm_private_state *
> +komeda_splitter_atomic_create_state(struct drm_private_obj *obj)
> +{
> + struct komeda_splitter_state *st;
> +
> + st = kzalloc(sizeof(*st), GFP_KERNEL);
> + if (!st)
> + return ERR_PTR(-ENOMEM);
> +
> + __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> + komeda_component_state_reset(&st->base);
> + st->base.component = to_component(obj);
> +
> + return &st->base.obj;
> +}
> +
> static const struct drm_private_state_funcs komeda_splitter_obj_funcs = {
> + .atomic_create_state = komeda_splitter_atomic_create_state,
> .atomic_duplicate_state = komeda_splitter_atomic_duplicate_state,
> .atomic_destroy_state = komeda_splitter_atomic_destroy_state,
> };
>
> static int komeda_splitter_obj_add(struct komeda_kms_dev *kms,
> struct komeda_splitter *splitter)
> {
> - struct komeda_splitter_state *st;
> -
> - st = kzalloc(sizeof(*st), GFP_KERNEL);
> - if (!st)
> - return -ENOMEM;
> -
> - st->base.component = &splitter->base;
> drm_atomic_private_obj_init(&kms->base,
> - &splitter->base.obj, &st->base.obj,
> + &splitter->base.obj, NULL,
> &komeda_splitter_obj_funcs);
>
> return 0;
> }
>
> @@ -209,27 +249,37 @@ static void komeda_merger_atomic_destroy_state(struct drm_private_obj *obj,
> struct drm_private_state *state)
> {
> kfree(to_merger_st(priv_to_comp_st(state)));
> }
>
> +static struct drm_private_state *
> +komeda_merger_atomic_create_state(struct drm_private_obj *obj)
> +{
> + struct komeda_merger_state *st;
> +
> + st = kzalloc(sizeof(*st), GFP_KERNEL);
> + if (!st)
> + return ERR_PTR(-ENOMEM);
> +
> + __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> + komeda_component_state_reset(&st->base);
> + st->base.component = to_component(obj);
> +
> + return &st->base.obj;
> +}
> +
> static const struct drm_private_state_funcs komeda_merger_obj_funcs = {
> + .atomic_create_state = komeda_merger_atomic_create_state,
> .atomic_duplicate_state = komeda_merger_atomic_duplicate_state,
> .atomic_destroy_state = komeda_merger_atomic_destroy_state,
> };
>
> static int komeda_merger_obj_add(struct komeda_kms_dev *kms,
> struct komeda_merger *merger)
> {
> - struct komeda_merger_state *st;
> -
> - st = kzalloc(sizeof(*st), GFP_KERNEL);
> - if (!st)
> - return -ENOMEM;
> -
> - st->base.component = &merger->base;
> drm_atomic_private_obj_init(&kms->base,
> - &merger->base.obj, &st->base.obj,
> + &merger->base.obj, NULL,
> &komeda_merger_obj_funcs);
>
> return 0;
> }
>
> @@ -253,26 +303,36 @@ komeda_improc_atomic_destroy_state(struct drm_private_obj *obj,
> struct drm_private_state *state)
> {
> kfree(to_improc_st(priv_to_comp_st(state)));
> }
>
> +static struct drm_private_state *
> +komeda_improc_atomic_create_state(struct drm_private_obj *obj)
> +{
> + struct komeda_improc_state *st;
> +
> + st = kzalloc(sizeof(*st), GFP_KERNEL);
> + if (!st)
> + return ERR_PTR(-ENOMEM);
> +
> + __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> + komeda_component_state_reset(&st->base);
> + st->base.component = to_component(obj);
> +
> + return &st->base.obj;
> +}
> +
> static const struct drm_private_state_funcs komeda_improc_obj_funcs = {
> + .atomic_create_state = komeda_improc_atomic_create_state,
> .atomic_duplicate_state = komeda_improc_atomic_duplicate_state,
> .atomic_destroy_state = komeda_improc_atomic_destroy_state,
> };
>
> static int komeda_improc_obj_add(struct komeda_kms_dev *kms,
> struct komeda_improc *improc)
> {
> - struct komeda_improc_state *st;
> -
> - st = kzalloc(sizeof(*st), GFP_KERNEL);
> - if (!st)
> - return -ENOMEM;
> -
> - st->base.component = &improc->base;
> - drm_atomic_private_obj_init(&kms->base, &improc->base.obj, &st->base.obj,
> + drm_atomic_private_obj_init(&kms->base, &improc->base.obj, NULL,
> &komeda_improc_obj_funcs);
>
> return 0;
> }
>
> @@ -296,26 +356,36 @@ komeda_timing_ctrlr_atomic_destroy_state(struct drm_private_obj *obj,
> struct drm_private_state *state)
> {
> kfree(to_ctrlr_st(priv_to_comp_st(state)));
> }
>
> +static struct drm_private_state *
> +komeda_timing_ctrlr_atomic_create_state(struct drm_private_obj *obj)
> +{
> + struct komeda_timing_ctrlr_state *st;
> +
> + st = kzalloc(sizeof(*st), GFP_KERNEL);
> + if (!st)
> + return ERR_PTR(-ENOMEM);
> +
> + __drm_atomic_helper_private_obj_create_state(obj, &st->base.obj);
> + komeda_component_state_reset(&st->base);
> + st->base.component = to_component(obj);
> +
> + return &st->base.obj;
> +}
> +
> static const struct drm_private_state_funcs komeda_timing_ctrlr_obj_funcs = {
> + .atomic_create_state = komeda_timing_ctrlr_atomic_create_state,
> .atomic_duplicate_state = komeda_timing_ctrlr_atomic_duplicate_state,
> .atomic_destroy_state = komeda_timing_ctrlr_atomic_destroy_state,
> };
>
> static int komeda_timing_ctrlr_obj_add(struct komeda_kms_dev *kms,
> struct komeda_timing_ctrlr *ctrlr)
> {
> - struct komeda_compiz_state *st;
> -
> - st = kzalloc(sizeof(*st), GFP_KERNEL);
> - if (!st)
> - return -ENOMEM;
> -
> - st->base.component = &ctrlr->base;
> - drm_atomic_private_obj_init(&kms->base, &ctrlr->base.obj, &st->base.obj,
> + drm_atomic_private_obj_init(&kms->base, &ctrlr->base.obj, NULL,
> &komeda_timing_ctrlr_obj_funcs);
>
> return 0;
> }
>
> @@ -340,26 +410,36 @@ komeda_pipeline_atomic_destroy_state(struct drm_private_obj *obj,
> struct drm_private_state *state)
> {
> kfree(priv_to_pipe_st(state));
> }
>
> +static struct drm_private_state *
> +komeda_pipeline_atomic_create_state(struct drm_private_obj *obj)
> +{
> + struct komeda_pipeline_state *st;
> +
> + st = kzalloc(sizeof(*st), GFP_KERNEL);
> + if (!st)
> + return ERR_PTR(-ENOMEM);
> +
> + __drm_atomic_helper_private_obj_create_state(obj, &st->obj);
> + st->active_comps = 0;
> + st->pipe = container_of(obj, struct komeda_pipeline, obj);
> +
> + return &st->obj;
> +}
> +
> static const struct drm_private_state_funcs komeda_pipeline_obj_funcs = {
> + .atomic_create_state = komeda_pipeline_atomic_create_state,
> .atomic_duplicate_state = komeda_pipeline_atomic_duplicate_state,
> .atomic_destroy_state = komeda_pipeline_atomic_destroy_state,
> };
>
> static int komeda_pipeline_obj_add(struct komeda_kms_dev *kms,
> struct komeda_pipeline *pipe)
> {
> - struct komeda_pipeline_state *st;
> -
> - st = kzalloc(sizeof(*st), GFP_KERNEL);
> - if (!st)
> - return -ENOMEM;
> -
> - st->pipe = pipe;
> - drm_atomic_private_obj_init(&kms->base, &pipe->obj, &st->obj,
> + drm_atomic_private_obj_init(&kms->base, &pipe->obj, NULL,
> &komeda_pipeline_obj_funcs);
>
> return 0;
> }
>
>
> --
> 2.52.0
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 09/15] drm/ingenic: Switch private_obj initialization to atomic_create_state
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (7 preceding siblings ...)
2026-01-19 12:50 ` [PATCH v3 08/15] drm/arm: komeda: " Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-19 16:18 ` Paul Cercueil
2026-01-19 12:50 ` [PATCH v3 10/15] drm/msm: mdp5: " Maxime Ripard
` (5 subsequent siblings)
14 siblings, 1 reply; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Paul Cercueil, linux-mips
The ingenic driver relies on two drm_private_objs, that are initialized
by allocating and initializing a state, and then passing it to
drm_private_obj_init.
Since we're gradually moving away from that pattern to the more
established one relying on a atomic_create_state implementation, let's
migrate this instance to the new pattern.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Paul Cercueil <paul@crapouillou.net>
Cc: linux-mips@vger.kernel.org
---
drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 28 +++++++++++++++++-----------
drivers/gpu/drm/ingenic/ingenic-ipu.c | 28 ++++++++++++++++------------
2 files changed, 33 insertions(+), 23 deletions(-)
diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index d3213fbf22be14b177fc1b7100c5b721d5f17924..862691991ed2770d30342bf531e828e34bd7080a 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -952,10 +952,24 @@ static void ingenic_drm_destroy_state(struct drm_private_obj *obj,
struct ingenic_drm_private_state *priv_state = to_ingenic_drm_priv_state(state);
kfree(priv_state);
}
+static struct drm_private_state *
+ingenic_drm_create_state(struct drm_private_obj *obj)
+{
+ struct ingenic_drm_private_state *priv_state;
+
+ priv_state = kzalloc(sizeof(*priv_state), GFP_KERNEL);
+ if (!priv_state)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &priv_state->base);
+
+ return &priv_state->base;
+}
+
DEFINE_DRM_GEM_DMA_FOPS(ingenic_drm_fops);
static const struct drm_driver ingenic_drm_driver_data = {
.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
.name = "ingenic-drm",
@@ -1032,10 +1046,11 @@ static const struct drm_mode_config_funcs ingenic_drm_mode_config_funcs = {
static struct drm_mode_config_helper_funcs ingenic_drm_mode_config_helpers = {
.atomic_commit_tail = drm_atomic_helper_commit_tail,
};
static const struct drm_private_state_funcs ingenic_drm_private_state_funcs = {
+ .atomic_create_state = ingenic_drm_create_state,
.atomic_duplicate_state = ingenic_drm_duplicate_state,
.atomic_destroy_state = ingenic_drm_destroy_state,
};
static void ingenic_drm_unbind_all(void *d)
@@ -1085,11 +1100,10 @@ static void ingenic_drm_atomic_private_obj_fini(struct drm_device *drm, void *pr
}
static int ingenic_drm_bind(struct device *dev, bool has_components)
{
struct platform_device *pdev = to_platform_device(dev);
- struct ingenic_drm_private_state *private_state;
const struct jz_soc_info *soc_info;
struct ingenic_drm *priv;
struct clk *parent_clk;
struct drm_plane *primary;
struct drm_bridge *bridge;
@@ -1385,23 +1399,17 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)
if (ret) {
dev_err(dev, "Unable to register clock notifier\n");
goto err_devclk_disable;
}
- private_state = kzalloc(sizeof(*private_state), GFP_KERNEL);
- if (!private_state) {
- ret = -ENOMEM;
- goto err_clk_notifier_unregister;
- }
-
- drm_atomic_private_obj_init(drm, &priv->private_obj, &private_state->base,
+ drm_atomic_private_obj_init(drm, &priv->private_obj, NULL,
&ingenic_drm_private_state_funcs);
ret = drmm_add_action_or_reset(drm, ingenic_drm_atomic_private_obj_fini,
&priv->private_obj);
if (ret)
- goto err_private_state_free;
+ goto err_clk_notifier_unregister;
ret = drm_dev_register(drm, 0);
if (ret) {
dev_err(dev, "Failed to register DRM driver\n");
goto err_clk_notifier_unregister;
@@ -1409,12 +1417,10 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)
drm_client_setup(drm, NULL);
return 0;
-err_private_state_free:
- kfree(private_state);
err_clk_notifier_unregister:
clk_notifier_unregister(parent_clk, &priv->clock_nb);
err_devclk_disable:
if (priv->lcd_clk)
clk_disable_unprepare(priv->lcd_clk);
diff --git a/drivers/gpu/drm/ingenic/ingenic-ipu.c b/drivers/gpu/drm/ingenic/ingenic-ipu.c
index 32638a713241abbd4eaed09f0aaec2b790650cc9..253a1ce30997308547b61339468d52e6875785d3 100644
--- a/drivers/gpu/drm/ingenic/ingenic-ipu.c
+++ b/drivers/gpu/drm/ingenic/ingenic-ipu.c
@@ -748,11 +748,26 @@ static void ingenic_ipu_destroy_state(struct drm_private_obj *obj,
struct ingenic_ipu_private_state *priv_state = to_ingenic_ipu_priv_state(state);
kfree(priv_state);
}
+static struct drm_private_state *
+ingenic_ipu_create_state(struct drm_private_obj *obj)
+{
+ struct ingenic_ipu_private_state *priv_state;
+
+ priv_state = kzalloc(sizeof(*priv_state), GFP_KERNEL);
+ if (!priv_state)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &priv_state->base);
+
+ return &priv_state->base;
+}
+
static const struct drm_private_state_funcs ingenic_ipu_private_state_funcs = {
+ .atomic_create_state = ingenic_ipu_create_state,
.atomic_duplicate_state = ingenic_ipu_duplicate_state,
.atomic_destroy_state = ingenic_ipu_destroy_state,
};
static irqreturn_t ingenic_ipu_irq_handler(int irq, void *arg)
@@ -791,11 +806,10 @@ static const struct regmap_config ingenic_ipu_regmap_config = {
};
static int ingenic_ipu_bind(struct device *dev, struct device *master, void *d)
{
struct platform_device *pdev = to_platform_device(dev);
- struct ingenic_ipu_private_state *private_state;
const struct soc_info *soc_info;
struct drm_device *drm = d;
struct drm_plane *plane;
struct ingenic_ipu *ipu;
void __iomem *base;
@@ -885,24 +899,14 @@ static int ingenic_ipu_bind(struct device *dev, struct device *master, void *d)
if (err) {
dev_err(dev, "Unable to prepare clock\n");
return err;
}
- private_state = kzalloc(sizeof(*private_state), GFP_KERNEL);
- if (!private_state) {
- err = -ENOMEM;
- goto err_clk_unprepare;
- }
-
- drm_atomic_private_obj_init(drm, &ipu->private_obj, &private_state->base,
+ drm_atomic_private_obj_init(drm, &ipu->private_obj, NULL,
&ingenic_ipu_private_state_funcs);
return 0;
-
-err_clk_unprepare:
- clk_unprepare(ipu->clk);
- return err;
}
static void ingenic_ipu_unbind(struct device *dev,
struct device *master, void *d)
{
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 09/15] drm/ingenic: Switch private_obj initialization to atomic_create_state
2026-01-19 12:50 ` [PATCH v3 09/15] drm/ingenic: " Maxime Ripard
@ 2026-01-19 16:18 ` Paul Cercueil
0 siblings, 0 replies; 24+ messages in thread
From: Paul Cercueil @ 2026-01-19 16:18 UTC (permalink / raw)
To: Maxime Ripard, Maarten Lankhorst, Thomas Zimmermann, David Airlie,
Simona Vetter
Cc: dri-devel, linux-mips
Hi Maxime,
Le lundi 19 janvier 2026 à 13:50 +0100, Maxime Ripard a écrit :
> The ingenic driver relies on two drm_private_objs, that are
> initialized
> by allocating and initializing a state, and then passing it to
> drm_private_obj_init.
>
> Since we're gradually moving away from that pattern to the more
> established one relying on a atomic_create_state implementation,
> let's
> migrate this instance to the new pattern.
>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
Thought I had ack'd it before, apparently I didn't.
Acked-by: Paul Cercueil <paul@crapouillou.net>
Cheers,
-Paul
>
> ---
>
> Cc: Paul Cercueil <paul@crapouillou.net>
> Cc: linux-mips@vger.kernel.org
> ---
> drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 28 +++++++++++++++++----
> -------
> drivers/gpu/drm/ingenic/ingenic-ipu.c | 28 ++++++++++++++++-----
> -------
> 2 files changed, 33 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> index
> d3213fbf22be14b177fc1b7100c5b721d5f17924..862691991ed2770d30342bf531e
> 828e34bd7080a 100644
> --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> @@ -952,10 +952,24 @@ static void ingenic_drm_destroy_state(struct
> drm_private_obj *obj,
> struct ingenic_drm_private_state *priv_state =
> to_ingenic_drm_priv_state(state);
>
> kfree(priv_state);
> }
>
> +static struct drm_private_state *
> +ingenic_drm_create_state(struct drm_private_obj *obj)
> +{
> + struct ingenic_drm_private_state *priv_state;
> +
> + priv_state = kzalloc(sizeof(*priv_state), GFP_KERNEL);
> + if (!priv_state)
> + return ERR_PTR(-ENOMEM);
> +
> + __drm_atomic_helper_private_obj_create_state(obj,
> &priv_state->base);
> +
> + return &priv_state->base;
> +}
> +
> DEFINE_DRM_GEM_DMA_FOPS(ingenic_drm_fops);
>
> static const struct drm_driver ingenic_drm_driver_data = {
> .driver_features = DRIVER_MODESET | DRIVER_GEM |
> DRIVER_ATOMIC,
> .name = "ingenic-drm",
> @@ -1032,10 +1046,11 @@ static const struct drm_mode_config_funcs
> ingenic_drm_mode_config_funcs = {
> static struct drm_mode_config_helper_funcs
> ingenic_drm_mode_config_helpers = {
> .atomic_commit_tail = drm_atomic_helper_commit_tail,
> };
>
> static const struct drm_private_state_funcs
> ingenic_drm_private_state_funcs = {
> + .atomic_create_state = ingenic_drm_create_state,
> .atomic_duplicate_state = ingenic_drm_duplicate_state,
> .atomic_destroy_state = ingenic_drm_destroy_state,
> };
>
> static void ingenic_drm_unbind_all(void *d)
> @@ -1085,11 +1100,10 @@ static void
> ingenic_drm_atomic_private_obj_fini(struct drm_device *drm, void *pr
> }
>
> static int ingenic_drm_bind(struct device *dev, bool has_components)
> {
> struct platform_device *pdev = to_platform_device(dev);
> - struct ingenic_drm_private_state *private_state;
> const struct jz_soc_info *soc_info;
> struct ingenic_drm *priv;
> struct clk *parent_clk;
> struct drm_plane *primary;
> struct drm_bridge *bridge;
> @@ -1385,23 +1399,17 @@ static int ingenic_drm_bind(struct device
> *dev, bool has_components)
> if (ret) {
> dev_err(dev, "Unable to register clock notifier\n");
> goto err_devclk_disable;
> }
>
> - private_state = kzalloc(sizeof(*private_state), GFP_KERNEL);
> - if (!private_state) {
> - ret = -ENOMEM;
> - goto err_clk_notifier_unregister;
> - }
> -
> - drm_atomic_private_obj_init(drm, &priv->private_obj,
> &private_state->base,
> + drm_atomic_private_obj_init(drm, &priv->private_obj, NULL,
>
> &ingenic_drm_private_state_funcs);
>
> ret = drmm_add_action_or_reset(drm,
> ingenic_drm_atomic_private_obj_fini,
> &priv->private_obj);
> if (ret)
> - goto err_private_state_free;
> + goto err_clk_notifier_unregister;
>
> ret = drm_dev_register(drm, 0);
> if (ret) {
> dev_err(dev, "Failed to register DRM driver\n");
> goto err_clk_notifier_unregister;
> @@ -1409,12 +1417,10 @@ static int ingenic_drm_bind(struct device
> *dev, bool has_components)
>
> drm_client_setup(drm, NULL);
>
> return 0;
>
> -err_private_state_free:
> - kfree(private_state);
> err_clk_notifier_unregister:
> clk_notifier_unregister(parent_clk, &priv->clock_nb);
> err_devclk_disable:
> if (priv->lcd_clk)
> clk_disable_unprepare(priv->lcd_clk);
> diff --git a/drivers/gpu/drm/ingenic/ingenic-ipu.c
> b/drivers/gpu/drm/ingenic/ingenic-ipu.c
> index
> 32638a713241abbd4eaed09f0aaec2b790650cc9..253a1ce30997308547b61339468
> d52e6875785d3 100644
> --- a/drivers/gpu/drm/ingenic/ingenic-ipu.c
> +++ b/drivers/gpu/drm/ingenic/ingenic-ipu.c
> @@ -748,11 +748,26 @@ static void ingenic_ipu_destroy_state(struct
> drm_private_obj *obj,
> struct ingenic_ipu_private_state *priv_state =
> to_ingenic_ipu_priv_state(state);
>
> kfree(priv_state);
> }
>
> +static struct drm_private_state *
> +ingenic_ipu_create_state(struct drm_private_obj *obj)
> +{
> + struct ingenic_ipu_private_state *priv_state;
> +
> + priv_state = kzalloc(sizeof(*priv_state), GFP_KERNEL);
> + if (!priv_state)
> + return ERR_PTR(-ENOMEM);
> +
> + __drm_atomic_helper_private_obj_create_state(obj,
> &priv_state->base);
> +
> + return &priv_state->base;
> +}
> +
> static const struct drm_private_state_funcs
> ingenic_ipu_private_state_funcs = {
> + .atomic_create_state = ingenic_ipu_create_state,
> .atomic_duplicate_state = ingenic_ipu_duplicate_state,
> .atomic_destroy_state = ingenic_ipu_destroy_state,
> };
>
> static irqreturn_t ingenic_ipu_irq_handler(int irq, void *arg)
> @@ -791,11 +806,10 @@ static const struct regmap_config
> ingenic_ipu_regmap_config = {
> };
>
> static int ingenic_ipu_bind(struct device *dev, struct device
> *master, void *d)
> {
> struct platform_device *pdev = to_platform_device(dev);
> - struct ingenic_ipu_private_state *private_state;
> const struct soc_info *soc_info;
> struct drm_device *drm = d;
> struct drm_plane *plane;
> struct ingenic_ipu *ipu;
> void __iomem *base;
> @@ -885,24 +899,14 @@ static int ingenic_ipu_bind(struct device *dev,
> struct device *master, void *d)
> if (err) {
> dev_err(dev, "Unable to prepare clock\n");
> return err;
> }
>
> - private_state = kzalloc(sizeof(*private_state), GFP_KERNEL);
> - if (!private_state) {
> - err = -ENOMEM;
> - goto err_clk_unprepare;
> - }
> -
> - drm_atomic_private_obj_init(drm, &ipu->private_obj,
> &private_state->base,
> + drm_atomic_private_obj_init(drm, &ipu->private_obj, NULL,
>
> &ingenic_ipu_private_state_funcs);
>
> return 0;
> -
> -err_clk_unprepare:
> - clk_unprepare(ipu->clk);
> - return err;
> }
>
> static void ingenic_ipu_unbind(struct device *dev,
> struct device *master, void *d)
> {
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 10/15] drm/msm: mdp5: Switch private_obj initialization to atomic_create_state
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (8 preceding siblings ...)
2026-01-19 12:50 ` [PATCH v3 09/15] drm/ingenic: " Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 11/15] drm/msm: dpu1: " Maxime Ripard
` (4 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Dmitry Baryshkov, Rob Clark,
Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang, Sean Paul,
Marijn Suijten, linux-arm-msm, freedreno
The MSM mdp5 driver relies on a drm_private_obj, that is initialized by
allocating and initializing a state, and then passing it to
drm_private_obj_init.
Since we're gradually moving away from that pattern to the more
established one relying on a atomic_create_state implementation, let's
migrate this instance to the new pattern.
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Rob Clark <robin.clark@oss.qualcomm.com>
Cc: Dmitry Baryshkov <lumag@kernel.org>
Cc: Abhinav Kumar <abhinav.kumar@linux.dev>
Cc: Jessica Zhang <jessica.zhang@oss.qualcomm.com>
Cc: Sean Paul <sean@poorly.run>
Cc: Marijn Suijten <marijn.suijten@somainline.org>
Cc: linux-arm-msm@vger.kernel.org
Cc: freedreno@lists.freedesktop.org
---
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 41 +++++++++++++++++---------------
1 file changed, 22 insertions(+), 19 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 61edf6864092664afe474cc8d1fd097ca495ebb8..1fc9671590762b800bdeb6cd440b1ae6ee634679 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -112,41 +112,44 @@ static void mdp5_global_destroy_state(struct drm_private_obj *obj,
struct mdp5_global_state *mdp5_state = to_mdp5_global_state(state);
kfree(mdp5_state);
}
+static struct drm_private_state *
+mdp5_global_create_state(struct drm_private_obj *obj)
+{
+ struct drm_device *dev = obj->dev;
+ struct msm_drm_private *priv = dev->dev_private;
+ struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms));
+ struct mdp5_global_state *mdp5_state;
+
+ mdp5_state = kzalloc(sizeof(*mdp5_state), GFP_KERNEL);
+ if (!mdp5_state)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &mdp5_state->base);
+ mdp5_state->mdp5_kms = mdp5_kms;
+
+ return &mdp5_state->base;
+}
+
static void mdp5_global_print_state(struct drm_printer *p,
const struct drm_private_state *state)
{
struct mdp5_global_state *mdp5_state = to_mdp5_global_state(state);
if (mdp5_state->mdp5_kms->smp)
mdp5_smp_dump(mdp5_state->mdp5_kms->smp, p, mdp5_state);
}
static const struct drm_private_state_funcs mdp5_global_state_funcs = {
+ .atomic_create_state = mdp5_global_create_state,
.atomic_duplicate_state = mdp5_global_duplicate_state,
.atomic_destroy_state = mdp5_global_destroy_state,
.atomic_print_state = mdp5_global_print_state,
};
-static int mdp5_global_obj_init(struct mdp5_kms *mdp5_kms)
-{
- struct mdp5_global_state *state;
-
- state = kzalloc(sizeof(*state), GFP_KERNEL);
- if (!state)
- return -ENOMEM;
-
- state->mdp5_kms = mdp5_kms;
-
- drm_atomic_private_obj_init(mdp5_kms->dev, &mdp5_kms->glob_state,
- &state->base,
- &mdp5_global_state_funcs);
- return 0;
-}
-
static void mdp5_enable_commit(struct msm_kms *kms)
{
struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
pm_runtime_get_sync(&mdp5_kms->pdev->dev);
}
@@ -711,13 +714,13 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
u32 major, minor;
int ret;
mdp5_kms->dev = dev;
- ret = mdp5_global_obj_init(mdp5_kms);
- if (ret)
- goto fail;
+ drm_atomic_private_obj_init(mdp5_kms->dev, &mdp5_kms->glob_state,
+ NULL,
+ &mdp5_global_state_funcs);
/* we need to set a default rate before enabling. Set a safe
* rate first, then figure out hw revision, and then set a
* more optimal rate:
*/
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v3 11/15] drm/msm: dpu1: Switch private_obj initialization to atomic_create_state
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (9 preceding siblings ...)
2026-01-19 12:50 ` [PATCH v3 10/15] drm/msm: mdp5: " Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 12/15] drm/omapdrm: " Maxime Ripard
` (3 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Dmitry Baryshkov, Rob Clark,
Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang, Sean Paul,
Marijn Suijten, linux-arm-msm, freedreno
The MSM dpu1 driver relies on a drm_private_obj, that is initialized by
allocating and initializing a state, and then passing it to
drm_private_obj_init.
Since we're gradually moving away from that pattern to the more
established one relying on a atomic_create_state implementation, let's
migrate this instance to the new pattern.
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Rob Clark <robin.clark@oss.qualcomm.com>
Cc: Dmitry Baryshkov <lumag@kernel.org>
Cc: Abhinav Kumar <abhinav.kumar@linux.dev>
Cc: Jessica Zhang <jessica.zhang@oss.qualcomm.com>
Cc: Sean Paul <sean@poorly.run>
Cc: Marijn Suijten <marijn.suijten@somainline.org>
Cc: linux-arm-msm@vger.kernel.org
Cc: freedreno@lists.freedesktop.org
---
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 42 +++++++++++++++++----------------
1 file changed, 22 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index f4c9767c418d38eb487934da03b352ce7063df16..e33995a9522d2a9e8d0627069f7b5f44902278de 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -365,41 +365,43 @@ static void dpu_kms_global_destroy_state(struct drm_private_obj *obj,
struct dpu_global_state *dpu_state = to_dpu_global_state(state);
kfree(dpu_state);
}
+static struct drm_private_state *
+dpu_kms_global_create_state(struct drm_private_obj *obj)
+{
+ struct drm_device *dev = obj->dev;
+ struct msm_drm_private *priv = dev->dev_private;
+ struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
+ struct dpu_global_state *dpu_state;
+
+ dpu_state = kzalloc(sizeof(*dpu_state), GFP_KERNEL);
+ if (!dpu_state)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &dpu_state->base);
+ dpu_state->rm = &dpu_kms->rm;
+
+ return &dpu_state->base;
+}
+
static void dpu_kms_global_print_state(struct drm_printer *p,
const struct drm_private_state *state)
{
const struct dpu_global_state *global_state = to_dpu_global_state(state);
dpu_rm_print_state(p, global_state);
}
static const struct drm_private_state_funcs dpu_kms_global_state_funcs = {
+ .atomic_create_state = dpu_kms_global_create_state,
.atomic_duplicate_state = dpu_kms_global_duplicate_state,
.atomic_destroy_state = dpu_kms_global_destroy_state,
.atomic_print_state = dpu_kms_global_print_state,
};
-static int dpu_kms_global_obj_init(struct dpu_kms *dpu_kms)
-{
- struct dpu_global_state *state;
-
- state = kzalloc(sizeof(*state), GFP_KERNEL);
- if (!state)
- return -ENOMEM;
-
- drm_atomic_private_obj_init(dpu_kms->dev, &dpu_kms->global_state,
- &state->base,
- &dpu_kms_global_state_funcs);
-
- state->rm = &dpu_kms->rm;
-
- return 0;
-}
-
static void dpu_kms_global_obj_fini(struct dpu_kms *dpu_kms)
{
drm_atomic_private_obj_fini(&dpu_kms->global_state);
}
@@ -1156,13 +1158,13 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
dev = dpu_kms->dev;
dev->mode_config.cursor_width = 512;
dev->mode_config.cursor_height = 512;
- rc = dpu_kms_global_obj_init(dpu_kms);
- if (rc)
- return rc;
+ drm_atomic_private_obj_init(dpu_kms->dev, &dpu_kms->global_state,
+ NULL,
+ &dpu_kms_global_state_funcs);
atomic_set(&dpu_kms->bandwidth_ref, 0);
rc = pm_runtime_resume_and_get(&dpu_kms->pdev->dev);
if (rc < 0)
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v3 12/15] drm/omapdrm: Switch private_obj initialization to atomic_create_state
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (10 preceding siblings ...)
2026-01-19 12:50 ` [PATCH v3 11/15] drm/msm: dpu1: " Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 13/15] drm/tegra: " Maxime Ripard
` (2 subsequent siblings)
14 siblings, 0 replies; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Tomi Valkeinen
The omapdrm driver relies on a drm_private_obj, that is initialized by
allocating and initializing a state, and then passing it to
drm_private_obj_init.
Since we're gradually moving away from that pattern to the more
established one relying on a atomic_create_state implementation, let's
migrate this instance to the new pattern.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
---
drivers/gpu/drm/omapdrm/omap_drv.c | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 1b96343226a5ed8571bed70200b2af9eccca7c84..febee3fea01dd40faec7d631279b1393a17822ba 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -273,25 +273,35 @@ static void omap_global_destroy_state(struct drm_private_obj *obj,
struct omap_global_state *omap_state = to_omap_global_state(state);
kfree(omap_state);
}
+static struct drm_private_state *
+omap_global_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct omap_global_state *state;
+
+ state = kzalloc(sizeof(*state), GFP_KERNEL);
+ if (!state)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &state->base);
+
+ return &state->base;
+}
+
static const struct drm_private_state_funcs omap_global_state_funcs = {
+ .atomic_create_state = omap_global_atomic_create_state,
.atomic_duplicate_state = omap_global_duplicate_state,
.atomic_destroy_state = omap_global_destroy_state,
};
static int omap_global_obj_init(struct drm_device *dev)
{
struct omap_drm_private *priv = dev->dev_private;
- struct omap_global_state *state;
- state = kzalloc(sizeof(*state), GFP_KERNEL);
- if (!state)
- return -ENOMEM;
-
- drm_atomic_private_obj_init(dev, &priv->glob_obj, &state->base,
+ drm_atomic_private_obj_init(dev, &priv->glob_obj, NULL,
&omap_global_state_funcs);
return 0;
}
static void omap_global_obj_fini(struct omap_drm_private *priv)
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v3 13/15] drm/tegra: Switch private_obj initialization to atomic_create_state
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (11 preceding siblings ...)
2026-01-19 12:50 ` [PATCH v3 12/15] drm/omapdrm: " Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 14/15] drm/vc4: " Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 15/15] drm/atomic: Remove state argument to drm_atomic_private_obj_init Maxime Ripard
14 siblings, 0 replies; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Thierry Reding, Mikko Perttunen,
Jonathan Hunter, linux-tegra
The tegra driver relies on a drm_private_obj, that is initialized by
allocating and initializing a state, and then passing it to
drm_private_obj_init.
Since we're gradually moving away from that pattern to the more
established one relying on a atomic_create_state implementation, let's
migrate this instance to the new pattern.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Mikko Perttunen <mperttunen@nvidia.com>
Cc: Jonathan Hunter <jonathanh@nvidia.com>
Cc: linux-tegra@vger.kernel.org
---
drivers/gpu/drm/tegra/hub.c | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/tegra/hub.c b/drivers/gpu/drm/tegra/hub.c
index c924ffba409426cdc8719b208c74908d0e9fc544..e8cc4382532fffaea99020755ad78d3252613c26 100644
--- a/drivers/gpu/drm/tegra/hub.c
+++ b/drivers/gpu/drm/tegra/hub.c
@@ -823,11 +823,26 @@ static void tegra_display_hub_destroy_state(struct drm_private_obj *obj,
to_tegra_display_hub_state(state);
kfree(hub_state);
}
+static struct drm_private_state *
+tegra_display_hub_create_state(struct drm_private_obj *obj)
+{
+ struct tegra_display_hub_state *hub_state;
+
+ hub_state = kzalloc(sizeof(*hub_state), GFP_KERNEL);
+ if (!hub_state)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &hub_state->base);
+
+ return &hub_state->base;
+}
+
static const struct drm_private_state_funcs tegra_display_hub_state_funcs = {
+ .atomic_create_state = tegra_display_hub_create_state,
.atomic_duplicate_state = tegra_display_hub_duplicate_state,
.atomic_destroy_state = tegra_display_hub_destroy_state,
};
static struct tegra_display_hub_state *
@@ -939,17 +954,12 @@ void tegra_display_hub_atomic_commit(struct drm_device *drm,
static int tegra_display_hub_init(struct host1x_client *client)
{
struct tegra_display_hub *hub = to_tegra_display_hub(client);
struct drm_device *drm = dev_get_drvdata(client->host);
struct tegra_drm *tegra = drm->dev_private;
- struct tegra_display_hub_state *state;
- state = kzalloc(sizeof(*state), GFP_KERNEL);
- if (!state)
- return -ENOMEM;
-
- drm_atomic_private_obj_init(drm, &hub->base, &state->base,
+ drm_atomic_private_obj_init(drm, &hub->base, NULL,
&tegra_display_hub_state_funcs);
tegra->hub = hub;
return 0;
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v3 14/15] drm/vc4: Switch private_obj initialization to atomic_create_state
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (12 preceding siblings ...)
2026-01-19 12:50 ` [PATCH v3 13/15] drm/tegra: " Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-19 12:50 ` [PATCH v3 15/15] drm/atomic: Remove state argument to drm_atomic_private_obj_init Maxime Ripard
14 siblings, 0 replies; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Dave Stevenson, Maíra Canal,
kernel-list
The vc4 driver relies on a drm_private_obj, that is initialized by
allocating and initializing a state, and then passing it to
drm_private_obj_init.
Since we're gradually moving away from that pattern to the more
established one relying on a atomic_create_state implementation, let's
migrate this instance to the new pattern.
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
Cc: Dave Stevenson <dave.stevenson@raspberrypi.com>
Cc: "Maíra Canal" <mcanal@igalia.com>
Cc: kernel-list@raspberrypi.com
---
drivers/gpu/drm/vc4/vc4_kms.c | 69 ++++++++++++++++++++++++++++++-------------
1 file changed, 48 insertions(+), 21 deletions(-)
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index e563c12109371619605d8e3f78b0f92694dbe5a5..f82c7ea1d74eeaa075296533a1ffe3561f197748 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -83,11 +83,26 @@ static void vc4_ctm_destroy_state(struct drm_private_obj *obj,
struct vc4_ctm_state *ctm_state = to_vc4_ctm_state(state);
kfree(ctm_state);
}
+static struct drm_private_state *
+vc4_ctm_create_state(struct drm_private_obj *obj)
+{
+ struct vc4_ctm_state *ctm_state;
+
+ ctm_state = kzalloc(sizeof(*ctm_state), GFP_KERNEL);
+ if (!ctm_state)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &ctm_state->base);
+
+ return &ctm_state->base;
+}
+
static const struct drm_private_state_funcs vc4_ctm_state_funcs = {
+ .atomic_create_state = vc4_ctm_create_state,
.atomic_duplicate_state = vc4_ctm_duplicate_state,
.atomic_destroy_state = vc4_ctm_destroy_state,
};
static void vc4_ctm_obj_fini(struct drm_device *dev, void *unused)
@@ -97,19 +112,13 @@ static void vc4_ctm_obj_fini(struct drm_device *dev, void *unused)
drm_atomic_private_obj_fini(&vc4->ctm_manager);
}
static int vc4_ctm_obj_init(struct vc4_dev *vc4)
{
- struct vc4_ctm_state *ctm_state;
-
drm_modeset_lock_init(&vc4->ctm_state_lock);
- ctm_state = kzalloc(sizeof(*ctm_state), GFP_KERNEL);
- if (!ctm_state)
- return -ENOMEM;
-
- drm_atomic_private_obj_init(&vc4->base, &vc4->ctm_manager, &ctm_state->base,
+ drm_atomic_private_obj_init(&vc4->base, &vc4->ctm_manager, NULL,
&vc4_ctm_state_funcs);
return drmm_add_action_or_reset(&vc4->base, vc4_ctm_obj_fini, NULL);
}
@@ -716,13 +725,28 @@ static void vc4_load_tracker_destroy_state(struct drm_private_obj *obj,
load_state = to_vc4_load_tracker_state(state);
kfree(load_state);
}
+static struct drm_private_state *
+vc4_load_tracker_create_state(struct drm_private_obj *obj)
+{
+ struct vc4_load_tracker_state *load_state;
+
+ load_state = kzalloc(sizeof(*load_state), GFP_KERNEL);
+ if (!load_state)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &load_state->base);
+
+ return &load_state->base;
+}
+
static const struct drm_private_state_funcs vc4_load_tracker_state_funcs = {
.atomic_duplicate_state = vc4_load_tracker_duplicate_state,
.atomic_destroy_state = vc4_load_tracker_destroy_state,
+ .atomic_create_state = vc4_load_tracker_create_state,
};
static void vc4_load_tracker_obj_fini(struct drm_device *dev, void *unused)
{
struct vc4_dev *vc4 = to_vc4_dev(dev);
@@ -730,18 +754,12 @@ static void vc4_load_tracker_obj_fini(struct drm_device *dev, void *unused)
drm_atomic_private_obj_fini(&vc4->load_tracker);
}
static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
{
- struct vc4_load_tracker_state *load_state;
-
- load_state = kzalloc(sizeof(*load_state), GFP_KERNEL);
- if (!load_state)
- return -ENOMEM;
-
drm_atomic_private_obj_init(&vc4->base, &vc4->load_tracker,
- &load_state->base,
+ NULL,
&vc4_load_tracker_state_funcs);
return drmm_add_action_or_reset(&vc4->base, vc4_load_tracker_obj_fini, NULL);
}
@@ -798,11 +816,26 @@ static void vc4_hvs_channels_print_state(struct drm_printer *p,
drm_printf(p, "\t\tin use=%d\n", hvs_state->fifo_state[i].in_use);
drm_printf(p, "\t\tload=%lu\n", hvs_state->fifo_state[i].fifo_load);
}
}
+static struct drm_private_state *
+vc4_hvs_channels_create_state(struct drm_private_obj *obj)
+{
+ struct vc4_hvs_state *hvs_state;
+
+ hvs_state = kzalloc(sizeof(*hvs_state), GFP_KERNEL);
+ if (!hvs_state)
+ return ERR_PTR(-ENOMEM);
+
+ __drm_atomic_helper_private_obj_create_state(obj, &hvs_state->base);
+
+ return &hvs_state->base;
+}
+
static const struct drm_private_state_funcs vc4_hvs_state_funcs = {
+ .atomic_create_state = vc4_hvs_channels_create_state,
.atomic_duplicate_state = vc4_hvs_channels_duplicate_state,
.atomic_destroy_state = vc4_hvs_channels_destroy_state,
.atomic_print_state = vc4_hvs_channels_print_state,
};
@@ -813,18 +846,12 @@ static void vc4_hvs_channels_obj_fini(struct drm_device *dev, void *unused)
drm_atomic_private_obj_fini(&vc4->hvs_channels);
}
static int vc4_hvs_channels_obj_init(struct vc4_dev *vc4)
{
- struct vc4_hvs_state *state;
-
- state = kzalloc(sizeof(*state), GFP_KERNEL);
- if (!state)
- return -ENOMEM;
-
drm_atomic_private_obj_init(&vc4->base, &vc4->hvs_channels,
- &state->base,
+ NULL,
&vc4_hvs_state_funcs);
return drmm_add_action_or_reset(&vc4->base, vc4_hvs_channels_obj_fini, NULL);
}
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v3 15/15] drm/atomic: Remove state argument to drm_atomic_private_obj_init
2026-01-19 12:49 [PATCH v3 00/15] drm/atomic: Allocate drm_private_state through a callback Maxime Ripard
` (13 preceding siblings ...)
2026-01-19 12:50 ` [PATCH v3 14/15] drm/vc4: " Maxime Ripard
@ 2026-01-19 12:50 ` Maxime Ripard
2026-01-20 14:45 ` Liviu Dudau
14 siblings, 1 reply; 24+ messages in thread
From: Maxime Ripard @ 2026-01-19 12:50 UTC (permalink / raw)
To: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter
Cc: dri-devel, Maxime Ripard, Dmitry Baryshkov, Tomi Valkeinen,
Liviu Dudau, Andrzej Hajda, Neil Armstrong, Robert Foss,
Paul Cercueil, Thierry Reding, Mikko Perttunen, Jonathan Hunter,
Dave Stevenson, Rodrigo Siqueira, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Abhinav Kumar, Jessica Zhang, Sean Paul,
Marijn Suijten, Maíra Canal, Raspberry Pi Kernel Maintenance,
amd-gfx, linux-mips, linux-arm-msm, freedreno, linux-tegra
Now that all drm_private_objs users have been converted to use
atomic_create_state instead of the old ad-hoc initialization, we can
remove the state parameter from drm_private_obj_init and the fallback
code.
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Maxime Ripard <mripard@kernel.org>
---
To: Liviu Dudau <liviu.dudau@arm.com>
To: Andrzej Hajda <andrzej.hajda@intel.com>
To: Neil Armstrong <neil.armstrong@linaro.org>
To: Robert Foss <rfoss@kernel.org>
To: Paul Cercueil <paul@crapouillou.net>
To: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
To: Thierry Reding <thierry.reding@gmail.com>
To: Mikko Perttunen <mperttunen@nvidia.com>
To: Jonathan Hunter <jonathanh@nvidia.com>
To: Dave Stevenson <dave.stevenson@raspberrypi.com>
Cc: Rodrigo Siqueira <siqueira@igalia.com>
Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
Cc: Jonas Karlman <jonas@kwiboo.se>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: Abhinav Kumar <abhinav.kumar@linux.dev>
Cc: Jessica Zhang <jessica.zhang@oss.qualcomm.com>
Cc: Sean Paul <sean@poorly.run>
Cc: Marijn Suijten <marijn.suijten@somainline.org>
Cc: "Maíra Canal" <mcanal@igalia.com>
Cc: Raspberry Pi Kernel Maintenance <kernel-list@raspberrypi.com>
Cc: amd-gfx@lists.freedesktop.org
Cc: linux-mips@vger.kernel.org
Cc: linux-arm-msm@vger.kernel.org
Cc: freedreno@lists.freedesktop.org
Cc: linux-tegra@vger.kernel.org
---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 1 -
.../drm/arm/display/komeda/komeda_private_obj.c | 16 ++++++++--------
drivers/gpu/drm/display/drm_dp_mst_topology.c | 1 -
drivers/gpu/drm/display/drm_dp_tunnel.c | 2 +-
drivers/gpu/drm/drm_atomic.c | 22 +++++-----------------
drivers/gpu/drm/drm_bridge.c | 1 -
drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 2 +-
drivers/gpu/drm/ingenic/ingenic-ipu.c | 2 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 -
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 1 -
drivers/gpu/drm/omapdrm/omap_drv.c | 2 +-
drivers/gpu/drm/tegra/hub.c | 2 +-
drivers/gpu/drm/vc4/vc4_kms.c | 4 +---
include/drm/drm_atomic.h | 1 -
14 files changed, 19 insertions(+), 39 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index a97e1bf1bfdc6384a6ac83f907878807bb3b62a0..cff3d00a367728449b4a4de4cc9f3c9036e3924f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4932,11 +4932,10 @@ static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev)
/* indicates support for immediate flip */
adev_to_drm(adev)->mode_config.async_page_flip = true;
drm_atomic_private_obj_init(adev_to_drm(adev),
&adev->dm.atomic_obj,
- NULL,
&dm_atomic_state_funcs);
r = amdgpu_display_modeset_create_props(adev);
if (r)
return r;
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c b/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
index 4994b69c6595637ea832b97629b052e3aea97ee7..6270e5c525db221267b1215a27653ace578eeb0a 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
@@ -63,11 +63,11 @@ static const struct drm_private_state_funcs komeda_layer_obj_funcs = {
};
static int komeda_layer_obj_add(struct komeda_kms_dev *kms,
struct komeda_layer *layer)
{
- drm_atomic_private_obj_init(&kms->base, &layer->base.obj, NULL,
+ drm_atomic_private_obj_init(&kms->base, &layer->base.obj,
&komeda_layer_obj_funcs);
return 0;
}
static struct drm_private_state *
@@ -116,11 +116,11 @@ static const struct drm_private_state_funcs komeda_scaler_obj_funcs = {
static int komeda_scaler_obj_add(struct komeda_kms_dev *kms,
struct komeda_scaler *scaler)
{
drm_atomic_private_obj_init(&kms->base,
- &scaler->base.obj, NULL,
+ &scaler->base.obj,
&komeda_scaler_obj_funcs);
return 0;
}
static struct drm_private_state *
@@ -168,11 +168,11 @@ static const struct drm_private_state_funcs komeda_compiz_obj_funcs = {
};
static int komeda_compiz_obj_add(struct komeda_kms_dev *kms,
struct komeda_compiz *compiz)
{
- drm_atomic_private_obj_init(&kms->base, &compiz->base.obj, NULL,
+ drm_atomic_private_obj_init(&kms->base, &compiz->base.obj,
&komeda_compiz_obj_funcs);
return 0;
}
@@ -222,11 +222,11 @@ static const struct drm_private_state_funcs komeda_splitter_obj_funcs = {
static int komeda_splitter_obj_add(struct komeda_kms_dev *kms,
struct komeda_splitter *splitter)
{
drm_atomic_private_obj_init(&kms->base,
- &splitter->base.obj, NULL,
+ &splitter->base.obj,
&komeda_splitter_obj_funcs);
return 0;
}
@@ -275,11 +275,11 @@ static const struct drm_private_state_funcs komeda_merger_obj_funcs = {
static int komeda_merger_obj_add(struct komeda_kms_dev *kms,
struct komeda_merger *merger)
{
drm_atomic_private_obj_init(&kms->base,
- &merger->base.obj, NULL,
+ &merger->base.obj,
&komeda_merger_obj_funcs);
return 0;
}
@@ -328,11 +328,11 @@ static const struct drm_private_state_funcs komeda_improc_obj_funcs = {
};
static int komeda_improc_obj_add(struct komeda_kms_dev *kms,
struct komeda_improc *improc)
{
- drm_atomic_private_obj_init(&kms->base, &improc->base.obj, NULL,
+ drm_atomic_private_obj_init(&kms->base, &improc->base.obj,
&komeda_improc_obj_funcs);
return 0;
}
@@ -381,11 +381,11 @@ static const struct drm_private_state_funcs komeda_timing_ctrlr_obj_funcs = {
};
static int komeda_timing_ctrlr_obj_add(struct komeda_kms_dev *kms,
struct komeda_timing_ctrlr *ctrlr)
{
- drm_atomic_private_obj_init(&kms->base, &ctrlr->base.obj, NULL,
+ drm_atomic_private_obj_init(&kms->base, &ctrlr->base.obj,
&komeda_timing_ctrlr_obj_funcs);
return 0;
}
@@ -435,11 +435,11 @@ static const struct drm_private_state_funcs komeda_pipeline_obj_funcs = {
};
static int komeda_pipeline_obj_add(struct komeda_kms_dev *kms,
struct komeda_pipeline *pipe)
{
- drm_atomic_private_obj_init(&kms->base, &pipe->obj, NULL,
+ drm_atomic_private_obj_init(&kms->base, &pipe->obj,
&komeda_pipeline_obj_funcs);
return 0;
}
diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c
index 1ab0233a2a18f784d8c43e61b94e40a06bd4baf6..7e0e5b90df7251beed6985e16d1c3270ddfb3f37 100644
--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
@@ -5763,11 +5763,10 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
mgr->max_dpcd_transaction_bytes = max_dpcd_transaction_bytes;
mgr->max_payloads = max_payloads;
mgr->conn_base_id = conn_base_id;
drm_atomic_private_obj_init(dev, &mgr->base,
- NULL,
&drm_dp_mst_topology_state_funcs);
return 0;
}
EXPORT_SYMBOL(drm_dp_mst_topology_mgr_init);
diff --git a/drivers/gpu/drm/display/drm_dp_tunnel.c b/drivers/gpu/drm/display/drm_dp_tunnel.c
index 2abd714efd19f27697770813b38194e384be87ce..241498cef7de497afdf2837f750113743c001240 100644
--- a/drivers/gpu/drm/display/drm_dp_tunnel.c
+++ b/drivers/gpu/drm/display/drm_dp_tunnel.c
@@ -1598,11 +1598,11 @@ static bool init_group(struct drm_dp_tunnel_mgr *mgr, struct drm_dp_tunnel_group
{
group->mgr = mgr;
group->available_bw = -1;
INIT_LIST_HEAD(&group->tunnels);
- drm_atomic_private_obj_init(mgr->dev, &group->base, NULL,
+ drm_atomic_private_obj_init(mgr->dev, &group->base,
&tunnel_group_funcs);
return true;
}
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index e3029c8f02e5a3698781117bcc80eff98407cf16..243579fa1c756cd2eda660ad658cb49d67106584 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -919,11 +919,10 @@ static void drm_atomic_plane_print_state(struct drm_printer *p,
/**
* drm_atomic_private_obj_init - initialize private object
* @dev: DRM device this object will be attached to
* @obj: private object
- * @state: initial private object state
* @funcs: pointer to the struct of function pointers that identify the object
* type
*
* Initialize the private object, which can be embedded into any
* driver private object that needs its own atomic state.
@@ -931,37 +930,26 @@ static void drm_atomic_plane_print_state(struct drm_printer *p,
* RETURNS:
* Zero on success, error code on failure
*/
int drm_atomic_private_obj_init(struct drm_device *dev,
struct drm_private_obj *obj,
- struct drm_private_state *state,
const struct drm_private_state_funcs *funcs)
{
+ struct drm_private_state *state;
memset(obj, 0, sizeof(*obj));
drm_modeset_lock_init(&obj->lock);
obj->dev = dev;
obj->funcs = funcs;
list_add_tail(&obj->head, &dev->mode_config.privobj_list);
- /*
- * Not all users of drm_atomic_private_obj_init have been
- * converted to using &drm_private_obj_funcs.atomic_create_state 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) {
- state = obj->funcs->atomic_create_state(obj);
- if (IS_ERR(state))
- return PTR_ERR(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;
- }
+ obj->state = state;
return 0;
}
EXPORT_SYMBOL(drm_atomic_private_obj_init);
diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
index 316cf84519de54c4dc4bfb3bc3addc4990a200f5..4b120751605e15e0d07ebe1d4a7324c0ccfc34dd 100644
--- a/drivers/gpu/drm/drm_bridge.c
+++ b/drivers/gpu/drm/drm_bridge.c
@@ -553,11 +553,10 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
goto err_reset_bridge;
}
if (drm_bridge_is_atomic(bridge))
drm_atomic_private_obj_init(bridge->dev, &bridge->base,
- NULL,
&drm_bridge_priv_state_funcs);
return 0;
err_reset_bridge:
diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index 862691991ed2770d30342bf531e828e34bd7080a..e6b003c16e63609180881b1d3b0c7acbd5218ada 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -1399,11 +1399,11 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)
if (ret) {
dev_err(dev, "Unable to register clock notifier\n");
goto err_devclk_disable;
}
- drm_atomic_private_obj_init(drm, &priv->private_obj, NULL,
+ drm_atomic_private_obj_init(drm, &priv->private_obj,
&ingenic_drm_private_state_funcs);
ret = drmm_add_action_or_reset(drm, ingenic_drm_atomic_private_obj_fini,
&priv->private_obj);
if (ret)
diff --git a/drivers/gpu/drm/ingenic/ingenic-ipu.c b/drivers/gpu/drm/ingenic/ingenic-ipu.c
index 253a1ce30997308547b61339468d52e6875785d3..635ef2b1efa57556f32fded612f0ff1068e23e8c 100644
--- a/drivers/gpu/drm/ingenic/ingenic-ipu.c
+++ b/drivers/gpu/drm/ingenic/ingenic-ipu.c
@@ -899,11 +899,11 @@ static int ingenic_ipu_bind(struct device *dev, struct device *master, void *d)
if (err) {
dev_err(dev, "Unable to prepare clock\n");
return err;
}
- drm_atomic_private_obj_init(drm, &ipu->private_obj, NULL,
+ drm_atomic_private_obj_init(drm, &ipu->private_obj,
&ingenic_ipu_private_state_funcs);
return 0;
}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index e33995a9522d2a9e8d0627069f7b5f44902278de..e52fd6b79c614a67d910e404efc24be014ec8f5e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1159,11 +1159,10 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
dev->mode_config.cursor_width = 512;
dev->mode_config.cursor_height = 512;
drm_atomic_private_obj_init(dpu_kms->dev, &dpu_kms->global_state,
- NULL,
&dpu_kms_global_state_funcs);
atomic_set(&dpu_kms->bandwidth_ref, 0);
rc = pm_runtime_resume_and_get(&dpu_kms->pdev->dev);
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 1fc9671590762b800bdeb6cd440b1ae6ee634679..c41bb03e5b96a162340b886d32656dfe4b0d1a99 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -715,11 +715,10 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
int ret;
mdp5_kms->dev = dev;
drm_atomic_private_obj_init(mdp5_kms->dev, &mdp5_kms->glob_state,
- NULL,
&mdp5_global_state_funcs);
/* we need to set a default rate before enabling. Set a safe
* rate first, then figure out hw revision, and then set a
* more optimal rate:
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index febee3fea01dd40faec7d631279b1393a17822ba..27de798026365f710b78306a7ec2a72ddff20828 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -297,11 +297,11 @@ static const struct drm_private_state_funcs omap_global_state_funcs = {
static int omap_global_obj_init(struct drm_device *dev)
{
struct omap_drm_private *priv = dev->dev_private;
- drm_atomic_private_obj_init(dev, &priv->glob_obj, NULL,
+ drm_atomic_private_obj_init(dev, &priv->glob_obj,
&omap_global_state_funcs);
return 0;
}
static void omap_global_obj_fini(struct omap_drm_private *priv)
diff --git a/drivers/gpu/drm/tegra/hub.c b/drivers/gpu/drm/tegra/hub.c
index e8cc4382532fffaea99020755ad78d3252613c26..5c7fd36aaadc405b9dae0acb1e8b4f12f12c84bd 100644
--- a/drivers/gpu/drm/tegra/hub.c
+++ b/drivers/gpu/drm/tegra/hub.c
@@ -955,11 +955,11 @@ static int tegra_display_hub_init(struct host1x_client *client)
{
struct tegra_display_hub *hub = to_tegra_display_hub(client);
struct drm_device *drm = dev_get_drvdata(client->host);
struct tegra_drm *tegra = drm->dev_private;
- drm_atomic_private_obj_init(drm, &hub->base, NULL,
+ drm_atomic_private_obj_init(drm, &hub->base,
&tegra_display_hub_state_funcs);
tegra->hub = hub;
return 0;
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index f82c7ea1d74eeaa075296533a1ffe3561f197748..8f60e9e98380984a0de7c9243c5ba703316d0c13 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -114,11 +114,11 @@ static void vc4_ctm_obj_fini(struct drm_device *dev, void *unused)
static int vc4_ctm_obj_init(struct vc4_dev *vc4)
{
drm_modeset_lock_init(&vc4->ctm_state_lock);
- drm_atomic_private_obj_init(&vc4->base, &vc4->ctm_manager, NULL,
+ drm_atomic_private_obj_init(&vc4->base, &vc4->ctm_manager,
&vc4_ctm_state_funcs);
return drmm_add_action_or_reset(&vc4->base, vc4_ctm_obj_fini, NULL);
}
@@ -755,11 +755,10 @@ static void vc4_load_tracker_obj_fini(struct drm_device *dev, void *unused)
}
static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
{
drm_atomic_private_obj_init(&vc4->base, &vc4->load_tracker,
- NULL,
&vc4_load_tracker_state_funcs);
return drmm_add_action_or_reset(&vc4->base, vc4_load_tracker_obj_fini, NULL);
}
@@ -847,11 +846,10 @@ static void vc4_hvs_channels_obj_fini(struct drm_device *dev, void *unused)
}
static int vc4_hvs_channels_obj_init(struct vc4_dev *vc4)
{
drm_atomic_private_obj_init(&vc4->base, &vc4->hvs_channels,
- NULL,
&vc4_hvs_state_funcs);
return drmm_add_action_or_reset(&vc4->base, vc4_hvs_channels_obj_fini, NULL);
}
diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
index 0b1b32bcd2bda1b92299fd369ba7c23b1c2d3dfa..f03cd199aee73fa8e15b2d9e16a53d134fc7de7d 100644
--- a/include/drm/drm_atomic.h
+++ b/include/drm/drm_atomic.h
@@ -736,11 +736,10 @@ struct drm_connector_state * __must_check
drm_atomic_get_connector_state(struct drm_atomic_state *state,
struct drm_connector *connector);
int drm_atomic_private_obj_init(struct drm_device *dev,
struct drm_private_obj *obj,
- struct drm_private_state *state,
const struct drm_private_state_funcs *funcs);
void drm_atomic_private_obj_fini(struct drm_private_obj *obj);
struct drm_private_state * __must_check
drm_atomic_get_private_obj_state(struct drm_atomic_state *state,
--
2.52.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 15/15] drm/atomic: Remove state argument to drm_atomic_private_obj_init
2026-01-19 12:50 ` [PATCH v3 15/15] drm/atomic: Remove state argument to drm_atomic_private_obj_init Maxime Ripard
@ 2026-01-20 14:45 ` Liviu Dudau
0 siblings, 0 replies; 24+ messages in thread
From: Liviu Dudau @ 2026-01-20 14:45 UTC (permalink / raw)
To: Maxime Ripard
Cc: Maarten Lankhorst, Thomas Zimmermann, David Airlie, Simona Vetter,
dri-devel, Dmitry Baryshkov, Tomi Valkeinen, Andrzej Hajda,
Neil Armstrong, Robert Foss, Paul Cercueil, Thierry Reding,
Mikko Perttunen, Jonathan Hunter, Dave Stevenson,
Rodrigo Siqueira, Laurent Pinchart, Jonas Karlman, Jernej Skrabec,
Abhinav Kumar, Jessica Zhang, Sean Paul, Marijn Suijten,
Maíra Canal, Raspberry Pi Kernel Maintenance, amd-gfx,
linux-mips, linux-arm-msm, freedreno, linux-tegra
On Mon, Jan 19, 2026 at 01:50:11PM +0100, Maxime Ripard wrote:
> Now that all drm_private_objs users have been converted to use
> atomic_create_state instead of the old ad-hoc initialization, we can
> remove the state parameter from drm_private_obj_init and the fallback
> code.
>
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> Signed-off-by: Maxime Ripard <mripard@kernel.org>
> ---
>
> To: Liviu Dudau <liviu.dudau@arm.com>
> To: Andrzej Hajda <andrzej.hajda@intel.com>
> To: Neil Armstrong <neil.armstrong@linaro.org>
> To: Robert Foss <rfoss@kernel.org>
> To: Paul Cercueil <paul@crapouillou.net>
> To: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
> To: Thierry Reding <thierry.reding@gmail.com>
> To: Mikko Perttunen <mperttunen@nvidia.com>
> To: Jonathan Hunter <jonathanh@nvidia.com>
> To: Dave Stevenson <dave.stevenson@raspberrypi.com>
> Cc: Rodrigo Siqueira <siqueira@igalia.com>
> Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
> Cc: Jonas Karlman <jonas@kwiboo.se>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: Abhinav Kumar <abhinav.kumar@linux.dev>
> Cc: Jessica Zhang <jessica.zhang@oss.qualcomm.com>
> Cc: Sean Paul <sean@poorly.run>
> Cc: Marijn Suijten <marijn.suijten@somainline.org>
> Cc: "Maíra Canal" <mcanal@igalia.com>
> Cc: Raspberry Pi Kernel Maintenance <kernel-list@raspberrypi.com>
> Cc: amd-gfx@lists.freedesktop.org
> Cc: linux-mips@vger.kernel.org
> Cc: linux-arm-msm@vger.kernel.org
> Cc: freedreno@lists.freedesktop.org
> Cc: linux-tegra@vger.kernel.org
> ---
> drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 1 -
> .../drm/arm/display/komeda/komeda_private_obj.c | 16 ++++++++--------
For the komeda part:
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Best regards,
Liviu
> drivers/gpu/drm/display/drm_dp_mst_topology.c | 1 -
> drivers/gpu/drm/display/drm_dp_tunnel.c | 2 +-
> drivers/gpu/drm/drm_atomic.c | 22 +++++-----------------
> drivers/gpu/drm/drm_bridge.c | 1 -
> drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 2 +-
> drivers/gpu/drm/ingenic/ingenic-ipu.c | 2 +-
> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 -
> drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 1 -
> drivers/gpu/drm/omapdrm/omap_drv.c | 2 +-
> drivers/gpu/drm/tegra/hub.c | 2 +-
> drivers/gpu/drm/vc4/vc4_kms.c | 4 +---
> include/drm/drm_atomic.h | 1 -
> 14 files changed, 19 insertions(+), 39 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index a97e1bf1bfdc6384a6ac83f907878807bb3b62a0..cff3d00a367728449b4a4de4cc9f3c9036e3924f 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -4932,11 +4932,10 @@ static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev)
> /* indicates support for immediate flip */
> adev_to_drm(adev)->mode_config.async_page_flip = true;
>
> drm_atomic_private_obj_init(adev_to_drm(adev),
> &adev->dm.atomic_obj,
> - NULL,
> &dm_atomic_state_funcs);
>
> r = amdgpu_display_modeset_create_props(adev);
> if (r)
> return r;
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c b/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
> index 4994b69c6595637ea832b97629b052e3aea97ee7..6270e5c525db221267b1215a27653ace578eeb0a 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
> @@ -63,11 +63,11 @@ static const struct drm_private_state_funcs komeda_layer_obj_funcs = {
> };
>
> static int komeda_layer_obj_add(struct komeda_kms_dev *kms,
> struct komeda_layer *layer)
> {
> - drm_atomic_private_obj_init(&kms->base, &layer->base.obj, NULL,
> + drm_atomic_private_obj_init(&kms->base, &layer->base.obj,
> &komeda_layer_obj_funcs);
> return 0;
> }
>
> static struct drm_private_state *
> @@ -116,11 +116,11 @@ static const struct drm_private_state_funcs komeda_scaler_obj_funcs = {
>
> static int komeda_scaler_obj_add(struct komeda_kms_dev *kms,
> struct komeda_scaler *scaler)
> {
> drm_atomic_private_obj_init(&kms->base,
> - &scaler->base.obj, NULL,
> + &scaler->base.obj,
> &komeda_scaler_obj_funcs);
> return 0;
> }
>
> static struct drm_private_state *
> @@ -168,11 +168,11 @@ static const struct drm_private_state_funcs komeda_compiz_obj_funcs = {
> };
>
> static int komeda_compiz_obj_add(struct komeda_kms_dev *kms,
> struct komeda_compiz *compiz)
> {
> - drm_atomic_private_obj_init(&kms->base, &compiz->base.obj, NULL,
> + drm_atomic_private_obj_init(&kms->base, &compiz->base.obj,
> &komeda_compiz_obj_funcs);
>
> return 0;
> }
>
> @@ -222,11 +222,11 @@ static const struct drm_private_state_funcs komeda_splitter_obj_funcs = {
>
> static int komeda_splitter_obj_add(struct komeda_kms_dev *kms,
> struct komeda_splitter *splitter)
> {
> drm_atomic_private_obj_init(&kms->base,
> - &splitter->base.obj, NULL,
> + &splitter->base.obj,
> &komeda_splitter_obj_funcs);
>
> return 0;
> }
>
> @@ -275,11 +275,11 @@ static const struct drm_private_state_funcs komeda_merger_obj_funcs = {
>
> static int komeda_merger_obj_add(struct komeda_kms_dev *kms,
> struct komeda_merger *merger)
> {
> drm_atomic_private_obj_init(&kms->base,
> - &merger->base.obj, NULL,
> + &merger->base.obj,
> &komeda_merger_obj_funcs);
>
> return 0;
> }
>
> @@ -328,11 +328,11 @@ static const struct drm_private_state_funcs komeda_improc_obj_funcs = {
> };
>
> static int komeda_improc_obj_add(struct komeda_kms_dev *kms,
> struct komeda_improc *improc)
> {
> - drm_atomic_private_obj_init(&kms->base, &improc->base.obj, NULL,
> + drm_atomic_private_obj_init(&kms->base, &improc->base.obj,
> &komeda_improc_obj_funcs);
>
> return 0;
> }
>
> @@ -381,11 +381,11 @@ static const struct drm_private_state_funcs komeda_timing_ctrlr_obj_funcs = {
> };
>
> static int komeda_timing_ctrlr_obj_add(struct komeda_kms_dev *kms,
> struct komeda_timing_ctrlr *ctrlr)
> {
> - drm_atomic_private_obj_init(&kms->base, &ctrlr->base.obj, NULL,
> + drm_atomic_private_obj_init(&kms->base, &ctrlr->base.obj,
> &komeda_timing_ctrlr_obj_funcs);
>
> return 0;
> }
>
> @@ -435,11 +435,11 @@ static const struct drm_private_state_funcs komeda_pipeline_obj_funcs = {
> };
>
> static int komeda_pipeline_obj_add(struct komeda_kms_dev *kms,
> struct komeda_pipeline *pipe)
> {
> - drm_atomic_private_obj_init(&kms->base, &pipe->obj, NULL,
> + drm_atomic_private_obj_init(&kms->base, &pipe->obj,
> &komeda_pipeline_obj_funcs);
>
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c
> index 1ab0233a2a18f784d8c43e61b94e40a06bd4baf6..7e0e5b90df7251beed6985e16d1c3270ddfb3f37 100644
> --- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
> @@ -5763,11 +5763,10 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
> mgr->max_dpcd_transaction_bytes = max_dpcd_transaction_bytes;
> mgr->max_payloads = max_payloads;
> mgr->conn_base_id = conn_base_id;
>
> drm_atomic_private_obj_init(dev, &mgr->base,
> - NULL,
> &drm_dp_mst_topology_state_funcs);
>
> return 0;
> }
> EXPORT_SYMBOL(drm_dp_mst_topology_mgr_init);
> diff --git a/drivers/gpu/drm/display/drm_dp_tunnel.c b/drivers/gpu/drm/display/drm_dp_tunnel.c
> index 2abd714efd19f27697770813b38194e384be87ce..241498cef7de497afdf2837f750113743c001240 100644
> --- a/drivers/gpu/drm/display/drm_dp_tunnel.c
> +++ b/drivers/gpu/drm/display/drm_dp_tunnel.c
> @@ -1598,11 +1598,11 @@ static bool init_group(struct drm_dp_tunnel_mgr *mgr, struct drm_dp_tunnel_group
> {
> group->mgr = mgr;
> group->available_bw = -1;
> INIT_LIST_HEAD(&group->tunnels);
>
> - drm_atomic_private_obj_init(mgr->dev, &group->base, NULL,
> + drm_atomic_private_obj_init(mgr->dev, &group->base,
> &tunnel_group_funcs);
>
> return true;
> }
>
> diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> index e3029c8f02e5a3698781117bcc80eff98407cf16..243579fa1c756cd2eda660ad658cb49d67106584 100644
> --- a/drivers/gpu/drm/drm_atomic.c
> +++ b/drivers/gpu/drm/drm_atomic.c
> @@ -919,11 +919,10 @@ static void drm_atomic_plane_print_state(struct drm_printer *p,
>
> /**
> * drm_atomic_private_obj_init - initialize private object
> * @dev: DRM device this object will be attached to
> * @obj: private object
> - * @state: initial private object state
> * @funcs: pointer to the struct of function pointers that identify the object
> * type
> *
> * Initialize the private object, which can be embedded into any
> * driver private object that needs its own atomic state.
> @@ -931,37 +930,26 @@ static void drm_atomic_plane_print_state(struct drm_printer *p,
> * RETURNS:
> * Zero on success, error code on failure
> */
> int drm_atomic_private_obj_init(struct drm_device *dev,
> struct drm_private_obj *obj,
> - struct drm_private_state *state,
> const struct drm_private_state_funcs *funcs)
> {
> + struct drm_private_state *state;
> memset(obj, 0, sizeof(*obj));
>
> drm_modeset_lock_init(&obj->lock);
>
> obj->dev = dev;
> obj->funcs = funcs;
> list_add_tail(&obj->head, &dev->mode_config.privobj_list);
>
> - /*
> - * Not all users of drm_atomic_private_obj_init have been
> - * converted to using &drm_private_obj_funcs.atomic_create_state 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) {
> - state = obj->funcs->atomic_create_state(obj);
> - if (IS_ERR(state))
> - return PTR_ERR(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;
> - }
> + obj->state = state;
>
> return 0;
> }
> EXPORT_SYMBOL(drm_atomic_private_obj_init);
>
> diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> index 316cf84519de54c4dc4bfb3bc3addc4990a200f5..4b120751605e15e0d07ebe1d4a7324c0ccfc34dd 100644
> --- a/drivers/gpu/drm/drm_bridge.c
> +++ b/drivers/gpu/drm/drm_bridge.c
> @@ -553,11 +553,10 @@ int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
> goto err_reset_bridge;
> }
>
> if (drm_bridge_is_atomic(bridge))
> drm_atomic_private_obj_init(bridge->dev, &bridge->base,
> - NULL,
> &drm_bridge_priv_state_funcs);
>
> return 0;
>
> err_reset_bridge:
> diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> index 862691991ed2770d30342bf531e828e34bd7080a..e6b003c16e63609180881b1d3b0c7acbd5218ada 100644
> --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
> @@ -1399,11 +1399,11 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)
> if (ret) {
> dev_err(dev, "Unable to register clock notifier\n");
> goto err_devclk_disable;
> }
>
> - drm_atomic_private_obj_init(drm, &priv->private_obj, NULL,
> + drm_atomic_private_obj_init(drm, &priv->private_obj,
> &ingenic_drm_private_state_funcs);
>
> ret = drmm_add_action_or_reset(drm, ingenic_drm_atomic_private_obj_fini,
> &priv->private_obj);
> if (ret)
> diff --git a/drivers/gpu/drm/ingenic/ingenic-ipu.c b/drivers/gpu/drm/ingenic/ingenic-ipu.c
> index 253a1ce30997308547b61339468d52e6875785d3..635ef2b1efa57556f32fded612f0ff1068e23e8c 100644
> --- a/drivers/gpu/drm/ingenic/ingenic-ipu.c
> +++ b/drivers/gpu/drm/ingenic/ingenic-ipu.c
> @@ -899,11 +899,11 @@ static int ingenic_ipu_bind(struct device *dev, struct device *master, void *d)
> if (err) {
> dev_err(dev, "Unable to prepare clock\n");
> return err;
> }
>
> - drm_atomic_private_obj_init(drm, &ipu->private_obj, NULL,
> + drm_atomic_private_obj_init(drm, &ipu->private_obj,
> &ingenic_ipu_private_state_funcs);
>
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index e33995a9522d2a9e8d0627069f7b5f44902278de..e52fd6b79c614a67d910e404efc24be014ec8f5e 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -1159,11 +1159,10 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
>
> dev->mode_config.cursor_width = 512;
> dev->mode_config.cursor_height = 512;
>
> drm_atomic_private_obj_init(dpu_kms->dev, &dpu_kms->global_state,
> - NULL,
> &dpu_kms_global_state_funcs);
>
> atomic_set(&dpu_kms->bandwidth_ref, 0);
>
> rc = pm_runtime_resume_and_get(&dpu_kms->pdev->dev);
> diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> index 1fc9671590762b800bdeb6cd440b1ae6ee634679..c41bb03e5b96a162340b886d32656dfe4b0d1a99 100644
> --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
> @@ -715,11 +715,10 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
> int ret;
>
> mdp5_kms->dev = dev;
>
> drm_atomic_private_obj_init(mdp5_kms->dev, &mdp5_kms->glob_state,
> - NULL,
> &mdp5_global_state_funcs);
>
> /* we need to set a default rate before enabling. Set a safe
> * rate first, then figure out hw revision, and then set a
> * more optimal rate:
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
> index febee3fea01dd40faec7d631279b1393a17822ba..27de798026365f710b78306a7ec2a72ddff20828 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -297,11 +297,11 @@ static const struct drm_private_state_funcs omap_global_state_funcs = {
>
> static int omap_global_obj_init(struct drm_device *dev)
> {
> struct omap_drm_private *priv = dev->dev_private;
>
> - drm_atomic_private_obj_init(dev, &priv->glob_obj, NULL,
> + drm_atomic_private_obj_init(dev, &priv->glob_obj,
> &omap_global_state_funcs);
> return 0;
> }
>
> static void omap_global_obj_fini(struct omap_drm_private *priv)
> diff --git a/drivers/gpu/drm/tegra/hub.c b/drivers/gpu/drm/tegra/hub.c
> index e8cc4382532fffaea99020755ad78d3252613c26..5c7fd36aaadc405b9dae0acb1e8b4f12f12c84bd 100644
> --- a/drivers/gpu/drm/tegra/hub.c
> +++ b/drivers/gpu/drm/tegra/hub.c
> @@ -955,11 +955,11 @@ static int tegra_display_hub_init(struct host1x_client *client)
> {
> struct tegra_display_hub *hub = to_tegra_display_hub(client);
> struct drm_device *drm = dev_get_drvdata(client->host);
> struct tegra_drm *tegra = drm->dev_private;
>
> - drm_atomic_private_obj_init(drm, &hub->base, NULL,
> + drm_atomic_private_obj_init(drm, &hub->base,
> &tegra_display_hub_state_funcs);
>
> tegra->hub = hub;
>
> return 0;
> diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
> index f82c7ea1d74eeaa075296533a1ffe3561f197748..8f60e9e98380984a0de7c9243c5ba703316d0c13 100644
> --- a/drivers/gpu/drm/vc4/vc4_kms.c
> +++ b/drivers/gpu/drm/vc4/vc4_kms.c
> @@ -114,11 +114,11 @@ static void vc4_ctm_obj_fini(struct drm_device *dev, void *unused)
>
> static int vc4_ctm_obj_init(struct vc4_dev *vc4)
> {
> drm_modeset_lock_init(&vc4->ctm_state_lock);
>
> - drm_atomic_private_obj_init(&vc4->base, &vc4->ctm_manager, NULL,
> + drm_atomic_private_obj_init(&vc4->base, &vc4->ctm_manager,
> &vc4_ctm_state_funcs);
>
> return drmm_add_action_or_reset(&vc4->base, vc4_ctm_obj_fini, NULL);
> }
>
> @@ -755,11 +755,10 @@ static void vc4_load_tracker_obj_fini(struct drm_device *dev, void *unused)
> }
>
> static int vc4_load_tracker_obj_init(struct vc4_dev *vc4)
> {
> drm_atomic_private_obj_init(&vc4->base, &vc4->load_tracker,
> - NULL,
> &vc4_load_tracker_state_funcs);
>
> return drmm_add_action_or_reset(&vc4->base, vc4_load_tracker_obj_fini, NULL);
> }
>
> @@ -847,11 +846,10 @@ static void vc4_hvs_channels_obj_fini(struct drm_device *dev, void *unused)
> }
>
> static int vc4_hvs_channels_obj_init(struct vc4_dev *vc4)
> {
> drm_atomic_private_obj_init(&vc4->base, &vc4->hvs_channels,
> - NULL,
> &vc4_hvs_state_funcs);
>
> return drmm_add_action_or_reset(&vc4->base, vc4_hvs_channels_obj_fini, NULL);
> }
>
> diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
> index 0b1b32bcd2bda1b92299fd369ba7c23b1c2d3dfa..f03cd199aee73fa8e15b2d9e16a53d134fc7de7d 100644
> --- a/include/drm/drm_atomic.h
> +++ b/include/drm/drm_atomic.h
> @@ -736,11 +736,10 @@ struct drm_connector_state * __must_check
> drm_atomic_get_connector_state(struct drm_atomic_state *state,
> struct drm_connector *connector);
>
> int drm_atomic_private_obj_init(struct drm_device *dev,
> struct drm_private_obj *obj,
> - struct drm_private_state *state,
> const struct drm_private_state_funcs *funcs);
> void drm_atomic_private_obj_fini(struct drm_private_obj *obj);
>
> struct drm_private_state * __must_check
> drm_atomic_get_private_obj_state(struct drm_atomic_state *state,
>
> --
> 2.52.0
>
^ permalink raw reply [flat|nested] 24+ messages in thread