3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5 * See file CREDITS for list of people who contributed to this
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
32 struct pci_controller local_hose
, cpci_hose
;
34 static u32 cpc710_mapped_ram
;
36 /* Enable PCI retry timeouts
38 void cpc710_pci_enable_timeout (void)
40 out32(BRIDGE(LOCAL
, CFGADDR
), 0x50000080);
42 out32(BRIDGE(LOCAL
, CFGDATA
), 0x32000000);
45 out32(BRIDGE(CPCI
, CFGADDR
), 0x50000180);
47 out32(BRIDGE(CPCI
, CFGDATA
), 0x32000000);
51 void cpc710_pci_init (void)
53 u32 sdram_size
= pcippc2_sdram_size();
55 cpc710_mapped_ram
= sdram_size
< PCI_MEMORY_MAXSIZE
?
56 sdram_size
: PCI_MEMORY_MAXSIZE
;
58 /* Select the local PCI
60 out32(REG(CPC0
, PCICNFR
), 0x80000002);
63 out32(REG(CPC0
, PCIBAR
), BRIDGE_LOCAL_PHYS
);
66 /* Enable PCI bridge address decoding
68 out32(REG(CPC0
, PCIENB
), 0x80000000);
71 /* Select the CPCI bridge
73 out32(REG(CPC0
, PCICNFR
), 0x80000003);
76 out32(REG(CPC0
, PCIBAR
), BRIDGE_CPCI_PHYS
);
79 /* Enable PCI bridge address decoding
81 out32(REG(CPC0
, PCIENB
), 0x80000000);
84 /* Disable configuration accesses
86 out32(REG(CPC0
, PCICNFR
), 0x80000000);
89 /* Initialise the local PCI
91 out32(BRIDGE(LOCAL
, CRR
), 0x7c000000);
93 out32(BRIDGE(LOCAL
, PCIDG
), 0x40000000);
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
);
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
);
103 out32(BRIDGE(LOCAL
, PR
), 0x00ffe000);
105 out32(BRIDGE(LOCAL
, ACR
), 0xfe000000);
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));
112 /* Initialise the CPCI bridge
114 out32(BRIDGE(CPCI
, CRR
), 0x7c000000);
116 out32(BRIDGE(CPCI
, PCIDG
), 0xC0000000);
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
);
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
);
126 out32(BRIDGE(CPCI
, PR
), 0x80ffe000);
128 out32(BRIDGE(CPCI
, ACR
), 0xdf000000);
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));
138 out32(BRIDGE(LOCAL
, CFGADDR
), 0x04000080);
140 out32(BRIDGE(LOCAL
, CFGDATA
), 0x56010000);
143 out32(BRIDGE(LOCAL
, CFGADDR
), 0x0c000080);
145 out32(BRIDGE(LOCAL
, CFGDATA
), PCI_LATENCY_TIMER_VAL
<< 16);
148 /* Set bus and subbus numbers
150 out32(BRIDGE(LOCAL
, CFGADDR
), 0x40000080);
152 out32(BRIDGE(LOCAL
, CFGDATA
), 0x00000000);
155 out32(BRIDGE(LOCAL
, CFGADDR
), 0x50000080);
157 /* PCI retry timeouts will be enabled later
159 out32(BRIDGE(LOCAL
, CFGDATA
), 0x00000000);
165 /* Set bus and subbus numbers
167 out32(BRIDGE(CPCI
, CFGADDR
), 0x40000080);
169 out32(BRIDGE(CPCI
, CFGDATA
), 0x01010000);
172 out32(BRIDGE(CPCI
, CFGADDR
), 0x04000180);
174 out32(BRIDGE(CPCI
, CFGDATA
), 0x56010000);
177 out32(BRIDGE(CPCI
, CFGADDR
), 0x0c000180);
179 out32(BRIDGE(CPCI
, CFGDATA
), PCI_LATENCY_TIMER_VAL
<< 16);
182 /* Write to the PSBAR */
183 out32(BRIDGE(CPCI
, CFGADDR
), 0x10000180);
185 out32(BRIDGE(CPCI
, CFGDATA
), cpu_to_le32(PCI_MEMORY_BUS
));
188 /* Set bus and subbus numbers
190 out32(BRIDGE(CPCI
, CFGADDR
), 0x40000180);
192 out32(BRIDGE(CPCI
, CFGDATA
), 0x01ff0000);
195 out32(BRIDGE(CPCI
, CFGADDR
), 0x50000180);
197 out32(BRIDGE(CPCI
, CFGDATA
), 0x32000000);
198 /* PCI retry timeouts will be enabled later
200 out32(BRIDGE(CPCI
, CFGDATA
), 0x00000000);
203 /* Remove reset on the PCI buses
205 out32(BRIDGE(LOCAL
, CRR
), 0xfc000000);
207 out32(BRIDGE(CPCI
, CRR
), 0xfc000000);
210 local_hose
.first_busno
= 0;
211 local_hose
.last_busno
= 0xff;
213 /* System memory space */
214 pci_set_region(local_hose
.regions
+ 0,
218 PCI_REGION_MEM
| PCI_REGION_MEMORY
);
220 /* PCI memory space */
221 pci_set_region(local_hose
.regions
+ 1,
222 BRIDGE_LOCAL_MEM_BUS
,
223 BRIDGE_LOCAL_MEM_PHYS
,
224 BRIDGE_LOCAL_MEM_SIZE
,
228 pci_set_region(local_hose
.regions
+ 2,
230 BRIDGE_LOCAL_IO_PHYS
,
231 BRIDGE_LOCAL_IO_SIZE
,
234 local_hose
.region_count
= 3;
236 pci_setup_indirect(&local_hose
,
237 BRIDGE_LOCAL_PHYS
+ HW_BRIDGE_CFGADDR
,
238 BRIDGE_LOCAL_PHYS
+ HW_BRIDGE_CFGDATA
);
240 pci_register_hose(&local_hose
);
242 /* Initialize PCI32 bus registers */
243 pci_hose_write_config_byte(&local_hose
,
244 PCI_BDF(local_hose
.first_busno
,0,0),
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
);
252 local_hose
.last_busno
= pci_hose_scan(&local_hose
);
254 /* Write out correct max subordinate bus number for local hose */
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
);
260 cpci_hose
.first_busno
= local_hose
.last_busno
+ 1;
261 cpci_hose
.last_busno
= 0xff;
263 /* System memory space */
264 pci_set_region(cpci_hose
.regions
+ 0,
270 /* PCI memory space */
271 pci_set_region(cpci_hose
.regions
+ 1,
273 BRIDGE_CPCI_MEM_PHYS
,
274 BRIDGE_CPCI_MEM_SIZE
,
278 pci_set_region(cpci_hose
.regions
+ 2,
284 cpci_hose
.region_count
= 3;
286 pci_setup_indirect(&cpci_hose
,
287 BRIDGE_CPCI_PHYS
+ HW_BRIDGE_CFGADDR
,
288 BRIDGE_CPCI_PHYS
+ HW_BRIDGE_CFGDATA
);
290 pci_register_hose(&cpci_hose
);
292 /* Initialize PCI64 bus registers */
293 pci_hose_write_config_byte(&cpci_hose
,
294 PCI_BDF(cpci_hose
.first_busno
,0,0),
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
);
302 cpci_hose
.last_busno
= pci_hose_scan(&cpci_hose
);
304 /* Write out correct max subordinate bus number for cpci hose */
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
);