* [PATCH v7 0/8] Refactor drm_writeback_connector structure
@ 2026-11-10 6:16 Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 DO NOT REVIEW 1/8] drm: writeback: drop excess connector initialization functions Suraj Kandpal
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: Suraj Kandpal @ 2026-11-10 6:16 UTC (permalink / raw)
To: dri-devel, amd-gfx, freedreno, linux-arm-msm, linux-renesas-soc,
intel-gfx, intel-xe, linux-kernel
Cc: dmitry.baryshkov, John.Harrison, kernel-dev, alex.hung,
liviu.dudau, louis.chauvet, maarten.lankhorst, mripard,
tzimmermann, airlied, simona, laurent.pinchart+renesas,
tomi.valkeinen+renesas, kieran.bingham+renesas, dave.stevenson,
mcanal, kernel-list, uma.shankar, arun.r.murthy, 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>
Dmitry Baryshkov (1):
drm: writeback: drop excess connector initialization functions
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 | 8 +-
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 3 +-
.../display/amdgpu_dm/amdgpu_dm_connector.c | 4 +-
.../drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c | 37 ++--
.../drm/amd/display/amdgpu_dm/amdgpu_dm_wb.h | 4 +-
.../tests/amdgpu_dm_connector_test.c | 6 +-
.../display/amdgpu_dm/tests/amdgpu_dm_test.c | 2 +-
.../amdgpu_dm/tests/amdgpu_dm_wb_test.c | 10 +-
.../gpu/drm/arm/display/komeda/komeda_crtc.c | 2 +-
.../gpu/drm/arm/display/komeda/komeda_kms.h | 9 +-
.../arm/display/komeda/komeda_wb_connector.c | 37 ++--
drivers/gpu/drm/arm/malidp_crtc.c | 2 +-
drivers/gpu/drm/arm/malidp_drv.h | 3 +-
drivers/gpu/drm/arm/malidp_mw.c | 32 ++-
drivers/gpu/drm/drm_atomic_uapi.c | 4 +-
drivers/gpu/drm/drm_connector.c | 3 +
drivers/gpu/drm/drm_crtc_internal.h | 3 +
drivers/gpu/drm/drm_writeback.c | 193 ++++++------------
.../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 | 8 +-
.../drm/renesas/rcar-du/rcar_du_writeback.c | 44 ++--
drivers/gpu/drm/vc4/vc4_txp.c | 16 +-
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 | 98 +--------
29 files changed, 307 insertions(+), 334 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v7 DO NOT REVIEW 1/8] drm: writeback: drop excess connector initialization functions
2026-11-10 6:16 [PATCH v7 0/8] Refactor drm_writeback_connector structure Suraj Kandpal
@ 2026-11-10 6:16 ` Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 2/8] drm: writeback: Refactor drm_writeback_connector structure Suraj Kandpal
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Suraj Kandpal @ 2026-11-10 6:16 UTC (permalink / raw)
To: dri-devel, amd-gfx, freedreno, linux-arm-msm, linux-renesas-soc,
intel-gfx, intel-xe, linux-kernel
Cc: dmitry.baryshkov, John.Harrison, kernel-dev, alex.hung,
liviu.dudau, louis.chauvet, maarten.lankhorst, mripard,
tzimmermann, airlied, simona, laurent.pinchart+renesas,
tomi.valkeinen+renesas, kieran.bingham+renesas, dave.stevenson,
mcanal, kernel-list, uma.shankar, arun.r.murthy
From: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Now as all drivers have been converted to
drm_writeback_connector_init_with_encoder(), drop
drm_writeback_connector_init() and drm_writeback_connector::encoder
field, they are unused now.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +-
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 1 +
.../drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c | 27 +++-
.../display/amdgpu_dm/tests/amdgpu_dm_test.c | 4 +-
.../amdgpu_dm/tests/amdgpu_dm_wb_test.c | 4 +-
.../gpu/drm/arm/display/komeda/komeda_kms.h | 3 +
.../arm/display/komeda/komeda_wb_connector.c | 24 ++-
drivers/gpu/drm/arm/malidp_drv.h | 1 +
drivers/gpu/drm/arm/malidp_mw.c | 25 ++-
drivers/gpu/drm/drm_connector.c | 3 +
drivers/gpu/drm/drm_crtc_internal.h | 3 +
drivers/gpu/drm/drm_writeback.c | 147 ++++--------------
.../gpu/drm/renesas/rcar-du/rcar_du_crtc.h | 2 +
.../drm/renesas/rcar-du/rcar_du_writeback.c | 29 +++-
drivers/gpu/drm/vc4/vc4_txp.c | 8 +-
include/drm/drm_writeback.h | 22 +--
16 files changed, 140 insertions(+), 165 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 94d45e5d2a3b..12bc10f852e2 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4830,7 +4830,7 @@ dm_set_writeback(struct amdgpu_display_manager *dm,
goto cleanup;
}
- acrtc = to_amdgpu_crtc(wb_conn->encoder.crtc);
+ acrtc = to_amdgpu_crtc(to_amdgpu_dm_wb_connector(wb_conn)->encoder.crtc);
if (!acrtc) {
drm_err(adev_to_drm(adev), "no amdgpu_crtc found\n");
goto cleanup;
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 6cd3f04e7701..aa838a9367d8 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -946,6 +946,7 @@ static inline void amdgpu_dm_set_mst_status(uint8_t *status,
struct amdgpu_dm_wb_connector {
struct drm_writeback_connector base;
+ struct drm_encoder encoder;
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 39b7b3e49f6b..dde02b2b018b 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
@@ -218,6 +218,10 @@ STATIC_IFN_KUNIT void amdgpu_dm_wb_cleanup_job(struct drm_writeback_connector *c
}
EXPORT_IF_KUNIT(amdgpu_dm_wb_cleanup_job);
+static const struct drm_encoder_funcs amdgpu_dm_wb_encoder_funcs = {
+ .destroy = drm_encoder_cleanup,
+};
+
static const struct drm_encoder_helper_funcs amdgpu_dm_wb_encoder_helper_funcs = {
.atomic_check = amdgpu_dm_wb_encoder_atomic_check,
};
@@ -247,17 +251,26 @@ int amdgpu_dm_wb_connector_init(struct amdgpu_display_manager *dm,
wbcon->link = link;
+ drm_encoder_helper_add(&wbcon->encoder, &amdgpu_dm_wb_encoder_helper_funcs);
+ wbcon->encoder.possible_crtcs = amdgpu_dm_get_encoder_crtc_mask(dm->adev);
+
+ res = drm_encoder_init(&dm->adev->ddev, &wbcon->encoder,
+ &amdgpu_dm_wb_encoder_funcs,
+ DRM_MODE_ENCODER_VIRTUAL, NULL);
+ if (res)
+ return res;
+
drm_connector_helper_add(&wbcon->base.base, &amdgpu_dm_wb_conn_helper_funcs);
res = drm_writeback_connector_init(&dm->adev->ddev, &wbcon->base,
- &amdgpu_dm_wb_connector_funcs,
- &amdgpu_dm_wb_encoder_helper_funcs,
- amdgpu_dm_wb_formats,
- ARRAY_SIZE(amdgpu_dm_wb_formats),
- amdgpu_dm_get_encoder_crtc_mask(dm->adev));
-
- if (res)
+ &amdgpu_dm_wb_connector_funcs,
+ &wbcon->encoder,
+ amdgpu_dm_wb_formats,
+ ARRAY_SIZE(amdgpu_dm_wb_formats));
+ if (res) {
+ drm_encoder_cleanup(&wbcon->encoder);
return res;
+ }
/*
* Some of the properties below require access to state, like bpc.
* Allocate some default initial connector state with our reset helper.
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c
index c375ee68778b..61b72eba4c31 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c
@@ -4567,7 +4567,7 @@ static void dm_test_clear_writeback_removes_stream(struct kunit *test)
static void dm_test_set_writeback_no_pipe(struct kunit *test)
{
struct amdgpu_device *adev = dm_kunit_alloc_adev(test);
- struct drm_writeback_connector *wb_conn;
+ struct amdgpu_dm_wb_connector *wb_conn;
struct drm_connector_state *conn_state;
struct drm_writeback_job *job;
struct amdgpu_framebuffer *afb;
@@ -4597,7 +4597,7 @@ static void dm_test_set_writeback_no_pipe(struct kunit *test)
conn_state->writeback_job = job;
crtc_state->stream = dm_kunit_alloc_stream(test, NULL);
- dm_set_writeback(&adev->dm, crtc_state, &wb_conn->base, conn_state);
+ dm_set_writeback(&adev->dm, crtc_state, &wb_conn->base.base, conn_state);
KUNIT_EXPECT_NULL(test, acrtc->wb_conn);
KUNIT_EXPECT_FALSE(test, acrtc->wb_pending);
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
index 914d41290977..8ba4299578ea 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
@@ -511,8 +511,8 @@ static void dm_test_wb_connector_init_success(struct kunit *test)
KUNIT_EXPECT_TRUE(test, wbcon->base.base.funcs != NULL);
KUNIT_EXPECT_TRUE(test, wbcon->base.base.helper_private != NULL);
KUNIT_EXPECT_TRUE(test, wbcon->base.base.state != NULL);
- KUNIT_EXPECT_TRUE(test, wbcon->base.encoder.funcs != NULL);
- KUNIT_EXPECT_EQ(test, wbcon->base.encoder.possible_crtcs, 0x1);
+ KUNIT_EXPECT_TRUE(test, wbcon->encoder.funcs != NULL);
+ KUNIT_EXPECT_EQ(test, wbcon->encoder.possible_crtcs, 0x1);
}
/* Tests for amdgpu_dm_wb_prepare_job / amdgpu_dm_wb_cleanup_job */
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.h b/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
index 83e61c4080c2..4d41681a834b 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
@@ -56,6 +56,9 @@ struct komeda_wb_connector {
/** @base: &drm_writeback_connector */
struct drm_writeback_connector base;
+ /** @encoder: writeback encoder */
+ struct drm_encoder encoder;
+
/** @wb_layer: represents associated writeback pipeline of komeda */
struct komeda_layer *wb_layer;
};
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 f394971c0edb..ea4589b00ee0 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
@@ -127,6 +127,10 @@ static void komeda_wb_connector_destroy(struct drm_connector *connector)
kfree(to_kconn(to_wb_conn(connector)));
}
+static const struct drm_encoder_funcs komeda_wb_encoder_funcs = {
+ .destroy = drm_encoder_cleanup,
+};
+
static const struct drm_connector_funcs komeda_wb_connector_funcs = {
.atomic_create_state = drm_atomic_helper_connector_create_state,
.detect = komeda_wb_connector_detect,
@@ -170,19 +174,29 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
return -ENOMEM;
}
+ wb_encoder = &kwb_conn->encoder;
+ drm_encoder_helper_add(wb_encoder, &komeda_wb_encoder_helper_funcs);
+ wb_encoder->possible_crtcs = crtc_mask;
+
+ err = drm_encoder_init(&kms->base, wb_encoder, &komeda_wb_encoder_funcs,
+ DRM_MODE_ENCODER_VIRTUAL, NULL);
+ if (err) {
+ komeda_put_fourcc_list(formats);
+ kfree(kwb_conn);
+ return err;
+ }
+
err = drm_writeback_connector_init(&kms->base, wb_conn,
&komeda_wb_connector_funcs,
- &komeda_wb_encoder_helper_funcs,
- formats, n_formats,
- BIT(drm_crtc_index(&kcrtc->base)));
+ wb_encoder,
+ formats, n_formats);
komeda_put_fourcc_list(formats);
if (err) {
+ drm_encoder_cleanup(wb_encoder);
kfree(kwb_conn);
return err;
}
- wb_encoder = &wb_conn->encoder;
-
/*
* The writeback connector is associated with a single CRTC. Make its
* encoder clone-compatible only with encoders that can drive that CRTC.
diff --git a/drivers/gpu/drm/arm/malidp_drv.h b/drivers/gpu/drm/arm/malidp_drv.h
index bc0387876dea..64610f2d23e2 100644
--- a/drivers/gpu/drm/arm/malidp_drv.h
+++ b/drivers/gpu/drm/arm/malidp_drv.h
@@ -33,6 +33,7 @@ struct malidp_drm {
struct malidp_hw_device *dev;
struct drm_crtc crtc;
struct drm_writeback_connector mw_connector;
+ struct drm_encoder mw_encoder;
wait_queue_head_t wq;
struct drm_pending_vblank_event *event;
atomic_t config_valid;
diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
index 8d1e1e3a6deb..3669d10540bf 100644
--- a/drivers/gpu/drm/arm/malidp_mw.c
+++ b/drivers/gpu/drm/arm/malidp_mw.c
@@ -110,6 +110,10 @@ malidp_mw_connector_duplicate_state(struct drm_connector *connector)
return &mw_state->base;
}
+static const struct drm_encoder_funcs malidp_mw_encoder_funcs = {
+ .destroy = drm_encoder_cleanup,
+};
+
static const struct drm_connector_funcs malidp_mw_connector_funcs = {
.atomic_create_state = malidp_mw_connector_create_state,
.detect = malidp_mw_connector_detect,
@@ -223,14 +227,27 @@ int malidp_mw_connector_init(struct drm_device *drm)
if (!formats)
return -ENOMEM;
+ drm_encoder_helper_add(&malidp->mw_encoder,
+ &malidp_mw_encoder_helper_funcs);
+ malidp->mw_encoder.possible_crtcs = drm_crtc_mask(&malidp->crtc);
+
+ ret = drm_encoder_init(drm, &malidp->mw_encoder,
+ &malidp_mw_encoder_funcs,
+ DRM_MODE_ENCODER_VIRTUAL, NULL);
+ if (ret) {
+ kfree(formats);
+ return ret;
+ }
+
ret = drm_writeback_connector_init(drm, &malidp->mw_connector,
&malidp_mw_connector_funcs,
- &malidp_mw_encoder_helper_funcs,
- formats, n_formats,
- 1 << drm_crtc_index(&malidp->crtc));
+ &malidp->mw_encoder,
+ formats, n_formats);
kfree(formats);
- if (ret)
+ if (ret) {
+ drm_encoder_cleanup(&malidp->mw_encoder);
return ret;
+ }
return 0;
}
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index d66188521881..888bb1f78d2d 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -921,6 +921,9 @@ void drm_connector_cleanup(struct drm_connector *connector)
if (connector->hdmi.scdc_work_initialized)
cancel_delayed_work_sync(&connector->hdmi.scdc_work);
+ if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
+ drm_writeback_connector_cleanup(connector);
+
platform_device_unregister(connector->hdmi_audio.codec_pdev);
if (connector->privacy_screen) {
diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h
index 3492787c3697..f60216adcd31 100644
--- a/drivers/gpu/drm/drm_crtc_internal.h
+++ b/drivers/gpu/drm/drm_crtc_internal.h
@@ -329,4 +329,7 @@ static inline void drm_panic_unregister(struct drm_device *dev) {}
static inline void drm_panic_init(void) {}
#endif
+/* drm_writeback.c */
+void drm_writeback_connector_cleanup(struct drm_connector *connector);
+
#endif /* __DRM_CRTC_INTERNAL_H__ */
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index b4a002e6d043..0c5d2fbe7a7c 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -16,11 +16,12 @@
#include <drm/drm_device.h>
#include <drm/drm_drv.h>
#include <drm/drm_framebuffer.h>
-#include <drm/drm_managed.h>
#include <drm/drm_modeset_helper_vtables.h>
#include <drm/drm_property.h>
#include <drm/drm_writeback.h>
+#include "drm_crtc_internal.h"
+
/**
* DOC: overview
*
@@ -148,80 +149,8 @@ static int create_writeback_properties(struct drm_device *dev)
return 0;
}
-static const struct drm_encoder_funcs drm_writeback_encoder_funcs = {
- .destroy = drm_encoder_cleanup,
-};
-
/**
- * drm_writeback_connector_init - Initialize a writeback connector and its properties
- * @dev: DRM device
- * @wb_connector: Writeback connector to initialize
- * @con_funcs: Connector funcs vtable
- * @enc_helper_funcs: Encoder helper funcs vtable to be used by the internal encoder
- * @formats: Array of supported pixel formats for the writeback engine
- * @n_formats: Length of the formats array
- * @possible_crtcs: possible crtcs for the internal writeback encoder
- *
- * This function creates the writeback-connector-specific properties if they
- * have not been already created, initializes the connector as
- * type DRM_MODE_CONNECTOR_WRITEBACK, and correctly initializes the property
- * values. It will also create an internal encoder associated with the
- * drm_writeback_connector and set it to use the @enc_helper_funcs vtable for
- * the encoder helper.
- *
- * Drivers should always use this function instead of drm_connector_init() to
- * set up writeback connectors.
- *
- * Returns: 0 on success, or a negative error code
- */
-int drm_writeback_connector_init(struct drm_device *dev,
- struct drm_writeback_connector *wb_connector,
- const struct drm_connector_funcs *con_funcs,
- const struct drm_encoder_helper_funcs *enc_helper_funcs,
- const u32 *formats, int n_formats,
- u32 possible_crtcs)
-{
- int ret = 0;
-
- drm_encoder_helper_add(&wb_connector->encoder, enc_helper_funcs);
-
- wb_connector->encoder.possible_crtcs = possible_crtcs;
-
- ret = drm_encoder_init(dev, &wb_connector->encoder,
- &drm_writeback_encoder_funcs,
- DRM_MODE_ENCODER_VIRTUAL, NULL);
- if (ret)
- return ret;
-
- ret = drm_writeback_connector_init_with_encoder(dev, wb_connector, &wb_connector->encoder,
- con_funcs, formats, n_formats);
-
- if (ret)
- drm_encoder_cleanup(&wb_connector->encoder);
-
- return ret;
-}
-EXPORT_SYMBOL(drm_writeback_connector_init);
-
-static void delete_writeback_properties(struct drm_device *dev)
-{
- if (dev->mode_config.writeback_pixel_formats_property) {
- drm_property_destroy(dev, dev->mode_config.writeback_pixel_formats_property);
- dev->mode_config.writeback_pixel_formats_property = NULL;
- }
- if (dev->mode_config.writeback_out_fence_ptr_property) {
- drm_property_destroy(dev, dev->mode_config.writeback_out_fence_ptr_property);
- dev->mode_config.writeback_out_fence_ptr_property = NULL;
- }
- if (dev->mode_config.writeback_fb_id_property) {
- drm_property_destroy(dev, dev->mode_config.writeback_fb_id_property);
- dev->mode_config.writeback_fb_id_property = NULL;
- }
-}
-
-/**
- * __drm_writeback_connector_init - Initialize a writeback connector with
- * a custom encoder
+ * __drm_writeback_connector_init - Initialize a writeback connector
*
* @dev: DRM device
* @wb_connector: Writeback connector to initialize
@@ -254,20 +183,18 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
int ret = create_writeback_properties(dev);
if (ret != 0)
- goto failed_properties;
+ return ret;
connector->interlace_allowed = 0;
ret = drm_connector_attach_encoder(connector, enc);
if (ret)
- goto failed_properties;
+ return ret;
blob = drm_property_create_blob(dev, n_formats * sizeof(*formats),
formats);
- if (IS_ERR(blob)) {
- ret = PTR_ERR(blob);
- goto failed_properties;
- }
+ if (IS_ERR(blob))
+ return PTR_ERR(blob);
INIT_LIST_HEAD(&wb_connector->job_queue);
spin_lock_init(&wb_connector->job_lock);
@@ -290,14 +217,10 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
wb_connector->pixel_formats_blob_ptr = blob;
return 0;
-failed_properties:
- delete_writeback_properties(dev);
- return ret;
}
/**
- * drm_writeback_connector_init_with_encoder - Initialize a writeback connector with
- * a custom encoder
+ * drm_writeback_connector_init - Initialize a writeback connector
*
* @dev: DRM device
* @wb_connector: Writeback connector to initialize
@@ -324,11 +247,11 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
*
* Returns: 0 on success, or a negative error code
*/
-int drm_writeback_connector_init_with_encoder(struct drm_device *dev,
- struct drm_writeback_connector *wb_connector,
- struct drm_encoder *enc,
- const struct drm_connector_funcs *con_funcs,
- const u32 *formats, int n_formats)
+int drm_writeback_connector_init(struct drm_device *dev,
+ struct drm_writeback_connector *wb_connector,
+ const struct drm_connector_funcs *con_funcs,
+ struct drm_encoder *enc,
+ const u32 *formats, int n_formats)
{
struct drm_connector *connector = &wb_connector->base;
int ret;
@@ -345,26 +268,31 @@ int drm_writeback_connector_init_with_encoder(struct drm_device *dev,
return ret;
}
-EXPORT_SYMBOL(drm_writeback_connector_init_with_encoder);
+EXPORT_SYMBOL(drm_writeback_connector_init);
/**
* drm_writeback_connector_cleanup - Cleanup the writeback connector
- * @dev: DRM device
- * @data: Pointer to the writeback connector to clean up
+ * @connector: Writeback connector to clean up
*
- * This will decrement the reference counter of blobs and destroy properties. It
- * will also clean the remaining jobs in this writeback connector. Caution: This helper will not
+ * This will decrement the reference counter of blobs. It will also clean the
+ * remaining jobs in this writeback connector. Caution: This helper will not
* clean up the attached encoder and the drm_connector.
+ *
+ * Called from drm_connector_cleanup() for all writeback connectors.
*/
-static void drm_writeback_connector_cleanup(struct drm_device *dev,
- void *data)
+void drm_writeback_connector_cleanup(struct drm_connector *connector)
{
- unsigned long flags;
+ struct drm_writeback_connector *wb_connector =
+ drm_connector_to_writeback(connector);
struct drm_writeback_job *pos, *n;
- struct drm_writeback_connector *wb_connector = data;
+ unsigned long flags;
+
+ /* __drm_writeback_connector_init() has failed */
+ if (!wb_connector->pixel_formats_blob_ptr)
+ return;
- delete_writeback_properties(dev);
drm_property_blob_put(wb_connector->pixel_formats_blob_ptr);
+ wb_connector->pixel_formats_blob_ptr = NULL;
spin_lock_irqsave(&wb_connector->job_lock, flags);
list_for_each_entry_safe(pos, n, &wb_connector->job_queue, list_entry) {
@@ -375,8 +303,7 @@ static void drm_writeback_connector_cleanup(struct drm_device *dev,
}
/**
- * drmm_writeback_connector_init - Initialize a writeback connector with
- * a custom encoder
+ * drmm_writeback_connector_init - Initialize a writeback connector
*
* @dev: DRM device
* @wb_connector: Writeback connector to initialize
@@ -385,7 +312,8 @@ static void drm_writeback_connector_cleanup(struct drm_device *dev,
* @formats: Array of supported pixel formats for the writeback engine
* @n_formats: Length of the formats array
*
- * This function initialize a writeback connector and register its cleanup.
+ * This function initializes a writeback connector. Cleanup is automatically
+ * handled with a call to drm_connector_cleanup() in a DRM-managed action.
*
* This function creates the writeback-connector-specific properties if they
* have not been already created, initializes the connector as
@@ -408,17 +336,8 @@ int drmm_writeback_connector_init(struct drm_device *dev,
if (ret)
return ret;
- ret = __drm_writeback_connector_init(dev, wb_connector, enc, formats,
- n_formats);
- if (ret)
- return ret;
-
- ret = drmm_add_action_or_reset(dev, drm_writeback_connector_cleanup,
- wb_connector);
- if (ret)
- return ret;
-
- return 0;
+ return __drm_writeback_connector_init(dev, wb_connector, enc, formats,
+ n_formats);
}
EXPORT_SYMBOL(drmm_writeback_connector_init);
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..d8b1dcab8dea 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.h
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_crtc.h
@@ -44,6 +44,7 @@ struct rcar_du_vsp;
* @vsp: VSP feeding video to this CRTC
* @vsp_pipe: index of the VSP pipeline feeding video to this CRTC
* @writeback: the writeback connector
+ * @encoder: the writeback encoder
*/
struct rcar_du_crtc {
struct drm_crtc crtc;
@@ -74,6 +75,7 @@ struct rcar_du_crtc {
unsigned int sources_count;
struct drm_writeback_connector writeback;
+ struct drm_encoder encoder;
};
#define to_rcar_crtc(c) container_of(c, struct rcar_du_crtc, crtc)
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 0a3108965591..a88408124758 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
@@ -172,6 +172,10 @@ static int rcar_du_wb_enc_atomic_check(struct drm_encoder *encoder,
return 0;
}
+static const struct drm_encoder_funcs rcar_du_wb_enc_funcs = {
+ .destroy = drm_encoder_cleanup,
+};
+
static const struct drm_encoder_helper_funcs rcar_du_wb_enc_helper_funcs = {
.atomic_check = rcar_du_wb_enc_atomic_check,
};
@@ -199,16 +203,29 @@ 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_encoder *encoder = &rcrtc->encoder;
+ int ret;
+
+ drm_encoder_helper_add(encoder, &rcar_du_wb_enc_helper_funcs);
+ encoder->possible_crtcs = drm_crtc_mask(&rcrtc->crtc);
+
+ ret = drm_encoder_init(&rcdu->ddev, encoder, &rcar_du_wb_enc_funcs,
+ DRM_MODE_ENCODER_VIRTUAL, NULL);
+ if (ret)
+ return ret;
drm_connector_helper_add(&wb_conn->base,
&rcar_du_wb_conn_helper_funcs);
- return drm_writeback_connector_init(&rcdu->ddev, wb_conn,
- &rcar_du_wb_conn_funcs,
- &rcar_du_wb_enc_helper_funcs,
- writeback_formats,
- ARRAY_SIZE(writeback_formats),
- 1 << drm_crtc_index(&rcrtc->crtc));
+ ret = drm_writeback_connector_init(&rcdu->ddev, wb_conn,
+ &rcar_du_wb_conn_funcs,
+ encoder,
+ writeback_formats,
+ ARRAY_SIZE(writeback_formats));
+ if (ret)
+ drm_encoder_cleanup(encoder);
+
+ return ret;
}
void rcar_du_writeback_setup(struct rcar_du_crtc *rcrtc,
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index 642953cba25f..6ffc54d23d48 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -601,10 +601,10 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data)
drm_connector_helper_add(&txp->connector.base,
&vc4_txp_connector_helper_funcs);
- ret = drm_writeback_connector_init_with_encoder(drm, &txp->connector,
- encoder,
- &vc4_txp_connector_funcs,
- drm_fmts, ARRAY_SIZE(drm_fmts));
+ ret = drm_writeback_connector_init(drm, &txp->connector,
+ &vc4_txp_connector_funcs,
+ encoder,
+ drm_fmts, ARRAY_SIZE(drm_fmts));
if (ret)
return ret;
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index c380a7b8f55a..958466a05e60 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -24,17 +24,6 @@ struct drm_writeback_connector {
*/
struct drm_connector base;
- /**
- * @encoder: Internal encoder used by the connector to fulfill
- * the DRM framework requirements. The users of the
- * @drm_writeback_connector control the behaviour of the @encoder
- * by passing the @enc_funcs parameter to drm_writeback_connector_init()
- * function.
- * For users of drm_writeback_connector_init_with_encoder(), this field
- * is not valid as the encoder is managed within their drivers.
- */
- struct drm_encoder encoder;
-
/**
* @pixel_formats_blob_ptr:
*
@@ -151,15 +140,8 @@ drm_connector_to_writeback(struct drm_connector *connector)
int drm_writeback_connector_init(struct drm_device *dev,
struct drm_writeback_connector *wb_connector,
const struct drm_connector_funcs *con_funcs,
- const struct drm_encoder_helper_funcs *enc_helper_funcs,
- const u32 *formats, int n_formats,
- u32 possible_crtcs);
-
-int drm_writeback_connector_init_with_encoder(struct drm_device *dev,
- struct drm_writeback_connector *wb_connector,
- struct drm_encoder *enc,
- const struct drm_connector_funcs *con_funcs, const u32 *formats,
- int n_formats);
+ 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,
--
2.34.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v7 2/8] drm: writeback: Refactor drm_writeback_connector structure
2026-11-10 6:16 [PATCH v7 0/8] Refactor drm_writeback_connector structure Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 DO NOT REVIEW 1/8] drm: writeback: drop excess connector initialization functions Suraj Kandpal
@ 2026-11-10 6:16 ` Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 3/8] drm: writeback: Modify writeback init helpers Suraj Kandpal
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Suraj Kandpal @ 2026-11-10 6:16 UTC (permalink / raw)
To: dri-devel, amd-gfx, freedreno, linux-arm-msm, linux-renesas-soc,
intel-gfx, intel-xe, linux-kernel
Cc: dmitry.baryshkov, John.Harrison, kernel-dev, alex.hung,
liviu.dudau, louis.chauvet, maarten.lankhorst, mripard,
tzimmermann, airlied, simona, laurent.pinchart+renesas,
tomi.valkeinen+renesas, kieran.bingham+renesas, dave.stevenson,
mcanal, kernel-list, uma.shankar, arun.r.murthy, 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 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>
Reviewed-by: John Harrison <John.Harrison@Igalia.com>
Reviewed-by: Alex Hung <alex.hung@amd.com>
---
v6 -> v7:
- Rebase over latest kernel
- Rebase over latest writeback series by Dmitry
v5 -> v6:
- Rebase on latest kernel
v4 -> v5:
- Remove more unnecessary wrapping of drm_writeback_to_connector() (John)
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 | 4 +-
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 2 +-
.../display/amdgpu_dm/amdgpu_dm_connector.c | 4 +-
.../drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c | 6 +-
.../tests/amdgpu_dm_connector_test.c | 6 +-
.../display/amdgpu_dm/tests/amdgpu_dm_test.c | 2 +-
.../amdgpu_dm/tests/amdgpu_dm_wb_test.c | 6 +-
.../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 | 10 +--
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 | 30 ++++----
.../drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 3 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 14 ++--
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 +-----------------
27 files changed, 160 insertions(+), 152 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 12bc10f852e2..2fca88a4ac7d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4816,7 +4816,7 @@ 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;
@@ -4830,7 +4830,7 @@ dm_set_writeback(struct amdgpu_display_manager *dm,
goto cleanup;
}
- acrtc = to_amdgpu_crtc(to_amdgpu_dm_wb_connector(wb_conn)->encoder.crtc);
+ acrtc = to_amdgpu_crtc(to_amdgpu_dm_wb_connector(connector)->encoder.crtc);
if (!acrtc) {
drm_err(adev_to_drm(adev), "no amdgpu_crtc found\n");
goto cleanup;
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 aa838a9367d8..a80cb086f64f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -945,7 +945,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 drm_encoder encoder;
struct dc_link *link;
};
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
index e8c57660b69b..9ba1acabf2dc 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
@@ -1512,11 +1512,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;
}
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 dde02b2b018b..4cd8fdf6ef07 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
@@ -260,9 +260,9 @@ int amdgpu_dm_wb_connector_init(struct amdgpu_display_manager *dm,
if (res)
return res;
- 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 = drm_writeback_connector_init(&dm->adev->ddev, &wbcon->base,
+ res = drm_writeback_connector_init(&dm->adev->ddev, &wbcon->base.writeback,
&amdgpu_dm_wb_connector_funcs,
&wbcon->encoder,
amdgpu_dm_wb_formats,
@@ -275,7 +275,7 @@ 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.
*/
- connector = &wbcon->base.base;
+ connector = &wbcon->base;
if (connector->funcs->atomic_create_state) {
struct drm_connector_state *conn_state;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
index 02f2121718f4..cdea4ab52687 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_connector_test.c
@@ -7146,7 +7146,7 @@ static void dm_test_create_validate_stream_writeback(struct kunit *test)
wbcon = drmm_kzalloc(drm, sizeof(*wbcon), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, wbcon);
KUNIT_ASSERT_EQ(test,
- drmm_connector_init(drm, &wbcon->base.base,
+ drmm_connector_init(drm, &wbcon->base,
&dm_test_connector_funcs,
DRM_MODE_CONNECTOR_WRITEBACK, NULL), 0);
@@ -7160,7 +7160,7 @@ static void dm_test_create_validate_stream_writeback(struct kunit *test)
dm_state = kunit_kzalloc(test, sizeof(*dm_state), GFP_KERNEL);
KUNIT_ASSERT_NOT_NULL(test, dm_state);
- dm_state->base.connector = &wbcon->base.base;
+ dm_state->base.connector = &wbcon->base;
dm_state->scaling = RMX_OFF;
mode = kunit_kzalloc(test, sizeof(*mode), GFP_KERNEL);
@@ -7169,7 +7169,7 @@ static void dm_test_create_validate_stream_writeback(struct kunit *test)
mode->vdisplay = 1080;
mode->clock = 148500;
- stream = amdgpu_dm_create_validate_stream_for_sink(&wbcon->base.base,
+ stream = amdgpu_dm_create_validate_stream_for_sink(&wbcon->base,
mode, dm_state, NULL);
KUNIT_ASSERT_NOT_NULL(test, stream);
dc_stream_release(stream);
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c
index 61b72eba4c31..b3bbbf7a7284 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_test.c
@@ -4597,7 +4597,7 @@ static void dm_test_set_writeback_no_pipe(struct kunit *test)
conn_state->writeback_job = job;
crtc_state->stream = dm_kunit_alloc_stream(test, NULL);
- dm_set_writeback(&adev->dm, crtc_state, &wb_conn->base.base, conn_state);
+ dm_set_writeback(&adev->dm, crtc_state, &wb_conn->base, conn_state);
KUNIT_EXPECT_NULL(test, acrtc->wb_conn);
KUNIT_EXPECT_FALSE(test, acrtc->wb_pending);
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
index 8ba4299578ea..0628b250f47f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_wb_test.c
@@ -508,9 +508,9 @@ static void dm_test_wb_connector_init_success(struct kunit *test)
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_PTR_EQ(test, wbcon->link, link);
- KUNIT_EXPECT_TRUE(test, wbcon->base.base.funcs != NULL);
- KUNIT_EXPECT_TRUE(test, wbcon->base.base.helper_private != NULL);
- KUNIT_EXPECT_TRUE(test, wbcon->base.base.state != NULL);
+ KUNIT_EXPECT_TRUE(test, wbcon->base.funcs != NULL);
+ KUNIT_EXPECT_TRUE(test, wbcon->base.helper_private != NULL);
+ KUNIT_EXPECT_TRUE(test, wbcon->base.state != NULL);
KUNIT_EXPECT_TRUE(test, wbcon->encoder.funcs != NULL);
KUNIT_EXPECT_EQ(test, wbcon->encoder.possible_crtcs, 0x1);
}
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
index 0fd069fc3386..1908a4578f73 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
@@ -214,7 +214,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));
@@ -270,9 +270,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 4d41681a834b..1cd6fdd1f22c 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;
/** @encoder: writeback encoder */
struct drm_encoder encoder;
@@ -142,7 +142,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 ea4589b00ee0..07075a8b5aa8 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
@@ -52,7 +52,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
@@ -124,7 +124,7 @@ komeda_wb_connector_fill_modes(struct drm_connector *connector,
static void komeda_wb_connector_destroy(struct drm_connector *connector)
{
drm_connector_cleanup(connector);
- kfree(to_kconn(to_wb_conn(connector)));
+ kfree(to_kconn(connector));
}
static const struct drm_encoder_funcs komeda_wb_encoder_funcs = {
@@ -164,7 +164,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,
@@ -223,9 +223,9 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
drm_encoder_mask(wb_encoder);
}
- 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 ec7b9db8b0b4..2710949020a9 100644
--- a/drivers/gpu/drm/arm/malidp_crtc.c
+++ b/drivers/gpu/drm/arm/malidp_crtc.c
@@ -422,7 +422,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 64610f2d23e2..928d46f6c322 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;
struct drm_encoder mw_encoder;
wait_queue_head_t wq;
struct drm_pending_vblank_event *event;
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 3669d10540bf..503a19963587 100644
--- a/drivers/gpu/drm/arm/malidp_mw.c
+++ b/drivers/gpu/drm/arm/malidp_mw.c
@@ -220,7 +220,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);
@@ -239,7 +239,7 @@ int malidp_mw_connector_init(struct drm_device *drm)
return ret;
}
- ret = drm_writeback_connector_init(drm, &malidp->mw_connector,
+ ret = drm_writeback_connector_init(drm, &malidp->mw_connector.writeback,
&malidp_mw_connector_funcs,
&malidp->mw_encoder,
formats, n_formats);
@@ -256,8 +256,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 1eebcf6f5e05..a3e8809b4508 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -1520,7 +1520,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 0c5d2fbe7a7c..c3d2853755ac 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -96,8 +96,9 @@ 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 *
@@ -177,7 +178,7 @@ 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);
@@ -253,7 +254,7 @@ 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,
@@ -283,7 +284,7 @@ EXPORT_SYMBOL(drm_writeback_connector_init);
void drm_writeback_connector_cleanup(struct drm_connector *connector)
{
struct drm_writeback_connector *wb_connector =
- drm_connector_to_writeback(connector);
+ &connector->writeback;
struct drm_writeback_job *pos, *n;
unsigned long flags;
@@ -328,7 +329,7 @@ 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,
@@ -352,7 +353,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);
@@ -361,13 +362,14 @@ 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;
}
@@ -413,12 +415,13 @@ 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);
@@ -500,8 +503,9 @@ 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 83ff7122a187..95db5002e999 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,10 @@ 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 +101,10 @@ 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 +132,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 d8b1dcab8dea..242f1913116b 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
* @encoder: the writeback encoder
*/
struct rcar_du_crtc {
@@ -74,12 +74,12 @@ struct rcar_du_crtc {
const char *const *sources;
unsigned int sources_count;
- struct drm_writeback_connector writeback;
+ struct drm_connector wb_connector;
struct drm_encoder encoder;
};
#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 a88408124758..0708e5a38a15 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)
@@ -202,7 +204,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 = &rcrtc->encoder;
int ret;
@@ -214,9 +216,8 @@ int rcar_du_writeback_init(struct rcar_du_device *rcdu,
if (ret)
return ret;
- drm_connector_helper_add(&wb_conn->base,
+ drm_connector_helper_add(&rcrtc->wb_connector,
&rcar_du_wb_conn_helper_funcs);
-
ret = drm_writeback_connector_init(&rcdu->ddev, wb_conn,
&rcar_du_wb_conn_funcs,
encoder,
@@ -237,7 +238,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;
@@ -252,10 +253,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 6ffc54d23d48..591753dcfb30 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -167,7 +167,7 @@ struct vc4_txp {
struct platform_device *pdev;
struct vc4_encoder encoder;
- struct drm_writeback_connector connector;
+ struct drm_connector connector;
void __iomem *regs;
};
@@ -176,7 +176,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),
@@ -356,7 +356,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 = drm_writeback_connector_init(drm, &txp->connector,
+ ret = drm_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 0fc915a954ba..13e34d4f515e 100644
--- a/drivers/gpu/drm/vkms/vkms_composer.c
+++ b/drivers/gpu/drm/vkms/vkms_composer.c
@@ -658,7 +658,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 dea6cad3f1b9..1b3c39f08333 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 858df1f89f66..b9f33f2e8b92 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 f656ed8324d3..825da0f4839e 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -2270,6 +2270,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
*
@@ -2688,10 +2743,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 [flat|nested] 9+ messages in thread
* [PATCH v7 3/8] drm: writeback: Modify writeback init helpers
2026-11-10 6:16 [PATCH v7 0/8] Refactor drm_writeback_connector structure Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 DO NOT REVIEW 1/8] drm: writeback: drop excess connector initialization functions Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 2/8] drm: writeback: Refactor drm_writeback_connector structure Suraj Kandpal
@ 2026-11-10 6:16 ` Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 4/8] drm: writeback: Modify drm_writeback_queue_job helper Suraj Kandpal
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Suraj Kandpal @ 2026-11-10 6:16 UTC (permalink / raw)
To: dri-devel, amd-gfx, freedreno, linux-arm-msm, linux-renesas-soc,
intel-gfx, intel-xe, linux-kernel
Cc: dmitry.baryshkov, John.Harrison, kernel-dev, alex.hung,
liviu.dudau, louis.chauvet, maarten.lankhorst, mripard,
tzimmermann, airlied, simona, laurent.pinchart+renesas,
tomi.valkeinen+renesas, kieran.bingham+renesas, dave.stevenson,
mcanal, kernel-list, uma.shankar, arun.r.murthy, Suraj Kandpal
The writeback connector init helpers (drm_writeback_connector_init
and drmm_writeback_connector_init) 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>
Reviewed-by: John Harrison <John.Harrison@Igalia.com>
Reviewed-by: Alex Hung <alex.hung@amd.com>
---
v6 -> v7:
- Rebase over latest kernel
- Rebase over latest writeback series by Dmitry
- Update commit message (Alex)
v5 -> v6:
- Rebase over latest kernel
v4 -> v5:
- Make @connector kerneldoc wording consistent across the series (John)
- Fix Drm -> DRM (John)
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 | 6 +++---
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, 19 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 4cd8fdf6ef07..e98481d5aa74 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
@@ -262,7 +262,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 = drm_writeback_connector_init(&dm->adev->ddev, &wbcon->base.writeback,
+ res = drm_writeback_connector_init(&dm->adev->ddev, &wbcon->base,
&amdgpu_dm_wb_connector_funcs,
&wbcon->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 07075a8b5aa8..5cdcc468e8a4 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
@@ -145,7 +145,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;
struct drm_encoder *wb_encoder;
@@ -164,8 +163,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);
@@ -186,7 +183,7 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
return err;
}
- err = drm_writeback_connector_init(&kms->base, wb_conn,
+ err = drm_writeback_connector_init(&kms->base, &kwb_conn->base,
&komeda_wb_connector_funcs,
wb_encoder,
formats, n_formats);
diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
index 503a19963587..bf06a47c3b63 100644
--- a/drivers/gpu/drm/arm/malidp_mw.c
+++ b/drivers/gpu/drm/arm/malidp_mw.c
@@ -239,7 +239,7 @@ int malidp_mw_connector_init(struct drm_device *drm)
return ret;
}
- ret = drm_writeback_connector_init(drm, &malidp->mw_connector.writeback,
+ ret = drm_writeback_connector_init(drm, &malidp->mw_connector,
&malidp_mw_connector_funcs,
&malidp->mw_encoder,
formats, n_formats);
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index c3d2853755ac..4a32ab840862 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -224,9 +224,9 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
* drm_writeback_connector_init - Initialize a writeback connector
*
* @dev: DRM device
- * @wb_connector: Writeback connector to initialize
- * @enc: handle to the already initialized drm encoder
+ * @connector: DRM connector which contains the writeback connector to initialize
* @con_funcs: Connector funcs vtable
+ * @enc: handle to the already initialized drm encoder
* @formats: Array of supported pixel formats for the writeback engine
* @n_formats: Length of the formats array
*
@@ -249,12 +249,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,
@@ -307,7 +307,7 @@ void drm_writeback_connector_cleanup(struct drm_connector *connector)
* drmm_writeback_connector_init - Initialize a writeback connector
*
* @dev: DRM device
- * @wb_connector: Writeback connector to initialize
+ * @connector: DRM connector which contains 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
@@ -324,12 +324,12 @@ void drm_writeback_connector_cleanup(struct drm_connector *connector)
* 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 95db5002e999..38c214dea08d 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
@@ -134,7 +134,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 0708e5a38a15..5ad8b935eb81 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
@@ -204,7 +204,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->wb_connector.writeback;
+ struct drm_connector *connector = &rcrtc->wb_connector;
struct drm_encoder *encoder = &rcrtc->encoder;
int ret;
@@ -216,9 +216,9 @@ int rcar_du_writeback_init(struct rcar_du_device *rcdu,
if (ret)
return ret;
- drm_connector_helper_add(&rcrtc->wb_connector,
+ drm_connector_helper_add(connector,
&rcar_du_wb_conn_helper_funcs);
- ret = drm_writeback_connector_init(&rcdu->ddev, wb_conn,
+ ret = drm_writeback_connector_init(&rcdu->ddev, 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 591753dcfb30..34a9c714deb8 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 = drm_writeback_connector_init(drm, &txp->connector.writeback,
+ ret = drm_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 b9f33f2e8b92..b8ef524fe313 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 [flat|nested] 9+ messages in thread
* [PATCH v7 4/8] drm: writeback: Modify drm_writeback_queue_job helper
2026-11-10 6:16 [PATCH v7 0/8] Refactor drm_writeback_connector structure Suraj Kandpal
` (2 preceding siblings ...)
2026-11-10 6:16 ` [PATCH v7 3/8] drm: writeback: Modify writeback init helpers Suraj Kandpal
@ 2026-11-10 6:16 ` Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 5/8] drm: writeback: Modify drm_writeback_signal_completion helper Suraj Kandpal
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Suraj Kandpal @ 2026-11-10 6:16 UTC (permalink / raw)
To: dri-devel, amd-gfx, freedreno, linux-arm-msm, linux-renesas-soc,
intel-gfx, intel-xe, linux-kernel
Cc: dmitry.baryshkov, John.Harrison, kernel-dev, alex.hung,
liviu.dudau, louis.chauvet, maarten.lankhorst, mripard,
tzimmermann, airlied, simona, laurent.pinchart+renesas,
tomi.valkeinen+renesas, kieran.bingham+renesas, dave.stevenson,
mcanal, kernel-list, uma.shankar, arun.r.murthy, Suraj Kandpal
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>
Reviewed-by: John Harrison <John.Harrison@Igalia.com>
Reviewed-by: Alex Hung <alex.hung@amd.com>
---
v6 -> v7:
- Rebase over latest kernel
- Rebase over latest writeback series by Dmitry
v5 -> v6:
- Rebase over latest kernel
v4 -> v5:
- Make @connector kerneldoc wording consistent across the series (John)
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 2fca88a4ac7d..0fdc32878002 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4909,7 +4909,7 @@ dm_set_writeback(struct amdgpu_display_manager *dm,
dc_stream_add_writeback(dm->dc, crtc_state->stream, wb_info);
acrtc->wb_conn = wb_conn;
- drm_writeback_queue_job(wb_conn, new_con_state);
+ drm_writeback_queue_job(connector, new_con_state);
/*
* Writeback completion is detected in the CRTC vblank IRQ
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
index 1908a4578f73..fd35f81dfca8 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
@@ -272,7 +272,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 bf06a47c3b63..cff3fdb37f8d 100644
--- a/drivers/gpu/drm/arm/malidp_mw.c
+++ b/drivers/gpu/drm/arm/malidp_mw.c
@@ -256,7 +256,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;
@@ -276,7 +275,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 4a32ab840862..a97cd4fa8dec 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -381,7 +381,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: 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
@@ -398,9 +399,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 5ad8b935eb81..c3802bbced16 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
@@ -253,7 +253,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 34a9c714deb8..584610e1628f 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -356,7 +356,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 b8ef524fe313..8d72946989fe 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 [flat|nested] 9+ messages in thread
* [PATCH v7 5/8] drm: writeback: Modify drm_writeback_signal_completion helper
2026-11-10 6:16 [PATCH v7 0/8] Refactor drm_writeback_connector structure Suraj Kandpal
` (3 preceding siblings ...)
2026-11-10 6:16 ` [PATCH v7 4/8] drm: writeback: Modify drm_writeback_queue_job helper Suraj Kandpal
@ 2026-11-10 6:16 ` Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 6/8] drm: writeback: Modify drm_writeback_get_out_fence helper Suraj Kandpal
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Suraj Kandpal @ 2026-11-10 6:16 UTC (permalink / raw)
To: dri-devel, amd-gfx, freedreno, linux-arm-msm, linux-renesas-soc,
intel-gfx, intel-xe, linux-kernel
Cc: dmitry.baryshkov, John.Harrison, kernel-dev, alex.hung,
liviu.dudau, louis.chauvet, maarten.lankhorst, mripard,
tzimmermann, airlied, simona, laurent.pinchart+renesas,
tomi.valkeinen+renesas, kieran.bingham+renesas, dave.stevenson,
mcanal, kernel-list, uma.shankar, arun.r.murthy, Suraj Kandpal
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>
Reviewed-by: John Harrison <John.Harrison@Igalia.com>
---
v6 -> v7:
- Rebase over latest kernel
- Rebase over latest writeback series by Dmitry
- Fix null pointer dereference (Alex)
v5 -> v6:
- Rebase over latest kernel
v4 -> v5:
- Make @connector kerneldoc wording consistent across the series (John)
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 0fdc32878002..512cb24b7f14 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4422,7 +4422,7 @@ bool amdgpu_dm_crtc_complete_writeback(struct amdgpu_crtc *acrtc)
if (!pending)
return false;
- drm_writeback_signal_completion(acrtc->wb_conn, 0);
+ drm_writeback_signal_completion(drm_writeback_to_connector(acrtc->wb_conn), 0);
drm_crtc_vblank_put(&acrtc->base);
return true;
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
index fd35f81dfca8..21445385b245 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
@@ -214,7 +214,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 a97cd4fa8dec..7c74361e38e2 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -453,7 +453,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: DRM connector which contains the 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
@@ -468,10 +469,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 c3802bbced16..02e74048d00f 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
@@ -258,5 +258,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 584610e1628f..7b9f9828ea4e 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 13e34d4f515e..0fc915a954ba 100644
--- a/drivers/gpu/drm/vkms/vkms_composer.c
+++ b/drivers/gpu/drm/vkms/vkms_composer.c
@@ -658,7 +658,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 [flat|nested] 9+ messages in thread
* [PATCH v7 6/8] drm: writeback: Modify drm_writeback_get_out_fence helper
2026-11-10 6:16 [PATCH v7 0/8] Refactor drm_writeback_connector structure Suraj Kandpal
` (4 preceding siblings ...)
2026-11-10 6:16 ` [PATCH v7 5/8] drm: writeback: Modify drm_writeback_signal_completion helper Suraj Kandpal
@ 2026-11-10 6:16 ` Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 7/8] drm: writeback: Modify prepare_writeback_job helper Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 8/8] drm: writeback: Modify cleanup_writeback_job helper Suraj Kandpal
7 siblings, 0 replies; 9+ messages in thread
From: Suraj Kandpal @ 2026-11-10 6:16 UTC (permalink / raw)
To: dri-devel, amd-gfx, freedreno, linux-arm-msm, linux-renesas-soc,
intel-gfx, intel-xe, linux-kernel
Cc: dmitry.baryshkov, John.Harrison, kernel-dev, alex.hung,
liviu.dudau, louis.chauvet, maarten.lankhorst, mripard,
tzimmermann, airlied, simona, laurent.pinchart+renesas,
tomi.valkeinen+renesas, kieran.bingham+renesas, dave.stevenson,
mcanal, kernel-list, uma.shankar, arun.r.murthy, 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>
Reviewed-by: John Harrison <John.Harrison@Igalia.com>
Reviewed-by: Alex Hung <alex.hung@amd.com>
---
v6 -> v7:
- Rebase over latest kernel
- Rebase over latest writeback series by Dmitry
v5 -> v6:
- Rebase over latest kernel
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 | 4 ++--
include/drm/drm_writeback.h | 2 +-
3 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index a3e8809b4508..139210b093e8 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -1498,7 +1498,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;
@@ -1520,8 +1519,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 7c74361e38e2..33be7a0b9a89 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -504,10 +504,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 [flat|nested] 9+ messages in thread
* [PATCH v7 7/8] drm: writeback: Modify prepare_writeback_job helper
2026-11-10 6:16 [PATCH v7 0/8] Refactor drm_writeback_connector structure Suraj Kandpal
` (5 preceding siblings ...)
2026-11-10 6:16 ` [PATCH v7 6/8] drm: writeback: Modify drm_writeback_get_out_fence helper Suraj Kandpal
@ 2026-11-10 6:16 ` Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 8/8] drm: writeback: Modify cleanup_writeback_job helper Suraj Kandpal
7 siblings, 0 replies; 9+ messages in thread
From: Suraj Kandpal @ 2026-11-10 6:16 UTC (permalink / raw)
To: dri-devel, amd-gfx, freedreno, linux-arm-msm, linux-renesas-soc,
intel-gfx, intel-xe, linux-kernel
Cc: dmitry.baryshkov, John.Harrison, kernel-dev, alex.hung,
liviu.dudau, louis.chauvet, maarten.lankhorst, mripard,
tzimmermann, airlied, simona, laurent.pinchart+renesas,
tomi.valkeinen+renesas, kieran.bingham+renesas, dave.stevenson,
mcanal, kernel-list, uma.shankar, arun.r.murthy, Suraj Kandpal
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>
Reviewed-by: John Harrison <John.Harrison@Igalia.com>
Reviewed-by: Alex Hung <alex.hung@amd.com>
---
v6 -> v7:
- Rebase over latest kernel
- Rebase over latest writeback series by Dmitry
v5 -> v6:
- Rebase over latest kernel
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/amd/display/amdgpu_dm/amdgpu_dm_wb.h | 2 +-
drivers/gpu/drm/drm_writeback.c | 2 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 3 +--
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 +-
7 files changed, 9 insertions(+), 11 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 e98481d5aa74..afed660762fd 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
@@ -131,8 +131,8 @@ STATIC_IFN_KUNIT int amdgpu_dm_wb_connector_get_modes(struct drm_connector *conn
}
EXPORT_IF_KUNIT(amdgpu_dm_wb_connector_get_modes);
-STATIC_IFN_KUNIT int amdgpu_dm_wb_prepare_job(struct drm_writeback_connector *wb_connector,
- struct drm_writeback_job *job)
+STATIC_IFN_KUNIT int amdgpu_dm_wb_prepare_job(struct drm_connector *wb_connector,
+ struct drm_writeback_job *job)
{
struct amdgpu_framebuffer *afb;
struct drm_gem_object *obj;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.h
index 8d39a37e80f0..ede7ff007ad7 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.h
@@ -59,7 +59,7 @@ int amdgpu_dm_wb_encoder_atomic_check(struct drm_encoder *encoder,
struct drm_crtc_state *crtc_state,
struct drm_connector_state *conn_state);
int amdgpu_dm_wb_connector_get_modes(struct drm_connector *connector);
-int amdgpu_dm_wb_prepare_job(struct drm_writeback_connector *wb_connector,
+int amdgpu_dm_wb_prepare_job(struct drm_connector *wb_connector,
struct drm_writeback_job *job);
void amdgpu_dm_wb_cleanup_job(struct drm_writeback_connector *connector,
struct drm_writeback_job *job);
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index 33be7a0b9a89..f54ee84c2e8a 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -369,7 +369,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 38c214dea08d..88227aa7ee69 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
@@ -87,10 +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 02e74048d00f..6c4685147e49 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 8d72946989fe..be67b13e7347 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 60b30cc26940..bff41a1d49a6 100644
--- a/include/drm/drm_modeset_helper_vtables.h
+++ b/include/drm/drm_modeset_helper_vtables.h
@@ -1161,7 +1161,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 [flat|nested] 9+ messages in thread
* [PATCH v7 8/8] drm: writeback: Modify cleanup_writeback_job helper
2026-11-10 6:16 [PATCH v7 0/8] Refactor drm_writeback_connector structure Suraj Kandpal
` (6 preceding siblings ...)
2026-11-10 6:16 ` [PATCH v7 7/8] drm: writeback: Modify prepare_writeback_job helper Suraj Kandpal
@ 2026-11-10 6:16 ` Suraj Kandpal
7 siblings, 0 replies; 9+ messages in thread
From: Suraj Kandpal @ 2026-11-10 6:16 UTC (permalink / raw)
To: dri-devel, amd-gfx, freedreno, linux-arm-msm, linux-renesas-soc,
intel-gfx, intel-xe, linux-kernel
Cc: dmitry.baryshkov, John.Harrison, kernel-dev, alex.hung,
liviu.dudau, louis.chauvet, maarten.lankhorst, mripard,
tzimmermann, airlied, simona, laurent.pinchart+renesas,
tomi.valkeinen+renesas, kieran.bingham+renesas, dave.stevenson,
mcanal, kernel-list, uma.shankar, arun.r.murthy, Suraj Kandpal
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>
Reviewed-by: John Harrison <John.Harrison@Igalia.com>
Reviewed-by: Alex Hung <alex.hung@amd.com>
---
v6 -> v7:
- Rebase over latest kernel
- Rebase over latest writeback series by Dmitry
v5 -> v6:
- Rebase over latest kernel
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/amd/display/amdgpu_dm/amdgpu_dm_wb.h | 2 +-
drivers/gpu/drm/drm_writeback.c | 2 +-
drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 3 +--
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 +-
7 files changed, 8 insertions(+), 13 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 afed660762fd..90ffa9e83957 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
@@ -196,7 +196,7 @@ STATIC_IFN_KUNIT int amdgpu_dm_wb_prepare_job(struct drm_connector *wb_connector
}
EXPORT_IF_KUNIT(amdgpu_dm_wb_prepare_job);
-STATIC_IFN_KUNIT void amdgpu_dm_wb_cleanup_job(struct drm_writeback_connector *connector,
+STATIC_IFN_KUNIT void amdgpu_dm_wb_cleanup_job(struct drm_connector *connector,
struct drm_writeback_job *job)
{
struct amdgpu_bo *rbo;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.h
index ede7ff007ad7..4050d83a2a95 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.h
@@ -61,7 +61,7 @@ int amdgpu_dm_wb_encoder_atomic_check(struct drm_encoder *encoder,
int amdgpu_dm_wb_connector_get_modes(struct drm_connector *connector);
int amdgpu_dm_wb_prepare_job(struct drm_connector *wb_connector,
struct drm_writeback_job *job);
-void amdgpu_dm_wb_cleanup_job(struct drm_writeback_connector *connector,
+void amdgpu_dm_wb_cleanup_job(struct drm_connector *connector,
struct drm_writeback_job *job);
void amdgpu_dm_wb_kunit_set_ops(const struct amdgpu_dm_wb_kunit_ops *ops);
#endif
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index f54ee84c2e8a..815eb63c2d56 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -423,7 +423,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 88227aa7ee69..44797c9443ac 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
@@ -100,10 +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 6c4685147e49..d6171fb5eb9a 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 be67b13e7347..c805fcf78163 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 bff41a1d49a6..0fdba3eded28 100644
--- a/include/drm/drm_modeset_helper_vtables.h
+++ b/include/drm/drm_modeset_helper_vtables.h
@@ -1176,7 +1176,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 [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-11-10 6:17 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-10 6:16 [PATCH v7 0/8] Refactor drm_writeback_connector structure Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 DO NOT REVIEW 1/8] drm: writeback: drop excess connector initialization functions Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 2/8] drm: writeback: Refactor drm_writeback_connector structure Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 3/8] drm: writeback: Modify writeback init helpers Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 4/8] drm: writeback: Modify drm_writeback_queue_job helper Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 5/8] drm: writeback: Modify drm_writeback_signal_completion helper Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 6/8] drm: writeback: Modify drm_writeback_get_out_fence helper Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 7/8] drm: writeback: Modify prepare_writeback_job helper Suraj Kandpal
2026-11-10 6:16 ` [PATCH v7 8/8] drm: writeback: Modify cleanup_writeback_job helper Suraj Kandpal
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®