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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel