Commit f21bf622 authored by Shyam Sundar S K's avatar Shyam Sundar S K Committed by Hans de Goede

platform/x86/amd/pmf: Fix to update SPS thermals when power supply change

Every power mode of static power slider has its own AC and DC power
settings.

When the power source changes from AC to DC, corresponding DC thermals
were not updated from PMF config store and this leads the system to always
run on AC power settings.

Fix it by registering with power_supply notifier and apply DC settings
upon getting notified by the power_supply handler.

Fixes: da5ce22d ("platform/x86/amd/pmf: Add support for PMF core layer")
Suggested-by: default avatarPatil Rajesh Reddy <Patil.Reddy@amd.com>
Signed-off-by: default avatarShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Reviewed-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Link: https://lore.kernel.org/r/20230125095936.3292883-6-Shyam-sundar.S-k@amd.comReviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 635f79bc
...@@ -58,6 +58,25 @@ static bool force_load; ...@@ -58,6 +58,25 @@ static bool force_load;
module_param(force_load, bool, 0444); module_param(force_load, bool, 0444);
MODULE_PARM_DESC(force_load, "Force load this driver on supported older platforms (experimental)"); MODULE_PARM_DESC(force_load, "Force load this driver on supported older platforms (experimental)");
static int amd_pmf_pwr_src_notify_call(struct notifier_block *nb, unsigned long event, void *data)
{
struct amd_pmf_dev *pmf = container_of(nb, struct amd_pmf_dev, pwr_src_notifier);
if (event != PSY_EVENT_PROP_CHANGED)
return NOTIFY_OK;
if (is_apmf_func_supported(pmf, APMF_FUNC_AUTO_MODE) ||
is_apmf_func_supported(pmf, APMF_FUNC_DYN_SLIDER_DC) ||
is_apmf_func_supported(pmf, APMF_FUNC_DYN_SLIDER_AC)) {
if ((pmf->amt_enabled || pmf->cnqf_enabled) && is_pprof_balanced(pmf))
return NOTIFY_DONE;
}
amd_pmf_set_sps_power_limits(pmf);
return NOTIFY_OK;
}
static int current_power_limits_show(struct seq_file *seq, void *unused) static int current_power_limits_show(struct seq_file *seq, void *unused)
{ {
struct amd_pmf_dev *dev = seq->private; struct amd_pmf_dev *dev = seq->private;
...@@ -372,6 +391,9 @@ static int amd_pmf_probe(struct platform_device *pdev) ...@@ -372,6 +391,9 @@ static int amd_pmf_probe(struct platform_device *pdev)
apmf_install_handler(dev); apmf_install_handler(dev);
amd_pmf_dbgfs_register(dev); amd_pmf_dbgfs_register(dev);
dev->pwr_src_notifier.notifier_call = amd_pmf_pwr_src_notify_call;
power_supply_reg_notifier(&dev->pwr_src_notifier);
mutex_init(&dev->lock); mutex_init(&dev->lock);
mutex_init(&dev->update_mutex); mutex_init(&dev->update_mutex);
dev_info(dev->dev, "registered PMF device successfully\n"); dev_info(dev->dev, "registered PMF device successfully\n");
...@@ -383,6 +405,7 @@ static int amd_pmf_remove(struct platform_device *pdev) ...@@ -383,6 +405,7 @@ static int amd_pmf_remove(struct platform_device *pdev)
{ {
struct amd_pmf_dev *dev = platform_get_drvdata(pdev); struct amd_pmf_dev *dev = platform_get_drvdata(pdev);
power_supply_unreg_notifier(&dev->pwr_src_notifier);
mutex_destroy(&dev->lock); mutex_destroy(&dev->lock);
mutex_destroy(&dev->update_mutex); mutex_destroy(&dev->update_mutex);
amd_pmf_deinit_features(dev); amd_pmf_deinit_features(dev);
......
...@@ -169,6 +169,7 @@ struct amd_pmf_dev { ...@@ -169,6 +169,7 @@ struct amd_pmf_dev {
struct mutex update_mutex; /* protects race between ACPI handler and metrics thread */ struct mutex update_mutex; /* protects race between ACPI handler and metrics thread */
bool cnqf_enabled; bool cnqf_enabled;
bool cnqf_supported; bool cnqf_supported;
struct notifier_block pwr_src_notifier;
}; };
struct apmf_sps_prop_granular { struct apmf_sps_prop_granular {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment