drm/nouveau/fifo/gk104-: directly use new recovery code for ctxsw timeout
authorBen Skeggs <bskeggs@redhat.com>
Wed, 18 Jan 2017 06:03:44 +0000 (16:03 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 17 Feb 2017 07:38:14 +0000 (17:38 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c

index 4422891d3a8654ce63ea1d63045e692363355472..52aedd891e807a66a5f97aeee654a9058b40c4b4 100644 (file)
@@ -305,20 +305,6 @@ gk104_fifo_recover_engn(struct gk104_fifo *fifo, int engn)
        schedule_work(&fifo->recover.work);
 }
 
-static void
-gk104_fifo_recover(struct gk104_fifo *fifo, struct nvkm_engine *engine,
-                  struct gk104_fifo_chan *chan)
-{
-       int engn;
-       for (engn = 0; engn < fifo->engine_nr; engn++) {
-               if (fifo->engine[engn].engine == engine) {
-                       gk104_fifo_recover_engn(fifo, engn);
-                       break;
-               }
-       }
-       gk104_fifo_recover_chan(&fifo->base, chan->base.chid);
-}
-
 static const struct nvkm_enum
 gk104_fifo_bind_reason[] = {
        { 0x01, "BIND_NOT_UNBOUND" },
@@ -352,27 +338,23 @@ gk104_fifo_sched_reason[] = {
 static void
 gk104_fifo_intr_sched_ctxsw(struct gk104_fifo *fifo)
 {
-       struct gk104_fifo_chan *chan;
-       unsigned long flags;
+       unsigned long flags, engm = 0;
        u32 engn;
 
        spin_lock_irqsave(&fifo->base.lock, flags);
        for (engn = 0; engn < fifo->engine_nr; engn++) {
-               struct nvkm_engine *engine = fifo->engine[engn].engine;
-               int runl = fifo->engine[engn].runl;
                struct gk104_fifo_engine_status status;
 
                gk104_fifo_engine_status(fifo, engn, &status);
                if (!status.busy || !status.chsw)
                        continue;
 
-               list_for_each_entry(chan, &fifo->runlist[runl].chan, head) {
-                       if (chan->base.chid == status.chan->id && engine) {
-                               gk104_fifo_recover(fifo, engine, chan);
-                               break;
-                       }
-               }
+               engm |= BIT(engn);
        }
+
+       for_each_set_bit(engn, &engm, fifo->engine_nr)
+               gk104_fifo_recover_engn(fifo, engn);
+
        spin_unlock_irqrestore(&fifo->base.lock, flags);
 }