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 | -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev