Skip to content

Commit

Permalink
drm/nvc0/fence: restore pre-suspend fence buffer context on resume
Browse files Browse the repository at this point in the history
Fixes some unfortunate races on resume.  The G84 version of the code doesn't
need this as "gpuobj"s are automagically suspended/resumed by the core code
whereas pinned buffer objects are not.

Cc: stable@vger.kernel.org
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
  • Loading branch information
Ben Skeggs committed Oct 3, 2012
1 parent a0d271c commit d6ba6d2
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions drivers/gpu/drm/nouveau/nvc0_fence.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
struct nvc0_fence_priv {
struct nouveau_fence_priv base;
struct nouveau_bo *bo;
u32 *suspend;
};

struct nvc0_fence_chan {
Expand Down Expand Up @@ -125,12 +126,36 @@ nvc0_fence_context_new(struct nouveau_channel *chan, int engine)
static int
nvc0_fence_fini(struct drm_device *dev, int engine, bool suspend)
{
struct nouveau_fifo_priv *pfifo = nv_engine(dev, NVOBJ_ENGINE_FIFO);
struct nvc0_fence_priv *priv = nv_engine(dev, engine);
int i;

if (suspend) {
priv->suspend = vmalloc(pfifo->channels * sizeof(u32));
if (!priv->suspend)
return -ENOMEM;

for (i = 0; i < pfifo->channels; i++)
priv->suspend[i] = nouveau_bo_rd32(priv->bo, i);
}

return 0;
}

static int
nvc0_fence_init(struct drm_device *dev, int engine)
{
struct nouveau_fifo_priv *pfifo = nv_engine(dev, NVOBJ_ENGINE_FIFO);
struct nvc0_fence_priv *priv = nv_engine(dev, engine);
int i;

if (priv->suspend) {
for (i = 0; i < pfifo->channels; i++)
nouveau_bo_wr32(priv->bo, i, priv->suspend[i]);
vfree(priv->suspend);
priv->suspend = NULL;
}

return 0;
}

Expand Down

0 comments on commit d6ba6d2

Please sign in to comment.