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 <sylphrena...@gmail.com>
---

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

Reply via email to