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
\ U4 "Attu" PCIe root complex.
15
\ See the PCI OF binding document.
19
s" pciex" device-name s" pci" device-type
20
s" U4-pcie" compatible
21
s" U4" encode-string s" model" property
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
28
3 encode-int s" #address-cells" property
29
2 encode-int s" #size-cells" property
31
s" /mpic" find-node encode-int s" interrupt-parent" property
32
\ XXX should have interrupt map, etc. this works for now though.
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 ;
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@ ;
48
: config-dump ( addr size -- ) ['] config-l@ 4 (dump) ;
50
\ 16MB of configuration space
51
f1000000 encode-64 1000000 encode-64+ s" reg" property
54
01000000 encode-int 00000000 encode-int+ 00000000 encode-int+
55
00000000 encode-int+ f0000000 encode-int+
56
00000000 encode-int+ 00400000 encode-int+
58
\ 1.75GB of memory space @ c0000000.
59
02000000 encode-int+ c0000000 encode-64+
60
c0000000 encode-64+ 30000000 encode-64+ s" ranges" property
62
\ Host bridge, so full bus range.
63
f0 encode-int ff encode-int+ s" bus-range" property
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
73
ff F0 f0000000 e8000000 e8000000 c0000000 100000000 f000
74
my-puid probe-pci-host-bridge
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
85
: (set-ps) ( ps addr -- )
86
8 + >r 5 lshift r@ config-w@ ff1f and or r> config-w! ;
89
10000 0 DO i 8 lshift dup find-pcie-cap ?dup IF
90
+ 2dup (set-ps) THEN drop LOOP drop ;
92
: (set-rr) ( rr addr -- )
93
8 + >r c lshift r@ config-w@ 8fff and or r> config-w! ;
96
10000 0 DO i 8 lshift dup find-pcie-cap ?dup IF
97
+ 2dup (set-rr) THEN drop LOOP drop ;