platform/x86: thinkpad_acpi: Fix profile modes on Intel platforms
authorMark Pearson <mpearson-lenovo@squebb.ca>
Tue, 24 Jan 2023 15:36:23 +0000 (10:36 -0500)
committerHans de Goede <hdegoede@redhat.com>
Wed, 25 Jan 2023 11:45:16 +0000 (12:45 +0100)
My last commit to fix profile mode displays on AMD platforms caused
an issue on Intel platforms - sorry!

In it I was reading the current functional mode (MMC, PSC, AMT) from
the BIOS but didn't account for the fact that on some of our Intel
platforms I use a different API which returns just the profile and not
the functional mode.

This commit fixes it so that on Intel platforms it knows the functional
mode is always MMC.

I also fixed a potential problem that a platform may try to set the mode
for both MMC and PSC - which was incorrect.

Tested on X1 Carbon 9 (Intel) and Z13 (AMD).

Link: https://bugzilla.kernel.org/show_bug.cgi?id=216963
Fixes: fde5f74ccfc7 ("platform/x86: thinkpad_acpi: Fix profile mode display in AMT mode")
Cc: stable@vger.kernel.org
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Link: https://lore.kernel.org/r/20230124153623.145188-1-mpearson-lenovo@squebb.ca
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/thinkpad_acpi.c

index a95946800ae9d3f947acbf752f69afdcd3114210..02860c32625e77870cbe56abf7f07a932d91e1b6 100644 (file)
@@ -10496,8 +10496,7 @@ static int dytc_profile_set(struct platform_profile_handler *pprof,
                        if (err)
                                goto unlock;
                }
-       }
-       if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
+       } else if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
                err = dytc_command(DYTC_SET_COMMAND(DYTC_FUNCTION_PSC, perfmode, 1), &output);
                if (err)
                        goto unlock;
@@ -10525,14 +10524,16 @@ static void dytc_profile_refresh(void)
                        err = dytc_command(DYTC_CMD_MMC_GET, &output);
                else
                        err = dytc_cql_command(DYTC_CMD_GET, &output);
-       } else if (dytc_capabilities & BIT(DYTC_FC_PSC))
+               funcmode = DYTC_FUNCTION_MMC;
+       } else if (dytc_capabilities & BIT(DYTC_FC_PSC)) {
                err = dytc_command(DYTC_CMD_GET, &output);
-
+               /* Check if we are PSC mode, or have AMT enabled */
+               funcmode = (output >> DYTC_GET_FUNCTION_BIT) & 0xF;
+       }
        mutex_unlock(&dytc_mutex);
        if (err)
                return;
 
-       funcmode = (output >> DYTC_GET_FUNCTION_BIT) & 0xF;
        perfmode = (output >> DYTC_GET_MODE_BIT) & 0xF;
        convert_dytc_to_profile(funcmode, perfmode, &profile);
        if (profile != dytc_current_profile) {