[RFC PATCH 1/3] drm/vkms: decouple cursor plane setup from crtc_init

Melissa Wen melissa.srw at gmail.com
Sat Feb 20 14:38:50 UTC 2021


Initialize CRTC only with primary plane (without cursor) as a preparation
to init overlay plane before cursor plane and keep cursor on the top.

Signed-off-by: Melissa Wen <melissa.srw at gmail.com>
---
 drivers/gpu/drm/vkms/vkms_crtc.c   |  4 ++--
 drivers/gpu/drm/vkms/vkms_drv.h    |  2 +-
 drivers/gpu/drm/vkms/vkms_output.c | 14 +++++++++-----
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 0443b7deeaef..2d4cd7736933 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -270,12 +270,12 @@ static const struct drm_crtc_helper_funcs vkms_crtc_helper_funcs = {
 };
 
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
-		   struct drm_plane *primary, struct drm_plane *cursor)
+		   struct drm_plane *primary)
 {
 	struct vkms_output *vkms_out = drm_crtc_to_vkms_output(crtc);
 	int ret;
 
-	ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor,
+	ret = drm_crtc_init_with_planes(dev, crtc, primary, NULL,
 					&vkms_crtc_funcs, NULL);
 	if (ret) {
 		DRM_ERROR("Failed to init CRTC\n");
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 35540c7c4416..9ad5ad8b7737 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -110,7 +110,7 @@ struct vkms_device {
 
 /* CRTC */
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
-		   struct drm_plane *primary, struct drm_plane *cursor);
+		   struct drm_plane *primary);
 
 int vkms_output_init(struct vkms_device *vkmsdev, int index);
 
diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms_output.c
index f5f6f15c362c..05d3bb45e6c1 100644
--- a/drivers/gpu/drm/vkms/vkms_output.c
+++ b/drivers/gpu/drm/vkms/vkms_output.c
@@ -47,6 +47,10 @@ int vkms_output_init(struct vkms_device *vkmsdev, int index)
 	if (IS_ERR(primary))
 		return PTR_ERR(primary);
 
+	ret = vkms_crtc_init(dev, crtc, primary);
+	if (ret)
+		goto err_crtc;
+
 	if (vkmsdev->config->cursor) {
 		cursor = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR, index);
 		if (IS_ERR(cursor)) {
@@ -55,9 +59,9 @@ int vkms_output_init(struct vkms_device *vkmsdev, int index)
 		}
 	}
 
-	ret = vkms_crtc_init(dev, crtc, primary, cursor);
-	if (ret)
-		goto err_crtc;
+	crtc->cursor = cursor;
+	if (cursor && !cursor->possible_crtcs)
+		cursor->possible_crtcs = drm_crtc_mask(crtc);
 
 	ret = drm_connector_init(dev, connector, &vkms_connector_funcs,
 				 DRM_MODE_CONNECTOR_VIRTUAL);
@@ -100,11 +104,11 @@ int vkms_output_init(struct vkms_device *vkmsdev, int index)
 err_connector:
 	drm_crtc_cleanup(crtc);
 
-err_crtc:
+err_cursor:
 	if (vkmsdev->config->cursor)
 		drm_plane_cleanup(cursor);
 
-err_cursor:
+err_crtc:
 	drm_plane_cleanup(primary);
 
 	return ret;
-- 
2.30.0



More information about the dri-devel mailing list