aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c15
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c12
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c1
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c31
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/hwmgr.h1
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
2493int 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
2493int amdgpu_pm_sysfs_init(struct amdgpu_device *adev) 2508int 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);
34int amdgpu_pm_sysfs_init(struct amdgpu_device *adev); 34int amdgpu_pm_sysfs_init(struct amdgpu_device *adev);
35void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev); 35void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev);
36void amdgpu_pm_print_power_states(struct amdgpu_device *adev); 36void amdgpu_pm_print_power_states(struct amdgpu_device *adev);
37int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_version);
37void amdgpu_pm_compute_clocks(struct amdgpu_device *adev); 38void amdgpu_pm_compute_clocks(struct amdgpu_device *adev);
38void amdgpu_dpm_thermal_work_handler(struct work_struct *work); 39void amdgpu_dpm_thermal_work_handler(struct work_struct *work);
39void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable); 40void 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,
1072int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring) 1072int 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");
96MODULE_FIRMWARE("amdgpu/raven2_mec.bin"); 97MODULE_FIRMWARE("amdgpu/raven2_mec.bin");
97MODULE_FIRMWARE("amdgpu/raven2_mec2.bin"); 98MODULE_FIRMWARE("amdgpu/raven2_mec2.bin");
98MODULE_FIRMWARE("amdgpu/raven2_rlc.bin"); 99MODULE_FIRMWARE("amdgpu/raven2_rlc.bin");
100MODULE_FIRMWARE("amdgpu/raven_kicker_rlc.bin");
99 101
100static const struct soc15_reg_golden golden_settings_gc_9_0[] = 102static 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
1261static 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
1261static int smu10_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, uint32_t size) 1272static 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
787int hwmgr_early_init(struct pp_hwmgr *hwmgr); 788int hwmgr_early_init(struct pp_hwmgr *hwmgr);