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;

Reply via email to