Home | History | Annotate | Download | only in AcpiTables
      1 /** @file
      2   Contains root level name space objects for the platform
      3 
      4   Copyright (c) 2008, Intel Corporation. All rights reserved.<BR>
      5   This program and the accompanying materials are
      6   licensed and made available under the terms and conditions of the BSD License
      7   which accompanies this distribution.  The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 DefinitionBlock ("Dsdt.aml", "DSDT", 1, "INTEL ", "OVMF    ", 4) {
     16   //
     17   // System Sleep States
     18   //
     19   // We build S3 and S4 with GetSuspendStates() in
     20   // "OvmfPkg/AcpiPlatformDxe/Qemu.c".
     21   //
     22   Name (\_S0, Package () {5, 0, 0, 0}) // Working
     23   Name (\_S5, Package () {0, 0, 0, 0}) // Soft Off
     24 
     25   //
     26   //  System Bus
     27   //
     28   Scope (\_SB) {
     29     //
     30     // PCI Root Bridge
     31     //
     32     Device (PCI0) {
     33       Name (_HID, EISAID ("PNP0A03"))
     34       Name (_ADR, 0x00000000)
     35       Name (_BBN, 0x00)
     36       Name (_UID, 0x00)
     37 
     38       //
     39       // BUS, I/O, and MMIO resources
     40       //
     41       Name (CRES, ResourceTemplate () {
     42         WORDBusNumber (          // Bus number resource (0); the bridge produces bus numbers for its subsequent buses
     43           ResourceProducer,      // bit 0 of general flags is 1
     44           MinFixed,              // Range is fixed
     45           MaxFixed,              // Range is fixed
     46           PosDecode,             // PosDecode
     47           0x0000,                // Granularity
     48           0x0000,                // Min
     49           0x00FF,                // Max
     50           0x0000,                // Translation
     51           0x0100                 // Range Length = Max-Min+1
     52           )
     53 
     54         IO (Decode16, 0xCF8, 0xCF8, 0x01, 0x08)       //Consumed resource (0xCF8-0xCFF)
     55 
     56         WORDIO (                 // Consumed-and-produced resource (all I/O below CF8)
     57           ResourceProducer,      // bit 0 of general flags is 0
     58           MinFixed,              // Range is fixed
     59           MaxFixed,              // Range is fixed
     60           PosDecode,
     61           EntireRange,
     62           0x0000,                // Granularity
     63           0x0000,                // Min
     64           0x0CF7,                // Max
     65           0x0000,                // Translation
     66           0x0CF8                 // Range Length
     67           )
     68 
     69         WORDIO (                 // Consumed-and-produced resource (all I/O above CFF)
     70           ResourceProducer,      // bit 0 of general flags is 0
     71           MinFixed,              // Range is fixed
     72           MaxFixed,              // Range is fixed
     73           PosDecode,
     74           EntireRange,
     75           0x0000,                // Granularity
     76           0x0D00,                // Min
     77           0xFFFF,                // Max
     78           0x0000,                // Translation
     79           0xF300                 // Range Length
     80           )
     81 
     82         DWORDMEMORY (            // Descriptor for legacy VGA video RAM
     83           ResourceProducer,      // bit 0 of general flags is 0
     84           PosDecode,
     85           MinFixed,              // Range is fixed
     86           MaxFixed,              // Range is Fixed
     87           Cacheable,
     88           ReadWrite,
     89           0x00000000,            // Granularity
     90           0x000A0000,            // Min
     91           0x000BFFFF,            // Max
     92           0x00000000,            // Translation
     93           0x00020000             // Range Length
     94           )
     95 
     96         DWORDMEMORY (            // Descriptor for 32-bit MMIO
     97           ResourceProducer,      // bit 0 of general flags is 0
     98           PosDecode,
     99           MinFixed,              // Range is fixed
    100           MaxFixed,              // Range is Fixed
    101           NonCacheable,
    102           ReadWrite,
    103           0x00000000,            // Granularity
    104           0xF8000000,            // Min
    105           0xFFFBFFFF,            // Max
    106           0x00000000,            // Translation
    107           0x07FC0000,            // Range Length
    108           ,                      // ResourceSourceIndex
    109           ,                      // ResourceSource
    110           PW32                   // DescriptorName
    111           )
    112       })
    113 
    114       Name (CR64, ResourceTemplate () {
    115         QWordMemory (            // Descriptor for 64-bit MMIO
    116             ResourceProducer,    // bit 0 of general flags is 0
    117             PosDecode,
    118             MinFixed,            // Range is fixed
    119             MaxFixed,            // Range is Fixed
    120             Cacheable,
    121             ReadWrite,
    122             0x00000000,          // Granularity
    123             0x8000000000,        // Min
    124             0xFFFFFFFFFF,        // Max
    125             0x00000000,          // Translation
    126             0x8000000000,        // Range Length
    127             ,                    // ResourceSourceIndex
    128             ,                    // ResourceSource
    129             PW64                 // DescriptorName
    130             )
    131       })
    132 
    133       Method (_CRS, 0, Serialized) {
    134         //
    135         // see the FIRMWARE_DATA structure in "OvmfPkg/AcpiPlatformDxe/Qemu.c"
    136         //
    137         External (FWDT, OpRegionObj)
    138         Field(FWDT, QWordAcc, NoLock, Preserve) {
    139           P0S, 64,               // PciWindow32.Base
    140           P0E, 64,               // PciWindow32.End
    141           P0L, 64,               // PciWindow32.Length
    142           P1S, 64,               // PciWindow64.Base
    143           P1E, 64,               // PciWindow64.End
    144           P1L, 64                // PciWindow64.Length
    145         }
    146         Field(FWDT, DWordAcc, NoLock, Preserve) {
    147           P0SL, 32,              // PciWindow32.Base,   low  32 bits
    148           P0SH, 32,              // PciWindow32.Base,   high 32 bits
    149           P0EL, 32,              // PciWindow32.End,    low  32 bits
    150           P0EH, 32,              // PciWindow32.End,    high 32 bits
    151           P0LL, 32,              // PciWindow32.Length, low  32 bits
    152           P0LH, 32,              // PciWindow32.Length, high 32 bits
    153           P1SL, 32,              // PciWindow64.Base,   low  32 bits
    154           P1SH, 32,              // PciWindow64.Base,   high 32 bits
    155           P1EL, 32,              // PciWindow64.End,    low  32 bits
    156           P1EH, 32,              // PciWindow64.End,    high 32 bits
    157           P1LL, 32,              // PciWindow64.Length, low  32 bits
    158           P1LH, 32               // PciWindow64.Length, high 32 bits
    159         }
    160 
    161         //
    162         // fixup 32-bit PCI IO window
    163         //
    164         CreateDWordField (CRES, \_SB.PCI0.PW32._MIN, PS32)
    165         CreateDWordField (CRES, \_SB.PCI0.PW32._MAX, PE32)
    166         CreateDWordField (CRES, \_SB.PCI0.PW32._LEN, PL32)
    167         Store (P0SL, PS32)
    168         Store (P0EL, PE32)
    169         Store (P0LL, PL32)
    170 
    171         If (LAnd (LEqual (P1SL, 0x00), LEqual (P1SH, 0x00))) {
    172           Return (CRES)
    173         } Else {
    174           //
    175           // fixup 64-bit PCI IO window
    176           //
    177           CreateQWordField (CR64, \_SB.PCI0.PW64._MIN, PS64)
    178           CreateQWordField (CR64, \_SB.PCI0.PW64._MAX, PE64)
    179           CreateQWordField (CR64, \_SB.PCI0.PW64._LEN, PL64)
    180           Store (P1S, PS64)
    181           Store (P1E, PE64)
    182           Store (P1L, PL64)
    183 
    184           //
    185           // add window and return result
    186           //
    187           ConcatenateResTemplate (CRES, CR64, Local0)
    188           Return (Local0)
    189         }
    190       }
    191 
    192       //
    193       // PCI Interrupt Routing Table - PIC Mode Only
    194       //
    195       Method (_PRT, 0, NotSerialized) {
    196         Return (
    197           Package () {
    198             //
    199             // Bus 0; Devices 0 to 15
    200             //
    201             Package () {0x0000FFFF, 0x00, \_SB.PCI0.LPC.LNKD, 0x00},
    202             Package () {0x0000FFFF, 0x01, \_SB.PCI0.LPC.LNKA, 0x00},
    203             Package () {0x0000FFFF, 0x02, \_SB.PCI0.LPC.LNKB, 0x00},
    204             Package () {0x0000FFFF, 0x03, \_SB.PCI0.LPC.LNKC, 0x00},
    205 
    206             //
    207             // Bus 0, Device 1, Pin 0 (INTA) is special; it corresponds to the
    208             // internally generated SCI (System Control Interrupt), which is
    209             // always routed to GSI 9. By setting the third (= Source) field to
    210             // zero, we could use the fourth (= Source Index) field to hardwire
    211             // the pin to GSI 9 directly.
    212             //
    213             // That way however, in accordance with the ACPI spec's description
    214             // of SCI, the interrupt would be treated as "active low,
    215             // shareable, level", and that doesn't match qemu.
    216             //
    217             // In QemuInstallAcpiMadtTable() [OvmfPkg/AcpiPlatformDxe/Qemu.c]
    218             // we install an Interrupt Override Structure for the identity
    219             // mapped IRQ#9 / GSI 9 (the corresponding bit being set in
    220             // Pcd8259LegacyModeEdgeLevel), which describes the correct
    221             // polarity (active high). As a consequence, some OS'en (eg. Linux)
    222             // override the default (active low) polarity originating from the
    223             // _PRT; others (eg. FreeBSD) don't. Therefore we need a separate
    224             // link device just to specify a polarity that matches the MADT.
    225             //
    226             Package () {0x0001FFFF, 0x00, \_SB.PCI0.LPC.LNKS, 0x00},
    227 
    228             Package () {0x0001FFFF, 0x01, \_SB.PCI0.LPC.LNKB, 0x00},
    229             Package () {0x0001FFFF, 0x02, \_SB.PCI0.LPC.LNKC, 0x00},
    230             Package () {0x0001FFFF, 0x03, \_SB.PCI0.LPC.LNKD, 0x00},
    231 
    232             Package () {0x0002FFFF, 0x00, \_SB.PCI0.LPC.LNKB, 0x00},
    233             Package () {0x0002FFFF, 0x01, \_SB.PCI0.LPC.LNKC, 0x00},
    234             Package () {0x0002FFFF, 0x02, \_SB.PCI0.LPC.LNKD, 0x00},
    235             Package () {0x0002FFFF, 0x03, \_SB.PCI0.LPC.LNKA, 0x00},
    236 
    237             Package () {0x0003FFFF, 0x00, \_SB.PCI0.LPC.LNKC, 0x00},
    238             Package () {0x0003FFFF, 0x01, \_SB.PCI0.LPC.LNKD, 0x00},
    239             Package () {0x0003FFFF, 0x02, \_SB.PCI0.LPC.LNKA, 0x00},
    240             Package () {0x0003FFFF, 0x03, \_SB.PCI0.LPC.LNKB, 0x00},
    241 
    242             Package () {0x0004FFFF, 0x00, \_SB.PCI0.LPC.LNKD, 0x00},
    243             Package () {0x0004FFFF, 0x01, \_SB.PCI0.LPC.LNKA, 0x00},
    244             Package () {0x0004FFFF, 0x02, \_SB.PCI0.LPC.LNKB, 0x00},
    245             Package () {0x0004FFFF, 0x03, \_SB.PCI0.LPC.LNKC, 0x00},
    246 
    247             Package () {0x0005FFFF, 0x00, \_SB.PCI0.LPC.LNKA, 0x00},
    248             Package () {0x0005FFFF, 0x01, \_SB.PCI0.LPC.LNKB, 0x00},
    249             Package () {0x0005FFFF, 0x02, \_SB.PCI0.LPC.LNKC, 0x00},
    250             Package () {0x0005FFFF, 0x03, \_SB.PCI0.LPC.LNKD, 0x00},
    251 
    252             Package () {0x0006FFFF, 0x00, \_SB.PCI0.LPC.LNKB, 0x00},
    253             Package () {0x0006FFFF, 0x01, \_SB.PCI0.LPC.LNKC, 0x00},
    254             Package () {0x0006FFFF, 0x02, \_SB.PCI0.LPC.LNKD, 0x00},
    255             Package () {0x0006FFFF, 0x03, \_SB.PCI0.LPC.LNKA, 0x00},
    256 
    257             Package () {0x0007FFFF, 0x00, \_SB.PCI0.LPC.LNKC, 0x00},
    258             Package () {0x0007FFFF, 0x01, \_SB.PCI0.LPC.LNKD, 0x00},
    259             Package () {0x0007FFFF, 0x02, \_SB.PCI0.LPC.LNKA, 0x00},
    260             Package () {0x0007FFFF, 0x03, \_SB.PCI0.LPC.LNKB, 0x00},
    261 
    262             Package () {0x0008FFFF, 0x00, \_SB.PCI0.LPC.LNKD, 0x00},
    263             Package () {0x0008FFFF, 0x01, \_SB.PCI0.LPC.LNKA, 0x00},
    264             Package () {0x0008FFFF, 0x02, \_SB.PCI0.LPC.LNKB, 0x00},
    265             Package () {0x0008FFFF, 0x03, \_SB.PCI0.LPC.LNKC, 0x00},
    266 
    267             Package () {0x0009FFFF, 0x00, \_SB.PCI0.LPC.LNKA, 0x00},
    268             Package () {0x0009FFFF, 0x01, \_SB.PCI0.LPC.LNKB, 0x00},
    269             Package () {0x0009FFFF, 0x02, \_SB.PCI0.LPC.LNKC, 0x00},
    270             Package () {0x0009FFFF, 0x03, \_SB.PCI0.LPC.LNKD, 0x00},
    271 
    272             Package () {0x000AFFFF, 0x00, \_SB.PCI0.LPC.LNKB, 0x00},
    273             Package () {0x000AFFFF, 0x01, \_SB.PCI0.LPC.LNKC, 0x00},
    274             Package () {0x000AFFFF, 0x02, \_SB.PCI0.LPC.LNKD, 0x00},
    275             Package () {0x000AFFFF, 0x03, \_SB.PCI0.LPC.LNKA, 0x00},
    276 
    277             Package () {0x000BFFFF, 0x00, \_SB.PCI0.LPC.LNKC, 0x00},
    278             Package () {0x000BFFFF, 0x01, \_SB.PCI0.LPC.LNKD, 0x00},
    279             Package () {0x000BFFFF, 0x02, \_SB.PCI0.LPC.LNKA, 0x00},
    280             Package () {0x000BFFFF, 0x03, \_SB.PCI0.LPC.LNKB, 0x00},
    281 
    282             Package () {0x000CFFFF, 0x00, \_SB.PCI0.LPC.LNKD, 0x00},
    283             Package () {0x000CFFFF, 0x01, \_SB.PCI0.LPC.LNKA, 0x00},
    284             Package () {0x000CFFFF, 0x02, \_SB.PCI0.LPC.LNKB, 0x00},
    285             Package () {0x000CFFFF, 0x03, \_SB.PCI0.LPC.LNKC, 0x00},
    286 
    287             Package () {0x000DFFFF, 0x00, \_SB.PCI0.LPC.LNKA, 0x00},
    288             Package () {0x000DFFFF, 0x01, \_SB.PCI0.LPC.LNKB, 0x00},
    289             Package () {0x000DFFFF, 0x02, \_SB.PCI0.LPC.LNKC, 0x00},
    290             Package () {0x000DFFFF, 0x03, \_SB.PCI0.LPC.LNKD, 0x00},
    291 
    292             Package () {0x000EFFFF, 0x00, \_SB.PCI0.LPC.LNKB, 0x00},
    293             Package () {0x000EFFFF, 0x01, \_SB.PCI0.LPC.LNKC, 0x00},
    294             Package () {0x000EFFFF, 0x02, \_SB.PCI0.LPC.LNKD, 0x00},
    295             Package () {0x000EFFFF, 0x03, \_SB.PCI0.LPC.LNKA, 0x00},
    296 
    297             Package () {0x000FFFFF, 0x00, \_SB.PCI0.LPC.LNKC, 0x00},
    298             Package () {0x000FFFFF, 0x01, \_SB.PCI0.LPC.LNKD, 0x00},
    299             Package () {0x000FFFFF, 0x02, \_SB.PCI0.LPC.LNKA, 0x00},
    300             Package () {0x000FFFFF, 0x03, \_SB.PCI0.LPC.LNKB, 0x00}
    301           }
    302         )
    303       }
    304 
    305       //
    306       // PCI to ISA Bridge (Bus 0, Device 1, Function 0)
    307       // "Low Pin Count"
    308       //
    309       Device (LPC) {
    310         Name (_ADR, 0x00010000)
    311 
    312         //
    313         // The SCI cannot be rerouted or disabled with PIRQRC[A:D]; we only
    314         // need this link device in order to specify the polarity.
    315         //
    316         Device (LNKS) {
    317           Name (_HID, EISAID("PNP0C0F"))
    318           Name (_UID, 0)
    319 
    320           Name (_STA, 0xB) // 0x1: device present
    321                            // 0x2: enabled and decoding resources
    322                            // 0x8: functioning properly
    323 
    324           Method (_SRS, 1, NotSerialized) { /* no-op */ }
    325           Method (_DIS, 0, NotSerialized) { /* no-op */ }
    326 
    327           Name (_PRS, ResourceTemplate () {
    328             Interrupt (ResourceConsumer, Level, ActiveHigh, Shared) { 9 }
    329             //
    330             // list of IRQs occupied thus far: 9
    331             //
    332           })
    333           Method (_CRS, 0, NotSerialized) { Return (_PRS) }
    334         }
    335 
    336         //
    337         // PCI Interrupt Routing Configuration Registers, PIRQRC[A:D]
    338         //
    339         OperationRegion (PRR0, PCI_Config, 0x60, 0x04)
    340         Field (PRR0, ANYACC, NOLOCK, PRESERVE) {
    341           PIRA, 8,
    342           PIRB, 8,
    343           PIRC, 8,
    344           PIRD, 8
    345         }
    346 
    347         //
    348         // _STA method for LNKA, LNKB, LNKC, LNKD
    349         // Arg0[in]: value of PIRA / PIRB / PIRC / PIRD
    350         //
    351         Method (PSTA, 1, NotSerialized) {
    352           If (And (Arg0, 0x80)) { // disable-bit set?
    353             Return (0x9)          // "device present" | "functioning properly"
    354           } Else {
    355             Return (0xB)          // same | "enabled and decoding resources"
    356           }
    357         }
    358 
    359         //
    360         // _CRS method for LNKA, LNKB, LNKC, LNKD
    361         // Arg0[in]: value of PIRA / PIRB / PIRC / PIRD
    362         //
    363         Method (PCRS, 1, Serialized) {
    364           //
    365           // create temporary buffer with an Extended Interrupt Descriptor
    366           // whose single vector defaults to zero
    367           //
    368           Name (BUF0, ResourceTemplate () {
    369               Interrupt (ResourceConsumer, Level, ActiveHigh, Shared){0}
    370             }
    371           )
    372 
    373           //
    374           // define reference to first interrupt vector in buffer
    375           //
    376           CreateDWordField (BUF0, 0x05, IRQW)
    377 
    378           //
    379           // If the disable-bit is clear, overwrite the default zero vector
    380           // with the value in Arg0 (ie. PIRQRC[A:D]). Reserved bits are read
    381           // as 0.
    382           //
    383           If (LNot (And (Arg0, 0x80))) {
    384             Store (Arg0, IRQW)
    385           }
    386           Return (BUF0)
    387         }
    388 
    389         //
    390         // _PRS resource for LNKA, LNKB, LNKC, LNKD
    391         //
    392         Name (PPRS, ResourceTemplate () {
    393           Interrupt (ResourceConsumer, Level, ActiveHigh, Shared) {5, 10, 11}
    394           //
    395           // list of IRQs occupied thus far: 9, 5, 10, 11
    396           //
    397         })
    398 
    399         //
    400         // PCI IRQ Link A
    401         //
    402         Device (LNKA) {
    403           Name (_HID, EISAID("PNP0C0F"))
    404           Name (_UID, 1)
    405 
    406           Method (_STA, 0, NotSerialized) { Return (PSTA (PIRA)) }
    407           Method (_DIS, 0, NotSerialized) {
    408             Or (PIRA, 0x80, PIRA) // set disable-bit
    409           }
    410           Method (_CRS, 0, NotSerialized) { Return (PCRS (PIRA)) }
    411           Method (_PRS, 0, NotSerialized) { Return (PPRS) }
    412           Method (_SRS, 1, NotSerialized) {
    413             CreateDWordField (Arg0, 0x05, IRQW)
    414             Store (IRQW, PIRA)
    415           }
    416         }
    417 
    418         //
    419         // PCI IRQ Link B
    420         //
    421         Device (LNKB) {
    422           Name (_HID, EISAID("PNP0C0F"))
    423           Name (_UID, 2)
    424 
    425           Method (_STA, 0, NotSerialized) { Return (PSTA (PIRB)) }
    426           Method (_DIS, 0, NotSerialized) {
    427             Or (PIRB, 0x80, PIRB) // set disable-bit
    428           }
    429           Method (_CRS, 0, NotSerialized) { Return (PCRS (PIRB)) }
    430           Method (_PRS, 0, NotSerialized) { Return (PPRS) }
    431           Method (_SRS, 1, NotSerialized) {
    432             CreateDWordField (Arg0, 0x05, IRQW)
    433             Store (IRQW, PIRB)
    434           }
    435         }
    436 
    437         //
    438         // PCI IRQ Link C
    439         //
    440         Device (LNKC) {
    441           Name (_HID, EISAID("PNP0C0F"))
    442           Name (_UID, 3)
    443 
    444           Method (_STA, 0, NotSerialized) { Return (PSTA (PIRC)) }
    445           Method (_DIS, 0, NotSerialized) {
    446             Or (PIRC, 0x80, PIRC) // set disable-bit
    447           }
    448           Method (_CRS, 0, NotSerialized) { Return (PCRS (PIRC)) }
    449           Method (_PRS, 0, NotSerialized) { Return (PPRS) }
    450           Method (_SRS, 1, NotSerialized) {
    451             CreateDWordField (Arg0, 0x05, IRQW)
    452             Store (IRQW, PIRC)
    453           }
    454         }
    455 
    456         //
    457         // PCI IRQ Link D
    458         //
    459         Device (LNKD) {
    460           Name (_HID, EISAID("PNP0C0F"))
    461           Name (_UID, 4)
    462 
    463           Method (_STA, 0, NotSerialized) { Return (PSTA (PIRD)) }
    464           Method (_DIS, 0, NotSerialized) {
    465             Or (PIRD, 0x80, PIRD) // set disable-bit
    466           }
    467           Method (_CRS, 0, NotSerialized) { Return (PCRS (PIRD)) }
    468           Method (_PRS, 0, NotSerialized) { Return (PPRS) }
    469           Method (_SRS, 1, NotSerialized) {
    470             CreateDWordField (Arg0, 0x05, IRQW)
    471             Store (IRQW, PIRD)
    472           }
    473         }
    474 
    475         //
    476         // Programmable Interrupt Controller (PIC)
    477         //
    478         Device(PIC) {
    479           Name (_HID, EISAID ("PNP0000"))
    480           Name (_CRS, ResourceTemplate () {
    481             IO (Decode16, 0x020, 0x020, 0x00, 0x02)
    482             IO (Decode16, 0x0A0, 0x0A0, 0x00, 0x02)
    483             IO (Decode16, 0x4D0, 0x4D0, 0x00, 0x02)
    484             IRQNoFlags () {2}
    485             //
    486             // list of IRQs occupied thus far: 9, 5, 10, 11, 2
    487             //
    488           })
    489         }
    490 
    491         //
    492         // ISA DMA
    493         //
    494         Device (DMAC) {
    495           Name (_HID, EISAID ("PNP0200"))
    496           Name (_CRS, ResourceTemplate () {
    497             IO (Decode16, 0x00, 0x00, 0, 0x10)
    498             IO (Decode16, 0x81, 0x81, 0, 0x03)
    499             IO (Decode16, 0x87, 0x87, 0, 0x01)
    500             IO (Decode16, 0x89, 0x89, 0, 0x03)
    501             IO (Decode16, 0x8f, 0x8f, 0, 0x01)
    502             IO (Decode16, 0xc0, 0xc0, 0, 0x20)
    503             DMA (Compatibility, NotBusMaster, Transfer8) {4}
    504           })
    505         }
    506 
    507         //
    508         // 8254 Timer
    509         //
    510         Device(TMR) {
    511           Name(_HID,EISAID("PNP0100"))
    512           Name(_CRS, ResourceTemplate () {
    513             IO (Decode16, 0x40, 0x40, 0x00, 0x04)
    514             IRQNoFlags () {0}
    515             //
    516             // list of IRQs occupied thus far: 9, 5, 10, 11, 2, 0
    517             //
    518           })
    519         }
    520 
    521         //
    522         // Real Time Clock
    523         //
    524         Device (RTC) {
    525           Name (_HID, EISAID ("PNP0B00"))
    526           Name (_CRS, ResourceTemplate () {
    527             IO (Decode16, 0x70, 0x70, 0x00, 0x02)
    528             IRQNoFlags () {8}
    529             //
    530             // list of IRQs occupied thus far: 9, 5, 10, 11, 2, 0, 8
    531             //
    532           })
    533         }
    534 
    535         //
    536         // PCAT Speaker
    537         //
    538         Device(SPKR) {
    539           Name (_HID, EISAID("PNP0800"))
    540           Name (_CRS, ResourceTemplate () {
    541             IO (Decode16, 0x61, 0x61, 0x01, 0x01)
    542           })
    543         }
    544 
    545         //
    546         // Floating Point Coprocessor
    547         //
    548         Device(FPU) {
    549           Name (_HID, EISAID("PNP0C04"))
    550           Name (_CRS, ResourceTemplate () {
    551             IO (Decode16, 0xF0, 0xF0, 0x00, 0x10)
    552             IRQNoFlags () {13}
    553             //
    554             // list of IRQs occupied thus far: 9, 5, 10, 11, 2, 0, 8, 13
    555             //
    556           })
    557         }
    558 
    559         //
    560         // Generic motherboard devices and pieces that don't fit anywhere else
    561         //
    562         Device(XTRA) {
    563           Name (_HID, EISAID ("PNP0C02"))
    564           Name (_UID, 0x01)
    565           Name (_CRS, ResourceTemplate () {
    566             IO (Decode16, 0x010, 0x010, 0x00, 0x10)
    567             IO (Decode16, 0x022, 0x022, 0x00, 0x1E)
    568             IO (Decode16, 0x044, 0x044, 0x00, 0x1C)
    569             IO (Decode16, 0x062, 0x062, 0x00, 0x02)
    570             IO (Decode16, 0x065, 0x065, 0x00, 0x0B)
    571             IO (Decode16, 0x072, 0x072, 0x00, 0x0E)
    572             IO (Decode16, 0x080, 0x080, 0x00, 0x01)
    573             IO (Decode16, 0x084, 0x084, 0x00, 0x03)
    574             IO (Decode16, 0x088, 0x088, 0x00, 0x01)
    575             IO (Decode16, 0x08c, 0x08c, 0x00, 0x03)
    576             IO (Decode16, 0x090, 0x090, 0x00, 0x10)
    577             IO (Decode16, 0x0A2, 0x0A2, 0x00, 0x1E)
    578             IO (Decode16, 0x0E0, 0x0E0, 0x00, 0x10)
    579             IO (Decode16, 0x1E0, 0x1E0, 0x00, 0x10)
    580             IO (Decode16, 0x160, 0x160, 0x00, 0x10)
    581             IO (Decode16, 0x278, 0x278, 0x00, 0x08)
    582             IO (Decode16, 0x370, 0x370, 0x00, 0x02)
    583             IO (Decode16, 0x378, 0x378, 0x00, 0x08)
    584             IO (Decode16, 0x402, 0x402, 0x00, 0x01)        // QEMU debug console, should use FixedPcdGet16 (PcdDebugIoPort)
    585             IO (Decode16, 0x440, 0x440, 0x00, 0x10)
    586             IO (Decode16, 0x678, 0x678, 0x00, 0x08)
    587             IO (Decode16, 0x778, 0x778, 0x00, 0x08)
    588             IO (Decode16, 0xafe0, 0xafe0, 0x00, 0x04)      // QEMU GPE0 BLK
    589             IO (Decode16, 0xb000, 0xb000, 0x00, 0x40)      // PMBLK1
    590             Memory32Fixed (ReadOnly, 0xFEC00000, 0x1000)   // IO APIC
    591             Memory32Fixed (ReadOnly, 0xFEE00000, 0x100000) // LAPIC
    592           })
    593         }
    594 
    595         //
    596         // PS/2 Keyboard and PC/AT Enhanced Keyboard 101/102
    597         //
    598         Device (PS2K) {
    599           Name (_HID, EISAID ("PNP0303"))
    600           Name (_CID, EISAID ("PNP030B"))
    601           Name(_CRS,ResourceTemplate() {
    602             IO (Decode16, 0x60, 0x60, 0x00, 0x01)
    603             IO (Decode16, 0x64, 0x64, 0x00, 0x01)
    604             IRQNoFlags () {1}
    605             //
    606             // list of IRQs occupied thus far: 9, 5, 10, 11, 2, 0, 8, 13, 1
    607             //
    608           })
    609         }
    610 
    611         //
    612         // PS/2 Mouse and Microsoft Mouse
    613         //
    614         Device (PS2M) {  // PS/2 stype mouse port
    615           Name (_HID, EISAID ("PNP0F03"))
    616           Name (_CID, EISAID ("PNP0F13"))
    617           Name (_CRS, ResourceTemplate() {
    618             IRQNoFlags () {12}
    619             //
    620             // list of IRQs occupied thus far:
    621             // 9, 5, 10, 11, 2, 0, 8, 13, 1, 12
    622             //
    623           })
    624         }
    625 
    626         //
    627         // UART Serial Port - COM1
    628         //
    629         Device (UAR1) {
    630           Name (_HID, EISAID ("PNP0501"))
    631           Name (_DDN, "COM1")
    632           Name (_UID, 0x01)
    633           Name(_CRS,ResourceTemplate() {
    634             IO (Decode16, 0x3F8, 0x3F8, 0x01, 0x08)
    635             IRQ (Edge, ActiveHigh, Exclusive, ) {4}
    636             //
    637             // list of IRQs occupied thus far:
    638             // 9, 5, 10, 11, 2, 0, 8, 13, 1, 12, 4
    639             //
    640           })
    641         }
    642 
    643         //
    644         // UART Serial Port - COM2
    645         //
    646         Device (UAR2) {
    647           Name (_HID, EISAID ("PNP0501"))
    648           Name (_DDN, "COM2")
    649           Name (_UID, 0x02)
    650           Name(_CRS,ResourceTemplate() {
    651             IO (Decode16, 0x2F8, 0x2F8, 0x01, 0x08)
    652             IRQ (Edge, ActiveHigh, Exclusive, ) {3}
    653             //
    654             // list of IRQs occupied thus far:
    655             // 9, 5, 10, 11, 2, 0, 8, 13, 1, 12, 4, 3
    656             //
    657           })
    658         }
    659 
    660         //
    661         // Floppy Disk Controller
    662         //
    663         Device (FDC) {
    664           Name (_HID, EISAID ("PNP0700"))
    665           Name (_CRS,ResourceTemplate() {
    666             IO (Decode16, 0x3F0, 0x3F0, 0x01, 0x06)
    667             IO (Decode16, 0x3F7, 0x3F7, 0x01, 0x01)
    668             IRQNoFlags () {6}
    669             //
    670             // list of IRQs occupied thus far:
    671             // 9, 5, 10, 11, 2, 0, 8, 13, 1, 12, 4, 3, 6
    672             //
    673             DMA (Compatibility, NotBusMaster, Transfer8) {2}
    674           })
    675         }
    676 
    677         //
    678         // parallel port -- no DMA for now
    679         //
    680         Device (PAR1) {
    681           Name (_HID, EISAID ("PNP0400"))
    682           Name (_DDN, "LPT1")
    683           Name (_UID, 0x01)
    684           Name(_CRS, ResourceTemplate() {
    685             IO (Decode16, 0x0378, 0x0378, 0x00, 0x08)
    686             IRQNoFlags () {7}
    687             //
    688             // list of IRQs occupied thus far:
    689             // 9, 5, 10, 11, 2, 0, 8, 13, 1, 12, 4, 3, 6, 7
    690             // in order:
    691             // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
    692             //
    693           })
    694         }
    695       }
    696     }
    697   }
    698 }
    699