On Mon, Dec 30, 2024 at 07:37:34PM +0100, Louis Chauvet wrote: > Currently there is no cleanup function for writeback connectors. To allows > implementation of drmm variant of writeback connector, create a cleanup > function that can be used to properly remove all the writeback-specific > properties and allocations. > > This also introduce an helper to cleanup only the drm_writeback_connector > properties, so it can be used during initialization to cleanup in case of > failure. > > Signed-off-by: Louis Chauvet <louis.chauvet@xxxxxxxxxxx> > --- > drivers/gpu/drm/drm_writeback.c | 43 +++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 43 insertions(+) > > diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c > index 33a3c98a962d1ec49ac4b353902036cf74290ae6..c274cba257cde5f4b446df3854974e690c60bf7b 100644 > --- a/drivers/gpu/drm/drm_writeback.c > +++ b/drivers/gpu/drm/drm_writeback.c > @@ -15,6 +15,7 @@ > #include <drm/drm_device.h> > #include <drm/drm_drv.h> > #include <drm/drm_framebuffer.h> > +#include <drm/drm_managed.h> > #include <drm/drm_modeset_helper_vtables.h> > #include <drm/drm_property.h> > #include <drm/drm_writeback.h> > @@ -140,6 +141,22 @@ static int create_writeback_properties(struct drm_device *dev) > return 0; > } > > +static void delete_writeback_properties(struct drm_device *dev) > +{ > + if (dev->mode_config.writeback_pixel_formats_property) { > + drm_property_destroy(dev, dev->mode_config.writeback_pixel_formats_property); > + dev->mode_config.writeback_pixel_formats_property = NULL; > + } > + if (dev->mode_config.writeback_out_fence_ptr_property) { > + drm_property_destroy(dev, dev->mode_config.writeback_out_fence_ptr_property); > + dev->mode_config.writeback_out_fence_ptr_property = NULL; > + } > + if (dev->mode_config.writeback_fb_id_property) { > + drm_property_destroy(dev, dev->mode_config.writeback_fb_id_property); > + dev->mode_config.writeback_fb_id_property = NULL; > + } > +} > + > static const struct drm_encoder_funcs drm_writeback_encoder_funcs = { > .destroy = drm_encoder_cleanup, > }; > @@ -284,6 +301,32 @@ int drm_writeback_connector_init_with_encoder(struct drm_device *dev, > } > EXPORT_SYMBOL(drm_writeback_connector_init_with_encoder); > > +/** > + * drm_writeback_connector_cleanup - Cleanup the writeback connector > + * @dev: DRM device > + * @wb_connector: Pointer to the writeback connector to clean up > + * > + * This will decrement the reference counter of blobs and destroy properties. It > + * will also clean the remaining jobs in this writeback connector. Caution: This helper will not > + * clean up the attached encoder and the drm_connector. > + */ > +static void drm_writeback_connector_cleanup(struct drm_device *dev, > + struct drm_writeback_connector *wb_connector) > +{ > + unsigned long flags; > + struct drm_writeback_job *pos, *n; > + > + delete_writeback_properties(dev); > + drm_property_blob_put(wb_connector->pixel_formats_blob_ptr); > + > + spin_lock_irqsave(&wb_connector->job_lock, flags); > + list_for_each_entry_safe(pos, n, &wb_connector->job_queue, list_entry) { > + drm_writeback_cleanup_job(pos); > + list_del(&pos->list_entry); > + } > + spin_unlock_irqrestore(&wb_connector->job_lock, flags); > +} > + Given that this function is static now, it should be merged with the patch using it. Maxime
Attachment:
signature.asc
Description: PGP signature