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
15DefinitionBlock ("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