diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/vi.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vi.c | 120 |
1 files changed, 115 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index 68552da40287..552d9e75ad1b 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c | |||
@@ -203,6 +203,17 @@ static const u32 tonga_mgcg_cgcg_init[] = | |||
203 | mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, | 203 | mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, |
204 | }; | 204 | }; |
205 | 205 | ||
206 | static const u32 fiji_mgcg_cgcg_init[] = | ||
207 | { | ||
208 | mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100, | ||
209 | mmPCIE_INDEX, 0xffffffff, 0x0140001c, | ||
210 | mmPCIE_DATA, 0x000f0000, 0x00000000, | ||
211 | mmSMC_IND_INDEX_4, 0xffffffff, 0xC060000C, | ||
212 | mmSMC_IND_DATA_4, 0xc0000fff, 0x00000100, | ||
213 | mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100, | ||
214 | mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104, | ||
215 | }; | ||
216 | |||
206 | static const u32 iceland_mgcg_cgcg_init[] = | 217 | static const u32 iceland_mgcg_cgcg_init[] = |
207 | { | 218 | { |
208 | mmPCIE_INDEX, 0xffffffff, ixPCIE_CNTL2, | 219 | mmPCIE_INDEX, 0xffffffff, ixPCIE_CNTL2, |
@@ -232,6 +243,11 @@ static void vi_init_golden_registers(struct amdgpu_device *adev) | |||
232 | iceland_mgcg_cgcg_init, | 243 | iceland_mgcg_cgcg_init, |
233 | (const u32)ARRAY_SIZE(iceland_mgcg_cgcg_init)); | 244 | (const u32)ARRAY_SIZE(iceland_mgcg_cgcg_init)); |
234 | break; | 245 | break; |
246 | case CHIP_FIJI: | ||
247 | amdgpu_program_register_sequence(adev, | ||
248 | fiji_mgcg_cgcg_init, | ||
249 | (const u32)ARRAY_SIZE(fiji_mgcg_cgcg_init)); | ||
250 | break; | ||
235 | case CHIP_TONGA: | 251 | case CHIP_TONGA: |
236 | amdgpu_program_register_sequence(adev, | 252 | amdgpu_program_register_sequence(adev, |
237 | tonga_mgcg_cgcg_init, | 253 | tonga_mgcg_cgcg_init, |
@@ -261,7 +277,7 @@ static u32 vi_get_xclk(struct amdgpu_device *adev) | |||
261 | u32 reference_clock = adev->clock.spll.reference_freq; | 277 | u32 reference_clock = adev->clock.spll.reference_freq; |
262 | u32 tmp; | 278 | u32 tmp; |
263 | 279 | ||
264 | if (adev->flags & AMDGPU_IS_APU) | 280 | if (adev->flags & AMD_IS_APU) |
265 | return reference_clock; | 281 | return reference_clock; |
266 | 282 | ||
267 | tmp = RREG32_SMC(ixCG_CLKPIN_CNTL_2); | 283 | tmp = RREG32_SMC(ixCG_CLKPIN_CNTL_2); |
@@ -362,6 +378,26 @@ static struct amdgpu_allowed_register_entry cz_allowed_read_registers[] = { | |||
362 | 378 | ||
363 | static struct amdgpu_allowed_register_entry vi_allowed_read_registers[] = { | 379 | static struct amdgpu_allowed_register_entry vi_allowed_read_registers[] = { |
364 | {mmGRBM_STATUS, false}, | 380 | {mmGRBM_STATUS, false}, |
381 | {mmGRBM_STATUS2, false}, | ||
382 | {mmGRBM_STATUS_SE0, false}, | ||
383 | {mmGRBM_STATUS_SE1, false}, | ||
384 | {mmGRBM_STATUS_SE2, false}, | ||
385 | {mmGRBM_STATUS_SE3, false}, | ||
386 | {mmSRBM_STATUS, false}, | ||
387 | {mmSRBM_STATUS2, false}, | ||
388 | {mmSRBM_STATUS3, false}, | ||
389 | {mmSDMA0_STATUS_REG + SDMA0_REGISTER_OFFSET, false}, | ||
390 | {mmSDMA0_STATUS_REG + SDMA1_REGISTER_OFFSET, false}, | ||
391 | {mmCP_STAT, false}, | ||
392 | {mmCP_STALLED_STAT1, false}, | ||
393 | {mmCP_STALLED_STAT2, false}, | ||
394 | {mmCP_STALLED_STAT3, false}, | ||
395 | {mmCP_CPF_BUSY_STAT, false}, | ||
396 | {mmCP_CPF_STALLED_STAT1, false}, | ||
397 | {mmCP_CPF_STATUS, false}, | ||
398 | {mmCP_CPC_BUSY_STAT, false}, | ||
399 | {mmCP_CPC_STALLED_STAT1, false}, | ||
400 | {mmCP_CPC_STATUS, false}, | ||
365 | {mmGB_ADDR_CONFIG, false}, | 401 | {mmGB_ADDR_CONFIG, false}, |
366 | {mmMC_ARB_RAMCFG, false}, | 402 | {mmMC_ARB_RAMCFG, false}, |
367 | {mmGB_TILE_MODE0, false}, | 403 | {mmGB_TILE_MODE0, false}, |
@@ -449,6 +485,7 @@ static int vi_read_register(struct amdgpu_device *adev, u32 se_num, | |||
449 | asic_register_table = tonga_allowed_read_registers; | 485 | asic_register_table = tonga_allowed_read_registers; |
450 | size = ARRAY_SIZE(tonga_allowed_read_registers); | 486 | size = ARRAY_SIZE(tonga_allowed_read_registers); |
451 | break; | 487 | break; |
488 | case CHIP_FIJI: | ||
452 | case CHIP_TONGA: | 489 | case CHIP_TONGA: |
453 | case CHIP_CARRIZO: | 490 | case CHIP_CARRIZO: |
454 | asic_register_table = cz_allowed_read_registers; | 491 | asic_register_table = cz_allowed_read_registers; |
@@ -751,7 +788,7 @@ static void vi_gpu_soft_reset(struct amdgpu_device *adev, u32 reset_mask) | |||
751 | srbm_soft_reset = | 788 | srbm_soft_reset = |
752 | REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE1, 1); | 789 | REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE1, 1); |
753 | 790 | ||
754 | if (!(adev->flags & AMDGPU_IS_APU)) { | 791 | if (!(adev->flags & AMD_IS_APU)) { |
755 | if (reset_mask & AMDGPU_RESET_MC) | 792 | if (reset_mask & AMDGPU_RESET_MC) |
756 | srbm_soft_reset = | 793 | srbm_soft_reset = |
757 | REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_MC, 1); | 794 | REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_MC, 1); |
@@ -971,7 +1008,7 @@ static void vi_pcie_gen3_enable(struct amdgpu_device *adev) | |||
971 | if (amdgpu_pcie_gen2 == 0) | 1008 | if (amdgpu_pcie_gen2 == 0) |
972 | return; | 1009 | return; |
973 | 1010 | ||
974 | if (adev->flags & AMDGPU_IS_APU) | 1011 | if (adev->flags & AMD_IS_APU) |
975 | return; | 1012 | return; |
976 | 1013 | ||
977 | ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask); | 1014 | ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask); |
@@ -999,7 +1036,7 @@ static void vi_enable_doorbell_aperture(struct amdgpu_device *adev, | |||
999 | u32 tmp; | 1036 | u32 tmp; |
1000 | 1037 | ||
1001 | /* not necessary on CZ */ | 1038 | /* not necessary on CZ */ |
1002 | if (adev->flags & AMDGPU_IS_APU) | 1039 | if (adev->flags & AMD_IS_APU) |
1003 | return; | 1040 | return; |
1004 | 1041 | ||
1005 | tmp = RREG32(mmBIF_DOORBELL_APER_EN); | 1042 | tmp = RREG32(mmBIF_DOORBELL_APER_EN); |
@@ -1127,6 +1164,74 @@ static const struct amdgpu_ip_block_version tonga_ip_blocks[] = | |||
1127 | }, | 1164 | }, |
1128 | }; | 1165 | }; |
1129 | 1166 | ||
1167 | static const struct amdgpu_ip_block_version fiji_ip_blocks[] = | ||
1168 | { | ||
1169 | /* ORDER MATTERS! */ | ||
1170 | { | ||
1171 | .type = AMD_IP_BLOCK_TYPE_COMMON, | ||
1172 | .major = 2, | ||
1173 | .minor = 0, | ||
1174 | .rev = 0, | ||
1175 | .funcs = &vi_common_ip_funcs, | ||
1176 | }, | ||
1177 | { | ||
1178 | .type = AMD_IP_BLOCK_TYPE_GMC, | ||
1179 | .major = 8, | ||
1180 | .minor = 5, | ||
1181 | .rev = 0, | ||
1182 | .funcs = &gmc_v8_0_ip_funcs, | ||
1183 | }, | ||
1184 | { | ||
1185 | .type = AMD_IP_BLOCK_TYPE_IH, | ||
1186 | .major = 3, | ||
1187 | .minor = 0, | ||
1188 | .rev = 0, | ||
1189 | .funcs = &tonga_ih_ip_funcs, | ||
1190 | }, | ||
1191 | { | ||
1192 | .type = AMD_IP_BLOCK_TYPE_SMC, | ||
1193 | .major = 7, | ||
1194 | .minor = 1, | ||
1195 | .rev = 0, | ||
1196 | .funcs = &fiji_dpm_ip_funcs, | ||
1197 | }, | ||
1198 | { | ||
1199 | .type = AMD_IP_BLOCK_TYPE_DCE, | ||
1200 | .major = 10, | ||
1201 | .minor = 1, | ||
1202 | .rev = 0, | ||
1203 | .funcs = &dce_v10_0_ip_funcs, | ||
1204 | }, | ||
1205 | { | ||
1206 | .type = AMD_IP_BLOCK_TYPE_GFX, | ||
1207 | .major = 8, | ||
1208 | .minor = 0, | ||
1209 | .rev = 0, | ||
1210 | .funcs = &gfx_v8_0_ip_funcs, | ||
1211 | }, | ||
1212 | { | ||
1213 | .type = AMD_IP_BLOCK_TYPE_SDMA, | ||
1214 | .major = 3, | ||
1215 | .minor = 0, | ||
1216 | .rev = 0, | ||
1217 | .funcs = &sdma_v3_0_ip_funcs, | ||
1218 | }, | ||
1219 | { | ||
1220 | .type = AMD_IP_BLOCK_TYPE_UVD, | ||
1221 | .major = 6, | ||
1222 | .minor = 0, | ||
1223 | .rev = 0, | ||
1224 | .funcs = &uvd_v6_0_ip_funcs, | ||
1225 | }, | ||
1226 | { | ||
1227 | .type = AMD_IP_BLOCK_TYPE_VCE, | ||
1228 | .major = 3, | ||
1229 | .minor = 0, | ||
1230 | .rev = 0, | ||
1231 | .funcs = &vce_v3_0_ip_funcs, | ||
1232 | }, | ||
1233 | }; | ||
1234 | |||
1130 | static const struct amdgpu_ip_block_version cz_ip_blocks[] = | 1235 | static const struct amdgpu_ip_block_version cz_ip_blocks[] = |
1131 | { | 1236 | { |
1132 | /* ORDER MATTERS! */ | 1237 | /* ORDER MATTERS! */ |
@@ -1202,6 +1307,10 @@ int vi_set_ip_blocks(struct amdgpu_device *adev) | |||
1202 | adev->ip_blocks = topaz_ip_blocks; | 1307 | adev->ip_blocks = topaz_ip_blocks; |
1203 | adev->num_ip_blocks = ARRAY_SIZE(topaz_ip_blocks); | 1308 | adev->num_ip_blocks = ARRAY_SIZE(topaz_ip_blocks); |
1204 | break; | 1309 | break; |
1310 | case CHIP_FIJI: | ||
1311 | adev->ip_blocks = fiji_ip_blocks; | ||
1312 | adev->num_ip_blocks = ARRAY_SIZE(fiji_ip_blocks); | ||
1313 | break; | ||
1205 | case CHIP_TONGA: | 1314 | case CHIP_TONGA: |
1206 | adev->ip_blocks = tonga_ip_blocks; | 1315 | adev->ip_blocks = tonga_ip_blocks; |
1207 | adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks); | 1316 | adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks); |
@@ -1248,7 +1357,7 @@ static int vi_common_early_init(void *handle) | |||
1248 | bool smc_enabled = false; | 1357 | bool smc_enabled = false; |
1249 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 1358 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
1250 | 1359 | ||
1251 | if (adev->flags & AMDGPU_IS_APU) { | 1360 | if (adev->flags & AMD_IS_APU) { |
1252 | adev->smc_rreg = &cz_smc_rreg; | 1361 | adev->smc_rreg = &cz_smc_rreg; |
1253 | adev->smc_wreg = &cz_smc_wreg; | 1362 | adev->smc_wreg = &cz_smc_wreg; |
1254 | } else { | 1363 | } else { |
@@ -1279,6 +1388,7 @@ static int vi_common_early_init(void *handle) | |||
1279 | if (amdgpu_smc_load_fw && smc_enabled) | 1388 | if (amdgpu_smc_load_fw && smc_enabled) |
1280 | adev->firmware.smu_load = true; | 1389 | adev->firmware.smu_load = true; |
1281 | break; | 1390 | break; |
1391 | case CHIP_FIJI: | ||
1282 | case CHIP_TONGA: | 1392 | case CHIP_TONGA: |
1283 | adev->has_uvd = true; | 1393 | adev->has_uvd = true; |
1284 | adev->cg_flags = 0; | 1394 | adev->cg_flags = 0; |