diff options
Diffstat (limited to 'drivers/platform/x86/amd/pmf/sps.c')
| -rw-r--r-- | drivers/platform/x86/amd/pmf/sps.c | 74 | 
1 files changed, 70 insertions, 4 deletions
diff --git a/drivers/platform/x86/amd/pmf/sps.c b/drivers/platform/x86/amd/pmf/sps.c index 445ff053b4df..ab69d517a36a 100644 --- a/drivers/platform/x86/amd/pmf/sps.c +++ b/drivers/platform/x86/amd/pmf/sps.c @@ -174,14 +174,77 @@ int amd_pmf_get_pprof_modes(struct amd_pmf_dev *pmf)  	return mode;  } +int amd_pmf_power_slider_update_event(struct amd_pmf_dev *dev) +{ +	u8 mode, flag = 0; +	int src; + +	mode = amd_pmf_get_pprof_modes(dev); +	if (mode < 0) +		return mode; + +	src = amd_pmf_get_power_source(); + +	if (src == POWER_SOURCE_AC) { +		switch (mode) { +		case POWER_MODE_PERFORMANCE: +			flag |= BIT(AC_BEST_PERF); +			break; +		case POWER_MODE_BALANCED_POWER: +			flag |= BIT(AC_BETTER_PERF); +			break; +		case POWER_MODE_POWER_SAVER: +			flag |= BIT(AC_BETTER_BATTERY); +			break; +		default: +			dev_err(dev->dev, "unsupported platform profile\n"); +			return -EOPNOTSUPP; +		} + +	} else if (src == POWER_SOURCE_DC) { +		switch (mode) { +		case POWER_MODE_PERFORMANCE: +			flag |= BIT(DC_BEST_PERF); +			break; +		case POWER_MODE_BALANCED_POWER: +			flag |= BIT(DC_BETTER_PERF); +			break; +		case POWER_MODE_POWER_SAVER: +			flag |= BIT(DC_BATTERY_SAVER); +			break; +		default: +			dev_err(dev->dev, "unsupported platform profile\n"); +			return -EOPNOTSUPP; +		} +	} + +	apmf_os_power_slider_update(dev, flag); + +	return 0; +} +  static int amd_pmf_profile_set(struct platform_profile_handler *pprof,  			       enum platform_profile_option profile)  {  	struct amd_pmf_dev *pmf = container_of(pprof, struct amd_pmf_dev, pprof); +	int ret = 0;  	pmf->current_profile = profile; -	return amd_pmf_set_sps_power_limits(pmf); +	/* Notify EC about the slider position change */ +	if (is_apmf_func_supported(pmf, APMF_FUNC_OS_POWER_SLIDER_UPDATE)) { +		ret = amd_pmf_power_slider_update_event(pmf); +		if (ret) +			return ret; +	} + +	if (is_apmf_func_supported(pmf, APMF_FUNC_STATIC_SLIDER_GRANULAR)) { +		ret = amd_pmf_set_sps_power_limits(pmf); +		if (ret) +			return ret; +	} + +	return 0;  }  int amd_pmf_init_sps(struct amd_pmf_dev *dev) @@ -189,10 +252,13 @@ int amd_pmf_init_sps(struct amd_pmf_dev *dev)  	int err;  	dev->current_profile = PLATFORM_PROFILE_BALANCED; -	amd_pmf_load_defaults_sps(dev); -	/* update SPS balanced power mode thermals */ -	amd_pmf_set_sps_power_limits(dev); +	if (is_apmf_func_supported(dev, APMF_FUNC_STATIC_SLIDER_GRANULAR)) { +		amd_pmf_load_defaults_sps(dev); + +		/* update SPS balanced power mode thermals */ +		amd_pmf_set_sps_power_limits(dev); +	}  	dev->pprof.profile_get = amd_pmf_profile_get;  	dev->pprof.profile_set = amd_pmf_profile_set;  |