Commit eaa5ed65 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/fifo/gk104-: reset all engines a killed channel is still active on

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 0faaa47d
...@@ -243,6 +243,7 @@ gk104_fifo_recover_chan(struct nvkm_fifo *base, int chid) ...@@ -243,6 +243,7 @@ gk104_fifo_recover_chan(struct nvkm_fifo *base, int chid)
const u32 stat = nvkm_rd32(device, 0x800004 + (chid * 0x08)); const u32 stat = nvkm_rd32(device, 0x800004 + (chid * 0x08));
const u32 runl = (stat & 0x000f0000) >> 16; const u32 runl = (stat & 0x000f0000) >> 16;
const bool used = (stat & 0x00000001); const bool used = (stat & 0x00000001);
unsigned long engn, engm = fifo->runlist[runl].engm;
struct gk104_fifo_chan *chan; struct gk104_fifo_chan *chan;
assert_spin_locked(&fifo->base.lock); assert_spin_locked(&fifo->base.lock);
...@@ -262,6 +263,18 @@ gk104_fifo_recover_chan(struct nvkm_fifo *base, int chid) ...@@ -262,6 +263,18 @@ gk104_fifo_recover_chan(struct nvkm_fifo *base, int chid)
/* Disable channel. */ /* Disable channel. */
nvkm_wr32(device, 0x800004 + (chid * 0x08), stat | 0x00000800); nvkm_wr32(device, 0x800004 + (chid * 0x08), stat | 0x00000800);
nvkm_warn(subdev, "channel %d: killed\n", chid); nvkm_warn(subdev, "channel %d: killed\n", chid);
/* Block channel assignments from changing during recovery. */
gk104_fifo_recover_runl(fifo, runl);
/* Schedule recovery for any engines the channel is on. */
for_each_set_bit(engn, &engm, fifo->engine_nr) {
struct gk104_fifo_engine_status status;
gk104_fifo_engine_status(fifo, engn, &status);
if (!status.chan || status.chan->id != chid)
continue;
gk104_fifo_recover_engn(fifo, engn);
}
} }
static void static void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment