[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