|
|
1.1 root 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: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.