drm/vkms: Switch to managed for writeback connector
authorLouis Chauvet <louis.chauvet@bootlin.com>
Thu, 16 Jan 2025 17:47:20 +0000 (18:47 +0100)
committerLouis Chauvet <louis.chauvet@bootlin.com>
Tue, 21 Jan 2025 09:32:33 +0000 (10:32 +0100)
The current VKMS driver uses non-managed function to create
writeback connectors. It is not an issue yet, but in order
to support multiple devices easily, convert this code to
use drm and device managed helpers.

Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Maxime Ripard <mripard@kernel.org>
Reviewed-by: José Expósito <jose.exposito89@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250116-google-vkms-managed-v9-8-3e4ae1bd05a0@bootlin.com
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
drivers/gpu/drm/vkms/vkms_drv.h
drivers/gpu/drm/vkms/vkms_output.c
drivers/gpu/drm/vkms/vkms_writeback.c

index 00541ef..46ac36a 100644 (file)
@@ -179,6 +179,7 @@ struct vkms_output {
        struct drm_encoder encoder;
        struct drm_connector connector;
        struct drm_writeback_connector wb_connector;
+       struct drm_encoder wb_encoder;
        struct hrtimer vblank_hrtimer;
        ktime_t period_ns;
        struct workqueue_struct *composer_workq;
@@ -275,6 +276,6 @@ void vkms_set_composer(struct vkms_output *out, bool enabled);
 void vkms_writeback_row(struct vkms_writeback_job *wb, const struct line_buffer *src_buffer, int y);
 
 /* Writeback */
-int vkms_enable_writeback_connector(struct vkms_device *vkmsdev);
+int vkms_enable_writeback_connector(struct vkms_device *vkmsdev, struct drm_crtc *crtc);
 
 #endif /* _VKMS_DRV_H_ */
index ab9affa..de817e2 100644 (file)
@@ -95,7 +95,7 @@ int vkms_output_init(struct vkms_device *vkmsdev)
        }
 
        if (vkmsdev->config->writeback) {
-               writeback = vkms_enable_writeback_connector(vkmsdev);
+               writeback = vkms_enable_writeback_connector(vkmsdev, crtc);
                if (writeback)
                        DRM_ERROR("Failed to init writeback connector\n");
        }
index 79918b4..981975c 100644 (file)
@@ -24,7 +24,6 @@ static const u32 vkms_wb_formats[] = {
 
 static const struct drm_connector_funcs vkms_wb_connector_funcs = {
        .fill_modes = drm_helper_probe_single_connector_modes,
-       .destroy = drm_connector_cleanup,
        .reset = drm_atomic_helper_connector_reset,
        .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
@@ -163,16 +162,22 @@ static const struct drm_connector_helper_funcs vkms_wb_conn_helper_funcs = {
        .atomic_check = vkms_wb_atomic_check,
 };
 
-int vkms_enable_writeback_connector(struct vkms_device *vkmsdev)
+int vkms_enable_writeback_connector(struct vkms_device *vkmsdev, struct drm_crtc *crtc)
 {
        struct drm_writeback_connector *wb = &vkmsdev->output.wb_connector;
+       int ret;
+
+       ret = drmm_encoder_init(&vkmsdev->drm, &vkmsdev->output.wb_encoder,
+                               NULL, DRM_MODE_ENCODER_VIRTUAL, NULL);
+       if (ret)
+               return ret;
+       vkmsdev->output.wb_encoder.possible_crtcs |= drm_crtc_mask(crtc);
 
        drm_connector_helper_add(&wb->base, &vkms_wb_conn_helper_funcs);
 
-       return drm_writeback_connector_init(&vkmsdev->drm, wb,
-                                           &vkms_wb_connector_funcs,
-                                           NULL,
-                                           vkms_wb_formats,
-                                           ARRAY_SIZE(vkms_wb_formats),
-                                           1);
+       return drmm_writeback_connector_init(&vkmsdev->drm, wb,
+                                            &vkms_wb_connector_funcs,
+                                            &vkmsdev->output.wb_encoder,
+                                            vkms_wb_formats,
+                                            ARRAY_SIZE(vkms_wb_formats));
 }