[PATCH 2/4] drm/msm/a6xx: Fix GMEM range on a680
From: Val Packett
Date: Mon Nov 02 2026 - 20:16:03 EST
On a680, the GMEM range starts at 0, like on newer generations.
Trying to use the 1M value results in texture corruption in Vulkan.
Fix the wrong range by introducing checks specific to this model.
Link: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/15349
Fixes: 4b565ca5a2cb ("drm/msm: Add A6XX device support")
Signed-off-by: Val Packett <val@xxxxxxxxxxxx>
---
I have tried adding it to the if (!(..)) condition i.e. not
touching the REG_A6XX_UCHE_GMEM_RANGE_* at all -- that just
made launching gtk4-demo instantly hang the system..
So the only thing that works and solves the issue
is actually writing the zero for the start.
---
drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 7 +++++--
drivers/gpu/drm/msm/adreno/adreno_gpu.c | 3 ++-
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
index 3e4afaa5345f..26440a3ccecb 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
@@ -1279,8 +1279,11 @@ static int hw_init(struct msm_gpu *gpu)
if (!(adreno_is_a650_family(adreno_gpu) ||
adreno_is_a702(adreno_gpu) ||
adreno_is_a730(adreno_gpu))) {
- gmem_range_min = (adreno_is_a740_family(adreno_gpu) ||
- adreno_is_a722(adreno_gpu)) ? SZ_16M : SZ_1M;
+ gmem_range_min = SZ_1M;
+ if (adreno_is_a740_family(adreno_gpu) || adreno_is_a722(adreno_gpu))
+ gmem_range_min = SZ_16M;
+ else if (adreno_is_a680(adreno_gpu))
+ gmem_range_min = 0;
/* Set the GMEM VA range [0x100000:0x100000 + gpu->gmem - 1] */
gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MIN, gmem_range_min);
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index dadfe4c69438..67bd66c78424 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -382,7 +382,8 @@ int adreno_get_param(struct msm_gpu *gpu, struct msm_context *ctx,
*value = adreno_gpu->gmem;
return 0;
case MSM_PARAM_GMEM_BASE:
- if (adreno_gpu->info->family >= ADRENO_6XX_GEN3)
+ if (adreno_gpu->info->family >= ADRENO_6XX_GEN3 ||
+ adreno_is_a680(adreno_gpu))
*value = 0;
else
*value = 0x100000;
--
2.56.0