[PATCH v2] drm/vkms: Add writeback encoders as possible clones
Louis Chauvet
louis.chauvet at bootlin.com
Thu Jul 31 11:45:29 UTC 2025
Oops, sorry, I just tested it, it works
Reviewed-by: Louis Chauvet <louis.chauvet at bootlin.com>
Le 31/07/2025 à 12:45, Robert Mader a écrit :
> Hey Louis, would you be fine to add your Rb on this one? :) Would love
> to get it into drm-next / 6.17.
>
> On 18.07.25 14:14, Robert Mader wrote:
>> 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}
>>
>> Fixes: dbd9d80c1b2e (drm/vkms: Add support for writeback)
>> Signed-off-by: Robert Mader <robert.mader at collabora.com>
>> ---
>> drivers/gpu/drm/vkms/vkms_output.c | 13 +++++++++++++
>> drivers/gpu/drm/vkms/vkms_writeback.c | 2 ++
>> 2 files changed, 15 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms_output.c
>> index 8d7ca0cdd79f..2ee3749e2b28 100644
>> --- a/drivers/gpu/drm/vkms/vkms_output.c
>> +++ b/drivers/gpu/drm/vkms/vkms_output.c
>> @@ -77,9 +77,22 @@ int vkms_output_init(struct vkms_device *vkmsdev)
>> return ret;
>> }
>>
>> + encoder_cfg->encoder->possible_clones |=
>> + drm_encoder_mask(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 |=
>> + drm_encoder_mask(wb_encoder);
>> + wb_encoder->possible_clones |=
>> + drm_encoder_mask(encoder_cfg->encoder);
>> + }
>> }
>> }
>>
>> diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
>> index fe163271d5b5..45d69a3b85f6 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 |=
>> + drm_encoder_mask(&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