Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

platform/x86: thinkpad_acpi: Fix incorrect use of platform profile on AMD platforms

Lenovo AMD based platforms have been offering platform_profiles but they
are not working correctly. This is because the mode we are using on the
Intel platforms (MMC) is not available on the AMD platforms.

This commit adds checking of the functional capabilities returned by the
BIOS to confirm if MMC is supported or not. Profiles will not be
available if the platform is not MMC capable.

I'm investigating and working on an alternative for AMD platforms but
that is still work-in-progress.

Signed-off-by: Mark Pearson <markpearson@lenovo.com>
Link: https://lore.kernel.org/r/20220127190358.4078-1-markpearson@lenovo.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>

authored by

Mark Pearson and committed by
Hans de Goede
836f35f7 b8fb0d9b

+12
+12
drivers/platform/x86/thinkpad_acpi.c
··· 10119 10119 #define DYTC_CMD_MMC_GET 8 /* To get current MMC function and mode */ 10120 10120 #define DYTC_CMD_RESET 0x1ff /* To reset back to default */ 10121 10121 10122 + #define DYTC_CMD_FUNC_CAP 3 /* To get DYTC capabilities */ 10123 + #define DYTC_FC_MMC 27 /* MMC Mode supported */ 10124 + 10122 10125 #define DYTC_GET_FUNCTION_BIT 8 /* Bits 8-11 - function setting */ 10123 10126 #define DYTC_GET_MODE_BIT 12 /* Bits 12-15 - mode setting */ 10124 10127 ··· 10333 10330 /* Check DYTC is enabled and supports mode setting */ 10334 10331 if (dytc_version < 5) 10335 10332 return -ENODEV; 10333 + 10334 + /* Check what capabilities are supported. Currently MMC is needed */ 10335 + err = dytc_command(DYTC_CMD_FUNC_CAP, &output); 10336 + if (err) 10337 + return err; 10338 + if (!(output & BIT(DYTC_FC_MMC))) { 10339 + dbg_printk(TPACPI_DBG_INIT, " DYTC MMC mode not supported\n"); 10340 + return -ENODEV; 10341 + } 10336 10342 10337 10343 dbg_printk(TPACPI_DBG_INIT, 10338 10344 "DYTC version %d: thermal mode available\n", dytc_version);