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
10 \ * IBM Corporation - initial implementation
11 \ ****************************************************************************/
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
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
26 \ ( config-addr -- irq-sense )
27 DEFER pci-get-irq-sense
30 \ *****************************************************************************
31 \ Generic IRQ routines
32 \ *****************************************************************************
36 : unknown-slot ( -- 0 )
37 \ cr pci-vec ABORT" Unknown slot "
40 \ 0c s" /ht/@1/@2" PCI-X INTA & INTC Pnpirq0 -> irq12
41 \ 0e s" /ht/@1/@2" PCI-X INTB & INTD Pnpirq1 -> irq14
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
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
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
65 2 OF dup pci-interrupt@ CASE
72 dup OF unknown-slot 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
91 7 OF pci-device-vec-len 1 >= IF
92 pci-device-vec 1+ c@ CASE
95 dup OF unknown-slot ENDOF
102 dup OF unknown-slot ENDOF
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
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
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
141 dup OF unknown-slot ENDOF
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
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
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
174 \ -----------------------------------------------------------------------------
175 \ Set up the special routines for HT irq handling
177 \ cr s" ht-irq-init " type
179 ['] u4-get-irq-line TO pci-get-irq-line
180 ['] u4-get-irq-sense TO pci-get-irq-sense
182 ['] u3-get-irq-line TO pci-get-irq-line
183 ['] u3-get-irq-sense TO pci-get-irq-sense
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
195 \ -----------------------------------------------------------------------------
196 \ Set up the special routines for irq handling
198 : pci-irq-init ( mpic puid -- mpic )
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
208 \ -----------------------------------------------------------------------------
209 \ Set the interrupt pin for a device
210 : pci-set-irq-line ( config-addr -- )
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