[PATCH] drm/nouveau: fix suspend bug in nvc0 fence implementation

Marcin Slusarz marcin.slusarz at gmail.com
Tue Feb 19 11:49:38 PST 2013


On Tue, Feb 19, 2013 at 10:20:55AM +0000, Maarten Lankhorst wrote:
> Everywhere else the constant is multiplied by 16/4, so it looks like
> nvc0_fence_suspend/resume is buggy here.
> 
> Signed-off-by: Maarten Lankhorst <m.b.lankhorst at gmail.com>
> Cc: stable at vger.kernel.org [3.7+]

Yay. It will probably fix https://bugs.freedesktop.org/show_bug.cgi?id=59168.
(note: it doesn't apply on top of nouveau/master)

Reviewed-by: Marcin Slusarz <marcin.slusarz at gmail.com>

> ---
> 
> diff --git a/drivers/gpu/drm/nouveau/nvc0_fence.c
> b/drivers/gpu/drm/nouveau/nvc0_fence.c
> index 85a0e78..4f46d8b 100644
> --- a/drivers/gpu/drm/nouveau/nvc0_fence.c
> +++ b/drivers/gpu/drm/nouveau/nvc0_fence.c
> @@ -161,11 +161,12 @@ nvc0_fence_suspend(struct nouveau_drm *drm)
>  	struct nouveau_fifo *pfifo = nouveau_fifo(drm->device);
>  	struct nvc0_fence_priv *priv = drm->fence;
>  	int i;
> +	u32 chan = pfifo->max + 1;
> 
> -	priv->suspend = vmalloc((pfifo->max + 1) * sizeof(u32));
> +	priv->suspend = vmalloc(chan * sizeof(u32));
>  	if (priv->suspend) {
> -		for (i = 0; i <= pfifo->max; i++)
> -			priv->suspend[i] = nouveau_bo_rd32(priv->bo, i);
> +		for (i = 0; i < chan; i++)
> +			priv->suspend[i] = nouveau_bo_rd32(priv->bo, i * 16/4);
>  	}
> 
>  	return priv->suspend != NULL;
> @@ -177,10 +178,11 @@ nvc0_fence_resume(struct nouveau_drm *drm)
>  	struct nouveau_fifo *pfifo = nouveau_fifo(drm->device);
>  	struct nvc0_fence_priv *priv = drm->fence;
>  	int i;
> +	u32 chan = pfifo->max + 1;
> 
>  	if (priv->suspend) {
> -		for (i = 0; i <= pfifo->max; i++)
> -			nouveau_bo_wr32(priv->bo, i, priv->suspend[i]);
> +		for (i = 0; i < chan; i++)
> +			nouveau_bo_wr32(priv->bo, i * 16/4, priv->suspend[i]);
>  		vfree(priv->suspend);
>  		priv->suspend = NULL;
>  	}


More information about the dri-devel mailing list