Module: Mesa Branch: main Commit: 5eb8b3e9b11297dafb686ead6578a142abb0eb6d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5eb8b3e9b11297dafb686ead6578a142abb0eb6d
Author: Samuel Pitoiset <[email protected]> Date: Tue Oct 10 10:43:21 2023 +0200 radv/amdgpu: add support quering the last GPUVM fault Signed-off-by: Samuel Pitoiset <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23238> --- src/amd/vulkan/radv_radeon_winsys.h | 8 ++++++++ src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c | 25 +++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h index 2de10750348..6a05a36955a 100644 --- a/src/amd/vulkan/radv_radeon_winsys.h +++ b/src/amd/vulkan/radv_radeon_winsys.h @@ -226,6 +226,12 @@ enum { RADV_BO_PRIORITY_CS = 31, }; +struct radv_winsys_gpuvm_fault_info { + uint64_t addr; + uint32_t status; + uint32_t vmhub; +}; + struct radeon_winsys { void (*destroy)(struct radeon_winsys *ws); @@ -237,6 +243,8 @@ struct radeon_winsys { const char *(*get_chip_name)(struct radeon_winsys *ws); + bool (*query_gpuvm_fault)(struct radeon_winsys *ws, struct radv_winsys_gpuvm_fault_info *fault_info); + VkResult (*buffer_create)(struct radeon_winsys *ws, uint64_t size, unsigned alignment, enum radeon_bo_domain domain, enum radeon_bo_flag flags, unsigned priority, uint64_t address, struct radeon_winsys_bo **out_bo); diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c index b028db7eed9..b280c49d2c7 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c @@ -148,6 +148,30 @@ radv_amdgpu_winsys_get_chip_name(struct radeon_winsys *rws) return amdgpu_get_marketing_name(dev); } +static bool +radv_amdgpu_winsys_query_gpuvm_fault(struct radeon_winsys *rws, struct radv_winsys_gpuvm_fault_info *fault_info) +{ + struct radv_amdgpu_winsys *ws = (struct radv_amdgpu_winsys *)rws; + struct drm_amdgpu_info_gpuvm_fault gpuvm_fault = {0}; + int r; + + r = amdgpu_query_info(ws->dev, AMDGPU_INFO_GPUVM_FAULT, sizeof(gpuvm_fault), &gpuvm_fault); + if (r < 0) { + fprintf(stderr, "radv/amdgpu: Failed to query the last GPUVM fault (%d).\n", r); + return false; + } + + /* When the GPUVM fault status is 0, no faults happened. */ + if (!gpuvm_fault.status) + return false; + + fault_info->addr = gpuvm_fault.addr; + fault_info->status = gpuvm_fault.status; + fault_info->vmhub = gpuvm_fault.vmhub; + + return true; +} + static simple_mtx_t winsys_creation_mutex = SIMPLE_MTX_INITIALIZER; static struct hash_table *winsyses = NULL; @@ -294,6 +318,7 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, ws->base.query_value = radv_amdgpu_winsys_query_value; ws->base.read_registers = radv_amdgpu_winsys_read_registers; ws->base.get_chip_name = radv_amdgpu_winsys_get_chip_name; + ws->base.query_gpuvm_fault = radv_amdgpu_winsys_query_gpuvm_fault; ws->base.destroy = radv_amdgpu_winsys_destroy; ws->base.get_fd = radv_amdgpu_winsys_get_fd; ws->base.get_sync_types = radv_amdgpu_winsys_get_sync_types;
