Unverified Commit 1914ba2b authored by Louis Chauvet's avatar Louis Chauvet
Browse files

drm: writeback: Create drmm variants for drm_writeback_connector initialization



To allows driver to only use drmm objects, add helper to create
drm_writeback_connectors with automated lifetime management.

Acked-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Acked-by: default avatarMaxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20250116-google-vkms-managed-v9-7-3e4ae1bd05a0@bootlin.com


Signed-off-by: default avatarLouis Chauvet <louis.chauvet@bootlin.com>
parent 2f3f4a73
Loading
Loading
Loading
Loading
+74 −0
Original line number Diff line number Diff line
@@ -340,6 +340,80 @@ 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);
}

/**
 * drmm_writeback_connector_init - Initialize a writeback connector with
 * a custom encoder
 *
 * @dev: DRM device
 * @wb_connector: Writeback connector to initialize
 * @con_funcs: Connector funcs vtable
 * @enc: Encoder to connect this writeback connector
 * @formats: Array of supported pixel formats for the writeback engine
 * @n_formats: Length of the formats array
 *
 * This function initialize a writeback connector and register its cleanup.
 *
 * This function creates the writeback-connector-specific properties if they
 * have not been already created, initializes the connector as
 * type DRM_MODE_CONNECTOR_WRITEBACK, and correctly initializes the property
 * values.
 *
 * Returns: 0 on success, or a negative error code
 */
int drmm_writeback_connector_init(struct drm_device *dev,
				  struct drm_writeback_connector *wb_connector,
				  const struct drm_connector_funcs *con_funcs,
				  struct drm_encoder *enc,
				  const u32 *formats, int n_formats)
{
	struct drm_connector *connector = &wb_connector->base;
	int ret;

	ret = drmm_connector_init(dev, connector, con_funcs,
				  DRM_MODE_CONNECTOR_WRITEBACK, NULL);
	if (ret)
		return ret;

	ret = __drm_writeback_connector_init(dev, wb_connector, enc, formats,
					     n_formats);
	if (ret)
		return ret;

	ret = drmm_add_action_or_reset(dev, (void *)drm_writeback_connector_cleanup,
				       wb_connector);
	if (ret)
		return ret;

	return 0;
}
EXPORT_SYMBOL(drmm_writeback_connector_init);

int drm_writeback_set_fb(struct drm_connector_state *conn_state,
			 struct drm_framebuffer *fb)
{
+6 −0
Original line number Diff line number Diff line
@@ -161,6 +161,12 @@ int drm_writeback_connector_init_with_encoder(struct drm_device *dev,
				const struct drm_connector_funcs *con_funcs, const u32 *formats,
				int n_formats);

int drmm_writeback_connector_init(struct drm_device *dev,
				  struct drm_writeback_connector *wb_connector,
				  const struct drm_connector_funcs *con_funcs,
				  struct drm_encoder *enc,
				  const u32 *formats, int n_formats);

int drm_writeback_set_fb(struct drm_connector_state *conn_state,
			 struct drm_framebuffer *fb);