[coreboot-gerrit] Change in coreboot[master]: ec/lenovo/h8: Implement ACPI methods to set battery thresholds
Alexey Derlaft (Code Review)
gerrit at coreboot.org
Mon Jan 8 23:32:29 CET 2018
Alexey Derlaft has uploaded this change for review. ( https://review.coreboot.org/23178
Change subject: ec/lenovo/h8: Implement ACPI methods to set battery thresholds
......................................................................
ec/lenovo/h8: Implement ACPI methods to set battery thresholds
There are two known (yet) different ways to
manage battery thresholds.
This patch implements them
and adds a way to enable them for
different mobos.
Change-Id: I2a90f9e9b32462b8a5e9bc8d3087ae0fea563ea5
Signed-off-by: Alexey Kharlamov <der at 2-47.ru>
---
M src/ec/lenovo/h8/Kconfig
M src/ec/lenovo/h8/acpi/ec.asl
A src/ec/lenovo/h8/acpi/tp_acpi_bat.asl
A src/ec/lenovo/h8/acpi/tp_acpi_bat_24.asl
A src/ec/lenovo/h8/acpi/tp_acpi_bat_b0.asl
M src/mainboard/lenovo/t400/Kconfig
M src/mainboard/lenovo/t420/Kconfig
M src/mainboard/lenovo/t420s/Kconfig
M src/mainboard/lenovo/t430/Kconfig
M src/mainboard/lenovo/t430s/Kconfig
10 files changed, 361 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/78/23178/1
diff --git a/src/ec/lenovo/h8/Kconfig b/src/ec/lenovo/h8/Kconfig
index 190f4a9..5360be8 100644
--- a/src/ec/lenovo/h8/Kconfig
+++ b/src/ec/lenovo/h8/Kconfig
@@ -21,6 +21,31 @@
help
Flash all LEDs when encountered a fatal error.
+config IMPLEMENTS_ACPI_H8_BAT_TRESHOLDS
+ bool
+ help
+ Select this if you mainboard implements the GETT
+ and SETT to get and set battery starting and stopping
+ charging tresholds. This will then implement the
+ tpacpi-bat interface provides to include
+
+config IMPLEMENTS_ACPI_H8_BAT_TRESHOLDS_24
+ bool
+ select IMPLEMENTS_ACPI_H8_BAT_TRESHOLDS
+ help
+ Select this to enable an implementation for setting
+ battery thresholds that is suitable for the older
+ Lenovo Thinkpad laptops: X200, T400, T500, and probably some others.
+
+config IMPLEMENTS_ACPI_H8_BAT_TRESHOLDS_B0
+ bool
+ select IMPLEMENTS_ACPI_H8_BAT_TRESHOLDS
+ help
+ Select this to enable an implementation for setting
+ battery thresholds that is suitable for the newer
+ Lenovo Thinkpad laptops: X220/230, T420/430,
+ and probably some others.
+
endif
config H8_DOCK_EARLY_INIT
diff --git a/src/ec/lenovo/h8/acpi/ec.asl b/src/ec/lenovo/h8/acpi/ec.asl
index 944858f..d133061 100644
--- a/src/ec/lenovo/h8/acpi/ec.asl
+++ b/src/ec/lenovo/h8/acpi/ec.asl
@@ -436,6 +436,10 @@
{
Return (\_SB.PCI0.LPCB.EC.GSTS)
}
+
+ #if IS_ENABLED(CONFIG_IMPLEMENTS_ACPI_H8_BAT_TRESHOLDS)
+ #include "tp_acpi_bat.asl"
+ #endif
}
#include "ac.asl"
diff --git a/src/ec/lenovo/h8/acpi/tp_acpi_bat.asl b/src/ec/lenovo/h8/acpi/tp_acpi_bat.asl
new file mode 100644
index 0000000..33858f3
--- /dev/null
+++ b/src/ec/lenovo/h8/acpi/tp_acpi_bat.asl
@@ -0,0 +1,158 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2017 Arthur Heymans <arthur at aheymans.xyz>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; version 2 of
+ * the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+/*
+ * This defines the methods tpacpi-bat can use. This implements what
+ * the vendor defines but is rather ugly...
+ */
+
+/* SetBatteryCharge Start/Stop Capacity Threshold
+ * In Parameter:
+ * DWORD
+ * Bit 7-0: Charge stop capacity (Unit:%)
+ * =0: Use battery default setting
+ * =1-99: Threshold to stop charging battery (Relative capacity)
+ * Bit 9-8:BatteryID
+ * = 0: Any battery
+ * = 1: Primary battery
+ * = 2: Secondary battery
+ * = Others: Reserved (0)
+ * Bit 31-10: Reserved (0)
+ * Must be Zero
+ *
+ * Out Parameter:
+ * DWORD
+ * Bit 30-0: Reserved (0)
+ * Bit 31: Error status
+ * 0 ... Success
+ * 1 ... Fail
+ */
+
+#define START_THRESH_ARG 0
+#define STOP_THRESH_ARG 1
+/* set stop threshold */
+Method (BCSS, 1, NotSerialized)
+{
+ Local0 = Arg0 & 0xff /* percentage */
+ Local1 = (Arg0 >> 8) & 0x3 /* BAT id */
+ If (Local1 == 0) /* default bat */
+ {
+ \_SB.PCI0.LPCB.EC.BAT0.SETT(STOP_THRESH_ARG, Arg0)
+ Return ((Local0 !=
+ \_SB.PCI0.LPCB.EC.BAT0.GETT(STOP_THRESH_ARG)) << 31)
+ }
+ If (Local1 == 1)
+ {
+ \_SB.PCI0.LPCB.EC.BAT0.SETT(STOP_THRESH_ARG, Arg0)
+ Return ((Local0 !=
+ \_SB.PCI0.LPCB.EC.BAT0.GETT(STOP_THRESH_ARG)) << 31)
+ }
+ If (Local1 == 2)
+ {
+ \_SB.PCI0.LPCB.EC.BAT1.SETT(STOP_THRESH_ARG, Arg0)
+ Return ((Local0 !=
+ \_SB.PCI0.LPCB.EC.BAT1.GETT(STOP_THRESH_ARG)) << 31)
+ }
+ Return (1 << 31) /* Should not be reached */
+}
+
+/* Set start threshold */
+Method (BCCS, 1, NotSerialized)
+{
+ Local0 = Arg0 & 0xff /* percentage */
+ Local1 = (Arg0 >> 8) & 0x3 /* BAT id */
+ If (Local1 == 0) /* default bat */
+ {
+ \_SB.PCI0.LPCB.EC.BAT0.SETT(START_THRESH_ARG, Arg0)
+ Return ((Local0 !=
+ \_SB.PCI0.LPCB.EC.BAT0.GETT(START_THRESH_ARG)) << 31)
+ }
+ If (Local1 == 1)
+ {
+ \_SB.PCI0.LPCB.EC.BAT0.SETT(START_THRESH_ARG, Arg0)
+ Return ((Local0 !=
+ \_SB.PCI0.LPCB.EC.BAT0.GETT(START_THRESH_ARG)) << 31)
+ }
+ If (Local1 == 2)
+ {
+ \_SB.PCI0.LPCB.EC.BAT0.SETT(START_THRESH_ARG, Arg0)
+ Return ((Local0 !=
+ \_SB.PCI0.LPCB.EC.BAT1.GETT(START_THRESH_ARG)) << 31)
+ }
+ Return (1 << 31) /* Should not be reached */
+}
+
+/*
+ * GetBatteryCharge Start/Stop Capacity Threshold
+ * In Parameter:
+ * DWORD
+ * Bit 7-0:BatteryID
+ * Bit 31-8: Reserved (0)
+ * Must be Zero
+ *
+ * Out Parameter:
+ * DWORD
+ * Bit 7-0: Charge stop capacity (Unit:%)
+ * =0: Use battery default setting
+ * =1-99: Threshold to stop charging battery (Relative capacity)
+ * =Others: Reserved (0)
+ * Bit 9-8: Capability of BatteryCharge Stop Capacity Threshold
+ * Bit 8:Batterycharge stop capacity threshold
+ * (0:Not support 1:Support)
+ * Bit 9: Specify every battery parameter
+ * (0:Not support(apply parameter for all battery)
+ * 1:Support(apply parameter for all battery))
+ * Bit 30-10: Reserved (0)
+ * Bit 31: Error status
+ * 0 ... Success
+ * 1 ... Fail
+*/
+
+/* get stop threshold */
+Method (BCSG, 1, NotSerialized)
+{
+ If (Arg0 == 0) /* Default battery */
+ {
+ Return (0x300 | \_SB.PCI0.LPCB.EC.BAT0.GETT(STOP_THRESH_ARG))
+ }
+ If (Arg0 == 1) /* battery1 */
+ {
+ Return (0x300 | \_SB.PCI0.LPCB.EC.BAT0.GETT(STOP_THRESH_ARG))
+ }
+ If (Arg0 == 2) /* battery2 */
+ {
+ Return (0x300 | \_SB.PCI0.LPCB.EC.BAT1.GETT(STOP_THRESH_ARG))
+ }
+ Return (1 << 31)
+}
+
+/* get start threshold */
+Method (BCTG, 1, NotSerialized)
+{
+ If (Arg0 == 0) /* Default battery */
+ {
+ Return (0x300 | \_SB.PCI0.LPCB.EC.BAT0.GETT(START_THRESH_ARG))
+ }
+ If (Arg0 == 1) /* battery1 */
+ {
+ Return (0x300 | \_SB.PCI0.LPCB.EC.BAT0.GETT(START_THRESH_ARG))
+ }
+ If (Arg0 == 2) /* battery2 */
+ {
+ Return (0x300 | \_SB.PCI0.LPCB.EC.BAT1.GETT(START_THRESH_ARG))
+ }
+ Return (1 << 31)
+}
diff --git a/src/ec/lenovo/h8/acpi/tp_acpi_bat_24.asl b/src/ec/lenovo/h8/acpi/tp_acpi_bat_24.asl
new file mode 100644
index 0000000..40ddeaf
--- /dev/null
+++ b/src/ec/lenovo/h8/acpi/tp_acpi_bat_24.asl
@@ -0,0 +1,78 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2017 Arthur Heymans <arthur at aheymans.xyz>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; version 2 of
+ * the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+
+Scope(\_SB.PCI0.LPCB.EC)
+{
+ Field (ERAM, ByteAcc, NoLock, Preserve)
+ {
+ Offset (0x03),
+ , 2,
+ BSTP, 1, /* Battery start/stop threshold */
+ Offset (0x24),
+ TSH0, 8, /* Battery0 threshold */
+ Offset (0x25),
+ TSH1, 8 /* Battery1 threshold */
+ }
+}
+
+Scope(\_SB.PCI0.LPCB.EC.BAT0)
+{
+ /*
+ * Set threshold on battery0,
+ * Arg0: threshold (0 start, 1 stop) charging, Arg1: Threshold
+ */
+ Method (SETT, 2, NotSerialized)
+ {
+ if (Arg0 <= 1 && Arg1 <= 100) {
+ BSTP = Arg0
+ TSH0 = Arg1 | 0x80
+ }
+ }
+ /* Get threshold on battery0, Arg0: (0 start, 1 stop) chargning */
+ Method (GETT, 1, NotSerialized)
+ {
+ if (Arg0 <= 1) {
+ BSTP = Arg0
+ Return (TSH0)
+ }
+ Return (0)
+ }
+}
+
+Scope(\_SB.PCI0.LPCB.EC.BAT1)
+{
+ /*
+ * Set threshold on battery1,
+ * Arg0: threshold (0 start, 1 stop) charging, Arg1: Threshold
+ */
+ Method (SETT, 2, NotSerialized)
+ {
+ if (Arg0 <= 1 && Arg1 <= 100) {
+ BSTP = Arg0
+ TSH1 = Arg1 | 0x80
+ }
+ }
+ /* Get threshold on battery1, Arg0: (0 start, 1 stop) chargning */
+ Method (GETT, 1, NotSerialized)
+ {
+ if (Arg0 <= 1) {
+ BSTP = Arg0
+ Return (TSH1)
+ }
+ Return (0)
+ }
+}
diff --git a/src/ec/lenovo/h8/acpi/tp_acpi_bat_b0.asl b/src/ec/lenovo/h8/acpi/tp_acpi_bat_b0.asl
new file mode 100644
index 0000000..8040b17
--- /dev/null
+++ b/src/ec/lenovo/h8/acpi/tp_acpi_bat_b0.asl
@@ -0,0 +1,91 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2017 Arthur Heymans <arthur at aheymans.xyz>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; version 2 of
+ * the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+
+Scope(\_SB.PCI0.LPCB.EC)
+{
+ Field (ERAM, ByteAcc, NoLock, Preserve)
+ {
+ Offset (0xb0),
+ TSL0, 8, /* Battery0 start threshold */
+ Offset (0xb1),
+ TSH0, 8, /* Battery0 stop threshold */
+ Offset (0xb2),
+ TSL1, 8, /* Battery1 start threshold */
+ Offset (0xb3),
+ TSH1, 8 /* Battery1 stop threshold */
+ }
+}
+
+Scope(\_SB.PCI0.LPCB.EC.BAT0)
+{
+ /*
+ * Set threshold on battery0,
+ * Arg0: threshold (0 start, 1 stop) charging, Arg1: Threshold
+ */
+ Method (SETT, 2, NotSerialized)
+ {
+ if (Arg1 <= 100) {
+ if (Arg0 == 0) {
+ TSL0 = Arg1
+ }
+ if (Arg0 == 1) {
+ TSH0 = Arg1
+ }
+ }
+ }
+ /* Get threshold on battery0, Arg0: (0 start, 1 stop) chargning */
+ Method (GETT, 1, NotSerialized)
+ {
+ if (Arg0 == 0) {
+ Return (TSL0)
+ }
+ if (Arg0 == 1) {
+ Return (TSH0)
+ }
+ Return (0)
+ }
+}
+
+Scope(\_SB.PCI0.LPCB.EC.BAT1)
+{
+ /*
+ * Set threshold on battery1,
+ * Arg0: threshold (0 start, 1 stop) charging, Arg1: Threshold
+ */
+ Method (SETT, 2, NotSerialized)
+ {
+ if (Arg1 <= 100) {
+ if (Arg0 == 0) {
+ TSL1 = Arg1
+ }
+ if (Arg0 == 1) {
+ TSH1 = Arg1
+ }
+ }
+ }
+ /* Get threshold on battery1, Arg0: (0 start, 1 stop) chargning */
+ Method (GETT, 1, NotSerialized)
+ {
+ if (Arg0 == 0) {
+ Return (TSL1)
+ }
+ if (Arg0 == 1) {
+ Return (TSH1)
+ }
+ Return (0)
+ }
+}
diff --git a/src/mainboard/lenovo/t400/Kconfig b/src/mainboard/lenovo/t400/Kconfig
index 8eb5fc5..6c9b1d3 100644
--- a/src/mainboard/lenovo/t400/Kconfig
+++ b/src/mainboard/lenovo/t400/Kconfig
@@ -8,6 +8,7 @@
select SOUTHBRIDGE_INTEL_I82801IX
select EC_LENOVO_PMH7
select EC_LENOVO_H8
+ select IMPLEMENTS_ACPI_H8_BAT_TRESHOLDS_24
select H8_DOCK_EARLY_INIT
select BOARD_ROMSIZE_KB_8192
select DRIVERS_GENERIC_IOAPIC
diff --git a/src/mainboard/lenovo/t420/Kconfig b/src/mainboard/lenovo/t420/Kconfig
index c0b4752..c2044e7 100644
--- a/src/mainboard/lenovo/t420/Kconfig
+++ b/src/mainboard/lenovo/t420/Kconfig
@@ -9,6 +9,7 @@
select SOUTHBRIDGE_INTEL_BD82X6X
select EC_LENOVO_PMH7
select EC_LENOVO_H8
+ select IMPLEMENTS_ACPI_H8_BAT_TRESHOLDS_B0
select NO_UART_ON_SUPERIO
select BOARD_ROMSIZE_KB_8192
select HAVE_ACPI_TABLES
diff --git a/src/mainboard/lenovo/t420s/Kconfig b/src/mainboard/lenovo/t420s/Kconfig
index 08052b1..ab579fb 100644
--- a/src/mainboard/lenovo/t420s/Kconfig
+++ b/src/mainboard/lenovo/t420s/Kconfig
@@ -9,6 +9,7 @@
select SOUTHBRIDGE_INTEL_BD82X6X
select EC_LENOVO_PMH7
select EC_LENOVO_H8
+ select IMPLEMENTS_ACPI_H8_BAT_TRESHOLDS_B0
select NO_UART_ON_SUPERIO
select BOARD_ROMSIZE_KB_8192
select HAVE_ACPI_TABLES
diff --git a/src/mainboard/lenovo/t430/Kconfig b/src/mainboard/lenovo/t430/Kconfig
index a621fdb..8d759c0 100644
--- a/src/mainboard/lenovo/t430/Kconfig
+++ b/src/mainboard/lenovo/t430/Kconfig
@@ -6,6 +6,7 @@
select CPU_INTEL_SOCKET_RPGA989
select DRIVERS_RICOH_RCE822
select EC_LENOVO_H8
+ select IMPLEMENTS_ACPI_H8_BAT_TRESHOLDS_B0
select EC_LENOVO_PMH7
select NO_UART_ON_SUPERIO
select HAVE_ACPI_RESUME
diff --git a/src/mainboard/lenovo/t430s/Kconfig b/src/mainboard/lenovo/t430s/Kconfig
index f45fb0d..5f68d90 100644
--- a/src/mainboard/lenovo/t430s/Kconfig
+++ b/src/mainboard/lenovo/t430s/Kconfig
@@ -9,6 +9,7 @@
select SOUTHBRIDGE_INTEL_C216
select EC_LENOVO_PMH7
select EC_LENOVO_H8
+ select IMPLEMENTS_ACPI_H8_BAT_TRESHOLDS_B0
select NO_UART_ON_SUPERIO
select BOARD_ROMSIZE_KB_16384
select HAVE_ACPI_TABLES
--
To view, visit https://review.coreboot.org/23178
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I2a90f9e9b32462b8a5e9bc8d3087ae0fea563ea5
Gerrit-Change-Number: 23178
Gerrit-PatchSet: 1
Gerrit-Owner: Alexey Derlaft <derlafff at ya.ru>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180108/b5a72610/attachment-0001.html>
More information about the coreboot-gerrit
mailing list