[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