Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- From 286e937efbc7177c114e80aae9b402131e3886c1 Mon Sep 17 00:00:00 2001
- From: Enver Balalic <balalic.enver@gmail.com>
- Date: Mon, 14 Mar 2022 13:14:53 +0100
- Subject: [PATCH] platform/x86: hp-wmi: support omen thermal profile policy v1
- As it turns out, these laptops have 2 thermal profile versions.
- A previous patch added support for v0, this patch adds support
- for v1 thermal policies that are in use on some devices.
- We obtain the thermal policy version by querying the get system
- design data WMI call and looking at the fourth byte it returns,
- except if the system board DMI Board ID is in a specific array
- that the windows command center app overrides to thermal policy
- v0 for some reason.
- Signed-off-by: Enver Balalic <balalic.enver@gmail.com>
- Link: https://lore.kernel.org/r/20220314121453.kjszdciymtg6ctbq@omen
- Reviewed-by: Hans de Goede <hdegoede@redhat.com>
- Signed-off-by: Hans de Goede <hdegoede@redhat.com>
- ---
- drivers/platform/x86/hp-wmi.c | 81 +++++++++++++++++++++++++++++------
- 1 file changed, 67 insertions(+), 14 deletions(-)
- diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
- index 1f9d6e1de5af..0e9a25b56e0e 100644
- --- a/drivers/platform/x86/hp-wmi.c
- +++ b/drivers/platform/x86/hp-wmi.c
- @@ -57,6 +57,14 @@ static const char * const omen_thermal_profile_boards[] = {
- "8917", "8918", "8949", "894A", "89EB"
- };
- +/* DMI Board names of Omen laptops that are specifically set to be thermal
- + * profile version 0 by the Omen Command Center app, regardless of what
- + * the get system design information WMI call returns
- + */
- +static const char *const omen_thermal_profile_force_v0_boards[] = {
- + "8607", "8746", "8747", "8749", "874A", "8748"
- +};
- +
- enum hp_wmi_radio {
- HPWMI_WIFI = 0x0,
- HPWMI_BLUETOOTH = 0x1,
- @@ -117,6 +125,7 @@ enum hp_wmi_gm_commandtype {
- HPWMI_SET_PERFORMANCE_MODE = 0x1A,
- HPWMI_FAN_SPEED_MAX_GET_QUERY = 0x26,
- HPWMI_FAN_SPEED_MAX_SET_QUERY = 0x27,
- + HPWMI_GET_SYSTEM_DESIGN_DATA = 0x28,
- };
- enum hp_wmi_command {
- @@ -151,10 +160,16 @@ enum hp_wireless2_bits {
- HPWMI_POWER_FW_OR_HW = HPWMI_POWER_BIOS | HPWMI_POWER_HARD,
- };
- -enum hp_thermal_profile_omen {
- - HP_OMEN_THERMAL_PROFILE_DEFAULT = 0x00,
- - HP_OMEN_THERMAL_PROFILE_PERFORMANCE = 0x01,
- - HP_OMEN_THERMAL_PROFILE_COOL = 0x02,
- +enum hp_thermal_profile_omen_v0 {
- + HP_OMEN_V0_THERMAL_PROFILE_DEFAULT = 0x00,
- + HP_OMEN_V0_THERMAL_PROFILE_PERFORMANCE = 0x01,
- + HP_OMEN_V0_THERMAL_PROFILE_COOL = 0x02,
- +};
- +
- +enum hp_thermal_profile_omen_v1 {
- + HP_OMEN_V1_THERMAL_PROFILE_DEFAULT = 0x30,
- + HP_OMEN_V1_THERMAL_PROFILE_PERFORMANCE = 0x31,
- + HP_OMEN_V1_THERMAL_PROFILE_COOL = 0x50,
- };
- enum hp_thermal_profile {
- @@ -407,9 +422,6 @@ static int omen_thermal_profile_set(int mode)
- char buffer[2] = {0, mode};
- int ret;
- - if (mode < 0 || mode > 2)
- - return -EINVAL;
- -
- ret = hp_wmi_perform_query(HPWMI_SET_PERFORMANCE_MODE, HPWMI_GM,
- &buffer, sizeof(buffer), 0);
- @@ -431,6 +443,30 @@ static bool is_omen_thermal_profile(void)
- board_name) >= 0;
- }
- +static int omen_get_thermal_policy_version(void)
- +{
- + unsigned char buffer[8] = { 0 };
- + int ret;
- +
- + const char *board_name = dmi_get_system_info(DMI_BOARD_NAME);
- +
- + if (board_name) {
- + int matches = match_string(omen_thermal_profile_force_v0_boards,
- + ARRAY_SIZE(omen_thermal_profile_force_v0_boards),
- + board_name);
- + if (matches >= 0)
- + return 0;
- + }
- +
- + ret = hp_wmi_perform_query(HPWMI_GET_SYSTEM_DESIGN_DATA, HPWMI_GM,
- + &buffer, sizeof(buffer), sizeof(buffer));
- +
- + if (ret)
- + return ret < 0 ? ret : -EINVAL;
- +
- + return buffer[3];
- +}
- +
- static int omen_thermal_profile_get(void)
- {
- u8 data;
- @@ -1053,13 +1089,16 @@ static int platform_profile_omen_get(struct platform_profile_handler *pprof,
- return tp;
- switch (tp) {
- - case HP_OMEN_THERMAL_PROFILE_PERFORMANCE:
- + case HP_OMEN_V0_THERMAL_PROFILE_PERFORMANCE:
- + case HP_OMEN_V1_THERMAL_PROFILE_PERFORMANCE:
- *profile = PLATFORM_PROFILE_PERFORMANCE;
- break;
- - case HP_OMEN_THERMAL_PROFILE_DEFAULT:
- + case HP_OMEN_V0_THERMAL_PROFILE_DEFAULT:
- + case HP_OMEN_V1_THERMAL_PROFILE_DEFAULT:
- *profile = PLATFORM_PROFILE_BALANCED;
- break;
- - case HP_OMEN_THERMAL_PROFILE_COOL:
- + case HP_OMEN_V0_THERMAL_PROFILE_COOL:
- + case HP_OMEN_V1_THERMAL_PROFILE_COOL:
- *profile = PLATFORM_PROFILE_COOL;
- break;
- default:
- @@ -1072,17 +1111,31 @@ static int platform_profile_omen_get(struct platform_profile_handler *pprof,
- static int platform_profile_omen_set(struct platform_profile_handler *pprof,
- enum platform_profile_option profile)
- {
- - int err, tp;
- + int err, tp, tp_version;
- +
- + tp_version = omen_get_thermal_policy_version();
- +
- + if (tp_version < 0 || tp_version > 1)
- + return -EOPNOTSUPP;
- switch (profile) {
- case PLATFORM_PROFILE_PERFORMANCE:
- - tp = HP_OMEN_THERMAL_PROFILE_PERFORMANCE;
- + if (tp_version == 0)
- + tp = HP_OMEN_V0_THERMAL_PROFILE_PERFORMANCE;
- + else
- + tp = HP_OMEN_V1_THERMAL_PROFILE_PERFORMANCE;
- break;
- case PLATFORM_PROFILE_BALANCED:
- - tp = HP_OMEN_THERMAL_PROFILE_DEFAULT;
- + if (tp_version == 0)
- + tp = HP_OMEN_V0_THERMAL_PROFILE_DEFAULT;
- + else
- + tp = HP_OMEN_V1_THERMAL_PROFILE_DEFAULT;
- break;
- case PLATFORM_PROFILE_COOL:
- - tp = HP_OMEN_THERMAL_PROFILE_COOL;
- + if (tp_version == 0)
- + tp = HP_OMEN_V0_THERMAL_PROFILE_COOL;
- + else
- + tp = HP_OMEN_V1_THERMAL_PROFILE_COOL;
- break;
- default:
- return -EOPNOTSUPP;
- --
- 2.25.1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement