diff options
Diffstat (limited to 'src/amd/vulkan')
-rw-r--r-- | src/amd/vulkan/radv_debug.c | 13 | ||||
-rw-r--r-- | src/amd/vulkan/radv_private.h | 3 |
2 files changed, 16 insertions, 0 deletions
diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c index 4024f75da88..949eeea2f36 100644 --- a/src/amd/vulkan/radv_debug.c +++ b/src/amd/vulkan/radv_debug.c @@ -28,6 +28,7 @@ #include <stdlib.h> #include <stdio.h> +#include "ac_debug.h" #include "radv_debug.h" bool @@ -44,6 +45,9 @@ radv_init_trace(struct radv_device *device) if (!device->trace_id_ptr) return false; + ac_vm_fault_occured(device->physical_device->rad_info.chip_class, + &device->dmesg_timestamp, NULL); + return true; } @@ -80,9 +84,18 @@ radv_gpu_hang_occured(struct radv_queue *queue) void radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_winsys_cs *cs) { + struct radv_device *device = queue->device; + uint64_t addr; + if (!radv_gpu_hang_occured(queue)) return; + if (ac_vm_fault_occured(device->physical_device->rad_info.chip_class, + &device->dmesg_timestamp, &addr)) { + fprintf(stderr, "VM fault report.\n\n"); + fprintf(stderr, "Failing VM page: 0x%08"PRIx64"\n\n", addr); + } + radv_dump_trace(queue->device, cs); abort(); } diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 73f7bdbe8a0..28e70e69150 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -555,6 +555,9 @@ struct radv_device { uint32_t fmask_mrt_offset_counter; struct list_head shader_slabs; mtx_t shader_slab_mutex; + + /* For detecting VM faults reported by dmesg. */ + uint64_t dmesg_timestamp; }; struct radv_device_memory { |