summaryrefslogtreecommitdiffstats
path: root/src/ec/lenovo/h8/acpi/thinkpad_bat_thresholds.asl
blob: 67a15faf0aa985497075bab368b8d13590acb9bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/* SPDX-License-Identifier: GPL-2.0-only */
/* This file is part of the coreboot project. */

/*
 * This defines the battery charging thresholds setting 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  // Battery ID

	// Any battery
	If (Local1 == 0)
	{
		\_SB.PCI0.LPCB.EC.BAT0.SETT(STOP_THRESH_ARG, Local0)
		\_SB.PCI0.LPCB.EC.BAT1.SETT(STOP_THRESH_ARG, Local0)

		Local2 = Local0 != \_SB.PCI0.LPCB.EC.BAT0.GETT(STOP_THRESH_ARG)
		Local3 = Local0 != \_SB.PCI0.LPCB.EC.BAT1.GETT(STOP_THRESH_ARG)

		Return ((Local2 && Local3) << 31)
	}

	// Battery1
	If (Local1 == 1)
	{
		\_SB.PCI0.LPCB.EC.BAT0.SETT(STOP_THRESH_ARG, Local0)
		Return ((Local0 !=
			\_SB.PCI0.LPCB.EC.BAT0.GETT(STOP_THRESH_ARG)) << 31)
	}

	// Battery2
	If (Local1 == 2)
	{
		\_SB.PCI0.LPCB.EC.BAT1.SETT(STOP_THRESH_ARG, Local0)
		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  // Battery ID

	// Any battery
	If (Local1 == 0)
	{
		\_SB.PCI0.LPCB.EC.BAT0.SETT(START_THRESH_ARG, Local0)
		\_SB.PCI0.LPCB.EC.BAT1.SETT(START_THRESH_ARG, Local0)

		Local2 = Local0 != \_SB.PCI0.LPCB.EC.BAT0.GETT(START_THRESH_ARG)
		Local3 = Local0 != \_SB.PCI0.LPCB.EC.BAT1.GETT(START_THRESH_ARG)

		Return ((Local2 && Local3) << 31)
	}

	// Battery1
	If (Local1 == 1)
	{
		\_SB.PCI0.LPCB.EC.BAT0.SETT(START_THRESH_ARG, Local0)
		Return ((Local0 !=
			\_SB.PCI0.LPCB.EC.BAT0.GETT(START_THRESH_ARG)) << 31)
	}

	// Battery2
	If (Local1 == 2)
	{
		\_SB.PCI0.LPCB.EC.BAT1.SETT(START_THRESH_ARG, Local0)
		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)
{
	// Battery1
	If (Arg0 == 1)
	{
		Return (0x300 | \_SB.PCI0.LPCB.EC.BAT0.GETT(STOP_THRESH_ARG))
	}

	// Battery2
	If (Arg0 == 2)
	{
		Return (0x300 | \_SB.PCI0.LPCB.EC.BAT1.GETT(STOP_THRESH_ARG))
	}

	Return (1 << 31)
}

// Get start threshold
Method (BCTG, 1, NotSerialized)
{
	// Battery 1
	If (Arg0 == 1)
	{
		Return (0x300 | \_SB.PCI0.LPCB.EC.BAT0.GETT(START_THRESH_ARG))
	}

	// Battery 2
	If (Arg0 == 2)
	{
		Return (0x300 | \_SB.PCI0.LPCB.EC.BAT1.GETT(START_THRESH_ARG))
	}

	Return (1 << 31)
}