Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / board-js2x / slof / pci-interrupts.fs
1 \ *****************************************************************************
2 \ * Copyright (c) 2004, 2008 IBM Corporation
3 \ * All rights reserved.
4 \ * This program and the accompanying materials
5 \ * are made available under the terms of the BSD License
6 \ * which accompanies this distribution, and is available at
7 \ * http://www.opensource.org/licenses/bsd-license.php
8 \ *
9 \ * Contributors:
10 \ *     IBM Corporation - initial implementation
11 \ ****************************************************************************/
12
13 \ define function pointer as forward declaration for get-interrupt-line
14 \ this is board wireing and southbridge dependent
15 \ returns the wired interrupt line for this config addr
16 \ ( config-addr -- irq-line )
17 DEFER pci-get-irq-line
18
19 \ define function pointer as forward declaration for get-interrupt-sense-type
20 \ this is board wireing and southbridge dependent
21 \ returns the wired interrupt sense type for this config addr
22 \ 0 - Edge rising
23 \ 1 - Level low
24 \ 2 - Level high
25 \ 3 - Edge falling
26 \ ( config-addr -- irq-sense )
27 DEFER pci-get-irq-sense
28
29
30 \ *****************************************************************************
31 \ Generic IRQ routines
32 \ *****************************************************************************
33
34
35
36 : unknown-slot ( -- 0 )
37 \       cr pci-vec ABORT" Unknown slot "
38         0
39 ;
40 \ 0c s" /ht/@1/@2"    PCI-X INTA & INTC Pnpirq0 -> irq12
41 \ 0e s" /ht/@1/@2"    PCI-X INTB & INTD Pnpirq1 -> irq14
42 \ 10 s" /ht/@8,1"     ATA         
43 \ 0f s" /ht/@1/@1"    Obsidian     Pnpirq2 -> irq15
44 \ 10 s" /ht/@7/@2"    Video / Exar Serial  PirqA
45 \ 11 s" /ht/@2/@4"    Ethernet     PirqB
46 \ 12 s" /ht/@2/@4,1"  Ethernet     PirqC
47 \ 13 s" /ht/@7/@0"    USB          PirqD
48 \ 13 s" /ht/@7/@0,1"  USB          PirqD
49 \ 13 s" /ht/@7/@0,2"  USB          PirqD
50
51 \ 14 s" /ht/@3/@0"    PCIe gpio28
52 \ 15 s" /ht/@4/@0"    PCIe gpio29
53 \ 16 s" /ht/@5/@0"    PCIe gpio30
54 \ 17 s" /ht/@6/@0"    PCIe gpio31
55
56
57 \ -----------------------------------------------------------------------------
58 \ Get the interrupt pin for a device on ht u4
59 : u4-get-irq-line ( config-addr -- irq-line )
60 \       cr s" u4-get-irq-line " type
61         pci-device-vec c@ CASE 
62                 1 OF pci-device-vec-len 1 >= IF  
63                                 pci-device-vec 1+ c@ CASE 
64                                         1 OF f ENDOF
65                                         2 OF dup pci-interrupt@ CASE
66                                                         1 OF c ENDOF
67                                                         3 OF e ENDOF
68                                                         2 OF c ENDOF
69                                                         4 OF e ENDOF
70                                                 ENDCASE
71                                         ENDOF 
72                                         dup OF unknown-slot  ENDOF
73                                 ENDCASE
74                         ELSE
75                                 unknown-slot
76                         THEN
77                 ENDOF
78                 2 OF pci-device-vec-len 1 >= IF  
79                                  pci-device-vec 1+ c@ CASE
80                                         4 OF dup pci-addr2fn 1 >= IF 12 ELSE 11 THEN  ENDOF 
81                                         dup OF unknown-slot  ENDOF
82                                 ENDCASE
83                         ELSE
84                                 unknown-slot
85                         THEN
86                 ENDOF
87                 3 OF 14 ENDOF
88                 4 OF 15 ENDOF
89                 5 OF 16 ENDOF
90                 6 OF 17 ENDOF
91                 7 OF pci-device-vec-len 1 >= IF  
92                                 pci-device-vec 1+ c@ CASE 
93                                         0 OF 13  ENDOF 
94                                         2 OF 10  ENDOF 
95                                         dup OF unknown-slot  ENDOF
96                                 ENDCASE
97                         ELSE
98                                 unknown-slot
99                         THEN
100                 ENDOF
101                 8 OF 10 ENDOF
102                 dup OF unknown-slot  ENDOF      
103         ENDCASE
104         swap drop
105 ;
106
107 \ -----------------------------------------------------------------------------
108 \ Get the interrupt sense type for a device on ht u4
109 : u4-get-irq-sense ( config-addr -- irq-sense )
110 \       cr s" u4-get-irq-sense " type
111         u4-get-irq-line CASE 
112         0c OF 00 ENDOF
113         0e OF 00 ENDOF
114         dup OF 01  ENDOF
115         ENDCASE
116 ;
117
118 \ 10 s" /ht/@4,1"    set-pci-interrupt \ ATA
119 \ 13 s" /ht/@3/@0"   set-pci-interrupt \ USB
120 \ 13 s" /ht/@3/@0,1" set-pci-interrupt \ USB
121 \ 13 s" /ht/@3/@0,2" set-pci-interrupt \ USB
122 \ 1c s" /ht/@2/@1"   set-pci-interrupt \ Ethernet
123 \ 1d s" /ht/@2/@1,1" set-pci-interrupt \ Ethernet
124
125 \ -----------------------------------------------------------------------------
126 \ Get the interrupt pin for a device on ht u3
127 : u3-get-irq-line ( config-addr -- irq-line )
128 \       cr s" u3-get-irq-line " type
129         pci-device-vec c@ CASE 
130                 2 OF pci-device-vec-len 1 >= IF  
131                                 pci-device-vec 1+ c@ CASE 
132                                         1 OF dup pci-addr2fn 1 >= IF 1d ELSE 1c THEN  ENDOF 
133                                         dup OF unknown-slot  ENDOF
134                                 ENDCASE
135                         ELSE
136                                 unknown-slot
137                         THEN
138                 ENDOF
139                 3 OF 13 ENDOF
140                 4 OF 10 ENDOF
141                 dup OF unknown-slot  ENDOF      
142         ENDCASE
143         swap drop
144 ;
145
146 \ -----------------------------------------------------------------------------
147 \ Get the interrupt sense type for a device on ht u3
148 : u3-get-irq-sense ( config-addr -- irq-sense )
149 \       cr s" u3-get-irq-sense " type
150         u3-get-irq-line CASE 
151         dup OF 01  ENDOF
152         ENDCASE
153 ;
154
155
156
157 \ -----------------------------------------------------------------------------
158 \ Get the interrupt pin for a device on attu
159 : pcie-get-irq-line ( config-addr -- irq-line )
160 \       cr s" pcie-get-irq-line " type
161         drop
162         3
163 ;
164
165
166 \ -----------------------------------------------------------------------------
167 \ Get the interrupt sense type for a device on attu
168 : pcie-get-irq-sense ( config-addr -- irq-sense )
169 \       cr s" pcie-get-irq-sense " type
170        drop
171         01
172 ;
173
174 \ -----------------------------------------------------------------------------
175 \ Set up the special routines for HT irq handling
176 : ht-irq-init ( -- )
177 \       cr s" ht-irq-init " type
178         u4? IF
179                 ['] u4-get-irq-line TO pci-get-irq-line
180                 ['] u4-get-irq-sense TO pci-get-irq-sense
181         ELSE
182                 ['] u3-get-irq-line TO pci-get-irq-line
183                 ['] u3-get-irq-sense TO pci-get-irq-sense
184         THEN
185 ;
186
187 \ -----------------------------------------------------------------------------
188 \ Set up the special routines for PCI-e irq handling
189 : pcie-irq-init ( -- )
190 \       cr s" pcie-irq-init " type
191         ['] pcie-get-irq-sense TO pci-get-irq-sense
192         ['] pcie-get-irq-line TO pci-get-irq-line
193 ;
194
195 \ -----------------------------------------------------------------------------
196 \ Set up the special routines for irq handling
197 0 VALUE mpic
198 : pci-irq-init ( mpic puid -- mpic )
199         over TO mpic
200         18 rshift FF and
201         CASE
202                 F1 OF pcie-irq-init ENDOF
203                 F2 OF ht-irq-init ENDOF
204                 dup OF ABORT" Wrong PUID! in pci-irq-init" ENDOF
205         ENDCASE
206 ;
207
208 \ -----------------------------------------------------------------------------
209 \ Set the interrupt pin for a device
210 : pci-set-irq-line ( config-addr -- )
211 \       cr pci-vec
212         dup pci-get-irq-line 
213 \       ." ->" dup .
214         swap pci-irq-line!
215 ;
216
217 \ -----------------------------------------------------------------------------
218 \ Add an irq entry for the device at config-addr into the irq map
219 \ each entry consists of 7 integer values
220 \ Structure of an entry:
221 \             +----------+---+---+------------+--------------+---------+---------------+
222 \  Number#    |    0     | 1 | 2 |     3      |      4       |    5    |      6        |
223 \             +----------+---+---+------------+--------------+---------+---------------+
224 \  meaning    |  config  |   |   |      int#  |  phandle     | intr nr | pos edge (0)  |
225 \             |   addr   |   |   | (1=a, 2=b, |  intr contr  |         | act ll   (1)  |
226 \             +----------+---+---+------------+--------------+---------+---------------+
227 \  value      | pci slot | 0 | 0 |    1       |        mpic  |     7   |     0|1       |
228 \             +----------+---+---+------------+--------------+---------+---------------+
229 : pci-gen-irq-entry ( prop-addr prop-len config-addr -- prop-addr prop-len )
230         dup >r encode-int+ 0    encode-64+      \ config addr
231         r@ pci-interrupt@       encode-int+     \ interrupt type
232         mpic                    encode-int+     \ phandle to MPIC
233         r@ pci-irq-line@        encode-int+     \ interrupt number
234         r> pci-get-irq-sense    encode-int+     \ trigger type
235 ;