diff options
author | Eric Huang <JinHuiEric.Huang@amd.com> | 2017-01-24 10:56:21 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-03-29 23:52:51 -0400 |
commit | 43f6d14455ed2a993a9f945274e8da63e087d5fa (patch) | |
tree | 28b04b39ab60eb8ae26f47254c40d73cc60bd8ef /drivers/gpu | |
parent | 3ed2584f0b165dcdfdccc0514c476f901b62b4d9 (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.c | 65 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c | 1 |
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 | ||
1724 | static 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 | |||
2422 | int 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); | |||
46 | int fiji_process_firmware_header(struct pp_hwmgr *hwmgr); | 46 | int fiji_process_firmware_header(struct pp_hwmgr *hwmgr); |
47 | int fiji_initialize_mc_reg_table(struct pp_hwmgr *hwmgr); | 47 | int fiji_initialize_mc_reg_table(struct pp_hwmgr *hwmgr); |
48 | bool fiji_is_dpm_running(struct pp_hwmgr *hwmgr); | 48 | bool fiji_is_dpm_running(struct pp_hwmgr *hwmgr); |
49 | 49 | int 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 | }; |