blob: 9ff7b721941788a3f9e0d263e5fd2eb6c892a41a [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* The mainboard must define a PNOT method to handle power
* state notifications and Notify CPU device objects to
* re-evaluate their _PPC and _CST tables.
*/
// DTT Power Participant Device Notification
#define POWER_STATE_CHANGE_NOTIFICATION 0x81
// DTT OEM variables change notification
#define EC_OEM_VARIABLE_DATA_MASK 0x7
#define INT3400_ODVP_CHANGED 0x88
#define ACPI_NOTIFY_CROS_EC_PANIC 0xB0
// Mainboard specific throttle handler
#ifdef DPTF_ENABLE_CHARGER
External (\_SB.DPTF.TCHG, DeviceObj)
#endif
/* Enable DPTC interface with AMD ALIB */
#if CONFIG(SOC_AMD_COMMON_BLOCK_ACPI_DPTC)
External(\_SB.DPTC, MethodObj)
#endif
External (\_SB.DPTF.TPWR, DeviceObj)
#ifdef DPTF_ENABLE_OEM_VARIABLES
External (\_SB.DPTF.ODVP, MethodObj)
External (\_SB.DPTF.ODGT, MethodObj)
External (\_SB.DPTF.ODUP, MethodObj)
#endif
Device (EC0)
{
Name (_HID, EISAID ("PNP0C09"))
Name (_UID, 1)
Name (_GPE, EC_SCI_GPI)
Name (TOFS, EC_TEMP_SENSOR_OFFSET)
Name (TNCA, EC_TEMP_SENSOR_NOT_CALIBRATED)
Name (TNOP, EC_TEMP_SENSOR_NOT_POWERED)
Name (TBAD, EC_TEMP_SENSOR_ERROR)
Name (TNPR, EC_TEMP_SENSOR_NOT_PRESENT)
Name (DWRN, 15) // Battery capacity warning at 15%
Name (DLOW, 10) // Battery capacity low at 10%
OperationRegion (ERAM, EmbeddedControl, 0x00, EC_ACPI_MEM_MAPPED_BEGIN)
Field (ERAM, ByteAcc, Lock, Preserve)
{
RAMV, 8, // EC RAM Version
TSTB, 8, // Test Byte
TSTC, 8, // Complement of Test Byte
KBLV, 8, // Keyboard Backlight value
FAND, 8, // Set Fan Duty Cycle
PATI, 8, // Programmable Auxiliary Trip Sensor ID
PATT, 8, // Programmable Auxiliary Trip Threshold
PATC, 8, // Programmable Auxiliary Trip Commit
CHGL, 8, // Charger Current Limit
TBMD, 1, // Tablet mode
DDPN, 3, // Device DPTF Profile Number
STTB, 1, // Switch thermal table by body detection status
// DFUD must be 0 for the other 31 values to be valid
Offset (0x0a),
DFUD, 1, // Device Features Undefined
FLSH, 1, // Flash commands present
PFAN, 1, // PWM Fan control present
KBLE, 1, // Keyboard Backlight present
LTBR, 1, // Lightbar present
LEDC, 1, // LED control
MTNS, 1, // Motion sensors present
KEYB, 1, // EC is keyboard controller
PSTR, 1, // Persistent storage
P80P, 1, // EC serves I/O Port 80h
THRM, 1, // EC supports thermal management
SBKL, 1, // Screen backlight switch present
WIFI, 1, // WIFI switch present
HOST, 1, // EC monitors host events (eg SCI, SMI)
GPIO, 1, // EC provides GPIO commands
I2CB, 1, // EC provides I2C controller access
CHRG, 1, // EC provides commands for charger control
BATT, 1, // Simply Battery support
SBAT, 1, // Smart Battery support
HANG, 1, // EC can detect host hang
PMUI, 1, // Power Information
DSEC, 1, // another EC exists downstream
UPDC, 1, // supports USB Power Delivery
UMUX, 1, // supports USB Mux
MSFF, 1, // Motion Sense has FIFO
TVST, 1, // supports temporary secure vstore
TCMV, 1, // USB Type C Muxing is virtual (host assisted)
RTCD, 1, // EC provides an RTC device
FPRD, 1, // EC provides a fingerprint reader device
TPAD, 1, // EC provides a touchpad device
RWSG, 1, // EC has RWSIG task enabled
DEVE, 1, // EC supports device events
// make sure we're within our space envelope
Offset (0x0e),
Offset (0x12),
BTID, 8, // Battery index that host wants to read
USPP, 8, // USB Port Power
RFWU, 8, // Retimer Firmware Update
PBOK, 8, // Power source change count from dptf
}
#if CONFIG(EC_GOOGLE_CHROMEEC_ACPI_MEMMAP)
OperationRegion (EMEM, EmbeddedControl,
EC_ACPI_MEM_MAPPED_BEGIN, EC_ACPI_MEM_MAPPED_SIZE)
Field (EMEM, ByteAcc, Lock, Preserve)
#else
OperationRegion (EMEM, SystemIO, EC_LPC_ADDR_MEMMAP, EC_MEMMAP_SIZE)
Field (EMEM, ByteAcc, NoLock, Preserve)
#endif
{
#include "emem.asl"
}
#ifdef EC_ENABLE_LID_SWITCH
/* LID Switch */
Device (LID0)
{
Name (_HID, EisaId ("PNP0C0D"))
Method (_LID, 0)
{
Return (^^LIDS)
}
#ifdef EC_ENABLE_WAKE_PIN
Name (_PRW, Package () { EC_ENABLE_WAKE_PIN, 0x5 })
#endif
}
#endif /* EC_ENABLE_LID_SWITCH */
Method (TINS, 1, Serialized)
{
Switch (ToInteger (Arg0))
{
Case (0) { Return (TIN0) }
Case (1) { Return (TIN1) }
Case (2) { Return (TIN2) }
Case (3) { Return (TIN3) }
Case (4) { Return (TIN4) }
Case (5) { Return (TIN5) }
Case (6) { Return (TIN6) }
Case (7) { Return (TIN7) }
Case (8) { Return (TIN8) }
Case (9) { Return (TIN9) }
Default { Return (TIN0) }
}
}
Method (_CRS, 0, Serialized)
{
Name (ECMD, ResourceTemplate()
{
IO (Decode16,
EC_LPC_ADDR_ACPI_DATA,
EC_LPC_ADDR_ACPI_DATA,
0, 1)
IO (Decode16,
EC_LPC_ADDR_ACPI_CMD,
EC_LPC_ADDR_ACPI_CMD,
0, 1)
})
Return (ECMD)
}
Method (_REG, 2, NotSerialized)
{
// Initialize AC power state
\PWRS = ACEX
/*
* Call PNOT (Platform Notify) to inform platform code
* about the current AC/battery state. This handles all cases,
* the battery transitioning into and out of having critically
* low charge.
* PWRS isn't valid before this point.
*/
\PNOT ()
// Initialize LID switch state
\LIDS = LIDS
#if CONFIG(SOC_AMD_COMMON_BLOCK_ACPI_DPTC)
/*
* Per the device mode (clamshell or tablet) to initialize
* the thermal setting on OS startup.
*/
If (CondRefOf (\_SB.DPTC)) {
\_SB.DPTC()
}
#endif
}
/* Read requested temperature and check against EC error values */
Method (TSRD, 1, Serialized)
{
Local0 = \_SB.PCI0.LPCB.EC0.TINS (Arg0)
/* Check for sensor not calibrated */
If (Local0 == \_SB.PCI0.LPCB.EC0.TNCA) {
Return (0)
}
/* Check for sensor not present */
If (Local0 == \_SB.PCI0.LPCB.EC0.TNPR) {
Return (0)
}
/* Check for sensor not powered */
If (Local0 == \_SB.PCI0.LPCB.EC0.TNOP) {
Return (0)
}
/* Check for sensor bad reading */
If (Local0 == \_SB.PCI0.LPCB.EC0.TBAD) {
Return (0)
}
/* Adjust by offset to get Kelvin */
Local0 += \_SB.PCI0.LPCB.EC0.TOFS
/* Convert to 1/10 Kelvin */
Local0 *= 10
Return (Local0)
}
// Lid Closed Event
Method (_Q01, 0, NotSerialized)
{
Printf ("EC: LID CLOSE")
#if CONFIG(SOC_AMD_COMMON_BLOCK_ACPI_DPTC)
If (CondRefOf (\_SB.DPTC)) {
\_SB.DPTC()
}
#endif
\LIDS = LIDS
#ifdef EC_ENABLE_LID_SWITCH
Notify (LID0, 0x80)
#endif
}
// Lid Open Event
Method (_Q02, 0, NotSerialized)
{
Printf ("EC: LID OPEN")
#if CONFIG(SOC_AMD_COMMON_BLOCK_ACPI_DPTC)
If (CondRefOf (\_SB.DPTC)) {
\_SB.DPTC()
}
#endif
\LIDS = LIDS
Notify (CREC, 0x2)
#ifdef EC_ENABLE_LID_SWITCH
Notify (LID0, 0x80)
#endif
}
// Power Button
Method (_Q03, 0, NotSerialized)
{
Printf ("EC: POWER BUTTON")
}
// AC Connected
Method (_Q04, 0, NotSerialized)
{
Printf ("EC: AC CONNECTED")
\PWRS = ACEX
Notify (AC, 0x80)
#ifdef DPTF_ENABLE_CHARGER
If (CondRefOf (\_SB.DPTF.TCHG)) {
Notify (\_SB.DPTF.TCHG, 0x80)
}
#endif
/*
* Call PNOT (Platform Notify) to inform platform code
* about the current battery state. This handles all cases,
* the battery transitioning into and out of having critically
* low charge.
*/
\PNOT ()
}
// AC Disconnected
Method (_Q05, 0, NotSerialized)
{
Printf ("EC: AC DISCONNECTED")
\PWRS = ACEX
Notify (AC, 0x80)
#ifdef DPTF_ENABLE_CHARGER
If (CondRefOf (\_SB.DPTF.TCHG)) {
Notify (\_SB.DPTF.TCHG, 0x80)
}
#endif
/*
* Call PNOT (Platform Notify) to inform platform code
* about the current battery state. This handles all cases,
* the battery transitioning into and out of having critically
* low charge.
*/
\PNOT ()
}
// Battery Low Event
Method (_Q06, 0, NotSerialized)
{
Printf ("EC: BATTERY LOW")
Notify (BAT0, 0x80)
}
// Battery Critical Event
Method (_Q07, 0, NotSerialized)
{
Printf ("EC: BATTERY CRITICAL")
Notify (BAT0, 0x80)
}
// Battery Info Event
Method (_Q08, 0, NotSerialized)
{
Printf ("EC: BATTERY INFO")
Notify (BAT0, 0x81)
#ifdef EC_ENABLE_SECOND_BATTERY_DEVICE
If (CondRefOf (BAT1)) {
Notify (BAT1, 0x81)
}
#endif
}
// Thermal Overload Event
Method (_Q0A, 0, NotSerialized)
{
Printf ("EC: THERMAL OVERLOAD")
Notify (\_TZ, 0x80)
}
// Thermal Event
Method (_Q0B, 0, NotSerialized)
{
Printf ("EC: THERMAL")
Notify (\_TZ, 0x80)
}
// Key Pressed
Method (_Q0D, 0, NotSerialized)
{
Printf ("EC: KEY PRESSED")
Notify (CREC, 0x2)
}
// Thermal Shutdown Imminent
Method (_Q10, 0, NotSerialized)
{
Printf ("EC: THERMAL SHUTDOWN")
Notify (\_TZ, 0x80)
}
// Battery Shutdown Imminent
Method (_Q11, 0, NotSerialized)
{
Printf ("EC: BATTERY SHUTDOWN")
Notify (BAT0, 0x80)
}
// Throttle Start
Method (_Q12, 0, NotSerialized)
{
#ifdef EC_ENABLE_THROTTLING_HANDLER
Printf ("EC: THROTTLE START")
\_TZ.THRT (1)
#endif
#ifdef DPTF_ENABLE_OEM_VARIABLES
Local0 = ToInteger(EOVD) & EC_OEM_VARIABLE_DATA_MASK
\_SB.DPTF.ODUP(0, Local0)
Local0 = \_SB.DPTF.ODGT(0)
\_SB.DPTF.ODVP()
Notify (\_SB.DPTF, INT3400_ODVP_CHANGED)
#endif
}
// Throttle Stop
Method (_Q13, 0, NotSerialized)
{
#ifdef EC_ENABLE_THROTTLING_HANDLER
Printf ("EC: THROTTLE STOP")
\_TZ.THRT (0)
#endif
}
#ifdef EC_ENABLE_PD_MCU_DEVICE
// PD event
Method (_Q16, 0, NotSerialized)
{
Printf ("EC: GOT PD EVENT")
Notify (\_SB.PCI0.LPCB.EC0.CREC.ECPD, 0x80)
If (CondRefOf (\_SB.DPTF.TPWR)) {
Notify (\_SB.DPTF.TPWR, POWER_STATE_CHANGE_NOTIFICATION)
}
}
#endif
// Battery Status
Method (_Q17, 0, NotSerialized)
{
Printf ("EC: BATTERY STATUS")
Notify (BAT0, 0x80)
#ifdef EC_ENABLE_SECOND_BATTERY_DEVICE
If (CondRefOf (BAT1)) {
Notify (BAT1, 0x80)
}
#endif
/*
* Call PNOT (Platform Notify) to inform platform code
* about the current battery state. This handles all cases,
* the battery transitioning into and out of having critically
* low charge.
*/
\PNOT ()
}
// EC Panic
Method (_Q18, 0, NotSerialized)
{
Printf ("EC: PANIC")
Notify (CREC, ACPI_NOTIFY_CROS_EC_PANIC)
}
// MKBP interrupt.
Method (_Q1B, 0, NotSerialized)
{
Printf ("EC: MKBP")
Notify (CREC, 0x80)
}
#ifdef EC_ENABLE_PD_MCU_DEVICE
// USB MUX Interrupt
Method (_Q1C, 0, NotSerialized)
{
Printf ("EC: USB MUX")
Notify (\_SB.PCI0.LPCB.EC0.CREC.ECPD, 0x80)
}
#endif
// TABLET mode switch Event
Method (_Q1D, 0, NotSerialized)
{
Printf ("EC: TABLET mode switch Event")
Notify (CREC, 0x2)
#ifdef EC_ENABLE_MULTIPLE_DPTF_PROFILES
\_SB.DPTF.TPET()
#endif
#ifdef EC_ENABLE_TBMC_DEVICE
Notify (TBMC, 0x80)
#endif
#if CONFIG(SOC_AMD_COMMON_BLOCK_ACPI_DPTC)
If (CondRefOf (\_SB.DPTC)) {
\_SB.DPTC()
}
#endif
}
/*
* Dynamic Platform Thermal Framework support
*/
/* Mutex for EC PAT interface */
Mutex (PATM, 1)
/*
* Set Aux Trip Point 0
* Arg0 = Temp Sensor ID
* Arg1 = Value to set
*/
Method (PAT0, 2, Serialized)
{
If (Acquire (^PATM, 1000)) {
Return (0)
}
/* Set sensor ID */
^PATI = ToInteger (Arg0)
/* Temperature is passed in 1/10 Kelvin */
Local1 = ToInteger (Arg1) / 10
/* Adjust by EC temperature offset */
^PATT = Local1 - ^TOFS
/* Set commit value with SELECT=0 and ENABLE=1 */
^PATC = 0x02
Release (^PATM)
Return (1)
}
/*
* Set Aux Trip Point 1
* Arg0 = Temp Sensor ID
* Arg1 = Value to set
*/
Method (PAT1, 2, Serialized)
{
If (Acquire (^PATM, 1000)) {
Return (0)
}
/* Set sensor ID */
^PATI = ToInteger (Arg0)
/* Temperature is passed in 1/10 Kelvin */
Local1 = ToInteger (Arg1) / 10
/* Adjust by EC temperature offset */
^PATT = Local1 - ^TOFS
/* Set commit value with SELECT=1 and ENABLE=1 */
^PATC = 0x03
Release (^PATM)
Return (1)
}
/* Disable Aux Trip Points
* Arg0 = Temp Sensor ID
*/
Method (PATD, 1, Serialized)
{
If (Acquire (^PATM, 1000)) {
Return (0)
}
^PATI = ToInteger (Arg0)
^PATT = 0x00
/* Disable PAT0 */
^PATC = 0x00
/* Disable PAT1 */
^PATC = 0x01
Release (^PATM)
Return (1)
}
/*
* Thermal Threshold Event
*/
Method (_Q09, 0, NotSerialized)
{
#if CONFIG(SOC_AMD_COMMON_BLOCK_ACPI_DPTC)
If (CondRefOf (\_SB.DPTC)) {
\_SB.DPTC()
}
#endif
If (!Acquire (^PATM, 1000)) {
/* Read sensor ID for event */
Local0 = ^PATI
/* When sensor ID returns 0xFF then no more events */
While (Local0 != EC_TEMP_SENSOR_NOT_PRESENT)
{
#ifdef HAVE_THERM_EVENT_HANDLER
\_SB.DPTF.TEVT (Local0)
#endif
/* Keep reaading sensor ID for event */
Local0 = ^PATI
}
Release (^PATM)
}
}
/*
* Set Charger Current Limit
* Arg0 = Current Limit in 64mA steps
*/
Method (CHGS, 1, Serialized)
{
^CHGL = ToInteger (Arg0)
}
/*
* Disable Charger Current Limit
*/
Method (CHGD, 0, Serialized)
{
^CHGL = 0xFF
}
/* Read current Tablet mode */
Method (RCTM, 0, NotSerialized)
{
Return (^TBMD)
}
#ifdef EC_ENABLE_MULTIPLE_DPTF_PROFILES
/* Read current Device DPTF Profile Number */
Method (RCDP, 0, NotSerialized)
{
/*
* DDPN = 0 is reserved for backwards compatibility.
* If DDPN == 0 use TBMD to load appropriate DPTF table.
*/
If (^DDPN == 0) {
Return (^TBMD)
} Else {
Local0 = ^DDPN - 1
Return (Local0)
}
}
#endif
#if CONFIG(EC_GOOGLE_CHROMEEC_ACPI_USB_PORT_POWER)
/*
* Enable USB Port Power
* Arg0 = USB port ID
*/
Method (UPPS, 1, Serialized)
{
USPP |= 1 << Arg0
}
/*
* Disable USB Port Power
* Arg0 = USB port ID
*/
Method (UPPC, 1, Serialized)
{
USPP &= ~(1 << Arg0)
}
#endif
#include "ac.asl"
#include "battery.asl"
#include "cros_ec.asl"
#ifdef EC_ENABLE_ALS_DEVICE
#include "als.asl"
#endif
#ifdef EC_ENABLE_KEYBOARD_BACKLIGHT
#include "keyboard_backlight.asl"
#endif
#ifdef EC_ENABLE_TBMC_DEVICE
#include "tbmc.asl"
#endif
}