[PATCH 6/6] drm/nouveau/display: Enable vblank irqs after display engine is on again.

Daniel Vetter daniel at ffwll.ch
Sun Feb 14 18:28:07 UTC 2016


On Fri, Feb 12, 2016 at 08:30:32PM +0100, Mario Kleiner wrote:
> In the display resume path, move the calls to drm_vblank_on()
> after the point when the display engine is running again.
> 
> Since changes were made to drm_update_vblank_count() in Linux 4.4+
> to emulate hw vblank counters via vblank timestamping, the function
> drm_vblank_on() now needs working high precision vblank timestamping
> and therefore working scanout position queries at time of call.
> These don't work before the display engine gets restarted, causing
> miscalculation of vblank counter increments and thereby large forward
> jumps in vblank count at display resume. These jumps can cause client
> hangs on resume, or desktop hangs in the case of composited desktops.
> 
> Fix this Linux 4.4 regression by reordering calls accordingly.
> 
> Signed-off-by: Mario Kleiner <mario.kleiner.de at gmail.com>
> Cc: <stable at vger.kernel.org> # 4.4+
> Cc: Ben Skeggs <bskeggs at redhat.com>
> Cc: ville.syrjala at linux.intel.com
> Cc: daniel.vetter at ffwll.ch
> Cc: dri-devel at lists.freedesktop.org
> ---
>  drivers/gpu/drm/nouveau/nouveau_display.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
> index 18676b8..1f8e51b 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_display.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_display.c
> @@ -634,10 +634,6 @@ nouveau_display_resume(struct drm_device *dev, bool runtime)
>  		nv_crtc->lut.depth = 0;
>  	}
>  
> -	/* Make sure that drm and hw vblank irqs get resumed if needed. */
> -	for (head = 0; head < dev->mode_config.num_crtc; head++)
> -		drm_vblank_on(dev, head);
> -
>  	/* This should ensure we don't hit a locking problem when someone
>  	 * wakes us up via a connector.  We should never go into suspend
>  	 * while the display is on anyways.
> @@ -647,6 +643,10 @@ nouveau_display_resume(struct drm_device *dev, bool runtime)
>  
>  	drm_helper_resume_force_mode(dev);
>  
> +	/* Make sure that drm and hw vblank irqs get resumed if needed. */
> +	for (head = 0; head < dev->mode_config.num_crtc; head++)
> +		drm_vblank_on(dev, head);

Hm, imo correct place for these is in the crtc->enable/disable hooks, but
those are only guaranteed to be called symmetrically on atomic drivers.
Anyway as an interim fix this looks good.

Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>

> +
>  	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
>  		struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
>  
> -- 
> 1.9.1
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list