]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/msm/a690: Fix reg values for a690
authorDanylo Piliaiev <dpiliaiev@igalia.com>
Sat, 25 Nov 2023 19:11:51 +0000 (11:11 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Feb 2024 20:16:57 +0000 (20:16 +0000)
[ Upstream commit 07e6de738aa6f0e873463e9ca88bdb7081c4bfd4 ]

KGSL doesn't support a690 so all reg values were the same as
on a660. Now we know the values and they are different from the
windows driver.

This fixes hangs on D3D12 games and some CTS tests.

Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Signed-off-by: Rob Clark <robdclark@chromium.org>
Patchwork: https://patchwork.freedesktop.org/patch/568931/
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/msm/adreno/a6xx_gpu.c

index 7a0220d29a235b34334092fc6a1d12a6f2e1312b..500ed2d183fcc7b366a6db5c73ad59162a53413c 100644 (file)
@@ -1312,6 +1312,7 @@ static void a6xx_set_ubwc_config(struct msm_gpu *gpu)
 
        if (adreno_is_a650(adreno_gpu) ||
            adreno_is_a660(adreno_gpu) ||
+           adreno_is_a690(adreno_gpu) ||
            adreno_is_a730(adreno_gpu) ||
            adreno_is_a740_family(adreno_gpu)) {
                /* TODO: get ddr type from bootloader and use 2 for LPDDR4 */
@@ -1321,13 +1322,6 @@ static void a6xx_set_ubwc_config(struct msm_gpu *gpu)
                uavflagprd_inv = 2;
        }
 
-       if (adreno_is_a690(adreno_gpu)) {
-               hbb_lo = 2;
-               amsbc = 1;
-               rgb565_predicator = 1;
-               uavflagprd_inv = 2;
-       }
-
        if (adreno_is_7c3(adreno_gpu)) {
                hbb_lo = 1;
                amsbc = 1;
@@ -1741,7 +1735,9 @@ static int hw_init(struct msm_gpu *gpu)
        /* Setting the primFifo thresholds default values,
         * and vccCacheSkipDis=1 bit (0x200) for A640 and newer
        */
-       if (adreno_is_a650(adreno_gpu) || adreno_is_a660(adreno_gpu) || adreno_is_a690(adreno_gpu))
+       if (adreno_is_a690(adreno_gpu))
+               gpu_write(gpu, REG_A6XX_PC_DBG_ECO_CNTL, 0x00800200);
+       else if (adreno_is_a650(adreno_gpu) || adreno_is_a660(adreno_gpu))
                gpu_write(gpu, REG_A6XX_PC_DBG_ECO_CNTL, 0x00300200);
        else if (adreno_is_a640_family(adreno_gpu) || adreno_is_7c3(adreno_gpu))
                gpu_write(gpu, REG_A6XX_PC_DBG_ECO_CNTL, 0x00200200);
@@ -1775,6 +1771,8 @@ static int hw_init(struct msm_gpu *gpu)
        if (adreno_is_a730(adreno_gpu) ||
            adreno_is_a740_family(adreno_gpu))
                gpu_write(gpu, REG_A6XX_RBBM_INTERFACE_HANG_INT_CNTL, (1 << 30) | 0xcfffff);
+       else if (adreno_is_a690(adreno_gpu))
+               gpu_write(gpu, REG_A6XX_RBBM_INTERFACE_HANG_INT_CNTL, (1 << 30) | 0x4fffff);
        else if (adreno_is_a619(adreno_gpu))
                gpu_write(gpu, REG_A6XX_RBBM_INTERFACE_HANG_INT_CNTL, (1 << 30) | 0x3fffff);
        else if (adreno_is_a610(adreno_gpu))
@@ -1808,12 +1806,17 @@ static int hw_init(struct msm_gpu *gpu)
        a6xx_set_cp_protect(gpu);
 
        if (adreno_is_a660_family(adreno_gpu)) {
-               gpu_write(gpu, REG_A6XX_CP_CHICKEN_DBG, 0x1);
+               if (adreno_is_a690(adreno_gpu))
+                       gpu_write(gpu, REG_A6XX_CP_CHICKEN_DBG, 0x00028801);
+               else
+                       gpu_write(gpu, REG_A6XX_CP_CHICKEN_DBG, 0x1);
                gpu_write(gpu, REG_A6XX_RBBM_GBIF_CLIENT_QOS_CNTL, 0x0);
        }
 
+       if (adreno_is_a690(adreno_gpu))
+               gpu_write(gpu, REG_A6XX_UCHE_CMDQ_CONFIG, 0x90);
        /* Set dualQ + disable afull for A660 GPU */
-       if (adreno_is_a660(adreno_gpu))
+       else if (adreno_is_a660(adreno_gpu))
                gpu_write(gpu, REG_A6XX_UCHE_CMDQ_CONFIG, 0x66906);
        else if (adreno_is_a7xx(adreno_gpu))
                gpu_write(gpu, REG_A6XX_UCHE_CMDQ_CONFIG,