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.
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.
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).
WMAA 0x2C/0x2D,
fan RPM / CPU+GPU temperature / fan full speed via Other Method WMAE
(the third fan is firmware fan 4, feature id 0x04030004 = EC FASF * 100,
exposed as hwmon fan3; at idle it settles at 2300 RPM, the bottom of its
own ladder, while fans 1/2 sit at 1600/1700),
fan table via Fan Method WMAB 5/6. The CPU Method GUID is an empty
stub, so the limit attributes that stay visible (cpu_temperature_limit,
cpu_l1_tau, gpu_power_target_offset) use ACCESS_METHOD_WMI3_CLAMPED;
the CPU/GPU power-limit and OC attributes are hidden (skip_oc_controls),
use the in-tree lenovo_wmi_other firmware-attributes for PL1/PL2/tau/cTGP.
Those read the power mode through lenovo_wmi_gamezone, and return
EINVAL for every current_value while that driver has no device, so
model_q7cn sets leave_gamezone_wmi_unbound: legion_wmi declines the
GameZone method block (887B54E3, an object_id block with no notify id,
so binding it never delivered events; the methods are still called by
GUID) and the mainline driver binds it in any load order. Verified with
legion_laptop loaded first: dmesg “Leaving GameZone WMI to
lenovo-wmi-gamezone”, ppt_pl1_spl 90, ppt_pl2_sppt 125, gpu_nv_ctgp
95 readable, both platform-profile providers offering the same five
choices; on AC, custom via the lenovo-wmi-gamezone profile device,
ppt_pl1_spl 80 written and read back, then restored to 90 (the
power-button LED shows purple/pink while in custom mode).intel-rapl-mmio:0), which the BIOS sets to 30/30 W at boot. The WMAE
power-limit setters store their value but update the EC’s live limits
(CLTP/CSTP) only when ODV1 == 3 (custom), and ROOS() signals the
other modes to Intel DTT (Notify(IETM, 0x88), mode in ODV1 = odvp1),
whose data-vault targets are selected through software-OEM conditions that
thermald cannot evaluate. So quiet/balanced/performance/extreme ran at 30 W
(24-thread load: ~1.2 GHz, 54 °C) until custom mode was entered once. The
driver exports the capdata01 per-mode defaults in
cpu_longterm_powerlimit_defaults (low-power:55 balanced:90
performance:145 max-power:160 custom:90) and
cpu_shortterm_powerlimit_defaults (65 125 190 205 125), and legiond’s
cpu_powerlimit_sync writes them to MMIO RAPL on each profile change
(verified: 55/65 W → ~2.7 GHz, 63 °C; 90/125 W → ~3.6 GHz, 87 °C on the
same load).
thermald’s power-limit control must not run alongside it: thermald
--adaptive writes its PPCC maximum (PL1 150 W) to the same MMIO limit in
every mode. lenovo-wmi-other’s ppt_pl1_spl / ppt_pl2_sppt hold the
custom-mode values (the WMAE setters only apply them when ODV1 == 3), so
outside custom mode they can differ from the enforced MMIO limit.nvidia-powerd the enforced
GPU power limit is 95 W in every mode (max 175 W). With
systemctl enable --now nvidia-powerd it follows the mode: 95 W in quiet
and balanced, 150 W in performance and extreme at idle, and 175 W under GPU
load with Dynamic Boost (a CUDA FMA burn drew 174.5 W at ~2.73 GHz, limited
by “SW Power Cap”). For the first ~20 s of a new load the driver holds
1507 MHz / ~51 W with the clock reason “Reliability”, then releases it.
The firmware also has CPU “Double” targets for combined load (DPTF vault:
performance PL1 145 → 75 W once sensors SEN3/SEN4, thermal zones 3/4, pass
~54/74 °C). legiond applies them with the double_* keys of
[cpu_powerlimit] (example values in legiond.ini). Under a 60 s CPU+GPU
load in performance, SEN3/SEN4 went from 43/43 °C to 54/76 °C at ~40 s
while the CPU package was at 100–103 °C at the 90 W balanced limit and the
GPU drew ~150 W (Dynamic Boost’s extra 25 W needs a lightly loaded CPU).FAN_SPEED_UNIT_LEVEL, one table for all fans,
temperature axis fixed by the EC). LENOVO_FAN_TABLE_DATA on this firmware
(WQA3, switched on the GSKU EC field) maps level 1..10 to
1600..5200 RPM (fan 1 / sensor 0x01, CPU fan), 1700..5400 (fan 2 /
sensor 0x05, GPU fan) and 2300..6500 (fan 4 / sensor 0x04, the small
third fan) on SKUs 0x02/0x0B; SKUs 0x03/0x0C and the default case use
1600..5100 / 1600..5100 / 1600..6500. The firmware has no (fan 1,
sensor 0x04) row, so the driver takes fan 1’s ladder from the sensor
0x01 row, as Lenovo Legion Toolkit does. Fans 1 and 2 are what the driver’s
fan1_level_rpm_table/fan2_level_rpm_table attributes expose for the
Python tools, so RPM presets round to the right level; they also give hwmon
fan1_max its real value (5200) instead of the generic fallback. The EC applies the table
only in custom mode (powermode 0xFF) on AC; on battery the firmware parks
the custom-mode request while powermode still reads back 0xFF. The one
table drives all three fans: with every point at pwm 127 (level 5) they
settled at 2400/2400/3200 RPM (the level-5 entries of the fan 1/2/4
ladders), and at pwm 204 they ramped toward 3700/3800/5000. The EC’s idle
fan-stop still applies in every mode, custom included. At idle the fans switch off below
about CPU 46 °C and restart at about 51 °C, so fan*_input reading 0 at
idle is normal.
Fan_Get_Table returns a static 1..10 placeholder in extreme mode, so read
the table in another mode. Writing the table as percent (older driver
builds: 100 into a 1..10 byte) matches the thermal shutdowns reported for
this model.pwm1_auto_point*_pwm is writable in the point table
(wmi_fancurve_speed_only); minifancurve and lockfancontroller are hidden because the EC does not
declare those bytes (new skip_lockfancontroller).VPC0.GBMD/VPC0.SBMC;
enabling rapid charge clears conservation mode in firmware, but enabling
conservation left rapid charge on, and ideapad-laptop’s charge_types then
failed with -EINVAL (“both [Fast] and [Long_Life] are enabled”). The driver
now switches rapid charge off before enabling conservation, like
ideapad-laptop. Verified: conservation on → rapid 0, charge_types
[Long_Life], battery “Not charging”; off → [Standard]; rapid on →
conservation cleared, [Fast]; no charge_types errors.PANT & 0x02 (panel supports overdrive);
on this unit’s Samsung ATNA60HU01-0 OLED the bit is clear, IsSupportOD
returns 0 and a written 1 reads back 0. The driver now hides overdrive
when IsSupportOD succeeds and returns 0 (kept visible if the query fails),
so it disappears here but stays on 83F5 units with an overdrive-capable
panel.5 5 5 5 5 6 7 8 8 8 (EC F9F0..,
ecmemoryram 0x180) against the default 1 2 3 4 5 6 7 8 8 8, while all
points at level 8 survived unchanged. A curve quieter than the default is
therefore lost after suspend until it is written again. The driver now
re-applies the last table written through hwmon 3 s after resume
(restore_fancurve_on_resume, Q7CN only), if the power mode is still the
one it was written in; legiond’s legiond-onresume.service also
re-applies its preset. Verified: an all-level-5 custom table survived S3
(“Re-applied the fan curve written before suspend: 0”, EC 05 × 10).05 × 10 after a switch to balanced and became 05 05 05 05 05 06 07 08
08 08 ~1 s after switching back to custom. The processing runs ~1 s after
the switch, so table writes made right after entering custom mode can be
floored as well (reproduced once in three attempts with writes finishing
0.6 s after the switch). Write a custom table at least ~2 s after entering
custom mode. There is no per-point range check: with custom mode settled,
every point accepted every level down to the driver’s own
fancurve_level_min (1 1 1 1 1 1 1 1 3 5).instant_boot_ac / instant_boot_usb_pd (has_instant_boot)
use WMAE feature ids 0x03010001 / 0x03010002. Get returns EC EACS /
ETCS; set calls WSMI(7)/WSMI(8) (AC on/off) or WSMI(9)/WSMI(0xA)
(USB-PD on/off) and updates the EC flag. The capability table (WQA9,
capdata00) flags both ids 0x07. Reads verified (both 0 by default); to
verify a write, enable it, shut down, unplug and replug the charger: the
laptop should power on by itself.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).
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:
WMAA 0x2C/0x2D,
fan RPM / CPU+GPU temperature / fan full speed via Other Method WMAE,
fan table via Fan Method WMAB 5/6 with the same F9F0..F9F9 +
LECR(0xD0,1,1,2) semantics; FAN_SPEED_UNIT_LEVEL, one table for all
fans, temperature axis fixed by the EC, static 1..10 placeholder in
extreme mode (read the table in another mode). LENOVO_FAN_TABLE_DATA
(WQA3) maps level 1..10 to 1700..5100 RPM on fan 1, so
fan1_level_rpm_table/fan2_level_rpm_table are available.WMAF); the IO-port light ID is
unimplemented on this firmware and the attribute is skipped
automatically.fan_fullspeed (WMAE 0x04020000 -> EC FNST, set and clear) is
exposed but writes require custom power mode; on this unit a
full-speed write through the wrong WMI method (old fallback config)
wedged the fans at ~18000 RPM until reboot, so validate with care and
be ready to reboot.skip_oc_controls); only
cpu_temperature_limit, cpu_l1_tau and gpu_power_target_offset
are visible, as on Q7CN. Rapid charge uses VPC0.GBMD/SBMC.minifancurve and lockfancontroller are hidden (undeclared EC
bytes on the 0x5508 generation); the EC RAM window (ERAX @0xFEEC2400,
len 0xFF) is only used for the read-only ecmemoryram debugfs dump.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).
BIOS RGCN27WW/RGCN35WW/RGCN36WW (issue #373), EC 0x5508, AMD Ryzen 7 260
RGCN is qualified on product name 83M0; config
model_rgcn in kernel_module/legion-laptop.c (the header comment cites
the DSDT lines from the RGCN35WW dsdt.dsl attached in issue #373).Same firmware layout as the RLCN (83LT) above, on the Legion 5 chassis:
WMAA 0x2C/0x2D,
fan RPM / CPU+GPU temperature / fan full speed via Other Method WMAE,
fan table via Fan Method WMAB 5/6 with the same F9F0..F9F9 +
LECR(0xD0,1,1,2) semantics; FAN_SPEED_UNIT_LEVEL, one table for all
fans, temperature axis fixed by the EC, static 1..10 placeholder in
extreme mode (ODV1 == 4; read the table in another mode).
LENOVO_FAN_TABLE_DATA (WQA3) maps level 1..10 to 1800..4600 RPM on
both fans, so fan1_level_rpm_table/fan2_level_rpm_table are
available.WMAF, LECR 0xDA); the reporters’ units have no lid/logo and no
IO-port lights (issue #373 report), so both light attributes are
skipped.fan_fullspeed (WMAE 0x04020000 -> EC FNST, set and clear) is
exposed but writes require custom power mode, as on Q7CN/RLCN.skip_oc_controls); only
cpu_temperature_limit, cpu_l1_tau and gpu_power_target_offset
are visible, as on Q7CN/RLCN. Rapid charge uses VPC0.GBMD/SBMC.minifancurve and lockfancontroller are hidden (undeclared EC
bytes on the 0x5508 generation); the EC RAM window (ERAX @0xFEEC2400,
len 0xFF) is only used for the read-only ecmemoryram debugfs dump.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).
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.
model_rxcn.cpu_temperature_limit (103), cpu_l1_tau (56),
gpu_power_target_offset (55), cpu_longterm_powerlimit (70 W) and
cpu_shortterm_powerlimit (125 W) are all gated by
access_method_powerlimits = ACCESS_METHOD_WMI3 (as on model_q8cn/
model_nmcn/model_lpcn/model_lzcn) and reproduced identically
across five reloads, a main merge, and a BIOS update.winkey, touchpad,
keyboard-backlight brightness (flip, verify, restore).fan_fullspeed writes are accepted and read back correctly (0 -> 1 ->
0) but produced no observed RPM change in testing; fan_maxspeed reads
0 throughout - untested/unexplained, not chased further.F9F0..F9F9 level bytes, and every *_min_temp/*_max_temp column
reads 0 because the firmware carries no temperature fields. The config
therefore exposes only the speed attributes (wmi_fancurve_speed_only)
and treats them as levels 1..10 (FAN_SPEED_UNIT_LEVEL), like
model_q7cn/model_rlcn - writing percent values into the level bytes
matches the thermal-shutdown reports for this generation. The table
initially read all-zero in balanced mode; after a BIOS update and
setting fan control to custom, the speed column populates with the live
levels.Known gaps:
cpu_default_powerlimit and cpumaxfrequency still read 0/garbage
regardless of model config - these sysfs handlers call
WMI_GUID_LENOVO_CPU_METHOD/GameZone methods unconditionally, not
gated by model_config, so this looks like an unrelated firmware quirk
on this generation rather than an allowlist problem.EINVAL on SetSmartFanMode(255)), reproducible across a BIOS update
and independent of fan-curve state; root cause not yet identified.AGENTS.md’s
guidance that these are the highest-risk hardware writes; left for a
maintainer or a follow-up session.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.
BIOS Q6CN26WW (issue #337), EC 0x5508 (fw 2b0), Intel Core Ultra 9 275HX
Q6CN 83LU is qualified on product name 83LU;
config model_q6cn_lu in kernel_module/legion-laptop.c (the header
comment cites the DSDT lines from issue #337).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:
WMAA 0x2C/0x2D,
fan RPM / CPU+GPU temperature / fan full speed via Other Method WMAE,
fan table via Fan Method WMAB 5/6 with the same F9F0..F9F9 +
LECR(0xD0,1,1,2) semantics; FAN_SPEED_UNIT_LEVEL, one table for all
fans, temperature axis fixed by the EC, static 1..10 placeholder in
extreme mode (read the table in another mode). LENOVO_FAN_TABLE_DATA
(WQA3) is present in the _WDG, so fan1_level_rpm_table/
fan2_level_rpm_table are available.0x05010000 is the CPU socket temperature (CPUS), not a labeled IC
sensor, so the IC temperature attribute is hidden (skip_ic_temp).pwm1_auto_point*_pwm is writable in the point table
(wmi_fancurve_speed_only); minifancurve, lockfancontroller and fan_maxspeed are hidden (the
EC does not declare those bytes and WMAB implements neither
max-speed method).WMAF); the chassis has no Y-logo or
IO-port lights (issue #337 report), so both light attributes are
skipped.fan_fullspeed (WMAE 0x04020000 -> EC FNST, set and clear) is
exposed but writes require custom power mode, as on Q7CN/RLCN.skip_oc_controls); only
cpu_temperature_limit, cpu_l1_tau and gpu_power_target_offset
are visible, as on Q7CN/RLCN. Rapid charge uses VPC0.GBMD/SBMC.ERAX @0xFE500400, F9FT/ECB2 at +0x100/+0x200,
ramio_size 0x300) is only used for the read-only ecmemoryram
debugfs dump; raw EC reads return garbage on this generation (issue
#491); the ACPI-path reads agree with the WMI3 ones (the DSDT wires
both to the same EC fields), only direct EC/ramio reads are misaligned.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).
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.
WMAA 0x2C/0x2D,
fan RPM / CPU+GPU temperature / fan full speed via Other Method WMAE,
fan table via Fan Method WMAB 5/6 with the same F9F0..F9F9 +
LECR(0xD0,1,1,2) semantics; FAN_SPEED_UNIT_LEVEL, one table for all
fans, temperature axis fixed by the EC, static 1..10 placeholder in
extreme mode (ODV1 == 4; read the table in another mode). Read on
hardware: 1,2,3,4,5,6,7,8,8,8 in performance mode. LENOVO_FAN_TABLE_DATA
(WQA3) maps level 1..10 to 1700..5300 RPM on both fans, so
fan1_level_rpm_table/fan2_level_rpm_table are available.WMAF, LECR 0xDA); the chassis has no Y-logo or IO-port lights
(issue #471 report), so both light attributes are skipped.fan_fullspeed (WMAE 0x04020000 -> EC FNST, set and clear) is
exposed but writes require custom power mode, as on Q7CN/RLCN.skip_oc_controls); only
cpu_temperature_limit, cpu_l1_tau and gpu_power_target_offset
are visible, as on Q7CN/RLCN. Rapid charge uses VPC0.GBMD/SBMC.minifancurve and lockfancontroller are hidden (undeclared EC
bytes on the 0x5508 generation); the EC RAM window (ERAX @0xFE500400,
F9FT/ECB2 at +0x100/+0x200, ramio_size 0x300) is only used for
the read-only ecmemoryram debugfs dump; raw EC reads return garbage
on this generation (issue #491) - the reporter’s dump shows EC
80/87 C and 18045/16743 RPM while ACPI and WMI3 agree at 64 C and
2200 RPM.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).
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.
255, not 3 (performance).
The chip ID alone does not identify a register layout: R3CN’s verified
LOQ map must not be replaced merely because other 0x5508 models need
WMI. No new EC addresses are introduced by this correction.WMAB 5/6 delegate to GFAN/SFAN, which transfer shared
levels 1..10, deriving RPM/temperatures from FNT0..FNT2 before
writing the EFAN fields. That interface cannot preserve arbitrary
independent RPM/temperature edits and is not the active curve path.
Its diagnostic debugfs table still uses unit 5; the active EC3 table
uses unit 3. fan1_level_rpm_table/fan2_level_rpm_table stay hidden
for EC3, preventing userspace from treating its PWM values as levels.
WMI default-curve restoration remains available; its payload already
names the requested mode, as SFAN requires. It now refuses an unreadable
or extreme active mode rather than reporting an ignored reset as success.
It checks live thermalmode, not the saved powermode request; this WMI
guard does not change the native EC3 curve path. The full-speed enable guard
uses that same live mode; disabling full speed remains possible even if the
mode read fails.WMAE
(standard dword feature ids through a DEV0/FEA0/TYP0 dispatch):
RPM 0x04030001/2 -> EC FA1S/FA2S, full speed 0x04020000 -> EC
FFON (writes require custom power mode), CPU temp 0x05040000 ->
EC CTMP; note 0x05050000 (labeled GPU) returns the socket
temperature SKTC, the only dGPU-side reading this firmware offers,
and 0x05010000 reads Zero, so the IC temperature attribute is
hidden (skip_ic_temp). Power limits map to EC CSPL/CLPL/CCTL/
CCPL and stay exposed. Power mode via GameZone WMAA 0x2C/0x2D
(quiet/balanced/performance/custom 0xFF/extreme 0xE0); keyboard
backlight via KBBACKLIGHT WMAF.minifancurve and lockfancontroller are hidden: their loq_v1 offsets
are placeholders, not validated controls. The read-only ecmemoryram
debugfs dump retains the 0xFE0B0F00/0x600 EFAN window (#374).
The WMI sensor path, hidden IC sensor and custom-mode full-speed guard
are retained; restoring EC3 curves does not switch sensor access to EC.Hardware regression check (on AC; do not run thermal stress unattended):
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).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.sensors. Do not substitute level indices or raw
RPM numbers for the hwmon pwm values, which remain in 0..255.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.
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:
WMAA 0x2C/0x2D,
fan RPM / CPU+GPU temperature / fan full speed via Other Method WMAE,
fan table via Fan Method WMAB 5/6 with the same F9F0..F9F9 +
LECR(0xD0,1,1,2) semantics; FAN_SPEED_UNIT_LEVEL, one table for all
fans, temperature axis fixed by the EC, static 1..10 placeholder in
extreme mode (ODV1 == 4; read the table in another mode).
LENOVO_FAN_TABLE_DATA (WQA3) maps level 1..10 to 1700..5100 RPM on
fan 1, so fan1_level_rpm_table/fan2_level_rpm_table are available.WMAF get(1)/set(2), light ids 0x00/0x03);
the IO-port light id 0x05 is unimplemented on this firmware and the
attribute is skipped automatically.fan_fullspeed (WMAE 0x04020000 -> EC FNST, set and clear) is
exposed but writes require custom power mode; on this generation a
full-speed write through the wrong WMI method (old fallback config)
wedged the fans at maximum speed until reboot on the 83LT, so validate
with care and be ready to reboot.skip_oc_controls); only
cpu_temperature_limit, cpu_l1_tau and gpu_power_target_offset
are visible, as on Q7CN. Rapid charge uses VPC0.GBMD/SBMC at
\_SB.PC00.LPCB.EC0.minifancurve and lockfancontroller are hidden (undeclared EC bytes
on the 0x5508 generation); the EC RAM window (ERAX @0xFE0B0400, len
0xFF; F9FT/ECB2 at +0x100/+0x200) is only used for the read-only
ecmemoryram debugfs dump. Raw EC reads are misaligned on this unit
(issue #491): with the old fallback config the EC column reported
~18045/~16740 RPM at ~2400 RPM real speed, while the WMI3 values are
correct (idle ~48 C/fans off, load ~85-88 C/~2000-2500 RPM, matching
lenovo_wmi_other).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).
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).
WMAB implements only 5/6 (GFAN/SFAN): ten shared fan
levels in EC F101..F10A, the same transport as the T2CN below.
SFAN selects the FNT0 RPM row from the payload mode byte, so the
driver sends the live thermal mode (GetThermalMode, GZ44) and uses
the same mode for the RPM calibration; writes are rejected in extreme
mode, where WMAB 6 discards them. GFAN returns a static 1..10
placeholder in extreme mode.LENOVO_FAN_TABLE_DATA (WQA7 -> SFTW) exports the per-level RPM
ladders; level 1 is 0 RPM and keeps its index.WMAB 1..4 are missing, so fan_maxspeed is hidden and
fan_fullspeed uses Other Method WMAE (DEV 4 FEA 2 -> EC FFON),
gated behind custom power mode. Fan RPM and CPU/GPU temperature also
come from WMAE; the IC temperature is a constant 0 and is hidden.minifancurve and lockfancontroller are hidden (no backing EC
register on this firmware). The RGB keyboard stays on USB, as before.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.
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.
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.
WMAB implements 5/6 (GFAN/SFAN): a 10-entry fan table
(CFST[0..9], EC fields F101..F10A on \_SB.PCI0.LPC0.EC0). As on
82Y9 the speeds are fan levels (FAN_SPEED_UNIT_LEVEL) and only the
speed attributes are exposed (wmi_fancurve_speed_only).WMAD is a static Return (Zero) stub on this firmware; capability
probing does not depend on it.fan_fullspeed is gated
behind custom power mode. The extreme platform-profile choice stays
hidden, as on 82Y9.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.
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.
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.
| 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
# 1: enabled
# 0: disabled
# read
cat /sys/bus/platform/drivers/ideapad_acpi/VPC2004:00/fn_lock
echo 1 > /sys/bus/platform/drivers/ideapad_acpi/VPC2004:00/fn_lock
# set with software
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
# 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'
WMI
GUID: 8C5B9127-ECD4-4657-980F-851019F99CA5
Object ID: BA
Getting state
Method ID: 0x1
Setting state
Method ID: 0x2
# 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
# 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'
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
3 modes
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"
#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
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.
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.
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'
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
DTG1, CTG1 at 0xFE00D6C0 CTG2: calculated as constant from GTYP
short:
long:
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
git clone https://github.com/wilicc/gpu-burn
cd gpu-burn
docker build -t gpu_burn .
docker run --rm --gpus all gpu_burn
$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 ""
}
######################################## ######################################## ######################################## 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