[PATCH v1] drm/vkms: Add writeback encoders as possible clones
Louis Chauvet
louis.chauvet at bootlin.com
Fri Jul 18 10:23:35 UTC 2025
Le 03/07/2025 à 11:03, Robert Mader a écrit :
> Since commit 41b4b11da0215 ("drm: Add valid clones check") setting
> the `possible_clones` values is a hard requirement for cloning.
> `vkms` supports cloning for writeback connectors in order to capture
> CRTC content, however that broke with said commit.
>
> Writeback connectors are created on a per-CRTC basis, thus mark
> every non-writeback connector that is compatible with a given CRTC
> as possible clone - and vice-versa.
>
> Using a default configuration, the corresponding `drm_info` output
> changes from:
>
> ├───Encoders
> │ ├───Encoder 0
> │ │ ├───Object ID: 40
> │ │ ├───Type: virtual
> │ │ ├───CRTCS: {0}
> │ │ └───Clones: {0}
> │ └───Encoder 1
> │ ├───Object ID: 41
> │ ├───Type: virtual
> │ ├───CRTCS: {0}
> │ └───Clones: {1}
>
> to:
>
> ├───Encoders
> │ ├───Encoder 0
> │ │ ├───Object ID: 44
> │ │ ├───Type: virtual
> │ │ ├───CRTCS: {0}
> │ │ └───Clones: {0, 1}
> │ └───Encoder 1
> │ ├───Object ID: 50
> │ ├───Type: virtual
> │ ├───CRTCS: {0}
> │ └───Clones: {0, 1}
>
> Signed-off-by: Robert Mader <robert.mader at collabora.com>
Hi,
About the Fixes tag, I think you can add it anyway, if the patch is not
applicable on previous kernel version, this is not an issue, it will
just be ignored.
> ---
> drivers/gpu/drm/vkms/vkms_output.c | 12 ++++++++++++
> drivers/gpu/drm/vkms/vkms_writeback.c | 2 ++
> 2 files changed, 14 insertions(+)
>
> diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms_output.c
> index 8d7ca0cdd79f..21935eb88198 100644
> --- a/drivers/gpu/drm/vkms/vkms_output.c
> +++ b/drivers/gpu/drm/vkms/vkms_output.c
> @@ -77,9 +77,21 @@ int vkms_output_init(struct vkms_device *vkmsdev)
> return ret;
> }
>
> + encoder_cfg->encoder->possible_clones |= BIT(drm_encoder_index(encoder_cfg->encoder));
> +
> vkms_config_encoder_for_each_possible_crtc(encoder_cfg, idx, possible_crtc) {
> encoder_cfg->encoder->possible_crtcs |=
> drm_crtc_mask(&possible_crtc->crtc->crtc);
> +
> + if (vkms_config_crtc_get_writeback(possible_crtc)) {
> + struct drm_encoder *wb_encoder =
> + &possible_crtc->crtc->wb_encoder;
> +
> + encoder_cfg->encoder->possible_clones |=
> + BIT(drm_encoder_index(wb_encoder));
> + wb_encoder->possible_clones |=
> + BIT(drm_encoder_index(encoder_cfg->encoder));
Can you use drm_encoder_mask directly?
Thanks a lot for this patch,
Louis Chauvet
> + }
> }
> }
>
> diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
> index fe163271d5b5..12b60fb97c68 100644
> --- a/drivers/gpu/drm/vkms/vkms_writeback.c
> +++ b/drivers/gpu/drm/vkms/vkms_writeback.c
> @@ -174,6 +174,8 @@ int vkms_enable_writeback_connector(struct vkms_device *vkmsdev,
> if (ret)
> return ret;
> vkms_output->wb_encoder.possible_crtcs |= drm_crtc_mask(&vkms_output->crtc);
> + vkms_output->wb_encoder.possible_clones |=
> + BIT(drm_encoder_index(&vkms_output->wb_encoder));
>
> drm_connector_helper_add(&wb->base, &vkms_wb_conn_helper_funcs);
>
--
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
More information about the dri-devel
mailing list