Merge tag 'drm-next-2018-12-14' of git://anongit.freedesktop.org/drm/drm
Pull drm updates from Dave Airlie: "Core: - shared fencing staging removal - drop transactional atomic helpers and move helpers to new location - DP/MST atomic cleanup - Leasing cleanups and drop EXPORT_SYMBOL - Convert drivers to atomic helpers and generic fbdev. - removed deprecated obj_ref/unref in favour of get/put - Improve dumb callback documentation - MODESET_LOCK_BEGIN/END helpers panels: - CDTech panels, Banana Pi Panel, DLC1010GIG, - Olimex LCD-O-LinuXino, Samsung S6D16D0, Truly NT35597 WQXGA, - Himax HX8357D, simulated RTSM AEMv8. - GPD Win2 panel - AUO G101EVN010 vgem: - render node support ttm: - move global init out of drivers - fix LRU handling for ghost objects - Support for simultaneous submissions to multiple engines scheduler: - timeout/fault handling changes to help GPU recovery - helpers for hw with preemption support i915: - Scaler/Watermark fixes - DP MST + powerwell fixes - PSR fixes - Break long get/put shmemfs pages - Icelake fixes - Icelake DSI video mode enablement - Engine workaround improvements amdgpu: - freesync support - GPU reset enabled on CI, VI, SOC15 dGPUs - ABM support in DC - KFD support for vega12/polaris12 - SDMA paging queue on vega - More amdkfd code sharing - DCC scanout on GFX9 - DC kerneldoc - Updated SMU firmware for GFX8 chips - XGMI PSP + hive reset support - GPU reset - DC trace support - Powerplay updates for newer Polaris - Cursor plane update fast path - kfd dma-buf support virtio-gpu: - add EDID support vmwgfx: - pageflip with damage support nouveau: - Initial Turing TU104/TU106 modesetting support msm: - a2xx gpu support for apq8060 and imx5 - a2xx gpummu support - mdp4 display support for apq8060 - DPU fixes and cleanups - enhanced profiling support - debug object naming interface - get_iova/page pinning decoupling tegra: - Tegra194 host1x, VIC and display support enabled - Audio over HDMI for Tegra186 and Tegra194 exynos: - DMA/IOMMU refactoring - plane alpha + blend mode support - Color format fixes for mixer driver rcar-du: - R8A7744 and R8A77470 support - R8A77965 LVDS support imx: - fbdev emulation fix - multi-tiled scalling fixes - SPDX identifiers rockchip - dw_hdmi support - dw-mipi-dsi + dual dsi support - mailbox read size fix qxl: - fix cursor pinning vc4: - YUV support (scaling + cursor) v3d: - enable TFU (Texture Formatting Unit) mali-dp: - add support for linear tiled formats sun4i: - Display Engine 3 support - H6 DE3 mixer 0 support - H6 display engine support - dw-hdmi support - H6 HDMI phy support - implicit fence waiting - BGRX8888 support meson: - Overlay plane support - implicit fence waiting - HDMI 1.4 4k modes bridge: - i2c fixes for sii902x" * tag 'drm-next-2018-12-14' of git://anongit.freedesktop.org/drm/drm: (1403 commits) drm/amd/display: Add fast path for cursor plane updates drm/amdgpu: Enable GPU recovery by default for CI drm/amd/display: Fix duplicating scaling/underscan connector state drm/amd/display: Fix unintialized max_bpc state values Revert "drm/amd/display: Set RMX_ASPECT as default" drm/amdgpu: Fix stub function name drm/msm/dpu: Fix clock issue after bind failure drm/msm/dpu: Clean up dpu_media_info.h static inline functions drm/msm/dpu: Further cleanups for static inline functions drm/msm/dpu: Cleanup the debugfs functions drm/msm/dpu: Remove dpu_irq and unused functions drm/msm: Make irq_postinstall optional drm/msm/dpu: Cleanup callers of dpu_hw_blk_init drm/msm/dpu: Remove unused functions drm/msm/dpu: Remove dpu_crtc_is_enabled() drm/msm/dpu: Remove dpu_crtc_get_mixer_height drm/msm/dpu: Remove dpu_dbg drm/msm: dpu: Remove crtc_lock drm/msm: dpu: Remove vblank_requested flag from dpu_crtc drm/msm: dpu: Separate crtc assignment from vblank enable ...
This commit is contained in:
@@ -300,7 +300,7 @@ static int pp_set_clockgating_by_smu(void *handle, uint32_t msg_id)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->update_clock_gatings == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -387,7 +387,7 @@ static uint32_t pp_dpm_get_sclk(void *handle, bool low)
|
||||
return 0;
|
||||
|
||||
if (hwmgr->hwmgr_func->get_sclk == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -405,7 +405,7 @@ static uint32_t pp_dpm_get_mclk(void *handle, bool low)
|
||||
return 0;
|
||||
|
||||
if (hwmgr->hwmgr_func->get_mclk == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -422,7 +422,7 @@ static void pp_dpm_powergate_vce(void *handle, bool gate)
|
||||
return;
|
||||
|
||||
if (hwmgr->hwmgr_func->powergate_vce == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -438,7 +438,7 @@ static void pp_dpm_powergate_uvd(void *handle, bool gate)
|
||||
return;
|
||||
|
||||
if (hwmgr->hwmgr_func->powergate_uvd == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -505,7 +505,7 @@ static void pp_dpm_set_fan_control_mode(void *handle, uint32_t mode)
|
||||
return;
|
||||
|
||||
if (hwmgr->hwmgr_func->set_fan_control_mode == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -522,7 +522,7 @@ static uint32_t pp_dpm_get_fan_control_mode(void *handle)
|
||||
return 0;
|
||||
|
||||
if (hwmgr->hwmgr_func->get_fan_control_mode == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -540,7 +540,7 @@ static int pp_dpm_set_fan_speed_percent(void *handle, uint32_t percent)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->set_fan_speed_percent == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -558,7 +558,7 @@ static int pp_dpm_get_fan_speed_percent(void *handle, uint32_t *speed)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->get_fan_speed_percent == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -594,7 +594,7 @@ static int pp_dpm_set_fan_speed_rpm(void *handle, uint32_t rpm)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->set_fan_speed_rpm == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -720,12 +720,12 @@ static int pp_dpm_force_clock_level(void *handle,
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->force_clock_level == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) {
|
||||
pr_info("force clock level is for dpm manual mode only.\n");
|
||||
pr_debug("force clock level is for dpm manual mode only.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -745,7 +745,7 @@ static int pp_dpm_print_clock_levels(void *handle,
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->print_clock_levels == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -763,7 +763,7 @@ static int pp_dpm_get_sclk_od(void *handle)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->get_sclk_od == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -781,7 +781,7 @@ static int pp_dpm_set_sclk_od(void *handle, uint32_t value)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->set_sclk_od == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -800,7 +800,7 @@ static int pp_dpm_get_mclk_od(void *handle)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->get_mclk_od == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -818,7 +818,7 @@ static int pp_dpm_set_mclk_od(void *handle, uint32_t value)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->set_mclk_od == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
@@ -878,7 +878,7 @@ static int pp_get_power_profile_mode(void *handle, char *buf)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->get_power_profile_mode == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return snprintf(buf, PAGE_SIZE, "\n");
|
||||
}
|
||||
|
||||
@@ -894,12 +894,12 @@ static int pp_set_power_profile_mode(void *handle, long *input, uint32_t size)
|
||||
return ret;
|
||||
|
||||
if (hwmgr->hwmgr_func->set_power_profile_mode == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL) {
|
||||
pr_info("power profile setting is for manual dpm mode only.\n");
|
||||
pr_debug("power profile setting is for manual dpm mode only.\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -917,7 +917,7 @@ static int pp_odn_edit_dpm_table(void *handle, uint32_t type, long *input, uint3
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->odn_edit_dpm_table == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -935,7 +935,7 @@ static int pp_dpm_switch_power_profile(void *handle,
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->set_power_profile_mode == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -972,7 +972,7 @@ static int pp_set_power_limit(void *handle, uint32_t limit)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->set_power_limit == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1072,7 +1072,7 @@ static int pp_get_current_clocks(void *handle,
|
||||
&hw_clocks, PHM_PerformanceLevelDesignation_Activity);
|
||||
|
||||
if (ret) {
|
||||
pr_info("Error in phm_get_clock_info \n");
|
||||
pr_debug("Error in phm_get_clock_info \n");
|
||||
mutex_unlock(&hwmgr->smu_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1212,7 +1212,7 @@ static int pp_dpm_powergate_mmhub(void *handle)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->powergate_mmhub == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1227,7 +1227,7 @@ static int pp_dpm_powergate_gfx(void *handle, bool gate)
|
||||
return 0;
|
||||
|
||||
if (hwmgr->hwmgr_func->powergate_gfx == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1242,7 +1242,7 @@ static void pp_dpm_powergate_acp(void *handle, bool gate)
|
||||
return;
|
||||
|
||||
if (hwmgr->hwmgr_func->powergate_acp == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1257,7 +1257,7 @@ static void pp_dpm_powergate_sdma(void *handle, bool gate)
|
||||
return;
|
||||
|
||||
if (hwmgr->hwmgr_func->powergate_sdma == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1303,7 +1303,7 @@ static int pp_notify_smu_enable_pwe(void *handle)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->smus_notify_pwe == NULL) {
|
||||
pr_info("%s was not implemented.\n", __func__);
|
||||
pr_info_ratelimited("%s was not implemented.\n", __func__);
|
||||
return -EINVAL;;
|
||||
}
|
||||
|
||||
@@ -1332,6 +1332,78 @@ static int pp_enable_mgpu_fan_boost(void *handle)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pp_set_min_deep_sleep_dcefclk(void *handle, uint32_t clock)
|
||||
{
|
||||
struct pp_hwmgr *hwmgr = handle;
|
||||
|
||||
if (!hwmgr || !hwmgr->pm_en)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->set_min_deep_sleep_dcefclk == NULL) {
|
||||
pr_debug("%s was not implemented.\n", __func__);
|
||||
return -EINVAL;;
|
||||
}
|
||||
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
hwmgr->hwmgr_func->set_min_deep_sleep_dcefclk(hwmgr, clock);
|
||||
mutex_unlock(&hwmgr->smu_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pp_set_hard_min_dcefclk_by_freq(void *handle, uint32_t clock)
|
||||
{
|
||||
struct pp_hwmgr *hwmgr = handle;
|
||||
|
||||
if (!hwmgr || !hwmgr->pm_en)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->set_hard_min_dcefclk_by_freq == NULL) {
|
||||
pr_debug("%s was not implemented.\n", __func__);
|
||||
return -EINVAL;;
|
||||
}
|
||||
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
hwmgr->hwmgr_func->set_hard_min_dcefclk_by_freq(hwmgr, clock);
|
||||
mutex_unlock(&hwmgr->smu_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pp_set_hard_min_fclk_by_freq(void *handle, uint32_t clock)
|
||||
{
|
||||
struct pp_hwmgr *hwmgr = handle;
|
||||
|
||||
if (!hwmgr || !hwmgr->pm_en)
|
||||
return -EINVAL;
|
||||
|
||||
if (hwmgr->hwmgr_func->set_hard_min_fclk_by_freq == NULL) {
|
||||
pr_debug("%s was not implemented.\n", __func__);
|
||||
return -EINVAL;;
|
||||
}
|
||||
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
hwmgr->hwmgr_func->set_hard_min_fclk_by_freq(hwmgr, clock);
|
||||
mutex_unlock(&hwmgr->smu_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pp_set_active_display_count(void *handle, uint32_t count)
|
||||
{
|
||||
struct pp_hwmgr *hwmgr = handle;
|
||||
int ret = 0;
|
||||
|
||||
if (!hwmgr || !hwmgr->pm_en)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&hwmgr->smu_lock);
|
||||
ret = phm_set_active_display_count(hwmgr, count);
|
||||
mutex_unlock(&hwmgr->smu_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct amd_pm_funcs pp_dpm_funcs = {
|
||||
.load_firmware = pp_dpm_load_fw,
|
||||
.wait_for_fw_loading_complete = pp_dpm_fw_loading_complete,
|
||||
@@ -1378,4 +1450,8 @@ static const struct amd_pm_funcs pp_dpm_funcs = {
|
||||
.get_display_mode_validation_clocks = pp_get_display_mode_validation_clocks,
|
||||
.notify_smu_enable_pwe = pp_notify_smu_enable_pwe,
|
||||
.enable_mgpu_fan_boost = pp_enable_mgpu_fan_boost,
|
||||
.set_active_display_count = pp_set_active_display_count,
|
||||
.set_min_deep_sleep_dcefclk = pp_set_min_deep_sleep_dcefclk,
|
||||
.set_hard_min_dcefclk_by_freq = pp_set_hard_min_dcefclk_by_freq,
|
||||
.set_hard_min_fclk_by_freq = pp_set_hard_min_fclk_by_freq,
|
||||
};
|
||||
|
@@ -288,8 +288,8 @@ int phm_store_dal_configuration_data(struct pp_hwmgr *hwmgr,
|
||||
if (display_config == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
if (NULL != hwmgr->hwmgr_func->set_deep_sleep_dcefclk)
|
||||
hwmgr->hwmgr_func->set_deep_sleep_dcefclk(hwmgr, display_config->min_dcef_deep_sleep_set_clk);
|
||||
if (NULL != hwmgr->hwmgr_func->set_min_deep_sleep_dcefclk)
|
||||
hwmgr->hwmgr_func->set_min_deep_sleep_dcefclk(hwmgr, display_config->min_dcef_deep_sleep_set_clk);
|
||||
|
||||
for (index = 0; index < display_config->num_path_including_non_display; index++) {
|
||||
if (display_config->displays[index].controller_id != 0)
|
||||
@@ -480,3 +480,44 @@ int phm_disable_smc_firmware_ctf(struct pp_hwmgr *hwmgr)
|
||||
|
||||
return hwmgr->hwmgr_func->disable_smc_firmware_ctf(hwmgr);
|
||||
}
|
||||
|
||||
int phm_set_active_display_count(struct pp_hwmgr *hwmgr, uint32_t count)
|
||||
{
|
||||
PHM_FUNC_CHECK(hwmgr);
|
||||
|
||||
if (!hwmgr->hwmgr_func->set_active_display_count)
|
||||
return -EINVAL;
|
||||
|
||||
return hwmgr->hwmgr_func->set_active_display_count(hwmgr, count);
|
||||
}
|
||||
|
||||
int phm_set_min_deep_sleep_dcefclk(struct pp_hwmgr *hwmgr, uint32_t clock)
|
||||
{
|
||||
PHM_FUNC_CHECK(hwmgr);
|
||||
|
||||
if (!hwmgr->hwmgr_func->set_min_deep_sleep_dcefclk)
|
||||
return -EINVAL;
|
||||
|
||||
return hwmgr->hwmgr_func->set_min_deep_sleep_dcefclk(hwmgr, clock);
|
||||
}
|
||||
|
||||
int phm_set_hard_min_dcefclk_by_freq(struct pp_hwmgr *hwmgr, uint32_t clock)
|
||||
{
|
||||
PHM_FUNC_CHECK(hwmgr);
|
||||
|
||||
if (!hwmgr->hwmgr_func->set_hard_min_dcefclk_by_freq)
|
||||
return -EINVAL;
|
||||
|
||||
return hwmgr->hwmgr_func->set_hard_min_dcefclk_by_freq(hwmgr, clock);
|
||||
}
|
||||
|
||||
int phm_set_hard_min_fclk_by_freq(struct pp_hwmgr *hwmgr, uint32_t clock)
|
||||
{
|
||||
PHM_FUNC_CHECK(hwmgr);
|
||||
|
||||
if (!hwmgr->hwmgr_func->set_hard_min_fclk_by_freq)
|
||||
return -EINVAL;
|
||||
|
||||
return hwmgr->hwmgr_func->set_hard_min_fclk_by_freq(hwmgr, clock);
|
||||
}
|
||||
|
||||
|
@@ -216,12 +216,12 @@ static inline uint32_t convert_10k_to_mhz(uint32_t clock)
|
||||
return (clock + 99) / 100;
|
||||
}
|
||||
|
||||
static int smu10_set_deep_sleep_dcefclk(struct pp_hwmgr *hwmgr, uint32_t clock)
|
||||
static int smu10_set_min_deep_sleep_dcefclk(struct pp_hwmgr *hwmgr, uint32_t clock)
|
||||
{
|
||||
struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (smu10_data->need_min_deep_sleep_dcefclk &&
|
||||
smu10_data->deep_sleep_dcefclk != convert_10k_to_mhz(clock)) {
|
||||
smu10_data->deep_sleep_dcefclk != convert_10k_to_mhz(clock)) {
|
||||
smu10_data->deep_sleep_dcefclk = convert_10k_to_mhz(clock);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetMinDeepSleepDcefclk,
|
||||
@@ -230,6 +230,34 @@ static int smu10_set_deep_sleep_dcefclk(struct pp_hwmgr *hwmgr, uint32_t clock)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smu10_set_hard_min_dcefclk_by_freq(struct pp_hwmgr *hwmgr, uint32_t clock)
|
||||
{
|
||||
struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (smu10_data->dcf_actual_hard_min_freq &&
|
||||
smu10_data->dcf_actual_hard_min_freq != convert_10k_to_mhz(clock)) {
|
||||
smu10_data->dcf_actual_hard_min_freq = convert_10k_to_mhz(clock);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetHardMinDcefclkByFreq,
|
||||
smu10_data->dcf_actual_hard_min_freq);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smu10_set_hard_min_fclk_by_freq(struct pp_hwmgr *hwmgr, uint32_t clock)
|
||||
{
|
||||
struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (smu10_data->f_actual_hard_min_freq &&
|
||||
smu10_data->f_actual_hard_min_freq != convert_10k_to_mhz(clock)) {
|
||||
smu10_data->f_actual_hard_min_freq = convert_10k_to_mhz(clock);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetHardMinFclkByFreq,
|
||||
smu10_data->f_actual_hard_min_freq);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smu10_set_active_display_count(struct pp_hwmgr *hwmgr, uint32_t count)
|
||||
{
|
||||
struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend);
|
||||
@@ -1206,7 +1234,7 @@ static const struct pp_hwmgr_func smu10_hwmgr_funcs = {
|
||||
.get_max_high_clocks = smu10_get_max_high_clocks,
|
||||
.read_sensor = smu10_read_sensor,
|
||||
.set_active_display_count = smu10_set_active_display_count,
|
||||
.set_deep_sleep_dcefclk = smu10_set_deep_sleep_dcefclk,
|
||||
.set_min_deep_sleep_dcefclk = smu10_set_min_deep_sleep_dcefclk,
|
||||
.dynamic_state_management_enable = smu10_enable_dpm_tasks,
|
||||
.power_off_asic = smu10_power_off_asic,
|
||||
.asic_setup = smu10_setup_asic_task,
|
||||
@@ -1217,6 +1245,8 @@ static const struct pp_hwmgr_func smu10_hwmgr_funcs = {
|
||||
.display_clock_voltage_request = smu10_display_clock_voltage_request,
|
||||
.powergate_gfx = smu10_gfx_off_control,
|
||||
.powergate_sdma = smu10_powergate_sdma,
|
||||
.set_hard_min_dcefclk_by_freq = smu10_set_hard_min_dcefclk_by_freq,
|
||||
.set_hard_min_fclk_by_freq = smu10_set_hard_min_fclk_by_freq,
|
||||
};
|
||||
|
||||
int smu10_init_function_pointers(struct pp_hwmgr *hwmgr)
|
||||
|
@@ -269,7 +269,7 @@ static int smu7_construct_voltage_tables(struct pp_hwmgr *hwmgr)
|
||||
hwmgr->dyn_state.mvdd_dependency_on_mclk);
|
||||
|
||||
PP_ASSERT_WITH_CODE((0 == result),
|
||||
"Failed to retrieve SVI2 MVDD table from dependancy table.",
|
||||
"Failed to retrieve SVI2 MVDD table from dependency table.",
|
||||
return result;);
|
||||
}
|
||||
|
||||
@@ -288,7 +288,7 @@ static int smu7_construct_voltage_tables(struct pp_hwmgr *hwmgr)
|
||||
result = phm_get_svi2_voltage_table_v0(&(data->vddci_voltage_table),
|
||||
hwmgr->dyn_state.vddci_dependency_on_mclk);
|
||||
PP_ASSERT_WITH_CODE((0 == result),
|
||||
"Failed to retrieve SVI2 VDDCI table from dependancy table.",
|
||||
"Failed to retrieve SVI2 VDDCI table from dependency table.",
|
||||
return result);
|
||||
}
|
||||
|
||||
@@ -317,7 +317,7 @@ static int smu7_construct_voltage_tables(struct pp_hwmgr *hwmgr)
|
||||
table_info->vddc_lookup_table);
|
||||
|
||||
PP_ASSERT_WITH_CODE((0 == result),
|
||||
"Failed to retrieve SVI2 VDDC table from dependancy table.", return result;);
|
||||
"Failed to retrieve SVI2 VDDC table from dependency table.", return result;);
|
||||
}
|
||||
|
||||
tmp = smum_get_mac_definition(hwmgr, SMU_MAX_LEVELS_VDDC);
|
||||
@@ -2859,7 +2859,10 @@ static int smu7_vblank_too_short(struct pp_hwmgr *hwmgr,
|
||||
case CHIP_POLARIS10:
|
||||
case CHIP_POLARIS11:
|
||||
case CHIP_POLARIS12:
|
||||
switch_limit_us = data->is_memory_gddr5 ? 190 : 150;
|
||||
if (hwmgr->is_kicker)
|
||||
switch_limit_us = data->is_memory_gddr5 ? 450 : 150;
|
||||
else
|
||||
switch_limit_us = data->is_memory_gddr5 ? 190 : 150;
|
||||
break;
|
||||
case CHIP_VEGAM:
|
||||
switch_limit_us = 30;
|
||||
@@ -4223,9 +4226,17 @@ static int smu7_check_mc_firmware(struct pp_hwmgr *hwmgr)
|
||||
if (tmp & (1 << 23)) {
|
||||
data->mem_latency_high = MEM_LATENCY_HIGH;
|
||||
data->mem_latency_low = MEM_LATENCY_LOW;
|
||||
if ((hwmgr->chip_id == CHIP_POLARIS10) ||
|
||||
(hwmgr->chip_id == CHIP_POLARIS11) ||
|
||||
(hwmgr->chip_id == CHIP_POLARIS12))
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_EnableFFC);
|
||||
} else {
|
||||
data->mem_latency_high = 330;
|
||||
data->mem_latency_low = 330;
|
||||
if ((hwmgr->chip_id == CHIP_POLARIS10) ||
|
||||
(hwmgr->chip_id == CHIP_POLARIS11) ||
|
||||
(hwmgr->chip_id == CHIP_POLARIS12))
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_DisableFFC);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@@ -967,7 +967,7 @@ int smu7_enable_didt_config(struct pp_hwmgr *hwmgr)
|
||||
PP_CAP(PHM_PlatformCaps_TDRamping) ||
|
||||
PP_CAP(PHM_PlatformCaps_TCPRamping)) {
|
||||
|
||||
adev->gfx.rlc.funcs->enter_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_enter_safe_mode(adev);
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
value = 0;
|
||||
value2 = cgs_read_register(hwmgr->device, mmGRBM_GFX_INDEX);
|
||||
@@ -1014,13 +1014,13 @@ int smu7_enable_didt_config(struct pp_hwmgr *hwmgr)
|
||||
"Failed to enable DPM DIDT.", goto error);
|
||||
}
|
||||
mutex_unlock(&adev->grbm_idx_mutex);
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
error:
|
||||
mutex_unlock(&adev->grbm_idx_mutex);
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1034,7 +1034,7 @@ int smu7_disable_didt_config(struct pp_hwmgr *hwmgr)
|
||||
PP_CAP(PHM_PlatformCaps_TDRamping) ||
|
||||
PP_CAP(PHM_PlatformCaps_TCPRamping)) {
|
||||
|
||||
adev->gfx.rlc.funcs->enter_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_enter_safe_mode(adev);
|
||||
|
||||
result = smu7_enable_didt(hwmgr, false);
|
||||
PP_ASSERT_WITH_CODE((result == 0),
|
||||
@@ -1046,12 +1046,12 @@ int smu7_disable_didt_config(struct pp_hwmgr *hwmgr)
|
||||
PP_ASSERT_WITH_CODE((0 == result),
|
||||
"Failed to disable DPM DIDT.", goto error);
|
||||
}
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
error:
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@@ -1228,17 +1228,14 @@ static int smu8_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,
|
||||
|
||||
static int smu8_dpm_powerdown_uvd(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (PP_CAP(PHM_PlatformCaps_UVDPowerGating)) {
|
||||
smu8_nbdpm_pstate_enable_disable(hwmgr, true, true);
|
||||
if (PP_CAP(PHM_PlatformCaps_UVDPowerGating))
|
||||
return smum_send_msg_to_smc(hwmgr, PPSMC_MSG_UVDPowerOFF);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smu8_dpm_powerup_uvd(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
if (PP_CAP(PHM_PlatformCaps_UVDPowerGating)) {
|
||||
smu8_nbdpm_pstate_enable_disable(hwmgr, false, true);
|
||||
return smum_send_msg_to_smc_with_parameter(
|
||||
hwmgr,
|
||||
PPSMC_MSG_UVDPowerON,
|
||||
@@ -1995,6 +1992,7 @@ static const struct pp_hwmgr_func smu8_hwmgr_funcs = {
|
||||
.power_state_set = smu8_set_power_state_tasks,
|
||||
.dynamic_state_management_disable = smu8_disable_dpm_tasks,
|
||||
.notify_cac_buffer_info = smu8_notify_cac_buffer_info,
|
||||
.update_nbdpm_pstate = smu8_nbdpm_pstate_enable_disable,
|
||||
.get_thermal_temperature_range = smu8_get_thermal_temperature_range,
|
||||
};
|
||||
|
||||
|
@@ -937,7 +937,7 @@ static int vega10_enable_cac_driving_se_didt_config(struct pp_hwmgr *hwmgr)
|
||||
|
||||
num_se = adev->gfx.config.max_shader_engines;
|
||||
|
||||
adev->gfx.rlc.funcs->enter_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_enter_safe_mode(adev);
|
||||
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
for (count = 0; count < num_se; count++) {
|
||||
@@ -962,7 +962,7 @@ static int vega10_enable_cac_driving_se_didt_config(struct pp_hwmgr *hwmgr)
|
||||
|
||||
vega10_didt_set_mask(hwmgr, true);
|
||||
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -971,11 +971,11 @@ static int vega10_disable_cac_driving_se_didt_config(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct amdgpu_device *adev = hwmgr->adev;
|
||||
|
||||
adev->gfx.rlc.funcs->enter_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_enter_safe_mode(adev);
|
||||
|
||||
vega10_didt_set_mask(hwmgr, false);
|
||||
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -988,7 +988,7 @@ static int vega10_enable_psm_gc_didt_config(struct pp_hwmgr *hwmgr)
|
||||
|
||||
num_se = adev->gfx.config.max_shader_engines;
|
||||
|
||||
adev->gfx.rlc.funcs->enter_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_enter_safe_mode(adev);
|
||||
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
for (count = 0; count < num_se; count++) {
|
||||
@@ -1007,7 +1007,7 @@ static int vega10_enable_psm_gc_didt_config(struct pp_hwmgr *hwmgr)
|
||||
|
||||
vega10_didt_set_mask(hwmgr, true);
|
||||
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
|
||||
vega10_program_gc_didt_config_registers(hwmgr, GCDiDtDroopCtrlConfig_vega10);
|
||||
if (PP_CAP(PHM_PlatformCaps_GCEDC))
|
||||
@@ -1024,11 +1024,11 @@ static int vega10_disable_psm_gc_didt_config(struct pp_hwmgr *hwmgr)
|
||||
struct amdgpu_device *adev = hwmgr->adev;
|
||||
uint32_t data;
|
||||
|
||||
adev->gfx.rlc.funcs->enter_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_enter_safe_mode(adev);
|
||||
|
||||
vega10_didt_set_mask(hwmgr, false);
|
||||
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
|
||||
if (PP_CAP(PHM_PlatformCaps_GCEDC)) {
|
||||
data = 0x00000000;
|
||||
@@ -1049,7 +1049,7 @@ static int vega10_enable_se_edc_config(struct pp_hwmgr *hwmgr)
|
||||
|
||||
num_se = adev->gfx.config.max_shader_engines;
|
||||
|
||||
adev->gfx.rlc.funcs->enter_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_enter_safe_mode(adev);
|
||||
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
for (count = 0; count < num_se; count++) {
|
||||
@@ -1070,7 +1070,7 @@ static int vega10_enable_se_edc_config(struct pp_hwmgr *hwmgr)
|
||||
|
||||
vega10_didt_set_mask(hwmgr, true);
|
||||
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1079,11 +1079,11 @@ static int vega10_disable_se_edc_config(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct amdgpu_device *adev = hwmgr->adev;
|
||||
|
||||
adev->gfx.rlc.funcs->enter_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_enter_safe_mode(adev);
|
||||
|
||||
vega10_didt_set_mask(hwmgr, false);
|
||||
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1097,7 +1097,7 @@ static int vega10_enable_psm_gc_edc_config(struct pp_hwmgr *hwmgr)
|
||||
|
||||
num_se = adev->gfx.config.max_shader_engines;
|
||||
|
||||
adev->gfx.rlc.funcs->enter_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_enter_safe_mode(adev);
|
||||
|
||||
vega10_program_gc_didt_config_registers(hwmgr, AvfsPSMResetConfig_vega10);
|
||||
|
||||
@@ -1118,7 +1118,7 @@ static int vega10_enable_psm_gc_edc_config(struct pp_hwmgr *hwmgr)
|
||||
|
||||
vega10_didt_set_mask(hwmgr, true);
|
||||
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
|
||||
vega10_program_gc_didt_config_registers(hwmgr, PSMGCEDCDroopCtrlConfig_vega10);
|
||||
|
||||
@@ -1138,11 +1138,11 @@ static int vega10_disable_psm_gc_edc_config(struct pp_hwmgr *hwmgr)
|
||||
struct amdgpu_device *adev = hwmgr->adev;
|
||||
uint32_t data;
|
||||
|
||||
adev->gfx.rlc.funcs->enter_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_enter_safe_mode(adev);
|
||||
|
||||
vega10_didt_set_mask(hwmgr, false);
|
||||
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
|
||||
if (PP_CAP(PHM_PlatformCaps_GCEDC)) {
|
||||
data = 0x00000000;
|
||||
@@ -1160,7 +1160,7 @@ static int vega10_enable_se_edc_force_stall_config(struct pp_hwmgr *hwmgr)
|
||||
struct amdgpu_device *adev = hwmgr->adev;
|
||||
int result;
|
||||
|
||||
adev->gfx.rlc.funcs->enter_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_enter_safe_mode(adev);
|
||||
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
WREG32_SOC15(GC, 0, mmGRBM_GFX_INDEX, 0xE0000000);
|
||||
@@ -1173,7 +1173,7 @@ static int vega10_enable_se_edc_force_stall_config(struct pp_hwmgr *hwmgr)
|
||||
|
||||
vega10_didt_set_mask(hwmgr, false);
|
||||
|
||||
adev->gfx.rlc.funcs->exit_safe_mode(adev);
|
||||
amdgpu_gfx_rlc_exit_safe_mode(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -2777,7 +2777,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,
|
||||
for (i = 0; i < clocks.num_levels; i++)
|
||||
size += sprintf(buf + size, "%d: %uMhz %s\n",
|
||||
i, clocks.data[i].clocks_in_khz / 1000,
|
||||
(clocks.data[i].clocks_in_khz == now) ? "*" : "");
|
||||
(clocks.data[i].clocks_in_khz == now * 10) ? "*" : "");
|
||||
break;
|
||||
|
||||
case PP_MCLK:
|
||||
@@ -2794,7 +2794,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,
|
||||
for (i = 0; i < clocks.num_levels; i++)
|
||||
size += sprintf(buf + size, "%d: %uMhz %s\n",
|
||||
i, clocks.data[i].clocks_in_khz / 1000,
|
||||
(clocks.data[i].clocks_in_khz == now) ? "*" : "");
|
||||
(clocks.data[i].clocks_in_khz == now * 10) ? "*" : "");
|
||||
break;
|
||||
|
||||
case PP_PCIE:
|
||||
@@ -3476,109 +3476,64 @@ static int vega20_get_thermal_temperature_range(struct pp_hwmgr *hwmgr,
|
||||
|
||||
static const struct pp_hwmgr_func vega20_hwmgr_funcs = {
|
||||
/* init/fini related */
|
||||
.backend_init =
|
||||
vega20_hwmgr_backend_init,
|
||||
.backend_fini =
|
||||
vega20_hwmgr_backend_fini,
|
||||
.asic_setup =
|
||||
vega20_setup_asic_task,
|
||||
.power_off_asic =
|
||||
vega20_power_off_asic,
|
||||
.dynamic_state_management_enable =
|
||||
vega20_enable_dpm_tasks,
|
||||
.dynamic_state_management_disable =
|
||||
vega20_disable_dpm_tasks,
|
||||
.backend_init = vega20_hwmgr_backend_init,
|
||||
.backend_fini = vega20_hwmgr_backend_fini,
|
||||
.asic_setup = vega20_setup_asic_task,
|
||||
.power_off_asic = vega20_power_off_asic,
|
||||
.dynamic_state_management_enable = vega20_enable_dpm_tasks,
|
||||
.dynamic_state_management_disable = vega20_disable_dpm_tasks,
|
||||
/* power state related */
|
||||
.apply_clocks_adjust_rules =
|
||||
vega20_apply_clocks_adjust_rules,
|
||||
.pre_display_config_changed =
|
||||
vega20_pre_display_configuration_changed_task,
|
||||
.display_config_changed =
|
||||
vega20_display_configuration_changed_task,
|
||||
.apply_clocks_adjust_rules = vega20_apply_clocks_adjust_rules,
|
||||
.pre_display_config_changed = vega20_pre_display_configuration_changed_task,
|
||||
.display_config_changed = vega20_display_configuration_changed_task,
|
||||
.check_smc_update_required_for_display_configuration =
|
||||
vega20_check_smc_update_required_for_display_configuration,
|
||||
.notify_smc_display_config_after_ps_adjustment =
|
||||
vega20_notify_smc_display_config_after_ps_adjustment,
|
||||
/* export to DAL */
|
||||
.get_sclk =
|
||||
vega20_dpm_get_sclk,
|
||||
.get_mclk =
|
||||
vega20_dpm_get_mclk,
|
||||
.get_dal_power_level =
|
||||
vega20_get_dal_power_level,
|
||||
.get_clock_by_type_with_latency =
|
||||
vega20_get_clock_by_type_with_latency,
|
||||
.get_clock_by_type_with_voltage =
|
||||
vega20_get_clock_by_type_with_voltage,
|
||||
.set_watermarks_for_clocks_ranges =
|
||||
vega20_set_watermarks_for_clocks_ranges,
|
||||
.display_clock_voltage_request =
|
||||
vega20_display_clock_voltage_request,
|
||||
.get_performance_level =
|
||||
vega20_get_performance_level,
|
||||
.get_sclk = vega20_dpm_get_sclk,
|
||||
.get_mclk = vega20_dpm_get_mclk,
|
||||
.get_dal_power_level = vega20_get_dal_power_level,
|
||||
.get_clock_by_type_with_latency = vega20_get_clock_by_type_with_latency,
|
||||
.get_clock_by_type_with_voltage = vega20_get_clock_by_type_with_voltage,
|
||||
.set_watermarks_for_clocks_ranges = vega20_set_watermarks_for_clocks_ranges,
|
||||
.display_clock_voltage_request = vega20_display_clock_voltage_request,
|
||||
.get_performance_level = vega20_get_performance_level,
|
||||
/* UMD pstate, profile related */
|
||||
.force_dpm_level =
|
||||
vega20_dpm_force_dpm_level,
|
||||
.get_power_profile_mode =
|
||||
vega20_get_power_profile_mode,
|
||||
.set_power_profile_mode =
|
||||
vega20_set_power_profile_mode,
|
||||
.force_dpm_level = vega20_dpm_force_dpm_level,
|
||||
.get_power_profile_mode = vega20_get_power_profile_mode,
|
||||
.set_power_profile_mode = vega20_set_power_profile_mode,
|
||||
/* od related */
|
||||
.set_power_limit =
|
||||
vega20_set_power_limit,
|
||||
.get_sclk_od =
|
||||
vega20_get_sclk_od,
|
||||
.set_sclk_od =
|
||||
vega20_set_sclk_od,
|
||||
.get_mclk_od =
|
||||
vega20_get_mclk_od,
|
||||
.set_mclk_od =
|
||||
vega20_set_mclk_od,
|
||||
.odn_edit_dpm_table =
|
||||
vega20_odn_edit_dpm_table,
|
||||
.set_power_limit = vega20_set_power_limit,
|
||||
.get_sclk_od = vega20_get_sclk_od,
|
||||
.set_sclk_od = vega20_set_sclk_od,
|
||||
.get_mclk_od = vega20_get_mclk_od,
|
||||
.set_mclk_od = vega20_set_mclk_od,
|
||||
.odn_edit_dpm_table = vega20_odn_edit_dpm_table,
|
||||
/* for sysfs to retrive/set gfxclk/memclk */
|
||||
.force_clock_level =
|
||||
vega20_force_clock_level,
|
||||
.print_clock_levels =
|
||||
vega20_print_clock_levels,
|
||||
.read_sensor =
|
||||
vega20_read_sensor,
|
||||
.force_clock_level = vega20_force_clock_level,
|
||||
.print_clock_levels = vega20_print_clock_levels,
|
||||
.read_sensor = vega20_read_sensor,
|
||||
/* powergate related */
|
||||
.powergate_uvd =
|
||||
vega20_power_gate_uvd,
|
||||
.powergate_vce =
|
||||
vega20_power_gate_vce,
|
||||
.powergate_uvd = vega20_power_gate_uvd,
|
||||
.powergate_vce = vega20_power_gate_vce,
|
||||
/* thermal related */
|
||||
.start_thermal_controller =
|
||||
vega20_start_thermal_controller,
|
||||
.stop_thermal_controller =
|
||||
vega20_thermal_stop_thermal_controller,
|
||||
.get_thermal_temperature_range =
|
||||
vega20_get_thermal_temperature_range,
|
||||
.register_irq_handlers =
|
||||
smu9_register_irq_handlers,
|
||||
.disable_smc_firmware_ctf =
|
||||
vega20_thermal_disable_alert,
|
||||
.start_thermal_controller = vega20_start_thermal_controller,
|
||||
.stop_thermal_controller = vega20_thermal_stop_thermal_controller,
|
||||
.get_thermal_temperature_range = vega20_get_thermal_temperature_range,
|
||||
.register_irq_handlers = smu9_register_irq_handlers,
|
||||
.disable_smc_firmware_ctf = vega20_thermal_disable_alert,
|
||||
/* fan control related */
|
||||
.get_fan_speed_percent =
|
||||
vega20_fan_ctrl_get_fan_speed_percent,
|
||||
.set_fan_speed_percent =
|
||||
vega20_fan_ctrl_set_fan_speed_percent,
|
||||
.get_fan_speed_info =
|
||||
vega20_fan_ctrl_get_fan_speed_info,
|
||||
.get_fan_speed_rpm =
|
||||
vega20_fan_ctrl_get_fan_speed_rpm,
|
||||
.set_fan_speed_rpm =
|
||||
vega20_fan_ctrl_set_fan_speed_rpm,
|
||||
.get_fan_control_mode =
|
||||
vega20_get_fan_control_mode,
|
||||
.set_fan_control_mode =
|
||||
vega20_set_fan_control_mode,
|
||||
.get_fan_speed_percent = vega20_fan_ctrl_get_fan_speed_percent,
|
||||
.set_fan_speed_percent = vega20_fan_ctrl_set_fan_speed_percent,
|
||||
.get_fan_speed_info = vega20_fan_ctrl_get_fan_speed_info,
|
||||
.get_fan_speed_rpm = vega20_fan_ctrl_get_fan_speed_rpm,
|
||||
.set_fan_speed_rpm = vega20_fan_ctrl_set_fan_speed_rpm,
|
||||
.get_fan_control_mode = vega20_get_fan_control_mode,
|
||||
.set_fan_control_mode = vega20_set_fan_control_mode,
|
||||
/* smu memory related */
|
||||
.notify_cac_buffer_info =
|
||||
vega20_notify_cac_buffer_info,
|
||||
.enable_mgpu_fan_boost =
|
||||
vega20_enable_mgpu_fan_boost,
|
||||
.notify_cac_buffer_info = vega20_notify_cac_buffer_info,
|
||||
.enable_mgpu_fan_boost = vega20_enable_mgpu_fan_boost,
|
||||
};
|
||||
|
||||
int vega20_hwmgr_init(struct pp_hwmgr *hwmgr)
|
||||
|
@@ -463,5 +463,8 @@ extern int phm_display_clock_voltage_request(struct pp_hwmgr *hwmgr,
|
||||
|
||||
extern int phm_get_max_high_clocks(struct pp_hwmgr *hwmgr, struct amd_pp_simple_clock_info *clocks);
|
||||
extern int phm_disable_smc_firmware_ctf(struct pp_hwmgr *hwmgr);
|
||||
|
||||
extern int phm_set_active_display_count(struct pp_hwmgr *hwmgr, uint32_t count);
|
||||
|
||||
#endif /* _HARDWARE_MANAGER_H_ */
|
||||
|
||||
|
@@ -28,7 +28,6 @@
|
||||
#include "hardwaremanager.h"
|
||||
#include "hwmgr_ppt.h"
|
||||
#include "ppatomctrl.h"
|
||||
#include "hwmgr_ppt.h"
|
||||
#include "power_state.h"
|
||||
#include "smu_helper.h"
|
||||
|
||||
@@ -310,7 +309,7 @@ struct pp_hwmgr_func {
|
||||
int (*avfs_control)(struct pp_hwmgr *hwmgr, bool enable);
|
||||
int (*disable_smc_firmware_ctf)(struct pp_hwmgr *hwmgr);
|
||||
int (*set_active_display_count)(struct pp_hwmgr *hwmgr, uint32_t count);
|
||||
int (*set_deep_sleep_dcefclk)(struct pp_hwmgr *hwmgr, uint32_t clock);
|
||||
int (*set_min_deep_sleep_dcefclk)(struct pp_hwmgr *hwmgr, uint32_t clock);
|
||||
int (*start_thermal_controller)(struct pp_hwmgr *hwmgr, struct PP_TemperatureRange *range);
|
||||
int (*notify_cac_buffer_info)(struct pp_hwmgr *hwmgr,
|
||||
uint32_t virtual_addr_low,
|
||||
@@ -318,6 +317,9 @@ struct pp_hwmgr_func {
|
||||
uint32_t mc_addr_low,
|
||||
uint32_t mc_addr_hi,
|
||||
uint32_t size);
|
||||
int (*update_nbdpm_pstate)(struct pp_hwmgr *hwmgr,
|
||||
bool enable,
|
||||
bool lock);
|
||||
int (*get_thermal_temperature_range)(struct pp_hwmgr *hwmgr,
|
||||
struct PP_TemperatureRange *range);
|
||||
int (*get_power_profile_mode)(struct pp_hwmgr *hwmgr, char *buf);
|
||||
@@ -330,6 +332,8 @@ struct pp_hwmgr_func {
|
||||
int (*smus_notify_pwe)(struct pp_hwmgr *hwmgr);
|
||||
int (*powergate_sdma)(struct pp_hwmgr *hwmgr, bool bgate);
|
||||
int (*enable_mgpu_fan_boost)(struct pp_hwmgr *hwmgr);
|
||||
int (*set_hard_min_dcefclk_by_freq)(struct pp_hwmgr *hwmgr, uint32_t clock);
|
||||
int (*set_hard_min_fclk_by_freq)(struct pp_hwmgr *hwmgr, uint32_t clock);
|
||||
};
|
||||
|
||||
struct pp_table_func {
|
||||
|
@@ -37,10 +37,6 @@
|
||||
#include "gmc/gmc_8_1_d.h"
|
||||
#include "gmc/gmc_8_1_sh_mask.h"
|
||||
|
||||
#include "bif/bif_5_0_d.h"
|
||||
#include "bif/bif_5_0_sh_mask.h"
|
||||
|
||||
|
||||
#include "bif/bif_5_0_d.h"
|
||||
#include "bif/bif_5_0_sh_mask.h"
|
||||
|
||||
|
@@ -397,6 +397,9 @@ typedef uint16_t PPSMC_Result;
|
||||
|
||||
#define PPSMC_MSG_SetVBITimeout ((uint16_t) 0x306)
|
||||
|
||||
#define PPSMC_MSG_EnableFFC ((uint16_t) 0x307)
|
||||
#define PPSMC_MSG_DisableFFC ((uint16_t) 0x308)
|
||||
|
||||
#define PPSMC_MSG_EnableDpmDidt ((uint16_t) 0x309)
|
||||
#define PPSMC_MSG_DisableDpmDidt ((uint16_t) 0x30A)
|
||||
|
||||
|
@@ -44,7 +44,6 @@
|
||||
|
||||
#include "smu7_hwmgr.h"
|
||||
#include "hardwaremanager.h"
|
||||
#include "ppatomctrl.h"
|
||||
#include "atombios.h"
|
||||
#include "pppcielanes.h"
|
||||
|
||||
@@ -1529,8 +1528,21 @@ static int polaris10_populate_clock_stretcher_data_table(struct pp_hwmgr *hwmgr)
|
||||
efuse = efuse >> 24;
|
||||
|
||||
if (hwmgr->chip_id == CHIP_POLARIS10) {
|
||||
min = 1000;
|
||||
max = 2300;
|
||||
if (hwmgr->is_kicker) {
|
||||
min = 1200;
|
||||
max = 2500;
|
||||
} else {
|
||||
min = 1000;
|
||||
max = 2300;
|
||||
}
|
||||
} else if (hwmgr->chip_id == CHIP_POLARIS11) {
|
||||
if (hwmgr->is_kicker) {
|
||||
min = 900;
|
||||
max = 2100;
|
||||
} else {
|
||||
min = 1100;
|
||||
max = 2100;
|
||||
}
|
||||
} else {
|
||||
min = 1100;
|
||||
max = 2100;
|
||||
@@ -1627,6 +1639,7 @@ static int polaris10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smu_backend);
|
||||
struct amdgpu_device *adev = hwmgr->adev;
|
||||
|
||||
SMU74_Discrete_DpmTable *table = &(smu_data->smc_state_table);
|
||||
int result = 0;
|
||||
@@ -1646,6 +1659,59 @@ static int polaris10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
|
||||
|
||||
result = atomctrl_get_avfs_information(hwmgr, &avfs_params);
|
||||
|
||||
if (0 == result) {
|
||||
if (((adev->pdev->device == 0x67ef) &&
|
||||
((adev->pdev->revision == 0xe0) ||
|
||||
(adev->pdev->revision == 0xe5))) ||
|
||||
((adev->pdev->device == 0x67ff) &&
|
||||
((adev->pdev->revision == 0xcf) ||
|
||||
(adev->pdev->revision == 0xef) ||
|
||||
(adev->pdev->revision == 0xff)))) {
|
||||
avfs_params.ucEnableApplyAVFS_CKS_OFF_Voltage = 1;
|
||||
if ((adev->pdev->device == 0x67ef && adev->pdev->revision == 0xe5) ||
|
||||
(adev->pdev->device == 0x67ff && adev->pdev->revision == 0xef)) {
|
||||
if ((avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a0 == 0xEA522DD3) &&
|
||||
(avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a1 == 0x5645A) &&
|
||||
(avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a2 == 0x33F9E) &&
|
||||
(avfs_params.ulAVFSGB_FUSE_TABLE_CKSOFF_m1 == 0xFFFFC5CC) &&
|
||||
(avfs_params.usAVFSGB_FUSE_TABLE_CKSOFF_m2 == 0x1B1A) &&
|
||||
(avfs_params.ulAVFSGB_FUSE_TABLE_CKSOFF_b == 0xFFFFFCED)) {
|
||||
avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a0 = 0xF718F1D4;
|
||||
avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a1 = 0x323FD;
|
||||
avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a2 = 0x1E455;
|
||||
avfs_params.ulAVFSGB_FUSE_TABLE_CKSOFF_m1 = 0;
|
||||
avfs_params.usAVFSGB_FUSE_TABLE_CKSOFF_m2 = 0;
|
||||
avfs_params.ulAVFSGB_FUSE_TABLE_CKSOFF_b = 0x23;
|
||||
}
|
||||
}
|
||||
} else if (hwmgr->chip_id == CHIP_POLARIS12 && !hwmgr->is_kicker) {
|
||||
avfs_params.ucEnableApplyAVFS_CKS_OFF_Voltage = 1;
|
||||
avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a0 = 0xF6B024DD;
|
||||
avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a1 = 0x3005E;
|
||||
avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a2 = 0x18A5F;
|
||||
avfs_params.ulAVFSGB_FUSE_TABLE_CKSOFF_m1 = 0x315;
|
||||
avfs_params.usAVFSGB_FUSE_TABLE_CKSOFF_m2 = 0xFED1;
|
||||
avfs_params.ulAVFSGB_FUSE_TABLE_CKSOFF_b = 0x3B;
|
||||
} else if (((adev->pdev->device == 0x67df) &&
|
||||
((adev->pdev->revision == 0xe0) ||
|
||||
(adev->pdev->revision == 0xe3) ||
|
||||
(adev->pdev->revision == 0xe4) ||
|
||||
(adev->pdev->revision == 0xe5) ||
|
||||
(adev->pdev->revision == 0xe7) ||
|
||||
(adev->pdev->revision == 0xef))) ||
|
||||
((adev->pdev->device == 0x6fdf) &&
|
||||
((adev->pdev->revision == 0xef) ||
|
||||
(adev->pdev->revision == 0xff)))) {
|
||||
avfs_params.ucEnableApplyAVFS_CKS_OFF_Voltage = 1;
|
||||
avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a0 = 0xF843B66B;
|
||||
avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a1 = 0x59CB5;
|
||||
avfs_params.ulGB_VDROOP_TABLE_CKSOFF_a2 = 0xFFFF287F;
|
||||
avfs_params.ulAVFSGB_FUSE_TABLE_CKSOFF_m1 = 0;
|
||||
avfs_params.usAVFSGB_FUSE_TABLE_CKSOFF_m2 = 0xFF23;
|
||||
avfs_params.ulAVFSGB_FUSE_TABLE_CKSOFF_b = 0x58;
|
||||
}
|
||||
}
|
||||
|
||||
if (0 == result) {
|
||||
table->BTCGB_VDROOP_TABLE[0].a0 = PP_HOST_TO_SMC_UL(avfs_params.ulGB_VDROOP_TABLE_CKSON_a0);
|
||||
table->BTCGB_VDROOP_TABLE[0].a1 = PP_HOST_TO_SMC_UL(avfs_params.ulGB_VDROOP_TABLE_CKSON_a1);
|
||||
|
@@ -29,7 +29,6 @@
|
||||
#include "rv_ppsmc.h"
|
||||
#include "smu10_driver_if.h"
|
||||
#include "smu10.h"
|
||||
#include "ppatomctrl.h"
|
||||
#include "pp_debug.h"
|
||||
|
||||
|
||||
|
@@ -24,6 +24,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@@ -61,9 +62,13 @@ static uint32_t smu8_get_argument(struct pp_hwmgr *hwmgr)
|
||||
mmSMU_MP1_SRBM2P_ARG_0);
|
||||
}
|
||||
|
||||
static int smu8_send_msg_to_smc_async(struct pp_hwmgr *hwmgr, uint16_t msg)
|
||||
/* Send a message to the SMC, and wait for its response.*/
|
||||
static int smu8_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg, uint32_t parameter)
|
||||
{
|
||||
int result = 0;
|
||||
ktime_t t_start;
|
||||
s64 elapsed_us;
|
||||
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
@@ -74,28 +79,31 @@ static int smu8_send_msg_to_smc_async(struct pp_hwmgr *hwmgr, uint16_t msg)
|
||||
/* Read the last message to SMU, to report actual cause */
|
||||
uint32_t val = cgs_read_register(hwmgr->device,
|
||||
mmSMU_MP1_SRBM2P_MSG_0);
|
||||
pr_err("smu8_send_msg_to_smc_async (0x%04x) failed\n", msg);
|
||||
pr_err("SMU still servicing msg (0x%04x)\n", val);
|
||||
pr_err("%s(0x%04x) aborted; SMU still servicing msg (0x%04x)\n",
|
||||
__func__, msg, val);
|
||||
return result;
|
||||
}
|
||||
t_start = ktime_get();
|
||||
|
||||
cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_ARG_0, parameter);
|
||||
|
||||
cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_RESP_0, 0);
|
||||
cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_MSG_0, msg);
|
||||
|
||||
return 0;
|
||||
result = PHM_WAIT_FIELD_UNEQUAL(hwmgr,
|
||||
SMU_MP1_SRBM2P_RESP_0, CONTENT, 0);
|
||||
|
||||
elapsed_us = ktime_us_delta(ktime_get(), t_start);
|
||||
|
||||
WARN(result, "%s(0x%04x, %#x) timed out after %lld us\n",
|
||||
__func__, msg, parameter, elapsed_us);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Send a message to the SMC, and wait for its response.*/
|
||||
static int smu8_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
result = smu8_send_msg_to_smc_async(hwmgr, msg);
|
||||
if (result != 0)
|
||||
return result;
|
||||
|
||||
return PHM_WAIT_FIELD_UNEQUAL(hwmgr,
|
||||
SMU_MP1_SRBM2P_RESP_0, CONTENT, 0);
|
||||
return smu8_send_msg_to_smc_with_parameter(hwmgr, msg, 0);
|
||||
}
|
||||
|
||||
static int smu8_set_smc_sram_address(struct pp_hwmgr *hwmgr,
|
||||
@@ -135,17 +143,6 @@ static int smu8_write_smc_sram_dword(struct pp_hwmgr *hwmgr,
|
||||
return result;
|
||||
}
|
||||
|
||||
static int smu8_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
|
||||
uint16_t msg, uint32_t parameter)
|
||||
{
|
||||
if (hwmgr == NULL || hwmgr->device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_ARG_0, parameter);
|
||||
|
||||
return smu8_send_msg_to_smc(hwmgr, msg);
|
||||
}
|
||||
|
||||
static int smu8_check_fw_load_finish(struct pp_hwmgr *hwmgr,
|
||||
uint32_t firmware)
|
||||
{
|
||||
@@ -737,6 +734,10 @@ static int smu8_start_smu(struct pp_hwmgr *hwmgr)
|
||||
|
||||
cgs_write_register(hwmgr->device, mmMP0PUB_IND_INDEX, index);
|
||||
hwmgr->smu_version = cgs_read_register(hwmgr->device, mmMP0PUB_IND_DATA);
|
||||
pr_info("smu version %02d.%02d.%02d\n",
|
||||
((hwmgr->smu_version >> 16) & 0xFF),
|
||||
((hwmgr->smu_version >> 8) & 0xFF),
|
||||
(hwmgr->smu_version & 0xFF));
|
||||
adev->pm.fw_version = hwmgr->smu_version >> 8;
|
||||
|
||||
return smu8_request_smu_load_fw(hwmgr);
|
||||
|
@@ -40,7 +40,6 @@
|
||||
|
||||
#include "smu7_hwmgr.h"
|
||||
#include "hardwaremanager.h"
|
||||
#include "ppatomctrl.h"
|
||||
#include "atombios.h"
|
||||
#include "pppcielanes.h"
|
||||
|
||||
|
Viittaa uudesa ongelmassa
Block a user