[PATCH 02/28] drm/writeback: Add a helper function to get writeback connector

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


Now that we can initialize a drm_writeback_connector without
having to initialize the drm_connector within it and leaving the
responsibility of initialising the drm_connector and maintaining
the association with drm_writeback_connector to it. This helper
hooks lets drivers return the drm_writeback_connector associated
with the give drm_connector.

Signed-off-by: Suraj Kandpal <suraj.kandpal at intel.com>
---
 drivers/gpu/drm/drm_writeback.c          | 14 ++++++
 include/drm/drm_modeset_helper_vtables.h | 59 ++++++++++++++++++++++++
 include/drm/drm_writeback.h              | 14 ++++--
 3 files changed, 82 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index fa58eb0dc7bf..e9f7123270d6 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -107,6 +107,19 @@ static const struct dma_fence_ops drm_writeback_fence_ops = {
 	.get_timeline_name = drm_writeback_fence_get_timeline_name,
 };
 
+struct drm_writeback_connector *
+drm_connector_to_writeback(struct drm_connector *connector)
+{
+	const struct drm_connector_helper_funcs *funcs =
+		connector->helper_private;
+
+	if (funcs->get_writeback_connector)
+		return funcs->get_writeback_connector(connector);
+
+	return container_of(connector, struct drm_writeback_connector, base);
+}
+EXPORT_SYMBOL(drm_connector_to_writeback);
+
 static int create_writeback_properties(struct drm_device *dev)
 {
 	struct drm_property *prop;
@@ -443,6 +456,7 @@ drm_writeback_connector_init_with_conn(struct drm_device *dev, struct drm_connec
 				       struct drm_writeback_connector *wb_connector,
 				       struct drm_encoder *enc,
 				       const struct drm_connector_funcs *con_funcs,
+				       const struct drm_writeback_connector_helper_funcs *wb_funcs,
 				       const u32 *formats, int n_formats)
 {
 	struct drm_property_blob *blob;
diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h
index ce7c7aeac887..6b89b33d2304 100644
--- a/include/drm/drm_modeset_helper_vtables.h
+++ b/include/drm/drm_modeset_helper_vtables.h
@@ -31,6 +31,7 @@
 
 #include <drm/drm_crtc.h>
 #include <drm/drm_encoder.h>
+#include <drm/drm_writeback.h>
 
 /**
  * DOC: overview
@@ -1179,6 +1180,25 @@ struct drm_connector_helper_funcs {
 	 *
 	 */
 	void (*disable_hpd)(struct drm_connector *connector);
+
+	/**
+	 * @get_writeback_connector:
+	 *
+	 * This callback is used by drivers to get the writeback connector in
+	 * case the init is done via drm_writeback_init_with_conn. Which means
+	 * the drivers don't have drm_connector embedded in drm_writeback_connector
+	 * so they need to send the associated writeback connector with this
+	 * function.
+	 *
+	 * This operation is optional.
+	 *
+	 * This is mainly called from drm_writeback_set_gb.
+	 *
+	 * RETURNS:
+	 *
+	 * drm_writeback_connector assoiciated with the drm connector.
+	 */
+	struct drm_writeback_connector *(*get_writeback_connector)(struct drm_connector *connector);
 };
 
 /**
@@ -1192,6 +1212,45 @@ static inline void drm_connector_helper_add(struct drm_connector *connector,
 	connector->helper_private = funcs;
 }
 
+/**
+ * struct drm_writeback_connector_helper_funcs - helper operations for writeback
+ * connectors.
+ *
+ * These functions are used by the atomic and legacy modeset helpers and by the
+ * probe helpers.
+ */
+struct drm_writeback_connector_helper_funcs {
+	/**
+	 * @get_connector_from_writeback:
+	 *
+	 * This callback is used by drivers to get the drm_connector in
+	 * case the init is done via drm_writeback_init_with_conn. Which means
+	 * the drivers don't have drm_connector embedded in drm_writeback_connector
+	 * so they need to send the associated drm_connector with this
+	 * function.
+	 *
+	 * This operation is optional.
+	 *
+	 * RETURNS:
+	 *
+	 * drm_connector assoiciated with the drm_writeback_connector.
+	 */
+	struct drm_connector
+	*(*get_connector_from_writeback)(struct drm_writeback_connector *wbconnector);
+};
+
+/**
+ * drm_writeback_connector_helper_add - sets the helper vtable for a connector
+ * @wb_connector: DRM writeback connector
+ * @funcs: helper vtable to set for @wb_connector
+ */
+static inline void
+drm_writeback_connector_helper_add(struct drm_writeback_connector *wb_connector,
+				   const struct drm_writeback_connector_helper_funcs *funcs)
+{
+	wb_connector->helper_private = funcs;
+}
+
 /**
  * struct drm_plane_helper_funcs - helper operations for planes
  *
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index 149744dbeef0..77c3c64c132d 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -84,6 +84,13 @@ struct drm_writeback_connector {
 	 * The name of the connector's fence timeline.
 	 */
 	char timeline_name[32];
+
+	/**
+	 * @helper_private:
+	 *
+	 * helper private funcs for writeback_connector
+	 */
+	const struct drm_writeback_connector_helper_funcs *helper_private;
 };
 
 /**
@@ -142,11 +149,7 @@ struct drm_writeback_job {
 	void *priv;
 };
 
-static inline struct drm_writeback_connector *
-drm_connector_to_writeback(struct drm_connector *connector)
-{
-	return container_of(connector, struct drm_writeback_connector, base);
-}
+struct drm_writeback_connector *drm_connector_to_writeback(struct drm_connector *connector);
 
 int drm_writeback_connector_init(struct drm_device *dev,
 				 struct drm_writeback_connector *wb_connector,
@@ -172,6 +175,7 @@ drm_writeback_connector_init_with_conn(struct drm_device *dev, struct drm_connec
 				       struct drm_writeback_connector *wb_connector,
 				       struct drm_encoder *enc,
 				       const struct drm_connector_funcs *con_funcs,
+				       const struct drm_writeback_connector_helper_funcs *wb_funcs,
 				       const u32 *formats, int n_formats);
 
 int drm_writeback_set_fb(struct drm_connector_state *conn_state,
-- 
2.34.1



More information about the Intel-xe mailing list