Unverified Commit 934452cb authored by Robert Mader's avatar Robert Mader Committed by Louis Chauvet
Browse files

drm/vkms: Add writeback encoders as possible clones



Since commit 41b4b11d ("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: dbd9d80c ("drm/vkms: Add support for writeback")
Signed-off-by: default avatarRobert Mader <robert.mader@collabora.com>
Reviewed-by: default avatarLouis 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: default avatarLouis Chauvet <louis.chauvet@bootlin.com>
parent 55023abe
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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);
			}
		}
	}

+2 −0
Original line number Diff line number Diff line
@@ -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);