diff options
author | Ben Skeggs | 2013-05-13 03:09:59 +0200 |
---|---|---|
committer | Ben Skeggs | 2013-05-20 05:24:08 +0200 |
commit | 9426eedb26cfe646a843295ac7f91bf866323f92 (patch) | |
tree | 2bed77d4b17588dd640806cdb710e8e69ab08014 /drivers/gpu/drm/nouveau/core/engine/fifo | |
parent | drm/nvc0/fifo: prevent races between clients updating playlists (diff) | |
download | kernel-qcow2-linux-9426eedb26cfe646a843295ac7f91bf866323f92.tar.gz kernel-qcow2-linux-9426eedb26cfe646a843295ac7f91bf866323f92.tar.xz kernel-qcow2-linux-9426eedb26cfe646a843295ac7f91bf866323f92.zip |
drm/nvc0/fifo: prevent CHAN_TABLE_ERROR:CHANNEL_PENDING on fifo fini
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/core/engine/fifo')
-rw-r--r-- | drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c index 1613193e21e6..46dfa68c47bb 100644 --- a/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c +++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nvc0.c @@ -250,9 +250,17 @@ nvc0_fifo_chan_fini(struct nouveau_object *object, bool suspend) struct nvc0_fifo_priv *priv = (void *)object->engine; struct nvc0_fifo_chan *chan = (void *)object; u32 chid = chan->base.chid; + u32 mask, engine; nv_mask(priv, 0x003004 + (chid * 8), 0x00000001, 0x00000000); nvc0_fifo_playlist_update(priv); + mask = nv_rd32(priv, 0x0025a4); + for (engine = 0; mask && engine < 16; engine++) { + if (!(mask & (1 << engine))) + continue; + nv_mask(priv, 0x0025a8 + (engine * 4), 0x00000000, 0x00000000); + mask &= ~(1 << engine); + } nv_wr32(priv, 0x003000 + (chid * 8), 0x00000000); return nouveau_fifo_channel_fini(&chan->base, suspend); |