[PATCH] drm/nouveau: fix suspend bug in nvc0 fence implementation
Maarten Lankhorst
m.b.lankhorst at gmail.com
Tue Feb 19 02:20:55 PST 2013
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+]
---
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