diff options
author | Chengming Gui <Jack.Gui@amd.com> | 2019-01-17 21:01:10 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-03-19 16:04:00 -0400 |
commit | 4dd35181ee4482ed3de0205ca7568ee0d838f34a (patch) | |
tree | 880cc8fdfbd62c03468f9234e6a3913946600567 | |
parent | 3fa36a7df967bd9f665fc61984b1708ed45dffe8 (diff) |
drm/amd/powerplay: add vega20_notify_smc_display_config functions for SMU11
add vega20_notify_smc_display_config functions to
support sys interface for SMU11.
Signed-off-by: Chengming Gui <Jack.Gui@amd.com>
Reviewed-by: Huang Rui <ray.huang@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c index 7f351c80f04e..0440e5c7a66e 100644 --- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c +++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c | |||
@@ -1569,6 +1569,51 @@ static int vega20_apply_clocks_adjust_rules(struct smu_context *smu) | |||
1569 | return 0; | 1569 | return 0; |
1570 | } | 1570 | } |
1571 | 1571 | ||
1572 | static int | ||
1573 | vega20_notify_smc_dispaly_config(struct smu_context *smu) | ||
1574 | { | ||
1575 | struct vega20_dpm_table *dpm_table = smu->smu_dpm.dpm_context; | ||
1576 | struct vega20_single_dpm_table *memtable = &dpm_table->mem_table; | ||
1577 | struct smu_clocks min_clocks = {0}; | ||
1578 | struct pp_display_clock_request clock_req; | ||
1579 | int ret = 0; | ||
1580 | |||
1581 | min_clocks.dcef_clock = smu->display_config->min_dcef_set_clk; | ||
1582 | min_clocks.dcef_clock_in_sr = smu->display_config->min_dcef_deep_sleep_set_clk; | ||
1583 | min_clocks.memory_clock = smu->display_config->min_mem_set_clock; | ||
1584 | |||
1585 | if (smu_feature_is_supported(smu, FEATURE_DPM_DCEFCLK_BIT)) { | ||
1586 | clock_req.clock_type = amd_pp_dcef_clock; | ||
1587 | clock_req.clock_freq_in_khz = min_clocks.dcef_clock * 10; | ||
1588 | if (!smu->funcs->display_clock_voltage_request(smu, &clock_req)) { | ||
1589 | if (smu_feature_is_supported(smu, FEATURE_DS_DCEFCLK_BIT)) { | ||
1590 | ret = smu_send_smc_msg_with_param(smu, | ||
1591 | SMU_MSG_SetMinDeepSleepDcefclk, | ||
1592 | min_clocks.dcef_clock_in_sr/100); | ||
1593 | if (ret) { | ||
1594 | pr_err("Attempt to set divider for DCEFCLK Failed!"); | ||
1595 | return ret; | ||
1596 | } | ||
1597 | } | ||
1598 | } else { | ||
1599 | pr_info("Attempt to set Hard Min for DCEFCLK Failed!"); | ||
1600 | } | ||
1601 | } | ||
1602 | |||
1603 | if (smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT)) { | ||
1604 | memtable->dpm_state.hard_min_level = min_clocks.memory_clock/100; | ||
1605 | ret = smu_send_smc_msg_with_param(smu, | ||
1606 | SMU_MSG_SetHardMinByFreq, | ||
1607 | (PPCLK_UCLK << 16) | memtable->dpm_state.hard_min_level); | ||
1608 | if (ret) { | ||
1609 | pr_err("[%s] Set hard min uclk failed!", __func__); | ||
1610 | return ret; | ||
1611 | } | ||
1612 | } | ||
1613 | |||
1614 | return 0; | ||
1615 | } | ||
1616 | |||
1572 | static const struct pptable_funcs vega20_ppt_funcs = { | 1617 | static const struct pptable_funcs vega20_ppt_funcs = { |
1573 | .alloc_dpm_context = vega20_allocate_dpm_context, | 1618 | .alloc_dpm_context = vega20_allocate_dpm_context, |
1574 | .store_powerplay_table = vega20_store_powerplay_table, | 1619 | .store_powerplay_table = vega20_store_powerplay_table, |