drm/nouveau/sec2: dump tracepc info on halt
authorBen Skeggs <bskeggs@redhat.com>
Wed, 1 Jun 2022 10:47:53 +0000 (20:47 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 9 Nov 2022 00:44:58 +0000 (10:44 +1000)
- useful to distinguish between different issues.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/core/falcon.h
drivers/gpu/drm/nouveau/nvkm/engine/sec2/gp102.c
drivers/gpu/drm/nouveau/nvkm/falcon/gm200.c

index 4c8b668bacb454f6d9b7eb10c98cba6319daa8fc..4868d2cb796f8f3905480c5a34ebb9dedf7d4ab2 100644 (file)
@@ -47,6 +47,7 @@ void gm200_flcn_bind_inst(struct nvkm_falcon *, int, u64);
 int gm200_flcn_bind_stat(struct nvkm_falcon *, bool);
 extern const struct nvkm_falcon_func_pio gm200_flcn_imem_pio;
 extern const struct nvkm_falcon_func_pio gm200_flcn_dmem_pio;
+void gm200_flcn_tracepc(struct nvkm_falcon *);
 
 int gp102_flcn_reset_eng(struct nvkm_falcon *);
 extern const struct nvkm_falcon_func_pio gp102_flcn_emem_pio;
index a5c987ce58ed5d73972bc2572dc8bcae589cba03..b1e74bc49d7286138a00638f916c278688619777 100644 (file)
@@ -178,6 +178,11 @@ gp102_sec2_intr(struct nvkm_inth *inth)
        }
 
        if (intr & 0x00000010) {
+               if (atomic_read(&sec2->running)) {
+                       FLCN_ERR(falcon, "halted");
+                       gm200_flcn_tracepc(falcon);
+               }
+
                nvkm_falcon_wr32(falcon, 0x004, 0x00000010);
                intr &= ~0x00000010;
        }
index b6150677610586589d4d32c6128a86695bfde618..af53cbbc632ca63fd0cee05f90992b85ab91ccc6 100644 (file)
 #include <subdev/mc.h>
 #include <subdev/timer.h>
 
+void
+gm200_flcn_tracepc(struct nvkm_falcon *falcon)
+{
+       u32 sctl = nvkm_falcon_rd32(falcon, 0x240);
+       u32 tidx = nvkm_falcon_rd32(falcon, 0x148);
+       int nr = (tidx & 0x00ff0000) >> 16, sp, ip;
+
+       FLCN_ERR(falcon, "TRACEPC SCTL %08x TIDX %08x", sctl, tidx);
+       for (sp = 0; sp < nr; sp++) {
+               nvkm_falcon_wr32(falcon, 0x148, sp);
+               ip = nvkm_falcon_rd32(falcon, 0x14c);
+               FLCN_ERR(falcon, "TRACEPC: %08x", ip);
+       }
+}
+
 static void
 gm200_flcn_pio_dmem_rd(struct nvkm_falcon *falcon, u8 port, const u8 *img, int len)
 {