• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* SPDX-License-Identifier: GPL-2.0-only */
2
3Device(EC0)
4{
5	Name (_HID, EISAID("PNP0C09"))
6	Name (_UID, 1)
7
8	Name (_GPE, 23)	// GPI07 / GPE23 -> Runtime SCI
9
10	OperationRegion(ERAM, EmbeddedControl, 0x00, 0x37)
11	Field (ERAM, ByteAcc, NoLock, Preserve)
12	{
13		MODE,	  1,	// Thermal Policy (Quiet/Perform)
14		FAN,	  1,	// Fan Power (On/Off)
15		LIDS,	  1,	// LID Status (0=Open/1=Close)
16		LSW0,	  1,	// LCD Power Switch
17
18		BTYP,	  1,	// Battery Type (0=LiIon/1=NiMh)
19		MWKE,	  1,	// Enable Wakeup from RI
20		ADP,	  1,	// AC Adapter (0=Offline/1=Online)
21		BAT,	  1,	// Battery (0=Not Present/1=Present)
22		SLPT,	  3,	// Set Sleep Type on SLP enter (1=S1...4=S4)
23		CHRG,	  1,	// 0=Battery not charging/1=Battery charging
24		RI_W,	  1,	// Wake-up event source is RI
25		KB_W,	  1,	// Wake-up event source is keyboard
26		BATW,	  1,	// Wake-up event source is Battery Low
27		PMEW,	  1,	// Wake-up event source is PME
28
29		// Battery 0 Registers
30		// Battery Life = BRC0/BPR0
31		// Battery percentage = BRC0/BFC0 * 100
32		BDC0,	 16,	// Designed Capacity
33		BFC0,	 16,	// Last Full Charge Capacity
34		BDV0,	 16,	// Design Voltage
35		BPR0,	 16,	// Battery Present Rate
36		BRC0,	 16,	// Battery Remaining Capacity
37		BPV0,	 16,	// Battery Present Voltage
38
39		Offset(0x11),
40		CTMP,	  8,	// CPU Temperature
41		Offset(0x15),
42		CTRO,	  8,	// EC throttling on trip point
43		CRTT,	  8,	// Critical Shut-down Temperature
44		Offset(0x17),
45		BKLL,	  8,	// Backlight Level
46
47		// Battery 2 Registers
48		Offset(0x20),
49		,	  4,
50		BTY2,	  1,	// Battery Type (0=LiIon/1=NiMh)
51		,	  2,
52		BAT2,	  1,	// Battery (0=Not Present/1=Present)
53		,	  3,
54		CRG2,	  1,	// 0=Battery not charging/1=Battery charging
55		Offset(0x22),
56		BDC2,	 16,	// Designed Capacity
57		BFC2,	 16,	// Last Full Charge Capacity
58		BDV2,	 16,	// Design Voltage
59		BPR2,	 16,	// Battery Present Rate
60		BRC2,	 16,	// Battery Remaining Capacity
61		BPV2,	 16,	// Battery Present Voltage
62		BTP2,	 16,	// Trip Point
63
64		PBMO,	  2,	// PBMO power control method
65		ECO,	  1,	// ECO on/off status
66		SUN,	  1,	// Sunlight Readable
67		RF,	  1,	// RF Enable/Disable status
68		DOCK,	  1,	// Dock In/Out status
69		CBAT,	  1,	// Car Battery status
70		APPS,	  1,	// OSD utility status
71		Offset(0x33),
72		ODDS,	  1
73	}
74
75	Method (_CRS, 0, Serialized)
76	{
77		Name (ECMD, ResourceTemplate()
78		{
79			IO (Decode16, 0x62, 0x62, 1, 1)
80			IO (Decode16, 0x66, 0x66, 1, 1)
81		})
82
83		Return (ECMD)
84	}
85
86	// EC Query methods, called upon SCI interrupts.
87	Method (_Q01, 0)
88	{
89		Notify (\_SB.CP00, 0x80)
90		If (ADP) {
91			\_SB.AC.ACST = 1
92			TRAP (0xe3)
93			PWRS = 1
94			TRAP (0x2b)
95		} Else {
96			\_SB.AC.ACST = 0
97			Notify (\_SB.AC, 0x80)
98			Notify (\_SB.BAT0, 0x80)
99			PWRS = 0
100			TRAP(0x2b)
101		}
102
103		PNOT()
104		Notify(\_SB.BAT0, 0x80) // Execute BAT0 _BST
105		Notify(\_SB.BAT1, 0x80) // Execute BAT1 _BST
106	}
107
108	Method (_Q02, 0)
109	{
110		If (BAT) {
111			Notify(\_SB.BAT0, 0x00)
112			Notify(\_SB.AC, 0x80)
113		} Else {
114			Notify(\_SB.AC, 0x80)
115			Notify(\_SB.BAT0, 0x01)
116		}
117
118		PNOT()
119		Notify(\_SB.BAT0, 0x80) // Execute BAT0 _BST
120		Notify(\_SB.BAT1, 0x80) // Execute BAT1 _BST
121	}
122
123	Method (_Q05, 0)
124	{
125		Notify(SLPB, 0x80)
126		PNOT()
127		Notify(\_SB.BAT0, 0x80) // Execute BAT0 _BST
128		Notify(\_SB.BAT1, 0x80) // Execute BAT1 _BST
129	}
130
131	Method (_Q07, 0)
132	{
133		TRAP(0xe0)
134
135		If (RTCF == 0x00) {
136			Notify(LID0, 0x80)
137		} else {
138			TRAP(0xc1)
139		}
140	}
141
142	Method (_Q09, 0)
143	{
144		Notify(BAT0, 0x80)
145		Notify(BAT1, 0x80)
146	}
147
148	Method (_Q0A, 0)
149	{
150		Notify(\_TZ.THRM, 0x80)
151	}
152
153	Method (_Q20, 0)
154	{
155		Notify(\_SB.ECO, 0x81)
156	}
157
158	Method (_Q21, 0)
159	{
160		Notify(\_SB.ECO, 0x82)
161	}
162
163	Method (_Q22, 0)
164	{
165		Notify(\_SB.ECO, 0x83)
166	}
167
168	Method (_Q23, 0)
169	{
170		Notify(\_SB.ECO, 0x84)
171	}
172
173	Method (_Q24, 0)
174	{
175		HOTK = 0x3f
176		If (IGDS) {
177			Notify (\_SB.PCI0.GFX0, 0x82)
178		} Else {
179			TRAP (0xE1)
180		}
181		Notify (\_SB.ECO, 0x85)
182	}
183
184	Method (_Q25, 0)
185	{
186		HOTK = 0x40
187		TRAP(0xe1)
188		Notify(\_SB.ECO, 0x86)
189	}
190
191	Method (_Q26, 0)
192	{
193		HOTK = 0x41
194		TRAP(0xe1)
195		Notify(\_SB.ECO, 0x87)
196	}
197
198	Method (_Q27, 0)
199	{
200		Notify(\_SB.ECO, 0x88)
201	}
202
203	Method (_Q28, 0)
204	{
205		Notify(\_SB.ECO, 0x89)
206	}
207
208	Method (_Q29, 0)
209	{
210		Notify(\_SB.ECO, 0x8a)
211	}
212
213	Method (_Q2A, 0)
214	{
215		HOTK = 0x57
216		TRAP(0xe1)
217		Notify(\_SB.ECO, 0x8b)
218	}
219
220	Method (_Q2B, 0)
221	{
222		Notify(SLPB, 0x80)
223		Notify(\_SB.ECO, 0x8c)
224	}
225
226	Method (_Q2C, 0)
227	{
228		HOTK = 0x59
229		TRAP(0xe1)
230	}
231
232	Method (_Q38, 0)
233	{
234		// IDE TODO
235	}
236
237	Method (_Q39, 0)
238	{
239		// SATA TODO
240	}
241
242	Method (_Q3A, 0)
243	{
244		BRTL = 1
245		Notify(\_SB.ECO, 0x93)
246	}
247
248	Method (_Q3B, 0)
249	{
250		BRTL = 0
251		Notify(\_SB.ECO, 0x93)
252	}
253
254	Method (_Q3C, 0)
255	{
256		SUN = 1
257		Notify(\_SB.ECO, 0x92)
258	}
259
260	Method (_Q3D, 0)
261	{
262		SUN = 0
263		Notify(\_SB.ECO, 0x92)
264	}
265
266	/* Enable RF device */
267	Method (_Q3E, 0)
268	{
269		TRAP(0xdf)
270	}
271
272	/* Disable RF device */
273	Method (_Q3F, 0)
274	{
275		TRAP(0xc0)
276	}
277
278	/* ACBS LAN Power On */
279	Method (_Q40, 0)
280	{
281		TRAP(0xd0)
282		Sleep(500)
283		Notify(RP04, 0)
284	}
285
286	/* ACBS LAN Power Off */
287	Method (_Q41, 0)
288	{
289		TRAP(0xd1)
290	}
291
292	Method (_Q42, 0)
293	{
294		TRAP(0xf3)
295	}
296
297	Method (_Q43, 0)
298	{
299		TRAP(0xf4)
300	}
301
302	Method (_Q48, 0)
303	{
304		TRAP(0xd2) // Check AC Status
305		ODDS = 1
306		Notify(\_SB.ECO, 0x90)
307	}
308
309	Method (_Q49, 0)
310	{
311		TRAP(0xd2) // Check AC Status
312		ODDS = 0
313		Notify(\_SB.ECO, 0x90)
314	}
315
316
317	Method (_Q4C, 0)
318	{
319		Notify(\_SB.ECO, 0x94)
320	}
321
322	Method (_Q4D, 0)
323	{
324		Notify(\_SB.ECO, 0x95)
325	}
326
327	Method (_Q4E, 0)
328	{
329		// PATA TODO
330	}
331
332	Method (_Q4F, 0)
333	{
334		TRAP(0xf9)
335		Notify(\_SB.ECO, 0x95)
336	}
337
338	Method (_Q5C, 0)
339	{
340		// IGPS = 2
341		Notify(\_SB.ECO, 0x94)
342	}
343
344	Method (_Q70, 0)
345	{
346		Notify(\_SB.ECO, 0x96)
347	}
348
349	Method (_Q71, 0)
350	{
351		Notify(\_SB.ECO, 0x97)
352	}
353
354	// TODO Scope _SB devices for AC power, LID, Power button
355}
356
357Scope(\_SB)
358{
359	/* This device is used by the GETAC P470 Windows drivers. */
360
361	Device (ECO)
362	{
363		Name(_HID, "MTC0303") // MTC0303 BIOS Service Provider
364		Method (GDPD, 0, Serialized)
365		{
366			// Set flag byte to zero
367			Local0 = 0
368
369			If (BRTL & 0x01) {
370				Local0 |= 0x01
371			}
372
373			If (BRTL & 0x02) {
374				Local0 |= 0x04
375			}
376
377			If (BRTL & 0x04) {
378				Local0 |= 0x02
379			}
380
381			If (BRTL & 0x30) {
382				Local0 |= 0x10
383			}
384
385			If (BRTL & 0x40) {
386				Local0 |= 0x40
387			}
388
389			Return (Local0)
390		}
391
392		Method (GDPC, 0, Serialized)
393		{
394			Local0 = 0
395
396			If (BRTL & 0x10) {
397				Local0 |= 0x04
398			}
399
400			If (BRTL & 0x20) {
401				Local0 |= 0x01
402			}
403
404			If (BRTL & 0x40) {
405				Local0 |= 0x02
406			}
407
408			Return (Local0)
409		}
410
411		/* Set Brightness Level */
412		Method(SBLL, 1, Serialized)
413		{
414			BRTL = Arg0
415			TRAP(0xd5)	// See mainboard's smihandler.c
416			Return (0)
417		}
418
419		/* Get Brightness Level */
420		Method(GBLL, 0, Serialized)
421		{
422			TRAP(0xd6)	// See mainboard's smihandler.c
423			Return (BRTL)
424		}
425
426		/* Get Brightness Level Medium? */
427		Method(GBLM, 0, Serialized)
428		{
429			BRTL = 0x3f
430			// XXX don't we have to set the brightness?
431			Return(BRTL)
432		}
433
434		/* ??? */
435		Method(SUTE, 1, Serialized)
436		{
437			If (Arg0 & 0x01) {
438				TRAP(0xf5)
439			} Else {
440				TRAP(0xf6)
441			}
442			Return (0)
443		}
444
445		/* ??? */
446		Method(GECO, 0, Serialized)
447		{
448			TRAP(0xd7)
449			Return (ODDS)
450		}
451
452		/* ??? */
453		Method(GBSL, 0, Serialized)
454		{
455			TRAP(0xd8)
456			Return (BRTL)
457		}
458
459		/* ??? Get LED/Device Enable Status */
460		Method(GRFD, 0, Serialized)
461		{
462			/* Let coreboot update the flags */
463			TRAP(0xe5)
464
465			Local0 = 0
466			If (RFDV & 0x01) {
467				Local0 |= 0x01
468			}
469			If (RFDV & 0x02) {
470				Local0 |= 0x02
471			}
472			If (RFDV & 0x04) {
473				Local0 |= 0x04
474			}
475			If (RFDV & 0x08) {
476				Local0 |= 0x08
477			}
478			If (GP15 & 0x01) {		// GDIS
479				Local0 |= 0x10
480			}
481			If (GP12 & 0x01) {		// WIFI Led (WLED)
482				Local0 |= 0x20
483			}
484			If (BTEN & 0x01) {		// BlueTooth Enable
485				Local0 |= 0x40
486			}
487			If (GP10 & 0x01) {		// GPS Enable
488				Local0 |= 0x80
489			}
490
491			Return (Local0)
492		}
493
494		/* Set RFD */
495		Method(SRFD, 1, Serialized)
496		{
497			If (Arg0 & 0x01) {
498				GP14 = 1		// GLED
499				GP15 = 1		// GDIS
500			} Else {
501				GP14 = 0
502				GP15 = 0
503			}
504
505			/* WIFI */
506			If (Arg0 & 0x02) {
507				GP12 = 1		// WLED
508				GP25 = 1		// WLAN
509			} Else {
510				GP12 = 0
511				GP25 = 0
512			}
513
514			/* Bluetooth */
515			If (Arg0 & 0x04) {
516				GP13 = 1		// BLED
517				BTEN = 1
518			} Else {
519				GP13 = 0		// BLED
520				BTEN = 0
521			}
522			Return (0)
523		}
524
525		/* Get DKD */
526		Method(GDKD, 0, Serialized)
527		{
528			TRAP(0xd9)
529			Return (BRTL)
530		}
531
532		/* Set DKD */
533		Method(SDKD, 0, Serialized)
534		{
535			TRAP(0xda)
536			Return (0)
537		}
538
539		/* Set IGD (Graphics) */
540		Method(SIGD, 1, Serialized)
541		{
542			If (Arg0 & 0x01) {
543				TRAP(0xf7)
544			} Else {
545				TRAP(0xf8)
546			}
547			Return (0)
548		}
549
550		/* SMI-C? Set Mic? */
551		Method (SMIC, 1, Serialized)
552		{
553			If (Arg0 & 0x01) {
554				TRAP(0xeb)
555			} Else {
556				TRAP(0xec)
557			}
558			Return (0)
559		}
560
561		/* ??? */
562		Method(GTSD, 0, Serialized)
563		{
564			Return (GP19)	// TSDT
565		}
566
567		/* Not even decent function names anymore? */
568		Method(S024, 1, Serialized)
569		{
570			If (Arg0 & 0x01) {
571				TRAP(0xf1)
572			} Else {
573				TRAP(0xf2)
574			}
575			Return (0)
576		}
577
578		/* Get CVD */
579		Method(GCVD, 0, Serialized)
580		{
581			TRAP(0xf9)
582			Return (BRTL)
583		}
584
585		/* ??? Something with PATA */
586		Method(S025, 1, Serialized)
587		{
588			If (Arg0 & 0x01) {
589				TRAP(0xfc)
590
591				GP33 = 1		// CREN
592				Sleep(1500)
593
594				GP34 = 1		// CRRS
595				Sleep(500)
596
597				Notify(^^PCI0.PATA, 0)
598				Notify(^^PCI0.PATA.PRID, 0)
599			} Else {
600				TRAP(0xfb)
601				Sleep(1500)
602				GP33 = 0		// CREN
603				Sleep(1500)
604				Notify(^^PCI0.PATA, 0)
605				Notify(^^PCI0.PATA.PRID, 0)
606				Notify(^^PCI0.PATA.PRID.DSK1, 1)
607				Notify(^^PCI0.PATA.PRID.DSK0, 1)
608			}
609			Return (0)
610		}
611
612		/* ??? */
613		Method(G021, 0, Serialized)
614		{
615			TRAP(0xfe)
616			If (ACIN == 0) {
617				TRAP(0xfa)
618				TRAP(0xfd)
619				If (ODDS == 1) {
620					TRAP(0xfb)
621					Notify(^^PCI0.PATA, 0)
622					Notify(^^PCI0.PATA.PRID.DSK1, 1)
623					Notify(^^PCI0.PATA.PRID.DSK0, 1)
624					Sleep (1500)
625					GP33 = 0		// CREN
626					Sleep (1500)
627					Notify(^^PCI0.PATA, 0)
628					Notify(^^PCI0.PATA.PRID.DSK1, 1)
629					Notify(^^PCI0.PATA.PRID.DSK0, 1)
630					Return (0)
631				}
632			}
633			/* All Else Cases */
634			Notify(ECO, 0xb1)
635			Return (1)
636		}
637
638		/* Get RFS */
639		Method(GRFS, 0, Serialized)
640		{
641			TRAP(0xff)
642			Return(BRTL)
643		}
644
645		/* ??? */
646		Method(S00B, 1, Serialized)
647		{
648			If (Arg0 & 1) {
649				TRAP(0xdc)
650			} Else {
651				TRAP(0xdd)
652			}
653			Return (0)
654		}
655
656
657
658	}
659}
660