diff options
Diffstat (limited to 'drivers/gpu/drm/vkms/vkms_crtc.c')
| -rw-r--r-- | drivers/gpu/drm/vkms/vkms_crtc.c | 34 | 
1 files changed, 14 insertions, 20 deletions
| diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c index 177bbcb38306..8a9aeb0a9ea8 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -1,22 +1,20 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - */ +// SPDX-License-Identifier: GPL-2.0+  #include "vkms_drv.h"  #include <drm/drm_atomic_helper.h> -#include <drm/drm_crtc_helper.h> +#include <drm/drm_probe_helper.h> -static void _vblank_handle(struct vkms_output *output) +static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)  { +	struct vkms_output *output = container_of(timer, struct vkms_output, +						  vblank_hrtimer);  	struct drm_crtc *crtc = &output->crtc;  	struct vkms_crtc_state *state = to_vkms_crtc_state(crtc->state); +	u64 ret_overrun;  	bool ret;  	spin_lock(&output->lock); +  	ret = drm_crtc_handle_vblank(crtc);  	if (!ret)  		DRM_ERROR("vkms failure on handling vblank"); @@ -37,19 +35,11 @@ static void _vblank_handle(struct vkms_output *output)  			DRM_WARN("failed to queue vkms_crc_work_handle");  	} -	spin_unlock(&output->lock); -} - -static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) -{ -	struct vkms_output *output = container_of(timer, struct vkms_output, -						  vblank_hrtimer); -	int ret_overrun; - -	_vblank_handle(output); -  	ret_overrun = hrtimer_forward_now(&output->vblank_hrtimer,  					  output->period_ns); +	WARN_ON(ret_overrun != 1); + +	spin_unlock(&output->lock);  	return HRTIMER_RESTART;  } @@ -87,6 +77,9 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,  	*vblank_time = output->vblank_hrtimer.node.expires; +	if (!in_vblank_irq) +		*vblank_time -= output->period_ns; +  	return true;  } @@ -104,6 +97,7 @@ static void vkms_atomic_crtc_reset(struct drm_crtc *crtc)  	vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);  	if (!vkms_state)  		return; +	INIT_WORK(&vkms_state->crc_work, vkms_crc_work_handle);  	crtc->state = &vkms_state->base;  	crtc->state->crtc = crtc; | 
