diff options
Diffstat (limited to 'drivers/gpu/drm/msm/adreno/a2xx_gpu.c')
-rw-r--r-- | drivers/gpu/drm/msm/adreno/a2xx_gpu.c | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c b/drivers/gpu/drm/msm/adreno/a2xx_gpu.c index 5eddcf14eeb9..1f83bc18d500 100644 --- a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a2xx_gpu.c | |||
@@ -2,6 +2,8 @@ | |||
2 | /* Copyright (c) 2018 The Linux Foundation. All rights reserved. */ | 2 | /* Copyright (c) 2018 The Linux Foundation. All rights reserved. */ |
3 | 3 | ||
4 | #include "a2xx_gpu.h" | 4 | #include "a2xx_gpu.h" |
5 | #include "msm_gem.h" | ||
6 | #include "msm_mmu.h" | ||
5 | 7 | ||
6 | extern bool hang_debug; | 8 | extern bool hang_debug; |
7 | 9 | ||
@@ -58,9 +60,12 @@ static bool a2xx_me_init(struct msm_gpu *gpu) | |||
58 | static int a2xx_hw_init(struct msm_gpu *gpu) | 60 | static int a2xx_hw_init(struct msm_gpu *gpu) |
59 | { | 61 | { |
60 | struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); | 62 | struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); |
63 | dma_addr_t pt_base, tran_error; | ||
61 | uint32_t *ptr, len; | 64 | uint32_t *ptr, len; |
62 | int i, ret; | 65 | int i, ret; |
63 | 66 | ||
67 | msm_gpummu_params(gpu->aspace->mmu, &pt_base, &tran_error); | ||
68 | |||
64 | DBG("%s", gpu->name); | 69 | DBG("%s", gpu->name); |
65 | 70 | ||
66 | /* halt ME to avoid ucode upload issues on a20x */ | 71 | /* halt ME to avoid ucode upload issues on a20x */ |
@@ -80,9 +85,34 @@ static int a2xx_hw_init(struct msm_gpu *gpu) | |||
80 | /* note: kgsl uses 0x0000ffff for a20x */ | 85 | /* note: kgsl uses 0x0000ffff for a20x */ |
81 | gpu_write(gpu, REG_A2XX_RBBM_CNTL, 0x00004442); | 86 | gpu_write(gpu, REG_A2XX_RBBM_CNTL, 0x00004442); |
82 | 87 | ||
83 | gpu_write(gpu, REG_A2XX_MH_MMU_CONFIG, 0); | 88 | /* MPU: physical range */ |
84 | gpu_write(gpu, REG_A2XX_MH_MMU_MPU_BASE, 0); | 89 | gpu_write(gpu, REG_A2XX_MH_MMU_MPU_BASE, 0x00000000); |
85 | gpu_write(gpu, REG_A2XX_MH_MMU_MPU_END, 0xfffff000); | 90 | gpu_write(gpu, REG_A2XX_MH_MMU_MPU_END, 0xfffff000); |
91 | |||
92 | gpu_write(gpu, REG_A2XX_MH_MMU_CONFIG, A2XX_MH_MMU_CONFIG_MMU_ENABLE | | ||
93 | A2XX_MH_MMU_CONFIG_RB_W_CLNT_BEHAVIOR(BEH_TRAN_RNG) | | ||
94 | A2XX_MH_MMU_CONFIG_CP_W_CLNT_BEHAVIOR(BEH_TRAN_RNG) | | ||
95 | A2XX_MH_MMU_CONFIG_CP_R0_CLNT_BEHAVIOR(BEH_TRAN_RNG) | | ||
96 | A2XX_MH_MMU_CONFIG_CP_R1_CLNT_BEHAVIOR(BEH_TRAN_RNG) | | ||
97 | A2XX_MH_MMU_CONFIG_CP_R2_CLNT_BEHAVIOR(BEH_TRAN_RNG) | | ||
98 | A2XX_MH_MMU_CONFIG_CP_R3_CLNT_BEHAVIOR(BEH_TRAN_RNG) | | ||
99 | A2XX_MH_MMU_CONFIG_CP_R4_CLNT_BEHAVIOR(BEH_TRAN_RNG) | | ||
100 | A2XX_MH_MMU_CONFIG_VGT_R0_CLNT_BEHAVIOR(BEH_TRAN_RNG) | | ||
101 | A2XX_MH_MMU_CONFIG_VGT_R1_CLNT_BEHAVIOR(BEH_TRAN_RNG) | | ||
102 | A2XX_MH_MMU_CONFIG_TC_R_CLNT_BEHAVIOR(BEH_TRAN_RNG) | | ||
103 | A2XX_MH_MMU_CONFIG_PA_W_CLNT_BEHAVIOR(BEH_TRAN_RNG)); | ||
104 | |||
105 | /* same as parameters in adreno_gpu */ | ||
106 | gpu_write(gpu, REG_A2XX_MH_MMU_VA_RANGE, SZ_16M | | ||
107 | A2XX_MH_MMU_VA_RANGE_NUM_64KB_REGIONS(0xfff)); | ||
108 | |||
109 | gpu_write(gpu, REG_A2XX_MH_MMU_PT_BASE, pt_base); | ||
110 | gpu_write(gpu, REG_A2XX_MH_MMU_TRAN_ERROR, tran_error); | ||
111 | |||
112 | gpu_write(gpu, REG_A2XX_MH_MMU_INVALIDATE, | ||
113 | A2XX_MH_MMU_INVALIDATE_INVALIDATE_ALL | | ||
114 | A2XX_MH_MMU_INVALIDATE_INVALIDATE_TC); | ||
115 | |||
86 | gpu_write(gpu, REG_A2XX_MH_ARBITER_CONFIG, | 116 | gpu_write(gpu, REG_A2XX_MH_ARBITER_CONFIG, |
87 | A2XX_MH_ARBITER_CONFIG_SAME_PAGE_LIMIT(16) | | 117 | A2XX_MH_ARBITER_CONFIG_SAME_PAGE_LIMIT(16) | |
88 | A2XX_MH_ARBITER_CONFIG_L1_ARB_ENABLE | | 118 | A2XX_MH_ARBITER_CONFIG_L1_ARB_ENABLE | |
@@ -109,9 +139,21 @@ static int a2xx_hw_init(struct msm_gpu *gpu) | |||
109 | /* note: gsl doesn't set this */ | 139 | /* note: gsl doesn't set this */ |
110 | gpu_write(gpu, REG_A2XX_RBBM_DEBUG, 0x00080000); | 140 | gpu_write(gpu, REG_A2XX_RBBM_DEBUG, 0x00080000); |
111 | 141 | ||
112 | gpu_write(gpu, REG_A2XX_RBBM_INT_CNTL, 0); | 142 | gpu_write(gpu, REG_A2XX_RBBM_INT_CNTL, |
113 | gpu_write(gpu, REG_AXXX_CP_INT_CNTL, 0x80000000); /* RB INT */ | 143 | A2XX_RBBM_INT_CNTL_RDERR_INT_MASK); |
144 | gpu_write(gpu, REG_AXXX_CP_INT_CNTL, | ||
145 | AXXX_CP_INT_CNTL_T0_PACKET_IN_IB_MASK | | ||
146 | AXXX_CP_INT_CNTL_OPCODE_ERROR_MASK | | ||
147 | AXXX_CP_INT_CNTL_PROTECTED_MODE_ERROR_MASK | | ||
148 | AXXX_CP_INT_CNTL_RESERVED_BIT_ERROR_MASK | | ||
149 | AXXX_CP_INT_CNTL_IB_ERROR_MASK | | ||
150 | AXXX_CP_INT_CNTL_IB1_INT_MASK | | ||
151 | AXXX_CP_INT_CNTL_RB_INT_MASK); | ||
114 | gpu_write(gpu, REG_A2XX_SQ_INT_CNTL, 0); | 152 | gpu_write(gpu, REG_A2XX_SQ_INT_CNTL, 0); |
153 | gpu_write(gpu, REG_A2XX_MH_INTERRUPT_MASK, | ||
154 | A2XX_MH_INTERRUPT_MASK_AXI_READ_ERROR | | ||
155 | A2XX_MH_INTERRUPT_MASK_AXI_WRITE_ERROR | | ||
156 | A2XX_MH_INTERRUPT_MASK_MMU_PAGE_FAULT); | ||
115 | 157 | ||
116 | for (i = 3; i <= 5; i++) | 158 | for (i = 3; i <= 5; i++) |
117 | if ((SZ_16K << i) == adreno_gpu->gmem) | 159 | if ((SZ_16K << i) == adreno_gpu->gmem) |