drm/nouveau/disp/gf119-: decode exception reason to human-readable string
authorBen Skeggs <bskeggs@redhat.com>
Tue, 12 Feb 2019 12:28:13 +0000 (22:28 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 19 Feb 2019 22:59:59 +0000 (08:59 +1000)
We also change the error strings to match NVIDIA's naming.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/gv100.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.h

index 794e90982641e6dc384428885ab078efc96affb3..e675d9b9d5d70f92b342bbea98a233449ffb8b85 100644 (file)
@@ -91,15 +91,21 @@ gf119_disp_intr_error(struct nv50_disp *disp, int chid)
 {
        struct nvkm_subdev *subdev = &disp->base.engine.subdev;
        struct nvkm_device *device = subdev->device;
-       u32 mthd = nvkm_rd32(device, 0x6101f0 + (chid * 12));
+       u32 stat = nvkm_rd32(device, 0x6101f0 + (chid * 12));
+       u32 type = (stat & 0x00007000) >> 12;
+       u32 mthd = (stat & 0x00000ffc);
        u32 data = nvkm_rd32(device, 0x6101f4 + (chid * 12));
-       u32 unkn = nvkm_rd32(device, 0x6101f8 + (chid * 12));
+       u32 code = nvkm_rd32(device, 0x6101f8 + (chid * 12));
+       const struct nvkm_enum *reason =
+               nvkm_enum_find(nv50_disp_intr_error_type, type);
 
-       nvkm_error(subdev, "chid %d mthd %04x data %08x %08x %08x\n",
-                  chid, (mthd & 0x0000ffc), data, mthd, unkn);
+       nvkm_error(subdev, "chid %d stat %08x reason %d [%s] mthd %04x "
+                          "data %08x code %08x\n",
+                  chid, stat, type, reason ? reason->name : "",
+                  mthd, data, code);
 
        if (chid < ARRAY_SIZE(disp->chan)) {
-               switch (mthd & 0xffc) {
+               switch (mthd) {
                case 0x0080:
                        nv50_disp_chan_mthd(disp->chan[chid], NV_DBG_ERROR);
                        break;
index 47be0ba4aebe2df17f6412160c10cdad417e1447..892be6c9b76ca9de64238d1e35567cbd13a65a65 100644 (file)
@@ -103,10 +103,13 @@ gv100_disp_exception(struct nv50_disp *disp, int chid)
        u32 mthd = (stat & 0x00000fff) << 2;
        u32 data = nvkm_rd32(device, 0x611024 + (chid * 12));
        u32 code = nvkm_rd32(device, 0x611028 + (chid * 12));
+       const struct nvkm_enum *reason =
+               nvkm_enum_find(nv50_disp_intr_error_type, type);
 
-       nvkm_error(subdev, "chid %d %08x [type %d mthd %04x] "
+       nvkm_error(subdev, "chid %d stat %08x reason %d [%s] mthd %04x "
                           "data %08x code %08x\n",
-                  chid, stat, type, mthd, data, code);
+                  chid, stat, type, reason ? reason->name : "",
+                  mthd, data, code);
 
        if (chid < ARRAY_SIZE(disp->chan) && disp->chan[chid]) {
                switch (mthd) {
index def005dd5fdaae020fd3ef7404e9f58b5369e082..e21556bf2cb1a1442d4c8d85908a14f03f06c02a 100644 (file)
@@ -28,7 +28,6 @@
 #include "rootnv50.h"
 
 #include <core/client.h>
-#include <core/enum.h>
 #include <core/ramht.h>
 #include <subdev/bios.h>
 #include <subdev/bios/disp.h>
@@ -593,12 +592,15 @@ nv50_disp_super(struct work_struct *work)
        nvkm_wr32(device, 0x610030, 0x80000000);
 }
 
-static const struct nvkm_enum
+const struct nvkm_enum
 nv50_disp_intr_error_type[] = {
-       { 3, "ILLEGAL_MTHD" },
-       { 4, "INVALID_VALUE" },
+       { 0, "NONE" },
+       { 1, "PUSHBUFFER_ERR" },
+       { 2, "TRAP" },
+       { 3, "RESERVED_METHOD" },
+       { 4, "INVALID_ARG" },
        { 5, "INVALID_STATE" },
-       { 7, "INVALID_HANDLE" },
+       { 7, "UNRESOLVABLE_HANDLE" },
        {}
 };
 
index c36a8a7cafa16184585330ddfb7b89c490b4f4dc..e5d00f478bb178f19009034af63d0bd18addbaff 100644 (file)
@@ -5,6 +5,8 @@
 #include "priv.h"
 struct nvkm_head;
 
+#include <core/enum.h>
+
 struct nv50_disp {
        const struct nv50_disp_func *func;
        struct nvkm_disp base;
@@ -71,6 +73,7 @@ int nv50_disp_init(struct nv50_disp *);
 void nv50_disp_fini(struct nv50_disp *);
 void nv50_disp_intr(struct nv50_disp *);
 void nv50_disp_super(struct work_struct *);
+extern const struct nvkm_enum nv50_disp_intr_error_type[];
 
 int gf119_disp_init(struct nv50_disp *);
 void gf119_disp_fini(struct nv50_disp *);