[PATCH 5/6] platform/x86: wmi-msi-platform: Add MSI Claw A8 support
"Derek J. Clark" <[email protected]> Mon, 3 Aug 2026 15:16:13 -0700
| Newsgroups | org.kernel.vger.platform-driver-x86,org.kernel.vger.linux-doc,org.kernel.vger.linux-hwmon,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Adds MSI Claw A8 BZ2EM support. - Adds FPPT (PL3) - Adds disable toggle during startup for AMDSTAPM flag. In the Windows DLL this feature is used when setting the device into an AI shift mode not exposed by this driver. - Add limits to gen 3 for SPL, SPPT, FPPT. Signed-off-by: Derek J. Clark <[email protected]> --- drivers/platform/x86/msi-wmi-platform.c | 82 ++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/drivers/platform/x86/msi-wmi-platform.c b/drivers/platform/x86/msi-wmi-platform.c index 35cd35fc6446..8d11dad99776 100644 --- a/drivers/platform/x86/msi-wmi-platform.c +++ b/drivers/platform/x86/msi-wmi-platform.c @@ -77,11 +77,17 @@ #define MSI_PLATFORM_SHIFT_GREEN (MSI_PLATFORM_SHIFT_ENABLE + 1) #define MSI_PLATFORM_SHIFT_ECO (MSI_PLATFORM_SHIFT_ENABLE + 2) #define MSI_PLATFORM_SHIFT_USER (MSI_PLATFORM_SHIFT_ENABLE + 3) +#define MSI_PLATFORM_SHIFT_MANUAL (MSI_PLATFORM_SHIFT_ENABLE + 6) /* Get_Data() and Set_Data() Params */ -#define MSI_PLATFORM_PL1_ADDR 0x50 -#define MSI_PLATFORM_PL2_ADDR 0x51 -#define MSI_PLATFORM_BAT_ADDR 0xd7 +#define MSI_PLATFORM_PL1_ADDR 0x50 +#define MSI_PLATFORM_PL2_ADDR 0x51 +#define MSI_PLATFORM_PL3_ADDR 0x52 +#define MSI_PLATFORM_AMDSTAPM_ADDR 0xc5 +#define MSI_PLATFORM_BAT_ADDR 0xd7 + +#define MSI_PLATFORM_AMDSTAPM_SUPPORTED BIT(7) +#define MSI_PLATFORM_AMDSTAPM_DISABLE BIT(0) static bool force; module_param_unsafe(force, bool, 0); @@ -124,10 +130,14 @@ struct msi_wmi_platform_quirk { bool charge_threshold; /* Charge threshold is supported */ bool dual_fans; /* For devices with two hwmon fans */ bool restore_curves; /* Restore factory curves on unload */ + bool disable_stapm; /* Disable AMD STAPM auto power management on load */ + u8 custom_shift; /* EC Shift value for PLATFORM_PROFILE_CUSTOM, 0 if unsupported */ int pl1_min; /* Minimum PL1 value */ int pl1_max; /* Maximum PL1 value */ int pl2_min; /* Minimum PL2 value */ int pl2_max; /* Maximum PL2 value */ + int pl3_min; /* Minimum PL3 value */ + int pl3_max; /* Maximum PL3 value */ }; struct msi_wmi_platform_factory_curves { @@ -151,16 +161,19 @@ struct msi_wmi_platform_data { enum msi_fw_attr_id { MSI_ATTR_PPT_PL1_SPL, MSI_ATTR_PPT_PL2_SPPT, + MSI_ATTR_PPT_PL3_FPPT, }; static const char *const msi_fw_attr_name[] = { [MSI_ATTR_PPT_PL1_SPL] = "ppt_pl1_spl", [MSI_ATTR_PPT_PL2_SPPT] = "ppt_pl2_sppt", + [MSI_ATTR_PPT_PL3_FPPT] = "ppt_pl3_fppt", }; static const char *const msi_fw_attr_desc[] = { [MSI_ATTR_PPT_PL1_SPL] = "CPU Steady package limit (PL1/SPL)", [MSI_ATTR_PPT_PL2_SPPT] = "CPU Boost slow package limit (PL2/SPPT)", + [MSI_ATTR_PPT_PL3_FPPT] = "CPU Boost fast package limit (PL3/FPPT)", }; #define MSI_ATTR_LANGUAGE_CODE "en_US.UTF-8" @@ -245,6 +258,19 @@ static struct msi_wmi_platform_quirk quirk_gen2 = { .pl2_min = 9, .pl2_max = 37 }; +static struct msi_wmi_platform_quirk quirk_gen3 = { + .shift_mode = true, + .charge_threshold = true, + .dual_fans = true, + .restore_curves = true, + .disable_stapm = true, + .pl1_min = 7, + .pl1_max = 35, + .pl2_min = 9, + .pl2_max = 40, + .pl3_min = 10, + .pl3_max = 48, +}; static const struct dmi_system_id msi_quirks[] = { { @@ -271,6 +297,14 @@ static const struct dmi_system_id msi_quirks[] = { }, .driver_data = &quirk_gen2, }, + { + .ident = "MSI Claw A8 BZ2EM", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International Co., Ltd."), + DMI_MATCH(DMI_BOARD_NAME, "MS-1T8K"), + }, + .driver_data = &quirk_gen3, + }, { } }; @@ -862,6 +896,8 @@ static int data_get_addr(struct msi_wmi_platform_data *data, return MSI_PLATFORM_PL1_ADDR; case MSI_ATTR_PPT_PL2_SPPT: return MSI_PLATFORM_PL2_ADDR; + case MSI_ATTR_PPT_PL3_FPPT: + return MSI_PLATFORM_PL3_ADDR; default: pr_warn("Invalid attribute id %d\n", id); return -EINVAL; @@ -1150,6 +1186,15 @@ static int msi_wmi_fw_attrs_init(struct msi_wmi_platform_data *data) return err; } + if (data->quirks->pl3_max) { + err = msi_fw_attr_init(data, MSI_ATTR_PPT_PL3_FPPT, + &fw_attr_type_int, data->quirks->pl3_min, + data->quirks->pl3_max, &data_get_value, + &data_set_value); + if (err) + return err; + } + return 0; } @@ -1421,6 +1466,31 @@ static int msi_wmi_platform_init(struct msi_wmi_platform_data *data) return 0; } +static int msi_wmi_platform_disable_stapm(struct msi_wmi_platform_data *data) +{ + u8 buffer[32] = { 0 }; + int ret; + + buffer[0] = MSI_PLATFORM_AMDSTAPM_ADDR; + + ret = msi_wmi_platform_query(data, MSI_PLATFORM_GET_DATA, buffer, sizeof(buffer)); + if (ret < 0) + return ret; + + /* Only touch it if firmware self-reports STAPM support */ + if (!(buffer[1] & MSI_PLATFORM_AMDSTAPM_SUPPORTED)) + return 0; + + buffer[0] = MSI_PLATFORM_AMDSTAPM_ADDR; + buffer[1] |= MSI_PLATFORM_AMDSTAPM_DISABLE; + + ret = msi_wmi_platform_query(data, MSI_PLATFORM_SET_DATA, buffer, sizeof(buffer)); + if (ret < 0) + return ret; + + return 0; +} + static int msi_wmi_platform_profile_setup(struct msi_wmi_platform_data *data) { if (!data->quirks->shift_mode) @@ -1460,6 +1530,12 @@ static int msi_wmi_platform_probe(struct wmi_device *wdev, const void *context) if (ret < 0) return ret; + if (data->quirks->disable_stapm) { + ret = msi_wmi_platform_disable_stapm(data); + if (ret < 0) + return ret; + } + ret = msi_wmi_platform_ec_init(data); if (ret < 0) return ret; -- 2.55.0