LenovoLegionLinux

Features and Testing

GUI without fan curve support

On a Legion 5 15IRX10 with QNCN firmware, start legion_gui with the module loaded. Verify that the window opens, fan curve Read/Apply buttons are disabled, and the notice explains that custom fan curves are unsupported. Check that sensors still reports fan RPM and temperatures. No fan curve write is needed.

Run QT_QPA_PLATFORM=offscreen python -m unittest discover -s tests -p 'test_gui_startup.py' for the startup regression tests.

Fan curve on Legion Zone v3 firmware (level indices)

On model_kwcn (Legion Pro 5 16IRX8, BIOS KWCN54WW) Fan_Set_Table takes ten level indices 0-10, not percentages; LENOVO_FAN_TABLE_DATA.FanTable_Data maps level n to an RPM (fan 1 on the 16IRX8: 1700, 1900, 2100, 2300, 2500, 2900, 3400, 3700, 4400, 5400). The driver uses FAN_SPEED_UNIT_LEVEL (debugfs u = 5): hwmon pwm 0-255 maps to level round(pwm * 10 / 255), a write below the per-point minimum 1,1,1,1,1,1,1,1,3,5 returns EOPNOTSUPP, and an all-zero (never written) table is sent as 1..10.

Test (custom power mode, stress-ng + watch sensors running):

H=$(grep -l legion_hwmon /sys/class/hwmon/hwmon*/name | xargs dirname)
echo 255 | sudo tee $H/pwm1_auto_point10_pwm   # level 10
sudo cat /sys/kernel/debug/legion/fancurve      # WMI block: u = 5, speed1 = 10
sensors                                         # fan 1 should reach FanTable_Data[9]
echo 204 | sudo tee $H/pwm1_auto_point10_pwm   # level 8 -> FanTable_Data[7]
echo 25  | sudo tee $H/pwm1_auto_point10_pwm   # EOPNOTSUPP: point 10 minimum is 5

Measured on a Legion Pro 5 16IRX8 (KWCN54WW), first from Windows with the same WMI calls and then on Linux through this driver’s hwmon interface: entering custom mode seeds an empty table with 1,2,3,4,5,6,7,8,8,8; level 9 on every point gave 4400 / 4600 RPM (fan 1 / fan 2) and level 10 gave 5400 / 5400 RPM, matching FanTable_Data, within 15 s from a warm fan and about 30 s from an idle 2100 RPM (the EC ramps at roughly 100 RPM/s). The DSDT’s Fan_Set_Table handler copies the ten bytes to EC RAM F9F0..F9F9 (ecmemoryram offset 0x1F0) and ignores the FSTM/FSID/FSTL header, so the Fan_Get_Table readback and that block are the same bytes. The Python tools (legion_cli, legion_gui, legiond presets) map RPM to the nearest level and clamp to the per-point minimum; the per-level RPM ladders they use are not hardcoded but read at runtime from fan1_level_rpm_table/fan2_level_rpm_table on the platform device, which the driver fills from the firmware’s LENOVO_FAN_TABLE_DATA WMI data block for the current power mode:

D=/sys/bus/platform/drivers/legion/legion
cat $D/fan1_level_rpm_table   # e.g. 1700 1900 2100 2300 2500 2900 3400 3700 4400 5400

