public inbox for drm-ai-reviews@public-inbox.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH v4 0/7] Refactor drm_writeback_connector structure
@ 2026-05-21  5:37 Suraj Kandpal
  2026-05-21  5:37 ` [PATCH v4 1/7] drm: writeback: " Suraj Kandpal
                   ` (8 more replies)
  0 siblings, 9 replies; 23+ messages in thread
From: Suraj Kandpal @ 2026-05-21  5:37 UTC (permalink / raw)
  To: freedreno, dri-devel, kernel-list, amd-gfx, linux-kernel,
	intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, sean, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev, John.Harrison,
	Suraj Kandpal

Some drivers cannot work with the current design where the connector
is embedded within the drm_writeback_connector such as intel and
some drivers that can get it working end up adding a lot of checks
all around the code to check if it's a writeback conenctor or not.
This is due to the inheritance limitation in C.
This series intends to solve it by moving the drm_writeback_connector
within the drm_connector and remove the drm_connector base which was in
drm_writeback_connector. This is done in union with hdmi connector
within drm_connector to save memory and since drm_connector cannot be
both hdmi and writeback it serves is well.
A RFC version was floated and discussion had taken place at [1] which
kicked of this more cleaner series. 
We do all other required modifications that come with these changes
along with addition of new function which returns the drm_connector when
drm_writeback_connector is present.
This series also contains some writeback API cleanups as a consequence
of writeback connector moving into drm_connector
All drivers will be expected to allocate the drm_connector.
This discussion was tiggered from [2] and sits on top of Dmitry's series
see [3].

[1] https://patchwork.freedesktop.org/series/152758/
[2] https://patchwork.freedesktop.org/series/152106/
[3] https://patchwork.freedesktop.org/series/152420/

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>

Suraj Kandpal (7):
  drm: writeback: Refactor drm_writeback_connector structure
  drm: writeback: Modify writeback init helpers
  drm: writeback: Modify drm_writeback_queue_job helper
  drm: writeback: Modify drm_writeback_signal_completion helper
  drm: writeback: Modify drm_writeback_get_out_fence helper
  drm: writeback: Modify prepare_writeback_job helper
  drm: writeback: Modify cleanup_writeback_job helper

 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 10 +--
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 +-
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c  | 12 +--
 .../gpu/drm/arm/display/komeda/komeda_crtc.c  |  2 +-
 .../gpu/drm/arm/display/komeda/komeda_kms.h   |  6 +-
 .../arm/display/komeda/komeda_wb_connector.c  | 11 +--
 drivers/gpu/drm/arm/malidp_crtc.c             |  2 +-
 drivers/gpu/drm/arm/malidp_drv.h              |  2 +-
 drivers/gpu/drm/arm/malidp_mw.c               |  7 +-
 drivers/gpu/drm/drm_atomic_uapi.c             |  4 +-
 drivers/gpu/drm/drm_writeback.c               | 50 +++++++-----
 .../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c   |  9 ++-
 drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 10 +--
 drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h |  4 +-
 .../gpu/drm/renesas/rcar-du/rcar_du_crtc.h    |  6 +-
 .../drm/renesas/rcar-du/rcar_du_writeback.c   | 16 ++--
 drivers/gpu/drm/vc4/vc4_txp.c                 |  8 +-
 drivers/gpu/drm/vkms/vkms_drv.h               |  2 +-
 drivers/gpu/drm/vkms/vkms_writeback.c         | 15 ++--
 include/drm/drm_connector.h                   | 69 ++++++++++++++++-
 include/drm/drm_modeset_helper_vtables.h      |  4 +-
 include/drm/drm_writeback.h                   | 76 ++-----------------
 22 files changed, 164 insertions(+), 163 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 23+ messages in thread

* [PATCH v4 1/7] drm: writeback: Refactor drm_writeback_connector structure
  2026-05-21  5:37 [PATCH v4 0/7] Refactor drm_writeback_connector structure Suraj Kandpal
@ 2026-05-21  5:37 ` Suraj Kandpal
  2026-05-21 23:28   ` John Harrison
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  2026-05-21  5:37 ` [PATCH v4 2/7] drm: writeback: Modify writeback init helpers Suraj Kandpal
                   ` (7 subsequent siblings)
  8 siblings, 2 replies; 23+ messages in thread
From: Suraj Kandpal @ 2026-05-21  5:37 UTC (permalink / raw)
  To: freedreno, dri-devel, kernel-list, amd-gfx, linux-kernel,
	intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, sean, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev, John.Harrison,
	Suraj Kandpal, Liviu Dudau

Some drivers cannot work with the current design where the connector
is embedded within the drm_writeback_connector such as Intel and
some drivers that can get it working end up adding a lot of checks
all around the code to check if it's a writeback conenctor or not,
this is due to the limitation of inheritance in C.
To solve this move the drm_writeback_connector within the
drm_connector and remove the drm_connector base which was in
drm_writeback_connector. Make this drm_writeback_connector
a union with hdmi connector to save memory and since a connector can
never be both writeback and hdmi it should serve us well.
Do all other required modifications that come with these changes
along with addition of new function which returns the drm_connector
when drm_writeback_connector is present.
Modify drivers using the drm_writeback_connector to
allow them to use this connector without breaking them.
The drivers modified here are amd, komeda, mali, vc4, vkms,
rcar_du, msm

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
---

v3 -> v4:
- Use drm_writeback_to_connector() wherever possible (John)
- Do not wrap line where not needed (John)

 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  6 +-
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 +-
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c  |  8 +--
 .../gpu/drm/arm/display/komeda/komeda_crtc.c  |  6 +-
 .../gpu/drm/arm/display/komeda/komeda_kms.h   |  6 +-
 .../arm/display/komeda/komeda_wb_connector.c  |  8 +--
 drivers/gpu/drm/arm/malidp_crtc.c             |  2 +-
 drivers/gpu/drm/arm/malidp_drv.h              |  2 +-
 drivers/gpu/drm/arm/malidp_hw.c               |  6 +-
 drivers/gpu/drm/arm/malidp_mw.c               |  8 +--
 drivers/gpu/drm/drm_atomic_uapi.c             |  2 +-
 drivers/gpu/drm/drm_writeback.c               | 35 ++++++----
 .../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c   |  3 +-
 drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 16 +++--
 drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h |  4 +-
 .../gpu/drm/renesas/rcar-du/rcar_du_crtc.h    |  6 +-
 .../drm/renesas/rcar-du/rcar_du_writeback.c   | 17 ++---
 drivers/gpu/drm/vc4/vc4_txp.c                 | 14 ++--
 drivers/gpu/drm/vkms/vkms_composer.c          |  2 +-
 drivers/gpu/drm/vkms/vkms_drv.h               |  2 +-
 drivers/gpu/drm/vkms/vkms_writeback.c         | 13 ++--
 include/drm/drm_connector.h                   | 69 +++++++++++++++++--
 include/drm/drm_writeback.h                   | 66 +-----------------
 23 files changed, 160 insertions(+), 143 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 840d66106694..27c59ef18c30 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -7469,11 +7469,9 @@ create_stream_for_sink(struct drm_connector *connector,
 		aconnector = to_amdgpu_dm_connector(connector);
 		link = aconnector->dc_link;
 	} else {
-		struct drm_writeback_connector *wbcon = NULL;
 		struct amdgpu_dm_wb_connector *dm_wbcon = NULL;
 
-		wbcon = drm_connector_to_writeback(connector);
-		dm_wbcon = to_amdgpu_dm_wb_connector(wbcon);
+		dm_wbcon = to_amdgpu_dm_wb_connector(connector);
 		link = dm_wbcon->link;
 	}
 
