drm/nouveau/fifo/gk104-: implement support for PTOP fault info
authorBen Skeggs <bskeggs@redhat.com>
Fri, 8 Apr 2016 07:24:40 +0000 (17:24 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 20 May 2016 04:43:04 +0000 (14:43 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c

index 67d440b374f057bdc6db4435b40d02535e4a2ab6..6e842768f5587d02b405200515cf985688be2d36 100644 (file)
@@ -300,7 +300,7 @@ gk104_fifo_intr_fault(struct gk104_fifo *fifo, int unit)
        struct nvkm_engine *engine = NULL;
        struct nvkm_fifo_chan *chan;
        unsigned long flags;
-       char gpcid[8] = "";
+       char gpcid[8] = "", en[16] = "";
 
        er = nvkm_enum_find(fifo->func->fault.reason, reason);
        eu = nvkm_enum_find(fifo->func->fault.engine, unit);
@@ -328,13 +328,27 @@ gk104_fifo_intr_fault(struct gk104_fifo *fifo, int unit)
                }
        }
 
+       if (eu == NULL) {
+               enum nvkm_devidx engidx = nvkm_top_fault(device->top, unit);
+               if (engidx < NVKM_SUBDEV_NR) {
+                       const char *src = nvkm_subdev_name[engidx];
+                       char *dst = en;
+                       do {
+                               *dst++ = toupper(*src++);
+                       } while(*src);
+                       engine = nvkm_device_engine(device, engidx);
+               }
+       } else {
+               snprintf(en, sizeof(en), "%s", eu->name);
+       }
+
        chan = nvkm_fifo_chan_inst(&fifo->base, (u64)inst << 12, &flags);
 
        nvkm_error(subdev,
                   "%s fault at %010llx engine %02x [%s] client %02x [%s%s] "
                   "reason %02x [%s] on channel %d [%010llx %s]\n",
                   write ? "write" : "read", (u64)vahi << 32 | valo,
-                  unit, eu ? eu->name : "", client, gpcid, ec ? ec->name : "",
+                  unit, en, client, gpcid, ec ? ec->name : "",
                   reason, er ? er->name : "", chan ? chan->chid : -1,
                   (u64)inst << 12,
                   chan ? chan->object.client->name : "unknown");