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
