Patches 2-10:

Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>


On 10.07.2017 23:21, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

---
  src/gallium/drivers/radeonsi/si_debug.c | 29 +++++++++++++++++++++++------
  1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_debug.c 
b/src/gallium/drivers/radeonsi/si_debug.c
index 0d26ce5..06dea61 100644
--- a/src/gallium/drivers/radeonsi/si_debug.c
+++ b/src/gallium/drivers/radeonsi/si_debug.c
@@ -859,21 +859,21 @@ static void si_dump_dma(struct si_context *sctx,
        for (i = 0; i < saved->num_dw; ++i) {
                fprintf(f, " %08x\n", saved->ib[i]);
        }
fprintf(f, "------------------- %s end -------------------\n", ib_name);
        fprintf(f, "\n");
fprintf(f, "SDMA Dump Done.\n");
  }
-static bool si_vm_fault_occured(struct si_context *sctx, uint32_t *out_addr)
+static bool si_vm_fault_occured(struct si_context *sctx, uint64_t *out_addr)
  {
        char line[2000];
        unsigned sec, usec;
        int progress = 0;
        uint64_t timestamp = 0;
        bool fault = false;
FILE *p = popen("dmesg", "r");
        if (!p)
                return false;
@@ -914,32 +914,49 @@ static bool si_vm_fault_occured(struct si_context *sctx, 
uint32_t *out_addr)
                        line[len-1] = 0;
/* Get the message part. */
                msg = strchr(line, ']');
                if (!msg) {
                        assert(0);
                        continue;
                }
                msg++;
+ const char *header_line, *addr_line_prefix, *addr_line_format;
+
+               if (sctx->b.chip_class >= GFX9) {
+                       /* Match this:
+                        * ..: [gfxhub] VMC page fault (src_id:0 ring:158 
vm_id:2 pas_id:0)
+                        * ..:   at page 0x0000000219f8f000 from 27
+                        * ..: VM_L2_PROTECTION_FAULT_STATUS:0x0020113C
+                        */
+                       header_line = "VMC page fault";
+                       addr_line_prefix = "   at page";
+                       addr_line_format = "%"PRIx64;
+               } else {
+                       header_line = "GPU fault detected:";
+                       addr_line_prefix = "VM_CONTEXT1_PROTECTION_FAULT_ADDR";
+                       addr_line_format = "%"PRIX64;
+               }
+
                switch (progress) {
                case 0:
-                       if (strstr(msg, "GPU fault detected:"))
+                       if (strstr(msg, header_line))
                                progress = 1;
                        break;
                case 1:
-                       msg = strstr(msg, "VM_CONTEXT1_PROTECTION_FAULT_ADDR");
+                       msg = strstr(msg, addr_line_prefix);
                        if (msg) {
                                msg = strstr(msg, "0x");
                                if (msg) {
                                        msg += 2;
-                                       if (sscanf(msg, "%X", out_addr) == 1)
+                                       if (sscanf(msg, addr_line_format, 
out_addr) == 1)
                                                fault = true;
                                }
                        }
                        progress = 0;
                        break;
                default:
                        progress = 0;
                }
        }
        pclose(p);
@@ -948,37 +965,37 @@ static bool si_vm_fault_occured(struct si_context *sctx, 
uint32_t *out_addr)
                sctx->dmesg_timestamp = timestamp;
        return fault;
  }
void si_check_vm_faults(struct r600_common_context *ctx,
                        struct radeon_saved_cs *saved, enum ring_type ring)
  {
        struct si_context *sctx = (struct si_context *)ctx;
        struct pipe_screen *screen = sctx->b.b.screen;
        FILE *f;
-       uint32_t addr;
+       uint64_t addr;
        char cmd_line[4096];
if (!si_vm_fault_occured(sctx, &addr))
                return;
f = dd_get_debug_file(false);
        if (!f)
                return;
fprintf(f, "VM fault report.\n\n");
        if (os_get_command_line(cmd_line, sizeof(cmd_line)))
                fprintf(f, "Command: %s\n", cmd_line);
        fprintf(f, "Driver vendor: %s\n", screen->get_vendor(screen));
        fprintf(f, "Device vendor: %s\n", screen->get_device_vendor(screen));
        fprintf(f, "Device name: %s\n\n", screen->get_name(screen));
-       fprintf(f, "Failing VM page: 0x%08x\n\n", addr);
+       fprintf(f, "Failing VM page: 0x%08"PRIx64"\n\n", addr);
if (sctx->apitrace_call_number)
                fprintf(f, "Last apitrace call: %u\n\n",
                        sctx->apitrace_call_number);
switch (ring) {
        case RING_GFX:
                si_dump_debug_state(&sctx->b.b, f,
                                    PIPE_DUMP_CURRENT_STATES |
                                    PIPE_DUMP_CURRENT_SHADERS |



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to