PCI irq mapping fix
[qemu] / hw / acpi-dsdt.dsl
1 /*
2  * QEMU ACPI DSDT ASL definition
3  * 
4  * Copyright (c) 2006 Fabrice Bellard
5  * 
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License version 2 as published by the Free Software Foundation.
9  *
10  * This library 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 GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19 DefinitionBlock (
20     "acpi-dsdt.aml",    // Output Filename
21     "DSDT",             // Signature
22     0x01,               // DSDT Compliance Revision
23     "QEMU",             // OEMID
24     "QEMUDSDT",         // TABLE ID
25     0x1                 // OEM Revision
26     )
27 {
28     Scope (\)
29     {
30         /* CMOS memory access */
31         OperationRegion (CMS, SystemIO, 0x70, 0x02)
32         Field (CMS, ByteAcc, NoLock, Preserve)
33         {
34             CMSI,   8, 
35             CMSD,   8
36         }
37         Method (CMRD, 1, NotSerialized)
38         {
39             Store (Arg0, CMSI)
40             Store (CMSD, Local0)
41             Return (Local0)
42         }
43
44         /* Debug Output */
45         OperationRegion (DBG, SystemIO, 0xb044, 0x04)
46         Field (DBG, DWordAcc, NoLock, Preserve)
47         {
48             DBGL,   32, 
49         }
50     }
51
52
53     /* PCI Bus definition */
54     Scope(\_SB) {
55         Device(PCI0) {
56             Name (_HID, EisaId ("PNP0A03"))
57             Name (_ADR, 0x00)
58             Name (_UID, 1)
59             Name(_PRT, Package() {
60                 /* PCI IRQ routing table, example from ACPI 2.0a specification,
61                    section 6.2.8.1 */
62                 /* Note: we provide the same info as the PCI routing
63                    table of the Bochs BIOS */
64                    
65                 // PCI Slot 0
66                 Package() {0x0000ffff, 0, LNKD, 0}, 
67                 Package() {0x0000ffff, 1, LNKA, 0}, 
68                 Package() {0x0000ffff, 2, LNKB, 0}, 
69                 Package() {0x0000ffff, 3, LNKC, 0}, 
70
71                 // PCI Slot 1
72                 Package() {0x0001ffff, 0, LNKA, 0}, 
73                 Package() {0x0001ffff, 1, LNKB, 0}, 
74                 Package() {0x0001ffff, 2, LNKC, 0}, 
75                 Package() {0x0001ffff, 3, LNKD, 0}, 
76                 
77                 // PCI Slot 2
78                 Package() {0x0002ffff, 0, LNKB, 0}, 
79                 Package() {0x0002ffff, 1, LNKC, 0}, 
80                 Package() {0x0002ffff, 2, LNKD, 0}, 
81                 Package() {0x0002ffff, 3, LNKA, 0}, 
82
83                 // PCI Slot 3
84                 Package() {0x0003ffff, 0, LNKC, 0}, 
85                 Package() {0x0003ffff, 1, LNKD, 0}, 
86                 Package() {0x0003ffff, 2, LNKA, 0}, 
87                 Package() {0x0003ffff, 3, LNKB, 0}, 
88
89                 // PCI Slot 4
90                 Package() {0x0004ffff, 0, LNKD, 0}, 
91                 Package() {0x0004ffff, 1, LNKA, 0}, 
92                 Package() {0x0004ffff, 2, LNKB, 0}, 
93                 Package() {0x0004ffff, 3, LNKC, 0}, 
94
95                 // PCI Slot 5
96                 Package() {0x0005ffff, 0, LNKA, 0}, 
97                 Package() {0x0005ffff, 1, LNKB, 0}, 
98                 Package() {0x0005ffff, 2, LNKC, 0}, 
99                 Package() {0x0005ffff, 3, LNKD, 0}, 
100             })
101
102             Method (_CRS, 0, NotSerialized)
103             {
104             Name (MEMP, ResourceTemplate ()
105             {
106                 WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
107                     0x0000,             // Address Space Granularity
108                     0x0000,             // Address Range Minimum
109                     0x00FF,             // Address Range Maximum
110                     0x0000,             // Address Translation Offset
111                     0x0100,             // Address Length
112                     ,, )
113                 IO (Decode16,
114                     0x0CF8,             // Address Range Minimum
115                     0x0CF8,             // Address Range Maximum
116                     0x01,               // Address Alignment
117                     0x08,               // Address Length
118                     )
119                 WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
120                     0x0000,             // Address Space Granularity
121                     0x0000,             // Address Range Minimum
122                     0x0CF7,             // Address Range Maximum
123                     0x0000,             // Address Translation Offset
124                     0x0CF8,             // Address Length
125                     ,, , TypeStatic)
126                 WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
127                     0x0000,             // Address Space Granularity
128                     0x0D00,             // Address Range Minimum
129                     0xFFFF,             // Address Range Maximum
130                     0x0000,             // Address Translation Offset
131                     0xF300,             // Address Length
132                     ,, , TypeStatic)
133                 DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
134                     0x00000000,         // Address Space Granularity
135                     0x000A0000,         // Address Range Minimum
136                     0x000BFFFF,         // Address Range Maximum
137                     0x00000000,         // Address Translation Offset
138                     0x00020000,         // Address Length
139                     ,, , AddressRangeMemory, TypeStatic)
140                 DWordMemory (ResourceProducer, PosDecode, MinNotFixed, MaxFixed, NonCacheable, ReadWrite,
141                     0x00000000,         // Address Space Granularity
142                     0x00000000,         // Address Range Minimum
143                     0xFEBFFFFF,         // Address Range Maximum
144                     0x00000000,         // Address Translation Offset
145                     0x00000000,         // Address Length
146                     ,, MEMF, AddressRangeMemory, TypeStatic)
147             })
148                 CreateDWordField (MEMP, \_SB.PCI0._CRS.MEMF._MIN, PMIN)
149                 CreateDWordField (MEMP, \_SB.PCI0._CRS.MEMF._MAX, PMAX)
150                 CreateDWordField (MEMP, \_SB.PCI0._CRS.MEMF._LEN, PLEN)
151                 /* compute available RAM */
152                 Add(CMRD(0x34), ShiftLeft(CMRD(0x35), 8), Local0)
153                 ShiftLeft(Local0, 16, Local0)
154                 Add(Local0, 0x1000000, Local0)
155                 /* update field of last region */
156                 Store(Local0, PMIN)
157                 Subtract (PMAX, PMIN, PLEN)
158                 Increment (PLEN)
159                 Return (MEMP)
160             }
161         }
162     }
163
164     /* PIIX3 ISA bridge */
165     Scope(\_SB.PCI0) {
166         Device (ISA) {
167             Name (_ADR, 0x00010000)
168         
169             /* PIIX PCI to ISA irq remapping */
170             OperationRegion (P40C, PCI_Config, 0x60, 0x04)
171
172
173             /* Keyboard seems to be important for WinXP install */
174             Device (KBD)
175             {
176                 Name (_HID, EisaId ("PNP0303"))
177                 Method (_STA, 0, NotSerialized)
178                 {
179                     Return (0x0f)
180                 }
181
182                 Method (_CRS, 0, NotSerialized)
183                 {
184                      Name (TMP, ResourceTemplate ()
185                      {
186                     IO (Decode16,
187                         0x0060,             // Address Range Minimum
188                         0x0060,             // Address Range Maximum
189                         0x01,               // Address Alignment
190                         0x01,               // Address Length
191                         )
192                     IO (Decode16,
193                         0x0064,             // Address Range Minimum
194                         0x0064,             // Address Range Maximum
195                         0x01,               // Address Alignment
196                         0x01,               // Address Length
197                         )
198                     IRQNoFlags ()
199                         {1}
200                     })
201                     Return (TMP)
202                 }
203             }
204
205             Device (MOU) 
206             {
207                 Name (_HID, EisaId ("PNP0F13"))
208                 Method (_STA, 0, NotSerialized)
209                 {
210                     Return (0x0f)
211                 }
212
213                 Method (_CRS, 0, NotSerialized)
214                 {
215                     Name (TMP, ResourceTemplate ()
216                     {
217                          IRQNoFlags () {12}
218                     })
219                     Return (TMP)
220                 }
221             }
222         }
223     }
224
225     /* PCI IRQs */
226     Scope(\_SB) {
227          Field (\_SB.PCI0.ISA.P40C, ByteAcc, NoLock, Preserve)
228          {
229              PRQ0,   8, 
230              PRQ1,   8, 
231              PRQ2,   8, 
232              PRQ3,   8
233          }
234
235         Device(LNKA){
236                 Name(_HID, EISAID("PNP0C0F"))     // PCI interrupt link
237                 Name(_UID, 1)
238                 Name(_PRS, ResourceTemplate(){
239                     IRQ (Level, ActiveLow, Shared)
240                         {3,4,5,6,7,9,10,11,12}
241                 })
242                 Method (_STA, 0, NotSerialized)
243                 {
244                     Store (0x0B, Local0)
245                     If (And (0x80, PRQ0, Local1))
246                     {
247                          Store (0x09, Local0)
248                     }
249                     Return (Local0)
250                 }
251                 Method (_DIS, 0, NotSerialized)
252                 {
253                     Or (PRQ0, 0x80, PRQ0)
254                 }
255                 Method (_CRS, 0, NotSerialized)
256                 {
257                     Name (PRR0, ResourceTemplate ()
258                     {
259                         IRQ (Level, ActiveLow, Shared)
260                             {1}
261                     })
262                     CreateWordField (PRR0, 0x01, TMP)
263                     Store (PRQ0, Local0)
264                     If (LLess (Local0, 0x80))
265                     {
266                         ShiftLeft (One, Local0, TMP)
267                     }
268                     Else
269                     {
270                         Store (Zero, TMP)
271                     }
272                     Return (PRR0)
273                 }
274                 Method (_SRS, 1, NotSerialized)
275                 {
276                     CreateWordField (Arg0, 0x01, TMP)
277                     FindSetRightBit (TMP, Local0)
278                     Decrement (Local0)
279                     Store (Local0, PRQ0)
280                 }
281         }
282         Device(LNKB){
283                 Name(_HID, EISAID("PNP0C0F"))     // PCI interrupt link
284                 Name(_UID, 2)
285                 Name(_PRS, ResourceTemplate(){
286                     IRQ (Level, ActiveLow, Shared)
287                         {3,4,5,6,7,9,10,11,12}
288                 })
289                 Method (_STA, 0, NotSerialized)
290                 {
291                     Store (0x0B, Local0)
292                     If (And (0x80, PRQ1, Local1))
293                     {
294                          Store (0x09, Local0)
295                     }
296                     Return (Local0)
297                 }
298                 Method (_DIS, 0, NotSerialized)
299                 {
300                     Or (PRQ1, 0x80, PRQ1)
301                 }
302                 Method (_CRS, 0, NotSerialized)
303                 {
304                     Name (PRR0, ResourceTemplate ()
305                     {
306                         IRQ (Level, ActiveLow, Shared)
307                             {1}
308                     })
309                     CreateWordField (PRR0, 0x01, TMP)
310                     Store (PRQ1, Local0)
311                     If (LLess (Local0, 0x80))
312                     {
313                         ShiftLeft (One, Local0, TMP)
314                     }
315                     Else
316                     {
317                         Store (Zero, TMP)
318                     }
319                     Return (PRR0)
320                 }
321                 Method (_SRS, 1, NotSerialized)
322                 {
323                     CreateWordField (Arg0, 0x01, TMP)
324                     FindSetRightBit (TMP, Local0)
325                     Decrement (Local0)
326                     Store (Local0, PRQ1)
327                 }
328         }
329         Device(LNKC){
330                 Name(_HID, EISAID("PNP0C0F"))     // PCI interrupt link
331                 Name(_UID, 3)
332                 Name(_PRS, ResourceTemplate(){
333                     IRQ (Level, ActiveLow, Shared)
334                         {3,4,5,6,7,9,10,11,12}
335                 })
336                 Method (_STA, 0, NotSerialized)
337                 {
338                     Store (0x0B, Local0)
339                     If (And (0x80, PRQ2, Local1))
340                     {
341                          Store (0x09, Local0)
342                     }
343                     Return (Local0)
344                 }
345                 Method (_DIS, 0, NotSerialized)
346                 {
347                     Or (PRQ2, 0x80, PRQ2)
348                 }
349                 Method (_CRS, 0, NotSerialized)
350                 {
351                     Name (PRR0, ResourceTemplate ()
352                     {
353                         IRQ (Level, ActiveLow, Shared)
354                             {1}
355                     })
356                     CreateWordField (PRR0, 0x01, TMP)
357                     Store (PRQ2, Local0)
358                     If (LLess (Local0, 0x80))
359                     {
360                         ShiftLeft (One, Local0, TMP)
361                     }
362                     Else
363                     {
364                         Store (Zero, TMP)
365                     }
366                     Return (PRR0)
367                 }
368                 Method (_SRS, 1, NotSerialized)
369                 {
370                     CreateWordField (Arg0, 0x01, TMP)
371                     FindSetRightBit (TMP, Local0)
372                     Decrement (Local0)
373                     Store (Local0, PRQ2)
374                 }
375         }
376         Device(LNKD){
377                 Name(_HID, EISAID("PNP0C0F"))     // PCI interrupt link
378                 Name(_UID, 4)
379                 Name(_PRS, ResourceTemplate(){
380                     IRQ (Level, ActiveLow, Shared)
381                         {3,4,5,6,7,9,10,11,12}
382                 })
383                 Method (_STA, 0, NotSerialized)
384                 {
385                     Store (0x0B, Local0)
386                     If (And (0x80, PRQ3, Local1))
387                     {
388                          Store (0x09, Local0)
389                     }
390                     Return (Local0)
391                 }
392                 Method (_DIS, 0, NotSerialized)
393                 {
394                     Or (PRQ3, 0x80, PRQ3)
395                 }
396                 Method (_CRS, 0, NotSerialized)
397                 {
398                     Name (PRR0, ResourceTemplate ()
399                     {
400                         IRQ (Level, ActiveLow, Shared)
401                             {1}
402                     })
403                     CreateWordField (PRR0, 0x01, TMP)
404                     Store (PRQ3, Local0)
405                     If (LLess (Local0, 0x80))
406                     {
407                         ShiftLeft (One, Local0, TMP)
408                     }
409                     Else
410                     {
411                         Store (Zero, TMP)
412                     }
413                     Return (PRR0)
414                 }
415                 Method (_SRS, 1, NotSerialized)
416                 {
417                     CreateWordField (Arg0, 0x01, TMP)
418                     FindSetRightBit (TMP, Local0)
419                     Decrement (Local0)
420                     Store (Local0, PRQ3)
421                 }
422         }
423     }
424
425     /* S5 = power off state */
426     Name (_S5, Package (4) {
427         0x00, // PM1a_CNT.SLP_TYP 
428         0x00, // PM2a_CNT.SLP_TYP 
429         0x00, // reserved
430         0x00, // reserved
431     })
432 }