@@ -10899,7 +10897,7 @@ static void dm_set_writeback(struct amdgpu_display_manager *dm,
 			      struct drm_connector *connector,
 			      struct drm_connector_state *new_con_state)
 {
-	struct drm_writeback_connector *wb_conn = drm_connector_to_writeback(connector);
+	struct drm_writeback_connector *wb_conn = &connector->writeback;
 	struct amdgpu_device *adev = dm->adev;
 	struct amdgpu_crtc *acrtc;
 	struct dc_writeback_info *wb_info;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index 74f700fbeb6f..a394ea2eac1a 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -882,7 +882,7 @@ static inline void amdgpu_dm_set_mst_status(uint8_t *status,
 #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)
 
 struct amdgpu_dm_wb_connector {
-	struct drm_writeback_connector base;
+	struct drm_connector base;
 	struct dc_link *link;
 };
 
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
index fdc3da40452f..6fb8cb4d520c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
@@ -200,9 +200,9 @@ int amdgpu_dm_wb_connector_init(struct amdgpu_display_manager *dm,
 
 	wbcon->link = link;
 
-	drm_connector_helper_add(&wbcon->base.base, &amdgpu_dm_wb_conn_helper_funcs);
+	drm_connector_helper_add(&wbcon->base, &amdgpu_dm_wb_conn_helper_funcs);
 
-	res = drmm_writeback_connector_init(&dm->adev->ddev, &wbcon->base,
+	res = drmm_writeback_connector_init(&dm->adev->ddev, &wbcon->base.writeback,
 					    &amdgpu_dm_wb_connector_funcs,
 					    encoder,
 					    amdgpu_dm_wb_formats,
@@ -214,8 +214,8 @@ int amdgpu_dm_wb_connector_init(struct amdgpu_display_manager *dm,
 	 * Some of the properties below require access to state, like bpc.
 	 * Allocate some default initial connector state with our reset helper.
 	 */
-	if (wbcon->base.base.funcs->reset)
-		wbcon->base.base.funcs->reset(&wbcon->base.base);
+	if (wbcon->base.funcs->reset)
+		wbcon->base.funcs->reset(&wbcon->base);
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
index e8cb782a6f8e..6611920c45fb 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
@@ -213,7 +213,7 @@ void komeda_crtc_handle_event(struct komeda_crtc   *kcrtc,
 		struct komeda_wb_connector *wb_conn = kcrtc->wb_conn;
 
 		if (wb_conn)
-			drm_writeback_signal_completion(&wb_conn->base, 0);
+			drm_writeback_signal_completion(&wb_conn->base.writeback, 0);
 		else
 			drm_warn(drm, "CRTC[%d]: EOW happen but no wb_connector.\n",
 				 drm_crtc_index(&kcrtc->base));
@@ -269,9 +269,9 @@ komeda_crtc_do_flush(struct drm_crtc *crtc,
 	if (slave && has_bit(slave->id, kcrtc_st->affected_pipes))
 		komeda_pipeline_update(slave, old->state);
 
-	conn_st = wb_conn ? wb_conn->base.base.state : NULL;
+	conn_st = wb_conn ? wb_conn->base.state : NULL;
 	if (conn_st && conn_st->writeback_job)
-		drm_writeback_queue_job(&wb_conn->base, conn_st);
+		drm_writeback_queue_job(&wb_conn->base.writeback, conn_st);
 
 	/* step 2: notify the HW to kickoff the update */
 	mdev->funcs->flush(mdev, master->id, kcrtc_st->active_pipes);
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.h b/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
index 83e61c4080c2..9c34302782c0 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
@@ -53,8 +53,8 @@ struct komeda_plane_state {
  * struct komeda_wb_connector
  */
 struct komeda_wb_connector {
-	/** @base: &drm_writeback_connector */
-	struct drm_writeback_connector base;
+	/** @base: &drm_connector */
+	struct drm_connector base;
 
 	/** @wb_layer: represents associated writeback pipeline of komeda */
 	struct komeda_layer *wb_layer;
@@ -139,7 +139,7 @@ struct komeda_kms_dev {
 static inline bool is_writeback_only(struct drm_crtc_state *st)
 {
 	struct komeda_wb_connector *wb_conn = to_kcrtc(st->crtc)->wb_conn;
-	struct drm_connector *conn = wb_conn ? &wb_conn->base.base : NULL;
+	struct drm_connector *conn = wb_conn ? &wb_conn->base : NULL;
 
 	return conn && (st->connector_mask == BIT(drm_connector_index(conn)));
 }
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
index bcc53d4015f1..fa2f63c142cd 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
@@ -53,7 +53,7 @@ komeda_wb_encoder_atomic_check(struct drm_encoder *encoder,
 		return -EINVAL;
 	}
 
-	wb_layer = to_kconn(to_wb_conn(conn_st->connector))->wb_layer;
+	wb_layer = to_kconn(conn_st->connector)->wb_layer;
 
 	/*
 	 * No need for a full modested when the only connector changed is the
@@ -151,7 +151,7 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
 
 	kwb_conn->wb_layer = kcrtc->master->wb_layer;
 
-	wb_conn = &kwb_conn->base;
+	wb_conn = &kwb_conn->base.writeback;
 
 	formats = komeda_get_layer_fourcc_list(&mdev->fmt_tbl,
 					       kwb_conn->wb_layer->layer_type,
@@ -180,9 +180,9 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
 		return err;
 	}
 
-	drm_connector_helper_add(&wb_conn->base, &komeda_wb_conn_helper_funcs);
+	drm_connector_helper_add(&kwb_conn->base, &komeda_wb_conn_helper_funcs);
 
-	info = &kwb_conn->base.base.display_info;
+	info = &kwb_conn->base.display_info;
 	info->bpc = __fls(kcrtc->master->improc->supported_color_depths);
 	info->color_formats = kcrtc->master->improc->supported_color_formats;
 
diff --git a/drivers/gpu/drm/arm/malidp_crtc.c b/drivers/gpu/drm/arm/malidp_crtc.c
index ebe8e1078777..4402c1de8c69 100644
--- a/drivers/gpu/drm/arm/malidp_crtc.c
+++ b/drivers/gpu/drm/arm/malidp_crtc.c
@@ -421,7 +421,7 @@ static int malidp_crtc_atomic_check(struct drm_crtc *crtc,
 		u32 new_mask = crtc_state->connector_mask;
 
 		if ((old_mask ^ new_mask) ==
-		    (1 << drm_connector_index(&malidp->mw_connector.base)))
+		    (1 << drm_connector_index(&malidp->mw_connector)))
 			crtc_state->connectors_changed = false;
 	}
 
diff --git a/drivers/gpu/drm/arm/malidp_drv.h b/drivers/gpu/drm/arm/malidp_drv.h
index bc0387876dea..aa5599467d27 100644
--- a/drivers/gpu/drm/arm/malidp_drv.h
+++ b/drivers/gpu/drm/arm/malidp_drv.h
@@ -32,7 +32,7 @@ struct malidp_drm {
 	struct drm_device base;
 	struct malidp_hw_device *dev;
 	struct drm_crtc crtc;
-	struct drm_writeback_connector mw_connector;
+	struct drm_connector mw_connector;
 	wait_queue_head_t wq;
 	struct drm_pending_vblank_event *event;
 	atomic_t config_valid;
diff --git a/drivers/gpu/drm/arm/malidp_hw.c b/drivers/gpu/drm/arm/malidp_hw.c
index 9b845d3f34e1..5a7bd27d3718 100644
--- a/drivers/gpu/drm/arm/malidp_hw.c
+++ b/drivers/gpu/drm/arm/malidp_hw.c
@@ -1315,15 +1315,15 @@ static irqreturn_t malidp_se_irq(int irq, void *arg)
 	if (status & se->vsync_irq) {
 		switch (hwdev->mw_state) {
 		case MW_ONESHOT:
-			drm_writeback_signal_completion(&malidp->mw_connector, 0);
+			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
 			break;
 		case MW_STOP:
-			drm_writeback_signal_completion(&malidp->mw_connector, 0);
+			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
 			/* disable writeback after stop */
 			hwdev->mw_state = MW_NOT_ENABLED;
 			break;
 		case MW_RESTART:
-			drm_writeback_signal_completion(&malidp->mw_connector, 0);
+			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
 			fallthrough;	/* to a new start */
 		case MW_START:
 			/* writeback started, need to emulate one-shot mode */
diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
index cfb7300e3e95..6842c73f27b9 100644
--- a/drivers/gpu/drm/arm/malidp_mw.c
+++ b/drivers/gpu/drm/arm/malidp_mw.c
@@ -212,7 +212,7 @@ int malidp_mw_connector_init(struct drm_device *drm)
 	if (!malidp->dev->hw->enable_memwrite)
 		return 0;
 
-	drm_connector_helper_add(&malidp->mw_connector.base,
+	drm_connector_helper_add(&malidp->mw_connector,
 				 &malidp_mw_connector_helper_funcs);
 
 	formats = get_writeback_formats(malidp, &n_formats);
@@ -228,7 +228,7 @@ int malidp_mw_connector_init(struct drm_device *drm)
 
 	encoder->possible_crtcs = drm_crtc_mask(&malidp->crtc);
 
-	ret = drmm_writeback_connector_init(drm, &malidp->mw_connector,
+	ret = drmm_writeback_connector_init(drm, &malidp->mw_connector.writeback,
 					    &malidp_mw_connector_funcs,
 					    encoder,
 					    formats, n_formats);
@@ -243,8 +243,8 @@ void malidp_mw_atomic_commit(struct drm_device *drm,
 			     struct drm_atomic_commit *old_state)
 {
 	struct malidp_drm *malidp = drm_to_malidp(drm);
-	struct drm_writeback_connector *mw_conn = &malidp->mw_connector;
-	struct drm_connector_state *conn_state = mw_conn->base.state;
+	struct drm_writeback_connector *mw_conn = &malidp->mw_connector.writeback;
+	struct drm_connector_state *conn_state = malidp->mw_connector.state;
 	struct malidp_hw_device *hwdev = malidp->dev;
 	struct malidp_mw_connector_state *mw_state;
 
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index 6441b55cc274..7add982e3a3f 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -1472,7 +1472,7 @@ static int prepare_signaling(struct drm_device *dev,
 		f[*num_fences].out_fence_ptr = fence_ptr;
 		*fence_state = f;
 
-		wb_conn = drm_connector_to_writeback(conn);
+		wb_conn = &conn->writeback;
 		fence = drm_writeback_get_out_fence(wb_conn);
 		if (!fence)
 			return -ENOMEM;
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index 68fdac745f42..7bf9f6374712 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -89,8 +89,10 @@ static const char *drm_writeback_fence_get_driver_name(struct dma_fence *fence)
 {
 	struct drm_writeback_connector *wb_connector =
 		fence_to_wb_connector(fence);
+	struct drm_connector *connector =
+		drm_writeback_to_connector(wb_connector);
 
-	return wb_connector->base.dev->driver->name;
+	return connector->dev->driver->name;
 }
 
 static const char *
@@ -187,7 +189,8 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
 					  struct drm_encoder *enc, const u32 *formats,
 					  int n_formats)
 {
-	struct drm_connector *connector = &wb_connector->base;
+	struct drm_connector *connector =
+		drm_writeback_to_connector(wb_connector);
 	struct drm_mode_config *config = &dev->mode_config;
 	struct drm_property_blob *blob;
 	int ret = create_writeback_properties(dev);
@@ -269,7 +272,8 @@ int drm_writeback_connector_init(struct drm_device *dev,
 				 struct drm_encoder *enc,
 				 const u32 *formats, int n_formats)
 {
-	struct drm_connector *connector = &wb_connector->base;
+	struct drm_connector *connector =
+		drm_writeback_to_connector(wb_connector);
 	int ret;
 
 	ret = drm_connector_init(dev, connector, con_funcs,
@@ -339,7 +343,8 @@ int drmm_writeback_connector_init(struct drm_device *dev,
 				  struct drm_encoder *enc,
 				  const u32 *formats, int n_formats)
 {
-	struct drm_connector *connector = &wb_connector->base;
+	struct drm_connector *connector =
+		drm_writeback_to_connector(wb_connector);
 	int ret;
 
 	ret = drmm_connector_init(dev, connector, con_funcs,
@@ -372,7 +377,7 @@ int drm_writeback_set_fb(struct drm_connector_state *conn_state,
 			return -ENOMEM;
 
 		conn_state->writeback_job->connector =
-			drm_connector_to_writeback(conn_state->connector);
+			&conn_state->connector->writeback;
 	}
 
 	drm_framebuffer_assign(&conn_state->writeback_job->fb, fb);
@@ -381,13 +386,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_writeback_to_connector(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;
 	}
@@ -433,12 +440,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_writeback_to_connector(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);
@@ -520,8 +529,10 @@ struct dma_fence *
 drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector)
 {
 	struct dma_fence *fence;
+	struct drm_connector *connector =
+		drm_writeback_to_connector(wb_connector);
 
-	if (WARN_ON(wb_connector->base.connector_type !=
+	if (WARN_ON(connector->connector_type !=
 		    DRM_MODE_CONNECTOR_WRITEBACK))
 		return NULL;
 
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
index 22433bfbea1e..e2a328225c9e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
@@ -481,7 +481,8 @@ static void dpu_encoder_phys_wb_prepare_for_kickoff(
 		return;
 	}
 
-	drm_conn = &wb_enc->wb_conn->base;
+	drm_conn =
+		drm_writeback_to_connector(wb_enc->wb_conn);
 	state = drm_conn->state;
 
 	if (wb_enc->wb_conn && wb_enc->wb_job)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
index e7b09013ae4c..69eb2f85dec3 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
@@ -29,8 +29,7 @@ static int dpu_wb_conn_get_modes(struct drm_connector *connector)
 static int dpu_wb_conn_atomic_check(struct drm_connector *connector,
 				    struct drm_atomic_commit *state)
 {
-	struct drm_writeback_connector *wb_conn = drm_connector_to_writeback(connector);
-	struct dpu_wb_connector *dpu_wb_conn = to_dpu_wb_conn(wb_conn);
+	struct dpu_wb_connector *dpu_wb_conn = to_dpu_wb_conn(connector);
 	struct drm_connector_state *conn_state =
 		drm_atomic_get_new_connector_state(state, connector);
 	struct drm_crtc *crtc;
@@ -88,10 +87,11 @@ static const struct drm_connector_funcs dpu_wb_conn_funcs = {
 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
 };
 
-static int dpu_wb_conn_prepare_job(struct drm_writeback_connector *connector,
+static int dpu_wb_conn_prepare_job(struct drm_writeback_connector *wb_conn,
 		struct drm_writeback_job *job)
 {
-
+	struct drm_connector *connector =
+		drm_writeback_to_connector(wb_conn);
 	struct dpu_wb_connector *dpu_wb_conn = to_dpu_wb_conn(connector);
 
 	if (!job->fb)
@@ -102,9 +102,11 @@ static int dpu_wb_conn_prepare_job(struct drm_writeback_connector *connector,
 	return 0;
 }
 
-static void dpu_wb_conn_cleanup_job(struct drm_writeback_connector *connector,
+static void dpu_wb_conn_cleanup_job(struct drm_writeback_connector *wb_connector,
 		struct drm_writeback_job *job)
 {
+	struct drm_connector *connector =
+		drm_writeback_to_connector(wb_connector);
 	struct dpu_wb_connector *dpu_wb_conn = to_dpu_wb_conn(connector);
 
 	if (!job->fb)
@@ -132,9 +134,9 @@ int dpu_writeback_init(struct drm_device *dev, struct drm_encoder *enc,
 
 	dpu_wb_conn->maxlinewidth = maxlinewidth;
 
-	drm_connector_helper_add(&dpu_wb_conn->base.base, &dpu_wb_conn_helper_funcs);
+	drm_connector_helper_add(&dpu_wb_conn->base, &dpu_wb_conn_helper_funcs);
 
-	rc = drmm_writeback_connector_init(dev, &dpu_wb_conn->base,
+	rc = drmm_writeback_connector_init(dev, &dpu_wb_conn->base.writeback,
 					   &dpu_wb_conn_funcs, enc,
 					   format_list, num_formats);
 
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h
index 4b11cca8014c..9ebf15392b20 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h
@@ -16,12 +16,12 @@
 #include "dpu_encoder_phys.h"
 
 struct dpu_wb_connector {
-	struct drm_writeback_connector base;
+	struct drm_connector base;
 	struct drm_encoder *wb_enc;
 	u32 maxlinewidth;
 };
 
-static inline struct dpu_wb_connector *to_dpu_wb_conn(struct drm_writeback_connector *conn)
+static inline struct dpu_wb_connector *to_dpu_wb_conn(struct drm_connector *conn)
 {
 	return container_of(conn, struct dpu_wb_connector, base);
 }
diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.h b/drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.h
index 8857926e109a..11372ccfdd38 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.h
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.h
@@ -43,7 +43,7 @@ struct rcar_du_vsp;
  * @cmm: CMM associated with this CRTC
  * @vsp: VSP feeding video to this CRTC
  * @vsp_pipe: index of the VSP pipeline feeding video to this CRTC
- * @writeback: the writeback connector
+ * @wb_connector: the drm connector which contains the writeback connector
  */
 struct rcar_du_crtc {
 	struct drm_crtc crtc;
@@ -73,11 +73,11 @@ struct rcar_du_crtc {
 	const char *const *sources;
 	unsigned int sources_count;
 
-	struct drm_writeback_connector writeback;
+	struct drm_connector wb_connector;
 };
 
 #define to_rcar_crtc(c)		container_of(c, struct rcar_du_crtc, crtc)
-#define wb_to_rcar_crtc(c)	container_of(c, struct rcar_du_crtc, writeback)
+#define wb_to_rcar_crtc(c)	container_of(c, struct rcar_du_crtc, wb_connector)
 
 /**
  * struct rcar_du_crtc_state - Driver-specific CRTC state
diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
index aa37cf99754c..39be854c465a 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
@@ -50,7 +50,8 @@ static int rcar_du_wb_conn_get_modes(struct drm_connector *connector)
 static int rcar_du_wb_prepare_job(struct drm_writeback_connector *connector,
 				  struct drm_writeback_job *job)
 {
-	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(connector);
+	struct drm_connector *conn = drm_writeback_to_connector(connector);
+	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(conn);
 	struct rcar_du_wb_job *rjob;
 	int ret;
 
@@ -75,7 +76,8 @@ static int rcar_du_wb_prepare_job(struct drm_writeback_connector *connector,
 static void rcar_du_wb_cleanup_job(struct drm_writeback_connector *connector,
 				   struct drm_writeback_job *job)
 {
-	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(connector);
+	struct drm_connector *conn = drm_writeback_to_connector(connector);
+	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(conn);
 	struct rcar_du_wb_job *rjob = job->priv;
 
 	if (!job->fb)
@@ -199,8 +201,7 @@ static const u32 writeback_formats[] = {
 int rcar_du_writeback_init(struct rcar_du_device *rcdu,
 			   struct rcar_du_crtc *rcrtc)
 {
-	struct drm_writeback_connector *wb_conn = &rcrtc->writeback;
-
+	struct drm_writeback_connector *wb_conn = &rcrtc->wb_connector.writeback;
 	struct drm_encoder *encoder;
 
 	encoder = drmm_plain_encoder_alloc(&rcdu->ddev, NULL,
@@ -212,7 +213,7 @@ int rcar_du_writeback_init(struct rcar_du_device *rcdu,
 
 	encoder->possible_crtcs = drm_crtc_mask(&rcrtc->crtc);
 
-	drm_connector_helper_add(&wb_conn->base,
+	drm_connector_helper_add(&rcrtc->wb_connector,
 				 &rcar_du_wb_conn_helper_funcs);
 
 	return drmm_writeback_connector_init(&rcdu->ddev, wb_conn,
@@ -231,7 +232,7 @@ void rcar_du_writeback_setup(struct rcar_du_crtc *rcrtc,
 	struct drm_framebuffer *fb;
 	unsigned int i;
 
-	state = rcrtc->writeback.base.state;
+	state = rcrtc->wb_connector.state;
 	if (!state || !state->writeback_job)
 		return;
 
@@ -246,10 +247,10 @@ void rcar_du_writeback_setup(struct rcar_du_crtc *rcrtc,
 		cfg->mem[i] = sg_dma_address(rjob->sg_tables[i].sgl)
 			    + fb->offsets[i];
 
-	drm_writeback_queue_job(&rcrtc->writeback, state);
+	drm_writeback_queue_job(&rcrtc->wb_connector.writeback, state);
 }
 
 void rcar_du_writeback_complete(struct rcar_du_crtc *rcrtc)
 {
-	drm_writeback_signal_completion(&rcrtc->writeback, 0);
+	drm_writeback_signal_completion(&rcrtc->wb_connector.writeback, 0);
 }
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index 3fd89fccfa10..8a4afa6a1eec 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -168,7 +168,7 @@ struct vc4_txp {
 	struct platform_device *pdev;
 
 	struct vc4_encoder encoder;
-	struct drm_writeback_connector connector;
+	struct drm_connector connector;
 
 	void __iomem *regs;
 };
@@ -177,7 +177,7 @@ struct vc4_txp {
 	container_of_const(_encoder, struct vc4_txp, encoder.base)
 
 #define connector_to_vc4_txp(_connector)				\
-	container_of_const(_connector, struct vc4_txp, connector.base)
+	container_of_const(_connector, struct vc4_txp, connector)
 
 static const struct debugfs_reg32 txp_regs[] = {
 	VC4_REG32(TXP_DST_PTR),
@@ -357,7 +357,7 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn,
 
 	TXP_WRITE(TXP_DST_CTRL, ctrl);
 
-	drm_writeback_queue_job(&txp->connector, conn_state);
+	drm_writeback_queue_job(&txp->connector.writeback, conn_state);
 
 	drm_dev_exit(idx);
 }
@@ -505,7 +505,7 @@ static irqreturn_t vc4_txp_interrupt(int irq, void *data)
 	 */
 	TXP_WRITE(TXP_DST_CTRL, TXP_READ(TXP_DST_CTRL) & ~TXP_EI);
 	vc4_crtc_handle_vblank(vc4_crtc);
-	drm_writeback_signal_completion(&txp->connector, 0);
+	drm_writeback_signal_completion(&txp->connector.writeback, 0);
 
 	return IRQ_HANDLED;
 }
@@ -599,9 +599,9 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data)
 	if (ret)
 		return ret;
 
-	drm_connector_helper_add(&txp->connector.base,
+	drm_connector_helper_add(&txp->connector,
 				 &vc4_txp_connector_helper_funcs);
-	ret = drmm_writeback_connector_init(drm, &txp->connector,
+	ret = drmm_writeback_connector_init(drm, &txp->connector.writeback,
 					    &vc4_txp_connector_funcs,
 					    encoder,
 					    drm_fmts, ARRAY_SIZE(drm_fmts));
@@ -623,7 +623,7 @@ static void vc4_txp_unbind(struct device *dev, struct device *master,
 {
 	struct vc4_txp *txp = dev_get_drvdata(dev);
 
-	drm_connector_cleanup(&txp->connector.base);
+	drm_connector_cleanup(&txp->connector);
 }
 
 static const struct component_ops vc4_txp_ops = {
diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c
index 83d217085ad0..27fb6a7b55bb 100644
--- a/drivers/gpu/drm/vkms/vkms_composer.c
+++ b/drivers/gpu/drm/vkms/vkms_composer.c
@@ -652,7 +652,7 @@ void vkms_composer_worker(struct work_struct *work)
 		return;
 
 	if (wb_pending) {
-		drm_writeback_signal_completion(&out->wb_connector, 0);
+		drm_writeback_signal_completion(&out->wb_connector.writeback, 0);
 		spin_lock_irq(&out->composer_lock);
 		crtc_state->wb_pending = false;
 		spin_unlock_irq(&out->composer_lock);
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 0933e4ce0ff0..145a7909388b 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -217,7 +217,7 @@ struct vkms_crtc_state {
  */
 struct vkms_output {
 	struct drm_crtc crtc;
-	struct drm_writeback_connector wb_connector;
+	struct drm_connector wb_connector;
 	struct drm_encoder wb_encoder;
 	struct workqueue_struct *composer_workq;
 	spinlock_t lock;
diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
index ecf29a2c0c8e..64d524d2168f 100644
--- a/drivers/gpu/drm/vkms/vkms_writeback.c
+++ b/drivers/gpu/drm/vkms/vkms_writeback.c
@@ -103,10 +103,13 @@ static int vkms_wb_prepare_job(struct drm_writeback_connector *wb_connector,
 	return ret;
 }
 
-static void vkms_wb_cleanup_job(struct drm_writeback_connector *connector,
+static void vkms_wb_cleanup_job(struct drm_writeback_connector *wb_conn,
 				struct drm_writeback_job *job)
 {
 	struct vkms_writeback_job *vkmsjob = job->priv;
+	struct drm_connector *connector = container_of(wb_conn,
+						       struct drm_connector,
+						       writeback);
 	struct vkms_output *vkms_output = container_of(connector,
 						       struct vkms_output,
 						       wb_connector);
@@ -128,8 +131,8 @@ static void vkms_wb_atomic_commit(struct drm_connector *conn,
 	struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state,
 											 conn);
 	struct vkms_output *output = drm_crtc_to_vkms_output(connector_state->crtc);
-	struct drm_writeback_connector *wb_conn = &output->wb_connector;
-	struct drm_connector_state *conn_state = wb_conn->base.state;
+	struct drm_writeback_connector *wb_conn = &output->wb_connector.writeback;
+	struct drm_connector_state *conn_state = output->wb_connector.state;
 	struct vkms_crtc_state *crtc_state = output->composer_state;
 	struct drm_framebuffer *fb = connector_state->writeback_job->fb;
 	u16 crtc_height = crtc_state->base.mode.vdisplay;
@@ -167,7 +170,7 @@ static const struct drm_connector_helper_funcs vkms_wb_conn_helper_funcs = {
 int vkms_enable_writeback_connector(struct vkms_device *vkmsdev,
 				    struct vkms_output *vkms_output)
 {
-	struct drm_writeback_connector *wb = &vkms_output->wb_connector;
+	struct drm_writeback_connector *wb = &vkms_output->wb_connector.writeback;
 	int ret;
 
 	ret = drmm_encoder_init(&vkmsdev->drm, &vkms_output->wb_encoder,
@@ -178,7 +181,7 @@ int vkms_enable_writeback_connector(struct vkms_device *vkmsdev,
 	vkms_output->wb_encoder.possible_clones |=
 		drm_encoder_mask(&vkms_output->wb_encoder);
 
-	drm_connector_helper_add(&wb->base, &vkms_wb_conn_helper_funcs);
+	drm_connector_helper_add(&vkms_output->wb_connector, &vkms_wb_conn_helper_funcs);
 
 	return drmm_writeback_connector_init(&vkmsdev->drm, wb,
 					     &vkms_wb_connector_funcs,
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 5ad62c207d00..d99f6bf7e644 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -1987,6 +1987,61 @@ struct drm_connector_cec {
 	void *data;
 };
 
+/**
+ * struct drm_writeback_connector - DRM writeback connector
+ */
+struct drm_writeback_connector {
+	/**
+	 * @pixel_formats_blob_ptr:
+	 *
+	 * DRM blob property data for the pixel formats list on writeback
+	 * connectors
+	 * See also drm_writeback_connector_init()
+	 */
+	struct drm_property_blob *pixel_formats_blob_ptr;
+
+	/** @job_lock: Protects job_queue */
+	spinlock_t job_lock;
+
+	/**
+	 * @job_queue:
+	 *
+	 * Holds a list of a connector's writeback jobs; the last item is the
+	 * most recent. The first item may be either waiting for the hardware
+	 * to begin writing, or currently being written.
+	 *
+	 * See also: drm_writeback_queue_job() and
+	 * drm_writeback_signal_completion()
+	 */
+	struct list_head job_queue;
+
+	/**
+	 * @fence_context:
+	 *
+	 * timeline context used for fence operations.
+	 */
+	unsigned int fence_context;
+	/**
+	 * @fence_lock:
+	 *
+	 * spinlock to protect the fences in the fence_context.
+	 */
+	spinlock_t fence_lock;
+	/**
+	 * @fence_seqno:
+	 *
+	 * Seqno variable used as monotonic counter for the fences
+	 * created on the connector's timeline.
+	 */
+	unsigned long fence_seqno;
+	/**
+	 * @timeline_name:
+	 *
+	 * The name of the connector's fence timeline.
+	 */
+	char timeline_name[32];
+};
+
 /**
  * struct drm_connector - central DRM connector control structure
  *
@@ -2396,10 +2451,16 @@ struct drm_connector {
 	 */
 	struct llist_node free_node;
 
-	/**
-	 * @hdmi: HDMI-related variable and properties.
-	 */
-	struct drm_connector_hdmi hdmi;
+	union {
+		/**
+		 * @hdmi: HDMI-related variable and properties.
+		 */
+		struct drm_connector_hdmi hdmi;
+		/**
+		 * @writeback: Writeback related valriables.
+		 */
+		struct drm_writeback_connector writeback;
+	};
 
 	/**
 	 * @hdmi_audio: HDMI codec properties and non-DRM state.
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index 958466a05e60..702141099520 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -15,66 +15,6 @@
 #include <drm/drm_encoder.h>
 #include <linux/workqueue.h>
 
-/**
- * struct drm_writeback_connector - DRM writeback connector
- */
-struct drm_writeback_connector {
-	/**
-	 * @base: base drm_connector object
-	 */
-	struct drm_connector base;
-
-	/**
-	 * @pixel_formats_blob_ptr:
-	 *
-	 * DRM blob property data for the pixel formats list on writeback
-	 * connectors
-	 * See also drm_writeback_connector_init()
-	 */
-	struct drm_property_blob *pixel_formats_blob_ptr;
-
-	/** @job_lock: Protects job_queue */
-	spinlock_t job_lock;
-
-	/**
-	 * @job_queue:
-	 *
-	 * Holds a list of a connector's writeback jobs; the last item is the
-	 * most recent. The first item may be either waiting for the hardware
-	 * to begin writing, or currently being written.
-	 *
-	 * See also: drm_writeback_queue_job() and
-	 * drm_writeback_signal_completion()
-	 */
-	struct list_head job_queue;
-
-	/**
-	 * @fence_context:
-	 *
-	 * timeline context used for fence operations.
-	 */
-	unsigned int fence_context;
-	/**
-	 * @fence_lock:
-	 *
-	 * spinlock to protect the fences in the fence_context.
-	 */
-	spinlock_t fence_lock;
-	/**
-	 * @fence_seqno:
-	 *
-	 * Seqno variable used as monotonic counter for the fences
-	 * created on the connector's timeline.
-	 */
-	unsigned long fence_seqno;
-	/**
-	 * @timeline_name:
-	 *
-	 * The name of the connector's fence timeline.
-	 */
-	char timeline_name[32];
-};
-
 /**
  * struct drm_writeback_job - DRM writeback job
  */
@@ -131,10 +71,10 @@ struct drm_writeback_job {
 	void *priv;
 };
 
-static inline struct drm_writeback_connector *
-drm_connector_to_writeback(struct drm_connector *connector)
+static inline struct drm_connector *
+drm_writeback_to_connector(struct drm_writeback_connector *wb_connector)
 {
-	return container_of(connector, struct drm_writeback_connector, base);
+	return container_of(wb_connector, struct drm_connector, writeback);
 }
 
 int drm_writeback_connector_init(struct drm_device *dev,
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 2/7] drm: writeback: Modify writeback init helpers
  2026-05-21  5:37 [PATCH v4 0/7] Refactor drm_writeback_connector structure Suraj Kandpal
  2026-05-21  5:37 ` [PATCH v4 1/7] drm: writeback: " Suraj Kandpal
@ 2026-05-21  5:37 ` Suraj Kandpal
  2026-05-21 23:30   ` John Harrison
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  2026-05-21  5:37 ` [PATCH v4 3/7] drm: writeback: Modify drm_writeback_queue_job helper Suraj Kandpal
                   ` (6 subsequent siblings)
  8 siblings, 2 replies; 23+ messages in thread
From: Suraj Kandpal @ 2026-05-21  5:37 UTC (permalink / raw)
  To: freedreno, dri-devel, kernel-list, amd-gfx, linux-kernel,
	intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, sean, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev, John.Harrison,
	Suraj Kandpal

The writeback connector init helpers (drm_writeback_connector_init,
drm_writeback_connector_init_with_encoder, drmm_writeback_connector_init
and drmm_writeback_connector_init_with_encoder) require access to the
parent drm_connector object as well as the drm_writeback_connector
object itself. So, pass in the top level drm_connector and traverse
down to drm_writeback_connector rather than passing in the lower level
object and traversing back up. Even where such is not the case, update
to use the top level object for consistency across the interface.

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
v3 -> v4:
- Update subject line for consitency (John)
- Update commit message across commits for consitency (John)
- Rename writeback to wb_connector in rcar_du_crtc for clarity (John)

 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c   |  2 +-
 .../drm/arm/display/komeda/komeda_wb_connector.c   |  5 +----
 drivers/gpu/drm/arm/malidp_mw.c                    |  2 +-
 drivers/gpu/drm/drm_writeback.c                    | 14 ++++++--------
 drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c      |  2 +-
 .../gpu/drm/renesas/rcar-du/rcar_du_writeback.c    |  3 +--
 drivers/gpu/drm/vc4/vc4_txp.c                      |  2 +-
 drivers/gpu/drm/vkms/vkms_writeback.c              |  4 ++--
 include/drm/drm_writeback.h                        |  4 ++--
 9 files changed, 16 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
index 6fb8cb4d520c..bb4945f01616 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
@@ -202,7 +202,7 @@ int amdgpu_dm_wb_connector_init(struct amdgpu_display_manager *dm,
 
 	drm_connector_helper_add(&wbcon->base, &amdgpu_dm_wb_conn_helper_funcs);
 
-	res = drmm_writeback_connector_init(&dm->adev->ddev, &wbcon->base.writeback,
+	res = drmm_writeback_connector_init(&dm->adev->ddev, &wbcon->base,
 					    &amdgpu_dm_wb_connector_funcs,
 					    encoder,
 					    amdgpu_dm_wb_formats,
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
index fa2f63c142cd..85b34375d275 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
@@ -135,7 +135,6 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
 {
 	struct komeda_dev *mdev = kms->base.dev_private;
 	struct komeda_wb_connector *kwb_conn;
-	struct drm_writeback_connector *wb_conn;
 	struct drm_display_info *info;
 	struct drm_encoder *encoder;
 
@@ -151,8 +150,6 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
 
 	kwb_conn->wb_layer = kcrtc->master->wb_layer;
 
-	wb_conn = &kwb_conn->base.writeback;
-
 	formats = komeda_get_layer_fourcc_list(&mdev->fmt_tbl,
 					       kwb_conn->wb_layer->layer_type,
 					       &n_formats);
@@ -170,7 +167,7 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
 
 	encoder->possible_crtcs = drm_crtc_mask(&kcrtc->base);
 
-	err = drmm_writeback_connector_init(&kms->base, wb_conn,
+	err = drmm_writeback_connector_init(&kms->base, &kwb_conn->base,
 					    &komeda_wb_connector_funcs,
 					    encoder,
 					    formats, n_formats);
diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
index 6842c73f27b9..c6d11c7af1e4 100644
--- a/drivers/gpu/drm/arm/malidp_mw.c
+++ b/drivers/gpu/drm/arm/malidp_mw.c
@@ -228,7 +228,7 @@ int malidp_mw_connector_init(struct drm_device *drm)
 
 	encoder->possible_crtcs = drm_crtc_mask(&malidp->crtc);
 
-	ret = drmm_writeback_connector_init(drm, &malidp->mw_connector.writeback,
+	ret = drmm_writeback_connector_init(drm, &malidp->mw_connector,
 					    &malidp_mw_connector_funcs,
 					    encoder,
 					    formats, n_formats);
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index 7bf9f6374712..9a3037d11009 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -242,7 +242,7 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
  * a custom encoder
  *
  * @dev: DRM device
- * @wb_connector: Writeback connector to initialize
+ * @connector: Drm connector which contains the writeback connector to initialize
  * @enc: handle to the already initialized drm encoder
  * @con_funcs: Connector funcs vtable
  * @formats: Array of supported pixel formats for the writeback engine
@@ -267,13 +267,12 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
  * Returns: 0 on success, or a negative error code
  */
 int drm_writeback_connector_init(struct drm_device *dev,
-				 struct drm_writeback_connector *wb_connector,
+				 struct drm_connector *connector,
 				 const struct drm_connector_funcs *con_funcs,
 				 struct drm_encoder *enc,
 				 const u32 *formats, int n_formats)
 {
-	struct drm_connector *connector =
-		drm_writeback_to_connector(wb_connector);
+	struct drm_writeback_connector *wb_connector = &connector->writeback;
 	int ret;
 
 	ret = drm_connector_init(dev, connector, con_funcs,
@@ -322,7 +321,7 @@ static void drm_writeback_connector_cleanup(struct drm_device *dev,
  * a custom encoder
  *
  * @dev: DRM device
- * @wb_connector: Writeback connector to initialize
+ * @connector: Drm connector containing the 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
@@ -338,13 +337,12 @@ static void drm_writeback_connector_cleanup(struct drm_device *dev,
  * Returns: 0 on success, or a negative error code
  */
 int drmm_writeback_connector_init(struct drm_device *dev,
-				  struct drm_writeback_connector *wb_connector,
+				  struct drm_connector *connector,
 				  const struct drm_connector_funcs *con_funcs,
 				  struct drm_encoder *enc,
 				  const u32 *formats, int n_formats)
 {
-	struct drm_connector *connector =
-		drm_writeback_to_connector(wb_connector);
+	struct drm_writeback_connector *wb_connector = &connector->writeback;
 	int ret;
 
 	ret = drmm_connector_init(dev, connector, con_funcs,
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
index 69eb2f85dec3..4dee524d1270 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
@@ -136,7 +136,7 @@ int dpu_writeback_init(struct drm_device *dev, struct drm_encoder *enc,
 
 	drm_connector_helper_add(&dpu_wb_conn->base, &dpu_wb_conn_helper_funcs);
 
-	rc = drmm_writeback_connector_init(dev, &dpu_wb_conn->base.writeback,
+	rc = drmm_writeback_connector_init(dev, &dpu_wb_conn->base,
 					   &dpu_wb_conn_funcs, enc,
 					   format_list, num_formats);
 
diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
index 39be854c465a..6b27307941a4 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
@@ -201,7 +201,6 @@ static const u32 writeback_formats[] = {
 int rcar_du_writeback_init(struct rcar_du_device *rcdu,
 			   struct rcar_du_crtc *rcrtc)
 {
-	struct drm_writeback_connector *wb_conn = &rcrtc->wb_connector.writeback;
 	struct drm_encoder *encoder;
 
 	encoder = drmm_plain_encoder_alloc(&rcdu->ddev, NULL,
@@ -216,7 +215,7 @@ int rcar_du_writeback_init(struct rcar_du_device *rcdu,
 	drm_connector_helper_add(&rcrtc->wb_connector,
 				 &rcar_du_wb_conn_helper_funcs);
 
-	return drmm_writeback_connector_init(&rcdu->ddev, wb_conn,
+	return drmm_writeback_connector_init(&rcdu->ddev, &rcrtc->wb_connector,
 					     &rcar_du_wb_conn_funcs,
 					     encoder,
 					     writeback_formats,
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index 8a4afa6a1eec..c762b93738d3 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -601,7 +601,7 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data)
 
 	drm_connector_helper_add(&txp->connector,
 				 &vc4_txp_connector_helper_funcs);
-	ret = drmm_writeback_connector_init(drm, &txp->connector.writeback,
+	ret = drmm_writeback_connector_init(drm, &txp->connector,
 					    &vc4_txp_connector_funcs,
 					    encoder,
 					    drm_fmts, ARRAY_SIZE(drm_fmts));
diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
index 64d524d2168f..9341533b0325 100644
--- a/drivers/gpu/drm/vkms/vkms_writeback.c
+++ b/drivers/gpu/drm/vkms/vkms_writeback.c
@@ -170,7 +170,6 @@ static const struct drm_connector_helper_funcs vkms_wb_conn_helper_funcs = {
 int vkms_enable_writeback_connector(struct vkms_device *vkmsdev,
 				    struct vkms_output *vkms_output)
 {
-	struct drm_writeback_connector *wb = &vkms_output->wb_connector.writeback;
 	int ret;
 
 	ret = drmm_encoder_init(&vkmsdev->drm, &vkms_output->wb_encoder,
@@ -183,7 +182,8 @@ int vkms_enable_writeback_connector(struct vkms_device *vkmsdev,
 
 	drm_connector_helper_add(&vkms_output->wb_connector, &vkms_wb_conn_helper_funcs);
 
-	return drmm_writeback_connector_init(&vkmsdev->drm, wb,
+	return drmm_writeback_connector_init(&vkmsdev->drm,
+					     &vkms_output->wb_connector,
 					     &vkms_wb_connector_funcs,
 					     &vkms_output->wb_encoder,
 					     vkms_wb_formats,
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index 702141099520..c6960c7e634e 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -78,13 +78,13 @@ drm_writeback_to_connector(struct drm_writeback_connector *wb_connector)
 }
 
 int drm_writeback_connector_init(struct drm_device *dev,
-				 struct drm_writeback_connector *wb_connector,
+				 struct drm_connector *connector,
 				 const struct drm_connector_funcs *con_funcs,
 				 struct drm_encoder *enc,
 				 const u32 *formats, int n_formats);
 
 int drmm_writeback_connector_init(struct drm_device *dev,
-				  struct drm_writeback_connector *wb_connector,
+				  struct drm_connector *connector,
 				  const struct drm_connector_funcs *con_funcs,
 				  struct drm_encoder *enc,
 				  const u32 *formats, int n_formats);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 3/7] drm: writeback: Modify drm_writeback_queue_job helper
  2026-05-21  5:37 [PATCH v4 0/7] Refactor drm_writeback_connector structure Suraj Kandpal
  2026-05-21  5:37 ` [PATCH v4 1/7] drm: writeback: " Suraj Kandpal
  2026-05-21  5:37 ` [PATCH v4 2/7] drm: writeback: Modify writeback init helpers Suraj Kandpal
@ 2026-05-21  5:37 ` Suraj Kandpal
  2026-05-21 23:31   ` John Harrison
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  2026-05-21  5:37 ` [PATCH v4 4/7] drm: writeback: Modify drm_writeback_signal_completion helper Suraj Kandpal
                   ` (5 subsequent siblings)
  8 siblings, 2 replies; 23+ messages in thread
From: Suraj Kandpal @ 2026-05-21  5:37 UTC (permalink / raw)
  To: freedreno, dri-devel, kernel-list, amd-gfx, linux-kernel,
	intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, sean, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev, John.Harrison,
	Suraj Kandpal, Dmitry Baryshkov

drm_writeback_queue_job() needs access to the parent drm_connector
object as well as the drm_writeback_connector object itself. So,
pass in the top level drm_connector and traverse down to
drm_writeback_connector rather than passing in the lower level
object and traversing back up. This is also consistent with the
rest of the writeback interface which is being updated to use
drm_connector as the top level handle.

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
v3 -> v4:
- Update subject line for consitency (John)
- Update commit message across commits for consitency (John)

 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c   | 2 +-
 drivers/gpu/drm/arm/display/komeda/komeda_crtc.c    | 2 +-
 drivers/gpu/drm/arm/malidp_mw.c                     | 3 +--
 drivers/gpu/drm/drm_writeback.c                     | 6 ++++--
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 2 +-
 drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c | 2 +-
 drivers/gpu/drm/vc4/vc4_txp.c                       | 2 +-
 drivers/gpu/drm/vkms/vkms_writeback.c               | 3 +--
 include/drm/drm_writeback.h                         | 2 +-
 9 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 27c59ef18c30..f5154b10e50f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -10988,7 +10988,7 @@ static void dm_set_writeback(struct amdgpu_display_manager *dm,
 
 	acrtc->wb_pending = true;
 	acrtc->wb_conn = wb_conn;
-	drm_writeback_queue_job(wb_conn, new_con_state);
+	drm_writeback_queue_job(connector, new_con_state);
 }
 
 static void amdgpu_dm_update_hdcp(struct drm_atomic_commit *state)
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
index 6611920c45fb..c64cf5d97e62 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
@@ -271,7 +271,7 @@ komeda_crtc_do_flush(struct drm_crtc *crtc,
 
 	conn_st = wb_conn ? wb_conn->base.state : NULL;
 	if (conn_st && conn_st->writeback_job)
-		drm_writeback_queue_job(&wb_conn->base.writeback, conn_st);
+		drm_writeback_queue_job(&wb_conn->base, conn_st);
 
 	/* step 2: notify the HW to kickoff the update */
 	mdev->funcs->flush(mdev, master->id, kcrtc_st->active_pipes);
diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
index c6d11c7af1e4..0f419b2b79ab 100644
--- a/drivers/gpu/drm/arm/malidp_mw.c
+++ b/drivers/gpu/drm/arm/malidp_mw.c
@@ -243,7 +243,6 @@ void malidp_mw_atomic_commit(struct drm_device *drm,
 			     struct drm_atomic_commit *old_state)
 {
 	struct malidp_drm *malidp = drm_to_malidp(drm);
-	struct drm_writeback_connector *mw_conn = &malidp->mw_connector.writeback;
 	struct drm_connector_state *conn_state = malidp->mw_connector.state;
 	struct malidp_hw_device *hwdev = malidp->dev;
 	struct malidp_mw_connector_state *mw_state;
@@ -263,7 +262,7 @@ void malidp_mw_atomic_commit(struct drm_device *drm,
 				     &mw_state->addrs[0],
 				     mw_state->format);
 
-		drm_writeback_queue_job(mw_conn, conn_state);
+		drm_writeback_queue_job(&malidp->mw_connector, conn_state);
 		hwdev->hw->enable_memwrite(hwdev, mw_state->addrs,
 					   mw_state->pitches, mw_state->n_planes,
 					   fb->width, fb->height, mw_state->format,
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index 9a3037d11009..1c1802d87f13 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -404,7 +404,8 @@ EXPORT_SYMBOL(drm_writeback_prepare_job);
 
 /**
  * drm_writeback_queue_job - Queue a writeback job for later signalling
- * @wb_connector: The writeback connector to queue a job on
+ * @connector: The drm connector  which contains the writeback connector to
+ * queue a job on
  * @conn_state: The connector state containing the job to queue
  *
  * This function adds the job contained in @conn_state to the job_queue for a
@@ -421,9 +422,10 @@ EXPORT_SYMBOL(drm_writeback_prepare_job);
  *
  * See also: drm_writeback_signal_completion()
  */
-void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
+void drm_writeback_queue_job(struct drm_connector *connector,
 			     struct drm_connector_state *conn_state)
 {
+	struct drm_writeback_connector *wb_connector = &connector->writeback;
 	struct drm_writeback_job *job;
 	unsigned long flags;
 
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
index e2a328225c9e..0a4026f22274 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
@@ -486,7 +486,7 @@ static void dpu_encoder_phys_wb_prepare_for_kickoff(
 	state = drm_conn->state;
 
 	if (wb_enc->wb_conn && wb_enc->wb_job)
-		drm_writeback_queue_job(wb_enc->wb_conn, state);
+		drm_writeback_queue_job(drm_conn, state);
 
 	dpu_encoder_phys_wb_setup(phys_enc);
 
diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
index 6b27307941a4..5cd6c81a9710 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
@@ -246,7 +246,7 @@ void rcar_du_writeback_setup(struct rcar_du_crtc *rcrtc,
 		cfg->mem[i] = sg_dma_address(rjob->sg_tables[i].sgl)
 			    + fb->offsets[i];
 
-	drm_writeback_queue_job(&rcrtc->wb_connector.writeback, state);
+	drm_writeback_queue_job(&rcrtc->wb_connector, state);
 }
 
 void rcar_du_writeback_complete(struct rcar_du_crtc *rcrtc)
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index c762b93738d3..46330b6f9a12 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -357,7 +357,7 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn,
 
 	TXP_WRITE(TXP_DST_CTRL, ctrl);
 
-	drm_writeback_queue_job(&txp->connector.writeback, conn_state);
+	drm_writeback_queue_job(&txp->connector, conn_state);
 
 	drm_dev_exit(idx);
 }
diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
index 9341533b0325..2e3df9388dd2 100644
--- a/drivers/gpu/drm/vkms/vkms_writeback.c
+++ b/drivers/gpu/drm/vkms/vkms_writeback.c
@@ -131,7 +131,6 @@ static void vkms_wb_atomic_commit(struct drm_connector *conn,
 	struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state,
 											 conn);
 	struct vkms_output *output = drm_crtc_to_vkms_output(connector_state->crtc);
-	struct drm_writeback_connector *wb_conn = &output->wb_connector.writeback;
 	struct drm_connector_state *conn_state = output->wb_connector.state;
 	struct vkms_crtc_state *crtc_state = output->composer_state;
 	struct drm_framebuffer *fb = connector_state->writeback_job->fb;
@@ -153,7 +152,7 @@ static void vkms_wb_atomic_commit(struct drm_connector *conn,
 	crtc_state->active_writeback = active_wb;
 	crtc_state->wb_pending = true;
 	spin_unlock_irq(&output->composer_lock);
-	drm_writeback_queue_job(wb_conn, connector_state);
+	drm_writeback_queue_job(&output->wb_connector, connector_state);
 	active_wb->pixel_write = get_pixel_write_function(wb_format);
 	drm_rect_init(&wb_frame_info->src, 0, 0, crtc_width, crtc_height);
 	drm_rect_init(&wb_frame_info->dst, 0, 0, crtc_width, crtc_height);
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index c6960c7e634e..b4c11d380df0 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -94,7 +94,7 @@ int drm_writeback_set_fb(struct drm_connector_state *conn_state,
 
 int drm_writeback_prepare_job(struct drm_writeback_job *job);
 
-void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
+void drm_writeback_queue_job(struct drm_connector *wb_connector,
 			     struct drm_connector_state *conn_state);
 
 void drm_writeback_cleanup_job(struct drm_writeback_job *job);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 4/7] drm: writeback: Modify drm_writeback_signal_completion helper
  2026-05-21  5:37 [PATCH v4 0/7] Refactor drm_writeback_connector structure Suraj Kandpal
                   ` (2 preceding siblings ...)
  2026-05-21  5:37 ` [PATCH v4 3/7] drm: writeback: Modify drm_writeback_queue_job helper Suraj Kandpal
@ 2026-05-21  5:37 ` Suraj Kandpal
  2026-05-21 23:31   ` John Harrison
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  2026-05-21  5:37 ` [PATCH v4 5/7] drm: writeback: Modify drm_writeback_get_out_fence helper Suraj Kandpal
                   ` (4 subsequent siblings)
  8 siblings, 2 replies; 23+ messages in thread
From: Suraj Kandpal @ 2026-05-21  5:37 UTC (permalink / raw)
  To: freedreno, dri-devel, kernel-list, amd-gfx, linux-kernel,
	intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, sean, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev, John.Harrison,
	Suraj Kandpal, Dmitry Baryshkov

drm_writeback_signal_completion() needs access to the parent
drm_connector object as well as the drm_writeback_connector object
itself. So, pass in the top level drm_connector and traverse down
to drm_writeback_connector rather than passing in the lower level
object and traversing back up. Update to use the top level object
for consistency across the writeback interface.

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
v3 -> v4:
- Update subject line for consitency (John)
- Update commit message across commits for consitency (John)

 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c   | 2 +-
 drivers/gpu/drm/arm/display/komeda/komeda_crtc.c    | 2 +-
 drivers/gpu/drm/arm/malidp_hw.c                     | 6 +++---
 drivers/gpu/drm/drm_writeback.c                     | 6 ++++--
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 4 ++--
 drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c | 2 +-
 drivers/gpu/drm/vc4/vc4_txp.c                       | 2 +-
 drivers/gpu/drm/vkms/vkms_composer.c                | 2 +-
 include/drm/drm_writeback.h                         | 2 +-
 9 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index f5154b10e50f..730c44c53287 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -681,7 +681,7 @@ static void dm_crtc_high_irq(void *interrupt_params)
 					     100LL, (v_total * stream->timing.h_total));
 				mdelay(1000 / refresh_hz);
 
-				drm_writeback_signal_completion(acrtc->wb_conn, 0);
+				drm_writeback_signal_completion(acrtc->connector, 0);
 				dc_stream_fc_disable_writeback(adev->dm.dc,
 							       acrtc->dm_irq_params.stream, 0);
 			}
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
index c64cf5d97e62..da6bfe2797aa 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
@@ -213,7 +213,7 @@ void komeda_crtc_handle_event(struct komeda_crtc   *kcrtc,
 		struct komeda_wb_connector *wb_conn = kcrtc->wb_conn;
 
 		if (wb_conn)
-			drm_writeback_signal_completion(&wb_conn->base.writeback, 0);
+			drm_writeback_signal_completion(&wb_conn->base, 0);
 		else
 			drm_warn(drm, "CRTC[%d]: EOW happen but no wb_connector.\n",
 				 drm_crtc_index(&kcrtc->base));
diff --git a/drivers/gpu/drm/arm/malidp_hw.c b/drivers/gpu/drm/arm/malidp_hw.c
index 5a7bd27d3718..9b845d3f34e1 100644
--- a/drivers/gpu/drm/arm/malidp_hw.c
+++ b/drivers/gpu/drm/arm/malidp_hw.c
@@ -1315,15 +1315,15 @@ static irqreturn_t malidp_se_irq(int irq, void *arg)
 	if (status & se->vsync_irq) {
 		switch (hwdev->mw_state) {
 		case MW_ONESHOT:
-			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
+			drm_writeback_signal_completion(&malidp->mw_connector, 0);
 			break;
 		case MW_STOP:
-			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
+			drm_writeback_signal_completion(&malidp->mw_connector, 0);
 			/* disable writeback after stop */
 			hwdev->mw_state = MW_NOT_ENABLED;
 			break;
 		case MW_RESTART:
-			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
+			drm_writeback_signal_completion(&malidp->mw_connector, 0);
 			fallthrough;	/* to a new start */
 		case MW_START:
 			/* writeback started, need to emulate one-shot mode */
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index 1c1802d87f13..f3b4371d4201 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -477,7 +477,8 @@ static void cleanup_work(struct work_struct *work)
 
 /**
  * drm_writeback_signal_completion - Signal the completion of a writeback job
- * @wb_connector: The writeback connector whose job is complete
+ * @connector: The drm connector whicha has the drm_writeback_connector whose
+ * job is complete
  * @status: Status code to set in the writeback out_fence (0 for success)
  *
  * Drivers should call this to signal the completion of a previously queued
@@ -492,10 +493,11 @@ static void cleanup_work(struct work_struct *work)
  * See also: drm_writeback_queue_job()
  */
 void
-drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector,
+drm_writeback_signal_completion(struct drm_connector *connector,
 				int status)
 {
 	unsigned long flags;
+	struct drm_writeback_connector *wb_connector = &connector->writeback;
 	struct drm_writeback_job *job;
 	struct dma_fence *out_fence;
 
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
index 0a4026f22274..977fc0337fbd 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
@@ -370,7 +370,7 @@ static void dpu_encoder_phys_wb_done_irq(void *arg)
 	spin_unlock_irqrestore(phys_enc->enc_spinlock, lock_flags);
 
 	if (wb_enc->wb_conn)
-		drm_writeback_signal_completion(wb_enc->wb_conn, 0);
+		drm_writeback_signal_completion(drm_writeback_to_connector(wb_enc->wb_conn), 0);
 
 	/* Signal any waiting atomic commit thread */
 	wake_up_all(&phys_enc->pending_kickoff_wq);
@@ -431,7 +431,7 @@ static void _dpu_encoder_phys_wb_handle_wbdone_timeout(
 	phys_enc->enable_state = DPU_ENC_ERR_NEEDS_HW_RESET;
 
 	if (wb_enc->wb_conn)
-		drm_writeback_signal_completion(wb_enc->wb_conn, 0);
+		drm_writeback_signal_completion(drm_writeback_to_connector(wb_enc->wb_conn), 0);
 
 	dpu_encoder_frame_done_callback(phys_enc->parent, phys_enc, frame_event);
 }
diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
index 5cd6c81a9710..4b0f6cd46acb 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
@@ -251,5 +251,5 @@ void rcar_du_writeback_setup(struct rcar_du_crtc *rcrtc,
 
 void rcar_du_writeback_complete(struct rcar_du_crtc *rcrtc)
 {
-	drm_writeback_signal_completion(&rcrtc->wb_connector.writeback, 0);
+	drm_writeback_signal_completion(&rcrtc->wb_connector, 0);
 }
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index 46330b6f9a12..0d8579683c57 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -505,7 +505,7 @@ static irqreturn_t vc4_txp_interrupt(int irq, void *data)
 	 */
 	TXP_WRITE(TXP_DST_CTRL, TXP_READ(TXP_DST_CTRL) & ~TXP_EI);
 	vc4_crtc_handle_vblank(vc4_crtc);
-	drm_writeback_signal_completion(&txp->connector.writeback, 0);
+	drm_writeback_signal_completion(&txp->connector, 0);
 
 	return IRQ_HANDLED;
 }
diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c
index 27fb6a7b55bb..83d217085ad0 100644
--- a/drivers/gpu/drm/vkms/vkms_composer.c
+++ b/drivers/gpu/drm/vkms/vkms_composer.c
@@ -652,7 +652,7 @@ void vkms_composer_worker(struct work_struct *work)
 		return;
 
 	if (wb_pending) {
-		drm_writeback_signal_completion(&out->wb_connector.writeback, 0);
+		drm_writeback_signal_completion(&out->wb_connector, 0);
 		spin_lock_irq(&out->composer_lock);
 		crtc_state->wb_pending = false;
 		spin_unlock_irq(&out->composer_lock);
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index b4c11d380df0..5e8ab51c2da4 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -100,7 +100,7 @@ void drm_writeback_queue_job(struct drm_connector *wb_connector,
 void drm_writeback_cleanup_job(struct drm_writeback_job *job);
 
 void
-drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector,
+drm_writeback_signal_completion(struct drm_connector *connector,
 				int status);
 
 struct dma_fence *
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 5/7] drm: writeback: Modify drm_writeback_get_out_fence helper
  2026-05-21  5:37 [PATCH v4 0/7] Refactor drm_writeback_connector structure Suraj Kandpal
                   ` (3 preceding siblings ...)
  2026-05-21  5:37 ` [PATCH v4 4/7] drm: writeback: Modify drm_writeback_signal_completion helper Suraj Kandpal
@ 2026-05-21  5:37 ` Suraj Kandpal
  2026-05-21 23:35   ` John Harrison
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  2026-05-21  5:37 ` [PATCH v4 6/7] drm: writeback: Modify prepare_writeback_job helper Suraj Kandpal
                   ` (3 subsequent siblings)
  8 siblings, 2 replies; 23+ messages in thread
From: Suraj Kandpal @ 2026-05-21  5:37 UTC (permalink / raw)
  To: freedreno, dri-devel, kernel-list, amd-gfx, linux-kernel,
	intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, sean, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev, John.Harrison,
	Suraj Kandpal

drm_writeback_get_out_fence() does not itself need the parent
drm_connector object, but update it to take drm_connector for
consistency across the writeback interface, which is being moved
to use the top level drm_connector and traverse down to
drm_writeback_connector rather than passing in the lower level
object and traversing back up.

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
v3 -> v4:
- Update subject line for consitency (John)
- Update commit message across commits for consitency (John)

 drivers/gpu/drm/drm_atomic_uapi.c | 4 +---
 drivers/gpu/drm/drm_writeback.c   | 5 ++---
 include/drm/drm_writeback.h       | 2 +-
 3 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index 7add982e3a3f..65845b096b0c 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -1450,7 +1450,6 @@ static int prepare_signaling(struct drm_device *dev,
 	}
 
 	for_each_new_connector_in_state(state, conn, conn_state, i) {
-		struct drm_writeback_connector *wb_conn;
 		struct drm_out_fence_state *f;
 		struct dma_fence *fence;
 		s32 __user *fence_ptr;
@@ -1472,8 +1471,7 @@ static int prepare_signaling(struct drm_device *dev,
 		f[*num_fences].out_fence_ptr = fence_ptr;
 		*fence_state = f;
 
-		wb_conn = &conn->writeback;
-		fence = drm_writeback_get_out_fence(wb_conn);
+		fence = drm_writeback_get_out_fence(conn);
 		if (!fence)
 			return -ENOMEM;
 
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index f3b4371d4201..72e437f4394b 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -528,11 +528,10 @@ drm_writeback_signal_completion(struct drm_connector *connector,
 EXPORT_SYMBOL(drm_writeback_signal_completion);
 
 struct dma_fence *
-drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector)
+drm_writeback_get_out_fence(struct drm_connector *connector)
 {
 	struct dma_fence *fence;
-	struct drm_connector *connector =
-		drm_writeback_to_connector(wb_connector);
+	struct drm_writeback_connector *wb_connector = &connector->writeback;
 
 	if (WARN_ON(connector->connector_type !=
 		    DRM_MODE_CONNECTOR_WRITEBACK))
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index 5e8ab51c2da4..2afa48ea7c00 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -104,5 +104,5 @@ drm_writeback_signal_completion(struct drm_connector *connector,
 				int status);
 
 struct dma_fence *
-drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector);
+drm_writeback_get_out_fence(struct drm_connector *connector);
 #endif
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 6/7] drm: writeback: Modify prepare_writeback_job helper
  2026-05-21  5:37 [PATCH v4 0/7] Refactor drm_writeback_connector structure Suraj Kandpal
                   ` (4 preceding siblings ...)
  2026-05-21  5:37 ` [PATCH v4 5/7] drm: writeback: Modify drm_writeback_get_out_fence helper Suraj Kandpal
@ 2026-05-21  5:37 ` Suraj Kandpal
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  2026-05-21  5:37 ` [PATCH v4 7/7] drm: writeback: Modify cleanup_writeback_job helper Suraj Kandpal
                   ` (2 subsequent siblings)
  8 siblings, 1 reply; 23+ messages in thread
From: Suraj Kandpal @ 2026-05-21  5:37 UTC (permalink / raw)
  To: freedreno, dri-devel, kernel-list, amd-gfx, linux-kernel,
	intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, sean, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev, John.Harrison,
	Suraj Kandpal, Dmitry Baryshkov

The prepare_writeback_job() connector helper hook needs access to
the parent drm_connector object as well as the drm_writeback_connector
object itself. So, pass in the top level drm_connector and traverse
down to drm_writeback_connector rather than passing in the lower
level object and traversing back up. This also makes it uniform
with the params passed to other drm_connector_helper_funcs hooks.

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
v3 -> v4:
- Update subject line for consitency (John)
- Update commit message across commits for consitency (John)

 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c | 2 +-
 drivers/gpu/drm/drm_writeback.c                      | 2 +-
 drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c        | 4 +---
 drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c  | 5 ++---
 drivers/gpu/drm/vkms/vkms_writeback.c                | 2 +-
 include/drm/drm_modeset_helper_vtables.h             | 2 +-
 6 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
index bb4945f01616..aba1287454c5 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
@@ -80,7 +80,7 @@ static int amdgpu_dm_wb_connector_get_modes(struct drm_connector *connector)
 	return drm_add_modes_noedid(connector, 3840, 2160);
 }
 
-static int amdgpu_dm_wb_prepare_job(struct drm_writeback_connector *wb_connector,
+static int amdgpu_dm_wb_prepare_job(struct drm_connector *connector,
 			       struct drm_writeback_job *job)
 {
 	struct amdgpu_framebuffer *afb;
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index 72e437f4394b..4f3c257fc327 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -392,7 +392,7 @@ int drm_writeback_prepare_job(struct drm_writeback_job *job)
 	int ret;
 
 	if (funcs->prepare_writeback_job) {
-		ret = funcs->prepare_writeback_job(wb_connector, job);
+		ret = funcs->prepare_writeback_job(connector, job);
 		if (ret < 0)
 			return ret;
 	}
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
index 4dee524d1270..3fd2eb1b7cb8 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
@@ -87,11 +87,9 @@ static const struct drm_connector_funcs dpu_wb_conn_funcs = {
 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
 };
 
-static int dpu_wb_conn_prepare_job(struct drm_writeback_connector *wb_conn,
+static int dpu_wb_conn_prepare_job(struct drm_connector *connector,
 		struct drm_writeback_job *job)
 {
-	struct drm_connector *connector =
-		drm_writeback_to_connector(wb_conn);
 	struct dpu_wb_connector *dpu_wb_conn = to_dpu_wb_conn(connector);
 
 	if (!job->fb)
diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
index 4b0f6cd46acb..218b6504cacf 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
@@ -47,11 +47,10 @@ static int rcar_du_wb_conn_get_modes(struct drm_connector *connector)
 				    dev->mode_config.max_height);
 }
 
-static int rcar_du_wb_prepare_job(struct drm_writeback_connector *connector,
+static int rcar_du_wb_prepare_job(struct drm_connector *connector,
 				  struct drm_writeback_job *job)
 {
-	struct drm_connector *conn = drm_writeback_to_connector(connector);
-	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(conn);
+	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(connector);
 	struct rcar_du_wb_job *rjob;
 	int ret;
 
diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
index 2e3df9388dd2..86e5b92c7965 100644
--- a/drivers/gpu/drm/vkms/vkms_writeback.c
+++ b/drivers/gpu/drm/vkms/vkms_writeback.c
@@ -72,7 +72,7 @@ static int vkms_wb_connector_get_modes(struct drm_connector *connector)
 				    dev->mode_config.max_height);
 }
 
-static int vkms_wb_prepare_job(struct drm_writeback_connector *wb_connector,
+static int vkms_wb_prepare_job(struct drm_connector *connector,
 			       struct drm_writeback_job *job)
 {
 	struct vkms_writeback_job *vkmsjob;
diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h
index ca6268945c28..4e26568a16fb 100644
--- a/include/drm/drm_modeset_helper_vtables.h
+++ b/include/drm/drm_modeset_helper_vtables.h
@@ -1119,7 +1119,7 @@ struct drm_connector_helper_funcs {
 	 *
 	 * This callback is used by the atomic modeset helpers.
 	 */
-	int (*prepare_writeback_job)(struct drm_writeback_connector *connector,
+	int (*prepare_writeback_job)(struct drm_connector *connector,
 				     struct drm_writeback_job *job);
 	/**
 	 * @cleanup_writeback_job:
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [PATCH v4 7/7] drm: writeback: Modify cleanup_writeback_job helper
  2026-05-21  5:37 [PATCH v4 0/7] Refactor drm_writeback_connector structure Suraj Kandpal
                   ` (5 preceding siblings ...)
  2026-05-21  5:37 ` [PATCH v4 6/7] drm: writeback: Modify prepare_writeback_job helper Suraj Kandpal
@ 2026-05-21  5:37 ` Suraj Kandpal
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  2026-05-21 18:56 ` [PATCH v4 0/7] Refactor drm_writeback_connector structure John Harrison
  2026-05-25 10:57 ` Claude review: " Claude Code Review Bot
  8 siblings, 1 reply; 23+ messages in thread
From: Suraj Kandpal @ 2026-05-21  5:37 UTC (permalink / raw)
  To: freedreno, dri-devel, kernel-list, amd-gfx, linux-kernel,
	intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, sean, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev, John.Harrison,
	Suraj Kandpal, Dmitry Baryshkov

The cleanup_writeback_job() connector helper hook needs access to
the parent drm_connector object as well as the drm_writeback_connector
object itself. So, pass in the top level drm_connector and traverse
down to drm_writeback_connector rather than passing in the lower
level object and traversing back up. This also makes it uniform
with the params passed to other drm_connector_helper_funcs hooks.

Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
v3 -> v4:
- Update subject line for consitency (John)
- Update commit message across commits for consitency (John)

 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c | 4 ++--
 drivers/gpu/drm/drm_writeback.c                      | 2 +-
 drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c        | 4 +---
 drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c  | 5 ++---
 drivers/gpu/drm/vkms/vkms_writeback.c                | 5 +----
 include/drm/drm_modeset_helper_vtables.h             | 2 +-
 6 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
index aba1287454c5..fe7825fbfc61 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
@@ -142,8 +142,8 @@ static int amdgpu_dm_wb_prepare_job(struct drm_connector *connector,
 	return r;
 }
 
-static void amdgpu_dm_wb_cleanup_job(struct drm_writeback_connector *connector,
-				struct drm_writeback_job *job)
+static void amdgpu_dm_wb_cleanup_job(struct drm_connector *connector,
+				     struct drm_writeback_job *job)
 {
 	struct amdgpu_bo *rbo;
 	int r;
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index 4f3c257fc327..b1dddc1d2579 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -447,7 +447,7 @@ void drm_writeback_cleanup_job(struct drm_writeback_job *job)
 		connector->helper_private;
 
 	if (job->prepared && funcs->cleanup_writeback_job)
-		funcs->cleanup_writeback_job(wb_connector, job);
+		funcs->cleanup_writeback_job(connector, job);
 
 	if (job->fb)
 		drm_framebuffer_put(job->fb);
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
index 3fd2eb1b7cb8..c6396ac1f64c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
@@ -100,11 +100,9 @@ static int dpu_wb_conn_prepare_job(struct drm_connector *connector,
 	return 0;
 }
 
-static void dpu_wb_conn_cleanup_job(struct drm_writeback_connector *wb_connector,
+static void dpu_wb_conn_cleanup_job(struct drm_connector *connector,
 		struct drm_writeback_job *job)
 {
-	struct drm_connector *connector =
-		drm_writeback_to_connector(wb_connector);
 	struct dpu_wb_connector *dpu_wb_conn = to_dpu_wb_conn(connector);
 
 	if (!job->fb)
diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
index 218b6504cacf..e7d7b221c487 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
@@ -72,11 +72,10 @@ static int rcar_du_wb_prepare_job(struct drm_connector *connector,
 	return 0;
 }
 
-static void rcar_du_wb_cleanup_job(struct drm_writeback_connector *connector,
+static void rcar_du_wb_cleanup_job(struct drm_connector *connector,
 				   struct drm_writeback_job *job)
 {
-	struct drm_connector *conn = drm_writeback_to_connector(connector);
-	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(conn);
+	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(connector);
 	struct rcar_du_wb_job *rjob = job->priv;
 
 	if (!job->fb)
diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
index 86e5b92c7965..775abb4677ef 100644
--- a/drivers/gpu/drm/vkms/vkms_writeback.c
+++ b/drivers/gpu/drm/vkms/vkms_writeback.c
@@ -103,13 +103,10 @@ static int vkms_wb_prepare_job(struct drm_connector *connector,
 	return ret;
 }
 
-static void vkms_wb_cleanup_job(struct drm_writeback_connector *wb_conn,
+static void vkms_wb_cleanup_job(struct drm_connector *connector,
 				struct drm_writeback_job *job)
 {
 	struct vkms_writeback_job *vkmsjob = job->priv;
-	struct drm_connector *connector = container_of(wb_conn,
-						       struct drm_connector,
-						       writeback);
 	struct vkms_output *vkms_output = container_of(connector,
 						       struct vkms_output,
 						       wb_connector);
diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h
index 4e26568a16fb..9ce5ddd82057 100644
--- a/include/drm/drm_modeset_helper_vtables.h
+++ b/include/drm/drm_modeset_helper_vtables.h
@@ -1134,7 +1134,7 @@ struct drm_connector_helper_funcs {
 	 *
 	 * This callback is used by the atomic modeset helpers.
 	 */
-	void (*cleanup_writeback_job)(struct drm_writeback_connector *connector,
+	void (*cleanup_writeback_job)(struct drm_connector *connector,
 				      struct drm_writeback_job *job);
 
 	/**
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 0/7] Refactor drm_writeback_connector structure
  2026-05-21  5:37 [PATCH v4 0/7] Refactor drm_writeback_connector structure Suraj Kandpal
                   ` (6 preceding siblings ...)
  2026-05-21  5:37 ` [PATCH v4 7/7] drm: writeback: Modify cleanup_writeback_job helper Suraj Kandpal
@ 2026-05-21 18:56 ` John Harrison
  2026-05-22  4:21   ` Kandpal, Suraj
  2026-05-25 10:57 ` Claude review: " Claude Code Review Bot
  8 siblings, 1 reply; 23+ messages in thread
From: John Harrison @ 2026-05-21 18:56 UTC (permalink / raw)
  To: Suraj Kandpal, freedreno, dri-devel, kernel-list, amd-gfx,
	linux-kernel, intel-xe, intel-gfx

On 5/20/26 22:37, Suraj Kandpal wrote:
> Some drivers cannot work with the current design where the connector
> is embedded within the drm_writeback_connector such as intel and
> some drivers that can get it working end up adding a lot of checks
> all around the code to check if it's a writeback conenctor or not.
> This is due to the inheritance limitation in C.
> This series intends to solve it by moving the drm_writeback_connector
> within the drm_connector and remove the drm_connector base which was in
> drm_writeback_connector. This is done in union with hdmi connector
> within drm_connector to save memory and since drm_connector cannot be
> both hdmi and writeback it serves is well.
> A RFC version was floated and discussion had taken place at [1] which
> kicked of this more cleaner series.
> We do all other required modifications that come with these changes
> along with addition of new function which returns the drm_connector when
> drm_writeback_connector is present.
> This series also contains some writeback API cleanups as a consequence
> of writeback connector moving into drm_connector
> All drivers will be expected to allocate the drm_connector.
> This discussion was tiggered from [2] and sits on top of Dmitry's series
> see [3].
>
> [1] https://patchwork.freedesktop.org/series/152758/
> [2] https://patchwork.freedesktop.org/series/152106/
> [3] https://patchwork.freedesktop.org/series/152420/
QQ: What tree is this patch set based on? I tried to apply it locally 
but I get conflicts no matter what baseline I use. I've tried full 
kernel, drm-tip and drm-next. Dmitry's patch set, [3] above, applies 
fine but I get conflicts in the rcar and mali files when trying to apply 
this set.

Thanks,
John.

>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
>
> Suraj Kandpal (7):
>    drm: writeback: Refactor drm_writeback_connector structure
>    drm: writeback: Modify writeback init helpers
>    drm: writeback: Modify drm_writeback_queue_job helper
>    drm: writeback: Modify drm_writeback_signal_completion helper
>    drm: writeback: Modify drm_writeback_get_out_fence helper
>    drm: writeback: Modify prepare_writeback_job helper
>    drm: writeback: Modify cleanup_writeback_job helper
>
>   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 10 +--
>   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 +-
>   .../drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c  | 12 +--
>   .../gpu/drm/arm/display/komeda/komeda_crtc.c  |  2 +-
>   .../gpu/drm/arm/display/komeda/komeda_kms.h   |  6 +-
>   .../arm/display/komeda/komeda_wb_connector.c  | 11 +--
>   drivers/gpu/drm/arm/malidp_crtc.c             |  2 +-
>   drivers/gpu/drm/arm/malidp_drv.h              |  2 +-
>   drivers/gpu/drm/arm/malidp_mw.c               |  7 +-
>   drivers/gpu/drm/drm_atomic_uapi.c             |  4 +-
>   drivers/gpu/drm/drm_writeback.c               | 50 +++++++-----
>   .../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c   |  9 ++-
>   drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 10 +--
>   drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h |  4 +-
>   .../gpu/drm/renesas/rcar-du/rcar_du_crtc.h    |  6 +-
>   .../drm/renesas/rcar-du/rcar_du_writeback.c   | 16 ++--
>   drivers/gpu/drm/vc4/vc4_txp.c                 |  8 +-
>   drivers/gpu/drm/vkms/vkms_drv.h               |  2 +-
>   drivers/gpu/drm/vkms/vkms_writeback.c         | 15 ++--
>   include/drm/drm_connector.h                   | 69 ++++++++++++++++-
>   include/drm/drm_modeset_helper_vtables.h      |  4 +-
>   include/drm/drm_writeback.h                   | 76 ++-----------------
>   22 files changed, 164 insertions(+), 163 deletions(-)
>


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 1/7] drm: writeback: Refactor drm_writeback_connector structure
  2026-05-21  5:37 ` [PATCH v4 1/7] drm: writeback: " Suraj Kandpal
@ 2026-05-21 23:28   ` John Harrison
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  1 sibling, 0 replies; 23+ messages in thread
From: John Harrison @ 2026-05-21 23:28 UTC (permalink / raw)
  To: Suraj Kandpal, freedreno, dri-devel, kernel-list, amd-gfx,
	linux-kernel, intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, sean, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev, Liviu Dudau

On 5/20/26 22:37, Suraj Kandpal wrote:
> Some drivers cannot work with the current design where the connector
> is embedded within the drm_writeback_connector such as Intel and
> some drivers that can get it working end up adding a lot of checks
> all around the code to check if it's a writeback conenctor or not,
> this is due to the limitation of inheritance in C.
> To solve this move the drm_writeback_connector within the
> drm_connector and remove the drm_connector base which was in
> drm_writeback_connector. Make this drm_writeback_connector
> a union with hdmi connector to save memory and since a connector can
> never be both writeback and hdmi it should serve us well.
> Do all other required modifications that come with these changes
> along with addition of new function which returns the drm_connector
> when drm_writeback_connector is present.
> Modify drivers using the drm_writeback_connector to
> allow them to use this connector without breaking them.
> The drivers modified here are amd, komeda, mali, vc4, vkms,
> rcar_du, msm
>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
> Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
>
> v3 -> v4:
> - Use drm_writeback_to_connector() wherever possible (John)
> - Do not wrap line where not needed (John)
>
>   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  6 +-
>   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 +-
>   .../drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c  |  8 +--
>   .../gpu/drm/arm/display/komeda/komeda_crtc.c  |  6 +-
>   .../gpu/drm/arm/display/komeda/komeda_kms.h   |  6 +-
>   .../arm/display/komeda/komeda_wb_connector.c  |  8 +--
>   drivers/gpu/drm/arm/malidp_crtc.c             |  2 +-
>   drivers/gpu/drm/arm/malidp_drv.h              |  2 +-
>   drivers/gpu/drm/arm/malidp_hw.c               |  6 +-
>   drivers/gpu/drm/arm/malidp_mw.c               |  8 +--
>   drivers/gpu/drm/drm_atomic_uapi.c             |  2 +-
>   drivers/gpu/drm/drm_writeback.c               | 35 ++++++----
>   .../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c   |  3 +-
>   drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 16 +++--
>   drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h |  4 +-
>   .../gpu/drm/renesas/rcar-du/rcar_du_crtc.h    |  6 +-
>   .../drm/renesas/rcar-du/rcar_du_writeback.c   | 17 ++---
>   drivers/gpu/drm/vc4/vc4_txp.c                 | 14 ++--
>   drivers/gpu/drm/vkms/vkms_composer.c          |  2 +-
>   drivers/gpu/drm/vkms/vkms_drv.h               |  2 +-
>   drivers/gpu/drm/vkms/vkms_writeback.c         | 13 ++--
>   include/drm/drm_connector.h                   | 69 +++++++++++++++++--
>   include/drm/drm_writeback.h                   | 66 +-----------------
>   23 files changed, 160 insertions(+), 143 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 840d66106694..27c59ef18c30 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -7469,11 +7469,9 @@ create_stream_for_sink(struct drm_connector *connector,
>   		aconnector = to_amdgpu_dm_connector(connector);
>   		link = aconnector->dc_link;
>   	} else {
> -		struct drm_writeback_connector *wbcon = NULL;
>   		struct amdgpu_dm_wb_connector *dm_wbcon = NULL;
>   
> -		wbcon = drm_connector_to_writeback(connector);
> -		dm_wbcon = to_amdgpu_dm_wb_connector(wbcon);
> +		dm_wbcon = to_amdgpu_dm_wb_connector(connector);
>   		link = dm_wbcon->link;
>   	}
>   
> @@ -10899,7 +10897,7 @@ static void dm_set_writeback(struct amdgpu_display_manager *dm,
>   			      struct drm_connector *connector,
>   			      struct drm_connector_state *new_con_state)
>   {
> -	struct drm_writeback_connector *wb_conn = drm_connector_to_writeback(connector);
> +	struct drm_writeback_connector *wb_conn = &connector->writeback;
>   	struct amdgpu_device *adev = dm->adev;
>   	struct amdgpu_crtc *acrtc;
>   	struct dc_writeback_info *wb_info;
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> index 74f700fbeb6f..a394ea2eac1a 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> @@ -882,7 +882,7 @@ static inline void amdgpu_dm_set_mst_status(uint8_t *status,
>   #define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)
>   
>   struct amdgpu_dm_wb_connector {
> -	struct drm_writeback_connector base;
> +	struct drm_connector base;
>   	struct dc_link *link;
>   };
>   
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
> index fdc3da40452f..6fb8cb4d520c 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
> @@ -200,9 +200,9 @@ int amdgpu_dm_wb_connector_init(struct amdgpu_display_manager *dm,
>   
>   	wbcon->link = link;
>   
> -	drm_connector_helper_add(&wbcon->base.base, &amdgpu_dm_wb_conn_helper_funcs);
> +	drm_connector_helper_add(&wbcon->base, &amdgpu_dm_wb_conn_helper_funcs);
>   
> -	res = drmm_writeback_connector_init(&dm->adev->ddev, &wbcon->base,
> +	res = drmm_writeback_connector_init(&dm->adev->ddev, &wbcon->base.writeback,
>   					    &amdgpu_dm_wb_connector_funcs,
>   					    encoder,
>   					    amdgpu_dm_wb_formats,
> @@ -214,8 +214,8 @@ int amdgpu_dm_wb_connector_init(struct amdgpu_display_manager *dm,
>   	 * Some of the properties below require access to state, like bpc.
>   	 * Allocate some default initial connector state with our reset helper.
>   	 */
> -	if (wbcon->base.base.funcs->reset)
> -		wbcon->base.base.funcs->reset(&wbcon->base.base);
> +	if (wbcon->base.funcs->reset)
> +		wbcon->base.funcs->reset(&wbcon->base);
>   
>   	return 0;
>   }
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> index e8cb782a6f8e..6611920c45fb 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> @@ -213,7 +213,7 @@ void komeda_crtc_handle_event(struct komeda_crtc   *kcrtc,
>   		struct komeda_wb_connector *wb_conn = kcrtc->wb_conn;
>   
>   		if (wb_conn)
> -			drm_writeback_signal_completion(&wb_conn->base, 0);
> +			drm_writeback_signal_completion(&wb_conn->base.writeback, 0);
>   		else
>   			drm_warn(drm, "CRTC[%d]: EOW happen but no wb_connector.\n",
>   				 drm_crtc_index(&kcrtc->base));
> @@ -269,9 +269,9 @@ komeda_crtc_do_flush(struct drm_crtc *crtc,
>   	if (slave && has_bit(slave->id, kcrtc_st->affected_pipes))
>   		komeda_pipeline_update(slave, old->state);
>   
> -	conn_st = wb_conn ? wb_conn->base.base.state : NULL;
> +	conn_st = wb_conn ? wb_conn->base.state : NULL;
>   	if (conn_st && conn_st->writeback_job)
> -		drm_writeback_queue_job(&wb_conn->base, conn_st);
> +		drm_writeback_queue_job(&wb_conn->base.writeback, conn_st);
>   
>   	/* step 2: notify the HW to kickoff the update */
>   	mdev->funcs->flush(mdev, master->id, kcrtc_st->active_pipes);
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.h b/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
> index 83e61c4080c2..9c34302782c0 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
> @@ -53,8 +53,8 @@ struct komeda_plane_state {
>    * struct komeda_wb_connector
>    */
>   struct komeda_wb_connector {
> -	/** @base: &drm_writeback_connector */
> -	struct drm_writeback_connector base;
> +	/** @base: &drm_connector */
> +	struct drm_connector base;
>   
>   	/** @wb_layer: represents associated writeback pipeline of komeda */
>   	struct komeda_layer *wb_layer;
> @@ -139,7 +139,7 @@ struct komeda_kms_dev {
>   static inline bool is_writeback_only(struct drm_crtc_state *st)
>   {
>   	struct komeda_wb_connector *wb_conn = to_kcrtc(st->crtc)->wb_conn;
> -	struct drm_connector *conn = wb_conn ? &wb_conn->base.base : NULL;
> +	struct drm_connector *conn = wb_conn ? &wb_conn->base : NULL;
>   
>   	return conn && (st->connector_mask == BIT(drm_connector_index(conn)));
>   }
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
> index bcc53d4015f1..fa2f63c142cd 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
> @@ -53,7 +53,7 @@ komeda_wb_encoder_atomic_check(struct drm_encoder *encoder,
>   		return -EINVAL;
>   	}
>   
> -	wb_layer = to_kconn(to_wb_conn(conn_st->connector))->wb_layer;
> +	wb_layer = to_kconn(conn_st->connector)->wb_layer;
>   
>   	/*
>   	 * No need for a full modested when the only connector changed is the
> @@ -151,7 +151,7 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
>   
>   	kwb_conn->wb_layer = kcrtc->master->wb_layer;
>   
> -	wb_conn = &kwb_conn->base;
> +	wb_conn = &kwb_conn->base.writeback;
>   
>   	formats = komeda_get_layer_fourcc_list(&mdev->fmt_tbl,
>   					       kwb_conn->wb_layer->layer_type,
> @@ -180,9 +180,9 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
>   		return err;
>   	}
>   
> -	drm_connector_helper_add(&wb_conn->base, &komeda_wb_conn_helper_funcs);
> +	drm_connector_helper_add(&kwb_conn->base, &komeda_wb_conn_helper_funcs);
>   
> -	info = &kwb_conn->base.base.display_info;
> +	info = &kwb_conn->base.display_info;
>   	info->bpc = __fls(kcrtc->master->improc->supported_color_depths);
>   	info->color_formats = kcrtc->master->improc->supported_color_formats;
>   
> diff --git a/drivers/gpu/drm/arm/malidp_crtc.c b/drivers/gpu/drm/arm/malidp_crtc.c
> index ebe8e1078777..4402c1de8c69 100644
> --- a/drivers/gpu/drm/arm/malidp_crtc.c
> +++ b/drivers/gpu/drm/arm/malidp_crtc.c
> @@ -421,7 +421,7 @@ static int malidp_crtc_atomic_check(struct drm_crtc *crtc,
>   		u32 new_mask = crtc_state->connector_mask;
>   
>   		if ((old_mask ^ new_mask) ==
> -		    (1 << drm_connector_index(&malidp->mw_connector.base)))
> +		    (1 << drm_connector_index(&malidp->mw_connector)))
>   			crtc_state->connectors_changed = false;
>   	}
>   
> diff --git a/drivers/gpu/drm/arm/malidp_drv.h b/drivers/gpu/drm/arm/malidp_drv.h
> index bc0387876dea..aa5599467d27 100644
> --- a/drivers/gpu/drm/arm/malidp_drv.h
> +++ b/drivers/gpu/drm/arm/malidp_drv.h
> @@ -32,7 +32,7 @@ struct malidp_drm {
>   	struct drm_device base;
>   	struct malidp_hw_device *dev;
>   	struct drm_crtc crtc;
> -	struct drm_writeback_connector mw_connector;
> +	struct drm_connector mw_connector;
>   	wait_queue_head_t wq;
>   	struct drm_pending_vblank_event *event;
>   	atomic_t config_valid;
> diff --git a/drivers/gpu/drm/arm/malidp_hw.c b/drivers/gpu/drm/arm/malidp_hw.c
> index 9b845d3f34e1..5a7bd27d3718 100644
> --- a/drivers/gpu/drm/arm/malidp_hw.c
> +++ b/drivers/gpu/drm/arm/malidp_hw.c
> @@ -1315,15 +1315,15 @@ static irqreturn_t malidp_se_irq(int irq, void *arg)
>   	if (status & se->vsync_irq) {
>   		switch (hwdev->mw_state) {
>   		case MW_ONESHOT:
> -			drm_writeback_signal_completion(&malidp->mw_connector, 0);
> +			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
>   			break;
>   		case MW_STOP:
> -			drm_writeback_signal_completion(&malidp->mw_connector, 0);
> +			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
>   			/* disable writeback after stop */
>   			hwdev->mw_state = MW_NOT_ENABLED;
>   			break;
>   		case MW_RESTART:
> -			drm_writeback_signal_completion(&malidp->mw_connector, 0);
> +			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
>   			fallthrough;	/* to a new start */
>   		case MW_START:
>   			/* writeback started, need to emulate one-shot mode */
> diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
> index cfb7300e3e95..6842c73f27b9 100644
> --- a/drivers/gpu/drm/arm/malidp_mw.c
> +++ b/drivers/gpu/drm/arm/malidp_mw.c
> @@ -212,7 +212,7 @@ int malidp_mw_connector_init(struct drm_device *drm)
>   	if (!malidp->dev->hw->enable_memwrite)
>   		return 0;
>   
> -	drm_connector_helper_add(&malidp->mw_connector.base,
> +	drm_connector_helper_add(&malidp->mw_connector,
>   				 &malidp_mw_connector_helper_funcs);
>   
>   	formats = get_writeback_formats(malidp, &n_formats);
> @@ -228,7 +228,7 @@ int malidp_mw_connector_init(struct drm_device *drm)
>   
>   	encoder->possible_crtcs = drm_crtc_mask(&malidp->crtc);
>   
> -	ret = drmm_writeback_connector_init(drm, &malidp->mw_connector,
> +	ret = drmm_writeback_connector_init(drm, &malidp->mw_connector.writeback,
>   					    &malidp_mw_connector_funcs,
>   					    encoder,
>   					    formats, n_formats);
> @@ -243,8 +243,8 @@ void malidp_mw_atomic_commit(struct drm_device *drm,
>   			     struct drm_atomic_commit *old_state)
>   {
>   	struct malidp_drm *malidp = drm_to_malidp(drm);
> -	struct drm_writeback_connector *mw_conn = &malidp->mw_connector;
> -	struct drm_connector_state *conn_state = mw_conn->base.state;
> +	struct drm_writeback_connector *mw_conn = &malidp->mw_connector.writeback;
> +	struct drm_connector_state *conn_state = malidp->mw_connector.state;
>   	struct malidp_hw_device *hwdev = malidp->dev;
>   	struct malidp_mw_connector_state *mw_state;
>   
> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> index 6441b55cc274..7add982e3a3f 100644
> --- a/drivers/gpu/drm/drm_atomic_uapi.c
> +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> @@ -1472,7 +1472,7 @@ static int prepare_signaling(struct drm_device *dev,
>   		f[*num_fences].out_fence_ptr = fence_ptr;
>   		*fence_state = f;
>   
> -		wb_conn = drm_connector_to_writeback(conn);
> +		wb_conn = &conn->writeback;
>   		fence = drm_writeback_get_out_fence(wb_conn);
>   		if (!fence)
>   			return -ENOMEM;
> diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
> index 68fdac745f42..7bf9f6374712 100644
> --- a/drivers/gpu/drm/drm_writeback.c
> +++ b/drivers/gpu/drm/drm_writeback.c
> @@ -89,8 +89,10 @@ static const char *drm_writeback_fence_get_driver_name(struct dma_fence *fence)
>   {
>   	struct drm_writeback_connector *wb_connector =
>   		fence_to_wb_connector(fence);
> +	struct drm_connector *connector =
> +		drm_writeback_to_connector(wb_connector);
No need to line wrap?

>   
> -	return wb_connector->base.dev->driver->name;
> +	return connector->dev->driver->name;
>   }
>   
>   static const char *
> @@ -187,7 +189,8 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
>   					  struct drm_encoder *enc, const u32 *formats,
>   					  int n_formats)
>   {
> -	struct drm_connector *connector = &wb_connector->base;
> +	struct drm_connector *connector =
> +		drm_writeback_to_connector(wb_connector);
And again, and the same on pretty much all the similar chunks in most of 
the patches...

With that fixed:
Reviewed-by: John Harrison <John.Harrison@Igalia.com>

>   	struct drm_mode_config *config = &dev->mode_config;
>   	struct drm_property_blob *blob;
>   	int ret = create_writeback_properties(dev);
> @@ -269,7 +272,8 @@ int drm_writeback_connector_init(struct drm_device *dev,
>   				 struct drm_encoder *enc,
>   				 const u32 *formats, int n_formats)
>   {
> -	struct drm_connector *connector = &wb_connector->base;
> +	struct drm_connector *connector =
> +		drm_writeback_to_connector(wb_connector);
>   	int ret;
>   
>   	ret = drm_connector_init(dev, connector, con_funcs,
> @@ -339,7 +343,8 @@ int drmm_writeback_connector_init(struct drm_device *dev,
>   				  struct drm_encoder *enc,
>   				  const u32 *formats, int n_formats)
>   {
> -	struct drm_connector *connector = &wb_connector->base;
> +	struct drm_connector *connector =
> +		drm_writeback_to_connector(wb_connector);
>   	int ret;
>   
>   	ret = drmm_connector_init(dev, connector, con_funcs,
> @@ -372,7 +377,7 @@ int drm_writeback_set_fb(struct drm_connector_state *conn_state,
>   			return -ENOMEM;
>   
>   		conn_state->writeback_job->connector =
> -			drm_connector_to_writeback(conn_state->connector);
> +			&conn_state->connector->writeback;
>   	}
>   
>   	drm_framebuffer_assign(&conn_state->writeback_job->fb, fb);
> @@ -381,13 +386,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_writeback_to_connector(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;
>   	}
> @@ -433,12 +440,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_writeback_to_connector(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);
> @@ -520,8 +529,10 @@ struct dma_fence *
>   drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector)
>   {
>   	struct dma_fence *fence;
> +	struct drm_connector *connector =
> +		drm_writeback_to_connector(wb_connector);
>   
> -	if (WARN_ON(wb_connector->base.connector_type !=
> +	if (WARN_ON(connector->connector_type !=
>   		    DRM_MODE_CONNECTOR_WRITEBACK))
>   		return NULL;
>   
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> index 22433bfbea1e..e2a328225c9e 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> @@ -481,7 +481,8 @@ static void dpu_encoder_phys_wb_prepare_for_kickoff(
>   		return;
>   	}
>   
> -	drm_conn = &wb_enc->wb_conn->base;
> +	drm_conn =
> +		drm_writeback_to_connector(wb_enc->wb_conn);
>   	state = drm_conn->state;
>   
>   	if (wb_enc->wb_conn && wb_enc->wb_job)
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
> index e7b09013ae4c..69eb2f85dec3 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
> @@ -29,8 +29,7 @@ static int dpu_wb_conn_get_modes(struct drm_connector *connector)
>   static int dpu_wb_conn_atomic_check(struct drm_connector *connector,
>   				    struct drm_atomic_commit *state)
>   {
> -	struct drm_writeback_connector *wb_conn = drm_connector_to_writeback(connector);
> -	struct dpu_wb_connector *dpu_wb_conn = to_dpu_wb_conn(wb_conn);
> +	struct dpu_wb_connector *dpu_wb_conn = to_dpu_wb_conn(connector);
>   	struct drm_connector_state *conn_state =
>   		drm_atomic_get_new_connector_state(state, connector);
>   	struct drm_crtc *crtc;
> @@ -88,10 +87,11 @@ static const struct drm_connector_funcs dpu_wb_conn_funcs = {
>   	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
>   };
>   
> -static int dpu_wb_conn_prepare_job(struct drm_writeback_connector *connector,
> +static int dpu_wb_conn_prepare_job(struct drm_writeback_connector *wb_conn,
>   		struct drm_writeback_job *job)
>   {
> -
> +	struct drm_connector *connector =
> +		drm_writeback_to_connector(wb_conn);
>   	struct dpu_wb_connector *dpu_wb_conn = to_dpu_wb_conn(connector);
>   
>   	if (!job->fb)
> @@ -102,9 +102,11 @@ static int dpu_wb_conn_prepare_job(struct drm_writeback_connector *connector,
>   	return 0;
>   }
>   
> -static void dpu_wb_conn_cleanup_job(struct drm_writeback_connector *connector,
> +static void dpu_wb_conn_cleanup_job(struct drm_writeback_connector *wb_connector,
>   		struct drm_writeback_job *job)
>   {
> +	struct drm_connector *connector =
> +		drm_writeback_to_connector(wb_connector);
>   	struct dpu_wb_connector *dpu_wb_conn = to_dpu_wb_conn(connector);
>   
>   	if (!job->fb)
> @@ -132,9 +134,9 @@ int dpu_writeback_init(struct drm_device *dev, struct drm_encoder *enc,
>   
>   	dpu_wb_conn->maxlinewidth = maxlinewidth;
>   
> -	drm_connector_helper_add(&dpu_wb_conn->base.base, &dpu_wb_conn_helper_funcs);
> +	drm_connector_helper_add(&dpu_wb_conn->base, &dpu_wb_conn_helper_funcs);
>   
> -	rc = drmm_writeback_connector_init(dev, &dpu_wb_conn->base,
> +	rc = drmm_writeback_connector_init(dev, &dpu_wb_conn->base.writeback,
>   					   &dpu_wb_conn_funcs, enc,
>   					   format_list, num_formats);
>   
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h
> index 4b11cca8014c..9ebf15392b20 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h
> @@ -16,12 +16,12 @@
>   #include "dpu_encoder_phys.h"
>   
>   struct dpu_wb_connector {
> -	struct drm_writeback_connector base;
> +	struct drm_connector base;
>   	struct drm_encoder *wb_enc;
>   	u32 maxlinewidth;
>   };
>   
> -static inline struct dpu_wb_connector *to_dpu_wb_conn(struct drm_writeback_connector *conn)
> +static inline struct dpu_wb_connector *to_dpu_wb_conn(struct drm_connector *conn)
>   {
>   	return container_of(conn, struct dpu_wb_connector, base);
>   }
> diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.h b/drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.h
> index 8857926e109a..11372ccfdd38 100644
> --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.h
> +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.h
> @@ -43,7 +43,7 @@ struct rcar_du_vsp;
>    * @cmm: CMM associated with this CRTC
>    * @vsp: VSP feeding video to this CRTC
>    * @vsp_pipe: index of the VSP pipeline feeding video to this CRTC
> - * @writeback: the writeback connector
> + * @wb_connector: the drm connector which contains the writeback connector
>    */
>   struct rcar_du_crtc {
>   	struct drm_crtc crtc;
> @@ -73,11 +73,11 @@ struct rcar_du_crtc {
>   	const char *const *sources;
>   	unsigned int sources_count;
>   
> -	struct drm_writeback_connector writeback;
> +	struct drm_connector wb_connector;
>   };
>   
>   #define to_rcar_crtc(c)		container_of(c, struct rcar_du_crtc, crtc)
> -#define wb_to_rcar_crtc(c)	container_of(c, struct rcar_du_crtc, writeback)
> +#define wb_to_rcar_crtc(c)	container_of(c, struct rcar_du_crtc, wb_connector)
>   
>   /**
>    * struct rcar_du_crtc_state - Driver-specific CRTC state
> diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> index aa37cf99754c..39be854c465a 100644
> --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> @@ -50,7 +50,8 @@ static int rcar_du_wb_conn_get_modes(struct drm_connector *connector)
>   static int rcar_du_wb_prepare_job(struct drm_writeback_connector *connector,
>   				  struct drm_writeback_job *job)
>   {
> -	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(connector);
> +	struct drm_connector *conn = drm_writeback_to_connector(connector);
> +	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(conn);
>   	struct rcar_du_wb_job *rjob;
>   	int ret;
>   
> @@ -75,7 +76,8 @@ static int rcar_du_wb_prepare_job(struct drm_writeback_connector *connector,
>   static void rcar_du_wb_cleanup_job(struct drm_writeback_connector *connector,
>   				   struct drm_writeback_job *job)
>   {
> -	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(connector);
> +	struct drm_connector *conn = drm_writeback_to_connector(connector);
> +	struct rcar_du_crtc *rcrtc = wb_to_rcar_crtc(conn);
>   	struct rcar_du_wb_job *rjob = job->priv;
>   
>   	if (!job->fb)
> @@ -199,8 +201,7 @@ static const u32 writeback_formats[] = {
>   int rcar_du_writeback_init(struct rcar_du_device *rcdu,
>   			   struct rcar_du_crtc *rcrtc)
>   {
> -	struct drm_writeback_connector *wb_conn = &rcrtc->writeback;
> -
> +	struct drm_writeback_connector *wb_conn = &rcrtc->wb_connector.writeback;
>   	struct drm_encoder *encoder;
>   
>   	encoder = drmm_plain_encoder_alloc(&rcdu->ddev, NULL,
> @@ -212,7 +213,7 @@ int rcar_du_writeback_init(struct rcar_du_device *rcdu,
>   
>   	encoder->possible_crtcs = drm_crtc_mask(&rcrtc->crtc);
>   
> -	drm_connector_helper_add(&wb_conn->base,
> +	drm_connector_helper_add(&rcrtc->wb_connector,
>   				 &rcar_du_wb_conn_helper_funcs);
>   
>   	return drmm_writeback_connector_init(&rcdu->ddev, wb_conn,
> @@ -231,7 +232,7 @@ void rcar_du_writeback_setup(struct rcar_du_crtc *rcrtc,
>   	struct drm_framebuffer *fb;
>   	unsigned int i;
>   
> -	state = rcrtc->writeback.base.state;
> +	state = rcrtc->wb_connector.state;
>   	if (!state || !state->writeback_job)
>   		return;
>   
> @@ -246,10 +247,10 @@ void rcar_du_writeback_setup(struct rcar_du_crtc *rcrtc,
>   		cfg->mem[i] = sg_dma_address(rjob->sg_tables[i].sgl)
>   			    + fb->offsets[i];
>   
> -	drm_writeback_queue_job(&rcrtc->writeback, state);
> +	drm_writeback_queue_job(&rcrtc->wb_connector.writeback, state);
>   }
>   
>   void rcar_du_writeback_complete(struct rcar_du_crtc *rcrtc)
>   {
> -	drm_writeback_signal_completion(&rcrtc->writeback, 0);
> +	drm_writeback_signal_completion(&rcrtc->wb_connector.writeback, 0);
>   }
> diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
> index 3fd89fccfa10..8a4afa6a1eec 100644
> --- a/drivers/gpu/drm/vc4/vc4_txp.c
> +++ b/drivers/gpu/drm/vc4/vc4_txp.c
> @@ -168,7 +168,7 @@ struct vc4_txp {
>   	struct platform_device *pdev;
>   
>   	struct vc4_encoder encoder;
> -	struct drm_writeback_connector connector;
> +	struct drm_connector connector;
>   
>   	void __iomem *regs;
>   };
> @@ -177,7 +177,7 @@ struct vc4_txp {
>   	container_of_const(_encoder, struct vc4_txp, encoder.base)
>   
>   #define connector_to_vc4_txp(_connector)				\
> -	container_of_const(_connector, struct vc4_txp, connector.base)
> +	container_of_const(_connector, struct vc4_txp, connector)
>   
>   static const struct debugfs_reg32 txp_regs[] = {
>   	VC4_REG32(TXP_DST_PTR),
> @@ -357,7 +357,7 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn,
>   
>   	TXP_WRITE(TXP_DST_CTRL, ctrl);
>   
> -	drm_writeback_queue_job(&txp->connector, conn_state);
> +	drm_writeback_queue_job(&txp->connector.writeback, conn_state);
>   
>   	drm_dev_exit(idx);
>   }
> @@ -505,7 +505,7 @@ static irqreturn_t vc4_txp_interrupt(int irq, void *data)
>   	 */
>   	TXP_WRITE(TXP_DST_CTRL, TXP_READ(TXP_DST_CTRL) & ~TXP_EI);
>   	vc4_crtc_handle_vblank(vc4_crtc);
> -	drm_writeback_signal_completion(&txp->connector, 0);
> +	drm_writeback_signal_completion(&txp->connector.writeback, 0);
>   
>   	return IRQ_HANDLED;
>   }
> @@ -599,9 +599,9 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data)
>   	if (ret)
>   		return ret;
>   
> -	drm_connector_helper_add(&txp->connector.base,
> +	drm_connector_helper_add(&txp->connector,
>   				 &vc4_txp_connector_helper_funcs);
> -	ret = drmm_writeback_connector_init(drm, &txp->connector,
> +	ret = drmm_writeback_connector_init(drm, &txp->connector.writeback,
>   					    &vc4_txp_connector_funcs,
>   					    encoder,
>   					    drm_fmts, ARRAY_SIZE(drm_fmts));
> @@ -623,7 +623,7 @@ static void vc4_txp_unbind(struct device *dev, struct device *master,
>   {
>   	struct vc4_txp *txp = dev_get_drvdata(dev);
>   
> -	drm_connector_cleanup(&txp->connector.base);
> +	drm_connector_cleanup(&txp->connector);
>   }
>   
>   static const struct component_ops vc4_txp_ops = {
> diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c
> index 83d217085ad0..27fb6a7b55bb 100644
> --- a/drivers/gpu/drm/vkms/vkms_composer.c
> +++ b/drivers/gpu/drm/vkms/vkms_composer.c
> @@ -652,7 +652,7 @@ void vkms_composer_worker(struct work_struct *work)
>   		return;
>   
>   	if (wb_pending) {
> -		drm_writeback_signal_completion(&out->wb_connector, 0);
> +		drm_writeback_signal_completion(&out->wb_connector.writeback, 0);
>   		spin_lock_irq(&out->composer_lock);
>   		crtc_state->wb_pending = false;
>   		spin_unlock_irq(&out->composer_lock);
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
> index 0933e4ce0ff0..145a7909388b 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.h
> +++ b/drivers/gpu/drm/vkms/vkms_drv.h
> @@ -217,7 +217,7 @@ struct vkms_crtc_state {
>    */
>   struct vkms_output {
>   	struct drm_crtc crtc;
> -	struct drm_writeback_connector wb_connector;
> +	struct drm_connector wb_connector;
>   	struct drm_encoder wb_encoder;
>   	struct workqueue_struct *composer_workq;
>   	spinlock_t lock;
> diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
> index ecf29a2c0c8e..64d524d2168f 100644
> --- a/drivers/gpu/drm/vkms/vkms_writeback.c
> +++ b/drivers/gpu/drm/vkms/vkms_writeback.c
> @@ -103,10 +103,13 @@ static int vkms_wb_prepare_job(struct drm_writeback_connector *wb_connector,
>   	return ret;
>   }
>   
> -static void vkms_wb_cleanup_job(struct drm_writeback_connector *connector,
> +static void vkms_wb_cleanup_job(struct drm_writeback_connector *wb_conn,
>   				struct drm_writeback_job *job)
>   {
>   	struct vkms_writeback_job *vkmsjob = job->priv;
> +	struct drm_connector *connector = container_of(wb_conn,
> +						       struct drm_connector,
> +						       writeback);
>   	struct vkms_output *vkms_output = container_of(connector,
>   						       struct vkms_output,
>   						       wb_connector);
> @@ -128,8 +131,8 @@ static void vkms_wb_atomic_commit(struct drm_connector *conn,
>   	struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state,
>   											 conn);
>   	struct vkms_output *output = drm_crtc_to_vkms_output(connector_state->crtc);
> -	struct drm_writeback_connector *wb_conn = &output->wb_connector;
> -	struct drm_connector_state *conn_state = wb_conn->base.state;
> +	struct drm_writeback_connector *wb_conn = &output->wb_connector.writeback;
> +	struct drm_connector_state *conn_state = output->wb_connector.state;
>   	struct vkms_crtc_state *crtc_state = output->composer_state;
>   	struct drm_framebuffer *fb = connector_state->writeback_job->fb;
>   	u16 crtc_height = crtc_state->base.mode.vdisplay;
> @@ -167,7 +170,7 @@ static const struct drm_connector_helper_funcs vkms_wb_conn_helper_funcs = {
>   int vkms_enable_writeback_connector(struct vkms_device *vkmsdev,
>   				    struct vkms_output *vkms_output)
>   {
> -	struct drm_writeback_connector *wb = &vkms_output->wb_connector;
> +	struct drm_writeback_connector *wb = &vkms_output->wb_connector.writeback;
>   	int ret;
>   
>   	ret = drmm_encoder_init(&vkmsdev->drm, &vkms_output->wb_encoder,
> @@ -178,7 +181,7 @@ int vkms_enable_writeback_connector(struct vkms_device *vkmsdev,
>   	vkms_output->wb_encoder.possible_clones |=
>   		drm_encoder_mask(&vkms_output->wb_encoder);
>   
> -	drm_connector_helper_add(&wb->base, &vkms_wb_conn_helper_funcs);
> +	drm_connector_helper_add(&vkms_output->wb_connector, &vkms_wb_conn_helper_funcs);
>   
>   	return drmm_writeback_connector_init(&vkmsdev->drm, wb,
>   					     &vkms_wb_connector_funcs,
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index 5ad62c207d00..d99f6bf7e644 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -1987,6 +1987,61 @@ struct drm_connector_cec {
>   	void *data;
>   };
>   
> +/**
> + * struct drm_writeback_connector - DRM writeback connector
> + */
> +struct drm_writeback_connector {
> +	/**
> +	 * @pixel_formats_blob_ptr:
> +	 *
> +	 * DRM blob property data for the pixel formats list on writeback
> +	 * connectors
> +	 * See also drm_writeback_connector_init()
> +	 */
> +	struct drm_property_blob *pixel_formats_blob_ptr;
> +
> +	/** @job_lock: Protects job_queue */
> +	spinlock_t job_lock;
> +
> +	/**
> +	 * @job_queue:
> +	 *
> +	 * Holds a list of a connector's writeback jobs; the last item is the
> +	 * most recent. The first item may be either waiting for the hardware
> +	 * to begin writing, or currently being written.
> +	 *
> +	 * See also: drm_writeback_queue_job() and
> +	 * drm_writeback_signal_completion()
> +	 */
> +	struct list_head job_queue;
> +
> +	/**
> +	 * @fence_context:
> +	 *
> +	 * timeline context used for fence operations.
> +	 */
> +	unsigned int fence_context;
> +	/**
> +	 * @fence_lock:
> +	 *
> +	 * spinlock to protect the fences in the fence_context.
> +	 */
> +	spinlock_t fence_lock;
> +	/**
> +	 * @fence_seqno:
> +	 *
> +	 * Seqno variable used as monotonic counter for the fences
> +	 * created on the connector's timeline.
> +	 */
> +	unsigned long fence_seqno;
> +	/**
> +	 * @timeline_name:
> +	 *
> +	 * The name of the connector's fence timeline.
> +	 */
> +	char timeline_name[32];
> +};
> +
>   /**
>    * struct drm_connector - central DRM connector control structure
>    *
> @@ -2396,10 +2451,16 @@ struct drm_connector {
>   	 */
>   	struct llist_node free_node;
>   
> -	/**
> -	 * @hdmi: HDMI-related variable and properties.
> -	 */
> -	struct drm_connector_hdmi hdmi;
> +	union {
> +		/**
> +		 * @hdmi: HDMI-related variable and properties.
> +		 */
> +		struct drm_connector_hdmi hdmi;
> +		/**
> +		 * @writeback: Writeback related valriables.
> +		 */
> +		struct drm_writeback_connector writeback;
> +	};
>   
>   	/**
>   	 * @hdmi_audio: HDMI codec properties and non-DRM state.
> diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
> index 958466a05e60..702141099520 100644
> --- a/include/drm/drm_writeback.h
> +++ b/include/drm/drm_writeback.h
> @@ -15,66 +15,6 @@
>   #include <drm/drm_encoder.h>
>   #include <linux/workqueue.h>
>   
> -/**
> - * struct drm_writeback_connector - DRM writeback connector
> - */
> -struct drm_writeback_connector {
> -	/**
> -	 * @base: base drm_connector object
> -	 */
> -	struct drm_connector base;
> -
> -	/**
> -	 * @pixel_formats_blob_ptr:
> -	 *
> -	 * DRM blob property data for the pixel formats list on writeback
> -	 * connectors
> -	 * See also drm_writeback_connector_init()
> -	 */
> -	struct drm_property_blob *pixel_formats_blob_ptr;
> -
> -	/** @job_lock: Protects job_queue */
> -	spinlock_t job_lock;
> -
> -	/**
> -	 * @job_queue:
> -	 *
> -	 * Holds a list of a connector's writeback jobs; the last item is the
> -	 * most recent. The first item may be either waiting for the hardware
> -	 * to begin writing, or currently being written.
> -	 *
> -	 * See also: drm_writeback_queue_job() and
> -	 * drm_writeback_signal_completion()
> -	 */
> -	struct list_head job_queue;
> -
> -	/**
> -	 * @fence_context:
> -	 *
> -	 * timeline context used for fence operations.
> -	 */
> -	unsigned int fence_context;
> -	/**
> -	 * @fence_lock:
> -	 *
> -	 * spinlock to protect the fences in the fence_context.
> -	 */
> -	spinlock_t fence_lock;
> -	/**
> -	 * @fence_seqno:
> -	 *
> -	 * Seqno variable used as monotonic counter for the fences
> -	 * created on the connector's timeline.
> -	 */
> -	unsigned long fence_seqno;
> -	/**
> -	 * @timeline_name:
> -	 *
> -	 * The name of the connector's fence timeline.
> -	 */
> -	char timeline_name[32];
> -};
> -
>   /**
>    * struct drm_writeback_job - DRM writeback job
>    */
> @@ -131,10 +71,10 @@ struct drm_writeback_job {
>   	void *priv;
>   };
>   
> -static inline struct drm_writeback_connector *
> -drm_connector_to_writeback(struct drm_connector *connector)
> +static inline struct drm_connector *
> +drm_writeback_to_connector(struct drm_writeback_connector *wb_connector)
>   {
> -	return container_of(connector, struct drm_writeback_connector, base);
> +	return container_of(wb_connector, struct drm_connector, writeback);
>   }
>   
>   int drm_writeback_connector_init(struct drm_device *dev,


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 2/7] drm: writeback: Modify writeback init helpers
  2026-05-21  5:37 ` [PATCH v4 2/7] drm: writeback: Modify writeback init helpers Suraj Kandpal
@ 2026-05-21 23:30   ` John Harrison
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  1 sibling, 0 replies; 23+ messages in thread
From: John Harrison @ 2026-05-21 23:30 UTC (permalink / raw)
  To: Suraj Kandpal, freedreno, dri-devel, kernel-list, amd-gfx,
	linux-kernel, intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev

On 5/20/26 22:37, Suraj Kandpal wrote:
> The writeback connector init helpers (drm_writeback_connector_init,
> drm_writeback_connector_init_with_encoder, drmm_writeback_connector_init
> and drmm_writeback_connector_init_with_encoder) require access to the
> parent drm_connector object as well as the drm_writeback_connector
> object itself. So, pass in the top level drm_connector and traverse
> down to drm_writeback_connector rather than passing in the lower level
> object and traversing back up. Even where such is not the case, update
> to use the top level object for consistency across the interface.
>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> ---
> v3 -> v4:
> - Update subject line for consitency (John)
> - Update commit message across commits for consitency (John)
> - Rename writeback to wb_connector in rcar_du_crtc for clarity (John)
>
>   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c   |  2 +-
>   .../drm/arm/display/komeda/komeda_wb_connector.c   |  5 +----
>   drivers/gpu/drm/arm/malidp_mw.c                    |  2 +-
>   drivers/gpu/drm/drm_writeback.c                    | 14 ++++++--------
>   drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c      |  2 +-
>   .../gpu/drm/renesas/rcar-du/rcar_du_writeback.c    |  3 +--
>   drivers/gpu/drm/vc4/vc4_txp.c                      |  2 +-
>   drivers/gpu/drm/vkms/vkms_writeback.c              |  4 ++--
>   include/drm/drm_writeback.h                        |  4 ++--
>   9 files changed, 16 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
> index 6fb8cb4d520c..bb4945f01616 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c
> @@ -202,7 +202,7 @@ int amdgpu_dm_wb_connector_init(struct amdgpu_display_manager *dm,
>   
>   	drm_connector_helper_add(&wbcon->base, &amdgpu_dm_wb_conn_helper_funcs);
>   
> -	res = drmm_writeback_connector_init(&dm->adev->ddev, &wbcon->base.writeback,
> +	res = drmm_writeback_connector_init(&dm->adev->ddev, &wbcon->base,
>   					    &amdgpu_dm_wb_connector_funcs,
>   					    encoder,
>   					    amdgpu_dm_wb_formats,
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
> index fa2f63c142cd..85b34375d275 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
> @@ -135,7 +135,6 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
>   {
>   	struct komeda_dev *mdev = kms->base.dev_private;
>   	struct komeda_wb_connector *kwb_conn;
> -	struct drm_writeback_connector *wb_conn;
>   	struct drm_display_info *info;
>   	struct drm_encoder *encoder;
>   
> @@ -151,8 +150,6 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
>   
>   	kwb_conn->wb_layer = kcrtc->master->wb_layer;
>   
> -	wb_conn = &kwb_conn->base.writeback;
> -
>   	formats = komeda_get_layer_fourcc_list(&mdev->fmt_tbl,
>   					       kwb_conn->wb_layer->layer_type,
>   					       &n_formats);
> @@ -170,7 +167,7 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
>   
>   	encoder->possible_crtcs = drm_crtc_mask(&kcrtc->base);
>   
> -	err = drmm_writeback_connector_init(&kms->base, wb_conn,
> +	err = drmm_writeback_connector_init(&kms->base, &kwb_conn->base,
>   					    &komeda_wb_connector_funcs,
>   					    encoder,
>   					    formats, n_formats);
> diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
> index 6842c73f27b9..c6d11c7af1e4 100644
> --- a/drivers/gpu/drm/arm/malidp_mw.c
> +++ b/drivers/gpu/drm/arm/malidp_mw.c
> @@ -228,7 +228,7 @@ int malidp_mw_connector_init(struct drm_device *drm)
>   
>   	encoder->possible_crtcs = drm_crtc_mask(&malidp->crtc);
>   
> -	ret = drmm_writeback_connector_init(drm, &malidp->mw_connector.writeback,
> +	ret = drmm_writeback_connector_init(drm, &malidp->mw_connector,
>   					    &malidp_mw_connector_funcs,
>   					    encoder,
>   					    formats, n_formats);
> diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
> index 7bf9f6374712..9a3037d11009 100644
> --- a/drivers/gpu/drm/drm_writeback.c
> +++ b/drivers/gpu/drm/drm_writeback.c
> @@ -242,7 +242,7 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
>    * a custom encoder
>    *
>    * @dev: DRM device
> - * @wb_connector: Writeback connector to initialize
> + * @connector: Drm connector which contains the writeback connector to initialize
>    * @enc: handle to the already initialized drm encoder
>    * @con_funcs: Connector funcs vtable
>    * @formats: Array of supported pixel formats for the writeback engine
> @@ -267,13 +267,12 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
>    * Returns: 0 on success, or a negative error code
>    */
>   int drm_writeback_connector_init(struct drm_device *dev,
> -				 struct drm_writeback_connector *wb_connector,
> +				 struct drm_connector *connector,
>   				 const struct drm_connector_funcs *con_funcs,
>   				 struct drm_encoder *enc,
>   				 const u32 *formats, int n_formats)
>   {
> -	struct drm_connector *connector =
> -		drm_writeback_to_connector(wb_connector);
> +	struct drm_writeback_connector *wb_connector = &connector->writeback;
>   	int ret;
>   
>   	ret = drm_connector_init(dev, connector, con_funcs,
> @@ -322,7 +321,7 @@ static void drm_writeback_connector_cleanup(struct drm_device *dev,
>    * a custom encoder
>    *
>    * @dev: DRM device
> - * @wb_connector: Writeback connector to initialize
> + * @connector: Drm connector containing the writeback connector to initialize
You have most other equivalent entries saying 'Drm connector which 
contains'. Would be good to keep them all consistent. Personally, I 
think this one is simpler. Especially later when you have things like 
"connector which contains connector whose job...".

Plus, DRM should be DRM not Drm.

With those fixed (and consistent wording across the patches):
Reviewed-by: John Harrison <John.Harrison@Igalia.com>


>    * @con_funcs: Connector funcs vtable
>    * @enc: Encoder to connect this writeback connector
>    * @formats: Array of supported pixel formats for the writeback engine
> @@ -338,13 +337,12 @@ static void drm_writeback_connector_cleanup(struct drm_device *dev,
>    * Returns: 0 on success, or a negative error code
>    */
>   int drmm_writeback_connector_init(struct drm_device *dev,
> -				  struct drm_writeback_connector *wb_connector,
> +				  struct drm_connector *connector,
>   				  const struct drm_connector_funcs *con_funcs,
>   				  struct drm_encoder *enc,
>   				  const u32 *formats, int n_formats)
>   {
> -	struct drm_connector *connector =
> -		drm_writeback_to_connector(wb_connector);
> +	struct drm_writeback_connector *wb_connector = &connector->writeback;
>   	int ret;
>   
>   	ret = drmm_connector_init(dev, connector, con_funcs,
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
> index 69eb2f85dec3..4dee524d1270 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
> @@ -136,7 +136,7 @@ int dpu_writeback_init(struct drm_device *dev, struct drm_encoder *enc,
>   
>   	drm_connector_helper_add(&dpu_wb_conn->base, &dpu_wb_conn_helper_funcs);
>   
> -	rc = drmm_writeback_connector_init(dev, &dpu_wb_conn->base.writeback,
> +	rc = drmm_writeback_connector_init(dev, &dpu_wb_conn->base,
>   					   &dpu_wb_conn_funcs, enc,
>   					   format_list, num_formats);
>   
> diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> index 39be854c465a..6b27307941a4 100644
> --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> @@ -201,7 +201,6 @@ static const u32 writeback_formats[] = {
>   int rcar_du_writeback_init(struct rcar_du_device *rcdu,
>   			   struct rcar_du_crtc *rcrtc)
>   {
> -	struct drm_writeback_connector *wb_conn = &rcrtc->wb_connector.writeback;
>   	struct drm_encoder *encoder;
>   
>   	encoder = drmm_plain_encoder_alloc(&rcdu->ddev, NULL,
> @@ -216,7 +215,7 @@ int rcar_du_writeback_init(struct rcar_du_device *rcdu,
>   	drm_connector_helper_add(&rcrtc->wb_connector,
>   				 &rcar_du_wb_conn_helper_funcs);
>   
> -	return drmm_writeback_connector_init(&rcdu->ddev, wb_conn,
> +	return drmm_writeback_connector_init(&rcdu->ddev, &rcrtc->wb_connector,
>   					     &rcar_du_wb_conn_funcs,
>   					     encoder,
>   					     writeback_formats,
> diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
> index 8a4afa6a1eec..c762b93738d3 100644
> --- a/drivers/gpu/drm/vc4/vc4_txp.c
> +++ b/drivers/gpu/drm/vc4/vc4_txp.c
> @@ -601,7 +601,7 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data)
>   
>   	drm_connector_helper_add(&txp->connector,
>   				 &vc4_txp_connector_helper_funcs);
> -	ret = drmm_writeback_connector_init(drm, &txp->connector.writeback,
> +	ret = drmm_writeback_connector_init(drm, &txp->connector,
>   					    &vc4_txp_connector_funcs,
>   					    encoder,
>   					    drm_fmts, ARRAY_SIZE(drm_fmts));
> diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
> index 64d524d2168f..9341533b0325 100644
> --- a/drivers/gpu/drm/vkms/vkms_writeback.c
> +++ b/drivers/gpu/drm/vkms/vkms_writeback.c
> @@ -170,7 +170,6 @@ static const struct drm_connector_helper_funcs vkms_wb_conn_helper_funcs = {
>   int vkms_enable_writeback_connector(struct vkms_device *vkmsdev,
>   				    struct vkms_output *vkms_output)
>   {
> -	struct drm_writeback_connector *wb = &vkms_output->wb_connector.writeback;
>   	int ret;
>   
>   	ret = drmm_encoder_init(&vkmsdev->drm, &vkms_output->wb_encoder,
> @@ -183,7 +182,8 @@ int vkms_enable_writeback_connector(struct vkms_device *vkmsdev,
>   
>   	drm_connector_helper_add(&vkms_output->wb_connector, &vkms_wb_conn_helper_funcs);
>   
> -	return drmm_writeback_connector_init(&vkmsdev->drm, wb,
> +	return drmm_writeback_connector_init(&vkmsdev->drm,
> +					     &vkms_output->wb_connector,
>   					     &vkms_wb_connector_funcs,
>   					     &vkms_output->wb_encoder,
>   					     vkms_wb_formats,
> diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
> index 702141099520..c6960c7e634e 100644
> --- a/include/drm/drm_writeback.h
> +++ b/include/drm/drm_writeback.h
> @@ -78,13 +78,13 @@ drm_writeback_to_connector(struct drm_writeback_connector *wb_connector)
>   }
>   
>   int drm_writeback_connector_init(struct drm_device *dev,
> -				 struct drm_writeback_connector *wb_connector,
> +				 struct drm_connector *connector,
>   				 const struct drm_connector_funcs *con_funcs,
>   				 struct drm_encoder *enc,
>   				 const u32 *formats, int n_formats);
>   
>   int drmm_writeback_connector_init(struct drm_device *dev,
> -				  struct drm_writeback_connector *wb_connector,
> +				  struct drm_connector *connector,
>   				  const struct drm_connector_funcs *con_funcs,
>   				  struct drm_encoder *enc,
>   				  const u32 *formats, int n_formats);


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 3/7] drm: writeback: Modify drm_writeback_queue_job helper
  2026-05-21  5:37 ` [PATCH v4 3/7] drm: writeback: Modify drm_writeback_queue_job helper Suraj Kandpal
@ 2026-05-21 23:31   ` John Harrison
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  1 sibling, 0 replies; 23+ messages in thread
From: John Harrison @ 2026-05-21 23:31 UTC (permalink / raw)
  To: Suraj Kandpal, freedreno, dri-devel, kernel-list, amd-gfx,
	linux-kernel, intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev,
	Dmitry Baryshkov

On 5/20/26 22:37, Suraj Kandpal wrote:
> drm_writeback_queue_job() needs access to the parent drm_connector
> object as well as the drm_writeback_connector object itself. So,
> pass in the top level drm_connector and traverse down to
> drm_writeback_connector rather than passing in the lower level
> object and traversing back up. This is also consistent with the
> rest of the writeback interface which is being updated to use
> drm_connector as the top level handle.
>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> ---
> v3 -> v4:
> - Update subject line for consitency (John)
> - Update commit message across commits for consitency (John)
>
>   drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c   | 2 +-
>   drivers/gpu/drm/arm/display/komeda/komeda_crtc.c    | 2 +-
>   drivers/gpu/drm/arm/malidp_mw.c                     | 3 +--
>   drivers/gpu/drm/drm_writeback.c                     | 6 ++++--
>   drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 2 +-
>   drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c | 2 +-
>   drivers/gpu/drm/vc4/vc4_txp.c                       | 2 +-
>   drivers/gpu/drm/vkms/vkms_writeback.c               | 3 +--
>   include/drm/drm_writeback.h                         | 2 +-
>   9 files changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 27c59ef18c30..f5154b10e50f 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -10988,7 +10988,7 @@ static void dm_set_writeback(struct amdgpu_display_manager *dm,
>   
>   	acrtc->wb_pending = true;
>   	acrtc->wb_conn = wb_conn;
> -	drm_writeback_queue_job(wb_conn, new_con_state);
> +	drm_writeback_queue_job(connector, new_con_state);
>   }
>   
>   static void amdgpu_dm_update_hdcp(struct drm_atomic_commit *state)
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> index 6611920c45fb..c64cf5d97e62 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> @@ -271,7 +271,7 @@ komeda_crtc_do_flush(struct drm_crtc *crtc,
>   
>   	conn_st = wb_conn ? wb_conn->base.state : NULL;
>   	if (conn_st && conn_st->writeback_job)
> -		drm_writeback_queue_job(&wb_conn->base.writeback, conn_st);
> +		drm_writeback_queue_job(&wb_conn->base, conn_st);
>   
>   	/* step 2: notify the HW to kickoff the update */
>   	mdev->funcs->flush(mdev, master->id, kcrtc_st->active_pipes);
> diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
> index c6d11c7af1e4..0f419b2b79ab 100644
> --- a/drivers/gpu/drm/arm/malidp_mw.c
> +++ b/drivers/gpu/drm/arm/malidp_mw.c
> @@ -243,7 +243,6 @@ void malidp_mw_atomic_commit(struct drm_device *drm,
>   			     struct drm_atomic_commit *old_state)
>   {
>   	struct malidp_drm *malidp = drm_to_malidp(drm);
> -	struct drm_writeback_connector *mw_conn = &malidp->mw_connector.writeback;
>   	struct drm_connector_state *conn_state = malidp->mw_connector.state;
>   	struct malidp_hw_device *hwdev = malidp->dev;
>   	struct malidp_mw_connector_state *mw_state;
> @@ -263,7 +262,7 @@ void malidp_mw_atomic_commit(struct drm_device *drm,
>   				     &mw_state->addrs[0],
>   				     mw_state->format);
>   
> -		drm_writeback_queue_job(mw_conn, conn_state);
> +		drm_writeback_queue_job(&malidp->mw_connector, conn_state);
>   		hwdev->hw->enable_memwrite(hwdev, mw_state->addrs,
>   					   mw_state->pitches, mw_state->n_planes,
>   					   fb->width, fb->height, mw_state->format,
> diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
> index 9a3037d11009..1c1802d87f13 100644
> --- a/drivers/gpu/drm/drm_writeback.c
> +++ b/drivers/gpu/drm/drm_writeback.c
> @@ -404,7 +404,8 @@ EXPORT_SYMBOL(drm_writeback_prepare_job);
>   
>   /**
>    * drm_writeback_queue_job - Queue a writeback job for later signalling
> - * @wb_connector: The writeback connector to queue a job on
> + * @connector: The drm connector  which contains the writeback connector to
Double space.

With that fixed (and consistent wording across the patches):
Reviewed-by: John Harrison <John.Harrison@Igalia.com>


> + * queue a job on
>    * @conn_state: The connector state containing the job to queue
>    *
>    * This function adds the job contained in @conn_state to the job_queue for a
> @@ -421,9 +422,10 @@ EXPORT_SYMBOL(drm_writeback_prepare_job);
>    *
>    * See also: drm_writeback_signal_completion()
>    */
> -void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
> +void drm_writeback_queue_job(struct drm_connector *connector,
>   			     struct drm_connector_state *conn_state)
>   {
> +	struct drm_writeback_connector *wb_connector = &connector->writeback;
>   	struct drm_writeback_job *job;
>   	unsigned long flags;
>   
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> index e2a328225c9e..0a4026f22274 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> @@ -486,7 +486,7 @@ static void dpu_encoder_phys_wb_prepare_for_kickoff(
>   	state = drm_conn->state;
>   
>   	if (wb_enc->wb_conn && wb_enc->wb_job)
> -		drm_writeback_queue_job(wb_enc->wb_conn, state);
> +		drm_writeback_queue_job(drm_conn, state);
>   
>   	dpu_encoder_phys_wb_setup(phys_enc);
>   
> diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> index 6b27307941a4..5cd6c81a9710 100644
> --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> @@ -246,7 +246,7 @@ void rcar_du_writeback_setup(struct rcar_du_crtc *rcrtc,
>   		cfg->mem[i] = sg_dma_address(rjob->sg_tables[i].sgl)
>   			    + fb->offsets[i];
>   
> -	drm_writeback_queue_job(&rcrtc->wb_connector.writeback, state);
> +	drm_writeback_queue_job(&rcrtc->wb_connector, state);
>   }
>   
>   void rcar_du_writeback_complete(struct rcar_du_crtc *rcrtc)
> diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
> index c762b93738d3..46330b6f9a12 100644
> --- a/drivers/gpu/drm/vc4/vc4_txp.c
> +++ b/drivers/gpu/drm/vc4/vc4_txp.c
> @@ -357,7 +357,7 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn,
>   
>   	TXP_WRITE(TXP_DST_CTRL, ctrl);
>   
> -	drm_writeback_queue_job(&txp->connector.writeback, conn_state);
> +	drm_writeback_queue_job(&txp->connector, conn_state);
>   
>   	drm_dev_exit(idx);
>   }
> diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
> index 9341533b0325..2e3df9388dd2 100644
> --- a/drivers/gpu/drm/vkms/vkms_writeback.c
> +++ b/drivers/gpu/drm/vkms/vkms_writeback.c
> @@ -131,7 +131,6 @@ static void vkms_wb_atomic_commit(struct drm_connector *conn,
>   	struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state,
>   											 conn);
>   	struct vkms_output *output = drm_crtc_to_vkms_output(connector_state->crtc);
> -	struct drm_writeback_connector *wb_conn = &output->wb_connector.writeback;
>   	struct drm_connector_state *conn_state = output->wb_connector.state;
>   	struct vkms_crtc_state *crtc_state = output->composer_state;
>   	struct drm_framebuffer *fb = connector_state->writeback_job->fb;
> @@ -153,7 +152,7 @@ static void vkms_wb_atomic_commit(struct drm_connector *conn,
>   	crtc_state->active_writeback = active_wb;
>   	crtc_state->wb_pending = true;
>   	spin_unlock_irq(&output->composer_lock);
> -	drm_writeback_queue_job(wb_conn, connector_state);
> +	drm_writeback_queue_job(&output->wb_connector, connector_state);
>   	active_wb->pixel_write = get_pixel_write_function(wb_format);
>   	drm_rect_init(&wb_frame_info->src, 0, 0, crtc_width, crtc_height);
>   	drm_rect_init(&wb_frame_info->dst, 0, 0, crtc_width, crtc_height);
> diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
> index c6960c7e634e..b4c11d380df0 100644
> --- a/include/drm/drm_writeback.h
> +++ b/include/drm/drm_writeback.h
> @@ -94,7 +94,7 @@ int drm_writeback_set_fb(struct drm_connector_state *conn_state,
>   
>   int drm_writeback_prepare_job(struct drm_writeback_job *job);
>   
> -void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
> +void drm_writeback_queue_job(struct drm_connector *wb_connector,
>   			     struct drm_connector_state *conn_state);
>   
>   void drm_writeback_cleanup_job(struct drm_writeback_job *job);


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 4/7] drm: writeback: Modify drm_writeback_signal_completion helper
  2026-05-21  5:37 ` [PATCH v4 4/7] drm: writeback: Modify drm_writeback_signal_completion helper Suraj Kandpal
@ 2026-05-21 23:31   ` John Harrison
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  1 sibling, 0 replies; 23+ messages in thread
From: John Harrison @ 2026-05-21 23:31 UTC (permalink / raw)
  To: Suraj Kandpal, freedreno, dri-devel, kernel-list, amd-gfx,
	linux-kernel, intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev,
	Dmitry Baryshkov

On 5/20/26 22:37, Suraj Kandpal wrote:
> drm_writeback_signal_completion() needs access to the parent
> drm_connector object as well as the drm_writeback_connector object
> itself. So, pass in the top level drm_connector and traverse down
> to drm_writeback_connector rather than passing in the lower level
> object and traversing back up. Update to use the top level object
> for consistency across the writeback interface.
>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> ---
> v3 -> v4:
> - Update subject line for consitency (John)
> - Update commit message across commits for consitency (John)
>
>   drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c   | 2 +-
>   drivers/gpu/drm/arm/display/komeda/komeda_crtc.c    | 2 +-
>   drivers/gpu/drm/arm/malidp_hw.c                     | 6 +++---
>   drivers/gpu/drm/drm_writeback.c                     | 6 ++++--
>   drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 4 ++--
>   drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c | 2 +-
>   drivers/gpu/drm/vc4/vc4_txp.c                       | 2 +-
>   drivers/gpu/drm/vkms/vkms_composer.c                | 2 +-
>   include/drm/drm_writeback.h                         | 2 +-
>   9 files changed, 15 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index f5154b10e50f..730c44c53287 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -681,7 +681,7 @@ static void dm_crtc_high_irq(void *interrupt_params)
>   					     100LL, (v_total * stream->timing.h_total));
>   				mdelay(1000 / refresh_hz);
>   
> -				drm_writeback_signal_completion(acrtc->wb_conn, 0);
> +				drm_writeback_signal_completion(acrtc->connector, 0);
>   				dc_stream_fc_disable_writeback(adev->dm.dc,
>   							       acrtc->dm_irq_params.stream, 0);
>   			}
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> index c64cf5d97e62..da6bfe2797aa 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
> @@ -213,7 +213,7 @@ void komeda_crtc_handle_event(struct komeda_crtc   *kcrtc,
>   		struct komeda_wb_connector *wb_conn = kcrtc->wb_conn;
>   
>   		if (wb_conn)
> -			drm_writeback_signal_completion(&wb_conn->base.writeback, 0);
> +			drm_writeback_signal_completion(&wb_conn->base, 0);
>   		else
>   			drm_warn(drm, "CRTC[%d]: EOW happen but no wb_connector.\n",
>   				 drm_crtc_index(&kcrtc->base));
> diff --git a/drivers/gpu/drm/arm/malidp_hw.c b/drivers/gpu/drm/arm/malidp_hw.c
> index 5a7bd27d3718..9b845d3f34e1 100644
> --- a/drivers/gpu/drm/arm/malidp_hw.c
> +++ b/drivers/gpu/drm/arm/malidp_hw.c
> @@ -1315,15 +1315,15 @@ static irqreturn_t malidp_se_irq(int irq, void *arg)
>   	if (status & se->vsync_irq) {
>   		switch (hwdev->mw_state) {
>   		case MW_ONESHOT:
> -			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
> +			drm_writeback_signal_completion(&malidp->mw_connector, 0);
>   			break;
>   		case MW_STOP:
> -			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
> +			drm_writeback_signal_completion(&malidp->mw_connector, 0);
>   			/* disable writeback after stop */
>   			hwdev->mw_state = MW_NOT_ENABLED;
>   			break;
>   		case MW_RESTART:
> -			drm_writeback_signal_completion(&malidp->mw_connector.writeback, 0);
> +			drm_writeback_signal_completion(&malidp->mw_connector, 0);
>   			fallthrough;	/* to a new start */
>   		case MW_START:
>   			/* writeback started, need to emulate one-shot mode */
> diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
> index 1c1802d87f13..f3b4371d4201 100644
> --- a/drivers/gpu/drm/drm_writeback.c
> +++ b/drivers/gpu/drm/drm_writeback.c
> @@ -477,7 +477,8 @@ static void cleanup_work(struct work_struct *work)
>   
>   /**
>    * drm_writeback_signal_completion - Signal the completion of a writeback job
> - * @wb_connector: The writeback connector whose job is complete
> + * @connector: The drm connector whicha has the drm_writeback_connector whose
whicha -> which

With that fixed (and consistent wording across the patches):
Reviewed-by: John Harrison <John.Harrison@Igalia.com>

> + * job is complete
>    * @status: Status code to set in the writeback out_fence (0 for success)
>    *
>    * Drivers should call this to signal the completion of a previously queued
> @@ -492,10 +493,11 @@ static void cleanup_work(struct work_struct *work)
>    * See also: drm_writeback_queue_job()
>    */
>   void
> -drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector,
> +drm_writeback_signal_completion(struct drm_connector *connector,
>   				int status)
>   {
>   	unsigned long flags;
> +	struct drm_writeback_connector *wb_connector = &connector->writeback;
>   	struct drm_writeback_job *job;
>   	struct dma_fence *out_fence;
>   
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> index 0a4026f22274..977fc0337fbd 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c
> @@ -370,7 +370,7 @@ static void dpu_encoder_phys_wb_done_irq(void *arg)
>   	spin_unlock_irqrestore(phys_enc->enc_spinlock, lock_flags);
>   
>   	if (wb_enc->wb_conn)
> -		drm_writeback_signal_completion(wb_enc->wb_conn, 0);
> +		drm_writeback_signal_completion(drm_writeback_to_connector(wb_enc->wb_conn), 0);
>   
>   	/* Signal any waiting atomic commit thread */
>   	wake_up_all(&phys_enc->pending_kickoff_wq);
> @@ -431,7 +431,7 @@ static void _dpu_encoder_phys_wb_handle_wbdone_timeout(
>   	phys_enc->enable_state = DPU_ENC_ERR_NEEDS_HW_RESET;
>   
>   	if (wb_enc->wb_conn)
> -		drm_writeback_signal_completion(wb_enc->wb_conn, 0);
> +		drm_writeback_signal_completion(drm_writeback_to_connector(wb_enc->wb_conn), 0);
>   
>   	dpu_encoder_frame_done_callback(phys_enc->parent, phys_enc, frame_event);
>   }
> diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> index 5cd6c81a9710..4b0f6cd46acb 100644
> --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> @@ -251,5 +251,5 @@ void rcar_du_writeback_setup(struct rcar_du_crtc *rcrtc,
>   
>   void rcar_du_writeback_complete(struct rcar_du_crtc *rcrtc)
>   {
> -	drm_writeback_signal_completion(&rcrtc->wb_connector.writeback, 0);
> +	drm_writeback_signal_completion(&rcrtc->wb_connector, 0);
>   }
> diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
> index 46330b6f9a12..0d8579683c57 100644
> --- a/drivers/gpu/drm/vc4/vc4_txp.c
> +++ b/drivers/gpu/drm/vc4/vc4_txp.c
> @@ -505,7 +505,7 @@ static irqreturn_t vc4_txp_interrupt(int irq, void *data)
>   	 */
>   	TXP_WRITE(TXP_DST_CTRL, TXP_READ(TXP_DST_CTRL) & ~TXP_EI);
>   	vc4_crtc_handle_vblank(vc4_crtc);
> -	drm_writeback_signal_completion(&txp->connector.writeback, 0);
> +	drm_writeback_signal_completion(&txp->connector, 0);
>   
>   	return IRQ_HANDLED;
>   }
> diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c
> index 27fb6a7b55bb..83d217085ad0 100644
> --- a/drivers/gpu/drm/vkms/vkms_composer.c
> +++ b/drivers/gpu/drm/vkms/vkms_composer.c
> @@ -652,7 +652,7 @@ void vkms_composer_worker(struct work_struct *work)
>   		return;
>   
>   	if (wb_pending) {
> -		drm_writeback_signal_completion(&out->wb_connector.writeback, 0);
> +		drm_writeback_signal_completion(&out->wb_connector, 0);
>   		spin_lock_irq(&out->composer_lock);
>   		crtc_state->wb_pending = false;
>   		spin_unlock_irq(&out->composer_lock);
> diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
> index b4c11d380df0..5e8ab51c2da4 100644
> --- a/include/drm/drm_writeback.h
> +++ b/include/drm/drm_writeback.h
> @@ -100,7 +100,7 @@ void drm_writeback_queue_job(struct drm_connector *wb_connector,
>   void drm_writeback_cleanup_job(struct drm_writeback_job *job);
>   
>   void
> -drm_writeback_signal_completion(struct drm_writeback_connector *wb_connector,
> +drm_writeback_signal_completion(struct drm_connector *connector,
>   				int status);
>   
>   struct dma_fence *


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [PATCH v4 5/7] drm: writeback: Modify drm_writeback_get_out_fence helper
  2026-05-21  5:37 ` [PATCH v4 5/7] drm: writeback: Modify drm_writeback_get_out_fence helper Suraj Kandpal
@ 2026-05-21 23:35   ` John Harrison
  2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
  1 sibling, 0 replies; 23+ messages in thread
From: John Harrison @ 2026-05-21 23:35 UTC (permalink / raw)
  To: Suraj Kandpal, freedreno, dri-devel, kernel-list, amd-gfx,
	linux-kernel, intel-xe, intel-gfx
  Cc: abhinav.kumar, tzimmermann, marijn.suijten,
	laurent.pinchart+renesas, dave.stevenson, tomi.valkeinen+renesas,
	kieran.bingham+renesas, Louis Chauvet, kernel-dev

On 5/20/26 22:37, Suraj Kandpal wrote:
> drm_writeback_get_out_fence() does not itself need the parent
> drm_connector object, but update it to take drm_connector for
> consistency across the writeback interface, which is being moved
> to use the top level drm_connector and traverse down to
> drm_writeback_connector rather than passing in the lower level
> object and traversing back up.
>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>

Reviewed-by: John Harrison <John.Harrison@Igalia.com>

> ---
> v3 -> v4:
> - Update subject line for consitency (John)
> - Update commit message across commits for consitency (John)
>
>   drivers/gpu/drm/drm_atomic_uapi.c | 4 +---
>   drivers/gpu/drm/drm_writeback.c   | 5 ++---
>   include/drm/drm_writeback.h       | 2 +-
>   3 files changed, 4 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> index 7add982e3a3f..65845b096b0c 100644
> --- a/drivers/gpu/drm/drm_atomic_uapi.c
> +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> @@ -1450,7 +1450,6 @@ static int prepare_signaling(struct drm_device *dev,
>   	}
>   
>   	for_each_new_connector_in_state(state, conn, conn_state, i) {
> -		struct drm_writeback_connector *wb_conn;
>   		struct drm_out_fence_state *f;
>   		struct dma_fence *fence;
>   		s32 __user *fence_ptr;
> @@ -1472,8 +1471,7 @@ static int prepare_signaling(struct drm_device *dev,
>   		f[*num_fences].out_fence_ptr = fence_ptr;
>   		*fence_state = f;
>   
> -		wb_conn = &conn->writeback;
> -		fence = drm_writeback_get_out_fence(wb_conn);
> +		fence = drm_writeback_get_out_fence(conn);
>   		if (!fence)
>   			return -ENOMEM;
>   
> diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
> index f3b4371d4201..72e437f4394b 100644
> --- a/drivers/gpu/drm/drm_writeback.c
> +++ b/drivers/gpu/drm/drm_writeback.c
> @@ -528,11 +528,10 @@ drm_writeback_signal_completion(struct drm_connector *connector,
>   EXPORT_SYMBOL(drm_writeback_signal_completion);
>   
>   struct dma_fence *
> -drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector)
> +drm_writeback_get_out_fence(struct drm_connector *connector)
>   {
>   	struct dma_fence *fence;
> -	struct drm_connector *connector =
> -		drm_writeback_to_connector(wb_connector);
> +	struct drm_writeback_connector *wb_connector = &connector->writeback;
>   
>   	if (WARN_ON(connector->connector_type !=
>   		    DRM_MODE_CONNECTOR_WRITEBACK))
> diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
> index 5e8ab51c2da4..2afa48ea7c00 100644
> --- a/include/drm/drm_writeback.h
> +++ b/include/drm/drm_writeback.h
> @@ -104,5 +104,5 @@ drm_writeback_signal_completion(struct drm_connector *connector,
>   				int status);
>   
>   struct dma_fence *
> -drm_writeback_get_out_fence(struct drm_writeback_connector *wb_connector);
> +drm_writeback_get_out_fence(struct drm_connector *connector);
>   #endif


^ permalink raw reply	[flat|nested] 23+ messages in thread

* RE: [PATCH v4 0/7] Refactor drm_writeback_connector structure
  2026-05-21 18:56 ` [PATCH v4 0/7] Refactor drm_writeback_connector structure John Harrison
@ 2026-05-22  4:21   ` Kandpal, Suraj
  0 siblings, 0 replies; 23+ messages in thread
From: Kandpal, Suraj @ 2026-05-22  4:21 UTC (permalink / raw)
  To: John Harrison, freedreno@lists.freedesktop.org,
	dri-devel@lists.freedesktop.org, kernel-list@raspberrypi.com,
	amd-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	intel-xe@lists.freedesktop.org, intel-gfx@lists.freedesktop.org

> Subject: Re: [PATCH v4 0/7] Refactor drm_writeback_connector structure
> 
> On 5/20/26 22:37, Suraj Kandpal wrote:
> > Some drivers cannot work with the current design where the connector
> > is embedded within the drm_writeback_connector such as intel and some
> > drivers that can get it working end up adding a lot of checks all
> > around the code to check if it's a writeback conenctor or not.
> > This is due to the inheritance limitation in C.
> > This series intends to solve it by moving the drm_writeback_connector
> > within the drm_connector and remove the drm_connector base which was
> > in drm_writeback_connector. This is done in union with hdmi connector
> > within drm_connector to save memory and since drm_connector cannot be
> > both hdmi and writeback it serves is well.
> > A RFC version was floated and discussion had taken place at [1] which
> > kicked of this more cleaner series.
> > We do all other required modifications that come with these changes
> > along with addition of new function which returns the drm_connector
> > when drm_writeback_connector is present.
> > This series also contains some writeback API cleanups as a consequence
> > of writeback connector moving into drm_connector All drivers will be
> > expected to allocate the drm_connector.
> > This discussion was tiggered from [2] and sits on top of Dmitry's
> > series see [3].
> >
> > [1] https://patchwork.freedesktop.org/series/152758/
> > [2] https://patchwork.freedesktop.org/series/152106/
> > [3] https://patchwork.freedesktop.org/series/152420/
> QQ: What tree is this patch set based on? I tried to apply it locally but I get
> conflicts no matter what baseline I use. I've tried full kernel, drm-tip and drm-
> next. Dmitry's patch set, [3] above, applies fine but I get conflicts in the rcar
> and mali files when trying to apply this set.

Hmm I probably need to take his latest revision and apply my series on top of it again then send It that should resolve it.
This should be fixed by next revision.

Regards,
Suraj Kandpal 

> 
> Thanks,
> John.
> 
> >
> > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> >
> > Suraj Kandpal (7):
> >    drm: writeback: Refactor drm_writeback_connector structure
> >    drm: writeback: Modify writeback init helpers
> >    drm: writeback: Modify drm_writeback_queue_job helper
> >    drm: writeback: Modify drm_writeback_signal_completion helper
> >    drm: writeback: Modify drm_writeback_get_out_fence helper
> >    drm: writeback: Modify prepare_writeback_job helper
> >    drm: writeback: Modify cleanup_writeback_job helper
> >
> >   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 10 +--
> >   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |  2 +-
> >   .../drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c  | 12 +--
> >   .../gpu/drm/arm/display/komeda/komeda_crtc.c  |  2 +-
> >   .../gpu/drm/arm/display/komeda/komeda_kms.h   |  6 +-
> >   .../arm/display/komeda/komeda_wb_connector.c  | 11 +--
> >   drivers/gpu/drm/arm/malidp_crtc.c             |  2 +-
> >   drivers/gpu/drm/arm/malidp_drv.h              |  2 +-
> >   drivers/gpu/drm/arm/malidp_mw.c               |  7 +-
> >   drivers/gpu/drm/drm_atomic_uapi.c             |  4 +-
> >   drivers/gpu/drm/drm_writeback.c               | 50 +++++++-----
> >   .../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c   |  9 ++-
> >   drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 10 +--
> >   drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.h |  4 +-
> >   .../gpu/drm/renesas/rcar-du/rcar_du_crtc.h    |  6 +-
> >   .../drm/renesas/rcar-du/rcar_du_writeback.c   | 16 ++--
> >   drivers/gpu/drm/vc4/vc4_txp.c                 |  8 +-
> >   drivers/gpu/drm/vkms/vkms_drv.h               |  2 +-
> >   drivers/gpu/drm/vkms/vkms_writeback.c         | 15 ++--
> >   include/drm/drm_connector.h                   | 69 ++++++++++++++++-
> >   include/drm/drm_modeset_helper_vtables.h      |  4 +-
> >   include/drm/drm_writeback.h                   | 76 ++-----------------
> >   22 files changed, 164 insertions(+), 163 deletions(-)
> >


^ permalink raw reply	[flat|nested] 23+ messages in thread

* Claude review: Refactor drm_writeback_connector structure
  2026-05-21  5:37 [PATCH v4 0/7] Refactor drm_writeback_connector structure Suraj Kandpal
                   ` (7 preceding siblings ...)
  2026-05-21 18:56 ` [PATCH v4 0/7] Refactor drm_writeback_connector structure John Harrison
@ 2026-05-25 10:57 ` Claude Code Review Bot
  8 siblings, 0 replies; 23+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 10:57 UTC (permalink / raw)
  To: dri-devel-reviews

Overall Series Review

Subject: Refactor drm_writeback_connector structure
Author: Suraj Kandpal <suraj.kandpal@intel.com>
Patches: 15
Reviewed: 2026-05-25T20:57:35.484477

---

This v4 series refactors `drm_writeback_connector` by moving it from a standalone struct that *contained* a `drm_connector base` member, to instead being embedded *within* `drm_connector` itself (in a union with `drm_connector_hdmi`). This addresses a real architectural problem: drivers like Intel's that already have their own `drm_connector` subclass cannot easily embed a `drm_writeback_connector` that itself contains a `drm_connector`. The union with `hdmi` is sound since a connector cannot be both HDMI and writeback simultaneously.

The series is well-structured, splitting the refactor across logical steps: the core structural change (patch 1), then updating each helper API to take `drm_connector *` instead of `drm_writeback_connector *` (patches 2-7). Most of the mechanical conversions are correct. It has two Reviewed-by tags (Liviu Dudau, Louis Chauvet) on patch 1 and several from Dmitry Baryshkov on later patches.

However, there is **one significant bug** in patch 4 (amdgpu signal_completion change), and several minor issues across the series.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Claude review: drm: writeback: Refactor drm_writeback_connector structure
  2026-05-21  5:37 ` [PATCH v4 1/7] drm: writeback: " Suraj Kandpal
  2026-05-21 23:28   ` John Harrison
@ 2026-05-25 10:57   ` Claude Code Review Bot
  1 sibling, 0 replies; 23+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 10:57 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

This is the core patch. The structural change is sound: `drm_writeback_connector` loses its `struct drm_connector base` member and instead gets embedded inside `struct drm_connector` in a union with `hdmi`. The helper `drm_connector_to_writeback()` is replaced with the inverse `drm_writeback_to_connector()` using `container_of`.

**Issues:**

1. **Typo in doc comment** — the `@writeback` kdoc says "valriables" instead of "variables":
   ```c
   /**
    * @writeback: Writeback related valriables.
    */
   struct drm_writeback_connector writeback;
   ```

2. **`drm_writeback_to_connector()` is only safe if the writeback is actually embedded in a `drm_connector`** — the `container_of` relies on the `writeback` field being part of `drm_connector`. This is now always true by construction, but there's no runtime assertion. The existing `WARN_ON` in `drm_writeback_get_out_fence` checking `connector_type` is good defensive practice; consider whether `drm_writeback_to_connector()` itself should have a similar check.

3. **Inconsistency in `dm_set_writeback`** — the amdgpu code changes `drm_connector_to_writeback(connector)` to a direct `&connector->writeback` access:
   ```c
   -	struct drm_writeback_connector *wb_conn = drm_connector_to_writeback(connector);
   +	struct drm_writeback_connector *wb_conn = &connector->writeback;
   ```
   This is fine functionally, but inconsistent with other places in the same patch that use the new `drm_writeback_to_connector()` helper. Since the helper now goes the other direction (wb -> connector), this is correct but could use `&connector->writeback` consistently throughout.

4. **malidp_hw.c changes** — This file is modified in patch 1 (changing `drm_writeback_signal_completion` calls from `&malidp->mw_connector` to `&malidp->mw_connector.writeback`) and then again in patch 4 (changing them back from `.writeback` to taking the connector directly). This creates a transient churn. Consider squashing or reordering to avoid changing these lines twice.

5. **vkms_writeback.c `vkms_wb_cleanup_job`** — Uses a raw `container_of` instead of `drm_writeback_to_connector()`:
   ```c
   struct drm_connector *connector = container_of(wb_conn,
                                                   struct drm_connector,
                                                   writeback);
   ```
   This is functionally identical to `drm_writeback_to_connector()` but inconsistent. Since patch 7 removes this entirely, it's a transient issue but still worth noting for bisectability.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Claude review: drm: writeback: Modify writeback init helpers
  2026-05-21  5:37 ` [PATCH v4 2/7] drm: writeback: Modify writeback init helpers Suraj Kandpal
  2026-05-21 23:30   ` John Harrison
@ 2026-05-25 10:57   ` Claude Code Review Bot
  1 sibling, 0 replies; 23+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 10:57 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

Changes `drm_writeback_connector_init()` and `drmm_writeback_connector_init()` to take `struct drm_connector *` instead of `struct drm_writeback_connector *`. Clean and correct. All driver callsites are updated consistently.

**Minor issues:**

1. **Comment says "Drm connector"** — kernel convention is lowercase "DRM":
   ```c
   * @connector: Drm connector which contains the writeback connector to initialize
   ```
   Should be `DRM connector` or just `drm_connector`.

2. The `__drm_writeback_connector_init()` internal helper is *not* updated in this patch — it still takes `drm_writeback_connector *`. This is fine since it's static and called from the now-updated public wrappers, but it creates an inconsistency in the internal API. A follow-up could clean this up.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Claude review: drm: writeback: Modify drm_writeback_queue_job helper
  2026-05-21  5:37 ` [PATCH v4 3/7] drm: writeback: Modify drm_writeback_queue_job helper Suraj Kandpal
  2026-05-21 23:31   ` John Harrison
@ 2026-05-25 10:57   ` Claude Code Review Bot
  1 sibling, 0 replies; 23+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 10:57 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

Changes `drm_writeback_queue_job()` to take `struct drm_connector *`. Straightforward and correct.

**Minor issue:**

1. **Double space in doc comment**:
   ```c
   * @connector: The drm connector  which contains the writeback connector to
   ```
   Extra space between "connector" and "which".

2. **Header declaration parameter name mismatch** — the header declares the parameter as `wb_connector` but it's now a `drm_connector *`:
   ```c
   void drm_writeback_queue_job(struct drm_connector *wb_connector,
   ```
   This should be just `connector` to match the definition. The parameter name `wb_connector` for a `drm_connector *` is confusing.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Claude review: drm: writeback: Modify drm_writeback_signal_completion helper
  2026-05-21  5:37 ` [PATCH v4 4/7] drm: writeback: Modify drm_writeback_signal_completion helper Suraj Kandpal
  2026-05-21 23:31   ` John Harrison
@ 2026-05-25 10:57   ` Claude Code Review Bot
  1 sibling, 0 replies; 23+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 10:57 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

Changes `drm_writeback_signal_completion()` to take `struct drm_connector *`.

**BUG — amdgpu `dm_crtc_high_irq` uses wrong field:**

```c
-			drm_writeback_signal_completion(acrtc->wb_conn, 0);
+			drm_writeback_signal_completion(acrtc->connector, 0);
```

`acrtc->connector` is a **pre-existing, unrelated field** on `struct amdgpu_crtc` — it's the general `struct drm_connector *` for the CRTC (line 502 of `amdgpu_mode.h`), which points to the display connector, NOT the writeback connector. `acrtc->wb_conn` is a `struct drm_writeback_connector *` (line 513). The correct conversion should be:

```c
drm_writeback_signal_completion(drm_writeback_to_connector(acrtc->wb_conn), 0);
```

This bug would cause writeback completion to be signalled on the **wrong connector**, potentially corrupting the display connector's fence state or crashing due to the display connector not having writeback data initialized. This would likely manifest as a NULL pointer dereference or list corruption in the job_queue when called from an IRQ handler, making it a serious bug.

Note that the surrounding code in `dm_crtc_high_irq` (lines 664-689) still accesses `acrtc->wb_conn->job_lock` and `acrtc->wb_conn->job_queue` directly, which are `drm_writeback_connector` fields — so `wb_conn` is still needed. The patch should also update those accesses if the intent is to go through `drm_connector`, or leave the signal_completion call using `drm_writeback_to_connector(acrtc->wb_conn)`.

**Minor issue:**

1. **Typo in doc comment** — "whicha" should be "which":
   ```c
   * @connector: The drm connector whicha has the drm_writeback_connector whose
   ```

2. The MSM dpu code correctly uses `drm_writeback_to_connector(wb_enc->wb_conn)`:
   ```c
   drm_writeback_signal_completion(drm_writeback_to_connector(wb_enc->wb_conn), 0);
   ```
   This is the right pattern and highlights that the amdgpu change is wrong.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Claude review: drm: writeback: Modify drm_writeback_get_out_fence helper
  2026-05-21  5:37 ` [PATCH v4 5/7] drm: writeback: Modify drm_writeback_get_out_fence helper Suraj Kandpal
  2026-05-21 23:35   ` John Harrison
@ 2026-05-25 10:57   ` Claude Code Review Bot
  1 sibling, 0 replies; 23+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 10:57 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

Changes `drm_writeback_get_out_fence()` to take `struct drm_connector *`. Clean and correct. The callsite in `drm_atomic_uapi.c` is simplified nicely.

No issues.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Claude review: drm: writeback: Modify prepare_writeback_job helper
  2026-05-21  5:37 ` [PATCH v4 6/7] drm: writeback: Modify prepare_writeback_job helper Suraj Kandpal
@ 2026-05-25 10:57   ` Claude Code Review Bot
  0 siblings, 0 replies; 23+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 10:57 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

Changes the `prepare_writeback_job` vtable hook from taking `drm_writeback_connector *` to `drm_connector *`. Correct and clean. All driver implementations are updated.

No issues.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Claude review: drm: writeback: Modify cleanup_writeback_job helper
  2026-05-21  5:37 ` [PATCH v4 7/7] drm: writeback: Modify cleanup_writeback_job helper Suraj Kandpal
@ 2026-05-25 10:57   ` Claude Code Review Bot
  0 siblings, 0 replies; 23+ messages in thread
From: Claude Code Review Bot @ 2026-05-25 10:57 UTC (permalink / raw)
  To: dri-devel-reviews

Patch Review

Changes the `cleanup_writeback_job` vtable hook from taking `drm_writeback_connector *` to `drm_connector *`. Correct and clean. The vkms cleanup nicely removes the manual `container_of` that was added in patch 1.

No issues.

---

**Summary:** The series direction is correct and the overall design is sound. The **critical issue** is the bug in patch 4 where `acrtc->connector` is used instead of `drm_writeback_to_connector(acrtc->wb_conn)` in `dm_crtc_high_irq` — this would pass the wrong connector entirely. There are also a handful of typos in doc comments ("valriables", "whicha", "consitency" in changelogs, double-space) and one parameter naming inconsistency in the header for `drm_writeback_queue_job`.

---
Generated by Claude Code Patch Reviewer

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2026-05-25 10:57 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-21  5:37 [PATCH v4 0/7] Refactor drm_writeback_connector structure Suraj Kandpal
2026-05-21  5:37 ` [PATCH v4 1/7] drm: writeback: " Suraj Kandpal
2026-05-21 23:28   ` John Harrison
2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
2026-05-21  5:37 ` [PATCH v4 2/7] drm: writeback: Modify writeback init helpers Suraj Kandpal
2026-05-21 23:30   ` John Harrison
2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
2026-05-21  5:37 ` [PATCH v4 3/7] drm: writeback: Modify drm_writeback_queue_job helper Suraj Kandpal
2026-05-21 23:31   ` John Harrison
2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
2026-05-21  5:37 ` [PATCH v4 4/7] drm: writeback: Modify drm_writeback_signal_completion helper Suraj Kandpal
2026-05-21 23:31   ` John Harrison
2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
2026-05-21  5:37 ` [PATCH v4 5/7] drm: writeback: Modify drm_writeback_get_out_fence helper Suraj Kandpal
2026-05-21 23:35   ` John Harrison
2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
2026-05-21  5:37 ` [PATCH v4 6/7] drm: writeback: Modify prepare_writeback_job helper Suraj Kandpal
2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
2026-05-21  5:37 ` [PATCH v4 7/7] drm: writeback: Modify cleanup_writeback_job helper Suraj Kandpal
2026-05-25 10:57   ` Claude review: " Claude Code Review Bot
2026-05-21 18:56 ` [PATCH v4 0/7] Refactor drm_writeback_connector structure John Harrison
2026-05-22  4:21   ` Kandpal, Suraj
2026-05-25 10:57 ` Claude review: " Claude Code Review Bot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox