Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/msm/a6xx: Add A621 support

A621 is a clear A662 derivative (same lineage as A650), no explosions
or sick features, other than a NoC bug which can stall the GPU..

Add support for it.

Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Patchwork: https://patchwork.freedesktop.org/patch/611100/
Signed-off-by: Rob Clark <robdclark@chromium.org>

authored by

Konrad Dybcio and committed by
Rob Clark
dbfbb376 40c297eb

+106 -1
+77 -1
drivers/gpu/drm/msm/adreno/a6xx_catalog.c
··· 129 129 {}, 130 130 }; 131 131 132 + static const struct adreno_reglist a620_hwcg[] = { 133 + {REG_A6XX_RBBM_CLOCK_CNTL_SP0, 0x02222222}, 134 + {REG_A6XX_RBBM_CLOCK_CNTL2_SP0, 0x02222220}, 135 + {REG_A6XX_RBBM_CLOCK_DELAY_SP0, 0x00000080}, 136 + {REG_A6XX_RBBM_CLOCK_HYST_SP0, 0x0000f3cf}, 137 + {REG_A6XX_RBBM_CLOCK_CNTL_TP0, 0x02222222}, 138 + {REG_A6XX_RBBM_CLOCK_CNTL2_TP0, 0x22222222}, 139 + {REG_A6XX_RBBM_CLOCK_CNTL3_TP0, 0x22222222}, 140 + {REG_A6XX_RBBM_CLOCK_CNTL4_TP0, 0x00022222}, 141 + {REG_A6XX_RBBM_CLOCK_DELAY_TP0, 0x11111111}, 142 + {REG_A6XX_RBBM_CLOCK_DELAY2_TP0, 0x11111111}, 143 + {REG_A6XX_RBBM_CLOCK_DELAY3_TP0, 0x11111111}, 144 + {REG_A6XX_RBBM_CLOCK_DELAY4_TP0, 0x00011111}, 145 + {REG_A6XX_RBBM_CLOCK_HYST_TP0, 0x77777777}, 146 + {REG_A6XX_RBBM_CLOCK_HYST2_TP0, 0x77777777}, 147 + {REG_A6XX_RBBM_CLOCK_HYST3_TP0, 0x77777777}, 148 + {REG_A6XX_RBBM_CLOCK_HYST4_TP0, 0x00077777}, 149 + {REG_A6XX_RBBM_CLOCK_CNTL_RB0, 0x22222222}, 150 + {REG_A6XX_RBBM_CLOCK_CNTL2_RB0, 0x01002222}, 151 + {REG_A6XX_RBBM_CLOCK_CNTL_CCU0, 0x00002220}, 152 + {REG_A6XX_RBBM_CLOCK_HYST_RB_CCU0, 0x00040f00}, 153 + {REG_A6XX_RBBM_CLOCK_CNTL_RAC, 0x25222022}, 154 + {REG_A6XX_RBBM_CLOCK_CNTL2_RAC, 0x00005555}, 155 + {REG_A6XX_RBBM_CLOCK_DELAY_RAC, 0x00000011}, 156 + {REG_A6XX_RBBM_CLOCK_HYST_RAC, 0x00445044}, 157 + {REG_A6XX_RBBM_CLOCK_CNTL_TSE_RAS_RBBM, 0x04222222}, 158 + {REG_A6XX_RBBM_CLOCK_MODE_VFD, 0x00002222}, 159 + {REG_A6XX_RBBM_CLOCK_MODE_GPC, 0x00222222}, 160 + {REG_A6XX_RBBM_CLOCK_DELAY_HLSQ_2, 0x00000002}, 161 + {REG_A6XX_RBBM_CLOCK_MODE_HLSQ, 0x00002222}, 162 + {REG_A6XX_RBBM_CLOCK_DELAY_TSE_RAS_RBBM, 0x00004000}, 163 + {REG_A6XX_RBBM_CLOCK_DELAY_VFD, 0x00002222}, 164 + {REG_A6XX_RBBM_CLOCK_DELAY_GPC, 0x00000200}, 165 + {REG_A6XX_RBBM_CLOCK_DELAY_HLSQ, 0x00000000}, 166 + {REG_A6XX_RBBM_CLOCK_HYST_TSE_RAS_RBBM, 0x00000000}, 167 + {REG_A6XX_RBBM_CLOCK_HYST_VFD, 0x00000000}, 168 + {REG_A6XX_RBBM_CLOCK_HYST_GPC, 0x04104004}, 169 + {REG_A6XX_RBBM_CLOCK_HYST_HLSQ, 0x00000000}, 170 + {REG_A6XX_RBBM_CLOCK_CNTL_TEX_FCHE, 0x00000222}, 171 + {REG_A6XX_RBBM_CLOCK_DELAY_TEX_FCHE, 0x00000111}, 172 + {REG_A6XX_RBBM_CLOCK_HYST_TEX_FCHE, 0x00000777}, 173 + {REG_A6XX_RBBM_CLOCK_CNTL_UCHE, 0x22222222}, 174 + {REG_A6XX_RBBM_CLOCK_HYST_UCHE, 0x00000004}, 175 + {REG_A6XX_RBBM_CLOCK_DELAY_UCHE, 0x00000002}, 176 + {REG_A6XX_RBBM_ISDB_CNT, 0x00000182}, 177 + {REG_A6XX_RBBM_RAC_THRESHOLD_CNT, 0x00000000}, 178 + {REG_A6XX_RBBM_SP_HYST_CNT, 0x00000000}, 179 + {REG_A6XX_RBBM_CLOCK_CNTL_GMU_GX, 0x00000222}, 180 + {REG_A6XX_RBBM_CLOCK_DELAY_GMU_GX, 0x00000111}, 181 + {REG_A6XX_RBBM_CLOCK_HYST_GMU_GX, 0x00000555}, 182 + {}, 183 + }; 184 + 132 185 static const struct adreno_reglist a630_hwcg[] = { 133 186 {REG_A6XX_RBBM_CLOCK_CNTL_SP0, 0x22222222}, 134 187 {REG_A6XX_RBBM_CLOCK_CNTL_SP1, 0x22222222}, ··· 543 490 }; 544 491 DECLARE_ADRENO_PROTECT(a630_protect, 32); 545 492 546 - /* These are for a620 and a650 */ 547 493 static const u32 a650_protect_regs[] = { 548 494 A6XX_PROTECT_RDONLY(0x00000, 0x04ff), 549 495 A6XX_PROTECT_RDONLY(0x00501, 0x0005), ··· 854 802 { 138, 3 }, 855 803 { 169, 2 }, 856 804 { 180, 1 }, 805 + ), 806 + }, { 807 + .chip_ids = ADRENO_CHIP_IDS(0x06020100), 808 + .family = ADRENO_6XX_GEN3, 809 + .fw = { 810 + [ADRENO_FW_SQE] = "a650_sqe.fw", 811 + [ADRENO_FW_GMU] = "a621_gmu.bin", 812 + }, 813 + .gmem = SZ_512K, 814 + .inactive_period = DRM_MSM_INACTIVE_PERIOD, 815 + .quirks = ADRENO_QUIRK_HAS_CACHED_COHERENT | 816 + ADRENO_QUIRK_HAS_HW_APRIV, 817 + .init = a6xx_gpu_init, 818 + .zapfw = "a620_zap.mbn", 819 + .a6xx = &(const struct a6xx_info) { 820 + .hwcg = a620_hwcg, 821 + .protect = &a650_protect, 822 + .gmu_cgc_mode = 0x00020200, 823 + .prim_fifo_threshold = 0x00010000, 824 + }, 825 + .address_space_size = SZ_16G, 826 + .speedbins = ADRENO_SPEEDBINS( 827 + { 0, 0 }, 828 + { 137, 1 }, 857 829 ), 858 830 }, { 859 831 .chip_ids = ADRENO_CHIP_IDS(
+18
drivers/gpu/drm/msm/adreno/a6xx_gmu.c
··· 423 423 return a6xx_gmu_set_oob(gmu, GMU_OOB_BOOT_SLUMBER); 424 424 } 425 425 426 + static void a6xx_gemnoc_workaround(struct a6xx_gmu *gmu) 427 + { 428 + struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu); 429 + struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; 430 + 431 + /* 432 + * GEMNoC can power collapse whilst the GPU is being powered down, resulting 433 + * in the power down sequence not being fully executed. That in turn can 434 + * prevent CX_GDSC from collapsing. Assert Qactive to avoid this. 435 + */ 436 + if (adreno_is_a621(adreno_gpu) || adreno_is_7c3(adreno_gpu)) 437 + gmu_write(gmu, REG_A6XX_GMU_AO_AHB_FENCE_CTRL, BIT(0)); 438 + } 439 + 426 440 /* Let the GMU know that we are about to go into slumber */ 427 441 static int a6xx_gmu_notify_slumber(struct a6xx_gmu *gmu) 428 442 { ··· 470 456 } 471 457 472 458 out: 459 + a6xx_gemnoc_workaround(gmu); 460 + 473 461 /* Put fence into allow mode */ 474 462 gmu_write(gmu, REG_A6XX_GMU_AO_AHB_FENCE_CTRL, 0); 475 463 return ret; ··· 960 944 961 945 /* Force off SPTP in case the GMU is managing it */ 962 946 a6xx_sptprac_disable(gmu); 947 + 948 + a6xx_gemnoc_workaround(gmu); 963 949 964 950 /* Make sure there are no outstanding RPMh votes */ 965 951 a6xx_gmu_rpmh_off(gmu);
+6
drivers/gpu/drm/msm/adreno/a6xx_gpu.c
··· 516 516 if (adreno_is_a619_holi(gpu)) 517 517 gpu->ubwc_config.highest_bank_bit = 13; 518 518 519 + if (adreno_is_a621(gpu)) { 520 + gpu->ubwc_config.highest_bank_bit = 13; 521 + gpu->ubwc_config.amsbc = 1; 522 + gpu->ubwc_config.uavflagprd_inv = 2; 523 + } 524 + 519 525 if (adreno_is_a640_family(gpu)) 520 526 gpu->ubwc_config.amsbc = 1; 521 527
+5
drivers/gpu/drm/msm/adreno/adreno_gpu.h
··· 414 414 return adreno_is_a619(gpu) && adreno_has_gmu_wrapper(gpu); 415 415 } 416 416 417 + static inline int adreno_is_a621(const struct adreno_gpu *gpu) 418 + { 419 + return gpu->info->chip_ids[0] == 0x06020100; 420 + } 421 + 417 422 static inline int adreno_is_a630(const struct adreno_gpu *gpu) 418 423 { 419 424 return adreno_is_revn(gpu, 630);