1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <config.h>
25#include <common.h>
26#include <asm/io.h>
27#include <pci.h>
28
29#include "hardware.h"
30#include "pcippc2.h"
31
32struct pci_controller local_hose, cpci_hose;
33
34static u32 cpc710_mapped_ram;
35
36
37
38void cpc710_pci_enable_timeout (void)
39{
40 out32(BRIDGE(LOCAL, CFGADDR), 0x50000080);
41 iobarrier_rw();
42 out32(BRIDGE(LOCAL, CFGDATA), 0x32000000);
43 iobarrier_rw();
44
45 out32(BRIDGE(CPCI, CFGADDR), 0x50000180);
46 iobarrier_rw();
47 out32(BRIDGE(CPCI, CFGDATA), 0x32000000);
48 iobarrier_rw();
49}
50
51void cpc710_pci_init (void)
52{
53 u32 sdram_size = pcippc2_sdram_size();
54
55 cpc710_mapped_ram = sdram_size < PCI_MEMORY_MAXSIZE ?
56 sdram_size : PCI_MEMORY_MAXSIZE;
57
58
59
60 out32(REG(CPC0, PCICNFR), 0x80000002);
61 iobarrier_rw();
62
63 out32(REG(CPC0, PCIBAR), BRIDGE_LOCAL_PHYS);
64 iobarrier_rw();
65
66
67
68 out32(REG(CPC0, PCIENB), 0x80000000);
69 iobarrier_rw();
70
71
72
73 out32(REG(CPC0, PCICNFR), 0x80000003);
74 iobarrier_rw();
75
76 out32(REG(CPC0, PCIBAR), BRIDGE_CPCI_PHYS);
77 iobarrier_rw();
78
79
80
81 out32(REG(CPC0, PCIENB), 0x80000000);
82 iobarrier_rw();
83
84
85
86 out32(REG(CPC0, PCICNFR), 0x80000000);
87 iobarrier_rw();
88
89
90
91 out32(BRIDGE(LOCAL, CRR), 0x7c000000);
92 iobarrier_rw();
93 out32(BRIDGE(LOCAL, PCIDG), 0x40000000);
94 iobarrier_rw();
95 out32(BRIDGE(LOCAL, PIBAR), BRIDGE_LOCAL_IO_BUS);
96 out32(BRIDGE(LOCAL, SIBAR), BRIDGE_LOCAL_IO_PHYS);
97 out32(BRIDGE(LOCAL, IOSIZE), -BRIDGE_LOCAL_IO_SIZE);
98 iobarrier_rw();
99 out32(BRIDGE(LOCAL, PMBAR), BRIDGE_LOCAL_MEM_BUS);
100 out32(BRIDGE(LOCAL, SMBAR), BRIDGE_LOCAL_MEM_PHYS);
101 out32(BRIDGE(LOCAL, MSIZE), -BRIDGE_LOCAL_MEM_SIZE);
102 iobarrier_rw();
103 out32(BRIDGE(LOCAL, PR), 0x00ffe000);
104 iobarrier_rw();
105 out32(BRIDGE(LOCAL, ACR), 0xfe000000);
106 iobarrier_rw();
107 out32(BRIDGE(LOCAL, PSBAR), PCI_MEMORY_BUS >> 24);
108 out32(BRIDGE(LOCAL, BARPS), PCI_MEMORY_PHYS >> 24);
109 out32(BRIDGE(LOCAL, PSSIZE), 256 - (cpc710_mapped_ram >> 24));
110 iobarrier_rw();
111
112
113
114 out32(BRIDGE(CPCI, CRR), 0x7c000000);
115 iobarrier_rw();
116 out32(BRIDGE(CPCI, PCIDG), 0xC0000000);
117 iobarrier_rw();
118 out32(BRIDGE(CPCI, PIBAR), BRIDGE_CPCI_IO_BUS);
119 out32(BRIDGE(CPCI, SIBAR), BRIDGE_CPCI_IO_PHYS);
120 out32(BRIDGE(CPCI, IOSIZE), -BRIDGE_CPCI_IO_SIZE);
121 iobarrier_rw();
122 out32(BRIDGE(CPCI, PMBAR), BRIDGE_CPCI_MEM_BUS);
123 out32(BRIDGE(CPCI, SMBAR), BRIDGE_CPCI_MEM_PHYS);
124 out32(BRIDGE(CPCI, MSIZE), -BRIDGE_CPCI_MEM_SIZE);
125 iobarrier_rw();
126 out32(BRIDGE(CPCI, PR), 0x80ffe000);
127 iobarrier_rw();
128 out32(BRIDGE(CPCI, ACR), 0xdf000000);
129 iobarrier_rw();
130 out32(BRIDGE(CPCI, PSBAR), PCI_MEMORY_BUS >> 24);
131 out32(BRIDGE(CPCI, BARPS), PCI_MEMORY_PHYS >> 24);
132 out32(BRIDGE(CPCI, PSSIZE), 256 - (cpc710_mapped_ram >> 24));
133 iobarrier_rw();
134
135
136
137
138 out32(BRIDGE(LOCAL, CFGADDR), 0x04000080);
139 iobarrier_rw();
140 out32(BRIDGE(LOCAL, CFGDATA), 0x56010000);
141 iobarrier_rw();
142
143 out32(BRIDGE(LOCAL, CFGADDR), 0x0c000080);
144 iobarrier_rw();
145 out32(BRIDGE(LOCAL, CFGDATA), PCI_LATENCY_TIMER_VAL << 16);
146 iobarrier_rw();
147
148
149
150 out32(BRIDGE(LOCAL, CFGADDR), 0x40000080);
151 iobarrier_rw();
152 out32(BRIDGE(LOCAL, CFGDATA), 0x00000000);
153 iobarrier_rw();
154
155 out32(BRIDGE(LOCAL, CFGADDR), 0x50000080);
156 iobarrier_rw();
157
158
159 out32(BRIDGE(LOCAL, CFGDATA), 0x00000000);
160 iobarrier_rw();
161
162
163
164
165
166
167 out32(BRIDGE(CPCI, CFGADDR), 0x40000080);
168 iobarrier_rw();
169 out32(BRIDGE(CPCI, CFGDATA), 0x01010000);
170 iobarrier_rw();
171
172 out32(BRIDGE(CPCI, CFGADDR), 0x04000180);
173 iobarrier_rw();
174 out32(BRIDGE(CPCI, CFGDATA), 0x56010000);
175 iobarrier_rw();
176
177 out32(BRIDGE(CPCI, CFGADDR), 0x0c000180);
178 iobarrier_rw();
179 out32(BRIDGE(CPCI, CFGDATA), PCI_LATENCY_TIMER_VAL << 16);
180 iobarrier_rw();
181
182
183 out32(BRIDGE(CPCI, CFGADDR), 0x10000180);
184 iobarrier_rw();
185 out32(BRIDGE(CPCI, CFGDATA), cpu_to_le32(PCI_MEMORY_BUS));
186 iobarrier_rw();
187
188
189
190 out32(BRIDGE(CPCI, CFGADDR), 0x40000180);
191 iobarrier_rw();
192 out32(BRIDGE(CPCI, CFGDATA), 0x01ff0000);
193 iobarrier_rw();
194
195 out32(BRIDGE(CPCI, CFGADDR), 0x50000180);
196 iobarrier_rw();
197 out32(BRIDGE(CPCI, CFGDATA), 0x32000000);
198
199
200 out32(BRIDGE(CPCI, CFGDATA), 0x00000000);
201 iobarrier_rw();
202
203
204
205 out32(BRIDGE(LOCAL, CRR), 0xfc000000);
206 iobarrier_rw();
207 out32(BRIDGE(CPCI, CRR), 0xfc000000);
208 iobarrier_rw();
209
210 local_hose.first_busno = 0;
211 local_hose.last_busno = 0xff;
212
213
214 pci_set_region(local_hose.regions + 0,
215 PCI_MEMORY_BUS,
216 PCI_MEMORY_PHYS,
217 PCI_MEMORY_MAXSIZE,
218 PCI_REGION_MEM | PCI_REGION_SYS_MEMORY);
219
220
221 pci_set_region(local_hose.regions + 1,
222 BRIDGE_LOCAL_MEM_BUS,
223 BRIDGE_LOCAL_MEM_PHYS,
224 BRIDGE_LOCAL_MEM_SIZE,
225 PCI_REGION_MEM);
226
227
228 pci_set_region(local_hose.regions + 2,
229 BRIDGE_LOCAL_IO_BUS,
230 BRIDGE_LOCAL_IO_PHYS,
231 BRIDGE_LOCAL_IO_SIZE,
232 PCI_REGION_IO);
233
234 local_hose.region_count = 3;
235
236 pci_setup_indirect(&local_hose,
237 BRIDGE_LOCAL_PHYS + HW_BRIDGE_CFGADDR,
238 BRIDGE_LOCAL_PHYS + HW_BRIDGE_CFGDATA);
239
240 pci_register_hose(&local_hose);
241
242
243 pci_hose_write_config_byte(&local_hose,
244 PCI_BDF(local_hose.first_busno,0,0),
245 CPC710_BUS_NUMBER,
246 local_hose.first_busno);
247 pci_hose_write_config_byte(&local_hose,
248 PCI_BDF(local_hose.first_busno,0,0),
249 CPC710_SUB_BUS_NUMBER,
250 local_hose.last_busno);
251
252 local_hose.last_busno = pci_hose_scan(&local_hose);
253
254
255 pci_hose_write_config_byte(&local_hose,
256 PCI_BDF(local_hose.first_busno,0,0),
257 CPC710_SUB_BUS_NUMBER,
258 local_hose.last_busno);
259
260 cpci_hose.first_busno = local_hose.last_busno + 1;
261 cpci_hose.last_busno = 0xff;
262
263
264 pci_set_region(cpci_hose.regions + 0,
265 PCI_MEMORY_BUS,
266 PCI_MEMORY_PHYS,
267 PCI_MEMORY_MAXSIZE,
268 PCI_REGION_SYS_MEMORY);
269
270
271 pci_set_region(cpci_hose.regions + 1,
272 BRIDGE_CPCI_MEM_BUS,
273 BRIDGE_CPCI_MEM_PHYS,
274 BRIDGE_CPCI_MEM_SIZE,
275 PCI_REGION_MEM);
276
277
278 pci_set_region(cpci_hose.regions + 2,
279 BRIDGE_CPCI_IO_BUS,
280 BRIDGE_CPCI_IO_PHYS,
281 BRIDGE_CPCI_IO_SIZE,
282 PCI_REGION_IO);
283
284 cpci_hose.region_count = 3;
285
286 pci_setup_indirect(&cpci_hose,
287 BRIDGE_CPCI_PHYS + HW_BRIDGE_CFGADDR,
288 BRIDGE_CPCI_PHYS + HW_BRIDGE_CFGDATA);
289
290 pci_register_hose(&cpci_hose);
291
292
293 pci_hose_write_config_byte(&cpci_hose,
294 PCI_BDF(cpci_hose.first_busno,0,0),
295 CPC710_BUS_NUMBER,
296 cpci_hose.first_busno);
297 pci_hose_write_config_byte(&cpci_hose,
298 PCI_BDF(cpci_hose.first_busno,0,0),
299 CPC710_SUB_BUS_NUMBER,
300 cpci_hose.last_busno);
301
302 cpci_hose.last_busno = pci_hose_scan(&cpci_hose);
303
304
305 pci_hose_write_config_byte(&cpci_hose,
306 PCI_BDF(cpci_hose.first_busno,0,0),
307 CPC710_SUB_BUS_NUMBER,
308 cpci_hose.last_busno);
309}
310