The same table row also carries the fan’s real maximum (current_fan_max_speed), which the driver reports through hwmon fan1_max/fan2_max on these models instead of a per-model hardcoded value. fan_maxspeed (Fan Method ids 3/4) is hidden on model_kwcn, model_q7cn and model_rlcn (skip_fan_maxspeed): their WMAB implements only ids 5/6, so the attribute cannot work (on KWCN the read returned a meaningless 0 and a write was a no-op; Q7CN/RLCN follow from their DSDTs); fan_control.sh skips the attribute when it is absent. On the Legion Pro 7 16IRX8H with the same BIOS the EC resets the table to 1..10 when mode 0xE0 is entered and ignores later writes (issue #429); use mode 255 and check /sys/kernel/debug/legion/ecmemory offset 0x1F0..0x1F9 after a write.

Legion Pro 7 16IAX10H (83F5, Q7CN)

BIOS Q7CN78WW, EC 0x5508 (fw 1.78), Intel Arrow Lake-HX + RTX 50. DMI entry Q7CN is qualified on product name 83F5; config model_q7cn in kernel_module/legion-laptop.c (the header comment cites the DSDT lines).

Validated on Linux 7.2.4 next to the in-tree lenovo_wmi_* drivers with enable_platformprofile=0 (see the README’s KDE/coexistence section): ecmemory, ecmemoryram and the ACPI EC I/O space are byte-identical; the WMI table read 1,2,3,4,5,6,7,8,8,8 matches EC RAM F9F0..F9F9 (ecmemoryram offset 0x180); powermode 3/2/3 and custom mode were reflected by the EC SPMO byte (0x11/0x10/0x13); writing point 10 to level 9 set EC byte 0x189 to 09 and restoring level 8 set it back.

Verify: sudo dmesg | grep -i legion (no “not in allowlist”, EC id 0x5508), sensors shows legion_hwmon temps and fan RPM, and sudo cat /sys/kernel/debug/legion/fancurve prints u = 5 with speed1 in 1..10, and dmesg logs “fan table data: fan 1 has 10 levels, 1600..5200 RPM” (and 1700..5400 for fan 2) with fan1_level_rpm_table readable (verified on Q7CN78WW, Linux 7.2.7).

Legion Pro 5 16ADR10 (83LT, RLCN)

BIOS RLCN31WW, EC 0x5508, AMD + RTX 50 (Legion Pro 5 16ADR10; the R9000P 2025 83LV shares the RLCN BIOS line but is a different chassis and needs its own validation). DMI entry RLCN is qualified on product name 83LT; config model_rlcn in kernel_module/legion-laptop.c (the header comment cites the DSDT lines from issue #445).

Same firmware layout as the Q7CN (83F5) above, on the AMD chassis:

Validation status: config derived from the DSDT analysis in issue #445; runtime validation on the reporter’s unit is in progress - check the issue for the results, and verify locally with sudo dmesg | grep -i legion (no “not in allowlist”, EC id 0x5508), sensors, and sudo cat /sys/kernel/debug/legion/fancurve (u = 5, speed1 in 1..10).

Legion 5 15AHP10 (83M0, RGCN)

BIOS RGCN27WW/RGCN35WW/RGCN36WW (issue #373), EC 0x5508, AMD Ryzen 7 260

Same firmware layout as the RLCN (83LT) above, on the Legion 5 chassis:

Validation status: config derived from the DSDT analysis in issue #373 (RGCN35WW dsdt.dsl; the WMI fan-table readback in the original report shows the static 1..10 placeholder, i.e. that unit was in extreme mode). Runtime validation on the reporters’ units is in progress - check the issue for the results, and verify locally with sudo dmesg | grep -i legion (no “not in allowlist”, EC id 0x5508), sensors, and sudo cat /sys/kernel/debug/legion/fancurve (u = 5, speed1 in 1..10).

Legion 5 16IAX10 (83NX, Q6CN)

BIOS Q6CN32WW (also confirmed on Q6CN79WW after a BIOS update), EC 0x5508, Intel Core Ultra 9 275HX + RTX 5060 Max-Q. DMI entry Q6CN is qualified on product name 83NX, since the BIOS prefix is also shared by the 83LU Legion Pro 5 16IAX10H (own entry and model_q6cn_lu below, issue #337) and the 83F3 sibling - different chassis (different ramio_physical_start, no minifancurve). Config model_q6cn in kernel_module/legion-laptop.c is a copy of model_rxcn (Legion 7 16IAX10, 83KY, same EC/ramio generation) that additionally enables WMI3 power limits.

Known gaps:

Validated on Linux 7.0.0-30-generic / 7.0.0-31-generic (Ubuntu 26.04.1 LTS) across five module reloads, a main merge, and a BIOS update (Q6CN32WW -> Q6CN79WW). Re-confirmed with a clean 20-cycle tests/test_kernel_reload.sh run (no force=1): every reload matched through the real DMI allowlist and loaded successfully, with no “not in allowlist” rejection. Verify: sudo dmesg | grep -i legion (no “not in allowlist”, EC id 0x5508), sensors, and sudo cat /sys/kernel/debug/legion/fancurve.

Legion Pro 5 16IAX10H (83LU, Q6CN)

BIOS Q6CN26WW (issue #337), EC 0x5508 (fw 2b0), Intel Core Ultra 9 275HX

Same firmware layout as the Q7CN (83F5) above, on the Legion Pro 5 chassis; the Q6CN BIOS prefix is shared with the Legion 5 (83NX) above, which is a different chassis and keeps its own entry:

Validation status: config derived from the DSDT and the validated reads in issue #337 (legion_wmi_other fan RPM 2400/2100 while raw EC/ACPI reads showed impossible values like 18045 RPM; EC id 0x5508 fw 2b0 in dmesg with force=1). Runtime validation on the reporter’s unit is in progress - check the issue for the results, and verify locally with sudo dmesg | grep -i legion (no “not in allowlist”, EC id 0x5508), sensors, and sudo cat /sys/kernel/debug/legion/fancurve (u = 5, speed1 in 1..10).

Legion Pro 5 16IAX10 (83F3, Q6CN)

BIOS Q6CN78WW/Q6CN79WW (issue #471), EC 0x5508, Intel Core Ultra 7 255HX + RTX 5070. DMI entry Q6CN 83F3 is qualified on product name 83F3; config model_q6cn_f3 in kernel_module/legion-laptop.c (the header comment cites the DSDT lines from the Q6CN79WW dsdt.dsl attached in issue #471). The Legion Pro 5 sibling of the 83LU above, sharing the Q6CN BIOS line and the ERAX window.

Validation status: config derived from the DSDT analysis and validated reads in issue #471 (inermage, Q6CN79WW). Runtime validation on the reporter’s unit is in progress - check the issue for the results, and verify locally with sudo dmesg | grep -i legion (no “not in allowlist”, EC id 0x5508), sensors, and sudo cat /sys/kernel/debug/legion/fancurve (u = 5, speed1 in 1..10).

LOQ 15IRX10 (83JE, R3CN)

BIOS R3CN, EC 0x5508, Intel + RTX 50. DMI entry R3CN matches the BIOS prefix; config model_r3cn in kernel_module/legion-laptop.c uses the existing ec_register_offsets_loq_v1 map. Sensor/powermode evidence is in #374; EC3 curve writes were verified under gaming load on R3CN44WW in #535.

Hardware regression check (on AC; do not run thermal stress unattended):

  1. Select custom mode, for example echo 255 | sudo tee /sys/devices/platform/legion/powermode, and read it back. Record sudo dmesg | grep -i legion, sensors, and sudo cat /sys/kernel/debug/legion/fancurve. The first curve table must use u = 3 (speed values multiplied by 100 give RPM).
  2. Read the curve in the GUI and save a backup preset (or use sudo legion_cli fancurve-write-hw-to-file r3cn-before.yaml). Confirm both fan columns and temperature fields are editable; accel/decel, minifancurve and controller lock must be unavailable.
  3. Make a small, conservative change to one populated interior point (e.g. increase its RPM within the original curve’s maximum, or lower a temperature threshold). Apply, read back, compare the native EC3 table and monitor sensors. Do not substitute level indices or raw RPM numbers for the hwmon pwm values, which remain in 0..255.
  4. Restore the saved curve and verify the readback. New hardware results should be reported with model/BIOS; this patch restores the path tested in #535, rather than claiming a new on-hardware validation.

Offline regression tests: ./tests/test_python_unit.sh exercises RPM, zero-RPM and independent fan/temperature edits through a temporary EC3 sysfs fixture and the offscreen GUI, without writing to hardware. It also runs the WMI level tests: zero-RPM requests there must clamp to the driver’s per-point minimum rather than produce a rejected level-0 write.

Legion Y7000P IRX10 (83NN, S9CN)

BIOS S9CN19WW, EC 0x5508 (fw 2b0), Intel Arrow Lake-HX + RTX 50 (issue #506). DMI entry S9CN is qualified on product name 83NN; config model_s9cn in kernel_module/legion-laptop.c (the header comment cites the DSDT lines from the dsdt.dsl attached in issue #506).

Same WMI-only firmware layout as the Q7CN (83F5) above, on the Y7000P chassis:

Validation status: config derived from the DSDT analysis and the runtime reports in issue #506 (huverse: WMI powermode, WMI3 CPU temp and fan RPM verified under load; AXFOX: DSDT, lenovo_wmi_other fan RPM tracking load correctly); full runtime validation of the final config is in progress - check the issue for the results, and verify locally with sudo dmesg | grep -i legion (no “not in allowlist”, EC id 0x5508), sensors, and sudo cat /sys/kernel/debug/legion/fancurve (u = 5, speed1 in 1..10).

Legion 7 16IRX9 (83FD, NSCN)

BIOS NSCN37WW, EC 0x5507, Intel Core i9-14900HX + RTX 4070 (issue #617). DMI entry NSCN 83FD is qualified on product name 83FD and precedes the generic NSCN entry; config model_nscn_83fd in kernel_module/legion-laptop.c. The fan methods live in SSDT4 (“CB-01”) of the dump attached in issue #617 (DSDT SHA-256 eb58e64104373288b6f80f736e5377c2b557bcbd2cb88af4fd63450f6e9aa19f).

Validation status: config derived from the firmware dump; sensors and power profiles were already working with the generic NSCN config. Verify with sudo dmesg | grep -i legion (config NSCN 83FD) and sudo cat /sys/kernel/debug/legion/fancurve. To test writes: on AC, select custom mode, back up the curve, apply one small change, compare the level/RPM readback and sensors, then restore the backup. Do not write in extreme mode.

Legion 5 15AHP11 (83Q7, T2CN)

The firmware attached in #504 contains 35 ACPI tables. The DSDT SHA-256 is d88fb1646a86f40c6b7bfb92a7071f598b8e1cf1e1c36d16ab46b48678fac8e1. Its WMAB 5/6 call GFAN/SFAN: ten shared levels, not percentages. SFAN reads the requested power mode from the first byte, selects an FNT0/FNT1 ladder and uses FNT[level + 2] for RPM. Mode zero leaves that local unset; the driver now sends a freshly read valid mode, and refuses a failed mode read rather than guessing. Both calibration and the write payload use live GetThermalMode (0x37 / thermalmode), not GetSmartFanMode (0x2D / powermode), which reads a saved request that may differ from GZ44. Extreme mode (GZ44 == 7) silently discards writes in firmware, so curve writes/default resets now return an error in that mode.

WQA7/SFTW publishes FNT[3..12] as the RPM ladder through the usual WMI GUID: entry 1 can be 0 RPM and must remain at index 1. Dropping it made all subsequent RPM conversions off by one, potentially selecting a lower speed than requested. Keep zero and repeated RPM entries in their original positions; reject descending, empty, oversized or all-zero tables. Calibration is read from firmware, not hardcoded in Python. The _STA/_CFG paths also use the DSDT’s actual PCI0.LPC0.EC0.VPC0 namespace, not PC00.LPCB.

This corrects the existing WMI curve transport; it does not enable direct EC curve access or claim new hardware validation. Monitoring/powermode and reads have reporter evidence in #504; the corrected write path still needs a careful on-device round trip. On AC, select custom mode, save the original curve, apply one small conservative change, compare the level/RPM readback and sensors, and restore the backup. Do not write while in extreme mode or change power mode partway through Apply to HW.

LOQ 15APH8 (82XT, LYCN)

BIOS LYCN50WW, EC 0x8227 (fw 2a4, read on the unit), AMD Ryzen 7 7840HS + RTX 4050 (issue #602). DMI entry LOQ 15APH8 (82XT) - EC 0x8227 is qualified on product name 82XT and BIOS prefix LYCN and reuses model_m3cn_8227 from the Legion R7000P APH8 (82Y9, M3CN) in kernel_module/legion-laptop.c: same AMD Phoenix platform, same EC 0x8227, and the reporter’s force-loaded debugfs dump shows the same signature — EC-direct temperature/fan reads return 0 while WMI3 returns correct live values (CPU 38 C, GPU 42 C, fan1 1400 RPM) and the EC fan curve table is fully populated.

Validation status: config matched from the reporter’s runtime evidence in issue #602 (EC id, WMI3 reads, populated curve); fan table writes are not yet validated on this chassis. Verify with sudo dmesg | grep -i legion (config LOQ 15APH8 (82XT) - EC 0x8227) and sudo cat /sys/kernel/debug/legion/fancurve. To test writes: on AC, select custom mode, back up the curve, apply one small change, compare the level/RPM readback and sensors, then restore the backup.

Fan-curve capability and unit checks

The hwmon curve schema follows the fields the active backend actually writes:

Backend Speed controls Temperature controls Accel/decel
EC Both fans CPU/GPU/IC bounds Supported
EC2 Both fans, 8 points CPU/GPU bounds Not supported
EC3 Both fans CPU/GPU/IC bounds Not supported
EC4 Both fans CPU/GPU upper thresholds only Not supported
WMI3 One shared speed table Not supported Not supported

Unsupported fields are absent, not writable zero-valued placeholders. Userspace handles partial temperature support per field, including EC4’s upper thresholds, and respects the driver’s point count. auto_points_size is read-only unless the backend supports changing it. This does not select new EC layouts or change any model’s access method. Unmapped minifancurve/controller-lock registers in the IdeaPad and LOQ maps are marked unavailable and guarded even in diagnostic reads. Native curve reads initialize the whole result and model-specific RPM scale before filling EC fields, so stack garbage cannot affect PWM conversion or unused points.

/sys/devices/platform/legion/fancurve_speed_unit reports rpm, percent or level for the active curve; hwmon PWM values still use 0..255 in every case. Do not infer the unit from chip ID, WMI availability or default-reset support. Percentage backends round scaled RPM requests to a percentage step and encode PWM without the old double-floor loss of one percentage point; native RPM backends retain their 100-RPM steps. Conversion clamps finite oversized inputs before arithmetic, and rejects non-finite speeds or an invalid RPM scale. The per-fan fan*_level_rpm_table attrs are only exposed for active level curves with the firmware data block. Level curves still advertise their unit if the firmware cannot provide RPM calibration; this must never trigger linear-RPM fallback. Zero-RPM and repeated entries retain their level indices; they are not padding. Missing mode-specific data is not replaced by another mode’s ladder, and a missing fan-2 ladder is not replaced with fan 1’s RPMs. A partial query failure is retried rather than permanently caching only the other fan.

GUI/CLI read current-mode calibration for each operation instead of caching it at startup. A malformed/missing ladder or unrepresentable level causes an explicit error, not a fabricated RPM. All requested speeds are calibrated before any curve write. A GUI read/calibration error disables Apply to HW without terminating monitoring; Read from HW retries and re-enables editing after a successful read. Tray preset failures use the same error dialog instead of escaping a Qt callback. Update the module and Python package together; older modules lack explicit unit metadata. Review the readback after applying and do not switch power mode during an apply operation.

The GUI Fan Curve tab also shows a live, table-backed plot. With a native EC curve, edit a CPU/GPU speed or upper/lower temperature in the table: the plotted points and shaded hysteresis spans must change without writing sysfs. Check that the temperature axis has labeled ticks every 5°C (staggered if narrow). Drag a filled fan point vertically (RPM) or horizontally (move both writable CPU/GPU temperature bounds with their hysteresis width preserved); drag the square at the left end of a shaded span to edit only its lower temperature. Confirm independent CPU/GPU fields and the other fan’s speed remain unchanged. Drag past the 0°C/127°C limits and confirm both temperatures clamp while keeping their gap; on EC4, whose lower fields are disabled, only the upper temperature moves. Hover over a point to check its exact °C/RPM (or firmware level); while dragging, press Esc and confirm the table is restored without a hardware write. On speed-only WMI curves the x-axis must be point ID and temperature fields must remain disabled. On level curves the y-axis must be the firmware level; drag points 9/10 down and check they stop at LEVEL_POINT_MIN (3/5), with RPM from the current firmware ladder rather than a linear guess. Trailing all-zero padding is crossed and not draggable; points beyond auto_points_size cannot be edited. Invalid/incomplete text must not create draggable points. The plot never writes to hardware: Apply to HW still uses the existing validation and readback path. The README screenshot uses example data, not a hardware test.

Offline validation: ./tests/test_python_unit.sh runs the library, offscreen GUI and kernel capability tests. The latter compile the actual C configuration and visibility/guard functions against fake device/EC objects: 606 point-attribute cases, native vs level unit gates, default-reset independence, poisoned native read buffers, zero-RPM ladder indexing, SFAN live-mode payload/error handling, mode-specific calibration/retry and no I/O through unmapped control registers. Run with CC=clang to additionally test that harness with clang (gcc is the default). These are software regressions, not a claim of new thermal or firmware validation on every model. On hardware, compare the available controls with the table above, read a known curve before changing it, save a backup, make only a conservative adjustment in a supported power mode, check sysfs/debugfs and sensors, then restore the backup.

External HDMI

Usually attached to dGPU. So easiest way to make it work is enabling dGPU only in BIOS/UEFI. More advanced would be switching in hybrid mode to dGPU only as long as HDMI is attached or outputting via dGPU.

Flip to Start

cat /sys/firmware/efi/efivars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c hexdump -C

Stored in 4-byte UEFI variables FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c


sudo chattr -i /sys/firmware/efi/efivars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c
# first 4 bytes are attributes
printf '\x07\x00\x00\x00\x01\x00\x00\x00' | sudo tee /sys/firmware/efi/efivars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c 
cat  /sys/firmware/efi/efivars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c | hexdump -C

cat  /sys/firmware/efi/efivars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c | hexdump -C
# 00000000  07 00 00 00 00 00 00 00 
# 07 = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS
#

/efi/vars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c/size
# 0x04
sudo cat /sys/firmware/efi/vars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c/data | hexdump -C
# 0000000 0000 0000    

# first byte: 1 => enabled
# first byte: 0 => diabled

# enables it
sudo chattr -i /sys/firmware/efi/efivars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c
# first 4 bytes are attributes
printf '\x07\x00\x00\x00\x01\x00\x00\x00' | sudo tee /sys/firmware/efi/efivars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c 
cat  /sys/firmware/efi/efivars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c | hexdump -C

# disable it
sudo chattr -i /sys/firmware/efi/efivars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c
# first 4 bytes are attributes
printf '\x07\x00\x00\x00\x00\x00\x00\x00' | sudo tee /sys/firmware/efi/efivars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c 
cat  /sys/firmware/efi/efivars/FBSWIF-d743491e-f484-4952-a87d-8d5dd189b70c | hexdump -C
#should be y
cat /boot/config-$(uname -r) | grep CONFIG_EFI=y
# should be rw
mount | grep efivars

Fn-Lock

sudo apt-get install acpid
acpi_listen
# When pressing Fn-Lock
# 8FC0DE0C-B4E4- 000000d0 00000000
# 1E3391A1-2C89- 000000e8 00000000
# When pressing Fn+Q (power switch)
# D320289E-8FEA- 000000e3 00000000
# D320289E-8FEA- 000000e7 00000000

Touchpad

Rapid Charge

# Enable
echo '\_SB.PCI0.LPC0.EC0.VPC0.SBMC 0x07' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'

# Distable
echo '\_SB.PCI0.LPC0.EC0.VPC0.SBMC 0x08' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'

Keyboard backlight (white)

WMI

WMI
GUID: 8C5B9127-ECD4-4657-980F-851019F99CA5
Object ID: BA

Getting state
Method ID: 0x1

Setting state
Method ID: 0x2

Test of WMI via acpi_call

# Get current state
echo '\_SB.GZFD.WMBA 0 0x1 0' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'
{0x00, 0x01}

# Set current state
echo '\_SB.GZFD.WMBA 0 0x2 {0, 0x01, 0x03}' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'
0x0

IO-Port Light

# Get current state
echo '\_SB.GZFD.WMBA 0 0x1 0x5' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'
{0x00, 0x01}

# Set current state (off?)
echo '\_SB.GZFD.WMBA 0 0x2 {0x05, 0x00, 0x01}' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'

# Set current state (on?)
echo '\_SB.GZFD.WMBA 0 0x2 {0x05, 0x01, 0x02}' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'

GSync

WMI
GUID: 887B54E3-DDDC-4B2C-8B88-68A26A8835D0
Object ID: AA

Getting state
Method ID: 0x29
Args: None
Returns: integer
- 0: enabled
- 1: not enabled

Setting state
Method ID: 0x2A
Args: Buffer of u8
Returns: integer
- 0: enabled
- 1: not enabled

Change to Hybrid Mode

Flip to Start

Always on USB Charing

3 modes

Check if methods are supported before providing them in sysfs

CPU boost

cpupower frequency-info
# disable boost
sudo sh -c "echo '0' > /sys/devices/system/cpu/cpufreq/boost"
# enable boost
sudo sh -c "echo '1' > /sys/devices/system/cpu/cpufreq/boost"

Other to reverse enginner yet

#define WMI_METHOD_ID_GSYNCSTATUSGET 0x29 
#define WMI_METHOD_ID_GSYNCSTATUSSET 0x2A

#define WMI_METHOD_ID_IGPUMODESTATUSGET 0x0
#define WMI_METHOD_ID_IGPUMODESTATUSSET 0x0
enum IGPUState{
	IGPUState_default=0,
	IGPUState_iGPUOnly=1,
	IGPUState_auto=2
};

// overdrive
// ODStatusGet, ODStatusSet
// IsSupportOD
#define WMI_METHOD_ID_ODSTATUSGET 0x0
#define WMI_METHOD_ID_ODSTATUSSET 0x0
// 0=off, 1=on
enum ODState{
	ODState_off=0,
	ODState_on=1,
};

// touchpad lock
// TPStatusGet, TPStatusSet
// IsSupportDisableTP
#define WMI_METHOD_ID_TPSTATUSGET 0x0
#define WMI_METHOD_ID_TPSTATUSSET 0x0
// 0=off, 1=on

//
// WinKeyStatusGet, WinKeyStatusSet
// IsSupportDisableWinKey
#define WMI_METHOD_ID_WINKEYSTATUSGET 0x0
#define WMI_METHOD_ID_WINKEYSTATUSSET 0x0

//
// LENOVO_FAN_METHOD
// Fan_Set_FullSpeed

Temperatures via WMI

GetIRTemp: 1 (0x1) GetCPUTemp: 18 (0x12) GetGPUTemp: 19 (0x13)

echo '\_SB.GZFD.WMAA 0 0x1 0' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'
echo '\_SB.GZFD.WMAA 0 0x18 0' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'
echo '\_SB.GZFD.WMAA 0 0x19 0' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'

Result: Not properly implemented as seen in ACPI dissassembly.

Fan RPM via WMI

GetFanCount: 7 (0x1) GetFan1Speed: 8 (0x8) GetFan2Speed: 9 (0x9) GetFanMaxSpeed: 10 (0xA)

echo '\_SB.GZFD.WMAA 0 0x1 0' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'
echo '\_SB.GZFD.WMAA 0 0x18 0' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'
echo '\_SB.GZFD.WMAA 0 0x19 0' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'

Result: Not properly implemented as seen in ACPI dissassembly.

Fan control via WMI FAN_METHOD

92549549-4BDE-4F06-AC04-CE8BF898DBAA
Class Name: LENOVO_FAN_METHOD
Methods Count: 8
Object ID : B2

Fan_Get_FullSpeed: 1
# get full speed status
echo '\_SB.GZFD.WMB2 0 0x1 0' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'

# set to full speed
echo '\_SB.GZFD.WMB2 0 0x2 1' > /proc/acpi/call
cat /proc/acpi/call; printf '\n'

ACPI

SPMO: power mode (0,1,2) ADPT: AC Adapter CPP1, CPP2: power limit cpu at 0xFE00D6B0 (EC?)

long term: -defaullt: 0x46 for CCP2 -changes stapm (also in quiet mode, immediately confirmed with ryzendadj)

set short term: SMUF = 0x07

also set with FNQR, FNQS

WMB3

GPU

DTG1, CTG1 at 0xFE00D6C0 CTG2: calculated as constant from GTYP

short:

long:

Powerstate Inspection with AMD

sudo apt install libpci-dev
git clone https://github.com/FlyGoat/RyzenAdj.git
cd RyzenAdj
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make

NVIDIA GPU Stress test

git clone https://github.com/wilicc/gpu-burn
cd gpu-burn
docker build -t gpu_burn .
docker run --rm --gpus all gpu_burn

Script for Windows

$wmi_classes = Get-WmiObject -Namespace 'ROOT/WMI' -List -Class "*LENOVO*"
foreach ($wmi_class in $wmi_classes){
  Write-Host "########################################"
  Write-Host "########################################"
  Write-Host "########################################"
  Write-Host "Name:" $wmi_class.Name
  Write-Host "Class Name:" $wmi_class.Name 
  Write-Host "Class GUID:" $wmi_class.Qualifiers["guid"].Value
  Write-Host "Description:" $wmi_class.Methods.Count
  Write-Host "Methods:"
  foreach ($method in $wmi_class.Methods){
    Write-Host "Name:" $method.Name
    Write-Host "WmiMethodId:" $method.Qualifiers["WmiMethodId"].Value
    Write-Host "Class Name:" $wmi_class.Name 
    Write-Host "Class GUID:" $wmi_class.Qualifiers["guid"].Value
    Write-Host "Description:" $method.Qualifiers["Description"].Value
    Write-Host "Implemented:" $method.Qualifiers["Implemented"].Value
    Write-Host ""
  }
  Write-Host ""
}

Log from Windows

######################################## ######################################## ######################################## Name: LENOVO_UTILITY_EVENT Class Name: LENOVO_UTILITY_EVENT Class GUID: {8fc0de0c-b4e4-43fd-b0f3-8871711c1294} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_SMART_FAN_MODE_EVENT Class Name: LENOVO_GAMEZONE_SMART_FAN_MODE_EVENT Class GUID: {D320289E-8FEA-41E0-86F9-611D83151B5F} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_THERMAL_MODE_EVENT Class Name: LENOVO_GAMEZONE_THERMAL_MODE_EVENT Class GUID: {D320289E-8FEA-41E0-86F9-911D83151B5F} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_KEYLOCK_STATUS_EVENT Class Name: LENOVO_GAMEZONE_KEYLOCK_STATUS_EVENT Class GUID: {10AFC6D9-EA8B-4590-A2E7-1CD3C84BB4B1} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_LIGHTING_EVENT Class Name: LENOVO_LIGHTING_EVENT Class GUID: {1e3391a1-2c89-464d-95d9-3028b72e7a33} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_LIGHT_PROFILE_CHANGE_EVENT Class Name: LENOVO_GAMEZONE_LIGHT_PROFILE_CHANGE_EVENT Class GUID: {D320289E-8FEA-41E0-86F9-811D83151B5F} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_SMART_FAN_SETTING_EVENT Class Name: LENOVO_GAMEZONE_SMART_FAN_SETTING_EVENT Class GUID: {D320289E-8FEA-41E1-86F9-611D83151B5F} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_TEMP_EVENT Class Name: LENOVO_GAMEZONE_TEMP_EVENT Class GUID: {BFD42481-AEE3-4501-A107-AFB68425C5F8} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_OC_EVENT Class Name: LENOVO_GAMEZONE_OC_EVENT Class GUID: {D062906B-12D4-4510-999D-4831EE80E985} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_FAN_COOLING_EVENT Class Name: LENOVO_GAMEZONE_FAN_COOLING_EVENT Class GUID: {BC72A435-E8C1-4275-B3E2-D8B8074ABA59} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_POWER_CHARGE_MODE_EVENT Class Name: LENOVO_GAMEZONE_POWER_CHARGE_MODE_EVENT Class GUID: {D320289E-8FEA-41E0-86F9-711D83151B5F} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_GPU_TEMP_EVENT Class Name: LENOVO_GAMEZONE_GPU_TEMP_EVENT Class GUID: {BFD42481-AEE3-4502-A107-AFB68425C5F8} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_UTILITY_DATA Class Name: LENOVO_UTILITY_DATA Class GUID: {ce6c0974-0407-4f50-88ba-4fc3b6559ad8} Description: 1 Methods: Name: GetIfSupportOrVersion WmiMethodId: 1 Class Name: LENOVO_UTILITY_DATA Class GUID: {ce6c0974-0407-4f50-88ba-4fc3b6559ad8} Description: Utility 3.1 function is Support or the function Version Implemented: True

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_DATA Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: 62 Methods: Name: GetIRTemp WmiMethodId: 1 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get IR temp Implemented: True input: nothing output: data ACPI dissassembly: no handler

Name: GetThermalTableID WmiMethodId: 2 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get ThermalTable ID Implemented: True ACPI dissassembly: no handler

Name: SetThermalTableID WmiMethodId: 3 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set ThermalTable ID Implemented: True ACPI dissassembly: no handler

Name: IsSupportGpuOC WmiMethodId: 4 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Is SupportGpu OverClock Implemented: True

Name: GetGpuGpsState WmiMethodId: 5 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get GpuGpsState Implemented: True ACPI dissassembly: no handler

Name: SetGpuGpsState WmiMethodId: 6 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set GpuGpsState Implemented: True ACPI dissassembly: no handler

Name: GetFanCount WmiMethodId: 7 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Fan Count Implemented: True input: nothing output: data ACPI dissassembly: no handler

Name: GetFan1Speed WmiMethodId: 8 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Fan1 Speed Implemented: True input: nothing output: data ACPI dissassembly: no handler

Name: GetFan2Speed WmiMethodId: 9 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Fan2 Speed Implemented: True input: nothing output: data ACPI dissassembly: no handler

Name: GetFanMaxSpeed WmiMethodId: 10 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Fan Max Speed Implemented: True input: nothing output: data ACPI dissassembly: no handler

Name: GetVersion WmiMethodId: 11 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get AslCode Version Implemented: True ACPI dissassembly: implemented, returns constant (here: 0xd)

Name: IsSupportFanCooling WmiMethodId: 12 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Fan cooling capabilty Implemented: True

Name: SetFanCooling WmiMethodId: 13 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set Fan cooling on/off Implemented: True

Name: IsSupportCpuOC WmiMethodId: 14 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: cpu oc capability Implemented: True ACPI dissassembly: implemented, returns constant 0

Name: IsBIOSSupportOC WmiMethodId: 15 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: bios has overclock capability Implemented: True ACPI dissassembly: implemented, returns constant 0

Name: SetBIOSOC WmiMethodId: 16 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: enble or disable overclock in bios Implemented: True ACPI dissassembly: implemented, returns constant 0

Name: GetTriggerTemperatureValue WmiMethodId: 17 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get temperature change trigger temp value Implemented: True ACPI dissassembly: no handler

Name: GetCPUTemp WmiMethodId: 18 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get CPU temperature Implemented: True input: nothing output: data ACPI dissassembly: handler, returns constant 0

Name: GetGPUTemp WmiMethodId: 19 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get GPU temperature Implemented: True input: nothing output: data ACPI dissassembly: handler, returns constant 0

Name: GetFanCoolingStatus WmiMethodId: 20 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Fan cooling on/off status Implemented: True ACPI dissassyembly: implemented, does something depending on FCST, LFCM

Name: IsSupportDisableWinKey WmiMethodId: 21 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: EC support disable windows key capability Implemented: True input: nothing output: data ACPI dissassyembly: returns 1

Name: SetWinKeyStatus WmiMethodId: 22 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set windows key disable/enable Implemented: True input: data output: nothing ACPI dissassyembly: implemented using NCMD

Name: GetWinKeyStatus WmiMethodId: 23 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get windows key disable/enable status Implemented: True input: nothing output: data ACPI dissassyembly: implemented using NCMD

Name: IsSupportDisableTP WmiMethodId: 24 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: EC support disable touchpad capability Implemented: True input: nothing output: data ACPI dissassyembly: implemented

Name: SetTPStatus WmiMethodId: 25 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set touchpad disable/enable Implemented: True input: data output: nothing ACPI dissassyembly: implemented using NCMD

Name: GetTPStatus WmiMethodId: 26 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get touchpad disable/enable status Implemented: True input: nothing output: data ACPI dissassyembly: implemented using NCMD

Name: GetGPUPow WmiMethodId: 27 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get GPU normal mode max TDP(W) Implemented: True input: nothing output: data ACPI dissassyembly: no handler

Name: GetGPUOCPow WmiMethodId: 28 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get GPU OC mode max TDP(W) Implemented: True input: nothing output: data ACPI dissassyembly: no handler

Name: GetGPUOCType WmiMethodId: 29 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get GPU OC type Implemented: True input: nothing output: data ACPI dissassyembly: returns 0

Name: GetKeyboardfeaturelist WmiMethodId: 30 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Keyboard feature list Implemented: True ACPI dissassyembly: returns constant that is computed

Name: GetMemoryOCInfo WmiMethodId: 31 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Memory OC Information Implemented: True ACPI dissassyembly: returns constant that is computed

Name: IsSupportWaterCooling WmiMethodId: 32 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Water Cooling feature capability Implemented: True ACPI dissassyembly: returns 0

Name: SetWaterCoolingStatus WmiMethodId: 33 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set Water Cooling status Implemented: True ACPI dissassyembly: returns constant 0

Name: GetWaterCoolingStatus WmiMethodId: 34 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Water Cooling status Implemented: True ACPI dissassyembly: returns constant 0

Name: IsSupportLightingFeature WmiMethodId: 35 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Lighting feature capability Implemented: True

Name: SetKeyboardLight WmiMethodId: 36 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set keyboard light off or on to max Implemented: True ACPI dissassyembly: implemented

Name: GetKeyboardLight WmiMethodId: 37 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get keyboard light on/off status Implemented: True ACPI dissassyembly: implemented

Name: GetMacrokeyScancode WmiMethodId: 38 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Macrokey scan code Implemented: True ACPI dissassyembly: implemented

Name: GetMacrokeyCount WmiMethodId: 39 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Macrokey count Implemented: True ACPI dissassyembly: implemented

Name: IsSupportGSync WmiMethodId: 40 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Support G-Sync feature Implemented: True input: nothing output: data ACPI dissassyembly: implemented, returns constant 0x02

Name: GetGSyncStatus WmiMethodId: 41 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get G-Sync Statust Implemented: True input: nothing output: data ACPI dissassyembly: implemented,

Name: SetGSyncStatus WmiMethodId: 42 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set G-Sync Statust Implemented: True input: data output: nothing ACPI dissassyembly: implemented,

Name: IsSupportSmartFan WmiMethodId: 43 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Support Smart Fan feature Implemented: True input: nothing output: data ACPI dissassyembly: implemented, returns 0x04 constant

Name: SetSmartFanMode WmiMethodId: 44 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set Smart Fan Mode Implemented: True input: data output: nothing ACPI dissassyembly: implemented,

Name: GetSmartFanMode WmiMethodId: 45 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Smart Fan Mode Implemented: True input: nothing output: data ACPI dissassyembly: implemented,

Name: GetSmartFanSetting WmiMethodId: 46 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Smart Fan Setting Mode Implemented: True ACPI dissassyembly: implemented

Name: GetPowerChargeMode WmiMethodId: 47 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Power Charge Mode Implemented: True input: nothing output: data ACPI dissassyembly: implemented

Name: GetProductInfo WmiMethodId: 48 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Gaming Product Info Implemented: True input: nothing output: data ACPI dissassyembly: implemented, returns contant 0x64

Name: IsSupportOD WmiMethodId: 49 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Over Drive feature capability Implemented: True input: nothing output: data ACPI dissassyembly: implemented

Name: GetODStatus WmiMethodId: 50 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Over Drive status Implemented: True input: nothing output: data ACPI dissassyembly: implemented

Name: SetODStatus WmiMethodId: 51 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set Over Drive status Implemented: True input: data output: nothing ACPI dissassyembly: implemented, expects 0,1

Name: SetLightControlOwner WmiMethodId: 52 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set Light Control Owner Implemented: True ACPI dissassyembly: implemented

Name: SetDDSControlOwner WmiMethodId: 53 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set DDS Control Owner Implemented: True ACPI dissassyembly: returns constant 0

Name: IsRestoreOCValue WmiMethodId: 54 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get the flag of restore OC value Implemented: True ACPI dissassyembly: implemented

Name: GetThermalMode WmiMethodId: 55 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Real Thremal Mode Implemented: True input: nothing output: data ACPI dissassyembly: implemented, using SPMO, returns 1,2, or 3

Name: GetBIOSOCMode WmiMethodId: 56 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get the OC switch status in BIOS Implemented: True ACPI dissassyembly: implemented, using COCC, returns 0, 1,2,3

Name: SetIntelligentSubMode WmiMethodId: 57 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Set the current mode in Intelligent Mode Implemented: True ACPI dissassyembly: implemented,

Name: GetIntelligentSubMode WmiMethodId: 58 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get the current mode in Intelligent Mode Implemented: True ACPI dissassyembly: implemented

Name: GetHardwareInfoSupportVersion WmiMethodId: 59 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get hardware info support version Implemented: True ACPI dissassyembly: implemented, returns constant 1

Name: GetCpuFrequency WmiMethodId: 60 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Cpu core 0 max frequency Implemented: True input: nothing output: data ACPI dissassyembly: implemented, using CMSP and COCC, PVSD

Name: GetLearningProfileCount WmiMethodId: 61 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Get Total count of Learning Profile Implemented: True ACPI dissassyembly: implemented,

Name: IsACFitForOC WmiMethodId: 62 Class Name: LENOVO_GAMEZONE_DATA Class GUID: {887B54E3-DDDC-4B2C-8B88-68A26A8835D0} Description: Check the Adapter type fit for OC Implemented: True input: nothing output: data ACPI dissassyembly: implemented, using ACTY

######################################## ######################################## ######################################## Name: LENOVO_INTELLIGENT_OP_LIST Class Name: LENOVO_INTELLIGENT_OP_LIST Class GUID: {93A57CD3-BBC6-46AB-951D-31F17CC968A0} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_GPU_OC_DATA Class Name: LENOVO_GAMEZONE_GPU_OC_DATA Class GUID: {887B54E2-DDDC-4B2C-8B88-68A26A8835D0} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_CPU_METHOD Class Name: LENOVO_CPU_METHOD Class GUID: {14afd777-106f-4c9b-b334-d388dc7809be} Description: 6 Methods: Name: CPU_Get_OC_Status WmiMethodId: 1 Class Name: LENOVO_CPU_METHOD Class GUID: {14afd777-106f-4c9b-b334-d388dc7809be} Description: Get CPU OC Status Implemented: True ACPI dissassembly: returns constant 0

Name: CPU_Set_OC_Status WmiMethodId: 2 Class Name: LENOVO_CPU_METHOD Class GUID: {14afd777-106f-4c9b-b334-d388dc7809be} Description: Set CPU OC Status Implemented: True ACPI dissassembly: no handler

Name: CPU_Get_ShortTerm_PowerLimit WmiMethodId: 3 Class Name: LENOVO_CPU_METHOD Class GUID: {14afd777-106f-4c9b-b334-d388dc7809be} Description: Get CPU ShortTerm_PowerLimit Implemented: True buffer:

Name: CPU_Set_ShortTerm_PowerLimit WmiMethodId: 4 Class Name: LENOVO_CPU_METHOD Class GUID: {14afd777-106f-4c9b-b334-d388dc7809be} Description: Set CPU ShortTerm_PowerLimit Implemented: True ACPI dissassembly: CPP1=arg2, SMUF = 0x07, SMUD = Arg2*0x03E8

Name: CPU_Get_LongTerm_PowerLimit WmiMethodId: 5 Class Name: LENOVO_CPU_METHOD Class GUID: {14afd777-106f-4c9b-b334-d388dc7809be} Description: Get CPU LongTerm PowerLimit Implemented: True

Name: CPU_Set_LongTerm_PowerLimit WmiMethodId: 6 Class Name: LENOVO_CPU_METHOD Class GUID: {14afd777-106f-4c9b-b334-d388dc7809be} Description: Set CPU LongTerm_PowerLimit Implemented: True ACPI dissassembly: CPP2=arg2, SMUF = 0x05, SMUD = Arg2*0x03E8

######################################## ######################################## ######################################## Name: LENOVO_GPU_METHOD Class Name: LENOVO_GPU_METHOD Class GUID: {da7547f1-824d-405f-be79-d9903e29ced7} Description: 6 Methods: Name: GPU_Get_OC_Status WmiMethodId: 1 Class Name: LENOVO_GPU_METHOD Class GUID: {da7547f1-824d-405f-be79-d9903e29ced7} Description: Get GPU OC Status Implemented: True ACPI: implemented

Name: GPU_Set_OC_Status WmiMethodId: 2 Class Name: LENOVO_GPU_METHOD Class GUID: {da7547f1-824d-405f-be79-d9903e29ced7} Description: Set GPU OC Status Implemented: True ACPI: implemented

Name: GPU_Get_PPAB_PowerLimit WmiMethodId: 3 Class Name: LENOVO_GPU_METHOD Class GUID: {da7547f1-824d-405f-be79-d9903e29ced7} Description: Get GPU PPAB PowerLimit Implemented: True ACPI: implemented

Name: GPU_Set_PPAB_PowerLimit WmiMethodId: 4 Class Name: LENOVO_GPU_METHOD Class GUID: {da7547f1-824d-405f-be79-d9903e29ced7} Description: Set GPU PPAB PowerLimit Implemented: True ACPI: implemented

Name: GPU_Get_cTGP_PowerLimit WmiMethodId: 5 Class Name: LENOVO_GPU_METHOD Class GUID: {da7547f1-824d-405f-be79-d9903e29ced7} Description: Get GPU cTGP PowerLimit Implemented: True ACPI: implemented

Name: GPU_Set_cTGP_PowerLimit WmiMethodId: 6 Class Name: LENOVO_GPU_METHOD Class GUID: {da7547f1-824d-405f-be79-d9903e29ced7} Description: Set GPU cTGP PowerLimint Implemented: True ACPI: implemented

######################################## ######################################## ######################################## Name: LENOVO_FAN_METHOD Class Name: LENOVO_FAN_METHOD Class GUID: {92549549-4bde-4f06-ac04-ce8bf898dbaa} Description: 8 Methods: Name: Fan_Get_FullSpeed WmiMethodId: 1 Class Name: LENOVO_FAN_METHOD Class GUID: {92549549-4bde-4f06-ac04-ce8bf898dbaa} Description: Get Fan Full Speed Implemented: True input: nothing output: status ACPI dissassyembly: implemented

Name: Fan_Set_FullSpeed WmiMethodId: 2 Class Name: LENOVO_FAN_METHOD Class GUID: {92549549-4bde-4f06-ac04-ce8bf898dbaa} Description: Set Fan Full Speed Implemented: True input: status output: nothing ACPI dissassyembly: implemented

Name: Fan_Get_MaxSpeed WmiMethodId: 3 Class Name: LENOVO_FAN_METHOD Class GUID: {92549549-4bde-4f06-ac04-ce8bf898dbaa} Description: Get Fan Max Speed Implemented: True input: fan_id output: fanMaxspeed, fanmaxspeedsize ACPI dissassyembly: no handler

Name: Fan_Set_MaxSpeed WmiMethodId: 4 Class Name: LENOVO_FAN_METHOD Class GUID: {92549549-4bde-4f06-ac04-ce8bf898dbaa} Description: Set Fan Max Speed Implemented: True Input: FanMaxSpeedTable ACPI dissassyembly: no handler

Name: Fan_Get_Table WmiMethodId: 5 Class Name: LENOVO_FAN_METHOD Class GUID: {92549549-4bde-4f06-ac04-ce8bf898dbaa} Description: Get Fan Table Implemented: True Input: FanId, SensorId Output: FanTable, FanTableSize ACPI dissassyembly: no handler

Name: Fan_Set_Table WmiMethodId: 6 Class Name: LENOVO_FAN_METHOD Class GUID: {92549549-4bde-4f06-ac04-ce8bf898dbaa} Description: Set Fan Table Implemented: True Input: FanTable ACPI dissassyembly: no handler

Name: Fan_GetCurrentFanSpeed WmiMethodId: 7 Class Name: LENOVO_FAN_METHOD Class GUID: {92549549-4bde-4f06-ac04-ce8bf898dbaa} Description: Get Current Fan Speed Implemented: True Input: FanId (0 (fan 1) or 1(fan 2)) Output: CurrentFanSpeed ACPI dissassyembly: implementeed using EC0.FANS, EC0.FA2S

Name: Fan_GetCurrentSensorTemperature WmiMethodId: 8 Class Name: LENOVO_FAN_METHOD Class GUID: {92549549-4bde-4f06-ac04-ce8bf898dbaa} Description: Get Current Sensor Temperature Implemented: True Input: SensorId (0x03 (cpu) or 0x04(gpu)) Output: CurrentSensorTemperatue ACPI disassembly: implemented using EC0.CPUT, EC0.GPUT

######################################## ######################################## ######################################## Name: LENOVO_FAN_TABLE_DATA Class Name: LENOVO_FAN_TABLE_DATA Class GUID: {87fb2a6d-d802-48e7-9208-4576c5f5c8d8} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_OTHER_METHOD Class Name: LENOVO_OTHER_METHOD Class GUID: {dc2a8805-3a8c-41ba-a6f7-092e0089cd3b} Description: 8 Methods: Name: GetDeviceType WmiMethodId: 1 Class Name: LENOVO_OTHER_METHOD Class GUID: {dc2a8805-3a8c-41ba-a6f7-092e0089cd3b} Description: Get Device Type Implemented: True

Name: GetSupportThermalMode WmiMethodId: 2 Class Name: LENOVO_OTHER_METHOD Class GUID: {dc2a8805-3a8c-41ba-a6f7-092e0089cd3b} Description: Get Thermal Mode Status Implemented: True

Name: GetCustomModeAbility WmiMethodId: 3 Class Name: LENOVO_OTHER_METHOD Class GUID: {dc2a8805-3a8c-41ba-a6f7-092e0089cd3b} Description: Get Custom Mode Abiltiy Implemented: True

Name: Set_Custom_Mode_Status WmiMethodId: 4 Class Name: LENOVO_OTHER_METHOD Class GUID: {dc2a8805-3a8c-41ba-a6f7-092e0089cd3b} Description: Set Custom Mode Status Implemented: True

Name: Get_Legion_Device_Support_Feature WmiMethodId: 5 Class Name: LENOVO_OTHER_METHOD Class GUID: {dc2a8805-3a8c-41ba-a6f7-092e0089cd3b} Description: Get Device Support Feature Status Implemented: True

Name: Get_Device_Current_Support_Feature WmiMethodId: 6 Class Name: LENOVO_OTHER_METHOD Class GUID: {dc2a8805-3a8c-41ba-a6f7-092e0089cd3b} Description: Get Device Current Support Feature Status Implemented: True

Name: Set_Device_Current_Support_Feature WmiMethodId: 7 Class Name: LENOVO_OTHER_METHOD Class GUID: {dc2a8805-3a8c-41ba-a6f7-092e0089cd3b} Description: Set Device Current Support Feature enable/disalbe Implemented: True

Name: Get_Support_LegionZone_Version WmiMethodId: 8 Class Name: LENOVO_OTHER_METHOD Class GUID: {dc2a8805-3a8c-41ba-a6f7-092e0089cd3b} Description: Get Support Legionzone Version Implemented: True

######################################## ######################################## ######################################## Name: LENOVO_FAN_MAX_SPEED_DATA Class Name: LENOVO_FAN_MAX_SPEED_DATA Class GUID: {c3c7aeb8-4c06-4d40-8f29-212a6ccd74aa} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GPU_OVERCLOCKING_DATA Class Name: LENOVO_GPU_OVERCLOCKING_DATA Class GUID: {8A8984E2-228F-685F-B496-DDA5F52CBE5B} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_PANEL_METHOD Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: 22 Methods: Name: Panel_Get_Support_Status WmiMethodId: 1 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Get Panel Support Functions Implemented: True

Name: Panel_Get_Status WmiMethodId: 2 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Get Panel Functions Status Implemented: True

Name: Panel_Set_Status WmiMethodId: 3 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Set Panel Functions Status Implemented: True

Name: Panel_Get_Low_Latency_Mode WmiMethodId: 4 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Get Panel Low Latency Mode Implemented: True

Name: Panel_Set_Low_Latency_Mode WmiMethodId: 5 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Set Panel Low Latency Mode Implemented: True

Name: Panel_Get_PIP_Info WmiMethodId: 6 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Get Panel PIP Info Implemented: True

Name: Panel_Set_PIP_Info WmiMethodId: 7 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Set Panel PIP Info Implemented: True

Name: Panel_Get_Game_Aid_FPS_Display_Pos WmiMethodId: 8 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Get Panel Game Aid FPS Display Implemented: True

Name: Panel_Set_Game_Aid_FPS_Display_Pos WmiMethodId: 9 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Set Panel Game Aid FPS Display Implemented: True

Name: Panel_Get_Game_Aid_FPS WmiMethodId: 10 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Set Panel Game Aid FPS Display Implemented: True

Name: Panel_Get_Game_Aid_Sight_Mode WmiMethodId: 11 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Get Panel Game Aid Sight Mode Implemented: True

Name: Panel_Set_Game_Aid_Sight_Mode WmiMethodId: 12 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Set Panel Game Aid Sight Mode Implemented: True

Name: Panel_Get_Game_Aid_Timer_Info WmiMethodId: 13 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Get Panel Game Aid Timer Info Implemented: True

Name: Panel_Set_Game_Aid_Timer_Info WmiMethodId: 14 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Set Panel Game Aid Timer Info Implemented: True

Name: Panel_Get_Game_Aid_Countdown_Info WmiMethodId: 15 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Get Panel Game Aid Countdown Timer Info Implemented: True

Name: Panel_Set_Game_Aid_Countdown_Info WmiMethodId: 16 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Set Panel Game Aid Countdown Timer Info Implemented: True

Name: Panel_Get_Display_Mode WmiMethodId: 17 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Get Panel Display Mode Implemented: True

Name: Panel_Set_Display_Mode WmiMethodId: 18 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Set Panel Display Mode Implemented: True

Name: Panel_Get_Gamut_Switch WmiMethodId: 19 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Get Panel Gamut Switch Implemented: True

Name: Panel_Set_Gamut_Switch WmiMethodId: 20 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Set Panel Gamut Switch Implemented: True

Name: Panel_Get_MPRT WmiMethodId: 21 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Get Panel MPRT info Implemented: True

Name: Panel_Set_MPRT WmiMethodId: 22 Class Name: LENOVO_PANEL_METHOD Class GUID: {e5edffbf-e822-4bbe-8650-c07b8bae4c54} Description: Set Panel MPRT info Implemented: True

######################################## ######################################## ######################################## Name: LENOVO_CPU_OVERCLOCKING_DATA Class Name: LENOVO_CPU_OVERCLOCKING_DATA Class GUID: {4C90256D-44EA-D6A8-7650-63DF4FEB2CFF} Description: 0 Methods:

######################################## ######################################## ######################################## Name: Lenovo_SystemElement Class Name: Lenovo_SystemElement Class GUID: Description: 0 Methods:

######################################## ######################################## ######################################## Name: Lenovo_BatteryInformation Class Name: Lenovo_BatteryInformation Class GUID: C3A03776-51AC-49AA-AD0F-F2F7D62C3F3C Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_MEMORY_OC_DATA Class Name: LENOVO_MEMORY_OC_DATA Class GUID: {37d0014b-370c-47ef-bf03-588e8acb2fcd} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_LIGHTING_DATA Class Name: LENOVO_LIGHTING_DATA Class GUID: {4dd5bd84-15a9-47e2-ad65-cc61a5c62fd0} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_GAMEZONE_CPU_OC_DATA Class Name: LENOVO_GAMEZONE_CPU_OC_DATA Class GUID: {B7F3CA0A-ACDC-42D2-9217-77C6C628FBD2} Description: 0 Methods:

######################################## ######################################## ######################################## Name: LENOVO_LIGHTING_METHOD Class Name: LENOVO_LIGHTING_METHOD Class GUID: {8c5b9127-ecd4-4657-980f-851019f99ca5} Description: 2 Methods: Name: Get_Lighting_Current_Status WmiMethodId: 1 Class Name: LENOVO_LIGHTING_METHOD Class GUID: {8c5b9127-ecd4-4657-980f-851019f99ca5} Description: Get Current Lighting Status Implemented: True input: lighting_id output: current_Brigness_Level, Current_State_Type

Name: Set_Lighting_Current_Status WmiMethodId: 2 Class Name: LENOVO_LIGHTING_METHOD Class GUID: {8c5b9127-ecd4-4657-980f-851019f99ca5} Description: Set Current Lighting Status Implemented: True Input: Current_Brithngess_Level, Current_State_Type, Lighting_ID

######################################## ######################################## ######################################## Name: LENOVO_MEMORY_METHOD Class Name: LENOVO_MEMORY_METHOD Class GUID: {03607fce-0d83-4612-8a6e-4a4ef0415ea9} Description: 3 Methods: Name: MEM_Get_OC_Status WmiMethodId: 1 Class Name: LENOVO_MEMORY_METHOD Class GUID: {03607fce-0d83-4612-8a6e-4a4ef0415ea9} Description: Get Memory OC Status Implemented: True

Name: MEM_Set_OC_Status WmiMethodId: 2 Class Name: LENOVO_MEMORY_METHOD Class GUID: {03607fce-0d83-4612-8a6e-4a4ef0415ea9} Description: Set Memory OC Status Implemented: True

Name: MEM_Set_OC_Data WmiMethodId: 3 Class Name: LENOVO_MEMORY_METHOD Class GUID: {03607fce-0d83-4612-8a6e-4a4ef0415ea9} Description: Set Memory OC Data Implemented: True