diff options
Diffstat (limited to 'drivers/gpu/drm/amd/powerplay')
31 files changed, 437 insertions, 662 deletions
| diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c index c7e34128cbde..adb6e7b9280c 100644 --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c @@ -122,7 +122,7 @@ static int pp_sw_init(void *handle)  		ret = hwmgr->smumgr_funcs->smu_init(hwmgr); -		pr_info("amdgpu: powerplay sw initialized\n"); +		pr_debug("amdgpu: powerplay sw initialized\n");  	}  	return ret;  } @@ -162,7 +162,7 @@ static int pp_hw_init(void *handle)  		if(hwmgr->smumgr_funcs->start_smu(pp_handle->hwmgr)) {  			pr_err("smc start failed\n");  			hwmgr->smumgr_funcs->smu_fini(pp_handle->hwmgr); -			return -EINVAL;; +			return -EINVAL;  		}  		if (ret == PP_DPM_DISABLED)  			goto exit; @@ -389,20 +389,12 @@ static int pp_dpm_force_performance_level(void *handle,  	if (level == hwmgr->dpm_level)  		return 0; -	if (hwmgr->hwmgr_func->force_dpm_level == NULL) { -		pr_info("%s was not implemented.\n", __func__); -		return 0; -	} -  	mutex_lock(&pp_handle->pp_lock);  	pp_dpm_en_umd_pstate(hwmgr, &level);  	hwmgr->request_dpm_level = level;  	hwmgr_handle_task(pp_handle, AMD_PP_TASK_READJUST_POWER_STATE, NULL, NULL); -	ret = hwmgr->hwmgr_func->force_dpm_level(hwmgr, level); -	if (!ret) -		hwmgr->dpm_level = hwmgr->request_dpm_level; -  	mutex_unlock(&pp_handle->pp_lock); +  	return 0;  } @@ -726,6 +718,8 @@ static int pp_dpm_get_pp_num_states(void *handle,  	struct pp_instance *pp_handle = (struct pp_instance *)handle;  	int ret = 0; +	memset(data, 0, sizeof(*data)); +  	ret = pp_check(pp_handle);  	if (ret) @@ -788,6 +782,26 @@ static int pp_dpm_get_pp_table(void *handle, char **table)  	return size;  } +static int amd_powerplay_reset(void *handle) +{ +	struct pp_instance *instance = (struct pp_instance *)handle; +	int ret; + +	ret = pp_check(instance); +	if (ret) +		return ret; + +	ret = pp_hw_fini(instance); +	if (ret) +		return ret; + +	ret = hwmgr_hw_init(instance); +	if (ret) +		return ret; + +	return hwmgr_handle_task(instance, AMD_PP_TASK_COMPLETE_INIT, NULL, NULL); +} +  static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size)  {  	struct pp_hwmgr *hwmgr; @@ -1146,64 +1160,41 @@ static int pp_dpm_switch_power_profile(void *handle,  	return 0;  } -const struct amd_pm_funcs pp_dpm_funcs = { -	.get_temperature = pp_dpm_get_temperature, -	.load_firmware = pp_dpm_load_fw, -	.wait_for_fw_loading_complete = pp_dpm_fw_loading_complete, -	.force_performance_level = pp_dpm_force_performance_level, -	.get_performance_level = pp_dpm_get_performance_level, -	.get_current_power_state = pp_dpm_get_current_power_state, -	.get_sclk = pp_dpm_get_sclk, -	.get_mclk = pp_dpm_get_mclk, -	.powergate_vce = pp_dpm_powergate_vce, -	.powergate_uvd = pp_dpm_powergate_uvd, -	.dispatch_tasks = pp_dpm_dispatch_tasks, -	.set_fan_control_mode = pp_dpm_set_fan_control_mode, -	.get_fan_control_mode = pp_dpm_get_fan_control_mode, -	.set_fan_speed_percent = pp_dpm_set_fan_speed_percent, -	.get_fan_speed_percent = pp_dpm_get_fan_speed_percent, -	.get_fan_speed_rpm = pp_dpm_get_fan_speed_rpm, -	.get_pp_num_states = pp_dpm_get_pp_num_states, -	.get_pp_table = pp_dpm_get_pp_table, -	.set_pp_table = pp_dpm_set_pp_table, -	.force_clock_level = pp_dpm_force_clock_level, -	.print_clock_levels = pp_dpm_print_clock_levels, -	.get_sclk_od = pp_dpm_get_sclk_od, -	.set_sclk_od = pp_dpm_set_sclk_od, -	.get_mclk_od = pp_dpm_get_mclk_od, -	.set_mclk_od = pp_dpm_set_mclk_od, -	.read_sensor = pp_dpm_read_sensor, -	.get_vce_clock_state = pp_dpm_get_vce_clock_state, -	.reset_power_profile_state = pp_dpm_reset_power_profile_state, -	.get_power_profile_state = pp_dpm_get_power_profile_state, -	.set_power_profile_state = pp_dpm_set_power_profile_state, -	.switch_power_profile = pp_dpm_switch_power_profile, -	.set_clockgating_by_smu = pp_set_clockgating_by_smu, -}; - -int amd_powerplay_reset(void *handle) +static int pp_dpm_notify_smu_memory_info(void *handle, +					uint32_t virtual_addr_low, +					uint32_t virtual_addr_hi, +					uint32_t mc_addr_low, +					uint32_t mc_addr_hi, +					uint32_t size)  { -	struct pp_instance *instance = (struct pp_instance *)handle; -	int ret; +	struct pp_hwmgr  *hwmgr; +	struct pp_instance *pp_handle = (struct pp_instance *)handle; +	int ret = 0; -	ret = pp_check(instance); -	if (ret) -		return ret; +	ret = pp_check(pp_handle); -	ret = pp_hw_fini(instance);  	if (ret)  		return ret; -	ret = hwmgr_hw_init(instance); -	if (ret) -		return ret; +	hwmgr = pp_handle->hwmgr; -	return hwmgr_handle_task(instance, AMD_PP_TASK_COMPLETE_INIT, NULL, NULL); -} +	if (hwmgr->hwmgr_func->notify_cac_buffer_info == NULL) { +		pr_info("%s was not implemented.\n", __func__); +		return -EINVAL; +	} -/* export this function to DAL */ +	mutex_lock(&pp_handle->pp_lock); + +	ret = hwmgr->hwmgr_func->notify_cac_buffer_info(hwmgr, virtual_addr_low, +					virtual_addr_hi, mc_addr_low, mc_addr_hi, +					size); + +	mutex_unlock(&pp_handle->pp_lock); -int amd_powerplay_display_configuration_change(void *handle, +	return ret; +} + +static int pp_display_configuration_change(void *handle,  	const struct amd_pp_display_configuration *display_config)  {  	struct pp_hwmgr  *hwmgr; @@ -1222,7 +1213,7 @@ int amd_powerplay_display_configuration_change(void *handle,  	return 0;  } -int amd_powerplay_get_display_power_level(void *handle, +static int pp_get_display_power_level(void *handle,  		struct amd_pp_simple_clock_info *output)  {  	struct pp_hwmgr  *hwmgr; @@ -1245,7 +1236,7 @@ int amd_powerplay_get_display_power_level(void *handle,  	return ret;  } -int amd_powerplay_get_current_clocks(void *handle, +static int pp_get_current_clocks(void *handle,  		struct amd_pp_clock_info *clocks)  {  	struct amd_pp_simple_clock_info simple_clocks; @@ -1299,7 +1290,7 @@ int amd_powerplay_get_current_clocks(void *handle,  	return 0;  } -int amd_powerplay_get_clock_by_type(void *handle, enum amd_pp_clock_type type, struct amd_pp_clocks *clocks) +static int pp_get_clock_by_type(void *handle, enum amd_pp_clock_type type, struct amd_pp_clocks *clocks)  {  	struct pp_hwmgr  *hwmgr;  	struct pp_instance *pp_handle = (struct pp_instance *)handle; @@ -1321,7 +1312,7 @@ int amd_powerplay_get_clock_by_type(void *handle, enum amd_pp_clock_type type, s  	return ret;  } -int amd_powerplay_get_clock_by_type_with_latency(void *handle, +static int pp_get_clock_by_type_with_latency(void *handle,  		enum amd_pp_clock_type type,  		struct pp_clock_levels_with_latency *clocks)  { @@ -1343,7 +1334,7 @@ int amd_powerplay_get_clock_by_type_with_latency(void *handle,  	return ret;  } -int amd_powerplay_get_clock_by_type_with_voltage(void *handle, +static int pp_get_clock_by_type_with_voltage(void *handle,  		enum amd_pp_clock_type type,  		struct pp_clock_levels_with_voltage *clocks)  { @@ -1368,7 +1359,7 @@ int amd_powerplay_get_clock_by_type_with_voltage(void *handle,  	return ret;  } -int amd_powerplay_set_watermarks_for_clocks_ranges(void *handle, +static int pp_set_watermarks_for_clocks_ranges(void *handle,  		struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges)  {  	struct pp_hwmgr *hwmgr; @@ -1392,7 +1383,7 @@ int amd_powerplay_set_watermarks_for_clocks_ranges(void *handle,  	return ret;  } -int amd_powerplay_display_clock_voltage_request(void *handle, +static int pp_display_clock_voltage_request(void *handle,  		struct pp_display_clock_request *clock)  {  	struct pp_hwmgr *hwmgr; @@ -1415,7 +1406,7 @@ int amd_powerplay_display_clock_voltage_request(void *handle,  	return ret;  } -int amd_powerplay_get_display_mode_validation_clocks(void *handle, +static int pp_get_display_mode_validation_clocks(void *handle,  		struct amd_pp_simple_clock_info *clocks)  {  	struct pp_hwmgr  *hwmgr; @@ -1441,3 +1432,48 @@ int amd_powerplay_get_display_mode_validation_clocks(void *handle,  	return ret;  } +const struct amd_pm_funcs pp_dpm_funcs = { +	.get_temperature = pp_dpm_get_temperature, +	.load_firmware = pp_dpm_load_fw, +	.wait_for_fw_loading_complete = pp_dpm_fw_loading_complete, +	.force_performance_level = pp_dpm_force_performance_level, +	.get_performance_level = pp_dpm_get_performance_level, +	.get_current_power_state = pp_dpm_get_current_power_state, +	.powergate_vce = pp_dpm_powergate_vce, +	.powergate_uvd = pp_dpm_powergate_uvd, +	.dispatch_tasks = pp_dpm_dispatch_tasks, +	.set_fan_control_mode = pp_dpm_set_fan_control_mode, +	.get_fan_control_mode = pp_dpm_get_fan_control_mode, +	.set_fan_speed_percent = pp_dpm_set_fan_speed_percent, +	.get_fan_speed_percent = pp_dpm_get_fan_speed_percent, +	.get_fan_speed_rpm = pp_dpm_get_fan_speed_rpm, +	.get_pp_num_states = pp_dpm_get_pp_num_states, +	.get_pp_table = pp_dpm_get_pp_table, +	.set_pp_table = pp_dpm_set_pp_table, +	.force_clock_level = pp_dpm_force_clock_level, +	.print_clock_levels = pp_dpm_print_clock_levels, +	.get_sclk_od = pp_dpm_get_sclk_od, +	.set_sclk_od = pp_dpm_set_sclk_od, +	.get_mclk_od = pp_dpm_get_mclk_od, +	.set_mclk_od = pp_dpm_set_mclk_od, +	.read_sensor = pp_dpm_read_sensor, +	.get_vce_clock_state = pp_dpm_get_vce_clock_state, +	.reset_power_profile_state = pp_dpm_reset_power_profile_state, +	.get_power_profile_state = pp_dpm_get_power_profile_state, +	.set_power_profile_state = pp_dpm_set_power_profile_state, +	.switch_power_profile = pp_dpm_switch_power_profile, +	.set_clockgating_by_smu = pp_set_clockgating_by_smu, +	.notify_smu_memory_info = pp_dpm_notify_smu_memory_info, +/* export to DC */ +	.get_sclk = pp_dpm_get_sclk, +	.get_mclk = pp_dpm_get_mclk, +	.display_configuration_change = pp_display_configuration_change, +	.get_display_power_level = pp_get_display_power_level, +	.get_current_clocks = pp_get_current_clocks, +	.get_clock_by_type = pp_get_clock_by_type, +	.get_clock_by_type_with_latency = pp_get_clock_by_type_with_latency, +	.get_clock_by_type_with_voltage = pp_get_clock_by_type_with_voltage, +	.set_watermarks_for_clocks_ranges = pp_set_watermarks_for_clocks_ranges, +	.display_clock_voltage_request = pp_display_clock_voltage_request, +	.get_display_mode_validation_clocks = pp_get_display_mode_validation_clocks, +}; diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c index ad1f6b57884b..b314d09d41af 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c @@ -728,9 +728,6 @@ static int cz_update_sclk_limit(struct pp_hwmgr *hwmgr)  		if (clock < stable_pstate_sclk)  			clock = stable_pstate_sclk; -	} else { -		if (clock < hwmgr->gfx_arbiter.sclk) -			clock = hwmgr->gfx_arbiter.sclk;  	}  	if (cz_hwmgr->sclk_dpm.soft_min_clk != clock) { @@ -1085,14 +1082,8 @@ static int cz_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,  	uint32_t  num_of_active_displays = 0;  	struct cgs_display_info info = {0}; -	cz_ps->evclk = hwmgr->vce_arbiter.evclk; -	cz_ps->ecclk = hwmgr->vce_arbiter.ecclk; -  	cz_ps->need_dfs_bypass = true; -	cz_hwmgr->video_start = (hwmgr->uvd_arbiter.vclk != 0 || hwmgr->uvd_arbiter.dclk != 0 || -				hwmgr->vce_arbiter.evclk != 0 || hwmgr->vce_arbiter.ecclk != 0); -  	cz_hwmgr->battery_state = (PP_StateUILabel_Battery == prequest_ps->classification.ui_label);  	clocks.memoryClock = hwmgr->display_config.min_mem_set_clock != 0 ? @@ -1105,9 +1096,6 @@ static int cz_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,  	if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_StablePState))  		clocks.memoryClock = hwmgr->dyn_state.max_clock_voltage_on_ac.mclk; -	if (clocks.memoryClock < hwmgr->gfx_arbiter.mclk) -		clocks.memoryClock = hwmgr->gfx_arbiter.mclk; -  	force_high = (clocks.memoryClock > cz_hwmgr->sys_info.nbp_memory_clock[CZ_NUM_NBPMEMORYCLOCK - 1])  			|| (num_of_active_displays >= 3); @@ -1339,22 +1327,13 @@ int  cz_dpm_update_vce_dpm(struct pp_hwmgr *hwmgr)  				cz_hwmgr->vce_dpm.hard_min_clk,  				PPSMC_MSG_SetEclkHardMin));  	} else { -		/*Program HardMin based on the vce_arbiter.ecclk */ -		if (hwmgr->vce_arbiter.ecclk == 0) { -			smum_send_msg_to_smc_with_parameter(hwmgr, -					    PPSMC_MSG_SetEclkHardMin, 0); + +		smum_send_msg_to_smc_with_parameter(hwmgr, +					PPSMC_MSG_SetEclkHardMin, 0);  		/* disable ECLK DPM 0. Otherwise VCE could hang if  		 * switching SCLK from DPM 0 to 6/7 */ -			smum_send_msg_to_smc_with_parameter(hwmgr, +		smum_send_msg_to_smc_with_parameter(hwmgr,  					PPSMC_MSG_SetEclkSoftMin, 1); -		} else { -			cz_hwmgr->vce_dpm.hard_min_clk = hwmgr->vce_arbiter.ecclk; -			smum_send_msg_to_smc_with_parameter(hwmgr, -				PPSMC_MSG_SetEclkHardMin, -				cz_get_eclk_level(hwmgr, -					cz_hwmgr->vce_dpm.hard_min_clk, -					PPSMC_MSG_SetEclkHardMin)); -		}  	}  	return 0;  } diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c index 623cff90233d..2b0c53fe4c8d 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c @@ -112,26 +112,29 @@ int phm_force_dpm_levels(struct pp_hwmgr *hwmgr, enum amd_dpm_forced_level level  	PHM_FUNC_CHECK(hwmgr); -	if (hwmgr->hwmgr_func->force_dpm_level != NULL) { +	if (hwmgr->hwmgr_func->force_dpm_level != NULL)  		ret = hwmgr->hwmgr_func->force_dpm_level(hwmgr, level); -		if (ret) -			return ret; - -		if (hwmgr->hwmgr_func->set_power_profile_state) { -			if (hwmgr->current_power_profile == AMD_PP_GFX_PROFILE) -				ret = hwmgr->hwmgr_func->set_power_profile_state( -						hwmgr, -						&hwmgr->gfx_power_profile); -			else if (hwmgr->current_power_profile == AMD_PP_COMPUTE_PROFILE) -				ret = hwmgr->hwmgr_func->set_power_profile_state( -						hwmgr, -						&hwmgr->compute_power_profile); -		} -	}  	return ret;  } +int phm_reset_power_profile_state(struct pp_hwmgr *hwmgr) +{ +	int ret = 0; + +	if (hwmgr->hwmgr_func->set_power_profile_state) { +		if (hwmgr->current_power_profile == AMD_PP_GFX_PROFILE) +			ret = hwmgr->hwmgr_func->set_power_profile_state( +					hwmgr, +					&hwmgr->gfx_power_profile); +		else if (hwmgr->current_power_profile == AMD_PP_COMPUTE_PROFILE) +			ret = hwmgr->hwmgr_func->set_power_profile_state( +					hwmgr, +					&hwmgr->compute_power_profile); +	} +	return ret; +} +  int phm_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,  				   struct pp_power_state *adjusted_ps,  			     const struct pp_power_state *current_ps) diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c index ce59e0e67cb2..0229f774f7a9 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c @@ -149,6 +149,7 @@ int hwmgr_early_init(struct pp_instance *handle)  	hwmgr->power_source = PP_PowerSource_AC;  	hwmgr->pp_table_version = PP_TABLE_V1;  	hwmgr->dpm_level = AMD_DPM_FORCED_LEVEL_AUTO; +	hwmgr->request_dpm_level = AMD_DPM_FORCED_LEVEL_AUTO;  	hwmgr_init_default_caps(hwmgr);  	hwmgr_set_user_specify_caps(hwmgr);  	hwmgr->fan_ctrl_is_in_default_mode = true; diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/pp_overdriver.h b/drivers/gpu/drm/amd/powerplay/hwmgr/pp_overdriver.h index c6ba0d64cfb7..4112a9398163 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/pp_overdriver.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/pp_overdriver.h @@ -43,4 +43,4 @@ struct phm_fuses_default {  extern int pp_override_get_default_fuse_value(uint64_t key,  			struct phm_fuses_default *result); -#endif
\ No newline at end of file +#endif diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/pp_psm.c b/drivers/gpu/drm/amd/powerplay/hwmgr/pp_psm.c index ffa44bbb218e..95ab772e0c3e 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/pp_psm.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/pp_psm.c @@ -244,6 +244,10 @@ int psm_adjust_power_state_dynamic(struct pp_hwmgr *hwmgr, bool skip,  	}  	phm_notify_smc_display_config_after_ps_adjustment(hwmgr); +	if (!phm_force_dpm_levels(hwmgr, hwmgr->request_dpm_level)) +		hwmgr->dpm_level = hwmgr->request_dpm_level; + +	phm_reset_power_profile_state(hwmgr);  	return 0;  } diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c index c062844b15f3..560c1c159fcc 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c @@ -542,4 +542,4 @@ int pp_atomfwctrl_get_vbios_bootup_values(struct pp_hwmgr *hwmgr,  		boot_values->ulDCEFClk   = frequency;  	return 0; -}
\ No newline at end of file +} diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/process_pptables_v1_0.c b/drivers/gpu/drm/amd/powerplay/hwmgr/process_pptables_v1_0.c index a651ebcf44fd..b49d65c3e984 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/process_pptables_v1_0.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/process_pptables_v1_0.c @@ -523,8 +523,7 @@ static int get_pcie_table(  		if ((uint32_t)atom_pcie_table->ucNumEntries <= pcie_count)  			pcie_count = (uint32_t)atom_pcie_table->ucNumEntries;  		else -			pr_err("Number of Pcie Entries exceed the number of SCLK Dpm Levels! \ -			Disregarding the excess entries... \n"); +			pr_err("Number of Pcie Entries exceed the number of SCLK Dpm Levels! Disregarding the excess entries...\n");  		pcie_table->count = pcie_count;  		for (i = 0; i < pcie_count; i++) { @@ -563,8 +562,7 @@ static int get_pcie_table(  		if ((uint32_t)atom_pcie_table->ucNumEntries <= pcie_count)  			pcie_count = (uint32_t)atom_pcie_table->ucNumEntries;  		else -			pr_err("Number of Pcie Entries exceed the number of SCLK Dpm Levels! \ -			Disregarding the excess entries... \n"); +			pr_err("Number of Pcie Entries exceed the number of SCLK Dpm Levels! Disregarding the excess entries...\n");  		pcie_table->count = pcie_count; diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c b/drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c index afae32ee2b0d..c3e7e34535e8 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c @@ -394,8 +394,8 @@ static int get_clock_voltage_dependency_table(struct pp_hwmgr *hwmgr,  		dep_table->entries[i].clk =  			((unsigned long)table->entries[i].ucClockHigh << 16) |  			le16_to_cpu(table->entries[i].usClockLow); -			dep_table->entries[i].v = -				(unsigned long)le16_to_cpu(table->entries[i].usVoltage); +		dep_table->entries[i].v = +			(unsigned long)le16_to_cpu(table->entries[i].usVoltage);  	}  	*ptable = dep_table; @@ -1042,7 +1042,7 @@ static int init_overdrive_limits_V2_1(struct pp_hwmgr *hwmgr,  static int init_overdrive_limits(struct pp_hwmgr *hwmgr,  			const ATOM_PPLIB_POWERPLAYTABLE *powerplay_table)  { -	int result; +	int result = 0;  	uint8_t frev, crev;  	uint16_t size; diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c index 3e0b267c74a8..569073e3a5a1 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.c @@ -159,7 +159,6 @@ static int rv_construct_boot_state(struct pp_hwmgr *hwmgr)  static int rv_set_clock_limit(struct pp_hwmgr *hwmgr, const void *input)  { -	struct rv_hwmgr *rv_data = (struct rv_hwmgr *)(hwmgr->backend);  	struct PP_Clocks clocks = {0};  	struct pp_display_clock_request clock_req; @@ -170,39 +169,6 @@ static int rv_set_clock_limit(struct pp_hwmgr *hwmgr, const void *input)  	PP_ASSERT_WITH_CODE(!rv_display_clock_voltage_request(hwmgr, &clock_req),  				"Attempt to set DCF Clock Failed!", return -EINVAL); -	if (((hwmgr->uvd_arbiter.vclk_soft_min / 100) != rv_data->vclk_soft_min) || -	    ((hwmgr->uvd_arbiter.dclk_soft_min / 100) != rv_data->dclk_soft_min)) { -		rv_data->vclk_soft_min = hwmgr->uvd_arbiter.vclk_soft_min / 100; -		rv_data->dclk_soft_min = hwmgr->uvd_arbiter.dclk_soft_min / 100; -		smum_send_msg_to_smc_with_parameter(hwmgr, -			PPSMC_MSG_SetSoftMinVcn, -			(rv_data->vclk_soft_min << 16) | rv_data->vclk_soft_min); -	} - -	if((hwmgr->gfx_arbiter.sclk_hard_min != 0) && -		((hwmgr->gfx_arbiter.sclk_hard_min / 100) != rv_data->soc_actual_hard_min_freq)) { -		smum_send_msg_to_smc_with_parameter(hwmgr, -					PPSMC_MSG_SetHardMinSocclkByFreq, -					hwmgr->gfx_arbiter.sclk_hard_min / 100); -		rv_read_arg_from_smc(hwmgr, &rv_data->soc_actual_hard_min_freq); -	} - -	if ((hwmgr->gfx_arbiter.gfxclk != 0) && -		(rv_data->gfx_actual_soft_min_freq != (hwmgr->gfx_arbiter.gfxclk))) { -		smum_send_msg_to_smc_with_parameter(hwmgr, -					PPSMC_MSG_SetMinVideoGfxclkFreq, -					hwmgr->gfx_arbiter.gfxclk / 100); -		rv_read_arg_from_smc(hwmgr, &rv_data->gfx_actual_soft_min_freq); -	} - -	if ((hwmgr->gfx_arbiter.fclk != 0) && -		(rv_data->fabric_actual_soft_min_freq != (hwmgr->gfx_arbiter.fclk / 100))) { -		smum_send_msg_to_smc_with_parameter(hwmgr, -					PPSMC_MSG_SetMinVideoFclkFreq, -					hwmgr->gfx_arbiter.fclk / 100); -		rv_read_arg_from_smc(hwmgr, &rv_data->fabric_actual_soft_min_freq); -	} -  	return 0;  } @@ -518,17 +484,161 @@ static int rv_hwmgr_backend_fini(struct pp_hwmgr *hwmgr)  static int rv_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,  				enum amd_dpm_forced_level level)  { +	if (hwmgr->smu_version < 0x1E3700) { +		pr_info("smu firmware version too old, can not set dpm level\n"); +		return 0; +	} + +	switch (level) { +	case AMD_DPM_FORCED_LEVEL_HIGH: +	case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK: +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinGfxClk, +						RAVEN_UMD_PSTATE_PEAK_GFXCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinFclkByFreq, +						RAVEN_UMD_PSTATE_PEAK_FCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinSocclkByFreq, +						RAVEN_UMD_PSTATE_PEAK_SOCCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinVcn, +						RAVEN_UMD_PSTATE_VCE); + +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxGfxClk, +						RAVEN_UMD_PSTATE_PEAK_GFXCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxFclkByFreq, +						RAVEN_UMD_PSTATE_PEAK_FCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxSocclkByFreq, +						RAVEN_UMD_PSTATE_PEAK_SOCCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxVcn, +						RAVEN_UMD_PSTATE_VCE); +		break; +	case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK: +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinGfxClk, +						RAVEN_UMD_PSTATE_MIN_GFXCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxGfxClk, +						RAVEN_UMD_PSTATE_MIN_GFXCLK); +		break; +	case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK: +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinFclkByFreq, +						RAVEN_UMD_PSTATE_MIN_FCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxFclkByFreq, +						RAVEN_UMD_PSTATE_MIN_FCLK); +		break; +	case AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD: +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinGfxClk, +						RAVEN_UMD_PSTATE_GFXCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinFclkByFreq, +						RAVEN_UMD_PSTATE_FCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinSocclkByFreq, +						RAVEN_UMD_PSTATE_SOCCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinVcn, +						RAVEN_UMD_PSTATE_VCE); + +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxGfxClk, +						RAVEN_UMD_PSTATE_GFXCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxFclkByFreq, +						RAVEN_UMD_PSTATE_FCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxSocclkByFreq, +						RAVEN_UMD_PSTATE_SOCCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxVcn, +						RAVEN_UMD_PSTATE_VCE); +		break; +	case AMD_DPM_FORCED_LEVEL_AUTO: +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinGfxClk, +						RAVEN_UMD_PSTATE_MIN_GFXCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinFclkByFreq, +						RAVEN_UMD_PSTATE_MIN_FCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinSocclkByFreq, +						RAVEN_UMD_PSTATE_MIN_SOCCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinVcn, +						RAVEN_UMD_PSTATE_MIN_VCE); + +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxGfxClk, +						RAVEN_UMD_PSTATE_PEAK_GFXCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxFclkByFreq, +						RAVEN_UMD_PSTATE_PEAK_FCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxSocclkByFreq, +						RAVEN_UMD_PSTATE_PEAK_SOCCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxVcn, +						RAVEN_UMD_PSTATE_VCE); +		break; +	case AMD_DPM_FORCED_LEVEL_LOW: +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinGfxClk, +						RAVEN_UMD_PSTATE_MIN_GFXCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxGfxClk, +						RAVEN_UMD_PSTATE_MIN_GFXCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetHardMinFclkByFreq, +						RAVEN_UMD_PSTATE_MIN_FCLK); +		smum_send_msg_to_smc_with_parameter(hwmgr, +						PPSMC_MSG_SetSoftMaxFclkByFreq, +						RAVEN_UMD_PSTATE_MIN_FCLK); +		break; +	case AMD_DPM_FORCED_LEVEL_MANUAL: +	case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT: +	default: +		break; +	}  	return 0;  }  static uint32_t rv_dpm_get_mclk(struct pp_hwmgr *hwmgr, bool low)  { -	return 0; +	struct rv_hwmgr *data; + +	if (hwmgr == NULL) +		return -EINVAL; + +	data = (struct rv_hwmgr *)(hwmgr->backend); + +	if (low) +		return data->clock_vol_info.vdd_dep_on_fclk->entries[0].clk; +	else +		return data->clock_vol_info.vdd_dep_on_fclk->entries[ +			data->clock_vol_info.vdd_dep_on_fclk->count - 1].clk;  }  static uint32_t rv_dpm_get_sclk(struct pp_hwmgr *hwmgr, bool low)  { -	return 0; +	struct rv_hwmgr *data; + +	if (hwmgr == NULL) +		return -EINVAL; + +	data = (struct rv_hwmgr *)(hwmgr->backend); + +	if (low) +		return data->gfx_min_freq_limit; +	else +		return data->gfx_max_freq_limit;  }  static int rv_dpm_patch_boot_state(struct pp_hwmgr *hwmgr, diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.h index 9dc503055394..c3bc311dc59f 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_hwmgr.h @@ -304,4 +304,19 @@ struct pp_hwmgr;  int rv_init_function_pointers(struct pp_hwmgr *hwmgr); +/* UMD PState Raven Msg Parameters in MHz */ +#define RAVEN_UMD_PSTATE_GFXCLK                 700 +#define RAVEN_UMD_PSTATE_SOCCLK                 626 +#define RAVEN_UMD_PSTATE_FCLK                   933 +#define RAVEN_UMD_PSTATE_VCE                    0x03C00320 + +#define RAVEN_UMD_PSTATE_PEAK_GFXCLK            1100 +#define RAVEN_UMD_PSTATE_PEAK_SOCCLK            757 +#define RAVEN_UMD_PSTATE_PEAK_FCLK              1200 + +#define RAVEN_UMD_PSTATE_MIN_GFXCLK             200 +#define RAVEN_UMD_PSTATE_MIN_FCLK               400 +#define RAVEN_UMD_PSTATE_MIN_SOCCLK             200 +#define RAVEN_UMD_PSTATE_MIN_VCE                0x0190012C +  #endif diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_inc.h b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_inc.h index 9a0149370d26..ae59a3fdea8a 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/rv_inc.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/rv_inc.h @@ -25,17 +25,17 @@  #define RAVEN_INC_H -#include "asic_reg/raven1/MP/mp_10_0_default.h" -#include "asic_reg/raven1/MP/mp_10_0_offset.h" -#include "asic_reg/raven1/MP/mp_10_0_sh_mask.h" +#include "asic_reg/mp/mp_10_0_default.h" +#include "asic_reg/mp/mp_10_0_offset.h" +#include "asic_reg/mp/mp_10_0_sh_mask.h" -#include "asic_reg/raven1/NBIO/nbio_7_0_default.h" -#include "asic_reg/raven1/NBIO/nbio_7_0_offset.h" -#include "asic_reg/raven1/NBIO/nbio_7_0_sh_mask.h" +#include "asic_reg/nbio/nbio_7_0_default.h" +#include "asic_reg/nbio/nbio_7_0_offset.h" +#include "asic_reg/nbio/nbio_7_0_sh_mask.h" -#include "asic_reg/raven1/THM/thm_10_0_default.h" -#include "asic_reg/raven1/THM/thm_10_0_offset.h" -#include "asic_reg/raven1/THM/thm_10_0_sh_mask.h" +#include "asic_reg/thm/thm_10_0_default.h" +#include "asic_reg/thm/thm_10_0_offset.h" +#include "asic_reg/thm/thm_10_0_sh_mask.h"  #define ixDDI_PHY_GEN_STATUS                       0x3FCE8 diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c index e33ec7fc5d09..08e8a793714f 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c @@ -2722,9 +2722,6 @@ static int smu7_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,  		}  	} -	smu7_ps->vce_clks.evclk = hwmgr->vce_arbiter.evclk; -	smu7_ps->vce_clks.ecclk = hwmgr->vce_arbiter.ecclk; -  	cgs_get_active_displays_info(hwmgr->device, &info);  	minimum_clocks.engineClock = hwmgr->display_config.min_core_set_clock; @@ -2754,47 +2751,18 @@ static int smu7_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,  		minimum_clocks.memoryClock = stable_pstate_mclk;  	} -	if (minimum_clocks.engineClock < hwmgr->gfx_arbiter.sclk) -		minimum_clocks.engineClock = hwmgr->gfx_arbiter.sclk; - -	if (minimum_clocks.memoryClock < hwmgr->gfx_arbiter.mclk) -		minimum_clocks.memoryClock = hwmgr->gfx_arbiter.mclk; - -	smu7_ps->sclk_threshold = hwmgr->gfx_arbiter.sclk_threshold; - -	if (0 != hwmgr->gfx_arbiter.sclk_over_drive) { -		PP_ASSERT_WITH_CODE((hwmgr->gfx_arbiter.sclk_over_drive <= -				hwmgr->platform_descriptor.overdriveLimit.engineClock), -				"Overdrive sclk exceeds limit", -				hwmgr->gfx_arbiter.sclk_over_drive = -						hwmgr->platform_descriptor.overdriveLimit.engineClock); - -		if (hwmgr->gfx_arbiter.sclk_over_drive >= hwmgr->gfx_arbiter.sclk) -			smu7_ps->performance_levels[1].engine_clock = -					hwmgr->gfx_arbiter.sclk_over_drive; -	} - -	if (0 != hwmgr->gfx_arbiter.mclk_over_drive) { -		PP_ASSERT_WITH_CODE((hwmgr->gfx_arbiter.mclk_over_drive <= -				hwmgr->platform_descriptor.overdriveLimit.memoryClock), -				"Overdrive mclk exceeds limit", -				hwmgr->gfx_arbiter.mclk_over_drive = -						hwmgr->platform_descriptor.overdriveLimit.memoryClock); - -		if (hwmgr->gfx_arbiter.mclk_over_drive >= hwmgr->gfx_arbiter.mclk) -			smu7_ps->performance_levels[1].memory_clock = -					hwmgr->gfx_arbiter.mclk_over_drive; -	} -  	disable_mclk_switching_for_frame_lock = phm_cap_enabled(  				    hwmgr->platform_descriptor.platformCaps,  				    PHM_PlatformCaps_DisableMclkSwitchingForFrameLock); -	disable_mclk_switching = ((1 < info.display_count) || -				  disable_mclk_switching_for_frame_lock || -				  smu7_vblank_too_short(hwmgr, mode_info.vblank_time_us) || -				  (mode_info.refresh_rate > 120)); +	if (info.display_count == 0) +		disable_mclk_switching = false; +	else +		disable_mclk_switching = ((1 < info.display_count) || +					  disable_mclk_switching_for_frame_lock || +					  smu7_vblank_too_short(hwmgr, mode_info.vblank_time_us) || +					  (mode_info.refresh_rate > 120));  	sclk = smu7_ps->performance_levels[0].engine_clock;  	mclk = smu7_ps->performance_levels[0].memory_clock; @@ -4339,9 +4307,9 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,  		for (i = 0; i < pcie_table->count; i++)  			size += sprintf(buf + size, "%d: %s %s\n", i, -					(pcie_table->dpm_levels[i].value == 0) ? "2.5GB, x8" : -					(pcie_table->dpm_levels[i].value == 1) ? "5.0GB, x16" : -					(pcie_table->dpm_levels[i].value == 2) ? "8.0GB, x16" : "", +					(pcie_table->dpm_levels[i].value == 0) ? "2.5GT/s, x8" : +					(pcie_table->dpm_levels[i].value == 1) ? "5.0GT/s, x16" : +					(pcie_table->dpm_levels[i].value == 2) ? "8.0GT/s, x16" : "",  					(i == now) ? "*" : "");  		break;  	default: @@ -4569,13 +4537,6 @@ static int smu7_set_power_profile_state(struct pp_hwmgr *hwmgr,  	int tmp_result, result = 0;  	uint32_t sclk_mask = 0, mclk_mask = 0; -	if (hwmgr->chip_id == CHIP_FIJI) { -		if (request->type == AMD_PP_GFX_PROFILE) -			smu7_enable_power_containment(hwmgr); -		else if (request->type == AMD_PP_COMPUTE_PROFILE) -			smu7_disable_power_containment(hwmgr); -	} -  	if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_AUTO)  		return -EINVAL; @@ -4686,6 +4647,25 @@ static int smu7_notify_cac_buffer_info(struct pp_hwmgr *hwmgr,  	return 0;  } +static int smu7_get_max_high_clocks(struct pp_hwmgr *hwmgr, +					struct amd_pp_simple_clock_info *clocks) +{ +	struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); +	struct smu7_single_dpm_table *sclk_table = &(data->dpm_table.sclk_table); +	struct smu7_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table); + +	if (clocks == NULL) +		return -EINVAL; + +	clocks->memory_max_clock = mclk_table->count > 1 ? +				mclk_table->dpm_levels[mclk_table->count-1].value : +				mclk_table->dpm_levels[0].value; +	clocks->engine_max_clock = sclk_table->count > 1 ? +				sclk_table->dpm_levels[sclk_table->count-1].value : +				sclk_table->dpm_levels[0].value; +	return 0; +} +  static const struct pp_hwmgr_func smu7_hwmgr_funcs = {  	.backend_init = &smu7_hwmgr_backend_init,  	.backend_fini = &smu7_hwmgr_backend_fini, @@ -4738,6 +4718,7 @@ static const struct pp_hwmgr_func smu7_hwmgr_funcs = {  	.disable_smc_firmware_ctf = smu7_thermal_disable_alert,  	.start_thermal_controller = smu7_start_thermal_controller,  	.notify_cac_buffer_info = smu7_notify_cac_buffer_info, +	.get_max_high_clocks = smu7_get_max_high_clocks,  };  uint8_t smu7_get_sleep_divider_id_from_clock(uint32_t clock, diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c index f8d838c2c8ee..5f9c3efb532f 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c @@ -426,9 +426,9 @@ static void vega10_init_dpm_defaults(struct pp_hwmgr *hwmgr)  		data->smu_features[GNLD_VR0HOT].supported = true;  	smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetSmuVersion); -	vega10_read_arg_from_smc(hwmgr, &(data->smu_version)); +	vega10_read_arg_from_smc(hwmgr, &(hwmgr->smu_version));  		/* ACG firmware has major version 5 */ -	if ((data->smu_version & 0xff000000) == 0x5000000) +	if ((hwmgr->smu_version & 0xff000000) == 0x5000000)  		data->smu_features[GNLD_ACG].supported = true;  	if (data->registry_data.didt_support) @@ -546,8 +546,7 @@ static void vega10_patch_with_vdd_leakage(struct pp_hwmgr *hwmgr,  	}  	if (*voltage > ATOM_VIRTUAL_VOLTAGE_ID0) -		pr_info("Voltage value looks like a Leakage ID \ -				but it's not patched\n"); +		pr_info("Voltage value looks like a Leakage ID but it's not patched\n");  }  /** @@ -701,18 +700,14 @@ static int vega10_set_private_data_based_on_pptable(struct pp_hwmgr *hwmgr)  			table_info->vdd_dep_on_mclk;  	PP_ASSERT_WITH_CODE(allowed_sclk_vdd_table, -		"VDD dependency on SCLK table is missing. \ -		This table is mandatory", return -EINVAL); +		"VDD dependency on SCLK table is missing. This table is mandatory", return -EINVAL);  	PP_ASSERT_WITH_CODE(allowed_sclk_vdd_table->count >= 1, -		"VDD dependency on SCLK table is empty. \ -		This table is mandatory", return -EINVAL); +		"VDD dependency on SCLK table is empty. This table is mandatory", return -EINVAL);  	PP_ASSERT_WITH_CODE(allowed_mclk_vdd_table, -		"VDD dependency on MCLK table is missing. \ -		This table is mandatory", return -EINVAL); +		"VDD dependency on MCLK table is missing.  This table is mandatory", return -EINVAL);  	PP_ASSERT_WITH_CODE(allowed_mclk_vdd_table->count >= 1, -		"VDD dependency on MCLK table is empty. \ -		This table is mandatory", return -EINVAL); +		"VDD dependency on MCLK table is empty.  This table is mandatory", return -EINVAL);  	table_info->max_clock_voltage_on_ac.sclk =  		allowed_sclk_vdd_table->entries[allowed_sclk_vdd_table->count - 1].clk; @@ -2884,8 +2879,8 @@ static int vega10_enable_dpm_tasks(struct pp_hwmgr *hwmgr)  			"DPM is already running right , skipping re-enablement!",  			return 0); -	if ((data->smu_version == 0x001c2c00) || -			(data->smu_version == 0x001c2d00)) { +	if ((hwmgr->smu_version == 0x001c2c00) || +			(hwmgr->smu_version == 0x001c2d00)) {  		tmp_result = smum_send_msg_to_smc_with_parameter(hwmgr,  				PPSMC_MSG_UpdatePkgPwrPidAlpha, 1);  		PP_ASSERT_WITH_CODE(!tmp_result, @@ -3129,9 +3124,6 @@ static int vega10_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,  		}  	} -	vega10_ps->vce_clks.evclk = hwmgr->vce_arbiter.evclk; -	vega10_ps->vce_clks.ecclk = hwmgr->vce_arbiter.ecclk; -  	cgs_get_active_displays_info(hwmgr->device, &info);  	/* result = PHM_CheckVBlankTime(hwmgr, &vblankTooShort);*/ @@ -3170,48 +3162,19 @@ static int vega10_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,  		minimum_clocks.memoryClock = stable_pstate_mclk;  	} -	if (minimum_clocks.engineClock < hwmgr->gfx_arbiter.sclk) -		minimum_clocks.engineClock = hwmgr->gfx_arbiter.sclk; - -	if (minimum_clocks.memoryClock < hwmgr->gfx_arbiter.mclk) -		minimum_clocks.memoryClock = hwmgr->gfx_arbiter.mclk; - -	vega10_ps->sclk_threshold = hwmgr->gfx_arbiter.sclk_threshold; - -	if (hwmgr->gfx_arbiter.sclk_over_drive) { -		PP_ASSERT_WITH_CODE((hwmgr->gfx_arbiter.sclk_over_drive <= -				hwmgr->platform_descriptor.overdriveLimit.engineClock), -				"Overdrive sclk exceeds limit", -				hwmgr->gfx_arbiter.sclk_over_drive = -						hwmgr->platform_descriptor.overdriveLimit.engineClock); - -		if (hwmgr->gfx_arbiter.sclk_over_drive >= hwmgr->gfx_arbiter.sclk) -			vega10_ps->performance_levels[1].gfx_clock = -					hwmgr->gfx_arbiter.sclk_over_drive; -	} - -	if (hwmgr->gfx_arbiter.mclk_over_drive) { -		PP_ASSERT_WITH_CODE((hwmgr->gfx_arbiter.mclk_over_drive <= -				hwmgr->platform_descriptor.overdriveLimit.memoryClock), -				"Overdrive mclk exceeds limit", -				hwmgr->gfx_arbiter.mclk_over_drive = -						hwmgr->platform_descriptor.overdriveLimit.memoryClock); - -		if (hwmgr->gfx_arbiter.mclk_over_drive >= hwmgr->gfx_arbiter.mclk) -			vega10_ps->performance_levels[1].mem_clock = -					hwmgr->gfx_arbiter.mclk_over_drive; -	} -  	disable_mclk_switching_for_frame_lock = phm_cap_enabled(  				    hwmgr->platform_descriptor.platformCaps,  				    PHM_PlatformCaps_DisableMclkSwitchingForFrameLock);  	disable_mclk_switching_for_vr = PP_CAP(PHM_PlatformCaps_DisableMclkSwitchForVR);  	force_mclk_high = PP_CAP(PHM_PlatformCaps_ForceMclkHigh); -	disable_mclk_switching = (info.display_count > 1) || -				    disable_mclk_switching_for_frame_lock || -				    disable_mclk_switching_for_vr || -				    force_mclk_high; +	if (info.display_count == 0) +		disable_mclk_switching = false; +	else +		disable_mclk_switching = (info.display_count > 1) || +			disable_mclk_switching_for_frame_lock || +			disable_mclk_switching_for_vr || +			force_mclk_high;  	sclk = vega10_ps->performance_levels[0].gfx_clock;  	mclk = vega10_ps->performance_levels[0].mem_clock; @@ -3416,8 +3379,7 @@ static int vega10_populate_and_upload_sclk_mclk_dpm_levels(  					DPMTABLE_OD_UPDATE_SCLK)) {  			result = vega10_populate_all_graphic_levels(hwmgr);  			PP_ASSERT_WITH_CODE(!result, -					"Failed to populate SCLK during \ -					PopulateNewDPMClocksStates Function!", +					"Failed to populate SCLK during PopulateNewDPMClocksStates Function!",  					return result);  		} @@ -3426,8 +3388,7 @@ static int vega10_populate_and_upload_sclk_mclk_dpm_levels(  					DPMTABLE_OD_UPDATE_MCLK)){  			result = vega10_populate_all_memory_levels(hwmgr);  			PP_ASSERT_WITH_CODE(!result, -					"Failed to populate MCLK during \ -					PopulateNewDPMClocksStates Function!", +					"Failed to populate MCLK during PopulateNewDPMClocksStates Function!",  					return result);  		}  	} else { @@ -3544,8 +3505,7 @@ static int vega10_populate_and_upload_sclk_mclk_dpm_levels(  			data->apply_optimized_settings) {  			result = vega10_populate_all_graphic_levels(hwmgr);  			PP_ASSERT_WITH_CODE(!result, -					"Failed to populate SCLK during \ -					PopulateNewDPMClocksStates Function!", +					"Failed to populate SCLK during PopulateNewDPMClocksStates Function!",  					return result);  		} @@ -3553,8 +3513,7 @@ static int vega10_populate_and_upload_sclk_mclk_dpm_levels(  				(DPMTABLE_OD_UPDATE_MCLK + DPMTABLE_UPDATE_MCLK)) {  			result = vega10_populate_all_memory_levels(hwmgr);  			PP_ASSERT_WITH_CODE(!result, -					"Failed to populate MCLK during \ -					PopulateNewDPMClocksStates Function!", +					"Failed to populate MCLK during PopulateNewDPMClocksStates Function!",  					return result);  		}  	} @@ -3828,10 +3787,7 @@ static int vega10_update_sclk_threshold(struct pp_hwmgr *hwmgr)  	uint32_t low_sclk_interrupt_threshold = 0;  	if (PP_CAP(PHM_PlatformCaps_SclkThrottleLowNotification) && -	    (hwmgr->gfx_arbiter.sclk_threshold != -				data->low_sclk_interrupt_threshold)) { -		data->low_sclk_interrupt_threshold = -				hwmgr->gfx_arbiter.sclk_threshold; +		(data->low_sclk_interrupt_threshold != 0)) {  		low_sclk_interrupt_threshold =  				data->low_sclk_interrupt_threshold; @@ -4654,9 +4610,9 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,  		for (i = 0; i < pcie_table->count; i++)  			size += sprintf(buf + size, "%d: %s %s\n", i, -					(pcie_table->pcie_gen[i] == 0) ? "2.5GB, x1" : -					(pcie_table->pcie_gen[i] == 1) ? "5.0GB, x16" : -					(pcie_table->pcie_gen[i] == 2) ? "8.0GB, x16" : "", +					(pcie_table->pcie_gen[i] == 0) ? "2.5GT/s, x1" : +					(pcie_table->pcie_gen[i] == 1) ? "5.0GT/s, x16" : +					(pcie_table->pcie_gen[i] == 2) ? "8.0GT/s, x16" : "",  					(i == now) ? "*" : "");  		break;  	default: diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h index 8f7358cc3327..e8507ff8dbb3 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h @@ -387,7 +387,6 @@ struct vega10_hwmgr {  	struct vega10_smc_state_table  smc_state_table;  	uint32_t                       config_telemetry; -	uint32_t                       smu_version;  	uint32_t                       acg_loop_state;  	uint32_t                       mem_channels;  }; diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_inc.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_inc.h index 8c55eaa3c32b..faf7ac044348 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_inc.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_inc.h @@ -24,21 +24,20 @@  #ifndef VEGA10_INC_H  #define VEGA10_INC_H -#include "asic_reg/vega10/THM/thm_9_0_default.h" -#include "asic_reg/vega10/THM/thm_9_0_offset.h" -#include "asic_reg/vega10/THM/thm_9_0_sh_mask.h" +#include "asic_reg/thm/thm_9_0_default.h" +#include "asic_reg/thm/thm_9_0_offset.h" +#include "asic_reg/thm/thm_9_0_sh_mask.h" -#include "asic_reg/vega10/MP/mp_9_0_default.h" -#include "asic_reg/vega10/MP/mp_9_0_offset.h" -#include "asic_reg/vega10/MP/mp_9_0_sh_mask.h" +#include "asic_reg/mp/mp_9_0_offset.h" +#include "asic_reg/mp/mp_9_0_sh_mask.h" -#include "asic_reg/vega10/GC/gc_9_0_default.h" -#include "asic_reg/vega10/GC/gc_9_0_offset.h" -#include "asic_reg/vega10/GC/gc_9_0_sh_mask.h" +#include "asic_reg/gc/gc_9_0_default.h" +#include "asic_reg/gc/gc_9_0_offset.h" +#include "asic_reg/gc/gc_9_0_sh_mask.h" -#include "asic_reg/vega10/NBIO/nbio_6_1_default.h" -#include "asic_reg/vega10/NBIO/nbio_6_1_offset.h" -#include "asic_reg/vega10/NBIO/nbio_6_1_sh_mask.h" +#include "asic_reg/nbio/nbio_6_1_default.h" +#include "asic_reg/nbio/nbio_6_1_offset.h" +#include "asic_reg/nbio/nbio_6_1_sh_mask.h"  #endif diff --git a/drivers/gpu/drm/amd/powerplay/inc/amd_powerplay.h b/drivers/gpu/drm/amd/powerplay/inc/amd_powerplay.h index 95932cc88460..152e70db4a81 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/amd_powerplay.h +++ b/drivers/gpu/drm/amd/powerplay/inc/amd_powerplay.h @@ -29,280 +29,7 @@  #include "amd_shared.h"  #include "cgs_common.h"  #include "dm_pp_interface.h" - -extern const struct amd_ip_funcs pp_ip_funcs; -extern const struct amd_pm_funcs pp_dpm_funcs; - -enum amd_pp_sensors { -	AMDGPU_PP_SENSOR_GFX_SCLK = 0, -	AMDGPU_PP_SENSOR_VDDNB, -	AMDGPU_PP_SENSOR_VDDGFX, -	AMDGPU_PP_SENSOR_UVD_VCLK, -	AMDGPU_PP_SENSOR_UVD_DCLK, -	AMDGPU_PP_SENSOR_VCE_ECCLK, -	AMDGPU_PP_SENSOR_GPU_LOAD, -	AMDGPU_PP_SENSOR_GFX_MCLK, -	AMDGPU_PP_SENSOR_GPU_TEMP, -	AMDGPU_PP_SENSOR_VCE_POWER, -	AMDGPU_PP_SENSOR_UVD_POWER, -	AMDGPU_PP_SENSOR_GPU_POWER, -}; - -enum amd_pp_task { -	AMD_PP_TASK_DISPLAY_CONFIG_CHANGE, -	AMD_PP_TASK_ENABLE_USER_STATE, -	AMD_PP_TASK_READJUST_POWER_STATE, -	AMD_PP_TASK_COMPLETE_INIT, -	AMD_PP_TASK_MAX -}; - -struct amd_pp_init { -	struct cgs_device *device; -	uint32_t chip_family; -	uint32_t chip_id; -	bool pm_en; -	uint32_t feature_mask; -}; - -enum amd_pp_display_config_type{ -	AMD_PP_DisplayConfigType_None = 0, -	AMD_PP_DisplayConfigType_DP54 , -	AMD_PP_DisplayConfigType_DP432 , -	AMD_PP_DisplayConfigType_DP324 , -	AMD_PP_DisplayConfigType_DP27, -	AMD_PP_DisplayConfigType_DP243, -	AMD_PP_DisplayConfigType_DP216, -	AMD_PP_DisplayConfigType_DP162, -	AMD_PP_DisplayConfigType_HDMI6G , -	AMD_PP_DisplayConfigType_HDMI297 , -	AMD_PP_DisplayConfigType_HDMI162, -	AMD_PP_DisplayConfigType_LVDS, -	AMD_PP_DisplayConfigType_DVI, -	AMD_PP_DisplayConfigType_WIRELESS, -	AMD_PP_DisplayConfigType_VGA -}; - -struct single_display_configuration -{ -	uint32_t controller_index; -	uint32_t controller_id; -	uint32_t signal_type; -	uint32_t display_state; -	/* phy id for the primary internal transmitter */ -	uint8_t primary_transmitter_phyi_d; -	/* bitmap with the active lanes */ -	uint8_t primary_transmitter_active_lanemap; -	/* phy id for the secondary internal transmitter (for dual-link dvi) */ -	uint8_t secondary_transmitter_phy_id; -	/* bitmap with the active lanes */ -	uint8_t secondary_transmitter_active_lanemap; -	/* misc phy settings for SMU. */ -	uint32_t config_flags; -	uint32_t display_type; -	uint32_t view_resolution_cx; -	uint32_t view_resolution_cy; -	enum amd_pp_display_config_type displayconfigtype; -	uint32_t vertical_refresh; /* for active display */ -}; - -#define MAX_NUM_DISPLAY 32 - -struct amd_pp_display_configuration { -	bool nb_pstate_switch_disable;/* controls NB PState switch */ -	bool cpu_cc6_disable; /* controls CPU CState switch ( on or off) */ -	bool cpu_pstate_disable; -	uint32_t cpu_pstate_separation_time; - -	uint32_t num_display;  /* total number of display*/ -	uint32_t num_path_including_non_display; -	uint32_t crossfire_display_index; -	uint32_t min_mem_set_clock; -	uint32_t min_core_set_clock; -	/* unit 10KHz x bit*/ -	uint32_t min_bus_bandwidth; -	/* minimum required stutter sclk, in 10khz uint32_t ulMinCoreSetClk;*/ -	uint32_t min_core_set_clock_in_sr; - -	struct single_display_configuration displays[MAX_NUM_DISPLAY]; - -	uint32_t vrefresh; /* for active display*/ - -	uint32_t min_vblank_time; /* for active display*/ -	bool multi_monitor_in_sync; -	/* Controller Index of primary display - used in MCLK SMC switching hang -	 * SW Workaround*/ -	uint32_t crtc_index; -	/* htotal*1000/pixelclk - used in MCLK SMC switching hang SW Workaround*/ -	uint32_t line_time_in_us; -	bool invalid_vblank_time; - -	uint32_t display_clk; -	/* -	 * for given display configuration if multimonitormnsync == false then -	 * Memory clock DPMS with this latency or below is allowed, DPMS with -	 * higher latency not allowed. -	 */ -	uint32_t dce_tolerable_mclk_in_active_latency; -	uint32_t min_dcef_set_clk; -	uint32_t min_dcef_deep_sleep_set_clk; -}; - -struct amd_pp_simple_clock_info { -	uint32_t	engine_max_clock; -	uint32_t	memory_max_clock; -	uint32_t	level; -}; - -enum PP_DAL_POWERLEVEL { -	PP_DAL_POWERLEVEL_INVALID = 0, -	PP_DAL_POWERLEVEL_ULTRALOW, -	PP_DAL_POWERLEVEL_LOW, -	PP_DAL_POWERLEVEL_NOMINAL, -	PP_DAL_POWERLEVEL_PERFORMANCE, - -	PP_DAL_POWERLEVEL_0 = PP_DAL_POWERLEVEL_ULTRALOW, -	PP_DAL_POWERLEVEL_1 = PP_DAL_POWERLEVEL_LOW, -	PP_DAL_POWERLEVEL_2 = PP_DAL_POWERLEVEL_NOMINAL, -	PP_DAL_POWERLEVEL_3 = PP_DAL_POWERLEVEL_PERFORMANCE, -	PP_DAL_POWERLEVEL_4 = PP_DAL_POWERLEVEL_3+1, -	PP_DAL_POWERLEVEL_5 = PP_DAL_POWERLEVEL_4+1, -	PP_DAL_POWERLEVEL_6 = PP_DAL_POWERLEVEL_5+1, -	PP_DAL_POWERLEVEL_7 = PP_DAL_POWERLEVEL_6+1, -}; - -struct amd_pp_clock_info { -	uint32_t min_engine_clock; -	uint32_t max_engine_clock; -	uint32_t min_memory_clock; -	uint32_t max_memory_clock; -	uint32_t min_bus_bandwidth; -	uint32_t max_bus_bandwidth; -	uint32_t max_engine_clock_in_sr; -	uint32_t min_engine_clock_in_sr; -	enum PP_DAL_POWERLEVEL max_clocks_state; -}; - -enum amd_pp_clock_type { -	amd_pp_disp_clock = 1, -	amd_pp_sys_clock, -	amd_pp_mem_clock, -	amd_pp_dcef_clock, -	amd_pp_soc_clock, -	amd_pp_pixel_clock, -	amd_pp_phy_clock, -	amd_pp_dcf_clock, -	amd_pp_dpp_clock, -	amd_pp_f_clock = amd_pp_dcef_clock, -}; - -#define MAX_NUM_CLOCKS 16 - -struct amd_pp_clocks { -	uint32_t count; -	uint32_t clock[MAX_NUM_CLOCKS]; -	uint32_t latency[MAX_NUM_CLOCKS]; -}; - - -enum { -	PP_GROUP_UNKNOWN = 0, -	PP_GROUP_GFX = 1, -	PP_GROUP_SYS, -	PP_GROUP_MAX -}; - -struct pp_states_info { -	uint32_t nums; -	uint32_t states[16]; -}; - -struct pp_gpu_power { -	uint32_t vddc_power; -	uint32_t vddci_power; -	uint32_t max_gpu_power; -	uint32_t average_gpu_power; -}; - -struct pp_display_clock_request { -	enum amd_pp_clock_type clock_type; -	uint32_t clock_freq_in_khz; -}; - -#define PP_GROUP_MASK        0xF0000000 -#define PP_GROUP_SHIFT       28 - -#define PP_BLOCK_MASK        0x0FFFFF00 -#define PP_BLOCK_SHIFT       8 - -#define PP_BLOCK_GFX_CG         0x01 -#define PP_BLOCK_GFX_MG         0x02 -#define PP_BLOCK_GFX_3D         0x04 -#define PP_BLOCK_GFX_RLC        0x08 -#define PP_BLOCK_GFX_CP         0x10 -#define PP_BLOCK_SYS_BIF        0x01 -#define PP_BLOCK_SYS_MC         0x02 -#define PP_BLOCK_SYS_ROM        0x04 -#define PP_BLOCK_SYS_DRM        0x08 -#define PP_BLOCK_SYS_HDP        0x10 -#define PP_BLOCK_SYS_SDMA       0x20 - -#define PP_STATE_MASK           0x0000000F -#define PP_STATE_SHIFT          0 -#define PP_STATE_SUPPORT_MASK   0x000000F0 -#define PP_STATE_SUPPORT_SHIFT  0 - -#define PP_STATE_CG             0x01 -#define PP_STATE_LS             0x02 -#define PP_STATE_DS             0x04 -#define PP_STATE_SD             0x08 -#define PP_STATE_SUPPORT_CG     0x10 -#define PP_STATE_SUPPORT_LS     0x20 -#define PP_STATE_SUPPORT_DS     0x40 -#define PP_STATE_SUPPORT_SD     0x80 - -#define PP_CG_MSG_ID(group, block, support, state) (group << PP_GROUP_SHIFT |\ -								block << PP_BLOCK_SHIFT |\ -								support << PP_STATE_SUPPORT_SHIFT |\ -								state << PP_STATE_SHIFT) - -struct amd_powerplay { -	struct cgs_device *cgs_device; -	void *pp_handle; -	const struct amd_ip_funcs *ip_funcs; -	const struct amd_pm_funcs *pp_funcs; -}; - -int amd_powerplay_reset(void *handle); - -int amd_powerplay_display_configuration_change(void *handle, -		const struct amd_pp_display_configuration *input); - -int amd_powerplay_get_display_power_level(void *handle, -		struct amd_pp_simple_clock_info *output); - -int amd_powerplay_get_current_clocks(void *handle, -		struct amd_pp_clock_info *output); - -int amd_powerplay_get_clock_by_type(void *handle, -		enum amd_pp_clock_type type, -		struct amd_pp_clocks *clocks); - -int amd_powerplay_get_clock_by_type_with_latency(void *handle, -		enum amd_pp_clock_type type, -		struct pp_clock_levels_with_latency *clocks); - -int amd_powerplay_get_clock_by_type_with_voltage(void *handle, -		enum amd_pp_clock_type type, -		struct pp_clock_levels_with_voltage *clocks); - -int amd_powerplay_set_watermarks_for_clocks_ranges(void *handle, -		struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges); - -int amd_powerplay_display_clock_voltage_request(void *handle, -		struct pp_display_clock_request *clock); - -int amd_powerplay_get_display_mode_validation_clocks(void *handle, -		struct amd_pp_simple_clock_info *output); +#include "kgd_pp_interface.h"  #endif /* _AMD_POWERPLAY_H_ */ diff --git a/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h b/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h index 57a0467b7267..5716b937a6ad 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h +++ b/drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h @@ -437,5 +437,6 @@ 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_reset_power_profile_state(struct pp_hwmgr *hwmgr);  #endif /* _HARDWARE_MANAGER_H_ */ diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h index 004a40e88bde..565fe0832f41 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h @@ -105,36 +105,6 @@ struct phm_set_power_state_input {  	const struct pp_hw_power_state *pnew_state;  }; -struct phm_acp_arbiter { -	uint32_t acpclk; -}; - -struct phm_uvd_arbiter { -	uint32_t vclk; -	uint32_t dclk; -	uint32_t vclk_ceiling; -	uint32_t dclk_ceiling; -	uint32_t vclk_soft_min; -	uint32_t dclk_soft_min; -}; - -struct phm_vce_arbiter { -	uint32_t   evclk; -	uint32_t   ecclk; -}; - -struct phm_gfx_arbiter { -	uint32_t sclk; -	uint32_t sclk_hard_min; -	uint32_t mclk; -	uint32_t sclk_over_drive; -	uint32_t mclk_over_drive; -	uint32_t sclk_threshold; -	uint32_t num_cus; -	uint32_t gfxclk; -	uint32_t fclk; -}; -  struct phm_clock_array {  	uint32_t count;  	uint32_t values[1]; @@ -722,6 +692,7 @@ enum PP_TABLE_VERSION {  struct pp_hwmgr {  	uint32_t chip_family;  	uint32_t chip_id; +	uint32_t smu_version;  	uint32_t pp_table_version;  	void *device; @@ -737,10 +708,6 @@ struct pp_hwmgr {  	enum amd_dpm_forced_level dpm_level;  	enum amd_dpm_forced_level saved_dpm_level;  	enum amd_dpm_forced_level request_dpm_level; -	struct phm_gfx_arbiter gfx_arbiter; -	struct phm_acp_arbiter acp_arbiter; -	struct phm_uvd_arbiter uvd_arbiter; -	struct phm_vce_arbiter vce_arbiter;  	uint32_t usec_timeout;  	void *pptable;  	struct phm_platform_descriptor platform_descriptor; diff --git a/drivers/gpu/drm/amd/powerplay/inc/pp_soc15.h b/drivers/gpu/drm/amd/powerplay/inc/pp_soc15.h index a511611ec7e0..b7ab69e4c254 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/pp_soc15.h +++ b/drivers/gpu/drm/amd/powerplay/inc/pp_soc15.h @@ -23,7 +23,7 @@  #ifndef PP_SOC15_H  #define PP_SOC15_H -#include "vega10/soc15ip.h" +#include "soc15ip.h"  inline static uint32_t soc15_get_register_offset(  		uint32_t hw_id, diff --git a/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h b/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h index 2b3497135bbd..f15f4df9d0a9 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h +++ b/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h @@ -75,7 +75,12 @@  #define PPSMC_MSG_GetMinGfxclkFrequency         0x2C  #define PPSMC_MSG_GetMaxGfxclkFrequency         0x2D  #define PPSMC_MSG_SoftReset                     0x2E -#define PPSMC_Message_Count                     0x2F +#define PPSMC_MSG_SetSoftMaxGfxClk              0x30 +#define PPSMC_MSG_SetHardMinGfxClk              0x31 +#define PPSMC_MSG_SetSoftMaxSocclkByFreq        0x32 +#define PPSMC_MSG_SetSoftMaxFclkByFreq          0x33 +#define PPSMC_MSG_SetSoftMaxVcn                 0x34 +#define PPSMC_Message_Count                     0x35  typedef uint16_t PPSMC_Result; diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c index 4d672cd15785..0b4a55660de4 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c @@ -1732,8 +1732,7 @@ static int ci_populate_smc_boot_level(struct pp_hwmgr *hwmgr,  	if (0 != result) {  		smu_data->smc_state_table.GraphicsBootLevel = 0; -		pr_err("VBIOS did not find boot engine clock value \ -			in dependency table. Using Graphics DPM level 0!"); +		pr_err("VBIOS did not find boot engine clock value in dependency table. Using Graphics DPM level 0!\n");  		result = 0;  	} @@ -1743,8 +1742,7 @@ static int ci_populate_smc_boot_level(struct pp_hwmgr *hwmgr,  	if (0 != result) {  		smu_data->smc_state_table.MemoryBootLevel = 0; -		pr_err("VBIOS did not find boot engine clock value \ -			in dependency table. Using Memory DPM level 0!"); +		pr_err("VBIOS did not find boot engine clock value in dependency table. Using Memory DPM level 0!\n");  		result = 0;  	} @@ -2220,10 +2218,7 @@ static int ci_update_sclk_threshold(struct pp_hwmgr *hwmgr)  	if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,  			PHM_PlatformCaps_SclkThrottleLowNotification) -		&& (hwmgr->gfx_arbiter.sclk_threshold != -				data->low_sclk_interrupt_threshold)) { -		data->low_sclk_interrupt_threshold = -				hwmgr->gfx_arbiter.sclk_threshold; +		&& (data->low_sclk_interrupt_threshold != 0)) {  		low_sclk_interrupt_threshold =  				data->low_sclk_interrupt_threshold; @@ -2321,6 +2316,7 @@ static int ci_load_smc_ucode(struct pp_hwmgr *hwmgr)  	cgs_get_firmware_info(hwmgr->device, CGS_UCODE_ID_SMU, &info);  	hwmgr->is_kicker = info.is_kicker; +	hwmgr->smu_version = info.version;  	byte_count = info.image_size;  	src = (uint8_t *)info.kptr;  	start_addr = info.ucode_start_address; @@ -2602,9 +2598,9 @@ static int ci_set_mc_special_registers(struct pp_hwmgr *hwmgr,  					((table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16);  			}  			j++; +  			PP_ASSERT_WITH_CODE((j < SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE),  				"Invalid VramInfo table.", return -EINVAL); -  			temp_reg = cgs_read_register(hwmgr->device, mmMC_PMG_CMD_MRS);  			table->mc_reg_address[j].s1 = mmMC_PMG_CMD_MRS;  			table->mc_reg_address[j].s0 = mmMC_SEQ_PMG_CMD_MRS_LP; @@ -2617,10 +2613,10 @@ static int ci_set_mc_special_registers(struct pp_hwmgr *hwmgr,  					table->mc_reg_table_entry[k].mc_data[j] |= 0x100;  			}  			j++; -			PP_ASSERT_WITH_CODE((j <= SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE), -				"Invalid VramInfo table.", return -EINVAL); -			if (!data->is_memory_gddr5 && j < SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE) { +			if (!data->is_memory_gddr5) { +				PP_ASSERT_WITH_CODE((j < SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE), +					"Invalid VramInfo table.", return -EINVAL);  				table->mc_reg_address[j].s1 = mmMC_PMG_AUTO_CMD;  				table->mc_reg_address[j].s0 = mmMC_PMG_AUTO_CMD;  				for (k = 0; k < table->num_entries; k++) { @@ -2628,8 +2624,6 @@ static int ci_set_mc_special_registers(struct pp_hwmgr *hwmgr,  						(table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16;  				}  				j++; -				PP_ASSERT_WITH_CODE((j <= SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE), -					"Invalid VramInfo table.", return -EINVAL);  			}  			break; @@ -2644,8 +2638,6 @@ static int ci_set_mc_special_registers(struct pp_hwmgr *hwmgr,  					(table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);  			}  			j++; -			PP_ASSERT_WITH_CODE((j <= SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE), -				"Invalid VramInfo table.", return -EINVAL);  			break;  		default: diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c index 78ab0556e48f..4d3aff381bca 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c @@ -709,6 +709,19 @@ static int cz_start_smu(struct pp_hwmgr *hwmgr)  {  	int ret = 0;  	uint32_t fw_to_check = 0; +	struct cgs_firmware_info info = {0}; +	uint32_t index = SMN_MP1_SRAM_START_ADDR + +			 SMU8_FIRMWARE_HEADER_LOCATION + +			 offsetof(struct SMU8_Firmware_Header, Version); + + +	if (hwmgr == NULL || hwmgr->device == NULL) +		return -EINVAL; + +	cgs_write_register(hwmgr->device, mmMP0PUB_IND_INDEX, index); +	hwmgr->smu_version = cgs_read_register(hwmgr->device, mmMP0PUB_IND_DATA); +	info.version = hwmgr->smu_version >> 8; +	cgs_get_firmware_info(hwmgr->device, CGS_UCODE_ID_SMU, &info);  	fw_to_check = UCODE_ID_RLC_G_MASK |  			UCODE_ID_SDMA0_MASK | diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c index f572beff197f..085d81c8b332 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c @@ -2385,10 +2385,7 @@ static int fiji_update_sclk_threshold(struct pp_hwmgr *hwmgr)  	if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,  			PHM_PlatformCaps_SclkThrottleLowNotification) -		&& (hwmgr->gfx_arbiter.sclk_threshold != -				data->low_sclk_interrupt_threshold)) { -		data->low_sclk_interrupt_threshold = -				hwmgr->gfx_arbiter.sclk_threshold; +		&& (data->low_sclk_interrupt_threshold != 0)) {  		low_sclk_interrupt_threshold =  				data->low_sclk_interrupt_threshold; diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c index 34128822b8fb..125312691f75 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c @@ -204,7 +204,7 @@ static int iceland_smu_upload_firmware_image(struct pp_hwmgr *hwmgr)  		pr_err("[ powerplay ] SMC address is beyond the SMC RAM area\n");  		return -EINVAL;  	} - +	hwmgr->smu_version = info.version;  	/* wait for smc boot up */  	PHM_WAIT_INDIRECT_FIELD_UNEQUAL(hwmgr, SMC_IND,  					 RCU_UC_EVENTS, boot_seq_done, 0); @@ -911,8 +911,7 @@ static int iceland_populate_single_graphic_level(struct pp_hwmgr *hwmgr,  		hwmgr->dyn_state.vddc_dependency_on_sclk, engine_clock,  		&graphic_level->MinVddc);  	PP_ASSERT_WITH_CODE((0 == result), -		"can not find VDDC voltage value for VDDC	\ -		engine clock dependency table", return result); +		"can not find VDDC voltage value for VDDC engine clock dependency table", return result);  	/* SCLK frequency in units of 10KHz*/  	graphic_level->SclkFrequency = engine_clock; @@ -1678,8 +1677,7 @@ static int iceland_populate_smc_boot_level(struct pp_hwmgr *hwmgr,  	if (0 != result) {  		smu_data->smc_state_table.GraphicsBootLevel = 0; -		pr_err("VBIOS did not find boot engine clock value \ -			in dependency table. Using Graphics DPM level 0!"); +		pr_err("VBIOS did not find boot engine clock value in dependency table. Using Graphics DPM level 0!\n");  		result = 0;  	} @@ -1689,8 +1687,7 @@ static int iceland_populate_smc_boot_level(struct pp_hwmgr *hwmgr,  	if (0 != result) {  		smu_data->smc_state_table.MemoryBootLevel = 0; -		pr_err("VBIOS did not find boot engine clock value \ -			in dependency table. Using Memory DPM level 0!"); +		pr_err("VBIOS did not find boot engine clock value in dependency table. Using Memory DPM level 0!\n");  		result = 0;  	} @@ -2205,10 +2202,7 @@ static int iceland_update_sclk_threshold(struct pp_hwmgr *hwmgr)  	if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,  			PHM_PlatformCaps_SclkThrottleLowNotification) -		&& (hwmgr->gfx_arbiter.sclk_threshold != -				data->low_sclk_interrupt_threshold)) { -		data->low_sclk_interrupt_threshold = -				hwmgr->gfx_arbiter.sclk_threshold; +		&& (data->low_sclk_interrupt_threshold != 0)) {  		low_sclk_interrupt_threshold =  				data->low_sclk_interrupt_threshold; @@ -2552,9 +2546,9 @@ static int iceland_set_mc_special_registers(struct pp_hwmgr *hwmgr,  					((table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16);  			}  			j++; +  			PP_ASSERT_WITH_CODE((j < SMU71_DISCRETE_MC_REGISTER_ARRAY_SIZE),  				"Invalid VramInfo table.", return -EINVAL); -  			temp_reg = cgs_read_register(hwmgr->device, mmMC_PMG_CMD_MRS);  			table->mc_reg_address[j].s1 = mmMC_PMG_CMD_MRS;  			table->mc_reg_address[j].s0 = mmMC_SEQ_PMG_CMD_MRS_LP; @@ -2568,10 +2562,10 @@ static int iceland_set_mc_special_registers(struct pp_hwmgr *hwmgr,  				}  			}  			j++; -			PP_ASSERT_WITH_CODE((j <= SMU71_DISCRETE_MC_REGISTER_ARRAY_SIZE), -				"Invalid VramInfo table.", return -EINVAL); -			if (!data->is_memory_gddr5 && j < SMU71_DISCRETE_MC_REGISTER_ARRAY_SIZE) { +			if (!data->is_memory_gddr5) { +				PP_ASSERT_WITH_CODE((j < SMU71_DISCRETE_MC_REGISTER_ARRAY_SIZE), +					"Invalid VramInfo table.", return -EINVAL);  				table->mc_reg_address[j].s1 = mmMC_PMG_AUTO_CMD;  				table->mc_reg_address[j].s0 = mmMC_PMG_AUTO_CMD;  				for (k = 0; k < table->num_entries; k++) { @@ -2579,8 +2573,6 @@ static int iceland_set_mc_special_registers(struct pp_hwmgr *hwmgr,  						(table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16;  				}  				j++; -				PP_ASSERT_WITH_CODE((j <= SMU71_DISCRETE_MC_REGISTER_ARRAY_SIZE), -					"Invalid VramInfo table.", return -EINVAL);  			}  			break; @@ -2595,8 +2587,6 @@ static int iceland_set_mc_special_registers(struct pp_hwmgr *hwmgr,  					(table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);  			}  			j++; -			PP_ASSERT_WITH_CODE((j <= SMU71_DISCRETE_MC_REGISTER_ARRAY_SIZE), -				"Invalid VramInfo table.", return -EINVAL);  			break;  		default: diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c index bd6be7793ca7..cdb47657b567 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c @@ -2369,10 +2369,7 @@ static int polaris10_update_sclk_threshold(struct pp_hwmgr *hwmgr)  	if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,  			PHM_PlatformCaps_SclkThrottleLowNotification) -		&& (hwmgr->gfx_arbiter.sclk_threshold != -				data->low_sclk_interrupt_threshold)) { -		data->low_sclk_interrupt_threshold = -				hwmgr->gfx_arbiter.sclk_threshold; +		&& (data->low_sclk_interrupt_threshold != 0)) {  		low_sclk_interrupt_threshold =  				data->low_sclk_interrupt_threshold; diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c index b98ade676d12..2d662b44af54 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.c @@ -305,6 +305,14 @@ static int rv_smu_fini(struct pp_hwmgr *hwmgr)  static int rv_start_smu(struct pp_hwmgr *hwmgr)  { +	struct cgs_firmware_info info = {0}; + +	smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetSmuVersion); +	rv_read_arg_from_smc(hwmgr, &hwmgr->smu_version); +	info.version = hwmgr->smu_version >> 8; + +	cgs_get_firmware_info(hwmgr->device, CGS_UCODE_ID_SMU, &info); +  	if (rv_verify_smc_interface(hwmgr))  		return -EINVAL;  	if (rv_smc_enable_sdma(hwmgr)) diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h index 58888400f1b8..caebdbebdcd8 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h +++ b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h @@ -40,7 +40,7 @@ struct smu_table_entry {  	uint32_t table_addr_high;  	uint32_t table_addr_low;  	uint8_t *table; -	uint32_t handle; +	unsigned long handle;  };  struct smu_table_array { diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c index 7f5359a97ef2..311ff3718618 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c @@ -535,7 +535,7 @@ int smu7_upload_smu_firmware_image(struct pp_hwmgr *hwmgr)  			smu7_convert_fw_type_to_cgs(UCODE_ID_SMU_SK), &info);  	hwmgr->is_kicker = info.is_kicker; - +	hwmgr->smu_version = info.version;  	result = smu7_upload_smc_firmware_data(hwmgr, info.image_size, (uint32_t *)info.kptr, SMU7_SMC_SIZE);  	return result; @@ -648,6 +648,12 @@ int smu7_init(struct pp_hwmgr *hwmgr)  int smu7_smu_fini(struct pp_hwmgr *hwmgr)  { +	struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend); + +	smu_free_memory(hwmgr->device, (void *) smu_data->header_buffer.handle); +	if (!cgs_is_virtualization_enabled(hwmgr->device)) +		smu_free_memory(hwmgr->device, (void *) smu_data->smu_buffer.handle); +  	kfree(hwmgr->smu_backend);  	hwmgr->smu_backend = NULL;  	cgs_rel_firmware(hwmgr->device, CGS_UCODE_ID_SMU); diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c index 0a8e48bff219..79e5c05571bc 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c @@ -2654,10 +2654,7 @@ static int tonga_update_sclk_threshold(struct pp_hwmgr *hwmgr)  	if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,  			PHM_PlatformCaps_SclkThrottleLowNotification) -		&& (hwmgr->gfx_arbiter.sclk_threshold != -				data->low_sclk_interrupt_threshold)) { -		data->low_sclk_interrupt_threshold = -				hwmgr->gfx_arbiter.sclk_threshold; +		&& (data->low_sclk_interrupt_threshold != 0)) {  		low_sclk_interrupt_threshold =  				data->low_sclk_interrupt_threshold; @@ -3106,9 +3103,9 @@ static int tonga_set_mc_special_registers(struct pp_hwmgr *hwmgr,  					((table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16);  			}  			j++; +  			PP_ASSERT_WITH_CODE((j < SMU72_DISCRETE_MC_REGISTER_ARRAY_SIZE),  				"Invalid VramInfo table.", return -EINVAL); -  			temp_reg = cgs_read_register(hwmgr->device, mmMC_PMG_CMD_MRS);  			table->mc_reg_address[j].s1 = mmMC_PMG_CMD_MRS;  			table->mc_reg_address[j].s0 = mmMC_SEQ_PMG_CMD_MRS_LP; @@ -3121,18 +3118,16 @@ static int tonga_set_mc_special_registers(struct pp_hwmgr *hwmgr,  					table->mc_reg_table_entry[k].mc_data[j] |= 0x100;  			}  			j++; -			PP_ASSERT_WITH_CODE((j <= SMU72_DISCRETE_MC_REGISTER_ARRAY_SIZE), -				"Invalid VramInfo table.", return -EINVAL);  			if (!data->is_memory_gddr5) { +				PP_ASSERT_WITH_CODE((j < SMU72_DISCRETE_MC_REGISTER_ARRAY_SIZE), +					"Invalid VramInfo table.", return -EINVAL);  				table->mc_reg_address[j].s1 = mmMC_PMG_AUTO_CMD;  				table->mc_reg_address[j].s0 = mmMC_PMG_AUTO_CMD;  				for (k = 0; k < table->num_entries; k++)  					table->mc_reg_table_entry[k].mc_data[j] =  						(table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16;  				j++; -				PP_ASSERT_WITH_CODE((j <= SMU72_DISCRETE_MC_REGISTER_ARRAY_SIZE), -					"Invalid VramInfo table.", return -EINVAL);  			}  			break; @@ -3147,8 +3142,6 @@ static int tonga_set_mc_special_registers(struct pp_hwmgr *hwmgr,  					(table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);  			}  			j++; -			PP_ASSERT_WITH_CODE((j <= SMU72_DISCRETE_MC_REGISTER_ARRAY_SIZE), -				"Invalid VramInfo table.", return -EINVAL);  			break;  		default: diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c index 2f979fb86824..f6f39d01d227 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c @@ -381,10 +381,8 @@ static int vega10_verify_smc_interface(struct pp_hwmgr *hwmgr)  		(rev_id == 0xc1) ||  		(rev_id == 0xc3)))) {  		if (smc_driver_if_version != SMU9_DRIVER_IF_VERSION) { -			pr_err("Your firmware(0x%x) doesn't match \ -				SMU9_DRIVER_IF_VERSION(0x%x). \ -				Please update your firmware!\n", -				smc_driver_if_version, SMU9_DRIVER_IF_VERSION); +			pr_err("Your firmware(0x%x) doesn't match SMU9_DRIVER_IF_VERSION(0x%x). Please update your firmware!\n", +			       smc_driver_if_version, SMU9_DRIVER_IF_VERSION);  			return -EINVAL;  		}  	} |