Hi, On 3/14/22 13:14, Enver Balalic wrote: > 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. > > - V1 > Initial Patch > - V2 > Rename V0 thermal policy values to HP_OMEN_V0_THERMAL_PROFILE_ > for consistency with the V1 thermal policy values. > Fix issue where instead of forcing certain boards to V0, they > were being forced to V1. > Drop unnecessary newline additions. > > Signed-off-by: Enver Balalic <balalic.enver@xxxxxxxxx> > --- > 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 c56c8864961d..0109ddc84be7 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_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_omen_v0 { > + HP_OMEN_V0_THERMAL_PROFILE_DEFAULT = 0x00, > + HP_OMEN_V0_THERMAL_PROFILE_PERFORMANCE = 0x01, > + HP_OMEN_V0_THERMAL_PROFILE_COOL = 0x02, > }; IMHO it would be more logical to list the v0 settings above the v1 settings, rather then the other way around. I've fixed this up while merging this patch: Thank you for your patch, I've applied this patch to my review-hans branch: https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans Note it will show up in my review-hans branch once I've pushed my local branch there, which might take a while. Once I've run some tests on this branch the patches there will be added to the platform-drivers-x86/for-next branch and eventually will be included in the pdx86 pull-request to Linus for the next merge-window. Regards, Hans > > 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;