* [PATCH v4 1/8] drm/msm/dpu: don't mix devm and drmm functions
2025-12-28 17:21 [PATCH v4 0/8] drm: writeback: clean up writeback connector initialization Dmitry Baryshkov
@ 2025-12-28 17:21 ` Dmitry Baryshkov
2025-12-28 17:35 ` Laurent Pinchart
2025-12-28 17:21 ` [PATCH v4 2/8] drm/amd/display: use drmm_writeback_connector_init() Dmitry Baryshkov
` (6 subsequent siblings)
7 siblings, 1 reply; 11+ messages in thread
From: Dmitry Baryshkov @ 2025-12-28 17:21 UTC (permalink / raw)
To: Jani Nikula, Harry Wentland, Leo Li, Rodrigo Siqueira,
Alex Deucher, Christian König, David Airlie, Simona Vetter,
Liviu Dudau, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Laurent Pinchart, Tomi Valkeinen,
Kieran Bingham, Geert Uytterhoeven, Magnus Damm, Dave Stevenson,
Maíra Canal, Raspberry Pi Kernel Maintenance,
Christophe JAILLET, Jessica Zhang, Louis Chauvet
Cc: amd-gfx, dri-devel, linux-kernel, linux-arm-msm, freedreno,
linux-renesas-soc
Mixing devm and drmm functions can result in a use-after-free errors.
Change dpu_writeback_init() to use drmm_
Fixes: 0b37ac63fc9d ("drm/msm/dpu: use drmm_writeback_connector_init()")
Reported-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Closes: https://lore.kernel.org/r/78c764b8-44cf-4db5-88e7-807a85954518@wanadoo.fr
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
index 7545c0293efb..6f2370c9dd98 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
@@ -5,6 +5,7 @@
#include <drm/drm_edid.h>
#include <drm/drm_framebuffer.h>
+#include <drm/drm_managed.h>
#include "dpu_writeback.h"
@@ -125,7 +126,7 @@ int dpu_writeback_init(struct drm_device *dev, struct drm_encoder *enc,
struct dpu_wb_connector *dpu_wb_conn;
int rc = 0;
- dpu_wb_conn = devm_kzalloc(dev->dev, sizeof(*dpu_wb_conn), GFP_KERNEL);
+ dpu_wb_conn = drmm_kzalloc(dev, sizeof(*dpu_wb_conn), GFP_KERNEL);
if (!dpu_wb_conn)
return -ENOMEM;
--
2.47.3
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH v4 1/8] drm/msm/dpu: don't mix devm and drmm functions
2025-12-28 17:21 ` [PATCH v4 1/8] drm/msm/dpu: don't mix devm and drmm functions Dmitry Baryshkov
@ 2025-12-28 17:35 ` Laurent Pinchart
0 siblings, 0 replies; 11+ messages in thread
From: Laurent Pinchart @ 2025-12-28 17:35 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Jani Nikula, Harry Wentland, Leo Li, Rodrigo Siqueira,
Alex Deucher, Christian König, David Airlie, Simona Vetter,
Liviu Dudau, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Tomi Valkeinen, Kieran Bingham,
Geert Uytterhoeven, Magnus Damm, Dave Stevenson, Maíra Canal,
Raspberry Pi Kernel Maintenance, Christophe JAILLET,
Jessica Zhang, Louis Chauvet, amd-gfx, dri-devel, linux-kernel,
linux-arm-msm, freedreno, linux-renesas-soc
On Sun, Dec 28, 2025 at 07:21:33PM +0200, Dmitry Baryshkov wrote:
> Mixing devm and drmm functions can result in a use-after-free errors.
> Change dpu_writeback_init() to use drmm_
The commit message should explain what the problem is. "can result" is
very vague.
> Fixes: 0b37ac63fc9d ("drm/msm/dpu: use drmm_writeback_connector_init()")
> Reported-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
> Closes: https://lore.kernel.org/r/78c764b8-44cf-4db5-88e7-807a85954518@wanadoo.fr
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
> index 7545c0293efb..6f2370c9dd98 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c
> @@ -5,6 +5,7 @@
>
> #include <drm/drm_edid.h>
> #include <drm/drm_framebuffer.h>
> +#include <drm/drm_managed.h>
>
> #include "dpu_writeback.h"
>
> @@ -125,7 +126,7 @@ int dpu_writeback_init(struct drm_device *dev, struct drm_encoder *enc,
> struct dpu_wb_connector *dpu_wb_conn;
> int rc = 0;
>
> - dpu_wb_conn = devm_kzalloc(dev->dev, sizeof(*dpu_wb_conn), GFP_KERNEL);
> + dpu_wb_conn = drmm_kzalloc(dev, sizeof(*dpu_wb_conn), GFP_KERNEL);
> if (!dpu_wb_conn)
> return -ENOMEM;
>
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v4 2/8] drm/amd/display: use drmm_writeback_connector_init()
2025-12-28 17:21 [PATCH v4 0/8] drm: writeback: clean up writeback connector initialization Dmitry Baryshkov
2025-12-28 17:21 ` [PATCH v4 1/8] drm/msm/dpu: don't mix devm and drmm functions Dmitry Baryshkov
@ 2025-12-28 17:21 ` Dmitry Baryshkov
2025-12-28 17:21 ` [PATCH v4 3/8] drm/komeda: " Dmitry Baryshkov
` (5 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Dmitry Baryshkov @ 2025-12-28 17:21 UTC (permalink / raw)
To: Jani Nikula, Harry Wentland, Leo Li, Rodrigo Siqueira,
Alex Deucher, Christian König, David Airlie, Simona Vetter,
Liviu Dudau, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Laurent Pinchart, Tomi Valkeinen,
Kieran Bingham, Geert Uytterhoeven, Magnus Damm, Dave Stevenson,
Maíra Canal, Raspberry Pi Kernel Maintenance,
Christophe JAILLET, Jessica Zhang, Louis Chauvet
Cc: amd-gfx, dri-devel, linux-kernel, linux-arm-msm, freedreno,
linux-renesas-soc, Suraj Kandpal
Use drmm_plain_encoder_alloc() to allocate simple encoder and
drmm_writeback_connector_init() in order to initialize writeback
connector instance.
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +-
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_wb.c | 18 +++++++++++++-----
2 files changed, 14 insertions(+), 6 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 740711ac1037..45b3c8f16b23 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -10570,7 +10570,7 @@ static void dm_set_writeback(struct amdgpu_display_manager *dm,
return;
}
- acrtc = to_amdgpu_crtc(wb_conn->encoder.crtc);
+ acrtc = to_amdgpu_crtc(crtc_state->base.crtc);
if (!acrtc) {
drm_err(adev_to_drm(adev), "no amdgpu_crtc found\n");
kfree(wb_info);
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 d9527c05fc87..80c37487ca77 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
@@ -171,7 +171,6 @@ static const struct drm_encoder_helper_funcs amdgpu_dm_wb_encoder_helper_funcs =
static const struct drm_connector_funcs amdgpu_dm_wb_connector_funcs = {
.fill_modes = drm_helper_probe_single_connector_modes,
- .destroy = drm_connector_cleanup,
.reset = amdgpu_dm_connector_funcs_reset,
.atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
@@ -190,17 +189,26 @@ int amdgpu_dm_wb_connector_init(struct amdgpu_display_manager *dm,
struct dc *dc = dm->dc;
struct dc_link *link = dc_get_link_at_index(dc, link_index);
int res = 0;
+ struct drm_encoder *encoder;
+
+ encoder = drmm_plain_encoder_alloc(&dm->adev->ddev, NULL,
+ DRM_MODE_ENCODER_VIRTUAL, NULL);
+ if (IS_ERR(encoder))
+ return PTR_ERR(encoder);
+
+ drm_encoder_helper_add(encoder, &amdgpu_dm_wb_encoder_helper_funcs);
+
+ encoder->possible_crtcs = amdgpu_dm_get_encoder_crtc_mask(dm->adev);
wbcon->link = link;
drm_connector_helper_add(&wbcon->base.base, &amdgpu_dm_wb_conn_helper_funcs);
- res = drm_writeback_connector_init(&dm->adev->ddev, &wbcon->base,
+ res = drmm_writeback_connector_init(&dm->adev->ddev, &wbcon->base,
&amdgpu_dm_wb_connector_funcs,
- &amdgpu_dm_wb_encoder_helper_funcs,
+ encoder,
amdgpu_dm_wb_formats,
- ARRAY_SIZE(amdgpu_dm_wb_formats),
- amdgpu_dm_get_encoder_crtc_mask(dm->adev));
+ ARRAY_SIZE(amdgpu_dm_wb_formats));
if (res)
return res;
--
2.47.3
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v4 3/8] drm/komeda: use drmm_writeback_connector_init()
2025-12-28 17:21 [PATCH v4 0/8] drm: writeback: clean up writeback connector initialization Dmitry Baryshkov
2025-12-28 17:21 ` [PATCH v4 1/8] drm/msm/dpu: don't mix devm and drmm functions Dmitry Baryshkov
2025-12-28 17:21 ` [PATCH v4 2/8] drm/amd/display: use drmm_writeback_connector_init() Dmitry Baryshkov
@ 2025-12-28 17:21 ` Dmitry Baryshkov
2025-12-28 17:21 ` [PATCH v4 4/8] drm/mali: " Dmitry Baryshkov
` (4 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Dmitry Baryshkov @ 2025-12-28 17:21 UTC (permalink / raw)
To: Jani Nikula, Harry Wentland, Leo Li, Rodrigo Siqueira,
Alex Deucher, Christian König, David Airlie, Simona Vetter,
Liviu Dudau, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Laurent Pinchart, Tomi Valkeinen,
Kieran Bingham, Geert Uytterhoeven, Magnus Damm, Dave Stevenson,
Maíra Canal, Raspberry Pi Kernel Maintenance,
Christophe JAILLET, Jessica Zhang, Louis Chauvet
Cc: amd-gfx, dri-devel, linux-kernel, linux-arm-msm, freedreno,
linux-renesas-soc, Suraj Kandpal
Use drmm_plain_encoder_alloc() to allocate simple encoder and
drmm_writeback_connector_init() in order to initialize writeback
connector instance.
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
.../drm/arm/display/komeda/komeda_wb_connector.c | 30 ++++++++++++----------
1 file changed, 17 insertions(+), 13 deletions(-)
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 875cdbff18c9..bcc53d4015f1 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c
@@ -5,6 +5,7 @@
*
*/
#include <drm/drm_framebuffer.h>
+#include <drm/drm_managed.h>
#include "komeda_dev.h"
#include "komeda_kms.h"
@@ -121,17 +122,10 @@ komeda_wb_connector_fill_modes(struct drm_connector *connector,
return 0;
}
-static void komeda_wb_connector_destroy(struct drm_connector *connector)
-{
- drm_connector_cleanup(connector);
- kfree(to_kconn(to_wb_conn(connector)));
-}
-
static const struct drm_connector_funcs komeda_wb_connector_funcs = {
.reset = drm_atomic_helper_connector_reset,
.detect = komeda_wb_connector_detect,
.fill_modes = komeda_wb_connector_fill_modes,
- .destroy = komeda_wb_connector_destroy,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
@@ -143,13 +137,15 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
struct komeda_wb_connector *kwb_conn;
struct drm_writeback_connector *wb_conn;
struct drm_display_info *info;
+ struct drm_encoder *encoder;
+
u32 *formats, n_formats = 0;
int err;
if (!kcrtc->master->wb_layer)
return 0;
- kwb_conn = kzalloc(sizeof(*kwb_conn), GFP_KERNEL);
+ kwb_conn = drmm_kzalloc(&kms->base, sizeof(*kwb_conn), GFP_KERNEL);
if (!kwb_conn)
return -ENOMEM;
@@ -165,11 +161,19 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms,
return -ENOMEM;
}
- 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)));
+ encoder = drmm_plain_encoder_alloc(&kms->base, NULL,
+ DRM_MODE_ENCODER_VIRTUAL, NULL);
+ if (IS_ERR(encoder))
+ return PTR_ERR(encoder);
+
+ drm_encoder_helper_add(encoder, &komeda_wb_encoder_helper_funcs);
+
+ encoder->possible_crtcs = drm_crtc_mask(&kcrtc->base);
+
+ err = drmm_writeback_connector_init(&kms->base, wb_conn,
+ &komeda_wb_connector_funcs,
+ encoder,
+ formats, n_formats);
komeda_put_fourcc_list(formats);
if (err) {
kfree(kwb_conn);
--
2.47.3
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v4 4/8] drm/mali: use drmm_writeback_connector_init()
2025-12-28 17:21 [PATCH v4 0/8] drm: writeback: clean up writeback connector initialization Dmitry Baryshkov
` (2 preceding siblings ...)
2025-12-28 17:21 ` [PATCH v4 3/8] drm/komeda: " Dmitry Baryshkov
@ 2025-12-28 17:21 ` Dmitry Baryshkov
2025-12-28 17:21 ` [PATCH v4 5/8] drm: renesas: rcar-du: " Dmitry Baryshkov
` (3 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Dmitry Baryshkov @ 2025-12-28 17:21 UTC (permalink / raw)
To: Jani Nikula, Harry Wentland, Leo Li, Rodrigo Siqueira,
Alex Deucher, Christian König, David Airlie, Simona Vetter,
Liviu Dudau, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Laurent Pinchart, Tomi Valkeinen,
Kieran Bingham, Geert Uytterhoeven, Magnus Damm, Dave Stevenson,
Maíra Canal, Raspberry Pi Kernel Maintenance,
Christophe JAILLET, Jessica Zhang, Louis Chauvet
Cc: amd-gfx, dri-devel, linux-kernel, linux-arm-msm, freedreno,
linux-renesas-soc, Suraj Kandpal
Use drmm_plain_encoder_alloc() to allocate simple encoder and
drmm_writeback_connector_init() in order to initialize writeback
connector instance.
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
drivers/gpu/drm/arm/malidp_mw.c | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
index 47733c85d271..498db114ee9c 100644
--- a/drivers/gpu/drm/arm/malidp_mw.c
+++ b/drivers/gpu/drm/arm/malidp_mw.c
@@ -85,11 +85,6 @@ malidp_mw_connector_detect(struct drm_connector *connector, bool force)
return connector_status_connected;
}
-static void malidp_mw_connector_destroy(struct drm_connector *connector)
-{
- drm_connector_cleanup(connector);
-}
-
static struct drm_connector_state *
malidp_mw_connector_duplicate_state(struct drm_connector *connector)
{
@@ -115,7 +110,6 @@ static const struct drm_connector_funcs malidp_mw_connector_funcs = {
.reset = malidp_mw_connector_reset,
.detect = malidp_mw_connector_detect,
.fill_modes = drm_helper_probe_single_connector_modes,
- .destroy = malidp_mw_connector_destroy,
.atomic_duplicate_state = malidp_mw_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};
@@ -212,6 +206,7 @@ static u32 *get_writeback_formats(struct malidp_drm *malidp, int *n_formats)
int malidp_mw_connector_init(struct drm_device *drm)
{
struct malidp_drm *malidp = drm_to_malidp(drm);
+ struct drm_encoder *encoder;
u32 *formats;
int ret, n_formats;
@@ -225,11 +220,19 @@ int malidp_mw_connector_init(struct drm_device *drm)
if (!formats)
return -ENOMEM;
- 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));
+ encoder = drmm_plain_encoder_alloc(drm, NULL, DRM_MODE_ENCODER_VIRTUAL,
+ NULL);
+ if (IS_ERR(encoder))
+ return PTR_ERR(encoder);
+
+ drm_encoder_helper_add(encoder, &malidp_mw_encoder_helper_funcs);
+
+ encoder->possible_crtcs = drm_crtc_mask(&malidp->crtc);
+
+ ret = drmm_writeback_connector_init(drm, &malidp->mw_connector,
+ &malidp_mw_connector_funcs,
+ encoder,
+ formats, n_formats);
kfree(formats);
if (ret)
return ret;
--
2.47.3
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v4 5/8] drm: renesas: rcar-du: use drmm_writeback_connector_init()
2025-12-28 17:21 [PATCH v4 0/8] drm: writeback: clean up writeback connector initialization Dmitry Baryshkov
` (3 preceding siblings ...)
2025-12-28 17:21 ` [PATCH v4 4/8] drm/mali: " Dmitry Baryshkov
@ 2025-12-28 17:21 ` Dmitry Baryshkov
2025-12-28 17:37 ` Laurent Pinchart
2025-12-28 17:21 ` [PATCH v4 6/8] drm/vc4: " Dmitry Baryshkov
` (2 subsequent siblings)
7 siblings, 1 reply; 11+ messages in thread
From: Dmitry Baryshkov @ 2025-12-28 17:21 UTC (permalink / raw)
To: Jani Nikula, Harry Wentland, Leo Li, Rodrigo Siqueira,
Alex Deucher, Christian König, David Airlie, Simona Vetter,
Liviu Dudau, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Laurent Pinchart, Tomi Valkeinen,
Kieran Bingham, Geert Uytterhoeven, Magnus Damm, Dave Stevenson,
Maíra Canal, Raspberry Pi Kernel Maintenance,
Christophe JAILLET, Jessica Zhang, Louis Chauvet
Cc: amd-gfx, dri-devel, linux-kernel, linux-arm-msm, freedreno,
linux-renesas-soc, Suraj Kandpal
Use drmm_plain_encoder_alloc() to allocate simple encoder and
drmm_writeback_connector_init() in order to initialize writeback
connector instance.
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
.../gpu/drm/renesas/rcar-du/rcar_du_writeback.c | 23 +++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
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 8cd37d7b8ae2..64cea20d00b3 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
@@ -134,7 +134,6 @@ static void rcar_du_wb_conn_reset(struct drm_connector *connector)
static const struct drm_connector_funcs rcar_du_wb_conn_funcs = {
.reset = rcar_du_wb_conn_reset,
.fill_modes = drm_helper_probe_single_connector_modes,
- .destroy = drm_connector_cleanup,
.atomic_duplicate_state = rcar_du_wb_conn_duplicate_state,
.atomic_destroy_state = rcar_du_wb_conn_destroy_state,
};
@@ -202,15 +201,25 @@ int rcar_du_writeback_init(struct rcar_du_device *rcdu,
{
struct drm_writeback_connector *wb_conn = &rcrtc->writeback;
+ struct drm_encoder *encoder;
+
+ encoder = drmm_plain_encoder_alloc(&rcdu->ddev, NULL,
+ DRM_MODE_ENCODER_VIRTUAL, NULL);
+ if (IS_ERR(encoder))
+ return PTR_ERR(encoder);
+
+ drm_encoder_helper_add(encoder, &rcar_du_wb_enc_helper_funcs);
+
+ encoder->possible_crtcs = drm_crtc_mask(&rcrtc->crtc);
+
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));
+ return drmm_writeback_connector_init(&rcdu->ddev, wb_conn,
+ &rcar_du_wb_conn_funcs,
+ encoder,
+ writeback_formats,
+ ARRAY_SIZE(writeback_formats));
}
void rcar_du_writeback_setup(struct rcar_du_crtc *rcrtc,
--
2.47.3
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH v4 5/8] drm: renesas: rcar-du: use drmm_writeback_connector_init()
2025-12-28 17:21 ` [PATCH v4 5/8] drm: renesas: rcar-du: " Dmitry Baryshkov
@ 2025-12-28 17:37 ` Laurent Pinchart
0 siblings, 0 replies; 11+ messages in thread
From: Laurent Pinchart @ 2025-12-28 17:37 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Jani Nikula, Harry Wentland, Leo Li, Rodrigo Siqueira,
Alex Deucher, Christian König, David Airlie, Simona Vetter,
Liviu Dudau, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Tomi Valkeinen, Kieran Bingham,
Geert Uytterhoeven, Magnus Damm, Dave Stevenson, Maíra Canal,
Raspberry Pi Kernel Maintenance, Christophe JAILLET,
Jessica Zhang, Louis Chauvet, amd-gfx, dri-devel, linux-kernel,
linux-arm-msm, freedreno, linux-renesas-soc, Suraj Kandpal
On Sun, Dec 28, 2025 at 07:21:37PM +0200, Dmitry Baryshkov wrote:
> Use drmm_plain_encoder_alloc() to allocate simple encoder and
> drmm_writeback_connector_init() in order to initialize writeback
> connector instance.
The patch makes the driver more complex, so the commit message should
explain why this is a good idea.
> Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
> ---
> .../gpu/drm/renesas/rcar-du/rcar_du_writeback.c | 23 +++++++++++++++-------
> 1 file changed, 16 insertions(+), 7 deletions(-)
>
> 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 8cd37d7b8ae2..64cea20d00b3 100644
> --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_writeback.c
> @@ -134,7 +134,6 @@ static void rcar_du_wb_conn_reset(struct drm_connector *connector)
> static const struct drm_connector_funcs rcar_du_wb_conn_funcs = {
> .reset = rcar_du_wb_conn_reset,
> .fill_modes = drm_helper_probe_single_connector_modes,
> - .destroy = drm_connector_cleanup,
> .atomic_duplicate_state = rcar_du_wb_conn_duplicate_state,
> .atomic_destroy_state = rcar_du_wb_conn_destroy_state,
> };
> @@ -202,15 +201,25 @@ int rcar_du_writeback_init(struct rcar_du_device *rcdu,
> {
> struct drm_writeback_connector *wb_conn = &rcrtc->writeback;
>
Extra blank line.
> + struct drm_encoder *encoder;
> +
> + encoder = drmm_plain_encoder_alloc(&rcdu->ddev, NULL,
> + DRM_MODE_ENCODER_VIRTUAL, NULL);
> + if (IS_ERR(encoder))
> + return PTR_ERR(encoder);
> +
> + drm_encoder_helper_add(encoder, &rcar_du_wb_enc_helper_funcs);
> +
> + encoder->possible_crtcs = drm_crtc_mask(&rcrtc->crtc);
> +
> 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));
> + return drmm_writeback_connector_init(&rcdu->ddev, wb_conn,
> + &rcar_du_wb_conn_funcs,
> + encoder,
> + writeback_formats,
> + ARRAY_SIZE(writeback_formats));
> }
>
> void rcar_du_writeback_setup(struct rcar_du_crtc *rcrtc,
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v4 6/8] drm/vc4: use drmm_writeback_connector_init()
2025-12-28 17:21 [PATCH v4 0/8] drm: writeback: clean up writeback connector initialization Dmitry Baryshkov
` (4 preceding siblings ...)
2025-12-28 17:21 ` [PATCH v4 5/8] drm: renesas: rcar-du: " Dmitry Baryshkov
@ 2025-12-28 17:21 ` Dmitry Baryshkov
2025-12-28 17:21 ` [PATCH v4 7/8] drm: writeback: drop excess connector initialization functions Dmitry Baryshkov
2025-12-28 17:21 ` [PATCH v4 8/8] drm: writeback: rename drm_writeback_connector_init_with_encoder() Dmitry Baryshkov
7 siblings, 0 replies; 11+ messages in thread
From: Dmitry Baryshkov @ 2025-12-28 17:21 UTC (permalink / raw)
To: Jani Nikula, Harry Wentland, Leo Li, Rodrigo Siqueira,
Alex Deucher, Christian König, David Airlie, Simona Vetter,
Liviu Dudau, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Laurent Pinchart, Tomi Valkeinen,
Kieran Bingham, Geert Uytterhoeven, Magnus Damm, Dave Stevenson,
Maíra Canal, Raspberry Pi Kernel Maintenance,
Christophe JAILLET, Jessica Zhang, Louis Chauvet
Cc: amd-gfx, dri-devel, linux-kernel, linux-arm-msm, freedreno,
linux-renesas-soc, Suraj Kandpal
Use drmm_plain_encoder_alloc() to allocate simple encoder and
drmm_writeback_connector_init() in order to initialize writeback
connector instance.
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
drivers/gpu/drm/vc4/vc4_txp.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index 9082902100e4..befdb094c173 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -378,7 +378,6 @@ vc4_txp_connector_detect(struct drm_connector *connector, bool force)
static const struct drm_connector_funcs vc4_txp_connector_funcs = {
.detect = vc4_txp_connector_detect,
.fill_modes = drm_helper_probe_single_connector_modes,
- .destroy = drm_connector_cleanup,
.reset = drm_atomic_helper_connector_reset,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
@@ -602,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 = drmm_writeback_connector_init(drm, &txp->connector,
+ &vc4_txp_connector_funcs,
+ encoder,
+ drm_fmts, ARRAY_SIZE(drm_fmts));
if (ret)
return ret;
--
2.47.3
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v4 7/8] drm: writeback: drop excess connector initialization functions
2025-12-28 17:21 [PATCH v4 0/8] drm: writeback: clean up writeback connector initialization Dmitry Baryshkov
` (5 preceding siblings ...)
2025-12-28 17:21 ` [PATCH v4 6/8] drm/vc4: " Dmitry Baryshkov
@ 2025-12-28 17:21 ` Dmitry Baryshkov
2025-12-28 17:21 ` [PATCH v4 8/8] drm: writeback: rename drm_writeback_connector_init_with_encoder() Dmitry Baryshkov
7 siblings, 0 replies; 11+ messages in thread
From: Dmitry Baryshkov @ 2025-12-28 17:21 UTC (permalink / raw)
To: Jani Nikula, Harry Wentland, Leo Li, Rodrigo Siqueira,
Alex Deucher, Christian König, David Airlie, Simona Vetter,
Liviu Dudau, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Laurent Pinchart, Tomi Valkeinen,
Kieran Bingham, Geert Uytterhoeven, Magnus Damm, Dave Stevenson,
Maíra Canal, Raspberry Pi Kernel Maintenance,
Christophe JAILLET, Jessica Zhang, Louis Chauvet
Cc: amd-gfx, dri-devel, linux-kernel, linux-arm-msm, freedreno,
linux-renesas-soc, Suraj Kandpal
Now as all drivers have been converted to
drmm_writeback_connector_init(), drop drm_writeback_connector_init() and
drm_writeback_connector::encoder field, they are unused now.
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
drivers/gpu/drm/drm_writeback.c | 55 -----------------------------------------
include/drm/drm_writeback.h | 18 --------------
2 files changed, 73 deletions(-)
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index 95b8a2e4bda6..1a01df91b2c5 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -142,61 +142,6 @@ 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) {
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index c380a7b8f55a..879ca103320c 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:
*
@@ -148,13 +137,6 @@ drm_connector_to_writeback(struct drm_connector *connector)
return container_of(connector, struct drm_writeback_connector, base);
}
-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,
--
2.47.3
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH v4 8/8] drm: writeback: rename drm_writeback_connector_init_with_encoder()
2025-12-28 17:21 [PATCH v4 0/8] drm: writeback: clean up writeback connector initialization Dmitry Baryshkov
` (6 preceding siblings ...)
2025-12-28 17:21 ` [PATCH v4 7/8] drm: writeback: drop excess connector initialization functions Dmitry Baryshkov
@ 2025-12-28 17:21 ` Dmitry Baryshkov
7 siblings, 0 replies; 11+ messages in thread
From: Dmitry Baryshkov @ 2025-12-28 17:21 UTC (permalink / raw)
To: Jani Nikula, Harry Wentland, Leo Li, Rodrigo Siqueira,
Alex Deucher, Christian König, David Airlie, Simona Vetter,
Liviu Dudau, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
Rob Clark, Dmitry Baryshkov, Abhinav Kumar, Jessica Zhang,
Sean Paul, Marijn Suijten, Laurent Pinchart, Tomi Valkeinen,
Kieran Bingham, Geert Uytterhoeven, Magnus Damm, Dave Stevenson,
Maíra Canal, Raspberry Pi Kernel Maintenance,
Christophe JAILLET, Jessica Zhang, Louis Chauvet
Cc: amd-gfx, dri-devel, linux-kernel, linux-arm-msm, freedreno,
linux-renesas-soc, Suraj Kandpal
Rename drm_writeback_connector_init_with_encoder() to
drm_writeback_connector_init() and adapt its interface to follow
drmm_writeback_connector_init().
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
---
drivers/gpu/drm/drm_writeback.c | 14 +++++++-------
include/drm/drm_writeback.h | 10 +++++-----
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index 1a01df91b2c5..ec2575c4c21b 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -235,7 +235,7 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
}
/**
- * drm_writeback_connector_init_with_encoder - Initialize a writeback connector with
+ * drm_writeback_connector_init - Initialize a writeback connector with
* a custom encoder
*
* @dev: DRM device
@@ -263,11 +263,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;
@@ -284,7 +284,7 @@ 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
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index 879ca103320c..958466a05e60 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -137,11 +137,11 @@ drm_connector_to_writeback(struct drm_connector *connector)
return container_of(connector, struct drm_writeback_connector, base);
}
-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);
int drmm_writeback_connector_init(struct drm_device *dev,
struct drm_writeback_connector *wb_connector,
--
2.47.3
^ permalink raw reply related [flat|nested] 11+ messages in thread