|
|
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: \ U4 "Attu" PCIe root complex.
14:
15: \ See the PCI OF binding document.
16:
17: new-device
18:
19: s" pciex" device-name s" pci" device-type
20: s" U4-pcie" compatible
21: s" U4" encode-string s" model" property
22:
23: \ spare out 0xc0000000-0xefffffff for pcie
24: f8070200 rl@ fffffff0 and f8070200 rl!
25: \ enable io memory for pcie @ c0000000-efffffff
26: 70000003 f80903f0 rl!-le
27:
28: 3 encode-int s" #address-cells" property
29: 2 encode-int s" #size-cells" property
30:
31: s" /mpic" find-node encode-int s" interrupt-parent" property
32: \ XXX should have interrupt map, etc. this works for now though.
33:
34: : decode-unit 2 hex-decode-unit 3 #join 8 lshift 0 0 rot F00000 + ;
35: : encode-unit nip nip ff00 and 8 rshift 3 #split
36: over IF 2 ELSE nip 1 THEN hex-encode-unit ;
37:
38: f1000000 CONSTANT my-puid
39: \ Configuration space accesses.
40: : >config f1000000 + ;
41: : config-l! >config rl!-le ;
42: : config-l@ >config rl@-le ;
43: : config-w! >config rw!-le ;
44: : config-w@ >config rw@-le ;
45: : config-b! >config rb! ;
46: : config-b@ >config rb@ ;
47:
48: : config-dump ( addr size -- ) ['] config-l@ 4 (dump) ;
49:
50: \ 16MB of configuration space
51: f1000000 encode-64 1000000 encode-64+ s" reg" property
52:
53: \ 4MB of I/O space.
54: 01000000 encode-int 00000000 encode-int+ 00000000 encode-int+
55: 00000000 encode-int+ f0000000 encode-int+
56: 00000000 encode-int+ 00400000 encode-int+
57:
58: \ 1.75GB of memory space @ c0000000.
59: 02000000 encode-int+ c0000000 encode-64+
60: c0000000 encode-64+ 30000000 encode-64+ s" ranges" property
61:
62: \ Host bridge, so full bus range.
63: f0 encode-int ff encode-int+ s" bus-range" property
64:
65: : open true ;
66: : close ;
67:
68: \ : probe-pci-host-bridge ( bus-max bus-min mmio-max mmio-base mem-max mem-base io-max io-base my-puid -- )
69: s" /mpic" find-node my-puid pci-irq-init drop
70:
71: 00fff1f0 18 config-l!
72:
73: ff F0 f0000000 e8000000 e8000000 c0000000 100000000 f000
74: my-puid probe-pci-host-bridge
75:
76: \ \ PCIe debug / fixup
77: : find-pcie-cap ( devfn -- offset | 0 )
78: >r 34 BEGIN r@ + config-b@ dup ff <> over and WHILE
79: dup r@ + config-b@ 10 = IF
80: r> drop EXIT
81: THEN 1+
82: REPEAT r> 2drop 0
83: ;
84:
85: : (set-ps) ( ps addr -- )
86: 8 + >r 5 lshift r@ config-w@ ff1f and or r> config-w! ;
87: : set-ps ( ps -- )
88: log2 7 -
89: 10000 0 DO i 8 lshift dup find-pcie-cap ?dup IF
90: + 2dup (set-ps) THEN drop LOOP drop ;
91:
92: : (set-rr) ( rr addr -- )
93: 8 + >r c lshift r@ config-w@ 8fff and or r> config-w! ;
94: : set-rr ( rr -- )
95: log2 7 -
96: 10000 0 DO i 8 lshift dup find-pcie-cap ?dup IF
97: + 2dup (set-rr) THEN drop LOOP drop ;
98:
99: 80 set-ps 80 set-rr
100:
101: finish-device
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.