diff options
| author | Robert Mader <robert.mader@collabora.com> | 2025-07-18 14:14:42 +0200 | 
|---|---|---|
| committer | Louis Chauvet <louis.chauvet@bootlin.com> | 2025-07-31 16:29:59 +0200 | 
| commit | 934452cbb16e1e3609ba52acb48c503b9aaf3154 (patch) | |
| tree | f8d1a41b143678ffb59b6754ff296ca1310e0c1b | |
| parent | 55023abe6a2921a8916b623c24208e1971b88729 (diff) | |
drm/vkms: Add writeback encoders as possible clones
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}
into:
├───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@collabora.com>
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>
Link: https://lore.kernel.org/r/20250718121442.490634-1-robert.mader@collabora.com
[fixed Fixes line and changed to: to into: to avoid checkpatch warnings]
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
| -rw-r--r-- | drivers/gpu/drm/vkms/vkms_output.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/vkms/vkms_writeback.c | 2 | 
2 files changed, 15 insertions, 0 deletions
| 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); | 
