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 reset implementation, let's migrate this
instance to the new pattern.

Signed-off-by: Maxime Ripard <[email protected]>

---

Cc: Dave Stevenson <[email protected]>
Cc: "Maíra Canal" <[email protected]>
Cc: [email protected]
---
 drivers/gpu/drm/vc4/vc4_kms.c | 75 +++++++++++++++++++++++++++++++------------
 1 file changed, 54 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index 
8f983edb81ff0e3b11bbc8465e69f838050f0d07..f50ffc1c4b62ae3e180743f9cad4c6d0bc62a922
 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -82,13 +82,30 @@ 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 void vc4_ctm_reset(struct drm_private_obj *obj)
+{
+       struct vc4_ctm_state *ctm_state;
+
+       if (obj->state) {
+               vc4_ctm_destroy_state(obj, obj->state);
+               obj->state = NULL;
+       }
+
+       ctm_state = kzalloc(sizeof(*ctm_state), GFP_KERNEL);
+       if (!ctm_state)
+               return;
+
+       __drm_atomic_helper_private_obj_reset(obj, &ctm_state->base);
+}
+
 static const struct drm_private_state_funcs vc4_ctm_state_funcs = {
        .atomic_duplicate_state = vc4_ctm_duplicate_state,
        .atomic_destroy_state = vc4_ctm_destroy_state,
+       .reset = vc4_ctm_reset,
 };
 
 static void vc4_ctm_obj_fini(struct drm_device *dev, void *unused)
 {
        struct vc4_dev *vc4 = to_vc4_dev(dev);
@@ -96,19 +113,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);
 }
 
@@ -715,13 +726,30 @@ static void vc4_load_tracker_destroy_state(struct 
drm_private_obj *obj,
 
        load_state = to_vc4_load_tracker_state(state);
        kfree(load_state);
 }
 
+static void vc4_load_tracker_reset(struct drm_private_obj *obj)
+{
+       struct vc4_load_tracker_state *load_state;
+
+       if (obj->state) {
+               vc4_load_tracker_destroy_state(obj, obj->state);
+               obj->state = NULL;
+       }
+
+       load_state = kzalloc(sizeof(*load_state), GFP_KERNEL);
+       if (!load_state)
+               return;
+
+       __drm_atomic_helper_private_obj_reset(obj, &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,
+       .reset = vc4_load_tracker_reset,
 };
 
 static void vc4_load_tracker_obj_fini(struct drm_device *dev, void *unused)
 {
        struct vc4_dev *vc4 = to_vc4_dev(dev);
@@ -729,18 +757,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);
 }
 
@@ -797,14 +819,31 @@ 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 void vc4_hvs_channels_reset(struct drm_private_obj *obj)
+{
+       struct vc4_hvs_state *hvs_state;
+
+       if (obj->state) {
+               vc4_hvs_channels_destroy_state(obj, obj->state);
+               obj->state = NULL;
+       }
+
+       hvs_state = kzalloc(sizeof(*hvs_state), GFP_KERNEL);
+       if (!hvs_state)
+               return;
+
+       __drm_atomic_helper_private_obj_reset(obj, &hvs_state->base);
+}
+
 static const struct drm_private_state_funcs vc4_hvs_state_funcs = {
        .atomic_duplicate_state = vc4_hvs_channels_duplicate_state,
        .atomic_destroy_state = vc4_hvs_channels_destroy_state,
        .atomic_print_state = vc4_hvs_channels_print_state,
+       .reset = vc4_hvs_channels_reset,
 };
 
 static void vc4_hvs_channels_obj_fini(struct drm_device *dev, void *unused)
 {
        struct vc4_dev *vc4 = to_vc4_dev(dev);
@@ -812,18 +851,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.51.0

Reply via email to