@@ -894,14 +894,72 @@ const struct adreno_reglist a730_hwcg[] = {
894894 {},
895895};
896896
897+ const struct adreno_reglist a740_hwcg [] = {
898+ { REG_A6XX_RBBM_CLOCK_CNTL_SP0 , 0x02222222 },
899+ { REG_A6XX_RBBM_CLOCK_CNTL2_SP0 , 0x22022222 },
900+ { REG_A6XX_RBBM_CLOCK_HYST_SP0 , 0x003cf3cf },
901+ { REG_A6XX_RBBM_CLOCK_DELAY_SP0 , 0x00000080 },
902+ { REG_A6XX_RBBM_CLOCK_CNTL_TP0 , 0x22222220 },
903+ { REG_A6XX_RBBM_CLOCK_CNTL2_TP0 , 0x22222222 },
904+ { REG_A6XX_RBBM_CLOCK_CNTL3_TP0 , 0x22222222 },
905+ { REG_A6XX_RBBM_CLOCK_CNTL4_TP0 , 0x00222222 },
906+ { REG_A6XX_RBBM_CLOCK_HYST_TP0 , 0x77777777 },
907+ { REG_A6XX_RBBM_CLOCK_HYST2_TP0 , 0x77777777 },
908+ { REG_A6XX_RBBM_CLOCK_HYST3_TP0 , 0x77777777 },
909+ { REG_A6XX_RBBM_CLOCK_HYST4_TP0 , 0x00077777 },
910+ { REG_A6XX_RBBM_CLOCK_DELAY_TP0 , 0x11111111 },
911+ { REG_A6XX_RBBM_CLOCK_DELAY2_TP0 , 0x11111111 },
912+ { REG_A6XX_RBBM_CLOCK_DELAY3_TP0 , 0x11111111 },
913+ { REG_A6XX_RBBM_CLOCK_DELAY4_TP0 , 0x00011111 },
914+ { REG_A6XX_RBBM_CLOCK_CNTL_UCHE , 0x22222222 },
915+ { REG_A6XX_RBBM_CLOCK_CNTL2_UCHE , 0x00222222 },
916+ { REG_A6XX_RBBM_CLOCK_HYST_UCHE , 0x00000444 },
917+ { REG_A6XX_RBBM_CLOCK_DELAY_UCHE , 0x00000222 },
918+ { REG_A6XX_RBBM_CLOCK_CNTL_RB0 , 0x22222222 },
919+ { REG_A6XX_RBBM_CLOCK_CNTL2_RB0 , 0x01002222 },
920+ { REG_A6XX_RBBM_CLOCK_CNTL_CCU0 , 0x00002220 },
921+ { REG_A6XX_RBBM_CLOCK_HYST_RB_CCU0 , 0x44000f00 },
922+ { REG_A6XX_RBBM_CLOCK_CNTL_RAC , 0x25222022 },
923+ { REG_A6XX_RBBM_CLOCK_CNTL2_RAC , 0x00555555 },
924+ { REG_A6XX_RBBM_CLOCK_DELAY_RAC , 0x00000011 },
925+ { REG_A6XX_RBBM_CLOCK_HYST_RAC , 0x00440044 },
926+ { REG_A6XX_RBBM_CLOCK_CNTL_TSE_RAS_RBBM , 0x04222222 },
927+ { REG_A7XX_RBBM_CLOCK_MODE2_GRAS , 0x00000222 },
928+ { REG_A7XX_RBBM_CLOCK_MODE_BV_GRAS , 0x00222222 },
929+ { REG_A6XX_RBBM_CLOCK_MODE_GPC , 0x02222223 },
930+ { REG_A6XX_RBBM_CLOCK_MODE_VFD , 0x00222222 },
931+ { REG_A7XX_RBBM_CLOCK_MODE_BV_GPC , 0x00222222 },
932+ { REG_A7XX_RBBM_CLOCK_MODE_BV_VFD , 0x00002222 },
933+ { REG_A6XX_RBBM_CLOCK_HYST_TSE_RAS_RBBM , 0x00000000 },
934+ { REG_A6XX_RBBM_CLOCK_HYST_GPC , 0x04104004 },
935+ { REG_A6XX_RBBM_CLOCK_HYST_VFD , 0x00000000 },
936+ { REG_A6XX_RBBM_CLOCK_DELAY_TSE_RAS_RBBM , 0x00000000 },
937+ { REG_A6XX_RBBM_CLOCK_DELAY_GPC , 0x00000200 },
938+ { REG_A6XX_RBBM_CLOCK_DELAY_VFD , 0x00000000 },
939+ { REG_A6XX_RBBM_CLOCK_MODE_HLSQ , 0x00002222 },
940+ { REG_A6XX_RBBM_CLOCK_DELAY_HLSQ , 0x00000000 },
941+ { REG_A6XX_RBBM_CLOCK_HYST_HLSQ , 0x00000000 },
942+ { REG_A7XX_RBBM_CLOCK_MODE_BV_LRZ , 0x55555552 },
943+ { REG_A7XX_RBBM_CLOCK_HYST2_VFD , 0x00000000 },
944+ { REG_A7XX_RBBM_CLOCK_MODE_CP , 0x00000222 },
945+ { REG_A6XX_RBBM_CLOCK_CNTL , 0x8aa8aa82 },
946+ { REG_A6XX_RBBM_ISDB_CNT , 0x00000182 },
947+ { REG_A6XX_RBBM_RAC_THRESHOLD_CNT , 0x00000000 },
948+ { REG_A6XX_RBBM_SP_HYST_CNT , 0x00000000 },
949+ { REG_A6XX_RBBM_CLOCK_CNTL_GMU_GX , 0x00000222 },
950+ { REG_A6XX_RBBM_CLOCK_DELAY_GMU_GX , 0x00000111 },
951+ { REG_A6XX_RBBM_CLOCK_HYST_GMU_GX , 0x00000555 },
952+ {},
953+ };
954+
897955static void a6xx_set_hwcg (struct msm_gpu * gpu , bool state )
898956{
899957 struct adreno_gpu * adreno_gpu = to_adreno_gpu (gpu );
900958 struct a6xx_gpu * a6xx_gpu = to_a6xx_gpu (adreno_gpu );
901959 struct a6xx_gmu * gmu = & a6xx_gpu -> gmu ;
902960 const struct adreno_reglist * reg ;
903961 unsigned int i ;
904- u32 val , clock_cntl_on ;
962+ u32 val , clock_cntl_on , cgc_mode ;
905963
906964 if (!adreno_gpu -> info -> hwcg )
907965 return ;
@@ -914,8 +972,10 @@ static void a6xx_set_hwcg(struct msm_gpu *gpu, bool state)
914972 clock_cntl_on = 0x8aa8aa82 ;
915973
916974 if (adreno_is_a7xx (adreno_gpu )) {
975+ cgc_mode = adreno_is_a740_family (adreno_gpu ) ? 0x20222 : 0x20000 ;
976+
917977 gmu_write (& a6xx_gpu -> gmu , REG_A6XX_GPU_GMU_AO_GMU_CGC_MODE_CNTL ,
918- state ? 0x20000 : 0 );
978+ state ? cgc_mode : 0 );
919979 gmu_write (& a6xx_gpu -> gmu , REG_A6XX_GPU_GMU_AO_GMU_CGC_DELAY_CNTL ,
920980 state ? 0x10111 : 0 );
921981 gmu_write (& a6xx_gpu -> gmu , REG_A6XX_GPU_GMU_AO_GMU_CGC_HYST_CNTL ,
@@ -1179,7 +1239,7 @@ static void a6xx_set_cp_protect(struct msm_gpu *gpu)
11791239 count = ARRAY_SIZE (a660_protect );
11801240 count_max = 48 ;
11811241 BUILD_BUG_ON (ARRAY_SIZE (a660_protect ) > 48 );
1182- } else if (adreno_is_a730 (adreno_gpu )) {
1242+ } else if (adreno_is_a730 (adreno_gpu ) || adreno_is_a740 ( adreno_gpu ) ) {
11831243 regs = a730_protect ;
11841244 count = ARRAY_SIZE (a730_protect );
11851245 count_max = 48 ;
@@ -1252,7 +1312,8 @@ static void a6xx_set_ubwc_config(struct msm_gpu *gpu)
12521312
12531313 if (adreno_is_a650 (adreno_gpu ) ||
12541314 adreno_is_a660 (adreno_gpu ) ||
1255- adreno_is_a730 (adreno_gpu )) {
1315+ adreno_is_a730 (adreno_gpu ) ||
1316+ adreno_is_a740_family (adreno_gpu )) {
12561317 /* TODO: get ddr type from bootloader and use 2 for LPDDR4 */
12571318 hbb_lo = 3 ;
12581319 amsbc = 1 ;
@@ -1545,6 +1606,7 @@ static int hw_init(struct msm_gpu *gpu)
15451606 struct adreno_gpu * adreno_gpu = to_adreno_gpu (gpu );
15461607 struct a6xx_gpu * a6xx_gpu = to_a6xx_gpu (adreno_gpu );
15471608 struct a6xx_gmu * gmu = & a6xx_gpu -> gmu ;
1609+ u64 gmem_range_min ;
15481610 int ret ;
15491611
15501612 if (!adreno_has_gmu_wrapper (adreno_gpu )) {
@@ -1635,11 +1697,13 @@ static int hw_init(struct msm_gpu *gpu)
16351697
16361698 if (!(adreno_is_a650_family (adreno_gpu ) ||
16371699 adreno_is_a730 (adreno_gpu ))) {
1700+ gmem_range_min = adreno_is_a740_family (adreno_gpu ) ? SZ_16M : SZ_1M ;
1701+
16381702 /* Set the GMEM VA range [0x100000:0x100000 + gpu->gmem - 1] */
1639- gpu_write64 (gpu , REG_A6XX_UCHE_GMEM_RANGE_MIN , 0x00100000 );
1703+ gpu_write64 (gpu , REG_A6XX_UCHE_GMEM_RANGE_MIN , gmem_range_min );
16401704
16411705 gpu_write64 (gpu , REG_A6XX_UCHE_GMEM_RANGE_MAX ,
1642- 0x00100000 + adreno_gpu -> info -> gmem - 1 );
1706+ gmem_range_min + adreno_gpu -> info -> gmem - 1 );
16431707 }
16441708
16451709 if (adreno_is_a7xx (adreno_gpu ))
@@ -1704,7 +1768,8 @@ static int hw_init(struct msm_gpu *gpu)
17041768 a6xx_set_ubwc_config (gpu );
17051769
17061770 /* Enable fault detection */
1707- if (adreno_is_a730 (adreno_gpu ))
1771+ if (adreno_is_a730 (adreno_gpu ) ||
1772+ adreno_is_a740_family (adreno_gpu ))
17081773 gpu_write (gpu , REG_A6XX_RBBM_INTERFACE_HANG_INT_CNTL , (1 << 30 ) | 0xcfffff );
17091774 else if (adreno_is_a619 (adreno_gpu ))
17101775 gpu_write (gpu , REG_A6XX_RBBM_INTERFACE_HANG_INT_CNTL , (1 << 30 ) | 0x3fffff );
@@ -2796,7 +2861,8 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev)
27962861 !!(config -> info -> quirks & ADRENO_QUIRK_HAS_HW_APRIV );
27972862
27982863 /* gpu->info only gets assigned in adreno_gpu_init() */
2799- is_a7xx = config -> info -> family == ADRENO_7XX_GEN1 ;
2864+ is_a7xx = config -> info -> family == ADRENO_7XX_GEN1 ||
2865+ config -> info -> family == ADRENO_7XX_GEN2 ;
28002866
28012867 a6xx_llc_slices_init (pdev , a6xx_gpu , is_a7xx );
28022868
0 commit comments