[PATCH 03/28] drm/writeback: Define function to get drm_connector from writeback

Suraj Kandpal suraj.kandpal at intel.com
Fri Jul 25 05:03:44 UTC 2025


Now that drm_connector may not always be embedded within
drm_writeback_connector, let's define a function which either uses
the writeback helper hook that returns the drm_connector associated
with the drm_writeback_connector or just return the drm_connector
embedded inside drm_writeback_connector if the helper hook is not
present. Lets use this function and call it whenever
drm_connector is required mostly when connector helper private funcs
need to be fetched.

Signed-off-by: Suraj Kandpal <suraj.kandpal at intel.com>
---
 drivers/gpu/drm/drm_writeback.c | 33 ++++++++++++++++++++++++++-------
 1 file changed, 26 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index e9f7123270d6..d610cb827975 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -120,6 +120,18 @@ drm_connector_to_writeback(struct drm_connector *connector)
 }
 EXPORT_SYMBOL(drm_connector_to_writeback);
 
+static struct drm_connector *
+drm_connector_from_writeback(struct drm_writeback_connector *wb_connector)
+{
+	const struct drm_writeback_connector_helper_funcs *funcs =
+		wb_connector->helper_private;
+
+	if (funcs && funcs->get_connector_from_writeback)
+		return funcs->get_connector_from_writeback(wb_connector);
+
+	return &wb_connector->base;
+}
+
 static int create_writeback_properties(struct drm_device *dev)
 {
 	struct drm_property *prop;
@@ -478,6 +490,7 @@ drm_writeback_connector_init_with_conn(struct drm_device *dev, struct drm_connec
 	if (ret)
 		goto connector_fail;
 
+	drm_writeback_connector_helper_add(wb_connector, wb_funcs);
 	INIT_LIST_HEAD(&wb_connector->job_queue);
 	spin_lock_init(&wb_connector->job_lock);
 
@@ -527,13 +540,15 @@ int drm_writeback_set_fb(struct drm_connector_state *conn_state,
 
 int drm_writeback_prepare_job(struct drm_writeback_job *job)
 {
-	struct drm_writeback_connector *connector = job->connector;
+	struct drm_writeback_connector *wb_connector = job->connector;
+	struct drm_connector *connector =
+		drm_connector_from_writeback(wb_connector);
 	const struct drm_connector_helper_funcs *funcs =
-		connector->base.helper_private;
+		connector->helper_private;
 	int ret;
 
 	if (funcs->prepare_writeback_job) {
-		ret = funcs->prepare_writeback_job(connector, job);
+		ret = funcs->prepare_writeback_job(wb_connector, job);
 		if (ret < 0)
 			return ret;
 	}
@@ -579,12 +594,14 @@ EXPORT_SYMBOL(drm_writeback_queue_job);
 
 void drm_writeback_cleanup_job(struct drm_writeback_job *job)
 {
-	struct drm_writeback_connector *connector = job->connector;
+	struct drm_writeback_connector *wb_connector = job->connector;
+	struct drm_connector *connector =
+		drm_connector_from_writeback(wb_connector);
 	const struct drm_connector_helper_funcs *funcs =
-		connector->base.helper_private;
+		connector->helper_private;
 
 	if (job->prepared && funcs->cleanup_writeback_job)
-		funcs->cleanup_writeback_job(connector, job);
+		funcs->cleanup_writeback_job(wb_connector, job);
 
 	if (job->fb)
 		drm_framebuffer_put(job->fb);
@@ -665,9 +682,11 @@ EXPORT_SYMBOL(drm_writeback_signal_completion);
 struct dma_fence *
 drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector)
 {
+	struct drm_connector *connector =
+		drm_connector_from_writeback(wb_connector);
 	struct dma_fence *fence;
 
-	if (WARN_ON(wb_connector->base.connector_type !=
+	if (WARN_ON(connector->connector_type !=
 		    DRM_MODE_CONNECTOR_WRITEBACK))
 		return NULL;
 
-- 
2.34.1



More information about the Intel-xe mailing list