To use Embedded Controller sensors for any fan reading in macOS, one must inject the EC controller identifier into LPC device via DeviceProperties
using the new ec-device
key. First, one needs to determine the LPC
device path, e.g. PciRoot(0x0)/Pci(0x1F,0x0)
, (standardised on all Intel chipsets, gfxutil can do that on other hardware) and then add the ec-device
property with the corresponding string value of the device model from the list below, e.g. Intel_EC_V1
as a string value. For a quick test, the ssioec
boot argument can also be used.
An example device injection for the Intel NUC 8 series:
<key>PciRoot(0x0)/Pci(0x1f,0x0)</key>
<dict>
<key>ec-device</key>
<string>Intel_EC_V8</string>
<key>model</key>
<string>Intel Corporation Coffee Lake Series LPC Controller</string>
</dict>
Note: Currently only Intel NUC hardware is supported.
This is a special type of EC driver available in DEBUG builds of SMCSuperIO. Instead of supporting particular hardware, it lets one probe the registers of any embedded controller and analyse its memory contents. This EC driver will provide FANs with values read from a particular memory region of the EC device memory. Each FAN represents one single byte:
- The memory region size (essentially the number of FANs) is controlled via
ssiowndsz
boot argument, default is 5. - The memory region starting byte is controlled via
ssiownd
boot argument, default is 0.
Debugger firstly tries to use MMIO mode and then falls back to PMIO mode on failure.
The PMIO mode supports up to 256 bytes of memory. MMIO mode supports up to 64 KBs of memory with the (usually 256 bytes) EC region mapped somewhere in the area.
The debug
driver dumps first 8 KBs of EC memory to the log to help to locate the mapped EC window in the MMIO mode.
This is another special type of EC driver available in SMCSuperIO to describe simple EC devices that report FANs via EC plainly. To use it in addition to ec-device
property one must additionally
inject other properties describing the amount of fans, their addresses, value sizes, and encoding. Currently the following properties are supported (all 32-bit numbers):
fan-count
— amount of fans, defaults to1
.fan0-addr
— 0 fan address, defaults to0
.fan0-size
— 0 fan size, defaults to1
, can be1
or2
.fan0-big
— 0 fan endianness, defaults to0
(little endian), can also be1
(big endian).fan0-inverse
— 0 fan is reported in inverse values (maximum value is off, minimum value is on), defaults to0
, normal mode.fan0-mul
— 0 fan speed multipler used to translate sensor values to RPM, defaults to1
, cannot be 0.fan0-div
— 0 fan speed divisor used to translate sensor values to RPM, defaults to1
, cannot be 0.fan0-dividend
— 0 fan speed dividend used to translate sensor values to RPM, unused when 0.
The effective formula is fan0-dividend / (val * fan0-mul / fan0-div)
or val * fan0-mul / fan0-div
when there is no dividend.
Use fan1-addr
for the second fan and so on.
-
MKKBLY35
Firmware:
Intel® Compute Card CD1M3128MK -
MKKBLi5v
Firmware:
Intel® Compute Card CD1IV128MK
AYAPLCEL
Firmware:
Intel® NUC 6 Kit NUC6CAYH
Intel® NUC 6 Kit NUC6CAYS
BNKBL357
Firmware:
Intel® NUC 7 Enthusiast Mini PC with Windows® 10 NUC7i7BNHXG
Intel® NUC 7 Enthusiast Mini PC with Windows® 10 NUC7i7BNKQ
Intel® NUC 7 Home Mini PC with Windows® 10 NUC7i3BNHXF
Intel® NUC 7 Home Mini PC with Windows® 10 NUC7i5BNHXF
Intel® NUC 7 Home Mini PC with Windows® 10 NUC7i5BNKP
Intel® NUC 7 Board NUC7i3BNB
Intel® NUC 7 Board NUC7i5BNB
Intel® NUC 7 Board NUC7i7BNB
Intel® NUC 7 Kit NUC7i3BNH
Intel® NUC 7 Kit NUC7i3BNHX1 with Intel® Optane™ Memory
Intel® NUC 7 Kit NUC7i3BNK
Intel® NUC 7 Kit NUC7i5BNH
Intel® NUC 7 Kit NUC7i5BNHX1 with Intel® Optane™ Memory
Intel® NUC 7 Kit NUC7i5BNK
Intel® NUC 7 Kit NUC7i7BNH
Intel® NUC 7 Kit NUC7i7BNHX1 with Intel® Optane™ Memory
CYCNLi35
Firmware:
Intel® NUC 8 Home Mini PC with Windows® 10 NUC8i3CYSM
Intel® NUC 8 Home Mini PC with Windows® 10 NUC8i3CYSN
HNKBLi70
Firmware:
Intel® NUC 8 Business Mini PC with Windows® 10 NUC8i7HNKQC
Intel® NUC 8 Enthusiast Mini PC with Windows® 10 NUC8i7HVKVA
Intel® NUC 8 Enthusiast Mini PC with Windows® 10 NUC8i7HVKVAW
Intel® NUC 8 Kit NUC8i7HNK
Intel® NUC 8 Kit NUC8i7HVK
-
DNKBLi7v
Firmware:
Intel® NUC 7 Board NUC7i7DNBE
Intel® NUC 7 Kit NUC7i7DNHE
Intel® NUC 7 Kit NUC7i7DNKE -
DNKBLi30
Firmware:
Intel® NUC 7 Business Mini PC with Windows® 10 Pro NUC7i3DNHNC
Intel® NUC 7 Business Mini PC with Windows® 10 Pro NUC7i3DNKTC
Intel® NUC 7 Board NUC7i3DNBE
Intel® NUC 7 Kit NUC7i3DNHE
Intel® NUC 7 Kit NUC7i3DNKE
JYGLKCPX
Firmware:
Intel® NUC 7 Essential Mini PC with Windows® 10 NUC7CJYSAL
Intel® NUC 7 Kit NUC7CJYH
Intel® NUC 7 Kit NUC7PJYH
BECFL357
Firmware:
Intel® NUC 8 Enthusiast Mini PC with Windows® 10 NUC8i7BEHGA
Intel® NUC 8 Enthusiast Mini PC with Windows® 10 NUC8i7BEKQA
Intel® NUC 8 Home Mini PC with Windows® 10 NUC8i3BEHFA
Intel® NUC 8 Home Mini PC with Windows® 10 NUC8i5BEHFA
Intel® NUC 8 Home Mini PC with Windows® 10 NUC8i5BEKPA
Intel® NUC 8 Kit NUC8i3BEH
Intel® NUC 8 Kit NUC8i3BEHS
Intel® NUC 8 Kit NUC8i3BEK
Intel® NUC 8 Kit NUC8i5BEH
Intel® NUC 8 Kit NUC8i5BEHS
Intel® NUC 8 Kit NUC8i5BEK
Intel® NUC Kit NUC8i7BEH
Intel® NUC Kit NUC8i7BEK
-
FNCML357
Firmware:
Intel® NUC 10 Performance Kit NUC10i3FNH
Intel® NUC 10 Performance Kit NUC10i3FNHF
Intel® NUC 10 Performance Kit NUC10i3FNK
Intel® NUC 10 Performance Kit NUC10i5FNH
Intel® NUC 10 Performance Kit NUC10i5FNHF
Intel® NUC 10 Performance Kit NUC10i5FNHJ
Intel® NUC 10 Performance Kit NUC10i5FNK
Intel® NUC 10 Performance Kit NUC10i5FNKP
Intel® NUC 10 Performance Kit NUC10i7FNH
Intel® NUC 10 Performance Kit NUC10i7FNHC
Intel® NUC 10 Performance Kit NUC10i7FNK
Intel® NUC 10 Performance Kit NUC10i7FNKP
Intel® NUC 10 Performance Mini PC NUC10i3FNHFA
Intel® NUC 10 Performance Mini PC NUC10i3FNHJA
Intel® NUC 10 Performance Mini PC NUC10i5FNHCA
Intel® NUC 10 Performance Mini PC NUC10i5FNHJA
Intel® NUC 10 Performance Mini PC NUC10i5FNKPA
Intel® NUC 10 Performance Mini PC NUC10i7FNHAA
Intel® NUC 10 Performance Mini PC NUC10i7FNHJA
Intel® NUC 10 Performance Mini PC NUC10i7FNKPA -
PNWHL357
Firmware:
Intel® NUC 8 Pro Board NUC8i3PNB
Intel® NUC 8 Pro Kit NUC8i3PNH
Intel® NUC 8 Pro Kit NUC8i3PNK -
PNWHLV57
Firmware:
No model references found. -
QNCFLX70
Firmware:
Intel® NUC 9 Pro Compute Element NUC9V7QNB
Intel® NUC 9 Pro Compute Element NUC9VXQNB
Intel® NUC 9 Pro Kit NUC9V7QNX
Intel® NUC 9 Pro Kit NUC9VXQNX -
QXCFL579
Firmware:
Intel® NUC 9 Extreme Compute Element NUC9i5QNB
Intel® NUC 9 Extreme Compute Element NUC9i7QNB
Intel® NUC 9 Extreme Compute Element NUC9i9QNB
Intel® NUC 9 Extreme Kit NUC9i5QNX
Intel® NUC 9 Extreme Kit NUC9i7QNX
Intel® NUC 9 Extreme Kit NUC9i9QNX -
CHAPLCEL
Firmware:
Intel® NUC 8 Rugged Kit NUC8CCHKR
Intel® NUC 8 Board NUC8CCHB -
CBWHL357
Firmware:
Intel® NUC 8 Compute Element CM8CCB
Intel® NUC 8 Compute Element CM8i3CB
Intel® NUC 8 Compute Element CM8i5CB
Intel® NUC 8 Compute Element CM8i7CB
Intel® NUC 8 Compute Element CM8PCB -
CBWHLMIV
Firmware:
Intel® NUC 8 Compute Element CM8v5CB
Intel® NUC 8 Compute Element CM8v7CB -
EBTGL357
Firmware:
Intel® NUC 11 Compute Element CM11EBC4W
Intel® NUC 11 Compute Element CM11EBi38W
Intel® NUC 11 Compute Element CM11EBi58W
Intel® NUC 11 Compute Element CM11EBi716W -
EBTGLMIV
Firmware:
Intel® NUC 11 Compute Element CM11EBv58W
Intel® NUC 11 Compute Element CM11EBv716W
-
PATGL357
Firmware:
Intel® NUC 11 Performance Kit NUC11PAHi3
Intel® NUC 11 Performance Kit NUC11PAHi5
Intel® NUC 11 Performance Kit NUC11PAHi7
Intel® NUC 11 Performance Kit NUC11PAKi3
Intel® NUC 11 Performance Kit NUC11PAKi5
Intel® NUC 11 Performance Kit NUC11PAKi7
Intel® NUC 11 Performance Mini PC NUC11PAQi50WA
Intel® NUC 11 Performance Mini PC NUC11PAQi70QA -
TNTGLV57
Firmware:
Intel® NUC 11 Pro Board NUC11TNBv5
Intel® NUC 11 Pro Board NUC11TNBv7
Intel® NUC 11 Pro Kit NUC11TNHv5
Intel® NUC 11 Pro Kit NUC11TNHv50L
Intel® NUC 11 Pro Kit NUC11TNHv7
Intel® NUC 11 Pro Kit NUC11TNHv70L
Intel® NUC 11 Pro Kit NUC11TNKv5
Intel® NUC 11 Pro Kit NUC11TNKv7
Intel® NUC 11 Pro Mini PC NUC11TNKv5
Intel® NUC 11 Pro Mini PC NUC11TNKv7 -
TNTGL357
Firmware:
Intel® NUC 11 Pro Board NUC11TNBi3
Intel® NUC 11 Pro Board NUC11TNBi5
Intel® NUC 11 Pro Board NUC11TNBi7
Intel® NUC 11 Pro Kit NUC11TNHi3
Intel® NUC 11 Pro Kit NUC11TNHi30L
Intel® NUC 11 Pro Kit NUC11TNHi30P
Intel® NUC 11 Pro Kit NUC11TNHi5
Intel® NUC 11 Pro Kit NUC11TNHi50L
Intel® NUC 11 Pro Kit NUC11TNHi50W
Intel® NUC 11 Pro Kit NUC11TNHi7
Intel® NUC 11 Pro Kit NUC11TNHi70L
Intel® NUC 11 Pro Kit NUC11TNHi70Q
Intel® NUC 11 Pro Kit NUC11TNKi3
Intel® NUC 11 Pro Kit NUC11TNKi5
Intel® NUC 11 Pro Kit NUC11TNKi7 -
PHTGL579
Firmware:
Intel® NUC 11 Enthusiast Kit NUC11PHKi7C
Intel® NUC 11 Enthusiast Mini PC NUC11PHKi7CAA
INWHL357
Firmware:
Intel® NUC 8 Mainstream-G Kit NUC8i5INH
Intel® NUC 8 Mainstream-G Kit NUC8i7INH
Intel® NUC 8 Mainstream-G Mini PC NUC8i5INH
Intel® NUC 8 Mainstream-G Mini PC NUC8i7INH
ec-device
="generic"
fan-count
=1
fan0-addr
=0xC3
fan0-size
=2
fan0-big
=0
Spoiler: EC RAM details
OperationRegion (ERAM, EmbeddedControl, Zero, 0xFF)
Field (ERAM, ByteAcc, NoLock, Preserve)
{
SMPR, 8, /* 00h */
SMST, 8, /* 01h */
SMAD, 8, /* 02h */
SMCM, 8, /* 03h */
SMD0, 256, /* 04h */
BCNT, 8, /* 24h */
SMAA, 8, /* 25h */
Offset (0x40),
SW2S, 1, /* 40h */
, 2,
ACCC, 1,
TRPM, 1,
Offset (0x41),
W7OS, 1, /* 41h */
QWOS, 1,
, 1,
SUSE, 1,
RFLG, 1,
, 1,
, 1,
Offset (0x42),
, 5, /* 42h */
UBOS, 1,
Offset (0x43),
, 1, /* 43h */
, 1,
ACPS, 1,
ACKY, 1,
GFXT, 1,
, 1,
, 1,
Offset (0x44),
, 7, /* 44h */
DSMB, 1,
GMSE, 1, /* 45h */
, 1,
QUAD, 1,
Offset (0x46),
Offset (0x47),
ADC4, 8, /* 47h */
ADC5, 8, /* 48h */
Offset (0x4C),
STRM, 8, /* 4Ch */
Offset (0x4E),
LIDE, 1, /* 4Eh */
Offset (0x50),
, 5, /* 50h */
DPTL, 1,
, 1,
DPTE, 1,
Offset (0x52),
ECLS, 1, /* 52h */
Offset (0x55),
EC45, 8, /* 55h */
Offset (0x58),
RTMP, 8, /* 58h */
ADC6, 8, /* 59h */
Offset (0x5E),
TMIC, 8, /* 5Eh */
Offset (0x61),
SHPM, 8, /* 61h */
ECTH, 8, /* 62h */
ECTL, 8, /* 63h */
Offset (0x67),
LDDG, 1, /* 67h */
, 1,
GC6R, 1,
IGC6, 1,
Offset (0x68),
, 3, /* 68h */
PLGS, 1,
Offset (0x69),
, 6, /* 69h */
BTVD, 1,
Offset (0x6C),
GWKR, 8, /* 6Ch */
Offset (0x70),
BADC, 16, /* 70h */
BFCC, 16, /* 72h */
BVLB, 8, /* 74h */
BVHB, 8, /* 75h */
BDVO, 8, /* 76h */
Offset (0x7F),
ECTB, 1, /* 7Fh */
Offset (0x82),
MBST, 8, /* 82h */
MCUR, 16, /* 83h */
MBRM, 16, /* 85h */
MBCV, 16, /* 87h */
VGAV, 8, /* 89h */
FGM2, 8, /* 8Ah */
FGM3, 8, /* 8Bh */
Offset (0x8D),
, 5, /* 8Dh */
MBFC, 1,
Offset (0x92),
Offset (0x93),
Offset (0x94),
GSSU, 1, /* 94h */
GSMS, 1,
Offset (0x95),
MMST, 4, /* 95h */
DMST, 4,
Offset (0xA0),
QBHK, 8, /* A0h */
Offset (0xA2),
QBBB, 8, /* A2h */
Offset (0xA4),
MBTS, 1, /* A4h */
MBTF, 1,
, 4,
AD47, 1,
BACR, 1,
MBTC, 1, /* A5h */
, 2,
MBNH, 1,
Offset (0xA6),
MBDC, 8, /* A6h */
Offset (0xA8),
EWDT, 1, /* A8h */
CWDT, 1,
LWDT, 1,
AWDT, 1,
Offset (0xAA),
, 1, /* AAh */
SMSZ, 1,
, 5,
RCDS, 1,
Offset (0xAD),
SADP, 8, /* ADh */
Offset (0xB2),
RPM1, 8, /* B2h <- actually not FAN RPM despite the name */
RPM2, 8, /* B3h <- actually not FAN RPM despite the name */
Offset (0xB7),
Offset (0xB8),
Offset (0xBA),
Offset (0xBB),
Offset (0xBC),
Offset (0xC1),
DPPC, 8, /* C1h */
Offset (0xC8),
, 1, /* C8h */
CVTS, 1,
Offset (0xC9),
TPVN, 8, /* C9h */
Offset (0xCE),
NVDX, 8, /* CEh */
ECDX, 8, /* CFh */
EBPL, 1, /* D0h */
Offset (0xD2),
, 7, /* D2h */
DLYE, 1,
Offset (0xD4),
PSHD, 8, /* D4h */
PSLD, 8, /* D5h */
DBPL, 8, /* D6h */
STSP, 8, /* D7h */
Offset (0xDA),
PSIN, 8, /* DAh */
PSKB, 1, /* DBh */
PSTP, 1,
, 1,
PWOL, 1,
RTCE, 1,
Offset (0xE0),
DLYT, 8, /* E0h */
DLY2, 8, /* E1h */
Offset (0xE5),
GP12, 8, /* E5h */
SFHK, 8, /* E6h */
Offset (0xE9),
DTMT, 8, /* E9h */
PL12, 8, /* EAh */
ETMT, 8, /* EBh */
Offset (0xF2),
ZPOD, 1, /* F2h */
, 4,
WLPW, 1,
WLPS, 1,
ENPA, 1,
Offset (0xF4),
SFAN, 8, /* F4h */
Offset (0xF8),
BAAE, 1, /* F8h */
S3WA, 1,
BNAC, 1,
, 1,
EFS3, 1,
S3WK, 1,
RSAL, 1
}
(DBG) 0000: 00 80 50 24 02 49 4F 4E 00 00 00 00 00 00 00 00
(DBG) 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(DBG) 0020: 00 00 00 00 0B 00 00 00 03 00 00 00 00 00 00 00
(DBG) 0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(DBG) 0040: 02 01 04 0C 04 44 00 2C 00 00 00 00 00 00 00 10
(DBG) 0050: 00 00 00 0F 00 05 00 00 43 2E 00 00 00 00 00 08
(DBG) 0060: 00 00 00 00 00 00 00 00 08 40 00 0C 00 0E 0E 00
(DBG) 0070: 1F 0E 07 0C 1E 2D 80 00 00 00 00 00 00 00 00 08
(DBG) 0080: 00 00 01 51 F7 81 07 AD 2B 00 00 00 00 C0 00 00
(DBG) 0090: 00 00 07 0C 05 00 3F E2 09 90 33 00 00 FE 0B 03
(DBG) 00A0: 03 80 00 10 01 00 00 48 00 15 00 00 00 04 1E 00
(DBG) 00B0: 00 00 00 00 00 3F 0E 00 00 00 00 07 3F 3D 67 61
(DBG) 00C0: 03 00 00 27 0B 00 00 00 00 47 00 00 00 00 D1 00
(DBG) 00D0: 3F 00 00 00 32 06 00 01 3F 00 1D 00 00 00 00 00
(DBG) 00E0: 00 00 50 50 42 00 00 00 00 5F 56 00 00 AA 00 00
(DBG) 00F0: 08 00 A2 00 00 00 00 08 00 00 31 35 33 32 30 30
Note: Found and tested by @1alessandro1. Only one fan header exists, so both fans will be reported in sync as a single fan as shown here.
ec-device
="generic"
fan-count
=2
fan0-addr
=0xB2
fan0-size
=2
fan0-big
=0
fan1-addr
=0xC3
fan1-size
=2
fan1-big
=0
Note: Found and tested by @zty199, with @1alessandro1's help. EC RAM details are exactly the same as HP Pavilion 14 CE2072NL, but one more fan connector exists on the motherboard.
ec-device
="generic"
fan-count
=2
fan0-addr
=0x2E
fan0-size
=1
fan0-big
=0
fan0-inverse
=1
fan0-mul
=BE
fan0-div
=11
fan1-addr
=0x35
fan1-size
=1
fan1-big
=0
fan1-inverse
=1
fan1-mul
=BE
fan1-div
=11
ec-device
=generic
fan-count
=1
fan0-addr
=0x2E
fan0-big
=0
fan0-div
=11
fan0-inverse
=1
fan0-mul
=BE
fan0-size
=1
ec-device
="generic"
fan-count
=2
fan0-addr
=0xB0
fan0-size
=2
fan0-big
=0
fan1-addr
=0xB2
fan1-size
=2
fan1-big
=0
Spoiler: EC RAM details
OperationRegion (ERAM, EmbeddedControl, Zero, 0xFF)
Field (ERAM, ByteAcc, NoLock, Preserve)
{
SMPR, 8,
SMST, 8,
SMAD, 8,
SMCM, 8,
SMD0, 256,
BCNT, 8,
SMAA, 8,
Offset (0x30),
BTPL, 8,
BTPH, 8,
BCLC, 8,
Offset (0x34),
SRP1, 8,
SRP2, 8,
Offset (0x40),
SW2S, 1,
, 2,
ACCC, 1,
TRPM, 1,
Offset (0x41),
W7OS, 1,
QWOS, 1,
, 1,
SUSE, 1,
RFLG, 1,
Offset (0x42),
, 4,
KBBL, 1,
Offset (0x43),
, 1,
, 1,
ACPS, 1,
ACKY, 1,
GFXT, 1,
Offset (0x44),
, 7,
DSMB, 1,
Offset (0x47),
TNT2, 8,
TNT3, 8,
TNT4, 8,
IRSN, 8,
TNT5, 8,
STRM, 8,
Offset (0x4E),
LIDE, 1,
Offset (0x4F),
Offset (0x50),
, 2,
PTHM, 1,
, 1,
BSEV, 1,
DPTL, 1,
IHEF, 1,
Offset (0x52),
ECLS, 1,
Offset (0x55),
EC45, 8,
TPL4, 8,
Offset (0x58),
RTMP, 8,
TNT1, 8,
Offset (0x5B),
HPTC, 8,
Offset (0x5F),
, 1,
Offset (0x61),
SHPM, 8,
OMCC, 1,
Offset (0x67),
LDBG, 1,
, 1,
GC6R, 1,
IGC6, 1,
, 3,
HDNK, 1,
, 3,
PLGS, 1,
Offset (0x69),
, 4,
BCTF, 1,
BMNF, 1,
BTVD, 1,
BF10, 1,
Offset (0x6C),
GWKR, 8,
Offset (0x70),
BADC, 16,
BFCC, 16,
BVLB, 8,
BVHB, 8,
BDVO, 8,
Offset (0x7F),
ECTB, 1,
Offset (0x82),
MBST, 8,
MCUR, 16,
MBRM, 16,
MBCV, 16,
GPUT, 8,
Offset (0x8B),
LEDM, 3,
Offset (0x8D),
, 5,
MBFC, 1,
Offset (0x90),
NVDO, 8,
ECDO, 8,
Offset (0x94),
GSSU, 1,
GSMS, 1,
Offset (0x95),
HPCM, 8,
Offset (0xA0),
QBHK, 8,
Offset (0xA2),
QBBB, 8,
Offset (0xA4),
MBTS, 1,
, 6,
BACR, 1,
Offset (0xA6),
MBDC, 8,
Offset (0xA8),
ENWD, 1,
TMPR, 1,
Offset (0xAA),
, 1,
SMSZ, 1,
SE1N, 1,
SE2N, 1,
SOIE, 1,
, 2,
RCDS, 1,
Offset (0xAD),
SADP, 8,
Offset (0xB0),
RPM1, 8, /* 0xB0, FAN0 RPM Address */
RPM2, 8,
RPM3, 8, /* 0xB2, FAN1 RPM Address */
RPM4, 8,
Offset (0xB7),
DGTP, 8,
Offset (0xBA),
CLOW, 8,
CMAX, 8,
Offset (0xC1),
DPPC, 8,
Offset (0xC5),
SHB1, 1,
SHB2, 1,
SHB3, 1,
SHB4, 1,
SHOK, 1,
SHFL, 1,
SHNP, 1,
SHEN, 1,
, 1,
CVTS, 1,
Offset (0xD0),
EBPL, 1,
Offset (0xD2),
S1A1, 8,
S2A1, 8,
PSHD, 8,
PSLD, 8,
DBPL, 8,
STSP, 8,
Offset (0xDA),
PSIN, 8,
PSKB, 1,
PSTP, 1,
, 1,
PWOL, 1,
RTCE, 1,
Offset (0xDC),
S1A0, 8,
S2A0, 8,
NVDX, 8,
ECDX, 8,
DLYT, 8,
DLY2, 8,
KBT0, 8,
Offset (0xE6),
SFHK, 8,
Offset (0xE9),
DTMT, 8,
PL12, 8,
ETMT, 8,
COLM, 1,
FFFF, 1,
FFFS, 1,
Offset (0xF2),
ZPDD, 1,
, 6,
ENPA, 1,
Offset (0xF4),
SFAN, 8,
Offset (0xF8),
NVDS, 1,
NVPM, 1,
Offset (0xF9),
, 7,
FTHM, 1
}
Method (GM2D, 0, NotSerialized)
{
Debug = "HP WMI Command type 0x2D for WMI 20008h command"
WSMI (0x00020008, 0x2D, Zero, 0x80, Zero)
Local0 = Package (0x03)
{
Zero,
0x80,
Buffer (0x80)
{
0x00 // .
}
}
If ((^^PCI0.LPCB.EC0.ECOK == One))
{
Local1 = ^^PCI0.LPCB.EC0.RPM2 /* \_SB_.PCI0.LPCB.EC0_.RPM2 */
Local1 <<= 0x08
Local1 += ^^PCI0.LPCB.EC0.RPM1 /* \_SB_.PCI0.LPCB.EC0_.RPM1 */
Divide (Local1, 0x64, Local2, Local3)
DerefOf (Local0 [0x02]) [Zero] = Local3
Local1 = ^^PCI0.LPCB.EC0.RPM4 /* \_SB_.PCI0.LPCB.EC0_.RPM4 */
Local1 <<= 0x08
Local1 += ^^PCI0.LPCB.EC0.RPM3 /* \_SB_.PCI0.LPCB.EC0_.RPM3 */
Divide (Local1, 0x64, Local2, Local3)
DerefOf (Local0 [0x02]) [One] = Local3
}
Return (Local0)
}
Method (FRSP, 0, NotSerialized)
{
Local2 = Zero
If ((\_SB.PCI0.LPCB.EC0.ECOK == One))
{
Local0 = \_SB.PCI0.LPCB.EC0.RPM1
Local1 = \_SB.PCI0.LPCB.EC0.RPM2
Local1 <<= 0x08
Local0 |= Local1
If ((Local0 != Zero))
{
Divide (0x00075300, Local0, Local0, Local2)
}
}
Return (Local2)
}
ec-device
="generic"
fan-count
=2
fan0-addr
=0xD0
fan0-size
=2
fan0-big
=1
fan0-dividend
=0x20E6BC
fan1-addr
=0xD2
fan1-size
=2
fan1-big
=1
fan1-dividend
=0x20E6BC
Spoiler: EC RAM details
OperationRegion (RAM, SystemMemory, 0xFF700100, 0x0100)
Field (RAM, ByteAcc, Lock, Preserve)
{
NMSG, 8,
SLED, 4,
Offset (0x02),
MODE, 1,
FAN0, 1,
TME0, 1,
TME1, 1,
FAN1, 1,
, 2,
Offset (0x03),
LSTE, 1,
LSW0, 1,
LWKE, 1,
WAKF, 1,
, 2,
PWKE, 1,
MWKE, 1,
AC0, 8,
PSV, 8,
CRT, 8,
TMP, 8,
AC1, 8,
BBST, 8,
Offset (0x0B),
Offset (0x0C),
Offset (0x0D),
Offset (0x0E),
SLPT, 8,
SWEJ, 1,
SWCH, 1,
Offset (0x10),
ADP, 1,
AFLT, 1,
BAT0, 1,
BAT1, 1,
, 3,
PWOF, 1,
WFNO, 8,
BPU0, 32,
BDC0, 32,
BFC0, 32,
BTC0, 32,
BDV0, 32,
BST0, 32,
BPR0, 32,
BRC0, 32,
BPV0, 32,
BTP0, 16,
BRS0, 16,
BCW0, 32,
BCL0, 32,
BCG0, 32,
BG20, 32,
BMO0, 64,
BIF0, 64,
BSN0, 32,
BTY0, 64,
Offset (0x67),
Offset (0x68),
ECOS, 8,
LNXD, 8,
ECPS, 8,
Offset (0x6C),
BTMP, 16,
EVTN, 8,
Offset (0x72),
PRCL, 8,
PRC0, 8,
PRC1, 8,
PRCM, 8,
PRIN, 8,
PSTE, 8,
PCAD, 8,
PEWL, 8,
PWRL, 8,
PECD, 8,
PEHI, 8,
PECI, 8,
PEPL, 8,
PEPM, 8,
PWFC, 8,
PECC, 8,
PDT0, 8,
PDT1, 8,
PDT2, 8,
PDT3, 8,
PRFC, 8,
PRS0, 8,
PRS1, 8,
PRS2, 8,
PRS3, 8,
PRS4, 8,
PRCS, 8,
PEC0, 8,
PEC1, 8,
PEC2, 8,
PEC3, 8,
CMDR, 8,
CVRT, 8,
GTVR, 8,
FANT, 8,
SKNT, 8,
AMBT, 8,
MCRT, 8,
DIM0, 8,
DIM1, 8,
PMAX, 8,
PPDT, 8,
PECH, 8,
PMDT, 8,
TSD0, 8,
TSD1, 8,
TSD2, 8,
TSD3, 8,
CPUP, 16,
MCHP, 16,
SYSP, 16,
CPAP, 16,
MCAP, 16,
SYAP, 16,
CFSP, 16,
CPUE, 16,
Offset (0xC6),
Offset (0xC7),
VGAT, 8,
OEM1, 8,
OEM2, 8,
OEM3, 16,
OEM4, 8,
Offset (0xCE),
DUT1, 8, /* 0xCE */
DUT2, 8, /* 0xCF */
RPM1, 16, /* 0xD0 CPU FAN RPM Address */
RPM2, 16, /* 0xD2 GPU FAN RPM Address */
RPM4, 16,
Offset (0xD7),
DTHL, 8,
DTBP, 8,
AIRP, 8,
WINF, 8,
RINF, 8,
Offset (0xDD),
INF2, 8,
MUTE, 1,
Offset (0xE0),
RPM3, 16,
ECKS, 8,
Offset (0xE4),
, 4,
XTUF, 1,
EP12, 1,
Offset (0xE5),
INF3, 8,
Offset (0xE7),
XFAN, 8,
Offset (0xF0),
PL1T, 16,
PL2T, 16,
TAUT, 8
}
ec-device
="generic"
fan-count
=1
fan0-addr
=0x93
fan0-big
=0
fan0-div
=1
fan0-dividend
=0x41CDB4
fan0-inverse
=0
fan0-mul
=2
fan0-size
=2
Spoiler: EC RAM details
OperationRegion (ECOR, EmbeddedControl, Zero, 0xFF)
Field (ECOR, ByteAcc, Lock, Preserve)
{
Offset (0x04),
CMD1, 8,
CDT1, 8,
CDT2, 8,
CDT3, 8,
Offset (0x80),
Offset (0x81),
Offset (0x82),
Offset (0x83),
EB0R, 8,
EB1R, 8,
EPWF, 8,
Offset (0x87),
Offset (0x88),
Offset (0x89),
Offset (0x8A),
HKEN, 1,
Offset (0x93),
TAH0, 16, /* 0x93, FAN0 RPM Address */
TAH1, 16,
TSTP, 8,
Offset (0x9C),
CDT4, 8,
CDT5, 8,
Offset (0xA0),
Offset (0xA1),
Offset (0xA2),
Offset (0xA3),
EACT, 8,
TH1R, 8,
TH1L, 8,
TH0R, 8,
TH0L, 8,
Offset (0xB0),
B0PN, 16,
Offset (0xB4),
Offset (0xB6),
Offset (0xB8),
Offset (0xBA),
Offset (0xBC),
Offset (0xBE),
B0TM, 16,
B0C1, 16,
B0C2, 16,
B0C3, 16,
B0C4, 16,
Offset (0xD0),
B1PN, 16,
Offset (0xD4),
Offset (0xD6),
Offset (0xD8),
Offset (0xDA),
Offset (0xDC),
Offset (0xDE),
B1TM, 16,
B1C1, 16,
B1C2, 16,
B1C3, 16,
B1C4, 16,
Offset (0xF0),
Offset (0xF2),
Offset (0xF4),
B0SN, 16,
Offset (0xF8),
Offset (0xFA),
Offset (0xFC),
B1SN, 16
}
(List compiled by @MacKonsti proudly assisting @vit9696)
ec-device
=generic
fan-count
=1
fan0-addr
=0x95
fan0-big
=1
fan0-div
=11
fan0-inverse
=1
fan0-mul
=F0
fan0-size
=1
Spoiler: EC RAM details
OperationRegion (ECMB, SystemMemory, 0xFE802000, 0x0200)
OperationRegion (RAM, EmbeddedControl, Zero, 0xFF)
Field (RAM, ByteAcc, Lock, Preserve)
{
Offset (0x0A),
, 1,
BLNK, 1,
Offset (0x0B),
Offset (0x10),
, 1,
KTEE, 1,
Offset (0x11),
KPPS, 1,
Offset (0x13),
URTB, 8,
Offset (0x4E),
SCID, 8,
Offset (0x53),
PNID, 8,
Offset (0x5C),
OSTP, 8,
Offset (0x72),
, 2,
KEYW, 1,
RTCW, 1,
LIDW, 1,
BL2W, 1,
TPDW, 1,
Offset (0x76),
SYSC, 4,
SYSO, 4,
Offset (0x90),
SCPM, 1,
Offset (0x91),
TTID, 8,
KTAF, 8
}
Field (RAM, ByteAcc, Lock, Preserve)
{
Offset (0x7F),
BNEN, 1,
BNCM, 1,
BNDM, 1,
BNVE, 1,
Offset (0x87),
BNVA, 8
}
Method (RDEC, 1, Serialized)
{
If (ECON)
{
OperationRegion (ECRM, EmbeddedControl, Arg0, One)
Field (ECRM, ByteAcc, Lock, Preserve)
{
ECRB, 8
}
Return (ECRB) /* \_SB_.PCI0.LPCB.EC__.RDEC.ECRB */
}
Else
{
Return (RBEC (Arg0))
}
}
Field (RAM, ByteAcc, Lock, Preserve)
{
Offset (0x92),
KCSS, 1,
KCTT, 1,
KDTT, 1,
KOSD, 1,
KVTP, 1
}
Field (RAM, ByteAcc, Lock, Preserve)
{
Offset (0x01),
TIID, 8,
Offset (0x17),
SMCS, 8,
SMPR, 8,
SMST, 8,
SMAR, 8,
SMCM, 8,
SD00, 8,
SD01, 8,
SD02, 8,
SD03, 8,
SD04, 8,
SD05, 8,
SD06, 8,
SD07, 8,
SD08, 8,
SD09, 8,
SD10, 8,
SD11, 8,
SD12, 8,
SD13, 8,
SD14, 8,
SD15, 8,
SD16, 8,
SD17, 8,
SD18, 8,
SD19, 8,
SD20, 8,
SD21, 8,
SD22, 8,
SD23, 8,
SD24, 8,
SD25, 8,
SD26, 8,
SD27, 8,
SD28, 8,
SD29, 8,
SD30, 8,
SD31, 8,
SMBC, 8,
Offset (0x50),
LBBM, 1,
BNBM, 1,
CSBM, 1,
OPBM, 1,
ROBM, 1,
Offset (0x51),
DCTL, 8,
GWSS, 1,
GWHC, 1,
HDPR, 1,
DGPU, 1,
TVEC, 1,
, 2,
ASPL, 1,
Offset (0x54),
CAMC, 1,
OTBP, 1,
, 1,
GFXL, 1,
OPEH, 1,
OPSE, 1,
Offset (0x55),
CBST, 8,
Offset (0x57),
, 1,
SMBM, 1,
, 1,
RSBM, 1,
Offset (0x58),
LSEN, 8,
Offset (0x61),
MBNG, 1,
SBNG, 1,
Offset (0x62),
BLTM, 8,
ODPS, 8,
Offset (0x65),
SVCU, 1,
, 1,
AMCB, 1,
Offset (0x66),
ZPOF, 1,
Offset (0x68),
BFUR, 1,
BAAU, 1,
BFUP, 1,
BFUF, 1,
BFUS, 1,
Offset (0x69),
DUST, 8,
Offset (0x71),
WLEN, 1,
BTEN, 1,
, 1,
MUTE, 1,
KBID, 3,
USBP, 1,
Offset (0x73),
WWAN, 1,
Offset (0x74),
CRLW, 1,
PS2K, 1,
PS2M, 1,
TPEN, 1,
CHGE, 1,
INTK, 1,
Offset (0x75),
SWBL, 1,
, 1,
, 1,
, 1,
, 1,
, 1,
BLST, 1,
Offset (0x76),
Offset (0x82),
BMAC, 4,
BMDC, 4,
BNAC, 4,
BNDC, 4,
Offset (0x95),
FANS, 8,
Offset (0xBA),
ICPU, 8,
Offset (0xD0),
TMH0, 8,
Offset (0xD2),
TMH1, 8,
Offset (0xD4),
TMH2, 8,
Offset (0xD6),
TMH3, 8,
Offset (0xD8),
TMH4, 8,
Offset (0xDA),
TMH5, 8,
Offset (0xDC),
TMH6, 8,
TMH7, 8
}
</details>
_Note_: Found and tested by @mjs520