From 978605fd06a8954b6dee4535d13540831011bf7e Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 7 Aug 2025 15:44:50 +0200 Subject: [PATCH] ac/gpu_info: add has_smem_with_null_prt_bug Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/common/ac_gpu_info.c | 8 ++++++++ src/amd/common/ac_gpu_info.h | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/amd/common/ac_gpu_info.c b/src/amd/common/ac_gpu_info.c index d69c3ef1d89..a8e1105c666 100644 --- a/src/amd/common/ac_gpu_info.c +++ b/src/amd/common/ac_gpu_info.c @@ -413,6 +413,13 @@ ac_fill_compiler_info(struct radeon_info *info, const struct drm_amdgpu_info_dev out->has_cs_regalloc_hang_bug = info->gfx_level == GFX6 || info->family == CHIP_BONAIRE || info->family == CHIP_KABINI; + + /* On GFX6-8, SMEM loads on a NULL PRT page return garbage instead of zero. + * On GFX10-12, SMEM loads on a NULL PRT page throws a VM fault and hangs the GPU. + * + * Only GFX9 works as expected. + */ + out->has_smem_with_null_prt_bug = info->gfx_level <= GFX12 && info->gfx_level != GFX9; } void @@ -2087,6 +2094,7 @@ void ac_print_gpu_info(FILE *f, const struct radeon_info *info, int fd) fprintf(f, " has_attr_ring_wait_bug = %i\n", info->compiler_info.has_attr_ring_wait_bug); fprintf(f, " has_primid_instancing_bug = %i\n", info->compiler_info.has_primid_instancing_bug); fprintf(f, " has_cs_regalloc_hang_bug = %i\n", info->compiler_info.has_cs_regalloc_hang_bug); + fprintf(f, " has_smem_with_null_prt_bug = %i\n", info->compiler_info.has_smem_with_null_prt_bug); fprintf(f, "Ring info:\n"); if (info->gfx_level >= GFX11) { diff --git a/src/amd/common/ac_gpu_info.h b/src/amd/common/ac_gpu_info.h index 9a0e4677b44..e773e4dfa9e 100644 --- a/src/amd/common/ac_gpu_info.h +++ b/src/amd/common/ac_gpu_info.h @@ -200,8 +200,10 @@ struct ac_compiler_info { uint32_t has_primid_instancing_bug : 1; /* GFX6 and certain GFX7 chips: bug with compute workgroups larger 256 invocations. */ uint32_t has_cs_regalloc_hang_bug : 1; + /* GFX6-GFX12, except GFX9: SMEM loads on NULL PRT page don't work. */ + uint32_t has_smem_with_null_prt_bug : 1; - uint32_t reserved : 4; + uint32_t reserved : 3; }; struct radeon_info {