Guest User

Untitled

a guest
Feb 16th, 2023
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.39 KB | None | 0 0
  1. diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
  2. index 1f9d6e1de5afe..0e9a25b56e0e4 100644
  3. --- a/drivers/platform/x86/hp-wmi.c
  4. +++ b/drivers/platform/x86/hp-wmi.c
  5. @@ -57,6 +57,14 @@ static const char * const omen_thermal_profile_boards[] = {
  6. "8917", "8918", "8949", "894A", "89EB"
  7. };
  8.  
  9. +/* DMI Board names of Omen laptops that are specifically set to be thermal
  10. + * profile version 0 by the Omen Command Center app, regardless of what
  11. + * the get system design information WMI call returns
  12. + */
  13. +static const char *const omen_thermal_profile_force_v0_boards[] = {
  14. + "8607", "8746", "8747", "8749", "874A", "8748"
  15. +};
  16. +
  17. enum hp_wmi_radio {
  18. HPWMI_WIFI = 0x0,
  19. HPWMI_BLUETOOTH = 0x1,
  20. @@ -117,6 +125,7 @@ enum hp_wmi_gm_commandtype {
  21. HPWMI_SET_PERFORMANCE_MODE = 0x1A,
  22. HPWMI_FAN_SPEED_MAX_GET_QUERY = 0x26,
  23. HPWMI_FAN_SPEED_MAX_SET_QUERY = 0x27,
  24. + HPWMI_GET_SYSTEM_DESIGN_DATA = 0x28,
  25. };
  26.  
  27. enum hp_wmi_command {
  28. @@ -151,10 +160,16 @@ enum hp_wireless2_bits {
  29. HPWMI_POWER_FW_OR_HW = HPWMI_POWER_BIOS | HPWMI_POWER_HARD,
  30. };
  31.  
  32. -enum hp_thermal_profile_omen {
  33. - HP_OMEN_THERMAL_PROFILE_DEFAULT = 0x00,
  34. - HP_OMEN_THERMAL_PROFILE_PERFORMANCE = 0x01,
  35. - HP_OMEN_THERMAL_PROFILE_COOL = 0x02,
  36. +enum hp_thermal_profile_omen_v0 {
  37. + HP_OMEN_V0_THERMAL_PROFILE_DEFAULT = 0x00,
  38. + HP_OMEN_V0_THERMAL_PROFILE_PERFORMANCE = 0x01,
  39. + HP_OMEN_V0_THERMAL_PROFILE_COOL = 0x02,
  40. +};
  41. +
  42. +enum hp_thermal_profile_omen_v1 {
  43. + HP_OMEN_V1_THERMAL_PROFILE_DEFAULT = 0x30,
  44. + HP_OMEN_V1_THERMAL_PROFILE_PERFORMANCE = 0x31,
  45. + HP_OMEN_V1_THERMAL_PROFILE_COOL = 0x50,
  46. };
  47.  
  48. enum hp_thermal_profile {
  49. @@ -407,9 +422,6 @@ static int omen_thermal_profile_set(int mode)
  50. char buffer[2] = {0, mode};
  51. int ret;
  52.  
  53. - if (mode < 0 || mode > 2)
  54. - return -EINVAL;
  55. -
  56. ret = hp_wmi_perform_query(HPWMI_SET_PERFORMANCE_MODE, HPWMI_GM,
  57. &buffer, sizeof(buffer), 0);
  58.  
  59. @@ -431,6 +443,30 @@ static bool is_omen_thermal_profile(void)
  60. board_name) >= 0;
  61. }
  62.  
  63. +static int omen_get_thermal_policy_version(void)
  64. +{
  65. + unsigned char buffer[8] = { 0 };
  66. + int ret;
  67. +
  68. + const char *board_name = dmi_get_system_info(DMI_BOARD_NAME);
  69. +
  70. + if (board_name) {
  71. + int matches = match_string(omen_thermal_profile_force_v0_boards,
  72. + ARRAY_SIZE(omen_thermal_profile_force_v0_boards),
  73. + board_name);
  74. + if (matches >= 0)
  75. + return 0;
  76. + }
  77. +
  78. + ret = hp_wmi_perform_query(HPWMI_GET_SYSTEM_DESIGN_DATA, HPWMI_GM,
  79. + &buffer, sizeof(buffer), sizeof(buffer));
  80. +
  81. + if (ret)
  82. + return ret < 0 ? ret : -EINVAL;
  83. +
  84. + return buffer[3];
  85. +}
  86. +
  87. static int omen_thermal_profile_get(void)
  88. {
  89. u8 data;
  90. @@ -1053,13 +1089,16 @@ static int platform_profile_omen_get(struct platform_profile_handler *pprof,
  91. return tp;
  92.  
  93. switch (tp) {
  94. - case HP_OMEN_THERMAL_PROFILE_PERFORMANCE:
  95. + case HP_OMEN_V0_THERMAL_PROFILE_PERFORMANCE:
  96. + case HP_OMEN_V1_THERMAL_PROFILE_PERFORMANCE:
  97. *profile = PLATFORM_PROFILE_PERFORMANCE;
  98. break;
  99. - case HP_OMEN_THERMAL_PROFILE_DEFAULT:
  100. + case HP_OMEN_V0_THERMAL_PROFILE_DEFAULT:
  101. + case HP_OMEN_V1_THERMAL_PROFILE_DEFAULT:
  102. *profile = PLATFORM_PROFILE_BALANCED;
  103. break;
  104. - case HP_OMEN_THERMAL_PROFILE_COOL:
  105. + case HP_OMEN_V0_THERMAL_PROFILE_COOL:
  106. + case HP_OMEN_V1_THERMAL_PROFILE_COOL:
  107. *profile = PLATFORM_PROFILE_COOL;
  108. break;
  109. default:
  110. @@ -1072,17 +1111,31 @@ static int platform_profile_omen_get(struct platform_profile_handler *pprof,
  111. static int platform_profile_omen_set(struct platform_profile_handler *pprof,
  112. enum platform_profile_option profile)
  113. {
  114. - int err, tp;
  115. + int err, tp, tp_version;
  116. +
  117. + tp_version = omen_get_thermal_policy_version();
  118. +
  119. + if (tp_version < 0 || tp_version > 1)
  120. + return -EOPNOTSUPP;
  121.  
  122. switch (profile) {
  123. case PLATFORM_PROFILE_PERFORMANCE:
  124. - tp = HP_OMEN_THERMAL_PROFILE_PERFORMANCE;
  125. + if (tp_version == 0)
  126. + tp = HP_OMEN_V0_THERMAL_PROFILE_PERFORMANCE;
  127. + else
  128. + tp = HP_OMEN_V1_THERMAL_PROFILE_PERFORMANCE;
  129. break;
  130. case PLATFORM_PROFILE_BALANCED:
  131. - tp = HP_OMEN_THERMAL_PROFILE_DEFAULT;
  132. + if (tp_version == 0)
  133. + tp = HP_OMEN_V0_THERMAL_PROFILE_DEFAULT;
  134. + else
  135. + tp = HP_OMEN_V1_THERMAL_PROFILE_DEFAULT;
  136. break;
  137. case PLATFORM_PROFILE_COOL:
  138. - tp = HP_OMEN_THERMAL_PROFILE_COOL;
  139. + if (tp_version == 0)
  140. + tp = HP_OMEN_V0_THERMAL_PROFILE_COOL;
  141. + else
  142. + tp = HP_OMEN_V1_THERMAL_PROFILE_COOL;
  143. break;
  144. default:
  145. return -EOPNOTSUPP;
Advertisement
Add Comment
Please, Sign In to add comment