diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c | 31 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 1 |
8 files changed, 63 insertions, 14 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index cc8ad3831982..f4ac632a87b2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
| @@ -1589,6 +1589,7 @@ static int amdgpu_device_fw_loading(struct amdgpu_device *adev) | |||
| 1589 | { | 1589 | { |
| 1590 | int r = 0; | 1590 | int r = 0; |
| 1591 | int i; | 1591 | int i; |
| 1592 | uint32_t smu_version; | ||
| 1592 | 1593 | ||
| 1593 | if (adev->asic_type >= CHIP_VEGA10) { | 1594 | if (adev->asic_type >= CHIP_VEGA10) { |
| 1594 | for (i = 0; i < adev->num_ip_blocks; i++) { | 1595 | for (i = 0; i < adev->num_ip_blocks; i++) { |
| @@ -1614,16 +1615,9 @@ static int amdgpu_device_fw_loading(struct amdgpu_device *adev) | |||
| 1614 | } | 1615 | } |
| 1615 | } | 1616 | } |
| 1616 | } | 1617 | } |
| 1618 | r = amdgpu_pm_load_smu_firmware(adev, &smu_version); | ||
| 1617 | 1619 | ||
| 1618 | if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->load_firmware) { | 1620 | return r; |
| 1619 | r = adev->powerplay.pp_funcs->load_firmware(adev->powerplay.pp_handle); | ||
| 1620 | if (r) { | ||
| 1621 | pr_err("firmware loading failed\n"); | ||
| 1622 | return r; | ||
| 1623 | } | ||
| 1624 | } | ||
| 1625 | |||
| 1626 | return 0; | ||
| 1627 | } | 1621 | } |
| 1628 | 1622 | ||
| 1629 | /** | 1623 | /** |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 34471dbaa872..039cfa2ec89d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
| @@ -2490,6 +2490,21 @@ void amdgpu_pm_print_power_states(struct amdgpu_device *adev) | |||
| 2490 | 2490 | ||
| 2491 | } | 2491 | } |
| 2492 | 2492 | ||
| 2493 | int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_version) | ||
| 2494 | { | ||
| 2495 | int r = -EINVAL; | ||
| 2496 | |||
| 2497 | if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->load_firmware) { | ||
| 2498 | r = adev->powerplay.pp_funcs->load_firmware(adev->powerplay.pp_handle); | ||
| 2499 | if (r) { | ||
| 2500 | pr_err("smu firmware loading failed\n"); | ||
| 2501 | return r; | ||
| 2502 | } | ||
| 2503 | *smu_version = adev->pm.fw_version; | ||
| 2504 | } | ||
| 2505 | return r; | ||
| 2506 | } | ||
| 2507 | |||
| 2493 | int amdgpu_pm_sysfs_init(struct amdgpu_device *adev) | 2508 | int amdgpu_pm_sysfs_init(struct amdgpu_device *adev) |
| 2494 | { | 2509 | { |
| 2495 | struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; | 2510 | struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h index f21a7716b90e..7ff0e7621fff 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h | |||
| @@ -34,6 +34,7 @@ void amdgpu_pm_acpi_event_handler(struct amdgpu_device *adev); | |||
| 34 | int amdgpu_pm_sysfs_init(struct amdgpu_device *adev); | 34 | int amdgpu_pm_sysfs_init(struct amdgpu_device *adev); |
| 35 | void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev); | 35 | void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev); |
| 36 | void amdgpu_pm_print_power_states(struct amdgpu_device *adev); | 36 | void amdgpu_pm_print_power_states(struct amdgpu_device *adev); |
| 37 | int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_version); | ||
| 37 | void amdgpu_pm_compute_clocks(struct amdgpu_device *adev); | 38 | void amdgpu_pm_compute_clocks(struct amdgpu_device *adev); |
| 38 | void amdgpu_dpm_thermal_work_handler(struct work_struct *work); | 39 | void amdgpu_dpm_thermal_work_handler(struct work_struct *work); |
| 39 | void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable); | 40 | void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c index c021b114c8a4..f7189e22f6b7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | |||
| @@ -1072,7 +1072,7 @@ void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, | |||
| 1072 | int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring) | 1072 | int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring) |
| 1073 | { | 1073 | { |
| 1074 | struct amdgpu_device *adev = ring->adev; | 1074 | struct amdgpu_device *adev = ring->adev; |
| 1075 | uint32_t rptr = amdgpu_ring_get_rptr(ring); | 1075 | uint32_t rptr; |
| 1076 | unsigned i; | 1076 | unsigned i; |
| 1077 | int r, timeout = adev->usec_timeout; | 1077 | int r, timeout = adev->usec_timeout; |
| 1078 | 1078 | ||
| @@ -1084,6 +1084,8 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring) | |||
| 1084 | if (r) | 1084 | if (r) |
| 1085 | return r; | 1085 | return r; |
| 1086 | 1086 | ||
| 1087 | rptr = amdgpu_ring_get_rptr(ring); | ||
| 1088 | |||
| 1087 | amdgpu_ring_write(ring, VCE_CMD_END); | 1089 | amdgpu_ring_write(ring, VCE_CMD_END); |
| 1088 | amdgpu_ring_commit(ring); | 1090 | amdgpu_ring_commit(ring); |
| 1089 | 1091 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index ba67d1023264..b610e3b30d95 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include "soc15.h" | 28 | #include "soc15.h" |
| 29 | #include "soc15d.h" | 29 | #include "soc15d.h" |
| 30 | #include "amdgpu_atomfirmware.h" | 30 | #include "amdgpu_atomfirmware.h" |
| 31 | #include "amdgpu_pm.h" | ||
| 31 | 32 | ||
| 32 | #include "gc/gc_9_0_offset.h" | 33 | #include "gc/gc_9_0_offset.h" |
| 33 | #include "gc/gc_9_0_sh_mask.h" | 34 | #include "gc/gc_9_0_sh_mask.h" |
| @@ -96,6 +97,7 @@ MODULE_FIRMWARE("amdgpu/raven2_me.bin"); | |||
| 96 | MODULE_FIRMWARE("amdgpu/raven2_mec.bin"); | 97 | MODULE_FIRMWARE("amdgpu/raven2_mec.bin"); |
| 97 | MODULE_FIRMWARE("amdgpu/raven2_mec2.bin"); | 98 | MODULE_FIRMWARE("amdgpu/raven2_mec2.bin"); |
| 98 | MODULE_FIRMWARE("amdgpu/raven2_rlc.bin"); | 99 | MODULE_FIRMWARE("amdgpu/raven2_rlc.bin"); |
| 100 | MODULE_FIRMWARE("amdgpu/raven_kicker_rlc.bin"); | ||
| 99 | 101 | ||
| 100 | static const struct soc15_reg_golden golden_settings_gc_9_0[] = | 102 | static const struct soc15_reg_golden golden_settings_gc_9_0[] = |
| 101 | { | 103 | { |
| @@ -588,7 +590,8 @@ static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev) | |||
| 588 | case CHIP_RAVEN: | 590 | case CHIP_RAVEN: |
| 589 | if (adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) | 591 | if (adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) |
| 590 | break; | 592 | break; |
| 591 | if ((adev->gfx.rlc_fw_version < 531) || | 593 | if ((adev->gfx.rlc_fw_version != 106 && |
| 594 | adev->gfx.rlc_fw_version < 531) || | ||
| 592 | (adev->gfx.rlc_fw_version == 53815) || | 595 | (adev->gfx.rlc_fw_version == 53815) || |
| 593 | (adev->gfx.rlc_feature_version < 1) || | 596 | (adev->gfx.rlc_feature_version < 1) || |
| 594 | !adev->gfx.rlc.is_rlc_v2_1) | 597 | !adev->gfx.rlc.is_rlc_v2_1) |
| @@ -612,6 +615,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev) | |||
| 612 | unsigned int i = 0; | 615 | unsigned int i = 0; |
| 613 | uint16_t version_major; | 616 | uint16_t version_major; |
| 614 | uint16_t version_minor; | 617 | uint16_t version_minor; |
| 618 | uint32_t smu_version; | ||
| 615 | 619 | ||
| 616 | DRM_DEBUG("\n"); | 620 | DRM_DEBUG("\n"); |
| 617 | 621 | ||
| @@ -682,6 +686,12 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev) | |||
| 682 | (((adev->pdev->revision >= 0xC8) && (adev->pdev->revision <= 0xCF)) || | 686 | (((adev->pdev->revision >= 0xC8) && (adev->pdev->revision <= 0xCF)) || |
| 683 | ((adev->pdev->revision >= 0xD8) && (adev->pdev->revision <= 0xDF)))) | 687 | ((adev->pdev->revision >= 0xD8) && (adev->pdev->revision <= 0xDF)))) |
| 684 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc_am4.bin", chip_name); | 688 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc_am4.bin", chip_name); |
| 689 | else if (!strcmp(chip_name, "raven") && (amdgpu_pm_load_smu_firmware(adev, &smu_version) == 0) && | ||
| 690 | (smu_version >= 0x41e2b)) | ||
| 691 | /** | ||
| 692 | *SMC is loaded by SBIOS on APU and it's able to get the SMU version directly. | ||
| 693 | */ | ||
| 694 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_kicker_rlc.bin", chip_name); | ||
| 685 | else | 695 | else |
| 686 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); | 696 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); |
| 687 | err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); | 697 | err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c index 6cd6497c6fc2..f1d326caf69e 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | |||
| @@ -92,6 +92,7 @@ int hwmgr_early_init(struct pp_hwmgr *hwmgr) | |||
| 92 | hwmgr_set_user_specify_caps(hwmgr); | 92 | hwmgr_set_user_specify_caps(hwmgr); |
| 93 | hwmgr->fan_ctrl_is_in_default_mode = true; | 93 | hwmgr->fan_ctrl_is_in_default_mode = true; |
| 94 | hwmgr_init_workload_prority(hwmgr); | 94 | hwmgr_init_workload_prority(hwmgr); |
| 95 | hwmgr->gfxoff_state_changed_by_workload = false; | ||
| 95 | 96 | ||
| 96 | switch (hwmgr->chip_family) { | 97 | switch (hwmgr->chip_family) { |
| 97 | case AMDGPU_FAMILY_CI: | 98 | case AMDGPU_FAMILY_CI: |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c index 9a595f7525e6..e32ae9d3373c 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c | |||
| @@ -1258,21 +1258,46 @@ static int smu10_get_power_profile_mode(struct pp_hwmgr *hwmgr, char *buf) | |||
| 1258 | return size; | 1258 | return size; |
| 1259 | } | 1259 | } |
| 1260 | 1260 | ||
| 1261 | static bool smu10_is_raven1_refresh(struct pp_hwmgr *hwmgr) | ||
| 1262 | { | ||
| 1263 | struct amdgpu_device *adev = hwmgr->adev; | ||
| 1264 | if ((adev->asic_type == CHIP_RAVEN) && | ||
| 1265 | (adev->rev_id != 0x15d8) && | ||
| 1266 | (hwmgr->smu_version >= 0x41e2b)) | ||
| 1267 | return true; | ||
| 1268 | else | ||
| 1269 | return false; | ||
| 1270 | } | ||
| 1271 | |||
| 1261 | static int smu10_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, uint32_t size) | 1272 | static int smu10_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, uint32_t size) |
| 1262 | { | 1273 | { |
| 1263 | int workload_type = 0; | 1274 | int workload_type = 0; |
| 1275 | int result = 0; | ||
| 1264 | 1276 | ||
| 1265 | if (input[size] > PP_SMC_POWER_PROFILE_COMPUTE) { | 1277 | if (input[size] > PP_SMC_POWER_PROFILE_COMPUTE) { |
| 1266 | pr_err("Invalid power profile mode %ld\n", input[size]); | 1278 | pr_err("Invalid power profile mode %ld\n", input[size]); |
| 1267 | return -EINVAL; | 1279 | return -EINVAL; |
| 1268 | } | 1280 | } |
| 1269 | hwmgr->power_profile_mode = input[size]; | 1281 | if (hwmgr->power_profile_mode == input[size]) |
| 1282 | return 0; | ||
| 1270 | 1283 | ||
| 1271 | /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ | 1284 | /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ |
| 1272 | workload_type = | 1285 | workload_type = |
| 1273 | conv_power_profile_to_pplib_workload(hwmgr->power_profile_mode); | 1286 | conv_power_profile_to_pplib_workload(input[size]); |
| 1274 | smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ActiveProcessNotify, | 1287 | if (workload_type && |
| 1288 | smu10_is_raven1_refresh(hwmgr) && | ||
| 1289 | !hwmgr->gfxoff_state_changed_by_workload) { | ||
| 1290 | smu10_gfx_off_control(hwmgr, false); | ||
| 1291 | hwmgr->gfxoff_state_changed_by_workload = true; | ||
| 1292 | } | ||
| 1293 | result = smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ActiveProcessNotify, | ||
| 1275 | 1 << workload_type); | 1294 | 1 << workload_type); |
| 1295 | if (!result) | ||
| 1296 | hwmgr->power_profile_mode = input[size]; | ||
| 1297 | if (workload_type && hwmgr->gfxoff_state_changed_by_workload) { | ||
| 1298 | smu10_gfx_off_control(hwmgr, true); | ||
| 1299 | hwmgr->gfxoff_state_changed_by_workload = false; | ||
| 1300 | } | ||
| 1276 | 1301 | ||
| 1277 | return 0; | 1302 | return 0; |
| 1278 | } | 1303 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h index bac3d85e3b82..c92999aac07c 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | |||
| @@ -782,6 +782,7 @@ struct pp_hwmgr { | |||
| 782 | uint32_t workload_mask; | 782 | uint32_t workload_mask; |
| 783 | uint32_t workload_prority[Workload_Policy_Max]; | 783 | uint32_t workload_prority[Workload_Policy_Max]; |
| 784 | uint32_t workload_setting[Workload_Policy_Max]; | 784 | uint32_t workload_setting[Workload_Policy_Max]; |
| 785 | bool gfxoff_state_changed_by_workload; | ||
| 785 | }; | 786 | }; |
| 786 | 787 | ||
| 787 | int hwmgr_early_init(struct pp_hwmgr *hwmgr); | 788 | int hwmgr_early_init(struct pp_hwmgr *hwmgr); |
