drm/nouveau/fifo/gk104-: better detection of chid when parsing engine status
authorBen Skeggs <bskeggs@redhat.com>
Mon, 16 Jan 2017 00:36:00 +0000 (10:36 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 17 Feb 2017 07:38:12 +0000 (17:38 +1000)
The previous commit simply changes the interface, but should result in
the same behaviour as previously.  This commit has been split out from
it as it can result in a different channel being selected.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c

index 6d12a2efee117437da2364ae89e9eb33f88ec2a9..32c35397ae64906a0bb32c295164b08e6a6e35ae 100644 (file)
@@ -48,6 +48,7 @@ static void
 gk104_fifo_engine_status(struct gk104_fifo *fifo, int engn,
                         struct gk104_fifo_engine_status *status)
 {
+       struct nvkm_engine *engine = fifo->engine[engn].engine;
        struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
        struct nvkm_device *device = subdev->device;
        u32 stat = nvkm_rd32(device, 0x002640 + (engn * 0x08));
@@ -61,7 +62,24 @@ gk104_fifo_engine_status(struct gk104_fifo *fifo, int engn,
        status->load     = !!(stat & 0x00002000);
        status->prev.tsg = !!(stat & 0x00001000);
        status->prev.id  =   (stat & 0x00000fff);
-       status->chan     = status->load ? &status->next : &status->prev;
+       status->chan     = NULL;
+
+       if (status->busy && status->chsw) {
+               if (status->load && status->save) {
+                       if (engine && nvkm_engine_chsw_load(engine))
+                               status->chan = &status->next;
+                       else
+                               status->chan = &status->prev;
+               } else
+               if (status->load) {
+                       status->chan = &status->next;
+               } else {
+                       status->chan = &status->prev;
+               }
+       } else
+       if (status->load) {
+               status->chan = &status->prev;
+       }
 
        nvkm_debug(subdev, "engine %02d: busy %d faulted %d chsw %d "
                           "save %d load %d %sid %d%s-> %sid %d%s\n",