2 * This file is part of the coreboot project.
4 * Copyright (C) 2011 Advanced Micro Devices, Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 /* DefinitionBlock Statement */
22 "DSDT.AML", /* Output filename */
23 "DSDT", /* Signature */
24 0x02, /* DSDT Revision, needs to be 2 for 64bit */
26 "M5A99 ", /* TABLE ID */
27 0x00010001 /* OEM Revision */
29 { /* Start of ASL file */
30 /* #include <arch/x86/acpi/debug.asl> */ /* Include global debug methods if needed */
32 /* Data to be patched by the BIOS during POST */
33 /* FIXME the patching is not done yet! */
34 /* Memory related values */
35 Name(LOMH, 0x0) /* Start of unused memory in C0000-E0000 range */
36 Name(PBAD, 0x0) /* Address of BIOS area (If TOM2 != 0, Addr >> 16) */
37 Name(PBLN, 0x0) /* Length of BIOS area */
39 Name(PCBA, 0xE0000000) /* Base address of PCIe config space */
40 Name(HPBA, 0xFED00000) /* Base address of HPET table */
42 Name(SSFG, 0x0D) /* S1 support: bit 0, S2 Support: bit 1, etc. S0 & S5 assumed */
44 /* USB overcurrent mapping pins. */
56 /* Some global data */
57 Name(OSTP, 3) /* Assume nothing. WinXp = 1, Vista = 2, Linux = 3, WinCE = 4 */
58 Name(OSV, Ones) /* Assume nothing */
59 Name(PMOD, One) /* Assume APIC */
65 Scope (\_PR) { /* define processor scope */
67 CPU0, /* name space name */
68 0, /* Unique number for this processor */
69 0x808, /* PBLK system I/O address !hardcoded! */
70 0x06 /* PBLKLEN for boot processor */
72 #include "acpi/cpstate.asl"
76 CPU1, /* name space name */
77 1, /* Unique number for this processor */
78 0x0000, /* PBLK system I/O address !hardcoded! */
79 0x00 /* PBLKLEN for boot processor */
81 #include "acpi/cpstate.asl"
85 CPU2, /* name space name */
86 2, /* Unique number for this processor */
87 0x0000, /* PBLK system I/O address !hardcoded! */
88 0x00 /* PBLKLEN for boot processor */
90 #include "acpi/cpstate.asl"
94 CPU3, /* name space name */
95 3, /* Unique number for this processor */
96 0x0000, /* PBLK system I/O address !hardcoded! */
97 0x00 /* PBLKLEN for boot processor */
99 #include "acpi/cpstate.asl"
103 CPU4, /* name space name */
104 4, /* Unique number for this processor */
105 0x0000, /* PBLK system I/O address !hardcoded! */
106 0x00 /* PBLKLEN for boot processor */
108 #include "acpi/cpstate.asl"
112 CPU5, /* name space name */
113 5, /* Unique number for this processor */
114 0x0000, /* PBLK system I/O address !hardcoded! */
115 0x00 /* PBLKLEN for boot processor */
117 #include "acpi/cpstate.asl"
119 } /* End _PR scope */
121 /* PIC IRQ mapping registers, C00h-C01h */
122 OperationRegion(PRQM, SystemIO, 0x00000C00, 0x00000002)
123 Field(PRQM, ByteAcc, NoLock, Preserve) {
125 PRQD, 0x00000008, /* Offset: 1h */
127 IndexField(PRQI, PRQD, ByteAcc, NoLock, Preserve) {
128 PINA, 0x00000008, /* Index 0 */
129 PINB, 0x00000008, /* Index 1 */
130 PINC, 0x00000008, /* Index 2 */
131 PIND, 0x00000008, /* Index 3 */
132 AINT, 0x00000008, /* Index 4 */
133 SINT, 0x00000008, /* Index 5 */
134 , 0x00000008, /* Index 6 */
135 AAUD, 0x00000008, /* Index 7 */
136 AMOD, 0x00000008, /* Index 8 */
137 PINE, 0x00000008, /* Index 9 */
138 PINF, 0x00000008, /* Index A */
139 PING, 0x00000008, /* Index B */
140 PINH, 0x00000008, /* Index C */
143 /* PCI Error control register */
144 OperationRegion(PERC, SystemIO, 0x00000C14, 0x00000001)
145 Field(PERC, ByteAcc, NoLock, Preserve) {
152 /* Client Management index/data registers */
153 OperationRegion(CMT, SystemIO, 0x00000C50, 0x00000002)
154 Field(CMT, ByteAcc, NoLock, Preserve) {
156 /* Client Management Data register */
164 /* GPM Port register */
165 OperationRegion(GPT, SystemIO, 0x00000C52, 0x00000001)
166 Field(GPT, ByteAcc, NoLock, Preserve) {
177 /* Flash ROM program enable register */
178 OperationRegion(FRE, SystemIO, 0x00000C6F, 0x00000001)
179 Field(FRE, ByteAcc, NoLock, Preserve) {
184 /* PM2 index/data registers */
185 OperationRegion(PM2R, SystemIO, 0x00000CD0, 0x00000002)
186 Field(PM2R, ByteAcc, NoLock, Preserve) {
191 /* Power Management I/O registers */
192 OperationRegion(PIOR, SystemIO, 0x00000CD6, 0x00000002)
193 Field(PIOR, ByteAcc, NoLock, Preserve) {
197 IndexField (PIOI, PIOD, ByteAcc, NoLock, Preserve) {
198 Offset(0x00), /* MiscControl */
202 Offset(0x01), /* MiscStatus */
206 Offset(0x04), /* SmiWakeUpEventEnable3 */
209 Offset(0x07), /* SmiWakeUpEventStatus3 */
212 Offset(0x10), /* AcpiEnable */
215 Offset(0x1C), /* ProgramIoEnable */
222 Offset(0x1D), /* IOMonitorStatus */
229 Offset(0x20), /* AcpiPmEvtBlk */
231 Offset(0x36), /* GEvtLevelConfig */
235 Offset(0x37), /* GPMLevelConfig0 */
242 Offset(0x38), /* GPMLevelConfig1 */
249 Offset(0x3B), /* PMEStatus1 */
258 Offset(0x55), /* SoftPciRst */
266 /* Offset(0x61), */ /* Options_1 */
270 Offset(0x65), /* UsbPMControl */
273 Offset(0x68), /* MiscEnable68 */
277 Offset(0x92), /* GEVENTIN */
280 Offset(0x96), /* GPM98IN */
283 Offset(0x9A), /* EnhanceControl */
286 Offset(0xA8), /* PIO7654Enable */
291 Offset(0xA9), /* PIO7654Status */
299 * First word is PM1_Status, Second word is PM1_Enable
301 OperationRegion(P1EB, SystemIO, APEB, 0x04)
302 Field(P1EB, ByteAcc, NoLock, Preserve) {
327 /* PCIe Configuration Space for 16 busses */
328 OperationRegion(PCFG, SystemMemory, PCBA, 0x01000000) /* Each bus consumes 1MB */
329 Field(PCFG, ByteAcc, NoLock, Preserve) {
330 /* Byte offsets are computed using the following technique:
331 * ((bus number + 1) * ((device number * 8) * 4096)) + register offset
332 * The 8 comes from 8 functions per device, and 4096 bytes per function config space
334 Offset(0x00088024), /* Byte offset to SATA register 24h - Bus 0, Device 17, Function 0 */
336 Offset(0x00098042), /* Byte offset to OHCI0 register 42h - Bus 0, Device 19, Function 0 */
347 Offset(0x000A0004), /* Byte offset to SMBUS register 4h - Bus 0, Device 20, Function 0 */
350 Offset(0x000A0008), /* Byte offset to SMBUS register 8h - Bus 0, Device 20, Function 0 */
352 Offset(0x000A0014), /* Byte offset to SMBUS register 14h - Bus 0, Device 20, Function 0 */
354 Offset(0x000A0078), /* Byte offset to SMBUS register 78h - Bus 0, Device 20, Function 0 */
356 P92E, 1, /* Port92 decode enable */
359 OperationRegion(SB5, SystemMemory, STB5, 0x1000)
360 Field(SB5, AnyAcc, NoLock, Preserve){
362 Offset(0x120), /* Port 0 Task file status */
368 Offset(0x128), /* Port 0 Serial ATA status */
372 Offset(0x12C), /* Port 0 Serial ATA control */
374 Offset(0x130), /* Port 0 Serial ATA error */
379 offset(0x1A0), /* Port 1 Task file status */
385 Offset(0x1A8), /* Port 1 Serial ATA status */
389 Offset(0x1AC), /* Port 1 Serial ATA control */
391 Offset(0x1B0), /* Port 1 Serial ATA error */
396 Offset(0x220), /* Port 2 Task file status */
402 Offset(0x228), /* Port 2 Serial ATA status */
406 Offset(0x22C), /* Port 2 Serial ATA control */
408 Offset(0x230), /* Port 2 Serial ATA error */
413 Offset(0x2A0), /* Port 3 Task file status */
419 Offset(0x2A8), /* Port 3 Serial ATA status */
423 Offset(0x2AC), /* Port 3 Serial ATA control */
425 Offset(0x2B0), /* Port 3 Serial ATA error */
432 #include "acpi/routing.asl"
438 if(LNotEqual(OSTP, Ones)) {Return(OSTP)} /* OS version was already detected */
440 if(CondRefOf(\_OSI,Local1))
442 Store(1, OSTP) /* Assume some form of XP */
443 if (\_OSI("Windows 2006")) /* Vista */
448 If(WCMP(\_OS,"Linux")) {
449 Store(3, OSTP) /* Linux */
451 Store(4, OSTP) /* Gotta be WinCE */
457 Method(_PIC, 0x01, NotSerialized)
465 Method(CIRQ, 0x00, NotSerialized){
476 Name(IRQB, ResourceTemplate(){
477 IRQ(Level,ActiveLow,Shared){15}
480 Name(IRQP, ResourceTemplate(){
481 IRQ(Level,ActiveLow,Exclusive){3, 4, 5, 7, 10, 11, 12, 15}
484 Name(PITF, ResourceTemplate(){
485 IRQ(Level,ActiveLow,Exclusive){9}
489 Name(_HID, EISAID("PNP0C0F"))
494 Return(0x0B) /* sata is invisible */
496 Return(0x09) /* sata is disabled */
498 } /* End Method(_SB.INTA._STA) */
501 /* DBGO("\\_SB\\LNKA\\_DIS\n") */
503 } /* End Method(_SB.INTA._DIS) */
506 /* DBGO("\\_SB\\LNKA\\_PRS\n") */
508 } /* Method(_SB.INTA._PRS) */
511 /* DBGO("\\_SB\\LNKA\\_CRS\n") */
512 CreateWordField(IRQB, 0x1, IRQN)
513 ShiftLeft(1, PINA, IRQN)
515 } /* Method(_SB.INTA._CRS) */
518 /* DBGO("\\_SB\\LNKA\\_CRS\n") */
519 CreateWordField(ARG0, 1, IRQM)
521 /* Use lowest available IRQ */
522 FindSetRightBit(IRQM, Local0)
527 } /* End Method(_SB.INTA._SRS) */
528 } /* End Device(INTA) */
531 Name(_HID, EISAID("PNP0C0F"))
536 Return(0x0B) /* sata is invisible */
538 Return(0x09) /* sata is disabled */
540 } /* End Method(_SB.INTB._STA) */
543 /* DBGO("\\_SB\\LNKB\\_DIS\n") */
545 } /* End Method(_SB.INTB._DIS) */
548 /* DBGO("\\_SB\\LNKB\\_PRS\n") */
550 } /* Method(_SB.INTB._PRS) */
553 /* DBGO("\\_SB\\LNKB\\_CRS\n") */
554 CreateWordField(IRQB, 0x1, IRQN)
555 ShiftLeft(1, PINB, IRQN)
557 } /* Method(_SB.INTB._CRS) */
560 /* DBGO("\\_SB\\LNKB\\_CRS\n") */
561 CreateWordField(ARG0, 1, IRQM)
563 /* Use lowest available IRQ */
564 FindSetRightBit(IRQM, Local0)
569 } /* End Method(_SB.INTB._SRS) */
570 } /* End Device(INTB) */
573 Name(_HID, EISAID("PNP0C0F"))
578 Return(0x0B) /* sata is invisible */
580 Return(0x09) /* sata is disabled */
582 } /* End Method(_SB.INTC._STA) */
585 /* DBGO("\\_SB\\LNKC\\_DIS\n") */
587 } /* End Method(_SB.INTC._DIS) */
590 /* DBGO("\\_SB\\LNKC\\_PRS\n") */
592 } /* Method(_SB.INTC._PRS) */
595 /* DBGO("\\_SB\\LNKC\\_CRS\n") */
596 CreateWordField(IRQB, 0x1, IRQN)
597 ShiftLeft(1, PINC, IRQN)
599 } /* Method(_SB.INTC._CRS) */
602 /* DBGO("\\_SB\\LNKC\\_CRS\n") */
603 CreateWordField(ARG0, 1, IRQM)
605 /* Use lowest available IRQ */
606 FindSetRightBit(IRQM, Local0)
611 } /* End Method(_SB.INTC._SRS) */
612 } /* End Device(INTC) */
615 Name(_HID, EISAID("PNP0C0F"))
620 Return(0x0B) /* sata is invisible */
622 Return(0x09) /* sata is disabled */
624 } /* End Method(_SB.INTD._STA) */
627 /* DBGO("\\_SB\\LNKD\\_DIS\n") */
629 } /* End Method(_SB.INTD._DIS) */
632 /* DBGO("\\_SB\\LNKD\\_PRS\n") */
634 } /* Method(_SB.INTD._PRS) */
637 /* DBGO("\\_SB\\LNKD\\_CRS\n") */
638 CreateWordField(IRQB, 0x1, IRQN)
639 ShiftLeft(1, PIND, IRQN)
641 } /* Method(_SB.INTD._CRS) */
644 /* DBGO("\\_SB\\LNKD\\_CRS\n") */
645 CreateWordField(ARG0, 1, IRQM)
647 /* Use lowest available IRQ */
648 FindSetRightBit(IRQM, Local0)
653 } /* End Method(_SB.INTD._SRS) */
654 } /* End Device(INTD) */
657 Name(_HID, EISAID("PNP0C0F"))
662 Return(0x0B) /* sata is invisible */
664 Return(0x09) /* sata is disabled */
666 } /* End Method(_SB.INTE._STA) */
669 /* DBGO("\\_SB\\LNKE\\_DIS\n") */
671 } /* End Method(_SB.INTE._DIS) */
674 /* DBGO("\\_SB\\LNKE\\_PRS\n") */
676 } /* Method(_SB.INTE._PRS) */
679 /* DBGO("\\_SB\\LNKE\\_CRS\n") */
680 CreateWordField(IRQB, 0x1, IRQN)
681 ShiftLeft(1, PINE, IRQN)
683 } /* Method(_SB.INTE._CRS) */
686 /* DBGO("\\_SB\\LNKE\\_CRS\n") */
687 CreateWordField(ARG0, 1, IRQM)
689 /* Use lowest available IRQ */
690 FindSetRightBit(IRQM, Local0)
695 } /* End Method(_SB.INTE._SRS) */
696 } /* End Device(INTE) */
699 Name(_HID, EISAID("PNP0C0F"))
704 Return(0x0B) /* sata is invisible */
706 Return(0x09) /* sata is disabled */
708 } /* End Method(_SB.INTF._STA) */
711 /* DBGO("\\_SB\\LNKF\\_DIS\n") */
713 } /* End Method(_SB.INTF._DIS) */
716 /* DBGO("\\_SB\\LNKF\\_PRS\n") */
718 } /* Method(_SB.INTF._PRS) */
721 /* DBGO("\\_SB\\LNKF\\_CRS\n") */
722 CreateWordField(IRQB, 0x1, IRQN)
723 ShiftLeft(1, PINF, IRQN)
725 } /* Method(_SB.INTF._CRS) */
728 /* DBGO("\\_SB\\LNKF\\_CRS\n") */
729 CreateWordField(ARG0, 1, IRQM)
731 /* Use lowest available IRQ */
732 FindSetRightBit(IRQM, Local0)
737 } /* End Method(_SB.INTF._SRS) */
738 } /* End Device(INTF) */
741 Name(_HID, EISAID("PNP0C0F"))
746 Return(0x0B) /* sata is invisible */
748 Return(0x09) /* sata is disabled */
750 } /* End Method(_SB.INTG._STA) */
753 /* DBGO("\\_SB\\LNKG\\_DIS\n") */
755 } /* End Method(_SB.INTG._DIS) */
758 /* DBGO("\\_SB\\LNKG\\_PRS\n") */
760 } /* Method(_SB.INTG._CRS) */
763 /* DBGO("\\_SB\\LNKG\\_CRS\n") */
764 CreateWordField(IRQB, 0x1, IRQN)
765 ShiftLeft(1, PING, IRQN)
767 } /* Method(_SB.INTG._CRS) */
770 /* DBGO("\\_SB\\LNKG\\_CRS\n") */
771 CreateWordField(ARG0, 1, IRQM)
773 /* Use lowest available IRQ */
774 FindSetRightBit(IRQM, Local0)
779 } /* End Method(_SB.INTG._SRS) */
780 } /* End Device(INTG) */
783 Name(_HID, EISAID("PNP0C0F"))
788 Return(0x0B) /* sata is invisible */
790 Return(0x09) /* sata is disabled */
792 } /* End Method(_SB.INTH._STA) */
795 /* DBGO("\\_SB\\LNKH\\_DIS\n") */
797 } /* End Method(_SB.INTH._DIS) */
800 /* DBGO("\\_SB\\LNKH\\_PRS\n") */
802 } /* Method(_SB.INTH._CRS) */
805 /* DBGO("\\_SB\\LNKH\\_CRS\n") */
806 CreateWordField(IRQB, 0x1, IRQN)
807 ShiftLeft(1, PINH, IRQN)
809 } /* Method(_SB.INTH._CRS) */
812 /* DBGO("\\_SB\\LNKH\\_CRS\n") */
813 CreateWordField(ARG0, 1, IRQM)
815 /* Use lowest available IRQ */
816 FindSetRightBit(IRQM, Local0)
821 } /* End Method(_SB.INTH._SRS) */
822 } /* End Device(INTH) */
824 } /* End Scope(_SB) */
827 /* Supported sleep states: */
828 Name(\_S0, Package () {0x00, 0x00, 0x00, 0x00} ) /* (S0) - working state */
830 If (LAnd(SSFG, 0x01)) {
831 Name(\_S1, Package () {0x01, 0x01, 0x00, 0x00} ) /* (S1) - sleeping w/CPU context */
833 If (LAnd(SSFG, 0x02)) {
834 Name(\_S2, Package () {0x02, 0x02, 0x00, 0x00} ) /* (S2) - "light" Suspend to RAM */
836 If (LAnd(SSFG, 0x04)) {
837 Name(\_S3, Package () {0x03, 0x03, 0x00, 0x00} ) /* (S3) - Suspend to RAM */
839 If (LAnd(SSFG, 0x08)) {
840 Name(\_S4, Package () {0x04, 0x04, 0x00, 0x00} ) /* (S4) - Suspend to Disk */
843 Name(\_S5, Package () {0x05, 0x05, 0x00, 0x00} ) /* (S5) - Soft Off */
845 Name(\_SB.CSPS ,0) /* Current Sleep State (S0, S1, S2, S3, S4, S5) */
846 Name(CSMS, 0) /* Current System State */
848 /* Wake status package */
849 Name(WKST,Package(){Zero, Zero})
852 * \_PTS - Prepare to Sleep method
855 * Arg0=The value of the sleeping state S1=1, S2=2, etc
860 * The _PTS control method is executed at the beginning of the sleep process
861 * for S1-S5. The sleeping value is passed to the _PTS control method. This
862 * control method may be executed a relatively long time before entering the
863 * sleep state and the OS may abort the operation without notification to
864 * the ACPI driver. This method cannot modify the configuration or power
865 * state of any device in the system.
868 /* DBGO("\\_PTS\n") */
869 /* DBGO("From S0 to S") */
873 /* Don't allow PCIRST# to reset USB */
878 /* Clear sleep SMI status flag and enable sleep SMI trap. */
882 /* On older chips, clear PciExpWakeDisEn */
883 /*if (LLessEqual(\_SB.SBRI, 0x13)) {
888 /* Clear wake status structure. */
889 Store(0, Index(WKST,0))
890 Store(0, Index(WKST,1))
891 \_SB.PCI0.SIOS (Arg0)
892 } /* End Method(\_PTS) */
895 * The following method results in a "not a valid reserved NameSeg"
896 * warning so I have commented it out for the duration. It isn't
897 * used, so it could be removed.
900 * \_GTS OEM Going To Sleep method
903 * Arg0=The value of the sleeping state S1=1, S2=2
910 * DBGO("From S0 to S")
917 * \_BFS OEM Back From Sleep method
920 * Arg0=The value of the sleeping state S1=1, S2=2
926 /* DBGO("\\_BFS\n") */
929 /* DBGO(" to S0\n") */
933 * \_WAK System Wake method
936 * Arg0=The value of the sleeping state S1=1, S2=2
939 * Return package of 2 DWords
941 * 0x00000000 wake succeeded
942 * 0x00000001 Wake was signaled but failed due to lack of power
943 * 0x00000002 Wake was signaled but failed due to thermal condition
944 * Dword 2 - Power Supply state
945 * if non-zero the effective S-state the power supply entered
948 /* DBGO("\\_WAK\n") */
951 /* DBGO(" to S0\n") */
956 /* Restore PCIRST# so it resets USB */
961 /* Arbitrarily clear PciExpWakeStatus */
964 /* if(DeRefOf(Index(WKST,0))) {
965 * Store(0, Index(WKST,1))
967 * Store(Arg0, Index(WKST,1))
970 \_SB.PCI0.SIOW (Arg0)
972 } /* End Method(\_WAK) */
974 Scope(\_GPE) { /* Start Scope GPE */
975 /* General event 0 */
977 * DBGO("\\_GPE\\_L00\n")
981 /* General event 1 */
983 * DBGO("\\_GPE\\_L00\n")
987 /* General event 2 */
989 * DBGO("\\_GPE\\_L00\n")
993 /* General event 3 */
995 /* DBGO("\\_GPE\\_L00\n") */
996 Notify(\_SB.PWRB, 0x02) /* NOTIFY_DEVICE_WAKE */
999 /* General event 4 */
1001 * DBGO("\\_GPE\\_L00\n")
1005 /* General event 5 */
1007 * DBGO("\\_GPE\\_L00\n")
1011 /* General event 6 - Used for GPM6, moved to USB.asl */
1013 * DBGO("\\_GPE\\_L00\n")
1017 /* General event 7 - Used for GPM7, moved to USB.asl */
1019 * DBGO("\\_GPE\\_L07\n")
1023 /* Legacy PM event */
1025 /* DBGO("\\_GPE\\_L08\n") */
1028 /* Temp warning (TWarn) event */
1030 /* DBGO("\\_GPE\\_L09\n") */
1031 Notify (\_TZ.TZ00, 0x80)
1036 * DBGO("\\_GPE\\_L0A\n")
1040 /* USB controller PME# */
1042 /* DBGO("\\_GPE\\_L0B\n") */
1043 Notify(\_SB.PCI0.UOH1, 0x02) /* NOTIFY_DEVICE_WAKE */
1044 Notify(\_SB.PCI0.UOH2, 0x02) /* NOTIFY_DEVICE_WAKE */
1045 Notify(\_SB.PCI0.UOH3, 0x02) /* NOTIFY_DEVICE_WAKE */
1046 Notify(\_SB.PCI0.UOH4, 0x02) /* NOTIFY_DEVICE_WAKE */
1047 Notify(\_SB.PCI0.UOH5, 0x02) /* NOTIFY_DEVICE_WAKE */
1048 Notify(\_SB.PCI0.UEH1, 0x02) /* NOTIFY_DEVICE_WAKE */
1049 Notify(\_SB.PWRB, 0x02) /* NOTIFY_DEVICE_WAKE */
1052 /* AC97 controller PME# */
1054 * DBGO("\\_GPE\\_L0C\n")
1058 /* OtherTherm PME# */
1060 * DBGO("\\_GPE\\_L0D\n")
1064 /* GPM9 SCI event - Moved to USB.asl */
1066 * DBGO("\\_GPE\\_L0E\n")
1070 /* PCIe HotPlug event */
1072 * DBGO("\\_GPE\\_L0F\n")
1076 /* ExtEvent0 SCI event */
1078 /* DBGO("\\_GPE\\_L10\n") */
1082 /* ExtEvent1 SCI event */
1084 /* DBGO("\\_GPE\\_L11\n") */
1087 /* PCIe PME# event */
1089 * DBGO("\\_GPE\\_L12\n")
1093 /* GPM0 SCI event - Moved to USB.asl */
1095 * DBGO("\\_GPE\\_L13\n")
1099 /* GPM1 SCI event - Moved to USB.asl */
1101 * DBGO("\\_GPE\\_L14\n")
1105 /* GPM2 SCI event - Moved to USB.asl */
1107 * DBGO("\\_GPE\\_L15\n")
1111 /* GPM3 SCI event - Moved to USB.asl */
1113 * DBGO("\\_GPE\\_L16\n")
1117 /* GPM8 SCI event - Moved to USB.asl */
1119 * DBGO("\\_GPE\\_L17\n")
1123 /* GPIO0 or GEvent8 event */
1125 /* DBGO("\\_GPE\\_L18\n") */
1126 Notify(\_SB.PCI0.PBR2, 0x02) /* NOTIFY_DEVICE_WAKE */
1127 Notify(\_SB.PCI0.PBR4, 0x02) /* NOTIFY_DEVICE_WAKE */
1128 Notify(\_SB.PCI0.PBR5, 0x02) /* NOTIFY_DEVICE_WAKE */
1129 Notify(\_SB.PCI0.PBR6, 0x02) /* NOTIFY_DEVICE_WAKE */
1130 Notify(\_SB.PCI0.PBR7, 0x02) /* NOTIFY_DEVICE_WAKE */
1131 Notify(\_SB.PWRB, 0x02) /* NOTIFY_DEVICE_WAKE */
1134 /* GPM4 SCI event - Moved to USB.asl */
1136 * DBGO("\\_GPE\\_L19\n")
1140 /* GPM5 SCI event - Moved to USB.asl */
1142 * DBGO("\\_GPE\\_L1A\n")
1146 /* Azalia SCI event */
1148 /* DBGO("\\_GPE\\_L1B\n") */
1149 Notify(\_SB.PCI0.AZHD, 0x02) /* NOTIFY_DEVICE_WAKE */
1150 Notify(\_SB.PWRB, 0x02) /* NOTIFY_DEVICE_WAKE */
1153 /* GPM6 SCI event - Reassigned to _L06 */
1155 * DBGO("\\_GPE\\_L1C\n")
1159 /* GPM7 SCI event - Reassigned to _L07 */
1161 * DBGO("\\_GPE\\_L1D\n")
1165 /* GPIO2 or GPIO66 SCI event */
1167 * DBGO("\\_GPE\\_L1E\n")
1171 /* SATA SCI event - Moved to sata.asl */
1173 * DBGO("\\_GPE\\_L1F\n")
1177 } /* End Scope GPE */
1179 #include "acpi/usb.asl"
1182 Scope(\_SB) { /* Start \_SB scope */
1183 #include <arch/x86/acpi/globutil.asl> /* global utility methods expected within the \_SB scope */
1186 /* Note: Only need HID on Primary Bus */
1189 External (TOM2) /* (<real tom2> >> 20) to make it fit into 32 bit for XP */
1190 Name(_HID, EISAID("PNP0A03"))
1191 Name(_ADR, 0x00180000) /* Dev# = BSP Dev#, Func# = 0 */
1192 Method(_BBN, 0) { /* Bus number = 0 */
1196 /* DBGO("\\_SB\\PCI0\\_STA\n") */
1197 Return(0x0B) /* Status is visible */
1201 If(PMOD){ Return(APR0) } /* APIC mode */
1202 Return (PR0) /* PIC Mode */
1205 /* Describe the Northbridge devices */
1207 Name(_ADR, 0x00000000)
1210 /* The internal GFX bridge */
1212 Name(_ADR, 0x00010000)
1213 Name(_PRW, Package() {0x18, 4})
1219 /* The external GFX bridge */
1221 Name(_ADR, 0x00020000)
1222 Name(_PRW, Package() {0x18, 4})
1224 If(PMOD){ Return(APS2) } /* APIC mode */
1225 Return (PS2) /* PIC Mode */
1229 /* Dev3 is also an external GFX bridge, not used in Herring */
1232 Name(_ADR, 0x00040000)
1233 Name(_PRW, Package() {0x18, 4})
1235 If(PMOD){ Return(APS4) } /* APIC mode */
1236 Return (PS4) /* PIC Mode */
1241 Name(_ADR, 0x00050000)
1242 Name(_PRW, Package() {0x18, 4})
1244 If(PMOD){ Return(APS5) } /* APIC mode */
1245 Return (PS5) /* PIC Mode */
1250 Name(_ADR, 0x00060000)
1251 Name(_PRW, Package() {0x18, 4})
1253 If(PMOD){ Return(APS6) } /* APIC mode */
1254 Return (PS6) /* PIC Mode */
1258 /* The onboard EtherNet chip */
1260 Name(_ADR, 0x00070000)
1261 Name(_PRW, Package() {0x18, 4})
1263 If(PMOD){ Return(APS7) } /* APIC mode */
1264 Return (PS7) /* PIC Mode */
1270 Name(_ADR, 0x00090000)
1271 Name(_PRW, Package() {0x18, 4})
1273 If(PMOD){ Return(APS9) } /* APIC mode */
1274 Return (PS9) /* PIC Mode */
1279 Name(_ADR, 0x000A0000)
1280 Name(_PRW, Package() {0x18, 4})
1282 If(PMOD){ Return(APSa) } /* APIC mode */
1283 Return (PSa) /* PIC Mode */
1288 Name(_ADR, 0x000b0000)
1289 Name(_PRW, Package() {0x18, 4})
1291 If(PMOD){ Return(APSb) } /* APIC mode */
1292 Return (PSb) /* PIC Mode */
1297 Name(_ADR, 0x000c0000)
1298 Name(_PRW, Package() {0x18, 4})
1300 If(PMOD){ Return(APSc) } /* APIC mode */
1301 Return (PSc) /* PIC Mode */
1306 /* PCI slot 1, 2, 3 */
1308 Name(_ADR, 0x00140004)
1309 Name(_PRW, Package() {0x18, 4})
1316 /* Describe the Southbridge devices */
1318 Name(_ADR, 0x00110000)
1319 #include "acpi/sata.asl"
1323 Name(_ADR, 0x00130000)
1324 Name(_PRW, Package() {0x0B, 3})
1328 Name(_ADR, 0x00130001)
1329 Name(_PRW, Package() {0x0B, 3})
1333 Name(_ADR, 0x00130002)
1334 Name(_PRW, Package() {0x0B, 3})
1338 Name(_ADR, 0x00130003)
1339 Name(_PRW, Package() {0x0B, 3})
1343 Name(_ADR, 0x00130004)
1344 Name(_PRW, Package() {0x0B, 3})
1348 Name(_ADR, 0x00130005)
1349 Name(_PRW, Package() {0x0B, 3})
1353 Name(_ADR, 0x00140000)
1356 /* Primary (and only) IDE channel */
1358 Name(_ADR, 0x00140001)
1359 #include "acpi/ide.asl"
1363 Name(_ADR, 0x00140002)
1364 OperationRegion(AZPD, PCI_Config, 0x00, 0x100)
1365 Field(AZPD, AnyAcc, NoLock, Preserve) {
1389 If(LEqual(OSTP,3)){ /* If we are running Linux */
1398 Name(_ADR, 0x00140003)
1400 * DBGO("\\_SB\\PCI0\\LpcIsaBr\\_INI\n")
1401 } */ /* End Method(_SB.SBRDG._INI) */
1403 /* Real Time Clock Device */
1405 Name(_HID, EISAID("PNP0B00")) /* AT Real Time Clock (not PIIX4 compatible) */
1406 Name(_CRS, ResourceTemplate() {
1408 IO(Decode16,0x0070, 0x0070, 0, 2)
1409 /* IO(Decode16,0x0070, 0x0070, 0, 4) */
1411 } /* End Device(_SB.PCI0.LpcIsaBr.RTC0) */
1413 Device(TMR) { /* Timer */
1414 Name(_HID,EISAID("PNP0100")) /* System Timer */
1415 Name(_CRS, ResourceTemplate() {
1417 IO(Decode16, 0x0040, 0x0040, 0, 4)
1418 /* IO(Decode16, 0x0048, 0x0048, 0, 4) */
1420 } /* End Device(_SB.PCI0.LpcIsaBr.TMR) */
1422 Device(SPKR) { /* Speaker */
1423 Name(_HID,EISAID("PNP0800")) /* AT style speaker */
1424 Name(_CRS, ResourceTemplate() {
1425 IO(Decode16, 0x0061, 0x0061, 0, 1)
1427 } /* End Device(_SB.PCI0.LpcIsaBr.SPKR) */
1430 Name(_HID,EISAID("PNP0000")) /* AT Interrupt Controller */
1431 Name(_CRS, ResourceTemplate() {
1433 IO(Decode16,0x0020, 0x0020, 0, 2)
1434 IO(Decode16,0x00A0, 0x00A0, 0, 2)
1435 /* IO(Decode16, 0x00D0, 0x00D0, 0x10, 0x02) */
1436 /* IO(Decode16, 0x04D0, 0x04D0, 0x10, 0x02) */
1438 } /* End Device(_SB.PCI0.LpcIsaBr.PIC) */
1440 Device(MAD) { /* 8257 DMA */
1441 Name(_HID,EISAID("PNP0200")) /* Hardware Device ID */
1442 Name(_CRS, ResourceTemplate() {
1443 DMA(Compatibility,BusMaster,Transfer8){4}
1444 IO(Decode16, 0x0000, 0x0000, 0x10, 0x10)
1445 IO(Decode16, 0x0081, 0x0081, 0x01, 0x03)
1446 IO(Decode16, 0x0087, 0x0087, 0x01, 0x01)
1447 IO(Decode16, 0x0089, 0x0089, 0x01, 0x03)
1448 IO(Decode16, 0x008F, 0x008F, 0x01, 0x01)
1449 IO(Decode16, 0x00C0, 0x00C0, 0x10, 0x20)
1450 }) /* End Name(_SB.PCI0.LpcIsaBr.MAD._CRS) */
1451 } /* End Device(_SB.PCI0.LpcIsaBr.MAD) */
1454 Name(_HID,EISAID("PNP0C04")) /* Math Coprocessor */
1455 Name(_CRS, ResourceTemplate() {
1456 IO(Decode16, 0x00F0, 0x00F0, 0, 0x10)
1459 } /* End Device(_SB.PCI0.LpcIsaBr.COPR) */
1462 Name(_HID,EISAID("PNP0103"))
1463 Name(CRS,ResourceTemplate() {
1464 Memory32Fixed(ReadOnly,0xFED00000, 0x00000400, HPT) /* 1kb reserved space */
1467 Return(0x0F) /* sata is visible */
1470 CreateDwordField(CRS, ^HPT._BAS, HPBA)
1474 } /* End Device(_SB.PCI0.LpcIsaBr.COPR) */
1478 Name(_ADR, 0x00140004)
1479 } /* end HostPciBr */
1482 Name(_ADR, 0x00140005)
1483 } /* end Ac97audio */
1486 Name(_ADR, 0x00140006)
1487 } /* end Ac97modem */
1489 /* ITE8718 Support */
1490 OperationRegion (IOID, SystemIO, 0x2E, 0x02) /* sometimes it is 0x4E */
1491 Field (IOID, ByteAcc, NoLock, Preserve)
1493 SIOI, 8, SIOD, 8 /* 0x2E and 0x2F */
1496 IndexField (SIOI, SIOD, ByteAcc, NoLock, Preserve)
1499 LDN, 8, /* Logical Device Number */
1501 CID1, 8, /* Chip ID Byte 1, 0x87 */
1502 CID2, 8, /* Chip ID Byte 2, 0x12 */
1504 ACTR, 8, /* Function activate */
1506 APC0, 8, /* APC/PME Event Enable Register */
1507 APC1, 8, /* APC/PME Status Register */
1508 APC2, 8, /* APC/PME Control Register 1 */
1509 APC3, 8, /* Environment Controller Special Configuration Register */
1510 APC4, 8 /* APC/PME Control Register 2 */
1513 /* Enter the 8718 MB PnP Mode */
1519 Store(0x55, SIOI) /* 8718 magic number */
1521 /* Exit the 8718 MB PnP Mode */
1528 * Keyboard PME is routed to SB700 Gevent3. We can wake
1529 * up the system by pressing the key.
1533 /* We only enable KBD PME for S5. */
1534 If (LLess (Arg0, 0x05))
1537 /* DBGO("8718F\n") */
1540 Store (One, ACTR) /* Enable EC */
1544 */ /* falling edge. which mode? Not sure. */
1547 Store (0x08, APC1) /* clear PME status, Use 0x18 for mouse & KBD */
1549 Store (0x08, APC0) /* enable PME, Use 0x18 for mouse & KBD */
1558 Store (Zero, APC0) /* disable keyboard PME */
1560 Store (0xFF, APC1) /* clear keyboard PME status */
1564 Name(CRES, ResourceTemplate() {
1565 IO(Decode16, 0x0CF8, 0x0CF8, 1, 8)
1567 WORDIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
1568 0x0000, /* address granularity */
1569 0x0000, /* range minimum */
1570 0x0CF7, /* range maximum */
1571 0x0000, /* translation */
1575 WORDIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
1576 0x0000, /* address granularity */
1577 0x0D00, /* range minimum */
1578 0xFFFF, /* range maximum */
1579 0x0000, /* translation */
1584 Memory32Fixed(READWRITE, 0, 0xA0000, BSMM)
1585 Memory32Fixed(READONLY, 0x000A0000, 0x00020000, VGAM) /* VGA memory space */
1586 Memory32Fixed(READONLY, 0x000C0000, 0x00020000, EMM1) /* Assume C0000-E0000 empty */
1587 Memory32Fixed(READONLY, 0x000E0000, 0x00020000, RDBS) /* BIOS ROM area */
1589 /* DRAM Memory from 1MB to TopMem */
1590 Memory32Fixed(READWRITE, 0x00100000, 0, DMLO) /* 1MB to TopMem */
1592 /* BIOS space just below 4GB */
1594 ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
1595 0x00, /* Granularity */
1596 0x00000000, /* Min */
1597 0x00000000, /* Max */
1598 0x00000000, /* Translation */
1599 0x00000001, /* Max-Min, RLEN */
1604 /* DRAM memory from 4GB to TopMem2 */
1605 QWORDMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
1606 0x00000000, /* Granularity */
1607 0x00000000, /* Min */
1608 0x00000000, /* Max */
1609 0x00000000, /* Translation */
1610 0x00000001, /* Max-Min, RLEN */
1615 /* BIOS space just below 16EB */
1616 QWORDMemory(ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
1617 0x00000000, /* Granularity */
1618 0x00000000, /* Min */
1619 0x00000000, /* Max */
1620 0x00000000, /* Translation */
1621 0x00000001, /* Max-Min, RLEN */
1627 /* memory space for PCI BARs below 4GB */
1628 Memory32Fixed(ReadOnly, 0x00000000, 0x00000000, MMIO)
1629 }) /* End Name(_SB.PCI0.CRES) */
1632 /* DBGO("\\_SB\\PCI0\\_CRS\n") */
1635 CreateDWordField(CRES, ^EMM1._BAS, EM1B)
1636 CreateDWordField(CRES, ^EMM1._LEN, EM1L)
1637 CreateDWordField(CRES, ^DMLO._BAS, DMLB)
1638 CreateDWordField(CRES, ^DMLO._LEN, DMLL)
1639 CreateDWordField(CRES, ^PCBM._MIN, PBMB)
1640 CreateDWordField(CRES, ^PCBM._LEN, PBML)
1642 CreateQWordField(CRES, ^DMHI._MIN, DMHB)
1643 CreateQWordField(CRES, ^DMHI._LEN, DMHL)
1644 CreateQWordField(CRES, ^PEBM._MIN, EBMB)
1645 CreateQWordField(CRES, ^PEBM._LEN, EBML)
1647 If(LGreater(LOMH, 0xC0000)){
1648 Store(0xC0000, EM1B) /* Hole above C0000 and below E0000 */
1649 Subtract(LOMH, 0xC0000, EM1L) /* subtract start, assumes allocation from C0000 going up */
1652 /* Set size of memory from 1MB to TopMem */
1653 Subtract(TOM1, 0x100000, DMLL)
1656 * If(LNotEqual(TOM2, 0x00000000)){
1657 * Store(0x100000000,DMHB) DRAM from 4GB to TopMem2
1658 * Subtract(TOM2, 0x100000000, DMHL)
1662 /* If there is no memory above 4GB, put the BIOS just below 4GB */
1663 If(LEqual(TOM2, 0x00000000)){
1664 Store(PBAD,PBMB) /* Reserve the "BIOS" space */
1667 Else { /* Otherwise, put the BIOS just below 16EB */
1668 ShiftLeft(PBAD,16,EBMB) /* Reserve the "BIOS" space */
1673 CreateDWordField(CRES, ^MMIO._BAS, MM1B)
1674 CreateDWordField(CRES, ^MMIO._LEN, MM1L)
1676 * Declare memory between TOM1 and 4GB as available
1678 * Use ShiftLeft to avoid 64bit constant (for XP).
1679 * This will work even if the OS does 32bit arithmetic, as
1680 * 32bit (0x00000000 - TOM1) will wrap and give the same
1681 * result as 64bit (0x100000000 - TOM1).
1684 ShiftLeft(0x10000000, 4, Local0)
1685 Subtract(Local0, TOM1, Local0)
1688 Return(CRES) /* note to change the Name buffer */
1689 } /* end of Method(_SB.PCI0._CRS) */
1693 * FIRST METHOD CALLED UPON BOOT
1695 * 1. If debugging, print current OS and ACPI interpreter.
1696 * 2. Get PCI Interrupt routing from ACPI VSM, this
1697 * value is based on user choice in BIOS setup.
1700 /* DBGO("\\_SB\\_INI\n") */
1701 /* DBGO(" DSDT.ASL code from ") */
1702 /* DBGO(__DATE__) */
1704 /* DBGO(__TIME__) */
1705 /* DBGO("\n Sleep states supported: ") */
1707 /* DBGO(" \\_OS=") */
1709 /* DBGO("\n \\_REV=") */
1713 /* Determine the OS we're running on */
1716 /* On older chips, clear PciExpWakeDisEn */
1717 /*if (LLessEqual(\SBRI, 0x13)) {
1721 } /* End Method(_SB._INI) */
1722 } /* End Device(PCI0) */
1724 Device(PWRB) { /* Start Power button device */
1725 Name(_HID, EISAID("PNP0C0C"))
1727 Name(_PRW, Package () {3, 0x04}) /* wake from S1-S4 */
1728 Name(_STA, 0x0B) /* sata is invisible */
1730 } /* End \_SB scope */
1734 /* DBGO("\\_SI\\_SST\n") */
1735 /* DBGO(" New Indicator state: ") */
1739 } /* End Scope SI */
1743 OperationRegion (SMB0, SystemIO, 0xB00, 0x0C)
1744 Field (SMB0, ByteAcc, NoLock, Preserve) {
1745 HSTS, 8, /* SMBUS status */
1746 SSTS, 8, /* SMBUS slave status */
1747 HCNT, 8, /* SMBUS control */
1748 HCMD, 8, /* SMBUS host cmd */
1749 HADD, 8, /* SMBUS address */
1750 DAT0, 8, /* SMBUS data0 */
1751 DAT1, 8, /* SMBUS data1 */
1752 BLKD, 8, /* SMBUS block data */
1753 SCNT, 8, /* SMBUS slave control */
1754 SCMD, 8, /* SMBUS shaow cmd */
1755 SEVT, 8, /* SMBUS slave event */
1756 SDAT, 8 /* SMBUS slave data */
1759 Method (WCLR, 0, NotSerialized) { /* clear SMBUS status register */
1761 Store (0xFA, Local0)
1762 While (LAnd (LNotEqual (And (HSTS, 0x1E), Zero), LGreater (Local0, Zero))) {
1770 Method (SWTC, 1, NotSerialized) {
1771 Store (Arg0, Local0)
1772 Store (0x07, Local2)
1774 While (LEqual (Local1, One)) {
1775 Store (And (HSTS, 0x1E), Local3)
1776 If (LNotEqual (Local3, Zero)) { /* read sucess */
1777 If (LEqual (Local3, 0x02)) {
1778 Store (Zero, Local2)
1781 Store (Zero, Local1)
1784 If (LLess (Local0, 0x0A)) { /* read failure */
1785 Store (0x10, Local2)
1786 Store (Zero, Local1)
1789 Sleep (0x0A) /* 10 ms, try again */
1790 Subtract (Local0, 0x0A, Local0)
1798 Method (SMBR, 3, NotSerialized) {
1799 Store (0x07, Local0)
1800 If (LEqual (Acquire (SBX0, 0xFFFF), Zero)) {
1801 Store (WCLR (), Local0) /* clear SMBUS status register before read data */
1802 If (LEqual (Local0, Zero)) {
1808 Store (Or (ShiftLeft (Arg1, One), One), HADD)
1810 If (LEqual (Arg0, 0x07)) {
1811 Store (0x48, HCNT) /* read byte */
1814 Store (SWTC (0x03E8), Local1) /* 1000 ms */
1815 If (LEqual (Local1, Zero)) {
1816 If (LEqual (Arg0, 0x07)) {
1817 Store (DAT0, Local0)
1821 Store (Local1, Local0)
1827 /* DBGO("the value of SMBusData0 register ") */
1843 Method(_AC0,0) { /* Active Cooling 0 (0=highest fan speed) */
1844 /* DBGO("\\_TZ\\TZ00\\_AC0\n") */
1845 Return(Add(0, 2730))
1847 Method(_AL0,0) { /* Returns package of cooling device to turn on */
1848 /* DBGO("\\_TZ\\TZ00\\_AL0\n") */
1849 Return(Package() {\_TZ.TZ00.FAN0})
1852 Name(_HID, EISAID("PNP0C0B"))
1853 Name(_PR0, Package() {PFN0})
1856 PowerResource(PFN0,0,0) {
1862 /* DBGO("\\_TZ\\TZ00\\FAN0 _ON\n") */
1865 /* DBGO("\\_TZ\\TZ00\\FAN0 _OFF\n") */
1869 Method(_HOT,0) { /* return hot temp in tenths degree Kelvin */
1870 /* DBGO("\\_TZ\\TZ00\\_HOT\n") */
1871 Return (Add (THOT, KELV))
1873 Method(_CRT,0) { /* return critical temp in tenths degree Kelvin */
1874 /* DBGO("\\_TZ\\TZ00\\_CRT\n") */
1875 Return (Add (TCRT, KELV))
1877 Method(_TMP,0) { /* return current temp of this zone */
1878 Store (SMBR (0x07, 0x4C,, 0x00), Local0)
1879 If (LGreater (Local0, 0x10)) {
1880 Store (Local0, Local1)
1883 Add (Local0, THOT, Local0)
1884 Return (Add (400, KELV))
1887 Store (SMBR (0x07, 0x4C, 0x01), Local0)
1888 /* only the two MSBs in the external temperature low byte are used, resolution 0.25. We ignore it */
1889 /* Store (SMBR (0x07, 0x4C, 0x10), Local2) */
1890 If (LGreater (Local0, 0x10)) {
1891 If (LGreater (Local0, Local1)) {
1892 Store (Local0, Local1)
1895 Multiply (Local1, 10, Local1)
1896 Return (Add (Local1, KELV))
1899 Add (Local0, THOT, Local0)
1900 Return (Add (400 , KELV))
1906 /* End of ASL file */