[PATCH V2 2/2] drm/vkms: Add crtc atomic helper functions for virtual mode

From: Sumera Priyadarsini
Date: Wed Mar 03 2021 - 12:12:45 EST


Add a new drm_crtc_helper_funcs struct,
vkms_virtual_crtc_helper_funcs() which holds the atomic helpers
for virtual hardware mode. Change the existing
vkms_crtc_helper_funcs struct to vkms_vblank_crtc_helper_funcs
which holds atomic helpers for the vblank mode.

This patch makes the code flow clearer and easier to test
virtual hardware mode.

Signed-off-by: Sumera Priyadarsini <sylphrenadin@xxxxxxxxx>
---

Changes in V2:
- Add atomic helper functions in a separate struct for virtual hardware
mode (Daniel)
---
drivers/gpu/drm/vkms/vkms_crtc.c | 69 ++++++++++++++++++--------------
1 file changed, 39 insertions(+), 30 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 6cc8dc23bd5d..7d5562ab5ce6 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -221,48 +221,35 @@ static int vkms_crtc_atomic_check(struct drm_crtc *crtc,
return 0;
}

-static void vkms_crtc_atomic_enable(struct drm_crtc *crtc,
- struct drm_atomic_state *state)
+static void vkms_vblank_crtc_atomic_enable(struct drm_crtc *crtc,
+ struct drm_atomic_state *state)
{
- struct vkms_device *vkmsdev = drm_device_to_vkms_device(crtc->dev);
-
- if (!vkmsdev->config->virtual_hw)
- drm_crtc_vblank_on(crtc);
+ drm_crtc_vblank_on(crtc);
}

-static void vkms_crtc_atomic_disable(struct drm_crtc *crtc,
+static void vkms_vblank_crtc_atomic_disable(struct drm_crtc *crtc,
struct drm_atomic_state *state)
{
- struct vkms_device *vkmsdev = drm_device_to_vkms_device(crtc->dev);
-
- if (!vkmsdev->config->virtual_hw)
- drm_crtc_vblank_off(crtc);
+ drm_crtc_vblank_off(crtc);
}

-static void vkms_crtc_atomic_begin(struct drm_crtc *crtc,
+static void vkms_vblank_crtc_atomic_begin(struct drm_crtc *crtc,
struct drm_atomic_state *state)
{
struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc);
- struct vkms_device *vkmsdev = drm_device_to_vkms_device(crtc->dev);

/* This lock is held across the atomic commit to block vblank timer
* from scheduling vkms_composer_worker until the composer is updated
*/
- if (!vkmsdev->config->virtual_hw)
- spin_lock_irq(&vkms_output->lock);
+ spin_lock_irq(&vkms_output->lock);
}

-static void vkms_crtc_atomic_flush(struct drm_crtc *crtc,
+static void vkms_vblank_crtc_atomic_flush(struct drm_crtc *crtc,
struct drm_atomic_state *state)
{
struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc);
- struct vkms_crtc_state *vkms_state = to_vkms_crtc_state(crtc->state);
- struct vkms_device *vkmsdev = drm_device_to_vkms_device(crtc->dev);
-
- if (vkmsdev->config->virtual_hw)
- vkms_crtc_composer(vkms_state);

- if (crtc->state->event && !vkmsdev->config->virtual_hw) {
+ if (crtc->state->event) {
spin_lock(&crtc->dev->event_lock);

if (drm_crtc_vblank_get(crtc) != 0)
@@ -277,22 +264,41 @@ static void vkms_crtc_atomic_flush(struct drm_crtc *crtc,

vkms_output->composer_state = to_vkms_crtc_state(crtc->state);

- if (!vkmsdev->config->virtual_hw)
- spin_unlock_irq(&vkms_output->lock);
+ spin_unlock_irq(&vkms_output->lock);
}

-static const struct drm_crtc_helper_funcs vkms_crtc_helper_funcs = {
+/*
+ * Crtc functions for virtual hardware/vblankless mode
+ */
+static void vkms_virtual_crtc_atomic_flush(struct drm_crtc *crtc,
+ struct drm_atomic_state *state)
+{
+ struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc);
+ struct vkms_crtc_state *vkms_state = to_vkms_crtc_state(crtc->state);
+
+ vkms_crtc_composer(vkms_state);
+
+ vkms_output->composer_state = to_vkms_crtc_state(crtc->state);
+}
+
+static const struct drm_crtc_helper_funcs vkms_vblank_crtc_helper_funcs = {
.atomic_check = vkms_crtc_atomic_check,
- .atomic_begin = vkms_crtc_atomic_begin,
- .atomic_flush = vkms_crtc_atomic_flush,
- .atomic_enable = vkms_crtc_atomic_enable,
- .atomic_disable = vkms_crtc_atomic_disable,
+ .atomic_begin = vkms_vblank_crtc_atomic_begin,
+ .atomic_flush = vkms_vblank_crtc_atomic_flush,
+ .atomic_enable = vkms_vblank_crtc_atomic_enable,
+ .atomic_disable = vkms_vblank_crtc_atomic_disable,
+};
+
+static const struct drm_crtc_helper_funcs vkms_virtual_crtc_helper_funcs = {
+ .atomic_check = vkms_crtc_atomic_check,
+ .atomic_flush = vkms_virtual_crtc_atomic_flush,
};

int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
struct drm_plane *primary, struct drm_plane *cursor)
{
struct vkms_output *vkms_out = drm_crtc_to_vkms_output(crtc);
+ struct vkms_device *vkmsdev = drm_device_to_vkms_device(dev);
int ret;

ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor,
@@ -302,7 +308,10 @@ int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
return ret;
}

- drm_crtc_helper_add(crtc, &vkms_crtc_helper_funcs);
+ if (vkmsdev->config->virtual_hw)
+ drm_crtc_helper_add(crtc, &vkms_virtual_crtc_helper_funcs);
+ else
+ drm_crtc_helper_add(crtc, &vkms_vblank_crtc_helper_funcs);

spin_lock_init(&vkms_out->lock);
spin_lock_init(&vkms_out->composer_lock);
--
2.25.1