ec: Add Star Labs ITE 8987E support
Support for Star Labs labtop series EC Signed-off-by: Sean Rhodes <sean@starlabs.systems> Change-Id: I1967f7c4a7e3cab714f22844bf36749e0c9652b6 Reviewed-on: https://review.coreboot.org/c/coreboot/+/52797 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
This commit is contained in:
parent
cbd2abf9b4
commit
2d89789337
|
@ -0,0 +1,7 @@
|
|||
## SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
config EC_STARLABS_IT8987
|
||||
bool
|
||||
select EC_ACPI
|
||||
help
|
||||
Interface to IT8987 embedded controller principally in Star Labs notebooks.
|
|
@ -0,0 +1,26 @@
|
|||
## SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
PHONY+=add_ite_fw
|
||||
INTERMEDIATE+=add_ite_fw
|
||||
|
||||
ifeq ($(CONFIG_EC_STARLABS_IT8987),y)
|
||||
all-y += ec.c
|
||||
smm-$(CONFIG_DEBUG_SMI) += ec.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_EC_STARLABS_IT8987_BIN),y)
|
||||
|
||||
ifeq ($(CONFIG_EC_STARLABS_IT8987_BIN_PATH),)
|
||||
files_added:: warn_no_ite_fw
|
||||
endif
|
||||
|
||||
add_ite_fw: $(obj)/coreboot.pre
|
||||
$(CBFSTOOL) $(obj)/coreboot.pre write -r EC -f $(CONFIG_EC_STARLABS_IT8987_BIN_PATH) -u
|
||||
endif
|
||||
|
||||
PHONY+=warn_no_ite_fw
|
||||
warn_no_ite_fw:
|
||||
printf "\n\t** WARNING **\n"
|
||||
printf "coreboot has been built without the IT8987 EC Firmware.\n"
|
||||
printf "Do not flash this image. Your LabTop Mk IV's power button\n"
|
||||
printf "may not respond when you press it.\n\n"
|
|
@ -0,0 +1,60 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
Device (ADP1)
|
||||
{
|
||||
Name (_HID, "ACPI0003")
|
||||
Name (_PCL, Package () { \_SB })
|
||||
|
||||
Method (_STA, 0, NotSerialized) // _STA: Status
|
||||
{
|
||||
If (ECON == 1)
|
||||
{
|
||||
Local0 = 0x0F
|
||||
}
|
||||
Else
|
||||
{
|
||||
Local0 = 0
|
||||
}
|
||||
Return (Local0)
|
||||
}
|
||||
|
||||
Method (_PSR, 0, NotSerialized) // _PSR: Power Source
|
||||
{
|
||||
If (ECWR & 0x01)
|
||||
{
|
||||
\PWRS = 1
|
||||
}
|
||||
Else
|
||||
{
|
||||
\PWRS = 0
|
||||
}
|
||||
Return (\PWRS)
|
||||
}
|
||||
}
|
||||
|
||||
Method (_QA0, 0, NotSerialized) // AC Power Connected
|
||||
{
|
||||
If (ECWR & 0x01)
|
||||
{
|
||||
\PWRS = 1
|
||||
}
|
||||
Else
|
||||
{
|
||||
\PWRS = 0
|
||||
}
|
||||
|
||||
// 500ms delay - Not used in coreboot
|
||||
// Sleep (500)
|
||||
Notify (BAT0, 0x81)
|
||||
// Sleep (500)
|
||||
Notify (ADP1, 0x80)
|
||||
}
|
||||
|
||||
Method(_Q0B, 0, NotSerialized) // Battery Connected
|
||||
{
|
||||
// 500ms delay - Not used in coreboot
|
||||
// Sleep (500)
|
||||
Notify (BAT0, 0x81)
|
||||
// Sleep (500)
|
||||
Notify (BAT0, 0x80)
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
Device (BAT0)
|
||||
{
|
||||
Name (_HID, EISAID ("PNP0C0A"))
|
||||
Name (_UID, 1)
|
||||
Name (_PCL, Package () { \_SB })
|
||||
|
||||
// Battery Slot Status
|
||||
Method (_STA, 0, Serialized)
|
||||
{
|
||||
If (ECWR & 0x02)
|
||||
{
|
||||
Return (0x1F)
|
||||
}
|
||||
Return (0x0F)
|
||||
}
|
||||
|
||||
// Default Static Battery Information
|
||||
Name (BPKG, Package (13)
|
||||
{
|
||||
1, // 0: Power Unit
|
||||
0xFFFFFFFF, // 1: Design Capacity
|
||||
0xFFFFFFFF, // 2: Last Full Charge Capacity
|
||||
1, // 3: Battery Technology(Rechargeable)
|
||||
0xFFFFFFFF, // 4: Design Voltage 10.8V
|
||||
0, // 5: Design capacity of warning
|
||||
0, // 6: Design capacity of low
|
||||
0x64, // 7: Battery capacity granularity 1
|
||||
0, // 8: Battery capacity granularity 2
|
||||
"CN6613-2S3P", // 9: Model Number
|
||||
"6UA3", // 10: Serial Number
|
||||
"Real", // 11: Battery Type
|
||||
"GDPT" // 12: OEM Information
|
||||
})
|
||||
|
||||
Method (_BIF, 0, Serialized)
|
||||
{
|
||||
BPKG[1] = B1DC
|
||||
BPKG[2] = B1FC
|
||||
BPKG[4] = B1FV
|
||||
If (B1FC)
|
||||
{
|
||||
BPKG[5] = B1FC / 10
|
||||
BPKG[6] = B1FC / 25
|
||||
BPKG[7] = B1DC / 100
|
||||
}
|
||||
|
||||
Return (BPKG)
|
||||
}
|
||||
|
||||
Name (PKG1, Package (4)
|
||||
{
|
||||
0xFFFFFFFF, // Battery State
|
||||
0xFFFFFFFF, // Battery Present Rate
|
||||
0xFFFFFFFF, // Battery Remaining Capacity
|
||||
0xFFFFFFFF, // Battery Present Voltage
|
||||
})
|
||||
|
||||
Method (_BST, 0, Serialized)
|
||||
{
|
||||
|
||||
|
||||
PKG1[0] = B1ST & 0x07
|
||||
If (B1ST & 0x01)
|
||||
{
|
||||
PKG1[1] = B1CR
|
||||
}
|
||||
Else
|
||||
{
|
||||
PKG1[1] = B1CR
|
||||
}
|
||||
PKG1[2] = B1RC
|
||||
PKG1[3] = B1VT
|
||||
Return (PKG1)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
OperationRegion (CMOS, SystemIO, 0x70, 0x02)
|
||||
Field (CMOS, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
NVRI, 8,
|
||||
NVRD, 8
|
||||
}
|
||||
|
||||
IndexField (NVRI, NVRD, ByteAcc, NoLock, Preserve)
|
||||
{
|
||||
Offset (0x40),
|
||||
KBBL, 8, // Keyboard backlight timeout
|
||||
FNSW, 8, // Ctrl Fn Reverse (make keyboard Apple-like)
|
||||
|
||||
Offset (0x7D),
|
||||
FNLC, 8 // Current state of Fn Lock key.
|
||||
}
|
|
@ -0,0 +1,379 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#define ASL_PVOL_DEFOF_NUM 0xe8
|
||||
|
||||
Scope(\)
|
||||
{
|
||||
// These fields come from the Global NVS area
|
||||
Field (GNVS,AnyAcc,Lock,Preserve)
|
||||
{
|
||||
Offset(33),
|
||||
B2SC, 8, // (33) Battery 2 Stored Capacity
|
||||
Offset(36),
|
||||
B2SS, 8 // (36) Battery 2 Stored Status
|
||||
}
|
||||
}
|
||||
|
||||
Scope (\_SB)
|
||||
{
|
||||
#include "hid.asl"
|
||||
}
|
||||
|
||||
Scope (\_SB.PCI0)
|
||||
{
|
||||
// Add the entries for the PS/2 keyboard and mouse.
|
||||
#include <drivers/pc80/pc/ps2_controller.asl>
|
||||
}
|
||||
|
||||
Scope (\_SB.PCI0.LPCB)
|
||||
{
|
||||
// Include the definitions for accessing CMOS.
|
||||
#include "cmos.asl"
|
||||
|
||||
// Our embedded controller device.
|
||||
Device (H_EC)
|
||||
{
|
||||
Name (_HID, EISAID ("PNP0C09")) // ACPI Embedded Controller
|
||||
Name (_UID, 1)
|
||||
Name (_GPE, EC_GPE_SCI)
|
||||
|
||||
// ECDT (Embedded Controller Boot Resources Table) Check to correct
|
||||
// ECAV flag in the beginning
|
||||
Name(ECTK, 1)
|
||||
Name(ECFG, 0)
|
||||
Name(WIBT, 0)
|
||||
Name(APST, 0)
|
||||
|
||||
Name(ECON, 1) // AC debug
|
||||
Name(BNUM, 0) // Number Of Batteries Present
|
||||
Name(PVOL, ASL_PVOL_DEFOF_NUM)
|
||||
Name(B1CC, 0)
|
||||
Name(B2CC, 0)
|
||||
|
||||
Name(B2ST, 0)
|
||||
Name(CFAN, 0)
|
||||
Name(CMDR, 0)
|
||||
Name(DOCK, 0)
|
||||
Name(EJET, 0)
|
||||
Name(MCAP, 0)
|
||||
Name(PLMX, 0)
|
||||
Name(PECH, 0)
|
||||
Name(PECL, 0)
|
||||
Name(PENV, 0)
|
||||
Name(PINV, 0)
|
||||
Name(PPSH, 0)
|
||||
Name(PPSL, 0)
|
||||
Name(PSTP, 0)
|
||||
Name(RPWR, 0)
|
||||
Name(LIDS, 0)
|
||||
Name(SLPC, 0)
|
||||
Name(VPWR, 0)
|
||||
Name(WTMS, 0)
|
||||
Name(AWT2, 0)
|
||||
Name(AWT1, 0)
|
||||
Name(AWT0, 0)
|
||||
Name(DLED, 0)
|
||||
Name(IBT1, 0)
|
||||
Name(ECAV, 1) // Support DPTF feature
|
||||
Name(SPT2, 0)
|
||||
Name(PB10, 0)
|
||||
Name(IWCW, 0)
|
||||
Name(IWCR, 0)
|
||||
Name(BTEN, 0)
|
||||
Mutex(ECMT, 0)
|
||||
|
||||
Method (_CRS, 0, Serialized)
|
||||
{
|
||||
Name (BFFR, ResourceTemplate()
|
||||
{
|
||||
IO (Decode16, 0x62, 0x62, 0x00, 0x01)
|
||||
IO (Decode16, 0x66, 0x66, 0x00, 0x01)
|
||||
})
|
||||
Return (BFFR)
|
||||
}
|
||||
|
||||
Method (_STA, 0, NotSerialized)
|
||||
{
|
||||
If ((ECON == 1))
|
||||
{
|
||||
Return (0x0F)
|
||||
}
|
||||
|
||||
Return (0x00)
|
||||
}
|
||||
|
||||
Name (ECOK, Zero)
|
||||
Method(_REG, 2, NotSerialized)
|
||||
{
|
||||
If ((Arg0 == 0x03) && (Arg1 == 0x01))
|
||||
{
|
||||
ECOS = 1
|
||||
ECAV = 1
|
||||
|
||||
// Unconditionally fix up the Battery and Power State.
|
||||
|
||||
// Initialize the Number of Present Batteries.
|
||||
// 1 = Real Battery 1 is present
|
||||
// 2 = Real Battery 2 is present
|
||||
// 3 = Real Battery 1 and 2 are present
|
||||
BNUM = 0
|
||||
BNUM |= ((ECRD (RefOf (ECWR)) & 0x02) >> 1)
|
||||
|
||||
// Save the current Power State for later.
|
||||
// Store (PWRS, Local0)
|
||||
|
||||
// Initialize the Power State.
|
||||
// BNUM = 0 = Virtual Power State
|
||||
// BNUM > 0 = Real Power State
|
||||
If (BNUM == 0x00)
|
||||
{
|
||||
\PWRS = ECRD (RefOf (VPWR))
|
||||
}
|
||||
Else
|
||||
{
|
||||
\PWRS = (ECRD (RefOf (ECWR)) & 0x01)
|
||||
}
|
||||
PNOT()
|
||||
|
||||
/* Initialize LID switch state */
|
||||
\LIDS = LIDS
|
||||
}
|
||||
|
||||
// Flag that the OS supports ACPI.
|
||||
\_SB.PCI0.LPCB.H_EC.ECOS = 1
|
||||
}
|
||||
|
||||
Name (S3OS, Zero)
|
||||
Method (PTS, 1, Serialized)
|
||||
{
|
||||
Debug = Concatenate("EC: PTS: ", ToHexString(Arg0))
|
||||
If (ECOK) {
|
||||
S3OS = ECOS
|
||||
}
|
||||
\_SB.PCI0.LPCB.H_EC.ECOS = 0
|
||||
}
|
||||
|
||||
Method (WAK, 1, Serialized)
|
||||
{
|
||||
Debug = Concatenate("EC: WAK: ", ToHexString(Arg0))
|
||||
If (ECOK) {
|
||||
ECOS = S3OS
|
||||
}
|
||||
\_SB.PCI0.LPCB.H_EC.ECOS = 1
|
||||
}
|
||||
|
||||
OperationRegion (SIPR, SystemIO, 0xB2, 0x1)
|
||||
Field (SIPR, ByteAcc, Lock, Preserve)
|
||||
{
|
||||
SMB2, 8
|
||||
}
|
||||
|
||||
// EC RAM fields
|
||||
OperationRegion(ECF2, EmbeddedControl, 0, 0xFF)
|
||||
Field (ECF2, ByteAcc, Lock, Preserve)
|
||||
{
|
||||
XXX0, 8, // EC Firmware main- version number.
|
||||
XXX1, 8, // EC Firmware sub- version number.
|
||||
XXX2, 8, // EC Firmware test- version number.
|
||||
|
||||
Offset(0x06),
|
||||
SKID, 8, // SKU ID
|
||||
|
||||
Offset(0x11),
|
||||
KBCD, 8, // Key / Touch Pad disable/enable bit
|
||||
ECOS, 8, // Enter OS flag
|
||||
HDAO, 8,
|
||||
ECHK, 8, // Hot keys flag
|
||||
|
||||
Offset(0x18),
|
||||
KLBS, 8, // Keyboard backlight begin.
|
||||
KLBE, 8, // Keyboard backlight status.
|
||||
|
||||
Offset(0x1A),
|
||||
KBLT, 8, // Keyboard Backlight Timeout
|
||||
PWPF, 8, // Power Profile
|
||||
|
||||
Offset(0x1E),
|
||||
BTHP,8, // Health Battery Percentage
|
||||
|
||||
Offset(0x20),
|
||||
RCMD, 8, // Same function as IO 66 port to send EC command
|
||||
RCST, 8, // Report status for the result of command execution
|
||||
|
||||
Offset(0x2C),
|
||||
FNST, 8, // FN LOCK key status.
|
||||
|
||||
Offset(0x3F),
|
||||
SFAN, 8, // Set Fan Speed.
|
||||
BTMP, 16, // Battery Temperature.
|
||||
BCNT, 16, // Battery Cycle Count.
|
||||
FRMP, 16, // Fan Current Speed.
|
||||
|
||||
Offset(0x60),
|
||||
TSR1, 8, // Thermal Sensor Register 1 [CPU VR (IMVP) Temp on RVP]
|
||||
TSR2, 8, // Thermal Sensor Register 2 [Heat exchanger fan temp on RVP]
|
||||
TER4, 8, // Thermal Sensor Register 3 (skin temperature)
|
||||
|
||||
Offset(0x63),
|
||||
TSI,4, // [0..3] 0 = SEN1 - CPU VR temperature sensor
|
||||
// 1 = SEN2 - Heat Exchanger temperature sensor
|
||||
// 2 = SEN3 - Skin temperature sensor
|
||||
// 3 = SEN4 - Ambient temperature sensor
|
||||
// 4 = SEN5 - DIMM temperature sensor [IR sensor 1 on WSB]
|
||||
// 5 = SEN6 - not used on RVP
|
||||
HYST, 4, // [4..7] - Hysteresis in degC.
|
||||
TSHT, 8, // Thermal Sensor (N) high trip point(set default value =70)
|
||||
TSLT, 8, // Thermal Sensor (N) low trip point (set default value =70)
|
||||
TSSR, 8, // TSSR- thermal sensor status register (set bit2 =1)
|
||||
// BIT0:SEN1 - CPU VR Temp Sensor Trip Flag
|
||||
// BIT1:SEN2 - Fan Temp Sensor Trip Flag
|
||||
// BIT2:SEN3 - Skin Temp Sensor Trip Flag
|
||||
// BIT3:SEN4 - Ambient Temp Sensor Trip Flag
|
||||
// BIT4:Reserved
|
||||
// BIT5:Reserved
|
||||
// BIT6:Reserved
|
||||
// BIT7:Reserved
|
||||
CHGR, 16, // Charge Rate
|
||||
|
||||
Offset(0x70),
|
||||
CPTM, 8, // CPU Temperature
|
||||
|
||||
Offset(0x72),
|
||||
TER2, 8, // Charger Temperature, Charger thermistor support
|
||||
|
||||
Offset(0x7F),
|
||||
LSTE, 1, // Lid feature
|
||||
// BIT0LID GPI
|
||||
, 7, // Reserved
|
||||
|
||||
Offset(0x80),
|
||||
ECWR, 8, // AC & Battery status
|
||||
XX10, 8, // Battery#1 Model Number Code
|
||||
XX11, 16, // Battery#1 Serial Number
|
||||
B1DC, 16, // Battery#1 Design Capacity
|
||||
B1FV, 16, // Battery#1 Design Voltage
|
||||
B1FC, 16, // Battery#1 Last Full Charge Capacity
|
||||
XX15, 16, // Battery#1 Trip Point
|
||||
B1ST, 8, // Battery#1 State
|
||||
B1CR, 16, // Battery#1 Present Rate
|
||||
B1RC, 16, // Battery#1 Remaining Capacity
|
||||
B1VT, 16, // Battery#1 Present Voltage
|
||||
BPCN, 8, // Battery#1 Remaining percentage
|
||||
|
||||
// USB Type C Mailbox Interface// PPM->OPM Message In
|
||||
Offset(0xc0),
|
||||
MGI0, 8,
|
||||
MGI1, 8,
|
||||
MGI2, 8,
|
||||
MGI3, 8,
|
||||
MGI4, 8,
|
||||
MGI5, 8,
|
||||
MGI6, 8,
|
||||
MGI7, 8,
|
||||
MGI8, 8,
|
||||
MGI9, 8,
|
||||
MGIA, 8,
|
||||
MGIB, 8,
|
||||
MGIC, 8,
|
||||
MGID, 8,
|
||||
MGIE, 8,
|
||||
MGIF, 8,
|
||||
|
||||
// USB Type C Mailbox Interface// OPM->PPM Message Out
|
||||
MGO0, 8,
|
||||
MGO1, 8,
|
||||
MGO2, 8,
|
||||
MGO3, 8,
|
||||
MGO4, 8,
|
||||
MGO5, 8,
|
||||
MGO6, 8,
|
||||
MGO7, 8,
|
||||
MGO8, 8,
|
||||
MGO9, 8,
|
||||
MGOA, 8,
|
||||
MGOB, 8,
|
||||
MGOC, 8,
|
||||
MGOD, 8,
|
||||
MGOE, 8,
|
||||
MGOF, 8,
|
||||
|
||||
// USB Type C UCSI DATA Structure.
|
||||
VER1, 8,
|
||||
VER2, 8,
|
||||
RSV1, 8,
|
||||
RSV2, 8,
|
||||
|
||||
// PPM->OPM CCI indicator
|
||||
CCI0, 8,
|
||||
CCI1, 8,
|
||||
CCI2, 8,
|
||||
CCI3, 8,
|
||||
|
||||
// OPM->PPM Control message
|
||||
CTL0, 8,
|
||||
CTL1, 8,
|
||||
CTL2, 8,
|
||||
CTL3, 8,
|
||||
CTL4, 8,
|
||||
CTL5, 8,
|
||||
CTL6, 8,
|
||||
CTL7, 8,
|
||||
|
||||
Offset(0xF0),
|
||||
, 3,// BIT0 .. BIT2 Reserved
|
||||
TPCC, 1,// BIT3 TypeC connection bit
|
||||
, 2,// BIT4 .. BIT5 Reserved
|
||||
DRMD, 1,// Bit6 Dual Role Mode. 0->DFP: Host mode; 1->UFP: Device Mode.
|
||||
, 1,// BIT7 Reserved
|
||||
}
|
||||
|
||||
Method (ECMD, 0, Serialized)
|
||||
{
|
||||
}
|
||||
|
||||
Method (ECWT, 2, Serialized,,, {IntObj, FieldUnitObj})
|
||||
{
|
||||
Local0 = Acquire (ECMT, 1000)
|
||||
If (Local0 == 0x00)
|
||||
{
|
||||
If (ECAV)
|
||||
{
|
||||
// Execute write to Embedded Controller
|
||||
Arg1 = Arg0
|
||||
}
|
||||
Release (ECMT)
|
||||
}
|
||||
}
|
||||
|
||||
Method (ECRD, 1, Serialized, 0, IntObj, FieldUnitObj)
|
||||
{
|
||||
Local0 = Acquire (ECMT, 1000)
|
||||
If (Local0 == 0)
|
||||
{
|
||||
If (ECAV)
|
||||
{
|
||||
// Execute read from Embedded Controller
|
||||
Local1 = DerefOf (Arg0)
|
||||
Release (ECMT)
|
||||
Return (Local1)
|
||||
}
|
||||
Else
|
||||
{
|
||||
Release (ECMT)
|
||||
}
|
||||
}
|
||||
Return (Local1)
|
||||
}
|
||||
|
||||
// Include the other parts of the Embedded Controller ASL.
|
||||
#include "keyboard.asl"
|
||||
#include "battery.asl"
|
||||
#include "ac.asl"
|
||||
#include "lid.asl"
|
||||
|
||||
// Method(_Q45) // SMM Mode - Not used in coreboot
|
||||
// {
|
||||
// SMB2 = 0xC1
|
||||
// }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,251 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
Device (HIDD)
|
||||
{
|
||||
Name (_HID, "INT33D5")
|
||||
Name (HBSY, Zero)
|
||||
Name (HIDX, Zero)
|
||||
Name (HMDE, Zero)
|
||||
Name (HRDY, Zero)
|
||||
Name (BTLD, Zero)
|
||||
Name (BTS1, Zero)
|
||||
Name (HEB1, 0x3003)
|
||||
|
||||
Method (_STA, 0, Serialized) // _STA: Status
|
||||
{
|
||||
If ((OSYS >= 0x07DD))
|
||||
{
|
||||
Return (0x0F)
|
||||
}
|
||||
Else
|
||||
{
|
||||
Return (Zero)
|
||||
}
|
||||
}
|
||||
|
||||
Method (HDDM, 0, Serialized)
|
||||
{
|
||||
Store ("-----> HDDM", Debug)
|
||||
Name (DPKG, Package (0x04)
|
||||
{
|
||||
0x11111111,
|
||||
0x22222222,
|
||||
0x33333333,
|
||||
0x44444444
|
||||
})
|
||||
Return (DPKG)
|
||||
}
|
||||
|
||||
Method (HDEM, 0, Serialized)
|
||||
{
|
||||
Store ("-----> HDEM", Debug)
|
||||
HBSY = Zero
|
||||
If ((HMDE == Zero))
|
||||
{
|
||||
Return (HIDX)
|
||||
}
|
||||
Return (HMDE)
|
||||
}
|
||||
|
||||
Method (HDMM, 0, Serialized)
|
||||
{
|
||||
Store ("-----> HDMM", Debug)
|
||||
Return (HMDE)
|
||||
}
|
||||
|
||||
Method (HDSM, 1, Serialized)
|
||||
{
|
||||
Store ("-----> HDSM", Debug)
|
||||
HRDY = Arg0
|
||||
}
|
||||
|
||||
Method (HPEM, 1, Serialized)
|
||||
{
|
||||
Store ("-----> HPEM", Debug)
|
||||
HBSY = One
|
||||
HIDX = Arg0
|
||||
|
||||
Notify (HIDD, 0xC0)
|
||||
Local0 = Zero
|
||||
While ((Local0 < 0xFA) && HBSY)
|
||||
{
|
||||
Sleep (0x04)
|
||||
Local0++
|
||||
}
|
||||
|
||||
If (HBSY == One)
|
||||
{
|
||||
HBSY = Zero
|
||||
HIDX = Zero
|
||||
Return (One)
|
||||
}
|
||||
Else
|
||||
{
|
||||
Return (Zero)
|
||||
}
|
||||
}
|
||||
|
||||
Method (BTNL, 0, Serialized)
|
||||
{
|
||||
Store ("-----> BTNL", Debug)
|
||||
If (CondRefOf (\_SB.PWRB.PBST))
|
||||
{
|
||||
\_SB.PWRB.PBST = Zero
|
||||
Notify (PWRB, One) // Device Check
|
||||
}
|
||||
|
||||
BTLD = One
|
||||
// If ((AEAB == One))
|
||||
// {
|
||||
BTS1 = 0x1F
|
||||
\_SB.PCI0.LPCB.H_EC.ECWT (BTS1, RefOf (\_SB.PCI0.LPCB.H_EC.BTEN))
|
||||
// }
|
||||
// Else
|
||||
// {
|
||||
// BTS1 = Zero
|
||||
// }
|
||||
}
|
||||
|
||||
Method (BTNE, 1, Serialized)
|
||||
{
|
||||
Store ("-----> BTNE", Debug)
|
||||
// If ((AEAB == One))
|
||||
// {
|
||||
BTS1 = ((Arg0 & 0x1E) | One)
|
||||
\_SB.PCI0.LPCB.H_EC.ECWT (BTS1, RefOf (\_SB.PCI0.LPCB.H_EC.BTEN))
|
||||
// }
|
||||
}
|
||||
|
||||
Method (BTNS, 0, Serialized)
|
||||
{
|
||||
Store ("-----> BTNS", Debug)
|
||||
// If ((AEAB == One))
|
||||
// {
|
||||
BTS1 = \_SB.PCI0.LPCB.H_EC.ECRD (RefOf (\_SB.PCI0.LPCB.H_EC.BTEN))
|
||||
// }
|
||||
Return (BTS1)
|
||||
}
|
||||
|
||||
Method (BTNC, 0, Serialized)
|
||||
{
|
||||
Store ("-----> BTNC", Debug)
|
||||
// If ((AEAB == One))
|
||||
// {
|
||||
Return (0x1F)
|
||||
// }
|
||||
// Else
|
||||
// {
|
||||
// Return (Zero)
|
||||
// }
|
||||
}
|
||||
|
||||
Name (HEB2, Zero)
|
||||
Method (HEBC, 0, Serialized)
|
||||
{
|
||||
Store ("-----> HEBC", Debug)
|
||||
// If ((AHDB == One))
|
||||
// {
|
||||
// Return (\HEB1)
|
||||
// }
|
||||
// Else
|
||||
// {
|
||||
Return (Zero)
|
||||
// }
|
||||
}
|
||||
|
||||
Method (H2BC, 0, Serialized)
|
||||
{
|
||||
Store ("-----> H2BC", Debug)
|
||||
// If ((AHDB == One))
|
||||
// {
|
||||
// Return (\HEB1)
|
||||
// }
|
||||
// Else
|
||||
// {
|
||||
Return (Zero)
|
||||
// }
|
||||
}
|
||||
|
||||
Method (HEEC, 0, Serialized)
|
||||
{
|
||||
Store ("-----> HEEC", Debug)
|
||||
// If ((AHDB == One))
|
||||
// {
|
||||
Return (HEB2) /* \_SB_.HIDD.HEB2 */
|
||||
// }
|
||||
// Else
|
||||
// {
|
||||
// Return (Zero)
|
||||
// }
|
||||
}
|
||||
|
||||
Method (_DSM, 4, Serialized) // _DSM: Device-Specific Method
|
||||
{
|
||||
If ((Arg0 == ToUUID ("eeec56b3-4442-408f-a792-4edd4d758054")))
|
||||
{
|
||||
If ((One == ToInteger (Arg1)))
|
||||
{
|
||||
Switch (ToInteger (Arg2))
|
||||
{
|
||||
Case (Zero)
|
||||
{
|
||||
Return (Buffer (0x02)
|
||||
{
|
||||
0xFF, 0x03
|
||||
})
|
||||
}
|
||||
Case (One)
|
||||
{
|
||||
BTNL ()
|
||||
}
|
||||
Case (0x02)
|
||||
{
|
||||
Return (HDMM ())
|
||||
}
|
||||
Case (0x03)
|
||||
{
|
||||
HDSM (DerefOf (Arg3 [Zero]))
|
||||
}
|
||||
Case (0x04)
|
||||
{
|
||||
Return (HDEM ())
|
||||
}
|
||||
Case (0x05)
|
||||
{
|
||||
Return (BTNS ())
|
||||
}
|
||||
Case (0x06)
|
||||
{
|
||||
BTNE (DerefOf (Arg3 [Zero]))
|
||||
}
|
||||
Case (0x07)
|
||||
{
|
||||
Return (HEBC ())
|
||||
}
|
||||
Case (0x08)
|
||||
{
|
||||
}
|
||||
Case (0x09)
|
||||
{
|
||||
Return (H2BC ())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Return (Buffer (One)
|
||||
{
|
||||
0x00
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Method (PWPR, 0, Serialized)
|
||||
{
|
||||
Notify (HIDD, 0xCE)
|
||||
}
|
||||
|
||||
Method (PWRR, 0, Serialized)
|
||||
{
|
||||
Notify (HIDD, 0xCF)
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
Method(_Q80) // Volume up
|
||||
{
|
||||
Store ("-----> _Q80", Debug)
|
||||
Notify (\_SB.HIDD, 0xC4)
|
||||
Notify (\_SB.HIDD, 0xC5)
|
||||
Store ("<----- _Q80", Debug)
|
||||
}
|
||||
|
||||
Method(_Q81) // Volume down
|
||||
{
|
||||
Store ("-----> _Q81", Debug)
|
||||
Notify (\_SB.HIDD, 0xC6)
|
||||
Notify (\_SB.HIDD, 0xC7)
|
||||
Store ("<----- _Q81", Debug)
|
||||
}
|
||||
|
||||
Method(_Q99) // Wireless mode
|
||||
{
|
||||
Store ("-----> _Q99", Debug)
|
||||
\_SB.HIDD.HPEM(8)
|
||||
Store ("<----- _Q80", Debug)
|
||||
}
|
||||
|
||||
Method(_Q06) // Brightness decrease
|
||||
{
|
||||
\_SB.PCI0.GFX0.DECB()
|
||||
}
|
||||
|
||||
Method(_Q07) // Brightness increase
|
||||
{
|
||||
\_SB.PCI0.GFX0.INCB()
|
||||
}
|
||||
|
||||
Method(_Q08) // FN lock QEvent
|
||||
{
|
||||
FNLC = FNST
|
||||
}
|
||||
|
||||
Method(_Q54) // Power Button Event
|
||||
{
|
||||
Store ("-----> _Q54", Debug)
|
||||
If (CondRefOf (\_SB.PWRB))
|
||||
{
|
||||
Notify(\_SB.PWRB, 0x80)
|
||||
}
|
||||
Store ("<----- _Q54", Debug)
|
||||
}
|
||||
|
||||
Method(_QD5) // 10 second power button press
|
||||
{
|
||||
Store ("-----> _QD5", Debug)
|
||||
\_SB.PWPR()
|
||||
Store ("<----- _QD5", Debug)
|
||||
}
|
||||
|
||||
Method(_QD6) // 10 second power button de-press
|
||||
{
|
||||
Store ("-----> _QD6", Debug)
|
||||
\_SB.PWRR()
|
||||
Store ("<----- _QD6", Debug)
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
Device (LID0)
|
||||
{
|
||||
Name (_HID, EisaId ("PNP0C0D"))
|
||||
|
||||
Method (_STA, 0, NotSerialized)
|
||||
{
|
||||
DEBUG = "---> IT8987 LID: _STA"
|
||||
Return (0x0F)
|
||||
}
|
||||
|
||||
Method (_PSW, 1, NotSerialized)
|
||||
{
|
||||
DEBUG = Concatenate ("---> IT8987 LID: _PSW", ToHexString(Arg0))
|
||||
}
|
||||
|
||||
Method (_LID, 0, NotSerialized)
|
||||
{
|
||||
DEBUG = "---> IT8987 LID: _LID"
|
||||
If (\_SB.PCI0.LPCB.H_EC.ECRD (RefOf (\_SB.PCI0.LPCB.H_EC.LSTE)) == 0x01)
|
||||
{
|
||||
Local0 = 1
|
||||
}
|
||||
else
|
||||
{
|
||||
Local0 = 0
|
||||
}
|
||||
Return (Local0)
|
||||
}
|
||||
}
|
||||
|
||||
Method (_Q0C, 0, NotSerialized) // Lid close event
|
||||
{
|
||||
DEBUG = "---> IT8987 LID: Q0C (close event)"
|
||||
LIDS = 0
|
||||
\LIDS = LIDS
|
||||
Notify (LID0, 0x80)
|
||||
}
|
||||
|
||||
Method (_Q0D, 0, NotSerialized) // Lid open event
|
||||
{
|
||||
DEBUG = "---> IT8987 LID: Q0D (open event)"
|
||||
LIDS = 1
|
||||
\LIDS = LIDS
|
||||
Notify (LID0, 0x80)
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
Method(_QF0) // Thermal event.
|
||||
{
|
||||
If (LEqual (DBGS, 0x00))
|
||||
{
|
||||
/* Only handle the numerous thermal events if we are */
|
||||
/* NOT doing ACPI Debugging. */
|
||||
If (CondRefOf (\_TZ.TZ01))
|
||||
{
|
||||
Notify (\_TZ.TZ01, 0x80)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#ifndef _EC_STARLABS_IT8987_CHIP_H
|
||||
#define _EC_STARLABS_IT8987_CHIP_H
|
||||
|
||||
struct ec_starlabs_it8987_config {
|
||||
u8 cpuhot_limit; /* temperature in °C which asserts PROCHOT# */
|
||||
};
|
||||
|
||||
#endif /* _EC_STARLABS_IT8987_CHIP_H */
|
|
@ -0,0 +1,83 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#include <console/console.h>
|
||||
#include <device/device.h>
|
||||
#include <device/pnp.h>
|
||||
#include <pc80/keyboard.h>
|
||||
#include <ec/acpi/ec.h>
|
||||
#include <delay.h>
|
||||
#include <option.h>
|
||||
|
||||
#include "ec.h"
|
||||
#include "chip.h"
|
||||
|
||||
u16 it8987_get_version(void)
|
||||
{
|
||||
return (ec_read(0x00) << 8) | ec_read(0x01);
|
||||
}
|
||||
|
||||
static void it8987_init(struct device *dev)
|
||||
{
|
||||
if (!dev->enabled)
|
||||
return;
|
||||
|
||||
/*
|
||||
* The address/data IO port pair for the IT8987 EC are configurable
|
||||
* through the EC domain and are fixed by the EC's firmware blob. If
|
||||
* the value(s) passed through the "dev" structure don't match the
|
||||
* expected values then output severe warnings.
|
||||
*/
|
||||
if (dev->path.pnp.port != IT8987E_FIXED_ADDR) {
|
||||
printk(BIOS_ERR, "IT8987: Incorrect ports defined in devicetree.cb.\n");
|
||||
printk(BIOS_ERR, "IT8987: Serious operational issues will arise.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
u8 chipid1 = pnp_read_index(dev->path.pnp.port, IT8987_CHIPID1);
|
||||
u8 chipid2 = pnp_read_index(dev->path.pnp.port, IT8987_CHIPID2);
|
||||
if (chipid1 != IT8987_CHIPID1_VAL || chipid2 != IT8987_CHIPID2_VAL) {
|
||||
printk(BIOS_DEBUG, "IT8987: Device not found.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printk(BIOS_DEBUG, "IT8987: Initializing keyboard.\n");
|
||||
pc_keyboard_init(NO_AUX_DEVICE);
|
||||
|
||||
/* Enable the keyboard backlight support. */
|
||||
ec_write(0x18, 0xaa);
|
||||
ec_write(0x19, 0xdd);
|
||||
|
||||
/* Set the timeout for the keyboard backlight. */
|
||||
ec_write(ECRAM_KBL_TIMEOUT, get_uint_option("kbl_timeout", 0));
|
||||
|
||||
/*
|
||||
* Set the correct state for the Ctrl Fn Reverse option. This
|
||||
* swaps the Ctrl and Fn keys to make it like an Apple keyboard.
|
||||
*/
|
||||
ec_write(ECRAM_FN_CTRL_REVERSE, get_uint_option("fn_ctrl_swap", 0));
|
||||
/*
|
||||
* Copy the stored state of the fn_lock_state CMOS variable to the
|
||||
* corresponding location within the EC RAM.
|
||||
*/
|
||||
ec_write(ECRAM_FN_LOCK_STATE, get_uint_option("fn_lock_state", 0));
|
||||
}
|
||||
|
||||
static struct device_operations ops = {
|
||||
.init = it8987_init,
|
||||
.read_resources = noop_read_resources,
|
||||
.set_resources = noop_set_resources,
|
||||
};
|
||||
|
||||
static struct pnp_info pnp_dev_info[] = {
|
||||
{ NULL, 0, 0, 0, }
|
||||
};
|
||||
|
||||
static void enable_dev(struct device *dev)
|
||||
{
|
||||
pnp_enable_devices(dev, &ops, ARRAY_SIZE(pnp_dev_info), pnp_dev_info);
|
||||
}
|
||||
|
||||
struct chip_operations ec_starlabs_it8987_ops = {
|
||||
CHIP_NAME("ITE IT8987 EC")
|
||||
.enable_dev = enable_dev
|
||||
};
|
|
@ -0,0 +1,48 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
/*
|
||||
* EC communication interface for ITE IT8987 Embedded Controller.
|
||||
*/
|
||||
|
||||
#ifndef _EC_STARLABS_IT8987_H
|
||||
#define _EC_STARLABS_IT8987_H
|
||||
|
||||
/*
|
||||
* Define the expected value of the PNP base address that is fixed through
|
||||
* the BADRSEL register controlled within the EC domain by the binary blob.
|
||||
*/
|
||||
#define IT8987E_FIXED_ADDR 0x4e
|
||||
|
||||
/* Logical device number (LDN) assignments. */
|
||||
#define IT8987E_SP1 0x01 /* Com1 */
|
||||
#define IT8987E_SP2 0x02 /* Com2 */
|
||||
#define IT8987E_SWUC 0x04 /* System Wake-Up */
|
||||
#define IT8987E_KBCM 0x05 /* PS/2 mouse */
|
||||
#define IT8987E_KBCK 0x06 /* PS/2 keyboard */
|
||||
#define IT8987E_IR 0x0a /* Consumer IR */
|
||||
#define IT8987E_SMFI 0x0f /* Shared Memory/Flash Interface */
|
||||
#define IT8987E_RTCT 0x10 /* RTC-like Timer */
|
||||
#define IT8987E_PMC1 0x11 /* Power Management Channel 1 */
|
||||
#define IT8987E_PMC2 0x12 /* Power Management Channel 2 */
|
||||
#define IT8987E_SSPI 0x13 /* Serial Peripheral Interface */
|
||||
#define IT8987E_PECI 0x14 /* Platform EC Interface */
|
||||
#define IT8987E_PMC3 0x17 /* Power Management Channel 3 */
|
||||
#define IT8987E_PMC4 0x18 /* Power Management Channel 4 */
|
||||
#define IT8987E_PMC5 0x19 /* Power Management Channel 5 */
|
||||
|
||||
/* Host domain registers. */
|
||||
#define IT8987_CHIPID1 0x20 /* Device ID register 1 */
|
||||
#define IT8987_CHIPID2 0x21 /* Device ID register 2 */
|
||||
|
||||
/* IT8987 chip ID byte values. */
|
||||
#define IT8987_CHIPID1_VAL 0x89
|
||||
#define IT8987_CHIPID2_VAL 0x87
|
||||
|
||||
/* EC RAM offsets. */
|
||||
#define ECRAM_KBL_TIMEOUT 0x07
|
||||
#define ECRAM_FN_CTRL_REVERSE 0x08
|
||||
#define ECRAM_FN_LOCK_STATE 0x2C
|
||||
|
||||
u16 it8987_get_version(void);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue