aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorEric Huang <JinHuiEric.Huang@amd.com>2017-01-24 10:56:21 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-03-29 23:52:51 -0400
commit43f6d14455ed2a993a9f945274e8da63e087d5fa (patch)
tree28b04b39ab60eb8ae26f47254c40d73cc60bd8ef /drivers/gpu
parent3ed2584f0b165dcdfdccc0514c476f901b62b4d9 (diff)
drm/amd/powerplay: add power profile support for Fiji
Signed-off-by: Eric Huang <JinHuiEric.Huang@amd.com> Acked-by: Rex Zhu <Rex.Zhu@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.c65
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.h3
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c1
3 files changed, 68 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.c b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.c
index 0f7a77b7312e..62c41c4fc2e5 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.c
@@ -1721,6 +1721,43 @@ static int fiji_init_arb_table_index(struct pp_smumgr *smumgr)
1721 smu_data->smu7_data.arb_table_start, tmp, SMC_RAM_END); 1721 smu_data->smu7_data.arb_table_start, tmp, SMC_RAM_END);
1722} 1722}
1723 1723
1724static int fiji_save_default_power_profile(struct pp_hwmgr *hwmgr)
1725{
1726 struct fiji_smumgr *data = (struct fiji_smumgr *)(hwmgr->smumgr->backend);
1727 struct SMU73_Discrete_GraphicsLevel *levels =
1728 data->smc_state_table.GraphicsLevel;
1729 unsigned min_level = 1;
1730
1731 hwmgr->default_gfx_power_profile.activity_threshold =
1732 be16_to_cpu(levels[0].ActivityLevel);
1733 hwmgr->default_gfx_power_profile.up_hyst = levels[0].UpHyst;
1734 hwmgr->default_gfx_power_profile.down_hyst = levels[0].DownHyst;
1735 hwmgr->default_gfx_power_profile.type = AMD_PP_GFX_PROFILE;
1736
1737 hwmgr->default_compute_power_profile = hwmgr->default_gfx_power_profile;
1738 hwmgr->default_compute_power_profile.type = AMD_PP_COMPUTE_PROFILE;
1739
1740 /* Workaround compute SDMA instability: disable lowest SCLK
1741 * DPM level. Optimize compute power profile: Use only highest
1742 * 2 power levels (if more than 2 are available), Hysteresis:
1743 * 0ms up, 5ms down
1744 */
1745 if (data->smc_state_table.GraphicsDpmLevelCount > 2)
1746 min_level = data->smc_state_table.GraphicsDpmLevelCount - 2;
1747 else if (data->smc_state_table.GraphicsDpmLevelCount == 2)
1748 min_level = 1;
1749 else
1750 min_level = 0;
1751 hwmgr->default_compute_power_profile.min_sclk =
1752 be32_to_cpu(levels[min_level].SclkFrequency);
1753 hwmgr->default_compute_power_profile.up_hyst = 0;
1754 hwmgr->default_compute_power_profile.down_hyst = 5;
1755
1756 hwmgr->gfx_power_profile = hwmgr->default_gfx_power_profile;
1757 hwmgr->compute_power_profile = hwmgr->default_compute_power_profile;
1758
1759 return 0;
1760}
1724/** 1761/**
1725* Initializes the SMC table and uploads it 1762* Initializes the SMC table and uploads it
1726* 1763*
@@ -1934,6 +1971,9 @@ int fiji_init_smc_table(struct pp_hwmgr *hwmgr)
1934 result = fiji_populate_pm_fuses(hwmgr); 1971 result = fiji_populate_pm_fuses(hwmgr);
1935 PP_ASSERT_WITH_CODE(0 == result, 1972 PP_ASSERT_WITH_CODE(0 == result,
1936 "Failed to populate PM fuses to SMC memory!", return result); 1973 "Failed to populate PM fuses to SMC memory!", return result);
1974
1975 fiji_save_default_power_profile(hwmgr);
1976
1937 return 0; 1977 return 0;
1938} 1978}
1939 1979
@@ -2378,3 +2418,28 @@ bool fiji_is_dpm_running(struct pp_hwmgr *hwmgr)
2378 CGS_IND_REG__SMC, FEATURE_STATUS, VOLTAGE_CONTROLLER_ON)) 2418 CGS_IND_REG__SMC, FEATURE_STATUS, VOLTAGE_CONTROLLER_ON))
2379 ? true : false; 2419 ? true : false;
2380} 2420}
2421
2422int fiji_populate_requested_graphic_levels(struct pp_hwmgr *hwmgr,
2423 struct amd_pp_profile *request)
2424{
2425 struct fiji_smumgr *smu_data = (struct fiji_smumgr *)
2426 (hwmgr->smumgr->backend);
2427 struct SMU73_Discrete_GraphicsLevel *levels =
2428 smu_data->smc_state_table.GraphicsLevel;
2429 uint32_t array = smu_data->smu7_data.dpm_table_start +
2430 offsetof(SMU73_Discrete_DpmTable, GraphicsLevel);
2431 uint32_t array_size = sizeof(struct SMU73_Discrete_GraphicsLevel) *
2432 SMU73_MAX_LEVELS_GRAPHICS;
2433 uint32_t i;
2434
2435 for (i = 0; i < smu_data->smc_state_table.GraphicsDpmLevelCount; i++) {
2436 levels[i].ActivityLevel =
2437 cpu_to_be16(request->activity_threshold);
2438 levels[i].EnabledForActivity = 1;
2439 levels[i].UpHyst = request->up_hyst;
2440 levels[i].DownHyst = request->down_hyst;
2441 }
2442
2443 return smu7_copy_bytes_to_smc(hwmgr->smumgr, array, (uint8_t *)levels,
2444 array_size, SMC_RAM_END);
2445}
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.h b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.h
index d30d150f9ca6..0e9e1f2d7238 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.h
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.h
@@ -46,6 +46,7 @@ uint32_t fiji_get_mac_definition(uint32_t value);
46int fiji_process_firmware_header(struct pp_hwmgr *hwmgr); 46int fiji_process_firmware_header(struct pp_hwmgr *hwmgr);
47int fiji_initialize_mc_reg_table(struct pp_hwmgr *hwmgr); 47int fiji_initialize_mc_reg_table(struct pp_hwmgr *hwmgr);
48bool fiji_is_dpm_running(struct pp_hwmgr *hwmgr); 48bool fiji_is_dpm_running(struct pp_hwmgr *hwmgr);
49 49int fiji_populate_requested_graphic_levels(struct pp_hwmgr *hwmgr,
50 struct amd_pp_profile *request);
50#endif 51#endif
51 52
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
index 54b347366b5d..a1cb78552cf6 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
@@ -519,4 +519,5 @@ const struct pp_smumgr_func fiji_smu_funcs = {
519 .get_mac_definition = fiji_get_mac_definition, 519 .get_mac_definition = fiji_get_mac_definition,
520 .initialize_mc_reg_table = fiji_initialize_mc_reg_table, 520 .initialize_mc_reg_table = fiji_initialize_mc_reg_table,
521 .is_dpm_running = fiji_is_dpm_running, 521 .is_dpm_running = fiji_is_dpm_running,
522 .populate_requested_graphic_levels = fiji_populate_requested_graphic_levels,
522}; 523};