summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_atomic.c18
-rw-r--r--include/drm/drm_atomic.h13
2 files changed, 29 insertions, 2 deletions
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 4191a8333fc4..e3029c8f02e5 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -941,11 +941,25 @@ int drm_atomic_private_obj_init(struct drm_device *dev,
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;
}
diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
index 712f5fb977bf..0b1b32bcd2bd 100644
--- a/include/drm/drm_atomic.h
+++ b/include/drm/drm_atomic.h
@@ -262,6 +262,19 @@ struct drm_private_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