ec/dasharo/ec: Add initial copy of ec/system76/ec
Initial commit is a copy of ec/system76/ec from tag v24.02.1 (commit 0a280ff7) with string changes. Dasharo-specific features will be added in subsequent commits, similar to how Librem EC support was added in changes 52390 and 52391. Change-Id: Ic7c3d9413488026548514963eb78accc28e41e06 Signed-off-by: Michał Kopeć <michal.kopec@3mdeb.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/82671 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Felix Singer <service+coreboot-gerrit@felixsinger.de>
This commit is contained in:
21
src/ec/dasharo/ec/Kconfig
Normal file
21
src/ec/dasharo/ec/Kconfig
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
## SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
|
||||||
|
config EC_DASHARO_EC
|
||||||
|
bool
|
||||||
|
help
|
||||||
|
Dasharo EC
|
||||||
|
|
||||||
|
config EC_DASHARO_EC_BAT_THRESHOLDS
|
||||||
|
depends on EC_DASHARO_EC
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
|
||||||
|
config EC_DASHARO_EC_DGPU
|
||||||
|
depends on EC_DASHARO_EC
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
|
||||||
|
config EC_DASHARO_EC_OLED
|
||||||
|
depends on EC_DASHARO_EC
|
||||||
|
bool
|
||||||
|
default n
|
10
src/ec/dasharo/ec/Makefile.mk
Normal file
10
src/ec/dasharo/ec/Makefile.mk
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
## SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
ifeq ($(CONFIG_EC_DASHARO_EC),y)
|
||||||
|
|
||||||
|
all-y += dasharo_ec.c
|
||||||
|
|
||||||
|
ramstage-y += smbios.c
|
||||||
|
|
||||||
|
smm-$(CONFIG_DEBUG_SMI) += dasharo_ec.c
|
||||||
|
|
||||||
|
endif
|
22
src/ec/dasharo/ec/acpi/ac.asl
Normal file
22
src/ec/dasharo/ec/acpi/ac.asl
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
Device (AC)
|
||||||
|
{
|
||||||
|
Name (_HID, "ACPI0003" /* Power Source Device */)
|
||||||
|
Name (_PCL, Package (0x01) // _PCL: Power Consumer List
|
||||||
|
{
|
||||||
|
_SB
|
||||||
|
})
|
||||||
|
|
||||||
|
Name (ACFG, 1)
|
||||||
|
|
||||||
|
Method (_PSR, 0, NotSerialized) // _PSR: Power Source
|
||||||
|
{
|
||||||
|
Return (ACFG)
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_STA, 0, NotSerialized)
|
||||||
|
{
|
||||||
|
Return (0x0F)
|
||||||
|
}
|
||||||
|
}
|
248
src/ec/dasharo/ec/acpi/battery.asl
Normal file
248
src/ec/dasharo/ec/acpi/battery.asl
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
Device (BAT0)
|
||||||
|
{
|
||||||
|
Name (_HID, EisaId ("PNP0C0A") /* Control Method Battery */)
|
||||||
|
Name (_UID, 0)
|
||||||
|
Name (_PCL, Package (0x01) // _PCL: Power Consumer List
|
||||||
|
{
|
||||||
|
_SB
|
||||||
|
})
|
||||||
|
Name (BFCC, 0)
|
||||||
|
Method (_STA, 0, NotSerialized)
|
||||||
|
{
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK)
|
||||||
|
{
|
||||||
|
If (^^PCI0.LPCB.EC0.BAT0)
|
||||||
|
{
|
||||||
|
Return (0x1F)
|
||||||
|
}
|
||||||
|
Else
|
||||||
|
{
|
||||||
|
Return (0x0F)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Else
|
||||||
|
{
|
||||||
|
Return (0x0F)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Name (PBIF, Package (0x0D)
|
||||||
|
{
|
||||||
|
1, // 0 - Power Unit
|
||||||
|
0xFFFFFFFF, // 1 - Design Capacity
|
||||||
|
0xFFFFFFFF, // 2 - Last Full Charge Capacity
|
||||||
|
1, // 3 - Battery Technology
|
||||||
|
0xFFFFFFFF, // 4 - Design Voltage
|
||||||
|
0, // 5 - Design Capacity of Warning
|
||||||
|
0, // 6 - Design Capacity of Low
|
||||||
|
0x40, // 7 - Battery Capacity Granularity 1
|
||||||
|
0x40, // 8 - Battery Capacity Granularity 2
|
||||||
|
" ", // 9 - Model Number
|
||||||
|
" ", // 10 - Serial Number
|
||||||
|
" ", // 11 - Battery Type
|
||||||
|
" " // 12 - OEM Information
|
||||||
|
})
|
||||||
|
Method (IVBI, 0, NotSerialized)
|
||||||
|
{
|
||||||
|
PBIF [1] = 0xFFFFFFFF
|
||||||
|
PBIF [2] = 0xFFFFFFFF
|
||||||
|
PBIF [4] = 0xFFFFFFFF
|
||||||
|
PBIF [9] = " "
|
||||||
|
PBIF [10] = " "
|
||||||
|
PBIF [11] = " "
|
||||||
|
PBIF [12] = " "
|
||||||
|
BFCC = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (UPBI, 0, NotSerialized)
|
||||||
|
{
|
||||||
|
If (^^PCI0.LPCB.EC0.BAT0)
|
||||||
|
{
|
||||||
|
Local0 = (^^PCI0.LPCB.EC0.BDC0 & 0xFFFF)
|
||||||
|
PBIF [1] = Local0
|
||||||
|
Local0 = (^^PCI0.LPCB.EC0.BFC0 & 0xFFFF)
|
||||||
|
PBIF [2] = Local0
|
||||||
|
BFCC = Local0
|
||||||
|
Local0 = (^^PCI0.LPCB.EC0.BDV0 & 0xFFFF)
|
||||||
|
PBIF [4] = Local0
|
||||||
|
Local0 = (^^PCI0.LPCB.EC0.BCW0 & 0xFFFF)
|
||||||
|
PBIF [5] = Local0
|
||||||
|
Local0 = (^^PCI0.LPCB.EC0.BCL0 & 0xFFFF)
|
||||||
|
PBIF [6] = Local0
|
||||||
|
PBIF [9] = "BAT"
|
||||||
|
PBIF [10] = "0001"
|
||||||
|
PBIF [11] = "LION"
|
||||||
|
PBIF [12] = "Notebook"
|
||||||
|
}
|
||||||
|
Else
|
||||||
|
{
|
||||||
|
IVBI ()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_BIF, 0, NotSerialized) // _BIF: Battery Information
|
||||||
|
{
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK)
|
||||||
|
{
|
||||||
|
UPBI ()
|
||||||
|
}
|
||||||
|
Else
|
||||||
|
{
|
||||||
|
IVBI ()
|
||||||
|
}
|
||||||
|
|
||||||
|
Return (PBIF) /* \_SB_.BAT0.PBIF */
|
||||||
|
}
|
||||||
|
|
||||||
|
Name (PBIX, Package ()
|
||||||
|
{
|
||||||
|
0, // 0 - Revision
|
||||||
|
1, // 1 - Power Unit: mAh
|
||||||
|
0xFFFFFFFF, // 2 - Design Capacity
|
||||||
|
0xFFFFFFFF, // 3 - Last Full Charge Capacity
|
||||||
|
1, // 4 - Battery Technology: Rechargeable
|
||||||
|
0xFFFFFFFF, // 5 - Design Voltage
|
||||||
|
0, // 6 - Design Capacity of Warning
|
||||||
|
0, // 7 - Design Capacity of Low
|
||||||
|
0, // 8 - Cycle Count
|
||||||
|
98000, // 9 - Measurement Accuracy
|
||||||
|
0xFFFFFFFF, // 10 - Max Sampling Time
|
||||||
|
0xFFFFFFFF, // 11 - Min Sampling Time
|
||||||
|
0xFFFFFFFF, // 12 - Max Averaging Interval
|
||||||
|
0xFFFFFFFF, // 13 - Min Averaging Interval
|
||||||
|
0x40, // 14 - Battery Capacity Granularity 1
|
||||||
|
0x40, // 15 - Battery Capacity Granularity 2
|
||||||
|
" ", // 16 - Model Number
|
||||||
|
" ", // 17 - Serial Number
|
||||||
|
" ", // 18 - Battery Type
|
||||||
|
" " // 19 - OEM Information
|
||||||
|
})
|
||||||
|
|
||||||
|
Method (IVBX, 0, NotSerialized)
|
||||||
|
{
|
||||||
|
PBIX [2] = 0xFFFFFFFF
|
||||||
|
PBIX [3] = 0xFFFFFFFF
|
||||||
|
PBIX [5] = 0xFFFFFFFF
|
||||||
|
PBIX [16] = " "
|
||||||
|
PBIX [17] = " "
|
||||||
|
PBIX [18] = " "
|
||||||
|
PBIX [19] = " "
|
||||||
|
BFCC = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (UPBX, 0, NotSerialized)
|
||||||
|
{
|
||||||
|
If (^^PCI0.LPCB.EC0.BAT0)
|
||||||
|
{
|
||||||
|
Local0 = (^^PCI0.LPCB.EC0.BDC0 & 0xFFFF)
|
||||||
|
PBIX [2] = Local0
|
||||||
|
Local0 = (^^PCI0.LPCB.EC0.BFC0 & 0xFFFF)
|
||||||
|
PBIX [3] = Local0
|
||||||
|
BFCC = Local0
|
||||||
|
Local0 = (^^PCI0.LPCB.EC0.BDV0 & 0xFFFF)
|
||||||
|
PBIX [5] = Local0
|
||||||
|
Local0 = (^^PCI0.LPCB.EC0.BCW0 & 0xFFFF)
|
||||||
|
PBIX [6] = Local0
|
||||||
|
Local0 = (^^PCI0.LPCB.EC0.BCL0 & 0xFFFF)
|
||||||
|
PBIX [7] = Local0
|
||||||
|
LOCAL0 = ^^PCI0.LPCB.EC0.CYC0
|
||||||
|
PBIX [8] = LOCAL0
|
||||||
|
PBIX [16] = "BAT"
|
||||||
|
PBIX [17] = "0001"
|
||||||
|
PBIX [18] = "LION"
|
||||||
|
PBIX [19] = "Notebook"
|
||||||
|
}
|
||||||
|
Else
|
||||||
|
{
|
||||||
|
IVBX ()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// _BIX: Battery Information Extended
|
||||||
|
Method (_BIX, 0, NotSerialized)
|
||||||
|
{
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK)
|
||||||
|
{
|
||||||
|
UPBX ()
|
||||||
|
}
|
||||||
|
Else
|
||||||
|
{
|
||||||
|
IVBX ()
|
||||||
|
}
|
||||||
|
Return (PBIX) /* \_SB_.BAT0.PBIX */
|
||||||
|
}
|
||||||
|
|
||||||
|
Name (PBST, Package (0x04)
|
||||||
|
{
|
||||||
|
0, // 0 - Battery state
|
||||||
|
0xFFFFFFFF, // 1 - Battery present rate
|
||||||
|
0xFFFFFFFF, // 2 - Battery remaining capacity
|
||||||
|
0xFFFFFFFF // 3 - Battery present voltage
|
||||||
|
})
|
||||||
|
Method (IVBS, 0, NotSerialized)
|
||||||
|
{
|
||||||
|
PBST [0] = 0
|
||||||
|
PBST [1] = 0xFFFFFFFF
|
||||||
|
PBST [2] = 0xFFFFFFFF
|
||||||
|
PBST [3] = 0xFFFFFFFF
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (UPBS, 0, NotSerialized)
|
||||||
|
{
|
||||||
|
If (^^PCI0.LPCB.EC0.BAT0)
|
||||||
|
{
|
||||||
|
Local0 = 0
|
||||||
|
Local1 = 0
|
||||||
|
If (^^AC.ACFG)
|
||||||
|
{
|
||||||
|
If (((^^PCI0.LPCB.EC0.BST0 & 0x02) == 0x02))
|
||||||
|
{
|
||||||
|
Local0 |= 0x02
|
||||||
|
Local1 = (^^PCI0.LPCB.EC0.BPR0 & 0xFFFF)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Else
|
||||||
|
{
|
||||||
|
Local0 |= 1
|
||||||
|
Local1 = (^^PCI0.LPCB.EC0.BPR0 & 0xFFFF)
|
||||||
|
}
|
||||||
|
|
||||||
|
Local7 = (Local1 & 0x8000)
|
||||||
|
If ((Local7 == 0x8000))
|
||||||
|
{
|
||||||
|
Local1 ^= 0xFFFF
|
||||||
|
}
|
||||||
|
|
||||||
|
Local2 = (^^PCI0.LPCB.EC0.BRC0 & 0xFFFF)
|
||||||
|
Local3 = (^^PCI0.LPCB.EC0.BPV0 & 0xFFFF)
|
||||||
|
PBST [0] = Local0
|
||||||
|
PBST [1] = Local1
|
||||||
|
PBST [2] = Local2
|
||||||
|
PBST [3] = Local3
|
||||||
|
If ((BFCC != ^^PCI0.LPCB.EC0.BFC0))
|
||||||
|
{
|
||||||
|
Notify (BAT0, 0x81) // Information Change
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Else
|
||||||
|
{
|
||||||
|
IVBS ()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_BST, 0, NotSerialized) // _BST: Battery Status
|
||||||
|
{
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK)
|
||||||
|
{
|
||||||
|
UPBS ()
|
||||||
|
}
|
||||||
|
Else
|
||||||
|
{
|
||||||
|
IVBS ()
|
||||||
|
}
|
||||||
|
|
||||||
|
Return (PBST) /* \_SB_.BAT0.PBST */
|
||||||
|
}
|
||||||
|
}
|
46
src/ec/dasharo/ec/acpi/battery_thresholds.asl
Normal file
46
src/ec/dasharo/ec/acpi/battery_thresholds.asl
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
Field (ERAM, ByteAcc, Lock, Preserve)
|
||||||
|
{
|
||||||
|
Offset (0xBC),
|
||||||
|
BTL0, 8, /* BAT0 charging start threshold */
|
||||||
|
BTH0, 8, /* BAT0 charging end threshold */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get battery charging threshold
|
||||||
|
*
|
||||||
|
* Arg0: 0: Start threshold
|
||||||
|
* 1: Stop threshold
|
||||||
|
*/
|
||||||
|
Method (GBCT, 1, NotSerialized)
|
||||||
|
{
|
||||||
|
If (Arg0 == 0) {
|
||||||
|
Return (BTL0)
|
||||||
|
}
|
||||||
|
|
||||||
|
If (Arg0 == 1) {
|
||||||
|
Return (BTH0)
|
||||||
|
}
|
||||||
|
|
||||||
|
Return (0xFF)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set battery charging threshold
|
||||||
|
*
|
||||||
|
* Arg0: 0: Start threshold
|
||||||
|
* 1: Stop threshold
|
||||||
|
* Arg1: Percentage
|
||||||
|
*/
|
||||||
|
Method (SBCT, 2, NotSerialized)
|
||||||
|
{
|
||||||
|
If (Arg1 <= 100) {
|
||||||
|
If (Arg0 == 0) {
|
||||||
|
BTL0 = Arg1
|
||||||
|
}
|
||||||
|
If (Arg0 == 1) {
|
||||||
|
BTH0 = Arg1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
13
src/ec/dasharo/ec/acpi/buttons.asl
Normal file
13
src/ec/dasharo/ec/acpi/buttons.asl
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
Device (PWRB)
|
||||||
|
{
|
||||||
|
Name (_HID, EisaId ("PNP0C0C"))
|
||||||
|
Name (_PRW, Package () { EC_GPE_SWI, 3 })
|
||||||
|
}
|
||||||
|
|
||||||
|
Device (SLPB)
|
||||||
|
{
|
||||||
|
Name (_HID, EisaId ("PNP0C0E"))
|
||||||
|
Name (_PRW, Package () { EC_GPE_SWI, 3 })
|
||||||
|
}
|
241
src/ec/dasharo/ec/acpi/ec.asl
Normal file
241
src/ec/dasharo/ec/acpi/ec.asl
Normal file
@@ -0,0 +1,241 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
Scope (\_SB) {
|
||||||
|
#include "ac.asl"
|
||||||
|
#include "battery.asl"
|
||||||
|
#include "buttons.asl"
|
||||||
|
#include "hid.asl"
|
||||||
|
#include "lid.asl"
|
||||||
|
#include "s76.asl"
|
||||||
|
}
|
||||||
|
|
||||||
|
Device (\_SB.PCI0.LPCB.EC0)
|
||||||
|
{
|
||||||
|
Name (_HID, EisaId ("PNP0C09") /* Embedded Controller Device */)
|
||||||
|
Name (_GPE, EC_GPE_SCI) // _GPE: General Purpose Events
|
||||||
|
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
|
||||||
|
{
|
||||||
|
IO (Decode16,
|
||||||
|
0x0062, // Range Minimum
|
||||||
|
0x0062, // Range Maximum
|
||||||
|
0x00, // Alignment
|
||||||
|
0x01, // Length
|
||||||
|
)
|
||||||
|
IO (Decode16,
|
||||||
|
0x0066, // Range Minimum
|
||||||
|
0x0066, // Range Maximum
|
||||||
|
0x00, // Alignment
|
||||||
|
0x01, // Length
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
#include "ec_ram.asl"
|
||||||
|
|
||||||
|
Name (ECOK, 0)
|
||||||
|
Method (_REG, 2, Serialized) // _REG: Region Availability
|
||||||
|
{
|
||||||
|
Printf ("EC: _REG %o %o", ToHexString(Arg0), ToHexString(Arg1))
|
||||||
|
If ((Arg0 == 0x03) && (Arg1 == 1)) {
|
||||||
|
// Enable hardware touchpad lock, airplane mode, and keyboard backlight keys
|
||||||
|
ECOS = 1
|
||||||
|
|
||||||
|
// Enable software display brightness keys
|
||||||
|
WINF = 1
|
||||||
|
|
||||||
|
// Set current AC state
|
||||||
|
^^^^AC.ACFG = ADP
|
||||||
|
// Update battery information and status
|
||||||
|
^^^^BAT0.UPBI()
|
||||||
|
^^^^BAT0.UPBS()
|
||||||
|
|
||||||
|
// Notify of changes
|
||||||
|
Notify(^^^^AC, 0)
|
||||||
|
Notify(^^^^BAT0, 0)
|
||||||
|
|
||||||
|
PNOT ()
|
||||||
|
|
||||||
|
// EC is now available
|
||||||
|
ECOK = Arg1
|
||||||
|
|
||||||
|
// Reset Dasharo Device
|
||||||
|
^^^^S76D.RSET()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Name (S3OS, 0)
|
||||||
|
Method (PTS, 1, Serialized) {
|
||||||
|
Printf ("EC: PTS: %o", ToHexString(Arg0))
|
||||||
|
If (ECOK) {
|
||||||
|
// Save ECOS during sleep
|
||||||
|
S3OS = ECOS
|
||||||
|
|
||||||
|
// Clear wake cause
|
||||||
|
WFNO = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (WAK, 1, Serialized) {
|
||||||
|
Printf ("EC: WAK: %o", ToHexString(Arg0))
|
||||||
|
If (ECOK) {
|
||||||
|
// Restore ECOS after sleep
|
||||||
|
ECOS = S3OS
|
||||||
|
|
||||||
|
// Set current AC state
|
||||||
|
^^^^AC.ACFG = ADP
|
||||||
|
|
||||||
|
// Update battery information and status
|
||||||
|
^^^^BAT0.UPBI()
|
||||||
|
^^^^BAT0.UPBS()
|
||||||
|
|
||||||
|
// Notify of changes
|
||||||
|
Notify(^^^^AC, 0)
|
||||||
|
Notify(^^^^BAT0, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q0A, 0, NotSerialized) // Touchpad Toggle
|
||||||
|
{
|
||||||
|
Printf ("EC: Touchpad Toggle")
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q0B, 0, NotSerialized) // Screen Toggle
|
||||||
|
{
|
||||||
|
Printf ("EC: Screen Toggle")
|
||||||
|
#if CONFIG(EC_DASHARO_EC_OLED)
|
||||||
|
Notify (^^^^S76D, 0x85)
|
||||||
|
#endif // CONFIG(EC_DASHARO_EC_OLED)
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q0C, 0, NotSerialized) // Mute
|
||||||
|
{
|
||||||
|
Printf ("EC: Mute")
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q0D, 0, NotSerialized) // Keyboard Backlight
|
||||||
|
{
|
||||||
|
Printf ("EC: Keyboard Backlight")
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q0E, 0, NotSerialized) // Volume Down
|
||||||
|
{
|
||||||
|
Printf ("EC: Volume Down")
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q0F, 0, NotSerialized) // Volume Up
|
||||||
|
{
|
||||||
|
Printf ("EC: Volume Up")
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q10, 0, NotSerialized) // Switch Video Mode
|
||||||
|
{
|
||||||
|
Printf ("EC: Switch Video Mode")
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q11, 0, NotSerialized) // Brightness Down
|
||||||
|
{
|
||||||
|
Printf ("EC: Brightness Down")
|
||||||
|
if (^^^^HIDD.HRDY) {
|
||||||
|
^^^^HIDD.HPEM (20)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q12, 0, NotSerialized) // Brightness Up
|
||||||
|
{
|
||||||
|
Printf ("EC: Brightness Up")
|
||||||
|
if (^^^^HIDD.HRDY) {
|
||||||
|
^^^^HIDD.HPEM (19)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q13, 0, NotSerialized) // Camera Toggle
|
||||||
|
{
|
||||||
|
Printf ("EC: Camera Toggle")
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q14, 0, NotSerialized) // Airplane Mode
|
||||||
|
{
|
||||||
|
Printf ("EC: Airplane Mode")
|
||||||
|
if (^^^^HIDD.HRDY) {
|
||||||
|
^^^^HIDD.HPEM (8)
|
||||||
|
}
|
||||||
|
// TODO: hardware airplane mode
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q15, 0, NotSerialized) // Suspend Button
|
||||||
|
{
|
||||||
|
Printf ("EC: Suspend Button")
|
||||||
|
Notify (SLPB, 0x80)
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q16, 0, NotSerialized) // AC Detect
|
||||||
|
{
|
||||||
|
Printf ("EC: AC Detect")
|
||||||
|
^^^^AC.ACFG = ADP
|
||||||
|
Notify (AC, 0x80) // Status Change
|
||||||
|
If (BAT0)
|
||||||
|
{
|
||||||
|
Notify (^^^^BAT0, 0x81) // Information Change
|
||||||
|
Notify (^^^^BAT0, 0x80) // Status Change
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q17, 0, NotSerialized) // BAT0 Update
|
||||||
|
{
|
||||||
|
Printf ("EC: BAT0 Update (17)")
|
||||||
|
Notify (^^^^BAT0, 0x81) // Information Change
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q19, 0, NotSerialized) // BAT0 Update
|
||||||
|
{
|
||||||
|
Printf ("EC: BAT0 Update (19)")
|
||||||
|
Notify (^^^^BAT0, 0x81) // Information Change
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q1B, 0, NotSerialized) // Lid Close
|
||||||
|
{
|
||||||
|
Printf ("EC: Lid Close")
|
||||||
|
Notify (LID0, 0x80)
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q1C, 0, NotSerialized) // Thermal Trip
|
||||||
|
{
|
||||||
|
Printf ("EC: Thermal Trip")
|
||||||
|
/* TODO
|
||||||
|
Notify (\_TZ.TZ0, 0x81) // Thermal Trip Point Change
|
||||||
|
Notify (\_TZ.TZ0, 0x80) // Thermal Status Change
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q1D, 0, NotSerialized) // Power Button
|
||||||
|
{
|
||||||
|
Printf ("EC: Power Button")
|
||||||
|
Notify (PWRB, 0x80)
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_Q50, 0, NotSerialized) // Other Events
|
||||||
|
{
|
||||||
|
Local0 = OEM4
|
||||||
|
If (Local0 == 0x8A) {
|
||||||
|
Printf ("EC: White Keyboard Backlight")
|
||||||
|
Notify (^^^^S76D, 0x80)
|
||||||
|
} ElseIf (Local0 == 0x9F) {
|
||||||
|
Printf ("EC: Color Keyboard Toggle")
|
||||||
|
Notify (^^^^S76D, 0x81)
|
||||||
|
} ElseIf (Local0 == 0x81) {
|
||||||
|
Printf ("EC: Color Keyboard Down")
|
||||||
|
Notify (^^^^S76D, 0x82)
|
||||||
|
} ElseIf (Local0 == 0x82) {
|
||||||
|
Printf ("EC: Color Keyboard Up")
|
||||||
|
Notify (^^^^S76D, 0x83)
|
||||||
|
} ElseIf (Local0 == 0x80) {
|
||||||
|
Printf ("EC: Color Keyboard Color Change")
|
||||||
|
Notify (^^^^S76D, 0x84)
|
||||||
|
} Else {
|
||||||
|
Printf ("EC: Other: %o", ToHexString(Local0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG(EC_DASHARO_EC_BAT_THRESHOLDS)
|
||||||
|
#include "battery_thresholds.asl"
|
||||||
|
#endif
|
||||||
|
}
|
55
src/ec/dasharo/ec/acpi/ec_ram.asl
Normal file
55
src/ec/dasharo/ec/acpi/ec_ram.asl
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
OperationRegion (ERAM, EmbeddedControl, 0, 0xFF)
|
||||||
|
Field (ERAM, ByteAcc, Lock, Preserve)
|
||||||
|
{
|
||||||
|
Offset (0x03),
|
||||||
|
LSTE, 1, // Lid is open
|
||||||
|
, 1,
|
||||||
|
LWKE, 1, // Lid wake
|
||||||
|
, 5,
|
||||||
|
Offset (0x07),
|
||||||
|
TMP1, 8, // CPU temperature
|
||||||
|
Offset (0x10),
|
||||||
|
ADP, 1, // AC adapter connected
|
||||||
|
, 1,
|
||||||
|
BAT0, 1, // Battery connected
|
||||||
|
, 5,
|
||||||
|
WFNO, 8, // Wake cause (not implemented)
|
||||||
|
Offset (0x16),
|
||||||
|
BDC0, 32, // Battery design capacity
|
||||||
|
BFC0, 32, // Battery full capacity
|
||||||
|
Offset (0x22),
|
||||||
|
BDV0, 32, // Battery design voltage
|
||||||
|
BST0, 32, // Battery status
|
||||||
|
BPR0, 32, // Battery current
|
||||||
|
BRC0, 32, // Battery remaining capacity
|
||||||
|
BPV0, 32, // Battery voltage
|
||||||
|
Offset (0x3A),
|
||||||
|
BCW0, 32,
|
||||||
|
BCL0, 32,
|
||||||
|
CYC0, 16, // Battery cycle count
|
||||||
|
Offset (0x68),
|
||||||
|
ECOS, 8, // Detected OS, 0 = no ACPI, 1 = ACPI but no driver, 2 = ACPI with driver
|
||||||
|
Offset (0xC8),
|
||||||
|
OEM1, 8,
|
||||||
|
OEM2, 8,
|
||||||
|
OEM3, 16,
|
||||||
|
OEM4, 8, // Extra SCI data
|
||||||
|
Offset (0xCD),
|
||||||
|
TMP2, 8, // GPU temperature
|
||||||
|
DUT1, 8, // Fan 1 duty
|
||||||
|
DUT2, 8, // Fan 2 duty
|
||||||
|
RPM1, 16, // Fan 1 RPM
|
||||||
|
RPM2, 16, // Fan 2 RPM
|
||||||
|
Offset (0xD9),
|
||||||
|
AIRP, 8, // Airplane mode LED
|
||||||
|
WINF, 8, // Enable ACPI brightness controls
|
||||||
|
Offset (0xF8),
|
||||||
|
FCMD, 8,
|
||||||
|
FDAT, 8,
|
||||||
|
FBUF, 8,
|
||||||
|
FBF1, 8,
|
||||||
|
FBF2, 8,
|
||||||
|
FBF3, 8,
|
||||||
|
}
|
50
src/ec/dasharo/ec/acpi/hid.asl
Normal file
50
src/ec/dasharo/ec/acpi/hid.asl
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
Device (HIDD)
|
||||||
|
{
|
||||||
|
Name (_HID, "INT33D5")
|
||||||
|
Name (HBSY, 0)
|
||||||
|
Name (HIDX, 0)
|
||||||
|
Name (HRDY, 0)
|
||||||
|
|
||||||
|
Method (HDEM, 0, Serialized)
|
||||||
|
{
|
||||||
|
HBSY = 0
|
||||||
|
Return (HIDX)
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (HDMM, 0, Serialized)
|
||||||
|
{
|
||||||
|
Return (0)
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (HDSM, 1, Serialized)
|
||||||
|
{
|
||||||
|
HRDY = Arg0
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (HPEM, 1, Serialized)
|
||||||
|
{
|
||||||
|
HBSY = 1
|
||||||
|
HIDX = Arg0
|
||||||
|
|
||||||
|
Notify (HIDD, 0xC0)
|
||||||
|
Local0 = 0
|
||||||
|
While ((Local0 < 0xFA) && HBSY)
|
||||||
|
{
|
||||||
|
Sleep (0x04)
|
||||||
|
Local0++
|
||||||
|
}
|
||||||
|
|
||||||
|
If (HBSY == 1)
|
||||||
|
{
|
||||||
|
HBSY = 0
|
||||||
|
HIDX = 0
|
||||||
|
Return (1)
|
||||||
|
}
|
||||||
|
Else
|
||||||
|
{
|
||||||
|
Return (0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
23
src/ec/dasharo/ec/acpi/lid.asl
Normal file
23
src/ec/dasharo/ec/acpi/lid.asl
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
Device (LID0)
|
||||||
|
{
|
||||||
|
Name (_HID, EisaId ("PNP0C0D"))
|
||||||
|
Name (_PRW, Package () { EC_GPE_SWI, 3 })
|
||||||
|
|
||||||
|
Method (_LID, 0, NotSerialized) {
|
||||||
|
Printf ("LID: _LID")
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
Return (^^PCI0.LPCB.EC0.LSTE)
|
||||||
|
} Else {
|
||||||
|
Return (1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (_PSW, 1, NotSerialized) {
|
||||||
|
Printf ("LID: _PSW: %o", ToHexString(Arg0))
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
^^PCI0.LPCB.EC0.LWKE = Arg0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
178
src/ec/dasharo/ec/acpi/s76.asl
Normal file
178
src/ec/dasharo/ec/acpi/s76.asl
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
// Notifications:
|
||||||
|
// 0x80 - hardware backlight toggle
|
||||||
|
// 0x81 - backlight toggle
|
||||||
|
// 0x82 - backlight down
|
||||||
|
// 0x83 - backlight up
|
||||||
|
// 0x84 - backlight color change
|
||||||
|
// 0x85 - OLED screen toggle
|
||||||
|
Device (S76D) {
|
||||||
|
Name (_HID, "17761776")
|
||||||
|
Name (_UID, 0)
|
||||||
|
// Hide the device so that Windows does not warn about a missing driver.
|
||||||
|
Name (_STA, 0xB)
|
||||||
|
|
||||||
|
Method (RSET, 0, Serialized) {
|
||||||
|
Printf ("S76D: RSET")
|
||||||
|
SAPL(0)
|
||||||
|
SKBB(0)
|
||||||
|
SKBC(0xFFFFFF)
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (INIT, 0, Serialized) {
|
||||||
|
Printf ("S76D: INIT")
|
||||||
|
RSET()
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
// Set flags to use software control
|
||||||
|
^^PCI0.LPCB.EC0.ECOS = 2
|
||||||
|
Return (0)
|
||||||
|
} Else {
|
||||||
|
Return (1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Method (FINI, 0, Serialized) {
|
||||||
|
Printf ("S76D: FINI")
|
||||||
|
RSET()
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
// Set flags to use hardware control
|
||||||
|
^^PCI0.LPCB.EC0.ECOS = 1
|
||||||
|
Return (0)
|
||||||
|
} Else {
|
||||||
|
Return (1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Airplane LED
|
||||||
|
Method (GAPL, 0, Serialized) {
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
If (^^PCI0.LPCB.EC0.AIRP & 0x40) {
|
||||||
|
Return (1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Return (0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set Airplane LED
|
||||||
|
Method (SAPL, 1, Serialized) {
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
If (Arg0) {
|
||||||
|
^^PCI0.LPCB.EC0.AIRP |= 0x40
|
||||||
|
} Else {
|
||||||
|
^^PCI0.LPCB.EC0.AIRP &= 0xBF
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Keyboard Backlight Kind
|
||||||
|
// 0 - No backlight
|
||||||
|
// 1 - White backlight
|
||||||
|
// 2 - RGB backlight
|
||||||
|
Method (GKBK, 0, Serialized) {
|
||||||
|
Local0 = 0
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
^^PCI0.LPCB.EC0.FDAT = 2
|
||||||
|
^^PCI0.LPCB.EC0.FCMD = 0xCA
|
||||||
|
Local0 = ^^PCI0.LPCB.EC0.FBUF
|
||||||
|
}
|
||||||
|
Return (Local0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Keyboard Brightness
|
||||||
|
Method (GKBB, 0, Serialized) {
|
||||||
|
Local0 = 0
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
^^PCI0.LPCB.EC0.FDAT = 1
|
||||||
|
^^PCI0.LPCB.EC0.FCMD = 0xCA
|
||||||
|
Local0 = ^^PCI0.LPCB.EC0.FBUF
|
||||||
|
}
|
||||||
|
Return (Local0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set Keyboard Brightness
|
||||||
|
Method (SKBB, 1, Serialized) {
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
^^PCI0.LPCB.EC0.FDAT = 0
|
||||||
|
^^PCI0.LPCB.EC0.FBUF = Arg0
|
||||||
|
^^PCI0.LPCB.EC0.FCMD = 0xCA
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Keyboard Color
|
||||||
|
Method (GKBC, 0, Serialized) {
|
||||||
|
Local0 = 0
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
^^PCI0.LPCB.EC0.FDAT = 4
|
||||||
|
^^PCI0.LPCB.EC0.FCMD = 0xCA
|
||||||
|
Local0 = ^^PCI0.LPCB.EC0.FBUF
|
||||||
|
Local0 |= (^^PCI0.LPCB.EC0.FBF1) << 16
|
||||||
|
Local0 |= (^^PCI0.LPCB.EC0.FBF2) << 8
|
||||||
|
}
|
||||||
|
Return (Local0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set Keyboard Color
|
||||||
|
Method (SKBC, 1, Serialized) {
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
^^PCI0.LPCB.EC0.FDAT = 3
|
||||||
|
^^PCI0.LPCB.EC0.FBUF = (Arg0 & 0xFF)
|
||||||
|
^^PCI0.LPCB.EC0.FBF1 = ((Arg0 >> 16) & 0xFF)
|
||||||
|
^^PCI0.LPCB.EC0.FBF2 = ((Arg0 >> 8) & 0xFF)
|
||||||
|
^^PCI0.LPCB.EC0.FCMD = 0xCA
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fan names
|
||||||
|
Method (NFAN, 0, Serialized) {
|
||||||
|
Return (Package() {
|
||||||
|
"CPU fan",
|
||||||
|
#if CONFIG(EC_DASHARO_EC_DGPU)
|
||||||
|
"GPU fan",
|
||||||
|
#endif
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get fan duty cycle and RPM as a single value
|
||||||
|
Method (GFAN, 1, Serialized) {
|
||||||
|
Local0 = 0
|
||||||
|
Local1 = 0
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
If (Arg0 == 0) {
|
||||||
|
Local0 = ^^PCI0.LPCB.EC0.DUT1
|
||||||
|
Local1 = ^^PCI0.LPCB.EC0.RPM1
|
||||||
|
} ElseIf (Arg0 == 1) {
|
||||||
|
Local0 = ^^PCI0.LPCB.EC0.DUT2
|
||||||
|
Local1 = ^^PCI0.LPCB.EC0.RPM2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
If (Local1 != 0) {
|
||||||
|
// 60 * (EC frequency / 120) / 2
|
||||||
|
Local1 = 2156250 / Local1
|
||||||
|
}
|
||||||
|
Return ((Local1 << 8) | Local0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Temperature names
|
||||||
|
Method (NTMP, 0, Serialized) {
|
||||||
|
Return (Package() {
|
||||||
|
"CPU temp",
|
||||||
|
#if CONFIG(EC_DASHARO_EC_DGPU)
|
||||||
|
"GPU temp",
|
||||||
|
#endif
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get temperature
|
||||||
|
Method (GTMP, 1, Serialized) {
|
||||||
|
Local0 = 0;
|
||||||
|
If (^^PCI0.LPCB.EC0.ECOK) {
|
||||||
|
If (Arg0 == 0) {
|
||||||
|
Local0 = ^^PCI0.LPCB.EC0.TMP1
|
||||||
|
} ElseIf (Arg0 == 1) {
|
||||||
|
Local0 = ^^PCI0.LPCB.EC0.TMP2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Return (Local0)
|
||||||
|
}
|
||||||
|
}
|
112
src/ec/dasharo/ec/dasharo_ec.c
Normal file
112
src/ec/dasharo/ec/dasharo_ec.c
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
#include "dasharo_ec.h"
|
||||||
|
#include <arch/io.h>
|
||||||
|
#include <console/dasharo_ec.h>
|
||||||
|
#include <console/console.h>
|
||||||
|
#include <timer.h>
|
||||||
|
|
||||||
|
// This is the command region for Dasharo EC firmware. It must be
|
||||||
|
// enabled for LPC in the mainboard.
|
||||||
|
#define DASHARO_EC_BASE 0x0E00
|
||||||
|
#define DASHARO_EC_SIZE 256
|
||||||
|
|
||||||
|
#define REG_CMD 0
|
||||||
|
#define REG_RESULT 1
|
||||||
|
#define REG_DATA 2 // Start of command data
|
||||||
|
|
||||||
|
// When command register is 0, command is complete
|
||||||
|
#define CMD_FINISHED 0
|
||||||
|
|
||||||
|
#define RESULT_OK 0
|
||||||
|
|
||||||
|
// Print command. Registers are unique for each command
|
||||||
|
#define CMD_PRINT 4
|
||||||
|
#define CMD_PRINT_REG_FLAGS 2
|
||||||
|
#define CMD_PRINT_REG_LEN 3
|
||||||
|
#define CMD_PRINT_REG_DATA 4
|
||||||
|
|
||||||
|
static inline uint8_t dasharo_ec_read(uint8_t addr)
|
||||||
|
{
|
||||||
|
return inb(DASHARO_EC_BASE + (uint16_t)addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void dasharo_ec_write(uint8_t addr, uint8_t data)
|
||||||
|
{
|
||||||
|
outb(data, DASHARO_EC_BASE + (uint16_t)addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dasharo_ec_init(void)
|
||||||
|
{
|
||||||
|
// Clear entire command region
|
||||||
|
for (int i = 0; i < DASHARO_EC_SIZE; i++)
|
||||||
|
dasharo_ec_write((uint8_t)i, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dasharo_ec_flush(void)
|
||||||
|
{
|
||||||
|
dasharo_ec_write(REG_CMD, CMD_PRINT);
|
||||||
|
|
||||||
|
// Wait for command completion, for up to 10 milliseconds, with a
|
||||||
|
// test period of 1 microsecond
|
||||||
|
wait_us(10000, dasharo_ec_read(REG_CMD) == CMD_FINISHED);
|
||||||
|
|
||||||
|
dasharo_ec_write(CMD_PRINT_REG_LEN, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dasharo_ec_print(uint8_t byte)
|
||||||
|
{
|
||||||
|
uint8_t len = dasharo_ec_read(CMD_PRINT_REG_LEN);
|
||||||
|
dasharo_ec_write(CMD_PRINT_REG_DATA + len, byte);
|
||||||
|
dasharo_ec_write(CMD_PRINT_REG_LEN, len + 1);
|
||||||
|
|
||||||
|
// If we hit the end of the buffer, or were given a newline, flush
|
||||||
|
if (byte == '\n' || len >= (DASHARO_EC_SIZE - CMD_PRINT_REG_DATA))
|
||||||
|
dasharo_ec_flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dasharo_ec_cmd(uint8_t cmd, const uint8_t *request_data,
|
||||||
|
uint8_t request_size, uint8_t *reply_data, uint8_t reply_size)
|
||||||
|
{
|
||||||
|
if (request_size > DASHARO_EC_SIZE - REG_DATA ||
|
||||||
|
reply_size > DASHARO_EC_SIZE - REG_DATA) {
|
||||||
|
printk(BIOS_ERR, "EC command %d too long - request size %u, reply size %u\n",
|
||||||
|
cmd, request_size, reply_size);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If any data were buffered by dasharo_ec_print(), flush it first */
|
||||||
|
uint8_t buffered_len = dasharo_ec_read(CMD_PRINT_REG_LEN);
|
||||||
|
if (buffered_len > 0)
|
||||||
|
dasharo_ec_flush();
|
||||||
|
|
||||||
|
/* Write the data */
|
||||||
|
uint8_t i;
|
||||||
|
for (i = 0; i < request_size; ++i)
|
||||||
|
dasharo_ec_write(REG_DATA + i, request_data[i]);
|
||||||
|
|
||||||
|
/* Write the command */
|
||||||
|
dasharo_ec_write(REG_CMD, cmd);
|
||||||
|
|
||||||
|
/* Wait for the command to complete */
|
||||||
|
bool ret = true;
|
||||||
|
int elapsed = wait_ms(1000, dasharo_ec_read(REG_CMD) == CMD_FINISHED);
|
||||||
|
if (elapsed == 0) {
|
||||||
|
/* Timed out: fail the command, don't attempt to read a reply. */
|
||||||
|
printk(BIOS_WARNING, "EC command %d timed out - request size %d, reply size %d\n",
|
||||||
|
cmd, request_size, reply_size);
|
||||||
|
ret = false;
|
||||||
|
} else {
|
||||||
|
/* Read the reply */
|
||||||
|
for (i = 0; i < reply_size; ++i)
|
||||||
|
reply_data[i] = dasharo_ec_read(REG_DATA+i);
|
||||||
|
/* Check the reply status */
|
||||||
|
ret = (dasharo_ec_read(REG_RESULT) == RESULT_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset the flags and length so we can buffer console prints again */
|
||||||
|
dasharo_ec_write(CMD_PRINT_REG_FLAGS, 0);
|
||||||
|
dasharo_ec_write(CMD_PRINT_REG_LEN, 0);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
17
src/ec/dasharo/ec/dasharo_ec.h
Normal file
17
src/ec/dasharo/ec/dasharo_ec.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
#ifndef DASHARO_EC_H
|
||||||
|
#define DASHARO_EC_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send a command to the EC. request_data/request_size are the request payload,
|
||||||
|
* request_data can be NULL if request_size is 0. reply_data/reply_size are
|
||||||
|
* the reply payload, reply_data can be NULL if reply_size is 0.
|
||||||
|
*/
|
||||||
|
bool dasharo_ec_cmd(uint8_t cmd, const uint8_t *request_data,
|
||||||
|
uint8_t request_size, uint8_t *reply_data, uint8_t reply_size);
|
||||||
|
|
||||||
|
#endif
|
9
src/ec/dasharo/ec/smbios.c
Normal file
9
src/ec/dasharo/ec/smbios.c
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
#include <smbios.h>
|
||||||
|
|
||||||
|
smbios_wakeup_type smbios_system_wakeup_type(void)
|
||||||
|
{
|
||||||
|
// TODO: Read wake source from EC.
|
||||||
|
return SMBIOS_WAKEUP_TYPE_POWER_SWITCH;
|
||||||
|
}
|
Reference in New Issue
Block a user