summaryrefslogtreecommitdiff
path: root/drivers/platform/x86/amd/pmf/acpi.c
diff options
context:
space:
mode:
authorShyam Sundar S K <Shyam-sundar.S-k@amd.com>2022-09-23 16:17:24 +0300
committerHans de Goede <hdegoede@redhat.com>2022-09-27 15:45:21 +0300
commit22ee98cb696e95b05a188756d479d382d93559ef (patch)
tree4332713b4e6ea7a3afac16dd19d84a89cbdc0811 /drivers/platform/x86/amd/pmf/acpi.c
parentea522b806162ca947427f8305310d3c8a3d42d7a (diff)
downloadlinux-22ee98cb696e95b05a188756d479d382d93559ef.tar.xz
platform/x86/amd/pmf: install notify handler after acpi init
It is observed that when thinkpad_acpi driver loads before amd-pmf driver, thinkpad_acpi driver sends the AMT "on" event and the request immediately will be part of the PMF BIOS "pending requests". With the current amd-pmf code, as soon as the amd-pmf driver gets probed, it calls apmf_acpi_init() where the notify handler will be installed. Handler callback would call amd_pmf_handle_amt() where the amd_pmf_set_automode() shall update the auto-mode thermals. In this case, the auto-mode config_store shall have "zeros", as the auto mode init gets called during the later stage. To fix this, change the order of the acpi notifer install and call it after the auto mode initialization is done. Fixes: 7d77dcc83ada ("platform/x86/amd/pmf: Handle AMT and CQL events for Auto mode") Cc: Mario Limonciello <mario.limonciello@amd.com> Cc: Mark Pearson <markpearson@lenovo.com> Cc: Patil Rajesh Reddy <Patil.Reddy@amd.com> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> Link: https://lore.kernel.org/r/20220923131724.1812685-1-Shyam-sundar.S-k@amd.com Reviewed-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'drivers/platform/x86/amd/pmf/acpi.c')
-rw-r--r--drivers/platform/x86/amd/pmf/acpi.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/drivers/platform/x86/amd/pmf/acpi.c b/drivers/platform/x86/amd/pmf/acpi.c
index cb46a7252414..b445c91aa52e 100644
--- a/drivers/platform/x86/amd/pmf/acpi.c
+++ b/drivers/platform/x86/amd/pmf/acpi.c
@@ -233,6 +233,28 @@ static int apmf_get_system_params(struct amd_pmf_dev *dev)
return 0;
}
+int apmf_install_handler(struct amd_pmf_dev *pmf_dev)
+{
+ acpi_handle ahandle = ACPI_HANDLE(pmf_dev->dev);
+ acpi_status status;
+
+ /* Install the APMF Notify handler */
+ if (is_apmf_func_supported(pmf_dev, APMF_FUNC_AUTO_MODE) &&
+ is_apmf_func_supported(pmf_dev, APMF_FUNC_SBIOS_REQUESTS)) {
+ status = acpi_install_notify_handler(ahandle, ACPI_ALL_NOTIFY,
+ apmf_event_handler, pmf_dev);
+ if (ACPI_FAILURE(status)) {
+ dev_err(pmf_dev->dev, "failed to install notify handler\n");
+ return -ENODEV;
+ }
+
+ /* Call the handler once manually to catch up with possibly missed notifies. */
+ apmf_event_handler(ahandle, 0, pmf_dev);
+ }
+
+ return 0;
+}
+
void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev)
{
acpi_handle ahandle = ACPI_HANDLE(pmf_dev->dev);
@@ -247,8 +269,6 @@ void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev)
int apmf_acpi_init(struct amd_pmf_dev *pmf_dev)
{
- acpi_handle ahandle = ACPI_HANDLE(pmf_dev->dev);
- acpi_status status;
int ret;
ret = apmf_if_verify_interface(pmf_dev);
@@ -269,20 +289,6 @@ int apmf_acpi_init(struct amd_pmf_dev *pmf_dev)
schedule_delayed_work(&pmf_dev->heart_beat, 0);
}
- /* Install the APMF Notify handler */
- if (is_apmf_func_supported(pmf_dev, APMF_FUNC_AUTO_MODE) &&
- is_apmf_func_supported(pmf_dev, APMF_FUNC_SBIOS_REQUESTS)) {
- status = acpi_install_notify_handler(ahandle,
- ACPI_ALL_NOTIFY,
- apmf_event_handler, pmf_dev);
- if (ACPI_FAILURE(status)) {
- dev_err(pmf_dev->dev, "failed to install notify handler\n");
- return -ENODEV;
- }
- /* Call the handler once manually to catch up with possibly missed notifies. */
- apmf_event_handler(ahandle, 0, pmf_dev);
- }
-
out:
return ret;
}