|  | /* | 
|  | * Bochs/QEMU ACPI DSDT ASL definition | 
|  | * | 
|  | * Copyright (c) 2006 Fabrice Bellard | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License version 2 as published by the Free Software Foundation. | 
|  | * | 
|  | * This library 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 | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
|  | */ | 
|  |  | 
|  | ACPI_EXTRACT_ALL_CODE AcpiDsdtAmlCode | 
|  |  | 
|  | DefinitionBlock ( | 
|  | "acpi-dsdt.aml",    // Output Filename | 
|  | "DSDT",             // Signature | 
|  | 0x01,               // DSDT Compliance Revision | 
|  | "BXPC",             // OEMID | 
|  | "BXDSDT",           // TABLE ID | 
|  | 0x1                 // OEM Revision | 
|  | ) | 
|  | { | 
|  |  | 
|  | #include "acpi-dsdt-dbug.dsl" | 
|  |  | 
|  | Scope(\_SB) { | 
|  | Device(PCI0) { | 
|  | Name(_HID, EisaId("PNP0A03")) | 
|  | Name(_ADR, 0x00) | 
|  | Name(_UID, 1) | 
|  | //#define PX13 S0B_ | 
|  | //            External(PX13, DeviceObj) | 
|  | } | 
|  | } | 
|  |  | 
|  | #include "acpi-dsdt-hpet.dsl" | 
|  |  | 
|  | /**************************************************************** | 
|  | * PIIX4 PM | 
|  | ****************************************************************/ | 
|  |  | 
|  | Scope(\_SB.PCI0) { | 
|  | Device(PX13) { | 
|  | Name(_ADR, 0x00010003) | 
|  | OperationRegion(P13C, PCI_Config, 0x00, 0xff) | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | /**************************************************************** | 
|  | * PIIX3 ISA bridge | 
|  | ****************************************************************/ | 
|  |  | 
|  | Scope(\_SB.PCI0) { | 
|  |  | 
|  | External(ISA, DeviceObj) | 
|  |  | 
|  | Device(ISA) { | 
|  | Name(_ADR, 0x00010000) | 
|  |  | 
|  | /* PIIX PCI to ISA irq remapping */ | 
|  | OperationRegion(P40C, PCI_Config, 0x60, 0x04) | 
|  |  | 
|  | /* enable bits */ | 
|  | Field(\_SB.PCI0.PX13.P13C, AnyAcc, NoLock, Preserve) { | 
|  | Offset(0x5f), | 
|  | , 7, | 
|  | LPEN, 1,         // LPT | 
|  | Offset(0x67), | 
|  | , 3, | 
|  | CAEN, 1,         // COM1 | 
|  | , 3, | 
|  | CBEN, 1,         // COM2 | 
|  | } | 
|  | Name(FDEN, 1) | 
|  | } | 
|  | } | 
|  |  | 
|  | #include "acpi-dsdt-isa.dsl" | 
|  |  | 
|  |  | 
|  | /**************************************************************** | 
|  | * PCI hotplug | 
|  | ****************************************************************/ | 
|  |  | 
|  | Scope(\_SB.PCI0) { | 
|  | OperationRegion(PCST, SystemIO, 0xae00, 0x08) | 
|  | Field(PCST, DWordAcc, NoLock, WriteAsZeros) { | 
|  | PCIU, 32, | 
|  | PCID, 32, | 
|  | } | 
|  |  | 
|  | OperationRegion(SEJ, SystemIO, 0xae08, 0x04) | 
|  | Field(SEJ, DWordAcc, NoLock, WriteAsZeros) { | 
|  | B0EJ, 32, | 
|  | } | 
|  |  | 
|  | OperationRegion(BNMR, SystemIO, 0xae10, 0x04) | 
|  | Field(BNMR, DWordAcc, NoLock, WriteAsZeros) { | 
|  | BNUM, 32, | 
|  | } | 
|  |  | 
|  | /* Lock to protect access to fields above. */ | 
|  | Mutex(BLCK, 0) | 
|  |  | 
|  | /* Methods called by bulk generated PCI devices below */ | 
|  |  | 
|  | /* Methods called by hotplug devices */ | 
|  | Method(PCEJ, 2, NotSerialized) { | 
|  | // _EJ0 method - eject callback | 
|  | Acquire(BLCK, 0xFFFF) | 
|  | Store(Arg0, BNUM) | 
|  | Store(ShiftLeft(1, Arg1), B0EJ) | 
|  | Release(BLCK) | 
|  | Return (0x0) | 
|  | } | 
|  |  | 
|  | /* Hotplug notification method supplied by SSDT */ | 
|  | External(\_SB.PCI0.PCNT, MethodObj) | 
|  | } | 
|  |  | 
|  |  | 
|  | /**************************************************************** | 
|  | * PCI IRQs | 
|  | ****************************************************************/ | 
|  |  | 
|  | Scope(\_SB) { | 
|  | Scope(PCI0) { | 
|  | Method (_PRT, 0) { | 
|  | Store(Package(128) {}, Local0) | 
|  | Store(Zero, Local1) | 
|  | While(LLess(Local1, 128)) { | 
|  | // slot = pin >> 2 | 
|  | Store(ShiftRight(Local1, 2), Local2) | 
|  |  | 
|  | // lnk = (slot + pin) & 3 | 
|  | Store(And(Add(Local1, Local2), 3), Local3) | 
|  | If (LEqual(Local3, 0)) { | 
|  | Store(Package(4) { Zero, Zero, LNKD, Zero }, Local4) | 
|  | } | 
|  | If (LEqual(Local3, 1)) { | 
|  | // device 1 is the power-management device, needs SCI | 
|  | If (LEqual(Local1, 4)) { | 
|  | Store(Package(4) { Zero, Zero, LNKS, Zero }, Local4) | 
|  | } Else { | 
|  | Store(Package(4) { Zero, Zero, LNKA, Zero }, Local4) | 
|  | } | 
|  | } | 
|  | If (LEqual(Local3, 2)) { | 
|  | Store(Package(4) { Zero, Zero, LNKB, Zero }, Local4) | 
|  | } | 
|  | If (LEqual(Local3, 3)) { | 
|  | Store(Package(4) { Zero, Zero, LNKC, Zero }, Local4) | 
|  | } | 
|  |  | 
|  | // Complete the interrupt routing entry: | 
|  | //    Package(4) { 0x[slot]FFFF, [pin], [link], 0) } | 
|  |  | 
|  | Store(Or(ShiftLeft(Local2, 16), 0xFFFF), Index(Local4, 0)) | 
|  | Store(And(Local1, 3),                    Index(Local4, 1)) | 
|  | Store(Local4,                            Index(Local0, Local1)) | 
|  |  | 
|  | Increment(Local1) | 
|  | } | 
|  |  | 
|  | Return(Local0) | 
|  | } | 
|  | } | 
|  |  | 
|  | Field(PCI0.ISA.P40C, ByteAcc, NoLock, Preserve) { | 
|  | PRQ0,   8, | 
|  | PRQ1,   8, | 
|  | PRQ2,   8, | 
|  | PRQ3,   8 | 
|  | } | 
|  |  | 
|  | Method(IQST, 1, NotSerialized) { | 
|  | // _STA method - get status | 
|  | If (And(0x80, Arg0)) { | 
|  | Return (0x09) | 
|  | } | 
|  | Return (0x0B) | 
|  | } | 
|  | Method(IQCR, 1, Serialized) { | 
|  | // _CRS method - get current settings | 
|  | Name(PRR0, ResourceTemplate() { | 
|  | Interrupt(, Level, ActiveHigh, Shared) { 0 } | 
|  | }) | 
|  | CreateDWordField(PRR0, 0x05, PRRI) | 
|  | If (LLess(Arg0, 0x80)) { | 
|  | Store(Arg0, PRRI) | 
|  | } | 
|  | Return (PRR0) | 
|  | } | 
|  |  | 
|  | #define define_link(link, uid, reg)                             \ | 
|  | Device(link) {                                          \ | 
|  | Name(_HID, EISAID("PNP0C0F"))                       \ | 
|  | Name(_UID, uid)                                     \ | 
|  | Name(_PRS, ResourceTemplate() {                     \ | 
|  | Interrupt(, Level, ActiveHigh, Shared) {        \ | 
|  | 5, 10, 11                                   \ | 
|  | }                                               \ | 
|  | })                                                  \ | 
|  | Method(_STA, 0, NotSerialized) {                    \ | 
|  | Return (IQST(reg))                              \ | 
|  | }                                                   \ | 
|  | Method(_DIS, 0, NotSerialized) {                    \ | 
|  | Or(reg, 0x80, reg)                              \ | 
|  | }                                                   \ | 
|  | Method(_CRS, 0, NotSerialized) {                    \ | 
|  | Return (IQCR(reg))                              \ | 
|  | }                                                   \ | 
|  | Method(_SRS, 1, NotSerialized) {                    \ | 
|  | CreateDWordField(Arg0, 0x05, PRRI)              \ | 
|  | Store(PRRI, reg)                                \ | 
|  | }                                                   \ | 
|  | } | 
|  |  | 
|  | define_link(LNKA, 0, PRQ0) | 
|  | define_link(LNKB, 1, PRQ1) | 
|  | define_link(LNKC, 2, PRQ2) | 
|  | define_link(LNKD, 3, PRQ3) | 
|  |  | 
|  | Device(LNKS) { | 
|  | Name(_HID, EISAID("PNP0C0F")) | 
|  | Name(_UID, 4) | 
|  | Name(_PRS, ResourceTemplate() { | 
|  | Interrupt(, Level, ActiveHigh, Shared) { 9 } | 
|  | }) | 
|  |  | 
|  | // The SCI cannot be disabled and is always attached to GSI 9, | 
|  | // so these are no-ops.  We only need this link to override the | 
|  | // polarity to active high and match the content of the MADT. | 
|  | Method(_STA, 0, NotSerialized) { Return (0x0b) } | 
|  | Method(_DIS, 0, NotSerialized) { } | 
|  | Method(_CRS, 0, NotSerialized) { Return (_PRS) } | 
|  | Method(_SRS, 1, NotSerialized) { } | 
|  | } | 
|  | } | 
|  |  | 
|  | #include "hw/acpi/pc-hotplug.h" | 
|  | #define CPU_STATUS_BASE PIIX4_CPU_HOTPLUG_IO_BASE | 
|  | #include "acpi-dsdt-cpu-hotplug.dsl" | 
|  | #include "acpi-dsdt-mem-hotplug.dsl" | 
|  |  | 
|  |  | 
|  | /**************************************************************** | 
|  | * General purpose events | 
|  | ****************************************************************/ | 
|  | Scope(\_GPE) { | 
|  | Name(_HID, "ACPI0006") | 
|  |  | 
|  | Method(_L00) { | 
|  | } | 
|  | Method(_E01) { | 
|  | // PCI hotplug event | 
|  | Acquire(\_SB.PCI0.BLCK, 0xFFFF) | 
|  | \_SB.PCI0.PCNT() | 
|  | Release(\_SB.PCI0.BLCK) | 
|  | } | 
|  | Method(_E02) { | 
|  | // CPU hotplug event | 
|  | \_SB.PRSC() | 
|  | } | 
|  | Method(_E03) { | 
|  | // Memory hotplug event | 
|  | \_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_SCAN_METHOD() | 
|  | } | 
|  | Method(_L04) { | 
|  | } | 
|  | Method(_L05) { | 
|  | } | 
|  | Method(_L06) { | 
|  | } | 
|  | Method(_L07) { | 
|  | } | 
|  | Method(_L08) { | 
|  | } | 
|  | Method(_L09) { | 
|  | } | 
|  | Method(_L0A) { | 
|  | } | 
|  | Method(_L0B) { | 
|  | } | 
|  | Method(_L0C) { | 
|  | } | 
|  | Method(_L0D) { | 
|  | } | 
|  | Method(_L0E) { | 
|  | } | 
|  | Method(_L0F) { | 
|  | } | 
|  | } | 
|  | } |