diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2014-12-01 11:44:27 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2014-12-02 15:31:40 +1000 |
commit | 42b3b29236de1e0939ee30db459731a4cd7fde30 (patch) | |
tree | 1ba5875914d531035402a142bb92f950c8a1e62a /nvkm | |
parent | cdebd0dd23fe2b4883c6dfe5ccffdc78351cee66 (diff) | |
download | nouveau-42b3b29236de1e0939ee30db459731a4cd7fde30.tar.gz |
fifo/g84-: ack non-stall interrupt before handling it
Closes a very unlikely race that can occur if another NonStallInterrupt
method passes between checking fences and acking the previous interrupt.
With this change, the interrupt will re-fire under such conditions.
Tested-by: Tobias Klausmann <tobias.johannes.klausmann@mni.thm.de>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'nvkm')
-rw-r--r-- | nvkm/engine/fifo/nv04.c | 2 | ||||
-rw-r--r-- | nvkm/engine/fifo/nvc0.c | 4 | ||||
-rw-r--r-- | nvkm/engine/fifo/nve0.c | 2 |
3 files changed, 4 insertions, 4 deletions
diff --git a/nvkm/engine/fifo/nv04.c b/nvkm/engine/fifo/nv04.c index 5ae6a4389..1931057f9 100644 --- a/nvkm/engine/fifo/nv04.c +++ b/nvkm/engine/fifo/nv04.c @@ -551,8 +551,8 @@ nv04_fifo_intr(struct nouveau_subdev *subdev) } if (status & 0x40000000) { - nouveau_fifo_uevent(&priv->base); nv_wr32(priv, 0x002100, 0x40000000); + nouveau_fifo_uevent(&priv->base); status &= ~0x40000000; } } diff --git a/nvkm/engine/fifo/nvc0.c b/nvkm/engine/fifo/nvc0.c index 1fe1f8fbd..074d434c3 100644 --- a/nvkm/engine/fifo/nvc0.c +++ b/nvkm/engine/fifo/nvc0.c @@ -740,6 +740,8 @@ nvc0_fifo_intr_engine_unit(struct nvc0_fifo_priv *priv, int engn) u32 inte = nv_rd32(priv, 0x002628); u32 unkn; + nv_wr32(priv, 0x0025a8 + (engn * 0x04), intr); + for (unkn = 0; unkn < 8; unkn++) { u32 ints = (intr >> (unkn * 0x04)) & inte; if (ints & 0x1) { @@ -751,8 +753,6 @@ nvc0_fifo_intr_engine_unit(struct nvc0_fifo_priv *priv, int engn) nv_mask(priv, 0x002628, ints, 0); } } - - nv_wr32(priv, 0x0025a8 + (engn * 0x04), intr); } static void diff --git a/nvkm/engine/fifo/nve0.c b/nvkm/engine/fifo/nve0.c index d2f0fd39c..f8734eb74 100644 --- a/nvkm/engine/fifo/nve0.c +++ b/nvkm/engine/fifo/nve0.c @@ -952,8 +952,8 @@ nve0_fifo_intr(struct nouveau_subdev *subdev) } if (stat & 0x80000000) { - nve0_fifo_intr_engine(priv); nv_wr32(priv, 0x002100, 0x80000000); + nve0_fifo_intr_engine(priv); stat &= ~0x80000000; } |