Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
- index 1f9d6e1de5afe..0e9a25b56e0e4 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;
Advertisement
Add Comment
Please, Sign In to add comment