radv/amdgpu: add support quering the last GPUVM fault

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23238>
This commit is contained in:
Samuel Pitoiset 2023-10-10 10:43:21 +02:00 committed by Marge Bot
parent bdc62108be
commit 5eb8b3e9b1
2 changed files with 33 additions and 0 deletions

View file

@ -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);

View file

@ -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;