1 /* SPDX-License-Identifier: GPL-2.0 2 * 3 * Definitions for kernel modules using asus-armoury driver 4 * 5 * Copyright (c) 2024 Luke Jones <luke@ljones.dev> 6 */ 7 8 #ifndef _ASUS_ARMOURY_H_ 9 #define _ASUS_ARMOURY_H_ 10 11 #include <linux/dmi.h> 12 #include <linux/platform_device.h> 13 #include <linux/sysfs.h> 14 #include <linux/types.h> 15 16 #define DRIVER_NAME "asus-armoury" 17 18 /** 19 * armoury_attr_uint_store() - Send an uint to WMI method if within min/max. 20 * @kobj: Pointer to the driver object. 21 * @attr: Pointer to the attribute calling this function. 22 * @buf: The buffer to read from, this is parsed to `uint` type. 23 * @count: Required by sysfs attribute macros, pass in from the callee attr. 24 * @min: Minimum accepted value. Below this returns -EINVAL. 25 * @max: Maximum accepted value. Above this returns -EINVAL. 26 * @store_value: Pointer to where the parsed value should be stored. 27 * @wmi_dev: The WMI function ID to use. 28 * 29 * This function is intended to be generic so it can be called from any "_store" 30 * attribute which works only with integers. 31 * 32 * Integers to be sent to the WMI method is inclusive range checked and 33 * an error returned if out of range. 34 * 35 * If the value is valid and WMI is success then the sysfs attribute is notified 36 * and if asus_bios_requires_reboot() is true then reboot attribute 37 * is also notified. 38 * 39 * Returns: Either count, or an error. 40 */ 41 ssize_t armoury_attr_uint_store(struct kobject *kobj, struct kobj_attribute *attr, 42 const char *buf, size_t count, u32 min, u32 max, 43 u32 *store_value, u32 wmi_dev); 44 45 /** 46 * armoury_attr_uint_show() - Receive an uint from a WMI method. 47 * @kobj: Pointer to the driver object. 48 * @attr: Pointer to the attribute calling this function. 49 * @buf: The buffer to write to, as an `uint` type. 50 * @wmi_dev: The WMI function ID to use. 51 * 52 * This function is intended to be generic so it can be called from any "_show" 53 * attribute which works only with integers. 54 * 55 * Returns: Either count, or an error. 56 */ 57 ssize_t armoury_attr_uint_show(struct kobject *kobj, struct kobj_attribute *attr, 58 char *buf, u32 wmi_dev); 59 60 #define __ASUS_ATTR_RO(_func, _name) \ 61 { \ 62 .attr = { .name = __stringify(_name), .mode = 0444 }, \ 63 .show = _func##_##_name##_show, \ 64 } 65 66 #define __ASUS_ATTR_RO_AS(_name, _show) \ 67 { \ 68 .attr = { .name = __stringify(_name), .mode = 0444 }, \ 69 .show = _show, \ 70 } 71 72 #define __ASUS_ATTR_RW(_func, _name) \ 73 __ATTR(_name, 0644, _func##_##_name##_show, _func##_##_name##_store) 74 75 #define __WMI_STORE_INT(_attr, _min, _max, _wmi) \ 76 static ssize_t _attr##_store(struct kobject *kobj, \ 77 struct kobj_attribute *attr, \ 78 const char *buf, size_t count) \ 79 { \ 80 return armoury_attr_uint_store(kobj, attr, buf, count, _min, \ 81 _max, NULL, _wmi); \ 82 } 83 84 #define ASUS_WMI_SHOW_INT(_attr, _wmi) \ 85 static ssize_t _attr##_show(struct kobject *kobj, \ 86 struct kobj_attribute *attr, char *buf) \ 87 { \ 88 return armoury_attr_uint_show(kobj, attr, buf, _wmi); \ 89 } 90 91 /* Create functions and attributes for use in other macros or on their own */ 92 93 /* Shows a formatted static variable */ 94 #define __ATTR_SHOW_FMT(_prop, _attrname, _fmt, _val) \ 95 static ssize_t _attrname##_##_prop##_show( \ 96 struct kobject *kobj, struct kobj_attribute *attr, char *buf) \ 97 { \ 98 return sysfs_emit(buf, _fmt, _val); \ 99 } \ 100 static struct kobj_attribute attr_##_attrname##_##_prop = \ 101 __ASUS_ATTR_RO(_attrname, _prop) 102 103 #define __ATTR_RO_INT_GROUP_ENUM(_attrname, _wmi, _fsname, _possible, _dispname)\ 104 ASUS_WMI_SHOW_INT(_attrname##_current_value, _wmi); \ 105 static struct kobj_attribute attr_##_attrname##_current_value = \ 106 __ASUS_ATTR_RO(_attrname, current_value); \ 107 __ATTR_SHOW_FMT(display_name, _attrname, "%s\n", _dispname); \ 108 __ATTR_SHOW_FMT(possible_values, _attrname, "%s\n", _possible); \ 109 static struct kobj_attribute attr_##_attrname##_type = \ 110 __ASUS_ATTR_RO_AS(type, enum_type_show); \ 111 static struct attribute *_attrname##_attrs[] = { \ 112 &attr_##_attrname##_current_value.attr, \ 113 &attr_##_attrname##_display_name.attr, \ 114 &attr_##_attrname##_possible_values.attr, \ 115 &attr_##_attrname##_type.attr, \ 116 NULL \ 117 }; \ 118 static const struct attribute_group _attrname##_attr_group = { \ 119 .name = _fsname, .attrs = _attrname##_attrs \ 120 } 121 122 #define __ATTR_RW_INT_GROUP_ENUM(_attrname, _minv, _maxv, _wmi, _fsname,\ 123 _possible, _dispname) \ 124 __WMI_STORE_INT(_attrname##_current_value, _minv, _maxv, _wmi); \ 125 ASUS_WMI_SHOW_INT(_attrname##_current_value, _wmi); \ 126 static struct kobj_attribute attr_##_attrname##_current_value = \ 127 __ASUS_ATTR_RW(_attrname, current_value); \ 128 __ATTR_SHOW_FMT(display_name, _attrname, "%s\n", _dispname); \ 129 __ATTR_SHOW_FMT(possible_values, _attrname, "%s\n", _possible); \ 130 static struct kobj_attribute attr_##_attrname##_type = \ 131 __ASUS_ATTR_RO_AS(type, enum_type_show); \ 132 static struct attribute *_attrname##_attrs[] = { \ 133 &attr_##_attrname##_current_value.attr, \ 134 &attr_##_attrname##_display_name.attr, \ 135 &attr_##_attrname##_possible_values.attr, \ 136 &attr_##_attrname##_type.attr, \ 137 NULL \ 138 }; \ 139 static const struct attribute_group _attrname##_attr_group = { \ 140 .name = _fsname, .attrs = _attrname##_attrs \ 141 } 142 143 /* Boolean style enumeration, base macro. Requires adding show/store */ 144 #define __ATTR_GROUP_ENUM(_attrname, _fsname, _possible, _dispname) \ 145 __ATTR_SHOW_FMT(display_name, _attrname, "%s\n", _dispname); \ 146 __ATTR_SHOW_FMT(possible_values, _attrname, "%s\n", _possible); \ 147 static struct kobj_attribute attr_##_attrname##_type = \ 148 __ASUS_ATTR_RO_AS(type, enum_type_show); \ 149 static struct attribute *_attrname##_attrs[] = { \ 150 &attr_##_attrname##_current_value.attr, \ 151 &attr_##_attrname##_display_name.attr, \ 152 &attr_##_attrname##_possible_values.attr, \ 153 &attr_##_attrname##_type.attr, \ 154 NULL \ 155 }; \ 156 static const struct attribute_group _attrname##_attr_group = { \ 157 .name = _fsname, .attrs = _attrname##_attrs \ 158 } 159 160 #define ASUS_ATTR_GROUP_BOOL_RO(_attrname, _fsname, _wmi, _dispname) \ 161 __ATTR_RO_INT_GROUP_ENUM(_attrname, _wmi, _fsname, "0;1", _dispname) 162 163 164 #define ASUS_ATTR_GROUP_BOOL_RW(_attrname, _fsname, _wmi, _dispname) \ 165 __ATTR_RW_INT_GROUP_ENUM(_attrname, 0, 1, _wmi, _fsname, "0;1", _dispname) 166 167 #define ASUS_ATTR_GROUP_ENUM_INT_RO(_attrname, _fsname, _wmi, _possible, _dispname) \ 168 __ATTR_RO_INT_GROUP_ENUM(_attrname, _wmi, _fsname, _possible, _dispname) 169 170 /* 171 * Requires <name>_current_value_show(), <name>_current_value_show() 172 */ 173 #define ASUS_ATTR_GROUP_BOOL(_attrname, _fsname, _dispname) \ 174 static struct kobj_attribute attr_##_attrname##_current_value = \ 175 __ASUS_ATTR_RW(_attrname, current_value); \ 176 __ATTR_GROUP_ENUM(_attrname, _fsname, "0;1", _dispname) 177 178 /* 179 * Requires <name>_current_value_show(), <name>_current_value_show() 180 * and <name>_possible_values_show() 181 */ 182 #define ASUS_ATTR_GROUP_ENUM(_attrname, _fsname, _dispname) \ 183 __ATTR_SHOW_FMT(display_name, _attrname, "%s\n", _dispname); \ 184 static struct kobj_attribute attr_##_attrname##_current_value = \ 185 __ASUS_ATTR_RW(_attrname, current_value); \ 186 static struct kobj_attribute attr_##_attrname##_possible_values = \ 187 __ASUS_ATTR_RO(_attrname, possible_values); \ 188 static struct kobj_attribute attr_##_attrname##_type = \ 189 __ASUS_ATTR_RO_AS(type, enum_type_show); \ 190 static struct attribute *_attrname##_attrs[] = { \ 191 &attr_##_attrname##_current_value.attr, \ 192 &attr_##_attrname##_display_name.attr, \ 193 &attr_##_attrname##_possible_values.attr, \ 194 &attr_##_attrname##_type.attr, \ 195 NULL \ 196 }; \ 197 static const struct attribute_group _attrname##_attr_group = { \ 198 .name = _fsname, .attrs = _attrname##_attrs \ 199 } 200 201 #define ASUS_ATTR_GROUP_INT_VALUE_ONLY_RO(_attrname, _fsname, _wmi, _dispname) \ 202 ASUS_WMI_SHOW_INT(_attrname##_current_value, _wmi); \ 203 static struct kobj_attribute attr_##_attrname##_current_value = \ 204 __ASUS_ATTR_RO(_attrname, current_value); \ 205 __ATTR_SHOW_FMT(display_name, _attrname, "%s\n", _dispname); \ 206 static struct kobj_attribute attr_##_attrname##_type = \ 207 __ASUS_ATTR_RO_AS(type, int_type_show); \ 208 static struct attribute *_attrname##_attrs[] = { \ 209 &attr_##_attrname##_current_value.attr, \ 210 &attr_##_attrname##_display_name.attr, \ 211 &attr_##_attrname##_type.attr, NULL \ 212 }; \ 213 static const struct attribute_group _attrname##_attr_group = { \ 214 .name = _fsname, .attrs = _attrname##_attrs \ 215 } 216 217 /* 218 * ROG PPT attributes need a little different in setup as they 219 * require rog_tunables members. 220 */ 221 222 #define __ROG_TUNABLE_SHOW(_prop, _attrname, _val) \ 223 static ssize_t _attrname##_##_prop##_show( \ 224 struct kobject *kobj, struct kobj_attribute *attr, char *buf) \ 225 { \ 226 struct rog_tunables *tunables = get_current_tunables(); \ 227 \ 228 if (!tunables || !tunables->power_limits) \ 229 return -ENODEV; \ 230 \ 231 return sysfs_emit(buf, "%d\n", tunables->power_limits->_val); \ 232 } \ 233 static struct kobj_attribute attr_##_attrname##_##_prop = \ 234 __ASUS_ATTR_RO(_attrname, _prop) 235 236 #define __ROG_TUNABLE_SHOW_DEFAULT(_attrname) \ 237 static ssize_t _attrname##_default_value_show( \ 238 struct kobject *kobj, struct kobj_attribute *attr, char *buf) \ 239 { \ 240 struct rog_tunables *tunables = get_current_tunables(); \ 241 \ 242 if (!tunables || !tunables->power_limits) \ 243 return -ENODEV; \ 244 \ 245 return sysfs_emit( \ 246 buf, "%d\n", \ 247 tunables->power_limits->_attrname##_def ? \ 248 tunables->power_limits->_attrname##_def : \ 249 tunables->power_limits->_attrname##_max); \ 250 } \ 251 static struct kobj_attribute attr_##_attrname##_default_value = \ 252 __ASUS_ATTR_RO(_attrname, default_value) 253 254 #define __ROG_TUNABLE_RW(_attr, _wmi) \ 255 static ssize_t _attr##_current_value_store( \ 256 struct kobject *kobj, struct kobj_attribute *attr, \ 257 const char *buf, size_t count) \ 258 { \ 259 struct rog_tunables *tunables = get_current_tunables(); \ 260 \ 261 if (!tunables || !tunables->power_limits) \ 262 return -ENODEV; \ 263 \ 264 if (tunables->power_limits->_attr##_min == \ 265 tunables->power_limits->_attr##_max) \ 266 return -EINVAL; \ 267 \ 268 return armoury_attr_uint_store(kobj, attr, buf, count, \ 269 tunables->power_limits->_attr##_min, \ 270 tunables->power_limits->_attr##_max, \ 271 &tunables->_attr, _wmi); \ 272 } \ 273 static ssize_t _attr##_current_value_show( \ 274 struct kobject *kobj, struct kobj_attribute *attr, char *buf) \ 275 { \ 276 struct rog_tunables *tunables = get_current_tunables(); \ 277 \ 278 if (!tunables) \ 279 return -ENODEV; \ 280 \ 281 return sysfs_emit(buf, "%u\n", tunables->_attr); \ 282 } \ 283 static struct kobj_attribute attr_##_attr##_current_value = \ 284 __ASUS_ATTR_RW(_attr, current_value) 285 286 #define ASUS_ATTR_GROUP_ROG_TUNABLE(_attrname, _fsname, _wmi, _dispname) \ 287 __ROG_TUNABLE_RW(_attrname, _wmi); \ 288 __ROG_TUNABLE_SHOW_DEFAULT(_attrname); \ 289 __ROG_TUNABLE_SHOW(min_value, _attrname, _attrname##_min); \ 290 __ROG_TUNABLE_SHOW(max_value, _attrname, _attrname##_max); \ 291 __ATTR_SHOW_FMT(scalar_increment, _attrname, "%d\n", 1); \ 292 __ATTR_SHOW_FMT(display_name, _attrname, "%s\n", _dispname); \ 293 static struct kobj_attribute attr_##_attrname##_type = \ 294 __ASUS_ATTR_RO_AS(type, int_type_show); \ 295 static struct attribute *_attrname##_attrs[] = { \ 296 &attr_##_attrname##_current_value.attr, \ 297 &attr_##_attrname##_default_value.attr, \ 298 &attr_##_attrname##_min_value.attr, \ 299 &attr_##_attrname##_max_value.attr, \ 300 &attr_##_attrname##_scalar_increment.attr, \ 301 &attr_##_attrname##_display_name.attr, \ 302 &attr_##_attrname##_type.attr, \ 303 NULL \ 304 }; \ 305 static const struct attribute_group _attrname##_attr_group = { \ 306 .name = _fsname, .attrs = _attrname##_attrs \ 307 } 308 309 /* Default is always the maximum value unless *_def is specified */ 310 struct power_limits { 311 u8 ppt_pl1_spl_min; 312 u8 ppt_pl1_spl_def; 313 u8 ppt_pl1_spl_max; 314 u8 ppt_pl2_sppt_min; 315 u8 ppt_pl2_sppt_def; 316 u8 ppt_pl2_sppt_max; 317 u8 ppt_pl3_fppt_min; 318 u8 ppt_pl3_fppt_def; 319 u8 ppt_pl3_fppt_max; 320 u8 ppt_apu_sppt_min; 321 u8 ppt_apu_sppt_def; 322 u8 ppt_apu_sppt_max; 323 u8 ppt_platform_sppt_min; 324 u8 ppt_platform_sppt_def; 325 u8 ppt_platform_sppt_max; 326 /* Nvidia GPU specific, default is always max */ 327 u8 nv_dynamic_boost_def; // unused. exists for macro 328 u8 nv_dynamic_boost_min; 329 u8 nv_dynamic_boost_max; 330 u8 nv_temp_target_def; // unused. exists for macro 331 u8 nv_temp_target_min; 332 u8 nv_temp_target_max; 333 u8 nv_tgp_def; // unused. exists for macro 334 u8 nv_tgp_min; 335 u8 nv_tgp_max; 336 }; 337 338 struct power_data { 339 const struct power_limits *ac_data; 340 const struct power_limits *dc_data; 341 bool requires_fan_curve; 342 }; 343 344 /* 345 * For each available attribute there must be a min and a max. 346 * _def is not required and will be assumed to be default == max if missing. 347 */ 348 static const struct dmi_system_id power_limits[] = { 349 { 350 .matches = { 351 DMI_MATCH(DMI_BOARD_NAME, "FA401UV"), 352 }, 353 .driver_data = &(struct power_data) { 354 .ac_data = &(struct power_limits) { 355 .ppt_pl1_spl_min = 15, 356 .ppt_pl1_spl_max = 80, 357 .ppt_pl2_sppt_min = 35, 358 .ppt_pl2_sppt_max = 80, 359 .ppt_pl3_fppt_min = 35, 360 .ppt_pl3_fppt_max = 80, 361 .nv_dynamic_boost_min = 5, 362 .nv_dynamic_boost_max = 25, 363 .nv_temp_target_min = 75, 364 .nv_temp_target_max = 87, 365 .nv_tgp_min = 55, 366 .nv_tgp_max = 75, 367 }, 368 .dc_data = &(struct power_limits) { 369 .ppt_pl1_spl_min = 25, 370 .ppt_pl1_spl_max = 35, 371 .ppt_pl2_sppt_min = 31, 372 .ppt_pl2_sppt_max = 44, 373 .ppt_pl3_fppt_min = 45, 374 .ppt_pl3_fppt_max = 65, 375 .nv_temp_target_min = 75, 376 .nv_temp_target_max = 87, 377 }, 378 }, 379 }, 380 { 381 .matches = { 382 DMI_MATCH(DMI_BOARD_NAME, "FA401W"), 383 }, 384 .driver_data = &(struct power_data) { 385 .ac_data = &(struct power_limits) { 386 .ppt_pl1_spl_min = 15, 387 .ppt_pl1_spl_max = 80, 388 .ppt_pl2_sppt_min = 35, 389 .ppt_pl2_sppt_max = 80, 390 .ppt_pl3_fppt_min = 35, 391 .ppt_pl3_fppt_max = 80, 392 .nv_dynamic_boost_min = 5, 393 .nv_dynamic_boost_max = 25, 394 .nv_temp_target_min = 75, 395 .nv_temp_target_max = 87, 396 .nv_tgp_min = 55, 397 .nv_tgp_max = 75, 398 }, 399 .dc_data = &(struct power_limits) { 400 .ppt_pl1_spl_min = 25, 401 .ppt_pl1_spl_max = 30, 402 .ppt_pl2_sppt_min = 31, 403 .ppt_pl2_sppt_max = 44, 404 .ppt_pl3_fppt_min = 45, 405 .ppt_pl3_fppt_max = 65, 406 .nv_temp_target_min = 75, 407 .nv_temp_target_max = 87, 408 }, 409 }, 410 }, 411 { 412 .matches = { 413 DMI_MATCH(DMI_BOARD_NAME, "FA507N"), 414 }, 415 .driver_data = &(struct power_data) { 416 .ac_data = &(struct power_limits) { 417 .ppt_pl1_spl_min = 15, 418 .ppt_pl1_spl_max = 80, 419 .ppt_pl2_sppt_min = 35, 420 .ppt_pl2_sppt_max = 80, 421 .ppt_pl3_fppt_min = 35, 422 .ppt_pl3_fppt_max = 80, 423 .nv_dynamic_boost_min = 5, 424 .nv_dynamic_boost_max = 25, 425 .nv_temp_target_min = 75, 426 .nv_temp_target_max = 87, 427 }, 428 .dc_data = &(struct power_limits) { 429 .ppt_pl1_spl_min = 15, 430 .ppt_pl1_spl_def = 45, 431 .ppt_pl1_spl_max = 65, 432 .ppt_pl2_sppt_min = 35, 433 .ppt_pl2_sppt_def = 54, 434 .ppt_pl2_sppt_max = 65, 435 .ppt_pl3_fppt_min = 35, 436 .ppt_pl3_fppt_max = 65, 437 .nv_temp_target_min = 75, 438 .nv_temp_target_max = 87, 439 }, 440 }, 441 }, 442 { 443 .matches = { 444 DMI_MATCH(DMI_BOARD_NAME, "FA507UV"), 445 }, 446 .driver_data = &(struct power_data) { 447 .ac_data = &(struct power_limits) { 448 .ppt_pl1_spl_min = 15, 449 .ppt_pl1_spl_max = 80, 450 .ppt_pl2_sppt_min = 35, 451 .ppt_pl2_sppt_max = 80, 452 .ppt_pl3_fppt_min = 35, 453 .ppt_pl3_fppt_max = 80, 454 .nv_dynamic_boost_min = 5, 455 .nv_dynamic_boost_max = 25, 456 .nv_temp_target_min = 75, 457 .nv_temp_target_max = 87, 458 .nv_tgp_min = 55, 459 .nv_tgp_max = 115, 460 }, 461 .dc_data = &(struct power_limits) { 462 .ppt_pl1_spl_min = 15, 463 .ppt_pl1_spl_def = 45, 464 .ppt_pl1_spl_max = 65, 465 .ppt_pl2_sppt_min = 35, 466 .ppt_pl2_sppt_def = 54, 467 .ppt_pl2_sppt_max = 65, 468 .ppt_pl3_fppt_min = 35, 469 .ppt_pl3_fppt_max = 65, 470 .nv_temp_target_min = 75, 471 .nv_temp_target_max = 87, 472 }, 473 }, 474 }, 475 { 476 .matches = { 477 DMI_MATCH(DMI_BOARD_NAME, "FA507R"), 478 }, 479 .driver_data = &(struct power_data) { 480 .ac_data = &(struct power_limits) { 481 .ppt_pl1_spl_min = 15, 482 .ppt_pl1_spl_max = 80, 483 .ppt_pl2_sppt_min = 35, 484 .ppt_pl2_sppt_max = 80, 485 .ppt_pl3_fppt_min = 35, 486 .ppt_pl3_fppt_max = 80, 487 .nv_dynamic_boost_min = 5, 488 .nv_dynamic_boost_max = 25, 489 .nv_temp_target_min = 75, 490 .nv_temp_target_max = 87, 491 }, 492 .dc_data = &(struct power_limits) { 493 .ppt_pl1_spl_min = 15, 494 .ppt_pl1_spl_def = 45, 495 .ppt_pl1_spl_max = 65, 496 .ppt_pl2_sppt_min = 35, 497 .ppt_pl2_sppt_def = 54, 498 .ppt_pl2_sppt_max = 65, 499 .ppt_pl3_fppt_min = 35, 500 .ppt_pl3_fppt_max = 65, 501 .nv_temp_target_min = 75, 502 .nv_temp_target_max = 87, 503 }, 504 }, 505 }, 506 { 507 .matches = { 508 DMI_MATCH(DMI_BOARD_NAME, "FA507X"), 509 }, 510 .driver_data = &(struct power_data) { 511 .ac_data = &(struct power_limits) { 512 .ppt_pl1_spl_min = 15, 513 .ppt_pl1_spl_max = 80, 514 .ppt_pl2_sppt_min = 35, 515 .ppt_pl2_sppt_max = 80, 516 .ppt_pl3_fppt_min = 35, 517 .ppt_pl3_fppt_max = 80, 518 .nv_dynamic_boost_min = 5, 519 .nv_dynamic_boost_max = 20, 520 .nv_temp_target_min = 75, 521 .nv_temp_target_max = 87, 522 .nv_tgp_min = 55, 523 .nv_tgp_max = 85, 524 }, 525 .dc_data = &(struct power_limits) { 526 .ppt_pl1_spl_min = 15, 527 .ppt_pl1_spl_def = 45, 528 .ppt_pl1_spl_max = 65, 529 .ppt_pl2_sppt_min = 35, 530 .ppt_pl2_sppt_def = 54, 531 .ppt_pl2_sppt_max = 65, 532 .ppt_pl3_fppt_min = 35, 533 .ppt_pl3_fppt_max = 65, 534 .nv_temp_target_min = 75, 535 .nv_temp_target_max = 87, 536 }, 537 }, 538 }, 539 { 540 .matches = { 541 DMI_MATCH(DMI_BOARD_NAME, "FA507Z"), 542 }, 543 .driver_data = &(struct power_data) { 544 .ac_data = &(struct power_limits) { 545 .ppt_pl1_spl_min = 28, 546 .ppt_pl1_spl_max = 65, 547 .ppt_pl2_sppt_min = 28, 548 .ppt_pl2_sppt_max = 105, 549 .nv_dynamic_boost_min = 5, 550 .nv_dynamic_boost_max = 15, 551 .nv_temp_target_min = 75, 552 .nv_temp_target_max = 87, 553 .nv_tgp_min = 55, 554 .nv_tgp_max = 85, 555 }, 556 .dc_data = &(struct power_limits) { 557 .ppt_pl1_spl_min = 25, 558 .ppt_pl1_spl_max = 45, 559 .ppt_pl2_sppt_min = 35, 560 .ppt_pl2_sppt_max = 60, 561 .nv_temp_target_min = 75, 562 .nv_temp_target_max = 87, 563 }, 564 }, 565 }, 566 { 567 .matches = { 568 DMI_MATCH(DMI_BOARD_NAME, "FA607P"), 569 }, 570 .driver_data = &(struct power_data) { 571 .ac_data = &(struct power_limits) { 572 .ppt_pl1_spl_min = 30, 573 .ppt_pl1_spl_def = 100, 574 .ppt_pl1_spl_max = 135, 575 .ppt_pl2_sppt_min = 30, 576 .ppt_pl2_sppt_def = 115, 577 .ppt_pl2_sppt_max = 135, 578 .ppt_pl3_fppt_min = 30, 579 .ppt_pl3_fppt_max = 135, 580 .nv_dynamic_boost_min = 5, 581 .nv_dynamic_boost_max = 25, 582 .nv_temp_target_min = 75, 583 .nv_temp_target_max = 87, 584 .nv_tgp_min = 55, 585 .nv_tgp_max = 115, 586 }, 587 .dc_data = &(struct power_limits) { 588 .ppt_pl1_spl_min = 25, 589 .ppt_pl1_spl_def = 45, 590 .ppt_pl1_spl_max = 80, 591 .ppt_pl2_sppt_min = 25, 592 .ppt_pl2_sppt_def = 60, 593 .ppt_pl2_sppt_max = 80, 594 .ppt_pl3_fppt_min = 25, 595 .ppt_pl3_fppt_max = 80, 596 .nv_temp_target_min = 75, 597 .nv_temp_target_max = 87, 598 }, 599 }, 600 }, 601 { 602 .matches = { 603 DMI_MATCH(DMI_BOARD_NAME, "FA608UM"), 604 }, 605 .driver_data = &(struct power_data) { 606 .ac_data = &(struct power_limits) { 607 .ppt_pl1_spl_min = 15, 608 .ppt_pl1_spl_def = 45, 609 .ppt_pl1_spl_max = 90, 610 .ppt_pl2_sppt_min = 35, 611 .ppt_pl2_sppt_def = 54, 612 .ppt_pl2_sppt_max = 90, 613 .ppt_pl3_fppt_min = 35, 614 .ppt_pl3_fppt_def = 65, 615 .ppt_pl3_fppt_max = 90, 616 .nv_dynamic_boost_min = 10, 617 .nv_dynamic_boost_max = 15, 618 .nv_temp_target_min = 75, 619 .nv_temp_target_max = 87, 620 .nv_tgp_min = 55, 621 .nv_tgp_max = 100, 622 }, 623 .dc_data = &(struct power_limits) { 624 .ppt_pl1_spl_min = 15, 625 .ppt_pl1_spl_def = 45, 626 .ppt_pl1_spl_max = 65, 627 .ppt_pl2_sppt_min = 35, 628 .ppt_pl2_sppt_def = 54, 629 .ppt_pl2_sppt_max = 65, 630 .ppt_pl3_fppt_min = 35, 631 .ppt_pl3_fppt_max = 65, 632 .nv_temp_target_min = 75, 633 .nv_temp_target_max = 87, 634 }, 635 }, 636 }, 637 { 638 .matches = { 639 DMI_MATCH(DMI_BOARD_NAME, "FA608WI"), 640 }, 641 .driver_data = &(struct power_data) { 642 .ac_data = &(struct power_limits) { 643 .ppt_pl1_spl_min = 15, 644 .ppt_pl1_spl_def = 90, 645 .ppt_pl1_spl_max = 90, 646 .ppt_pl2_sppt_min = 35, 647 .ppt_pl2_sppt_def = 90, 648 .ppt_pl2_sppt_max = 90, 649 .ppt_pl3_fppt_min = 35, 650 .ppt_pl3_fppt_def = 90, 651 .ppt_pl3_fppt_max = 90, 652 .nv_dynamic_boost_min = 5, 653 .nv_dynamic_boost_max = 25, 654 .nv_temp_target_min = 75, 655 .nv_temp_target_max = 87, 656 .nv_tgp_min = 55, 657 .nv_tgp_max = 115, 658 }, 659 .dc_data = &(struct power_limits) { 660 .ppt_pl1_spl_min = 15, 661 .ppt_pl1_spl_def = 45, 662 .ppt_pl1_spl_max = 65, 663 .ppt_pl2_sppt_min = 35, 664 .ppt_pl2_sppt_def = 54, 665 .ppt_pl2_sppt_max = 65, 666 .ppt_pl3_fppt_min = 35, 667 .ppt_pl3_fppt_def = 65, 668 .ppt_pl3_fppt_max = 65, 669 .nv_temp_target_min = 75, 670 .nv_temp_target_max = 87, 671 }, 672 }, 673 }, 674 { 675 .matches = { 676 DMI_MATCH(DMI_BOARD_NAME, "FA617NS"), 677 }, 678 .driver_data = &(struct power_data) { 679 .ac_data = &(struct power_limits) { 680 .ppt_apu_sppt_min = 15, 681 .ppt_apu_sppt_max = 80, 682 .ppt_platform_sppt_min = 30, 683 .ppt_platform_sppt_max = 120, 684 }, 685 .dc_data = &(struct power_limits) { 686 .ppt_apu_sppt_min = 25, 687 .ppt_apu_sppt_max = 35, 688 .ppt_platform_sppt_min = 45, 689 .ppt_platform_sppt_max = 100, 690 }, 691 }, 692 }, 693 { 694 .matches = { 695 DMI_MATCH(DMI_BOARD_NAME, "FA617NT"), 696 }, 697 .driver_data = &(struct power_data) { 698 .ac_data = &(struct power_limits) { 699 .ppt_apu_sppt_min = 15, 700 .ppt_apu_sppt_max = 80, 701 .ppt_platform_sppt_min = 30, 702 .ppt_platform_sppt_max = 115, 703 }, 704 .dc_data = &(struct power_limits) { 705 .ppt_apu_sppt_min = 15, 706 .ppt_apu_sppt_max = 45, 707 .ppt_platform_sppt_min = 30, 708 .ppt_platform_sppt_max = 50, 709 }, 710 }, 711 }, 712 { 713 .matches = { 714 DMI_MATCH(DMI_BOARD_NAME, "FA617XS"), 715 }, 716 .driver_data = &(struct power_data) { 717 .ac_data = &(struct power_limits) { 718 .ppt_apu_sppt_min = 15, 719 .ppt_apu_sppt_max = 80, 720 .ppt_platform_sppt_min = 30, 721 .ppt_platform_sppt_max = 120, 722 .nv_temp_target_min = 75, 723 .nv_temp_target_max = 87, 724 }, 725 .dc_data = &(struct power_limits) { 726 .ppt_apu_sppt_min = 25, 727 .ppt_apu_sppt_max = 35, 728 .ppt_platform_sppt_min = 45, 729 .ppt_platform_sppt_max = 100, 730 .nv_temp_target_min = 75, 731 .nv_temp_target_max = 87, 732 }, 733 }, 734 }, 735 { 736 .matches = { 737 DMI_MATCH(DMI_BOARD_NAME, "FA617XT"), 738 }, 739 .driver_data = &(struct power_data) { 740 .ac_data = &(struct power_limits) { 741 .ppt_apu_sppt_min = 15, 742 .ppt_apu_sppt_max = 80, 743 .ppt_platform_sppt_min = 30, 744 .ppt_platform_sppt_max = 145, 745 }, 746 .dc_data = &(struct power_limits) { 747 .ppt_apu_sppt_min = 25, 748 .ppt_apu_sppt_max = 35, 749 .ppt_platform_sppt_min = 45, 750 .ppt_platform_sppt_max = 100, 751 }, 752 }, 753 }, 754 { 755 .matches = { 756 DMI_MATCH(DMI_BOARD_NAME, "FX507VI"), 757 }, 758 .driver_data = &(struct power_data) { 759 .ac_data = &(struct power_limits) { 760 .ppt_pl1_spl_min = 28, 761 .ppt_pl1_spl_max = 135, 762 .ppt_pl2_sppt_min = 28, 763 .ppt_pl2_sppt_max = 135, 764 .nv_dynamic_boost_min = 5, 765 .nv_dynamic_boost_max = 25, 766 .nv_temp_target_min = 75, 767 .nv_temp_target_max = 87, 768 }, 769 .dc_data = &(struct power_limits) { 770 .ppt_pl1_spl_min = 25, 771 .ppt_pl1_spl_max = 45, 772 .ppt_pl2_sppt_min = 35, 773 .ppt_pl2_sppt_max = 60, 774 .nv_temp_target_min = 75, 775 .nv_temp_target_max = 87, 776 }, 777 .requires_fan_curve = true, 778 }, 779 }, 780 { 781 .matches = { 782 DMI_MATCH(DMI_BOARD_NAME, "FX507VV"), 783 }, 784 .driver_data = &(struct power_data) { 785 .ac_data = &(struct power_limits) { 786 .ppt_pl1_spl_min = 28, 787 .ppt_pl1_spl_def = 115, 788 .ppt_pl1_spl_max = 135, 789 .ppt_pl2_sppt_min = 28, 790 .ppt_pl2_sppt_max = 135, 791 .nv_dynamic_boost_min = 5, 792 .nv_dynamic_boost_max = 25, 793 .nv_temp_target_min = 75, 794 .nv_temp_target_max = 87, 795 }, 796 .dc_data = &(struct power_limits) { 797 .ppt_pl1_spl_min = 25, 798 .ppt_pl1_spl_max = 45, 799 .ppt_pl2_sppt_min = 35, 800 .ppt_pl2_sppt_max = 60, 801 .nv_temp_target_min = 75, 802 .nv_temp_target_max = 87, 803 }, 804 .requires_fan_curve = true, 805 }, 806 }, 807 { 808 .matches = { 809 DMI_MATCH(DMI_BOARD_NAME, "FX507Z"), 810 }, 811 .driver_data = &(struct power_data) { 812 .ac_data = &(struct power_limits) { 813 .ppt_pl1_spl_min = 28, 814 .ppt_pl1_spl_max = 90, 815 .ppt_pl2_sppt_min = 28, 816 .ppt_pl2_sppt_max = 135, 817 .nv_dynamic_boost_min = 5, 818 .nv_dynamic_boost_max = 15, 819 }, 820 .dc_data = &(struct power_limits) { 821 .ppt_pl1_spl_min = 25, 822 .ppt_pl1_spl_max = 45, 823 .ppt_pl2_sppt_min = 35, 824 .ppt_pl2_sppt_max = 60, 825 }, 826 .requires_fan_curve = true, 827 }, 828 }, 829 { 830 .matches = { 831 DMI_MATCH(DMI_BOARD_NAME, "GA401Q"), 832 }, 833 .driver_data = &(struct power_data) { 834 .ac_data = &(struct power_limits) { 835 .ppt_pl1_spl_min = 15, 836 .ppt_pl1_spl_max = 80, 837 .ppt_pl2_sppt_min = 15, 838 .ppt_pl2_sppt_max = 80, 839 }, 840 .dc_data = NULL, 841 }, 842 }, 843 { 844 .matches = { 845 // This model is full AMD. No Nvidia dGPU. 846 DMI_MATCH(DMI_BOARD_NAME, "GA402R"), 847 }, 848 .driver_data = &(struct power_data) { 849 .ac_data = &(struct power_limits) { 850 .ppt_apu_sppt_min = 15, 851 .ppt_apu_sppt_max = 80, 852 .ppt_platform_sppt_min = 30, 853 .ppt_platform_sppt_max = 115, 854 }, 855 .dc_data = &(struct power_limits) { 856 .ppt_apu_sppt_min = 25, 857 .ppt_apu_sppt_def = 30, 858 .ppt_apu_sppt_max = 45, 859 .ppt_platform_sppt_min = 40, 860 .ppt_platform_sppt_max = 60, 861 }, 862 }, 863 }, 864 { 865 .matches = { 866 DMI_MATCH(DMI_BOARD_NAME, "GA402X"), 867 }, 868 .driver_data = &(struct power_data) { 869 .ac_data = &(struct power_limits) { 870 .ppt_pl1_spl_min = 15, 871 .ppt_pl1_spl_def = 35, 872 .ppt_pl1_spl_max = 80, 873 .ppt_pl2_sppt_min = 25, 874 .ppt_pl2_sppt_def = 65, 875 .ppt_pl2_sppt_max = 80, 876 .ppt_pl3_fppt_min = 35, 877 .ppt_pl3_fppt_max = 80, 878 .nv_temp_target_min = 75, 879 .nv_temp_target_max = 87, 880 }, 881 .dc_data = &(struct power_limits) { 882 .ppt_pl1_spl_min = 15, 883 .ppt_pl1_spl_max = 35, 884 .ppt_pl2_sppt_min = 25, 885 .ppt_pl2_sppt_max = 35, 886 .ppt_pl3_fppt_min = 35, 887 .ppt_pl3_fppt_max = 65, 888 .nv_temp_target_min = 75, 889 .nv_temp_target_max = 87, 890 }, 891 .requires_fan_curve = true, 892 }, 893 }, 894 { 895 .matches = { 896 DMI_MATCH(DMI_BOARD_NAME, "GA403UI"), 897 }, 898 .driver_data = &(struct power_data) { 899 .ac_data = &(struct power_limits) { 900 .ppt_pl1_spl_min = 15, 901 .ppt_pl1_spl_max = 80, 902 .ppt_pl2_sppt_min = 25, 903 .ppt_pl2_sppt_max = 80, 904 .ppt_pl3_fppt_min = 35, 905 .ppt_pl3_fppt_max = 80, 906 .nv_dynamic_boost_min = 5, 907 .nv_dynamic_boost_max = 25, 908 .nv_temp_target_min = 75, 909 .nv_temp_target_max = 87, 910 .nv_tgp_min = 55, 911 .nv_tgp_max = 65, 912 }, 913 .dc_data = &(struct power_limits) { 914 .ppt_pl1_spl_min = 15, 915 .ppt_pl1_spl_max = 35, 916 .ppt_pl2_sppt_min = 25, 917 .ppt_pl2_sppt_max = 35, 918 .ppt_pl3_fppt_min = 35, 919 .ppt_pl3_fppt_max = 65, 920 .nv_temp_target_min = 75, 921 .nv_temp_target_max = 87, 922 }, 923 .requires_fan_curve = true, 924 }, 925 }, 926 { 927 .matches = { 928 DMI_MATCH(DMI_BOARD_NAME, "GA403UV"), 929 }, 930 .driver_data = &(struct power_data) { 931 .ac_data = &(struct power_limits) { 932 .ppt_pl1_spl_min = 15, 933 .ppt_pl1_spl_max = 80, 934 .ppt_pl2_sppt_min = 25, 935 .ppt_pl2_sppt_max = 80, 936 .ppt_pl3_fppt_min = 35, 937 .ppt_pl3_fppt_max = 80, 938 .nv_dynamic_boost_min = 5, 939 .nv_dynamic_boost_max = 25, 940 .nv_temp_target_min = 75, 941 .nv_temp_target_max = 87, 942 .nv_tgp_min = 55, 943 .nv_tgp_max = 65, 944 }, 945 .dc_data = &(struct power_limits) { 946 .ppt_pl1_spl_min = 15, 947 .ppt_pl1_spl_max = 35, 948 .ppt_pl2_sppt_min = 25, 949 .ppt_pl2_sppt_max = 35, 950 .ppt_pl3_fppt_min = 35, 951 .ppt_pl3_fppt_max = 65, 952 .nv_temp_target_min = 75, 953 .nv_temp_target_max = 87, 954 }, 955 .requires_fan_curve = true, 956 }, 957 }, 958 { 959 .matches = { 960 DMI_MATCH(DMI_BOARD_NAME, "GA403WM"), 961 }, 962 .driver_data = &(struct power_data) { 963 .ac_data = &(struct power_limits) { 964 .ppt_pl1_spl_min = 15, 965 .ppt_pl1_spl_max = 80, 966 .ppt_pl2_sppt_min = 25, 967 .ppt_pl2_sppt_max = 80, 968 .ppt_pl3_fppt_min = 35, 969 .ppt_pl3_fppt_max = 80, 970 .nv_dynamic_boost_min = 0, 971 .nv_dynamic_boost_max = 15, 972 .nv_temp_target_min = 75, 973 .nv_temp_target_max = 87, 974 .nv_tgp_min = 55, 975 .nv_tgp_max = 85, 976 }, 977 .dc_data = &(struct power_limits) { 978 .ppt_pl1_spl_min = 15, 979 .ppt_pl1_spl_max = 35, 980 .ppt_pl2_sppt_min = 25, 981 .ppt_pl2_sppt_max = 35, 982 .ppt_pl3_fppt_min = 35, 983 .ppt_pl3_fppt_max = 65, 984 .nv_temp_target_min = 75, 985 .nv_temp_target_max = 87, 986 }, 987 .requires_fan_curve = true, 988 }, 989 }, 990 { 991 .matches = { 992 DMI_MATCH(DMI_BOARD_NAME, "GA403WR"), 993 }, 994 .driver_data = &(struct power_data) { 995 .ac_data = &(struct power_limits) { 996 .ppt_pl1_spl_min = 15, 997 .ppt_pl1_spl_max = 80, 998 .ppt_pl2_sppt_min = 25, 999 .ppt_pl2_sppt_max = 80, 1000 .ppt_pl3_fppt_min = 35, 1001 .ppt_pl3_fppt_max = 80, 1002 .nv_dynamic_boost_min = 0, 1003 .nv_dynamic_boost_max = 25, 1004 .nv_temp_target_min = 75, 1005 .nv_temp_target_max = 87, 1006 .nv_tgp_min = 80, 1007 .nv_tgp_max = 95, 1008 }, 1009 .dc_data = &(struct power_limits) { 1010 .ppt_pl1_spl_min = 15, 1011 .ppt_pl1_spl_max = 35, 1012 .ppt_pl2_sppt_min = 25, 1013 .ppt_pl2_sppt_max = 35, 1014 .ppt_pl3_fppt_min = 35, 1015 .ppt_pl3_fppt_max = 65, 1016 .nv_temp_target_min = 75, 1017 .nv_temp_target_max = 87, 1018 }, 1019 .requires_fan_curve = true, 1020 }, 1021 }, 1022 { 1023 .matches = { 1024 DMI_MATCH(DMI_BOARD_NAME, "GA403WW"), 1025 }, 1026 .driver_data = &(struct power_data) { 1027 .ac_data = &(struct power_limits) { 1028 .ppt_pl1_spl_min = 15, 1029 .ppt_pl1_spl_max = 80, 1030 .ppt_pl2_sppt_min = 25, 1031 .ppt_pl2_sppt_max = 80, 1032 .ppt_pl3_fppt_min = 35, 1033 .ppt_pl3_fppt_max = 80, 1034 .nv_dynamic_boost_min = 0, 1035 .nv_dynamic_boost_max = 25, 1036 .nv_temp_target_min = 75, 1037 .nv_temp_target_max = 87, 1038 .nv_tgp_min = 80, 1039 .nv_tgp_max = 95, 1040 }, 1041 .dc_data = &(struct power_limits) { 1042 .ppt_pl1_spl_min = 15, 1043 .ppt_pl1_spl_max = 35, 1044 .ppt_pl2_sppt_min = 25, 1045 .ppt_pl2_sppt_max = 35, 1046 .ppt_pl3_fppt_min = 35, 1047 .ppt_pl3_fppt_max = 65, 1048 .nv_temp_target_min = 75, 1049 .nv_temp_target_max = 87, 1050 }, 1051 .requires_fan_curve = true, 1052 }, 1053 }, 1054 { 1055 .matches = { 1056 DMI_MATCH(DMI_BOARD_NAME, "GA503QR"), 1057 }, 1058 .driver_data = &(struct power_data) { 1059 .ac_data = &(struct power_limits) { 1060 .ppt_pl1_spl_min = 15, 1061 .ppt_pl1_spl_def = 35, 1062 .ppt_pl1_spl_max = 80, 1063 .ppt_pl2_sppt_min = 65, 1064 .ppt_pl2_sppt_max = 80, 1065 }, 1066 }, 1067 }, 1068 { 1069 .matches = { 1070 DMI_MATCH(DMI_BOARD_NAME, "GA503R"), 1071 }, 1072 .driver_data = &(struct power_data) { 1073 .ac_data = &(struct power_limits) { 1074 .ppt_pl1_spl_min = 15, 1075 .ppt_pl1_spl_def = 35, 1076 .ppt_pl1_spl_max = 80, 1077 .ppt_pl2_sppt_min = 35, 1078 .ppt_pl2_sppt_def = 65, 1079 .ppt_pl2_sppt_max = 80, 1080 .ppt_pl3_fppt_min = 35, 1081 .ppt_pl3_fppt_max = 80, 1082 .nv_dynamic_boost_min = 5, 1083 .nv_dynamic_boost_max = 20, 1084 .nv_temp_target_min = 75, 1085 .nv_temp_target_max = 87, 1086 }, 1087 .dc_data = &(struct power_limits) { 1088 .ppt_pl1_spl_min = 15, 1089 .ppt_pl1_spl_def = 25, 1090 .ppt_pl1_spl_max = 65, 1091 .ppt_pl2_sppt_min = 35, 1092 .ppt_pl2_sppt_def = 54, 1093 .ppt_pl2_sppt_max = 60, 1094 .ppt_pl3_fppt_min = 35, 1095 .ppt_pl3_fppt_max = 65, 1096 }, 1097 }, 1098 }, 1099 { 1100 .matches = { 1101 DMI_MATCH(DMI_BOARD_NAME, "GA605W"), 1102 }, 1103 .driver_data = &(struct power_data) { 1104 .ac_data = &(struct power_limits) { 1105 .ppt_pl1_spl_min = 15, 1106 .ppt_pl1_spl_max = 80, 1107 .ppt_pl2_sppt_min = 35, 1108 .ppt_pl2_sppt_max = 80, 1109 .ppt_pl3_fppt_min = 35, 1110 .ppt_pl3_fppt_max = 80, 1111 .nv_dynamic_boost_min = 5, 1112 .nv_dynamic_boost_max = 20, 1113 .nv_temp_target_min = 75, 1114 .nv_temp_target_max = 87, 1115 .nv_tgp_min = 55, 1116 .nv_tgp_max = 85, 1117 }, 1118 .dc_data = &(struct power_limits) { 1119 .ppt_pl1_spl_min = 25, 1120 .ppt_pl1_spl_max = 35, 1121 .ppt_pl2_sppt_min = 31, 1122 .ppt_pl2_sppt_max = 44, 1123 .ppt_pl3_fppt_min = 45, 1124 .ppt_pl3_fppt_max = 65, 1125 .nv_temp_target_min = 75, 1126 .nv_temp_target_max = 87, 1127 }, 1128 .requires_fan_curve = true, 1129 }, 1130 }, 1131 { 1132 .matches = { 1133 DMI_MATCH(DMI_BOARD_NAME, "GU603Z"), 1134 }, 1135 .driver_data = &(struct power_data) { 1136 .ac_data = &(struct power_limits) { 1137 .ppt_pl1_spl_min = 25, 1138 .ppt_pl1_spl_max = 60, 1139 .ppt_pl2_sppt_min = 25, 1140 .ppt_pl2_sppt_max = 135, 1141 .nv_dynamic_boost_min = 5, 1142 .nv_dynamic_boost_max = 20, 1143 .nv_temp_target_min = 75, 1144 .nv_temp_target_max = 87, 1145 }, 1146 .dc_data = &(struct power_limits) { 1147 .ppt_pl1_spl_min = 25, 1148 .ppt_pl1_spl_max = 40, 1149 .ppt_pl2_sppt_min = 25, 1150 .ppt_pl2_sppt_max = 40, 1151 .nv_temp_target_min = 75, 1152 .nv_temp_target_max = 87, 1153 } 1154 }, 1155 }, 1156 { 1157 .matches = { 1158 DMI_MATCH(DMI_BOARD_NAME, "GU604V"), 1159 }, 1160 .driver_data = &(struct power_data) { 1161 .ac_data = &(struct power_limits) { 1162 .ppt_pl1_spl_min = 65, 1163 .ppt_pl1_spl_max = 120, 1164 .ppt_pl2_sppt_min = 65, 1165 .ppt_pl2_sppt_max = 150, 1166 .nv_dynamic_boost_min = 5, 1167 .nv_dynamic_boost_max = 25, 1168 .nv_temp_target_min = 75, 1169 .nv_temp_target_max = 87, 1170 }, 1171 .dc_data = &(struct power_limits) { 1172 .ppt_pl1_spl_min = 25, 1173 .ppt_pl1_spl_max = 40, 1174 .ppt_pl2_sppt_min = 35, 1175 .ppt_pl2_sppt_def = 40, 1176 .ppt_pl2_sppt_max = 60, 1177 .nv_temp_target_min = 75, 1178 .nv_temp_target_max = 87, 1179 }, 1180 }, 1181 }, 1182 { 1183 .matches = { 1184 DMI_MATCH(DMI_BOARD_NAME, "GU605CR"), 1185 }, 1186 .driver_data = &(struct power_data) { 1187 .ac_data = &(struct power_limits) { 1188 .ppt_pl1_spl_min = 30, 1189 .ppt_pl1_spl_max = 85, 1190 .ppt_pl2_sppt_min = 38, 1191 .ppt_pl2_sppt_max = 110, 1192 .nv_dynamic_boost_min = 5, 1193 .nv_dynamic_boost_max = 20, 1194 .nv_temp_target_min = 75, 1195 .nv_temp_target_max = 87, 1196 .nv_tgp_min = 80, 1197 .nv_tgp_def = 90, 1198 .nv_tgp_max = 105, 1199 }, 1200 .dc_data = &(struct power_limits) { 1201 .ppt_pl1_spl_min = 30, 1202 .ppt_pl1_spl_max = 85, 1203 .ppt_pl2_sppt_min = 38, 1204 .ppt_pl2_sppt_max = 110, 1205 .nv_temp_target_min = 75, 1206 .nv_temp_target_max = 87, 1207 }, 1208 .requires_fan_curve = true, 1209 }, 1210 }, 1211 { 1212 .matches = { 1213 DMI_MATCH(DMI_BOARD_NAME, "GU605CW"), 1214 }, 1215 .driver_data = &(struct power_data) { 1216 .ac_data = &(struct power_limits) { 1217 .ppt_pl1_spl_min = 45, 1218 .ppt_pl1_spl_max = 85, 1219 .ppt_pl2_sppt_min = 56, 1220 .ppt_pl2_sppt_max = 110, 1221 .nv_dynamic_boost_min = 5, 1222 .nv_dynamic_boost_max = 20, 1223 .nv_temp_target_min = 75, 1224 .nv_temp_target_max = 87, 1225 .nv_tgp_min = 80, 1226 .nv_tgp_def = 90, 1227 .nv_tgp_max = 110, 1228 }, 1229 .dc_data = &(struct power_limits) { 1230 .ppt_pl1_spl_min = 25, 1231 .ppt_pl1_spl_max = 85, 1232 .ppt_pl2_sppt_min = 32, 1233 .ppt_pl2_sppt_max = 110, 1234 .nv_temp_target_min = 75, 1235 .nv_temp_target_max = 87, 1236 }, 1237 .requires_fan_curve = true, 1238 }, 1239 }, 1240 { 1241 .matches = { 1242 DMI_MATCH(DMI_BOARD_NAME, "GU605CX"), 1243 }, 1244 .driver_data = &(struct power_data) { 1245 .ac_data = &(struct power_limits) { 1246 .ppt_pl1_spl_min = 45, 1247 .ppt_pl1_spl_max = 85, 1248 .ppt_pl2_sppt_min = 56, 1249 .ppt_pl2_sppt_max = 110, 1250 .nv_dynamic_boost_min = 5, 1251 .nv_dynamic_boost_max = 20, 1252 .nv_temp_target_min = 7, 1253 .nv_temp_target_max = 87, 1254 .nv_tgp_min = 95, 1255 .nv_tgp_def = 100, 1256 .nv_tgp_max = 110, 1257 }, 1258 .dc_data = &(struct power_limits) { 1259 .ppt_pl1_spl_min = 25, 1260 .ppt_pl1_spl_max = 85, 1261 .ppt_pl2_sppt_min = 32, 1262 .ppt_pl2_sppt_max = 110, 1263 .nv_temp_target_min = 75, 1264 .nv_temp_target_max = 87, 1265 }, 1266 .requires_fan_curve = true, 1267 }, 1268 }, 1269 { 1270 .matches = { 1271 DMI_MATCH(DMI_BOARD_NAME, "GU605M"), 1272 }, 1273 .driver_data = &(struct power_data) { 1274 .ac_data = &(struct power_limits) { 1275 .ppt_pl1_spl_min = 28, 1276 .ppt_pl1_spl_max = 90, 1277 .ppt_pl2_sppt_min = 28, 1278 .ppt_pl2_sppt_max = 135, 1279 .nv_dynamic_boost_min = 5, 1280 .nv_dynamic_boost_max = 20, 1281 .nv_temp_target_min = 75, 1282 .nv_temp_target_max = 87, 1283 }, 1284 .dc_data = &(struct power_limits) { 1285 .ppt_pl1_spl_min = 25, 1286 .ppt_pl1_spl_max = 35, 1287 .ppt_pl2_sppt_min = 38, 1288 .ppt_pl2_sppt_max = 53, 1289 .nv_temp_target_min = 75, 1290 .nv_temp_target_max = 87, 1291 }, 1292 .requires_fan_curve = true, 1293 }, 1294 }, 1295 { 1296 .matches = { 1297 DMI_MATCH(DMI_BOARD_NAME, "GV301Q"), 1298 }, 1299 .driver_data = &(struct power_data) { 1300 .ac_data = &(struct power_limits) { 1301 .ppt_pl1_spl_min = 15, 1302 .ppt_pl1_spl_max = 45, 1303 .ppt_pl2_sppt_min = 65, 1304 .ppt_pl2_sppt_max = 80, 1305 }, 1306 .dc_data = NULL, 1307 }, 1308 }, 1309 { 1310 .matches = { 1311 DMI_MATCH(DMI_BOARD_NAME, "GV301R"), 1312 }, 1313 .driver_data = &(struct power_data) { 1314 .ac_data = &(struct power_limits) { 1315 .ppt_pl1_spl_min = 15, 1316 .ppt_pl1_spl_max = 45, 1317 .ppt_pl2_sppt_min = 25, 1318 .ppt_pl2_sppt_max = 54, 1319 .ppt_pl3_fppt_min = 35, 1320 .ppt_pl3_fppt_max = 65, 1321 .nv_temp_target_min = 75, 1322 .nv_temp_target_max = 87, 1323 }, 1324 .dc_data = &(struct power_limits) { 1325 .ppt_pl1_spl_min = 15, 1326 .ppt_pl1_spl_max = 35, 1327 .ppt_pl2_sppt_min = 25, 1328 .ppt_pl2_sppt_max = 35, 1329 .ppt_pl3_fppt_min = 35, 1330 .ppt_pl3_fppt_max = 65, 1331 .nv_temp_target_min = 75, 1332 .nv_temp_target_max = 87, 1333 }, 1334 }, 1335 }, 1336 { 1337 .matches = { 1338 DMI_MATCH(DMI_BOARD_NAME, "GV302XV"), 1339 }, 1340 .driver_data = &(struct power_data) { 1341 .ac_data = &(struct power_limits) { 1342 .ppt_pl1_spl_min = 15, 1343 .ppt_pl1_spl_max = 55, 1344 .ppt_pl2_sppt_min = 25, 1345 .ppt_pl2_sppt_max = 60, 1346 .ppt_pl3_fppt_min = 35, 1347 .ppt_pl3_fppt_max = 65, 1348 .nv_temp_target_min = 75, 1349 .nv_temp_target_max = 87, 1350 }, 1351 .dc_data = &(struct power_limits) { 1352 .ppt_pl1_spl_min = 15, 1353 .ppt_pl1_spl_max = 35, 1354 .ppt_pl2_sppt_min = 25, 1355 .ppt_pl2_sppt_max = 35, 1356 .ppt_pl3_fppt_min = 35, 1357 .ppt_pl3_fppt_max = 65, 1358 .nv_temp_target_min = 75, 1359 .nv_temp_target_max = 87, 1360 }, 1361 }, 1362 }, 1363 { 1364 .matches = { 1365 DMI_MATCH(DMI_BOARD_NAME, "GV601R"), 1366 }, 1367 .driver_data = &(struct power_data) { 1368 .ac_data = &(struct power_limits) { 1369 .ppt_pl1_spl_min = 15, 1370 .ppt_pl1_spl_def = 35, 1371 .ppt_pl1_spl_max = 90, 1372 .ppt_pl2_sppt_min = 35, 1373 .ppt_pl2_sppt_def = 54, 1374 .ppt_pl2_sppt_max = 100, 1375 .ppt_pl3_fppt_min = 35, 1376 .ppt_pl3_fppt_def = 80, 1377 .ppt_pl3_fppt_max = 125, 1378 .nv_dynamic_boost_min = 5, 1379 .nv_dynamic_boost_max = 25, 1380 .nv_temp_target_min = 75, 1381 .nv_temp_target_max = 87, 1382 }, 1383 .dc_data = &(struct power_limits) { 1384 .ppt_pl1_spl_min = 15, 1385 .ppt_pl1_spl_def = 28, 1386 .ppt_pl1_spl_max = 65, 1387 .ppt_pl2_sppt_min = 35, 1388 .ppt_pl2_sppt_def = 54, 1389 .ppt_pl2_sppt_max = 60, 1390 .ppt_pl3_fppt_min = 35, 1391 .ppt_pl3_fppt_def = 80, 1392 .ppt_pl3_fppt_max = 65, 1393 .nv_temp_target_min = 75, 1394 .nv_temp_target_max = 87, 1395 }, 1396 }, 1397 }, 1398 { 1399 .matches = { 1400 DMI_MATCH(DMI_BOARD_NAME, "GV601V"), 1401 }, 1402 .driver_data = &(struct power_data) { 1403 .ac_data = &(struct power_limits) { 1404 .ppt_pl1_spl_min = 28, 1405 .ppt_pl1_spl_def = 100, 1406 .ppt_pl1_spl_max = 110, 1407 .ppt_pl2_sppt_min = 28, 1408 .ppt_pl2_sppt_max = 135, 1409 .nv_dynamic_boost_min = 5, 1410 .nv_dynamic_boost_max = 20, 1411 .nv_temp_target_min = 75, 1412 .nv_temp_target_max = 87, 1413 }, 1414 .dc_data = &(struct power_limits) { 1415 .ppt_pl1_spl_min = 25, 1416 .ppt_pl1_spl_max = 40, 1417 .ppt_pl2_sppt_min = 35, 1418 .ppt_pl2_sppt_def = 40, 1419 .ppt_pl2_sppt_max = 60, 1420 .nv_temp_target_min = 75, 1421 .nv_temp_target_max = 87, 1422 }, 1423 }, 1424 }, 1425 { 1426 .matches = { 1427 DMI_MATCH(DMI_BOARD_NAME, "GX650P"), 1428 }, 1429 .driver_data = &(struct power_data) { 1430 .ac_data = &(struct power_limits) { 1431 .ppt_pl1_spl_min = 15, 1432 .ppt_pl1_spl_def = 110, 1433 .ppt_pl1_spl_max = 130, 1434 .ppt_pl2_sppt_min = 35, 1435 .ppt_pl2_sppt_def = 125, 1436 .ppt_pl2_sppt_max = 130, 1437 .ppt_pl3_fppt_min = 35, 1438 .ppt_pl3_fppt_def = 125, 1439 .ppt_pl3_fppt_max = 135, 1440 .nv_dynamic_boost_min = 5, 1441 .nv_dynamic_boost_max = 25, 1442 .nv_temp_target_min = 75, 1443 .nv_temp_target_max = 87, 1444 }, 1445 .dc_data = &(struct power_limits) { 1446 .ppt_pl1_spl_min = 15, 1447 .ppt_pl1_spl_def = 25, 1448 .ppt_pl1_spl_max = 65, 1449 .ppt_pl2_sppt_min = 35, 1450 .ppt_pl2_sppt_def = 35, 1451 .ppt_pl2_sppt_max = 65, 1452 .ppt_pl3_fppt_min = 35, 1453 .ppt_pl3_fppt_def = 42, 1454 .ppt_pl3_fppt_max = 65, 1455 .nv_temp_target_min = 75, 1456 .nv_temp_target_max = 87, 1457 }, 1458 }, 1459 }, 1460 { 1461 .matches = { 1462 DMI_MATCH(DMI_BOARD_NAME, "G513I"), 1463 }, 1464 .driver_data = &(struct power_data) { 1465 .ac_data = &(struct power_limits) { 1466 /* Yes this laptop is very limited */ 1467 .ppt_pl1_spl_min = 15, 1468 .ppt_pl1_spl_max = 80, 1469 .ppt_pl2_sppt_min = 15, 1470 .ppt_pl2_sppt_max = 80, 1471 }, 1472 .dc_data = NULL, 1473 .requires_fan_curve = true, 1474 }, 1475 }, 1476 { 1477 .matches = { 1478 DMI_MATCH(DMI_BOARD_NAME, "G513QM"), 1479 }, 1480 .driver_data = &(struct power_data) { 1481 .ac_data = &(struct power_limits) { 1482 /* Yes this laptop is very limited */ 1483 .ppt_pl1_spl_min = 15, 1484 .ppt_pl1_spl_max = 100, 1485 .ppt_pl2_sppt_min = 15, 1486 .ppt_pl2_sppt_max = 190, 1487 }, 1488 .dc_data = NULL, 1489 .requires_fan_curve = true, 1490 }, 1491 }, 1492 { 1493 .matches = { 1494 DMI_MATCH(DMI_BOARD_NAME, "G513QY"), 1495 }, 1496 .driver_data = &(struct power_data) { 1497 .ac_data = &(struct power_limits) { 1498 /* Advantage Edition Laptop, no PL1 or PL2 limits */ 1499 .ppt_apu_sppt_min = 15, 1500 .ppt_apu_sppt_max = 100, 1501 .ppt_platform_sppt_min = 70, 1502 .ppt_platform_sppt_max = 190, 1503 }, 1504 .dc_data = NULL, 1505 .requires_fan_curve = true, 1506 }, 1507 }, 1508 { 1509 .matches = { 1510 DMI_MATCH(DMI_BOARD_NAME, "G513R"), 1511 }, 1512 .driver_data = &(struct power_data) { 1513 .ac_data = &(struct power_limits) { 1514 .ppt_pl1_spl_min = 35, 1515 .ppt_pl1_spl_max = 90, 1516 .ppt_pl2_sppt_min = 54, 1517 .ppt_pl2_sppt_max = 100, 1518 .ppt_pl3_fppt_min = 54, 1519 .ppt_pl3_fppt_max = 125, 1520 .nv_dynamic_boost_min = 5, 1521 .nv_dynamic_boost_max = 25, 1522 .nv_temp_target_min = 75, 1523 .nv_temp_target_max = 87, 1524 }, 1525 .dc_data = &(struct power_limits) { 1526 .ppt_pl1_spl_min = 28, 1527 .ppt_pl1_spl_max = 50, 1528 .ppt_pl2_sppt_min = 28, 1529 .ppt_pl2_sppt_max = 50, 1530 .ppt_pl3_fppt_min = 28, 1531 .ppt_pl3_fppt_max = 65, 1532 .nv_temp_target_min = 75, 1533 .nv_temp_target_max = 87, 1534 }, 1535 .requires_fan_curve = true, 1536 }, 1537 }, 1538 { 1539 .matches = { 1540 DMI_MATCH(DMI_BOARD_NAME, "G614J"), 1541 }, 1542 .driver_data = &(struct power_data) { 1543 .ac_data = &(struct power_limits) { 1544 .ppt_pl1_spl_min = 28, 1545 .ppt_pl1_spl_max = 140, 1546 .ppt_pl2_sppt_min = 28, 1547 .ppt_pl2_sppt_max = 175, 1548 .nv_temp_target_min = 75, 1549 .nv_temp_target_max = 87, 1550 .nv_dynamic_boost_min = 5, 1551 .nv_dynamic_boost_max = 25, 1552 }, 1553 .dc_data = &(struct power_limits) { 1554 .ppt_pl1_spl_min = 25, 1555 .ppt_pl1_spl_max = 55, 1556 .ppt_pl2_sppt_min = 25, 1557 .ppt_pl2_sppt_max = 70, 1558 .nv_temp_target_min = 75, 1559 .nv_temp_target_max = 87, 1560 }, 1561 .requires_fan_curve = true, 1562 }, 1563 }, 1564 { 1565 .matches = { 1566 DMI_MATCH(DMI_BOARD_NAME, "G615LR"), 1567 }, 1568 .driver_data = &(struct power_data) { 1569 .ac_data = &(struct power_limits) { 1570 .ppt_pl1_spl_min = 28, 1571 .ppt_pl1_spl_def = 140, 1572 .ppt_pl1_spl_max = 175, 1573 .ppt_pl2_sppt_min = 28, 1574 .ppt_pl2_sppt_max = 175, 1575 .nv_temp_target_min = 75, 1576 .nv_temp_target_max = 87, 1577 .nv_dynamic_boost_min = 5, 1578 .nv_dynamic_boost_max = 25, 1579 .nv_tgp_min = 65, 1580 .nv_tgp_max = 115, 1581 }, 1582 .dc_data = &(struct power_limits) { 1583 .ppt_pl1_spl_min = 25, 1584 .ppt_pl1_spl_max = 55, 1585 .ppt_pl2_sppt_min = 25, 1586 .ppt_pl2_sppt_max = 70, 1587 .nv_temp_target_min = 75, 1588 .nv_temp_target_max = 87, 1589 }, 1590 .requires_fan_curve = true, 1591 }, 1592 }, 1593 { 1594 .matches = { 1595 DMI_MATCH(DMI_BOARD_NAME, "G634J"), 1596 }, 1597 .driver_data = &(struct power_data) { 1598 .ac_data = &(struct power_limits) { 1599 .ppt_pl1_spl_min = 28, 1600 .ppt_pl1_spl_max = 140, 1601 .ppt_pl2_sppt_min = 28, 1602 .ppt_pl2_sppt_max = 175, 1603 .nv_temp_target_min = 75, 1604 .nv_temp_target_max = 87, 1605 .nv_dynamic_boost_min = 5, 1606 .nv_dynamic_boost_max = 25, 1607 }, 1608 .dc_data = &(struct power_limits) { 1609 .ppt_pl1_spl_min = 25, 1610 .ppt_pl1_spl_max = 55, 1611 .ppt_pl2_sppt_min = 25, 1612 .ppt_pl2_sppt_max = 70, 1613 .nv_temp_target_min = 75, 1614 .nv_temp_target_max = 87, 1615 }, 1616 .requires_fan_curve = true, 1617 }, 1618 }, 1619 { 1620 .matches = { 1621 DMI_MATCH(DMI_BOARD_NAME, "G713PV"), 1622 }, 1623 .driver_data = &(struct power_data) { 1624 .ac_data = &(struct power_limits) { 1625 .ppt_pl1_spl_min = 30, 1626 .ppt_pl1_spl_def = 120, 1627 .ppt_pl1_spl_max = 130, 1628 .ppt_pl2_sppt_min = 65, 1629 .ppt_pl2_sppt_def = 125, 1630 .ppt_pl2_sppt_max = 130, 1631 .ppt_pl3_fppt_min = 65, 1632 .ppt_pl3_fppt_def = 125, 1633 .ppt_pl3_fppt_max = 130, 1634 .nv_temp_target_min = 75, 1635 .nv_temp_target_max = 87, 1636 .nv_dynamic_boost_min = 5, 1637 .nv_dynamic_boost_max = 25, 1638 }, 1639 .dc_data = &(struct power_limits) { 1640 .ppt_pl1_spl_min = 25, 1641 .ppt_pl1_spl_max = 65, 1642 .ppt_pl2_sppt_min = 25, 1643 .ppt_pl2_sppt_max = 65, 1644 .ppt_pl3_fppt_min = 35, 1645 .ppt_pl3_fppt_max = 75, 1646 .nv_temp_target_min = 75, 1647 .nv_temp_target_max = 87, 1648 }, 1649 .requires_fan_curve = true, 1650 }, 1651 }, 1652 { 1653 .matches = { 1654 DMI_MATCH(DMI_BOARD_NAME, "G733C"), 1655 }, 1656 .driver_data = &(struct power_data) { 1657 .ac_data = &(struct power_limits) { 1658 .ppt_pl1_spl_min = 28, 1659 .ppt_pl1_spl_max = 170, 1660 .ppt_pl2_sppt_min = 28, 1661 .ppt_pl2_sppt_max = 175, 1662 .nv_temp_target_min = 75, 1663 .nv_temp_target_max = 87, 1664 .nv_dynamic_boost_min = 5, 1665 .nv_dynamic_boost_max = 25, 1666 }, 1667 .dc_data = &(struct power_limits) { 1668 .ppt_pl1_spl_min = 28, 1669 .ppt_pl1_spl_max = 35, 1670 .ppt_pl2_sppt_min = 28, 1671 .ppt_pl2_sppt_max = 35, 1672 .nv_temp_target_min = 75, 1673 .nv_temp_target_max = 87, 1674 }, 1675 .requires_fan_curve = true, 1676 }, 1677 }, 1678 { 1679 .matches = { 1680 DMI_MATCH(DMI_BOARD_NAME, "G733P"), 1681 }, 1682 .driver_data = &(struct power_data) { 1683 .ac_data = &(struct power_limits) { 1684 .ppt_pl1_spl_min = 30, 1685 .ppt_pl1_spl_def = 100, 1686 .ppt_pl1_spl_max = 130, 1687 .ppt_pl2_sppt_min = 65, 1688 .ppt_pl2_sppt_def = 125, 1689 .ppt_pl2_sppt_max = 130, 1690 .ppt_pl3_fppt_min = 65, 1691 .ppt_pl3_fppt_def = 125, 1692 .ppt_pl3_fppt_max = 130, 1693 .nv_temp_target_min = 75, 1694 .nv_temp_target_max = 87, 1695 .nv_dynamic_boost_min = 5, 1696 .nv_dynamic_boost_max = 25, 1697 }, 1698 .dc_data = &(struct power_limits) { 1699 .ppt_pl1_spl_min = 25, 1700 .ppt_pl1_spl_max = 65, 1701 .ppt_pl2_sppt_min = 25, 1702 .ppt_pl2_sppt_max = 65, 1703 .ppt_pl3_fppt_min = 35, 1704 .ppt_pl3_fppt_max = 75, 1705 .nv_temp_target_min = 75, 1706 .nv_temp_target_max = 87, 1707 }, 1708 .requires_fan_curve = true, 1709 }, 1710 }, 1711 { 1712 .matches = { 1713 DMI_MATCH(DMI_BOARD_NAME, "G814J"), 1714 }, 1715 .driver_data = &(struct power_data) { 1716 .ac_data = &(struct power_limits) { 1717 .ppt_pl1_spl_min = 28, 1718 .ppt_pl1_spl_max = 140, 1719 .ppt_pl2_sppt_min = 28, 1720 .ppt_pl2_sppt_max = 140, 1721 .nv_dynamic_boost_min = 5, 1722 .nv_dynamic_boost_max = 25, 1723 }, 1724 .dc_data = &(struct power_limits) { 1725 .ppt_pl1_spl_min = 25, 1726 .ppt_pl1_spl_max = 55, 1727 .ppt_pl2_sppt_min = 25, 1728 .ppt_pl2_sppt_max = 70, 1729 }, 1730 .requires_fan_curve = true, 1731 }, 1732 }, 1733 { 1734 .matches = { 1735 DMI_MATCH(DMI_BOARD_NAME, "G834J"), 1736 }, 1737 .driver_data = &(struct power_data) { 1738 .ac_data = &(struct power_limits) { 1739 .ppt_pl1_spl_min = 28, 1740 .ppt_pl1_spl_max = 140, 1741 .ppt_pl2_sppt_min = 28, 1742 .ppt_pl2_sppt_max = 175, 1743 .nv_dynamic_boost_min = 5, 1744 .nv_dynamic_boost_max = 25, 1745 .nv_temp_target_min = 75, 1746 .nv_temp_target_max = 87, 1747 }, 1748 .dc_data = &(struct power_limits) { 1749 .ppt_pl1_spl_min = 25, 1750 .ppt_pl1_spl_max = 55, 1751 .ppt_pl2_sppt_min = 25, 1752 .ppt_pl2_sppt_max = 70, 1753 .nv_temp_target_min = 75, 1754 .nv_temp_target_max = 87, 1755 }, 1756 .requires_fan_curve = true, 1757 }, 1758 }, 1759 { 1760 .matches = { 1761 DMI_MATCH(DMI_BOARD_NAME, "G835LR"), 1762 }, 1763 .driver_data = &(struct power_data) { 1764 .ac_data = &(struct power_limits) { 1765 .ppt_pl1_spl_min = 28, 1766 .ppt_pl1_spl_def = 140, 1767 .ppt_pl1_spl_max = 175, 1768 .ppt_pl2_sppt_min = 28, 1769 .ppt_pl2_sppt_max = 175, 1770 .nv_dynamic_boost_min = 5, 1771 .nv_dynamic_boost_max = 25, 1772 .nv_temp_target_min = 75, 1773 .nv_temp_target_max = 87, 1774 .nv_tgp_min = 65, 1775 .nv_tgp_max = 115, 1776 }, 1777 .dc_data = &(struct power_limits) { 1778 .ppt_pl1_spl_min = 25, 1779 .ppt_pl1_spl_max = 55, 1780 .ppt_pl2_sppt_min = 25, 1781 .ppt_pl2_sppt_max = 70, 1782 .nv_temp_target_min = 75, 1783 .nv_temp_target_max = 87, 1784 }, 1785 .requires_fan_curve = true, 1786 }, 1787 }, 1788 { 1789 .matches = { 1790 DMI_MATCH(DMI_BOARD_NAME, "G835LW"), 1791 }, 1792 .driver_data = &(struct power_data) { 1793 .ac_data = &(struct power_limits) { 1794 .ppt_pl1_spl_min = 28, 1795 .ppt_pl1_spl_def = 140, 1796 .ppt_pl1_spl_max = 175, 1797 .ppt_pl2_sppt_min = 28, 1798 .ppt_pl2_sppt_max = 175, 1799 .nv_dynamic_boost_min = 5, 1800 .nv_dynamic_boost_max = 25, 1801 .nv_temp_target_min = 75, 1802 .nv_temp_target_max = 87, 1803 .nv_tgp_min = 80, 1804 .nv_tgp_max = 150, 1805 }, 1806 .dc_data = &(struct power_limits) { 1807 .ppt_pl1_spl_min = 25, 1808 .ppt_pl1_spl_max = 55, 1809 .ppt_pl2_sppt_min = 25, 1810 .ppt_pl2_sppt_max = 70, 1811 .nv_temp_target_min = 75, 1812 .nv_temp_target_max = 87, 1813 }, 1814 .requires_fan_curve = true, 1815 }, 1816 }, 1817 { 1818 .matches = { 1819 DMI_MATCH(DMI_BOARD_NAME, "H7606W"), 1820 }, 1821 .driver_data = &(struct power_data) { 1822 .ac_data = &(struct power_limits) { 1823 .ppt_pl1_spl_min = 15, 1824 .ppt_pl1_spl_max = 80, 1825 .ppt_pl2_sppt_min = 35, 1826 .ppt_pl2_sppt_max = 80, 1827 .ppt_pl3_fppt_min = 35, 1828 .ppt_pl3_fppt_max = 80, 1829 .nv_dynamic_boost_min = 5, 1830 .nv_dynamic_boost_max = 20, 1831 .nv_temp_target_min = 75, 1832 .nv_temp_target_max = 87, 1833 .nv_tgp_min = 55, 1834 .nv_tgp_max = 85, 1835 }, 1836 .dc_data = &(struct power_limits) { 1837 .ppt_pl1_spl_min = 25, 1838 .ppt_pl1_spl_max = 35, 1839 .ppt_pl2_sppt_min = 31, 1840 .ppt_pl2_sppt_max = 44, 1841 .ppt_pl3_fppt_min = 45, 1842 .ppt_pl3_fppt_max = 65, 1843 .nv_temp_target_min = 75, 1844 .nv_temp_target_max = 87, 1845 }, 1846 }, 1847 }, 1848 { 1849 .matches = { 1850 DMI_MATCH(DMI_BOARD_NAME, "RC71"), 1851 }, 1852 .driver_data = &(struct power_data) { 1853 .ac_data = &(struct power_limits) { 1854 .ppt_pl1_spl_min = 7, 1855 .ppt_pl1_spl_max = 30, 1856 .ppt_pl2_sppt_min = 15, 1857 .ppt_pl2_sppt_max = 43, 1858 .ppt_pl3_fppt_min = 15, 1859 .ppt_pl3_fppt_max = 53, 1860 }, 1861 .dc_data = &(struct power_limits) { 1862 .ppt_pl1_spl_min = 7, 1863 .ppt_pl1_spl_def = 15, 1864 .ppt_pl1_spl_max = 25, 1865 .ppt_pl2_sppt_min = 15, 1866 .ppt_pl2_sppt_def = 20, 1867 .ppt_pl2_sppt_max = 30, 1868 .ppt_pl3_fppt_min = 15, 1869 .ppt_pl3_fppt_def = 25, 1870 .ppt_pl3_fppt_max = 35, 1871 }, 1872 }, 1873 }, 1874 { 1875 .matches = { 1876 DMI_MATCH(DMI_BOARD_NAME, "RC72"), 1877 }, 1878 .driver_data = &(struct power_data) { 1879 .ac_data = &(struct power_limits) { 1880 .ppt_pl1_spl_min = 7, 1881 .ppt_pl1_spl_max = 30, 1882 .ppt_pl2_sppt_min = 15, 1883 .ppt_pl2_sppt_max = 43, 1884 .ppt_pl3_fppt_min = 15, 1885 .ppt_pl3_fppt_max = 53, 1886 }, 1887 .dc_data = &(struct power_limits) { 1888 .ppt_pl1_spl_min = 7, 1889 .ppt_pl1_spl_def = 17, 1890 .ppt_pl1_spl_max = 25, 1891 .ppt_pl2_sppt_min = 15, 1892 .ppt_pl2_sppt_def = 24, 1893 .ppt_pl2_sppt_max = 30, 1894 .ppt_pl3_fppt_min = 15, 1895 .ppt_pl3_fppt_def = 30, 1896 .ppt_pl3_fppt_max = 35, 1897 }, 1898 }, 1899 }, 1900 { 1901 .matches = { 1902 DMI_MATCH(DMI_BOARD_NAME, "RC73XA"), 1903 }, 1904 .driver_data = &(struct power_data) { 1905 .ac_data = &(struct power_limits) { 1906 .ppt_pl1_spl_min = 7, 1907 .ppt_pl1_spl_max = 35, 1908 .ppt_pl2_sppt_min = 14, 1909 .ppt_pl2_sppt_max = 45, 1910 .ppt_pl3_fppt_min = 19, 1911 .ppt_pl3_fppt_max = 55, 1912 }, 1913 .dc_data = &(struct power_limits) { 1914 .ppt_pl1_spl_min = 7, 1915 .ppt_pl1_spl_def = 17, 1916 .ppt_pl1_spl_max = 35, 1917 .ppt_pl2_sppt_min = 13, 1918 .ppt_pl2_sppt_def = 21, 1919 .ppt_pl2_sppt_max = 45, 1920 .ppt_pl3_fppt_min = 19, 1921 .ppt_pl3_fppt_def = 26, 1922 .ppt_pl3_fppt_max = 55, 1923 }, 1924 }, 1925 }, 1926 {} 1927 }; 1928 1929 #endif /* _ASUS_ARMOURY_H_ */ 1930