diff options
author | Samuel Li <samuel.li@amd.com> | 2015-10-08 16:28:41 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-10-21 12:19:46 -0400 |
commit | 7a753c3f3474458fa1d0b8f41617e41995bc4c40 (patch) | |
tree | ccb284d18be1472ee2315a3fc3198edd7aba46ea | |
parent | aade2f04f94aad4ed68a7a77893b300ef9cf25da (diff) |
drm/amdgpu: Update SMC/DPM for Stoney
Stoney is SMC 8.x.
Signed-off-by: Samuel Li <samuel.li@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cz_dpm.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cz_smc.c | 60 |
2 files changed, 65 insertions, 16 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c index 44fa96ad4709..6f244e94c5f6 100644 --- a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c | |||
@@ -1262,6 +1262,7 @@ static void cz_apply_state_adjust_rules(struct amdgpu_device *adev, | |||
1262 | 1262 | ||
1263 | static int cz_dpm_enable(struct amdgpu_device *adev) | 1263 | static int cz_dpm_enable(struct amdgpu_device *adev) |
1264 | { | 1264 | { |
1265 | const char *chip_name; | ||
1265 | int ret = 0; | 1266 | int ret = 0; |
1266 | 1267 | ||
1267 | /* renable will hang up SMU, so check first */ | 1268 | /* renable will hang up SMU, so check first */ |
@@ -1270,21 +1271,33 @@ static int cz_dpm_enable(struct amdgpu_device *adev) | |||
1270 | 1271 | ||
1271 | cz_program_voting_clients(adev); | 1272 | cz_program_voting_clients(adev); |
1272 | 1273 | ||
1274 | switch (adev->asic_type) { | ||
1275 | case CHIP_CARRIZO: | ||
1276 | chip_name = "carrizo"; | ||
1277 | break; | ||
1278 | case CHIP_STONEY: | ||
1279 | chip_name = "stoney"; | ||
1280 | break; | ||
1281 | default: | ||
1282 | BUG(); | ||
1283 | } | ||
1284 | |||
1285 | |||
1273 | ret = cz_start_dpm(adev); | 1286 | ret = cz_start_dpm(adev); |
1274 | if (ret) { | 1287 | if (ret) { |
1275 | DRM_ERROR("Carrizo DPM enable failed\n"); | 1288 | DRM_ERROR("%s DPM enable failed\n", chip_name); |
1276 | return -EINVAL; | 1289 | return -EINVAL; |
1277 | } | 1290 | } |
1278 | 1291 | ||
1279 | ret = cz_program_bootup_state(adev); | 1292 | ret = cz_program_bootup_state(adev); |
1280 | if (ret) { | 1293 | if (ret) { |
1281 | DRM_ERROR("Carrizo bootup state program failed\n"); | 1294 | DRM_ERROR("%s bootup state program failed\n", chip_name); |
1282 | return -EINVAL; | 1295 | return -EINVAL; |
1283 | } | 1296 | } |
1284 | 1297 | ||
1285 | ret = cz_enable_didt(adev, true); | 1298 | ret = cz_enable_didt(adev, true); |
1286 | if (ret) { | 1299 | if (ret) { |
1287 | DRM_ERROR("Carrizo enable di/dt failed\n"); | 1300 | DRM_ERROR("%s enable di/dt failed\n", chip_name); |
1288 | return -EINVAL; | 1301 | return -EINVAL; |
1289 | } | 1302 | } |
1290 | 1303 | ||
@@ -1351,7 +1364,7 @@ static int cz_dpm_disable(struct amdgpu_device *adev) | |||
1351 | 1364 | ||
1352 | ret = cz_enable_didt(adev, false); | 1365 | ret = cz_enable_didt(adev, false); |
1353 | if (ret) { | 1366 | if (ret) { |
1354 | DRM_ERROR("Carrizo disable di/dt failed\n"); | 1367 | DRM_ERROR("disable di/dt failed\n"); |
1355 | return -EINVAL; | 1368 | return -EINVAL; |
1356 | } | 1369 | } |
1357 | 1370 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_smc.c b/drivers/gpu/drm/amd/amdgpu/cz_smc.c index e33180d3314a..ac7fee7b7eca 100644 --- a/drivers/gpu/drm/amd/amdgpu/cz_smc.c +++ b/drivers/gpu/drm/amd/amdgpu/cz_smc.c | |||
@@ -312,13 +312,16 @@ int cz_smu_start(struct amdgpu_device *adev) | |||
312 | UCODE_ID_CP_MEC_JT1_MASK | | 312 | UCODE_ID_CP_MEC_JT1_MASK | |
313 | UCODE_ID_CP_MEC_JT2_MASK; | 313 | UCODE_ID_CP_MEC_JT2_MASK; |
314 | 314 | ||
315 | if (adev->asic_type == CHIP_STONEY) | ||
316 | fw_to_check &= ~(UCODE_ID_SDMA1_MASK | UCODE_ID_CP_MEC_JT2_MASK); | ||
317 | |||
315 | cz_smu_request_load_fw(adev); | 318 | cz_smu_request_load_fw(adev); |
316 | ret = cz_smu_check_fw_load_finish(adev, fw_to_check); | 319 | ret = cz_smu_check_fw_load_finish(adev, fw_to_check); |
317 | if (ret) | 320 | if (ret) |
318 | return ret; | 321 | return ret; |
319 | 322 | ||
320 | /* manually load MEC firmware for CZ */ | 323 | /* manually load MEC firmware for CZ */ |
321 | if (adev->asic_type == CHIP_CARRIZO) { | 324 | if (adev->asic_type == CHIP_CARRIZO || adev->asic_type == CHIP_STONEY) { |
322 | ret = cz_load_mec_firmware(adev); | 325 | ret = cz_load_mec_firmware(adev); |
323 | if (ret) { | 326 | if (ret) { |
324 | dev_err(adev->dev, "(%d) Mec Firmware load failed\n", ret); | 327 | dev_err(adev->dev, "(%d) Mec Firmware load failed\n", ret); |
@@ -336,6 +339,9 @@ int cz_smu_start(struct amdgpu_device *adev) | |||
336 | AMDGPU_CPMEC2_UCODE_LOADED | | 339 | AMDGPU_CPMEC2_UCODE_LOADED | |
337 | AMDGPU_CPRLC_UCODE_LOADED; | 340 | AMDGPU_CPRLC_UCODE_LOADED; |
338 | 341 | ||
342 | if (adev->asic_type == CHIP_STONEY) | ||
343 | adev->smu.fw_flags &= ~(AMDGPU_SDMA1_UCODE_LOADED | AMDGPU_CPMEC2_UCODE_LOADED); | ||
344 | |||
339 | return ret; | 345 | return ret; |
340 | } | 346 | } |
341 | 347 | ||
@@ -601,8 +607,13 @@ static int cz_smu_construct_toc_for_vddgfx_exit(struct amdgpu_device *adev) | |||
601 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false); | 607 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false); |
602 | cz_smu_populate_single_ucode_load_task(adev, | 608 | cz_smu_populate_single_ucode_load_task(adev, |
603 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false); | 609 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false); |
604 | cz_smu_populate_single_ucode_load_task(adev, | 610 | if (adev->asic_type == CHIP_STONEY) { |
611 | cz_smu_populate_single_ucode_load_task(adev, | ||
612 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false); | ||
613 | } else { | ||
614 | cz_smu_populate_single_ucode_load_task(adev, | ||
605 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false); | 615 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false); |
616 | } | ||
606 | cz_smu_populate_single_ucode_load_task(adev, | 617 | cz_smu_populate_single_ucode_load_task(adev, |
607 | CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, false); | 618 | CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, false); |
608 | } | 619 | } |
@@ -642,8 +653,13 @@ static int cz_smu_construct_toc_for_bootup(struct amdgpu_device *adev) | |||
642 | if (adev->firmware.smu_load) { | 653 | if (adev->firmware.smu_load) { |
643 | cz_smu_populate_single_ucode_load_task(adev, | 654 | cz_smu_populate_single_ucode_load_task(adev, |
644 | CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false); | 655 | CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false); |
645 | cz_smu_populate_single_ucode_load_task(adev, | 656 | if (adev->asic_type == CHIP_STONEY) { |
657 | cz_smu_populate_single_ucode_load_task(adev, | ||
658 | CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, false); | ||
659 | } else { | ||
660 | cz_smu_populate_single_ucode_load_task(adev, | ||
646 | CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1, false); | 661 | CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1, false); |
662 | } | ||
647 | cz_smu_populate_single_ucode_load_task(adev, | 663 | cz_smu_populate_single_ucode_load_task(adev, |
648 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, false); | 664 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, false); |
649 | cz_smu_populate_single_ucode_load_task(adev, | 665 | cz_smu_populate_single_ucode_load_task(adev, |
@@ -652,8 +668,13 @@ static int cz_smu_construct_toc_for_bootup(struct amdgpu_device *adev) | |||
652 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false); | 668 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_ME, false); |
653 | cz_smu_populate_single_ucode_load_task(adev, | 669 | cz_smu_populate_single_ucode_load_task(adev, |
654 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false); | 670 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false); |
655 | cz_smu_populate_single_ucode_load_task(adev, | 671 | if (adev->asic_type == CHIP_STONEY) { |
672 | cz_smu_populate_single_ucode_load_task(adev, | ||
673 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, false); | ||
674 | } else { | ||
675 | cz_smu_populate_single_ucode_load_task(adev, | ||
656 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false); | 676 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, false); |
677 | } | ||
657 | cz_smu_populate_single_ucode_load_task(adev, | 678 | cz_smu_populate_single_ucode_load_task(adev, |
658 | CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, true); | 679 | CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, true); |
659 | } | 680 | } |
@@ -888,10 +909,18 @@ int cz_smu_init(struct amdgpu_device *adev) | |||
888 | CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, | 909 | CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, |
889 | &priv->driver_buffer[priv->driver_buffer_length++])) | 910 | &priv->driver_buffer[priv->driver_buffer_length++])) |
890 | goto smu_init_failed; | 911 | goto smu_init_failed; |
891 | if (cz_smu_populate_single_firmware_entry(adev, | 912 | |
892 | CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1, | 913 | if (adev->asic_type == CHIP_STONEY) { |
893 | &priv->driver_buffer[priv->driver_buffer_length++])) | 914 | if (cz_smu_populate_single_firmware_entry(adev, |
894 | goto smu_init_failed; | 915 | CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0, |
916 | &priv->driver_buffer[priv->driver_buffer_length++])) | ||
917 | goto smu_init_failed; | ||
918 | } else { | ||
919 | if (cz_smu_populate_single_firmware_entry(adev, | ||
920 | CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1, | ||
921 | &priv->driver_buffer[priv->driver_buffer_length++])) | ||
922 | goto smu_init_failed; | ||
923 | } | ||
895 | if (cz_smu_populate_single_firmware_entry(adev, | 924 | if (cz_smu_populate_single_firmware_entry(adev, |
896 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, | 925 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE, |
897 | &priv->driver_buffer[priv->driver_buffer_length++])) | 926 | &priv->driver_buffer[priv->driver_buffer_length++])) |
@@ -908,10 +937,17 @@ int cz_smu_init(struct amdgpu_device *adev) | |||
908 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, | 937 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, |
909 | &priv->driver_buffer[priv->driver_buffer_length++])) | 938 | &priv->driver_buffer[priv->driver_buffer_length++])) |
910 | goto smu_init_failed; | 939 | goto smu_init_failed; |
911 | if (cz_smu_populate_single_firmware_entry(adev, | 940 | if (adev->asic_type == CHIP_STONEY) { |
912 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, | 941 | if (cz_smu_populate_single_firmware_entry(adev, |
913 | &priv->driver_buffer[priv->driver_buffer_length++])) | 942 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT1, |
914 | goto smu_init_failed; | 943 | &priv->driver_buffer[priv->driver_buffer_length++])) |
944 | goto smu_init_failed; | ||
945 | } else { | ||
946 | if (cz_smu_populate_single_firmware_entry(adev, | ||
947 | CZ_SCRATCH_ENTRY_UCODE_ID_CP_MEC_JT2, | ||
948 | &priv->driver_buffer[priv->driver_buffer_length++])) | ||
949 | goto smu_init_failed; | ||
950 | } | ||
915 | if (cz_smu_populate_single_firmware_entry(adev, | 951 | if (cz_smu_populate_single_firmware_entry(adev, |
916 | CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, | 952 | CZ_SCRATCH_ENTRY_UCODE_ID_RLC_G, |
917 | &priv->driver_buffer[priv->driver_buffer_length++])) | 953 | &priv->driver_buffer[priv->driver_buffer_length++])) |