drm/nouveau/fault/gv100-: expose VoltaFaultBufferA
authorBen Skeggs <bskeggs@redhat.com>
Tue, 8 May 2018 10:39:48 +0000 (20:39 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 19 Feb 2019 23:00:01 +0000 (09:00 +1000)
This nvclass exposes the replayable fault buffer, which will be used
by SVM to manage GPU page faults.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvif/class.h
drivers/gpu/drm/nouveau/nvkm/subdev/fault/gv100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fault/tu102.c

index 6c2cbb139318580f3c87aa3c13b590d234a2ad2a..7d556a1c92fac98d173ca7e00064d6f366d829ed 100644 (file)
@@ -55,6 +55,7 @@
 #define VOLTA_USERMODE_A                                             0x0000c361
 
 #define MAXWELL_FAULT_BUFFER_A                        /* clb069.h */ 0x0000b069
+#define VOLTA_FAULT_BUFFER_A                          /* clb069.h */ 0x0000c369
 
 #define NV03_CHANNEL_DMA                              /* cl506b.h */ 0x0000006b
 #define NV10_CHANNEL_DMA                              /* cl506b.h */ 0x0000006e
index 6fc54e17c9354d17f0dba41f2915b0bd72f70728..6747f09c2dc33b1d32a3047b004446e8219ccd3c 100644 (file)
@@ -25,6 +25,8 @@
 #include <subdev/mmu.h>
 #include <engine/fifo.h>
 
+#include <nvif/class.h>
+
 static void
 gv100_fault_buffer_process(struct nvkm_fault_buffer *buffer)
 {
@@ -166,6 +168,13 @@ gv100_fault_intr(struct nvkm_fault *fault)
                }
        }
 
+       if (stat & 0x08000000) {
+               if (fault->buffer[1]) {
+                       nvkm_event_send(&fault->event, 1, 1, NULL, 0);
+                       stat &= ~0x08000000;
+               }
+       }
+
        if (stat) {
                nvkm_debug(subdev, "intr %08x\n", stat);
        }
@@ -208,6 +217,13 @@ gv100_fault = {
        .buffer.init = gv100_fault_buffer_init,
        .buffer.fini = gv100_fault_buffer_fini,
        .buffer.intr = gv100_fault_buffer_intr,
+       /*TODO: Figure out how to expose non-replayable fault buffer, which,
+        *      for some reason, is where recoverable CE faults appear...
+        *
+        *      It's a bit tricky, as both NVKM and SVM will need access to
+        *      the non-replayable fault buffer.
+        */
+       .user = { { 0, 0, VOLTA_FAULT_BUFFER_A }, 1 },
 };
 
 int
index 912425e6238d62eb4f31398baec0617b1e7c6bc6..fa1dfe5692b05773fe4cae8b0df250481712aa82 100644 (file)
@@ -157,6 +157,7 @@ tu102_fault = {
        .buffer.init = tu102_fault_buffer_init,
        .buffer.fini = tu102_fault_buffer_fini,
        .buffer.intr = tu102_fault_buffer_intr,
+       .user = { { 0, 0, VOLTA_FAULT_BUFFER_A }, 1 },
 };
 
 int