1
2
3
4
5
6#include <common.h>
7#include <mpc83xx.h>
8#include <ioports.h>
9#include <asm/io.h>
10#include <asm/processor.h>
11#ifdef CONFIG_USB_EHCI_FSL
12#include <usb/ehci-ci.h>
13#endif
14
15#include "lblaw/lblaw.h"
16#include "elbc/elbc.h"
17#include "sysio/sysio.h"
18#include "arbiter/arbiter.h"
19#include "initreg/initreg.h"
20
21DECLARE_GLOBAL_DATA_PTR;
22
23#ifdef CONFIG_QE
24extern qe_iop_conf_t qe_iop_conf_tab[];
25extern void qe_config_iopin(u8 port, u8 pin, int dir,
26 int open_drain, int assign);
27extern void qe_init(uint qe_base);
28extern void qe_reset(void);
29
30static void config_qe_ioports(void)
31{
32 u8 port, pin;
33 int dir, open_drain, assign;
34 int i;
35
36 for (i = 0; qe_iop_conf_tab[i].assign != QE_IOP_TAB_END; i++) {
37 port = qe_iop_conf_tab[i].port;
38 pin = qe_iop_conf_tab[i].pin;
39 dir = qe_iop_conf_tab[i].dir;
40 open_drain = qe_iop_conf_tab[i].open_drain;
41 assign = qe_iop_conf_tab[i].assign;
42 qe_config_iopin(port, pin, dir, open_drain, assign);
43 }
44}
45#endif
46
47
48
49
50
51
52
53
54void cpu_init_f (volatile immap_t * im)
55{
56 __be32 sccr_mask =
57#ifdef CONFIG_SYS_SCCR_ENCCM
58 SCCR_ENCCM |
59#endif
60#ifdef CONFIG_SYS_SCCR_PCICM
61 SCCR_PCICM |
62#endif
63#ifdef CONFIG_SYS_SCCR_PCIEXP1CM
64 SCCR_PCIEXP1CM |
65#endif
66#ifdef CONFIG_SYS_SCCR_PCIEXP2CM
67 SCCR_PCIEXP2CM |
68#endif
69#ifdef CONFIG_SYS_SCCR_TSECCM
70 SCCR_TSECCM |
71#endif
72#ifdef CONFIG_SYS_SCCR_TSEC1CM
73 SCCR_TSEC1CM |
74#endif
75#ifdef CONFIG_SYS_SCCR_TSEC2CM
76 SCCR_TSEC2CM |
77#endif
78#ifdef CONFIG_SYS_SCCR_TSEC1ON
79 SCCR_TSEC1ON |
80#endif
81#ifdef CONFIG_SYS_SCCR_TSEC2ON
82 SCCR_TSEC2ON |
83#endif
84#ifdef CONFIG_SYS_SCCR_USBMPHCM
85 SCCR_USBMPHCM |
86#endif
87#ifdef CONFIG_SYS_SCCR_USBDRCM
88 SCCR_USBDRCM |
89#endif
90#ifdef CONFIG_SYS_SCCR_SATACM
91 SCCR_SATACM |
92#endif
93 0;
94 __be32 sccr_val =
95#ifdef CONFIG_SYS_SCCR_ENCCM
96 (CONFIG_SYS_SCCR_ENCCM << SCCR_ENCCM_SHIFT) |
97#endif
98#ifdef CONFIG_SYS_SCCR_PCICM
99 (CONFIG_SYS_SCCR_PCICM << SCCR_PCICM_SHIFT) |
100#endif
101#ifdef CONFIG_SYS_SCCR_PCIEXP1CM
102 (CONFIG_SYS_SCCR_PCIEXP1CM << SCCR_PCIEXP1CM_SHIFT) |
103#endif
104#ifdef CONFIG_SYS_SCCR_PCIEXP2CM
105 (CONFIG_SYS_SCCR_PCIEXP2CM << SCCR_PCIEXP2CM_SHIFT) |
106#endif
107#ifdef CONFIG_SYS_SCCR_TSECCM
108 (CONFIG_SYS_SCCR_TSECCM << SCCR_TSECCM_SHIFT) |
109#endif
110#ifdef CONFIG_SYS_SCCR_TSEC1CM
111 (CONFIG_SYS_SCCR_TSEC1CM << SCCR_TSEC1CM_SHIFT) |
112#endif
113#ifdef CONFIG_SYS_SCCR_TSEC2CM
114 (CONFIG_SYS_SCCR_TSEC2CM << SCCR_TSEC2CM_SHIFT) |
115#endif
116#ifdef CONFIG_SYS_SCCR_TSEC1ON
117 (CONFIG_SYS_SCCR_TSEC1ON << SCCR_TSEC1ON_SHIFT) |
118#endif
119#ifdef CONFIG_SYS_SCCR_TSEC2ON
120 (CONFIG_SYS_SCCR_TSEC2ON << SCCR_TSEC2ON_SHIFT) |
121#endif
122#ifdef CONFIG_SYS_SCCR_USBMPHCM
123 (CONFIG_SYS_SCCR_USBMPHCM << SCCR_USBMPHCM_SHIFT) |
124#endif
125#ifdef CONFIG_SYS_SCCR_USBDRCM
126 (CONFIG_SYS_SCCR_USBDRCM << SCCR_USBDRCM_SHIFT) |
127#endif
128#ifdef CONFIG_SYS_SCCR_SATACM
129 (CONFIG_SYS_SCCR_SATACM << SCCR_SATACM_SHIFT) |
130#endif
131 0;
132
133
134 gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
135
136
137
138
139 clrsetbits_be32(&im->arbiter.acr, acr_mask, acr_val);
140
141 clrsetbits_be32(&im->sysconf.spcr, spcr_mask, spcr_val);
142
143 clrsetbits_be32(&im->clk.sccr, sccr_mask, sccr_val);
144
145
146 gd->arch.reset_status = __raw_readl(&im->reset.rsr);
147 __raw_writel(~(RSR_RES), &im->reset.rsr);
148
149
150 gd->arch.arbiter_event_attributes = __raw_readl(&im->arbiter.aeatr);
151 gd->arch.arbiter_event_address = __raw_readl(&im->arbiter.aeadr);
152
153
154
155
156
157 __raw_writel(RMR_CSRE & (1<<RMR_CSRE_SHIFT), &im->reset.rmr);
158
159
160
161
162 clrsetbits_be32(&im->im_lbc.lcrr, lcrr_mask, lcrr_val);
163 __raw_readl(&im->im_lbc.lcrr);
164 isync();
165
166
167 setbits_be32(&im->sysconf.spcr, SPCR_TBEN);
168
169
170#ifdef CONFIG_SYS_SICRH
171#if defined(CONFIG_ARCH_MPC834X) || defined(CONFIG_ARCH_MPC8313)
172
173 __raw_writel((im->sysconf.sicrh & 0x0000000C) | CONFIG_SYS_SICRH,
174 &im->sysconf.sicrh);
175#else
176 __raw_writel(CONFIG_SYS_SICRH, &im->sysconf.sicrh);
177#endif
178#endif
179#ifdef CONFIG_SYS_SICRL
180 __raw_writel(CONFIG_SYS_SICRL, &im->sysconf.sicrl);
181#endif
182#ifdef CONFIG_SYS_GPR1
183 __raw_writel(CONFIG_SYS_GPR1, &im->sysconf.gpr1);
184#endif
185#ifdef CONFIG_SYS_DDRCDR
186 __raw_writel(CONFIG_SYS_DDRCDR, &im->sysconf.ddrcdr);
187#endif
188#ifdef CONFIG_SYS_OBIR
189 __raw_writel(CONFIG_SYS_OBIR, &im->sysconf.obir);
190#endif
191
192#ifdef CONFIG_QE
193
194 config_qe_ioports();
195#endif
196
197 init_early_memctl_regs();
198
199
200#if defined(CONFIG_SYS_LBLAWBAR0_PRELIM) && defined(CONFIG_SYS_LBLAWAR0_PRELIM)
201 im->sysconf.lblaw[0].bar = CONFIG_SYS_LBLAWBAR0_PRELIM;
202 im->sysconf.lblaw[0].ar = CONFIG_SYS_LBLAWAR0_PRELIM;
203#else
204#error CONFIG_SYS_LBLAWBAR0_PRELIM & CONFIG_SYS_LBLAWAR0_PRELIM must be defined
205#endif
206
207#if defined(CONFIG_SYS_LBLAWBAR1_PRELIM) && defined(CONFIG_SYS_LBLAWAR1_PRELIM)
208 im->sysconf.lblaw[1].bar = CONFIG_SYS_LBLAWBAR1_PRELIM;
209 im->sysconf.lblaw[1].ar = CONFIG_SYS_LBLAWAR1_PRELIM;
210#endif
211#if defined(CONFIG_SYS_LBLAWBAR2_PRELIM) && defined(CONFIG_SYS_LBLAWAR2_PRELIM)
212 im->sysconf.lblaw[2].bar = CONFIG_SYS_LBLAWBAR2_PRELIM;
213 im->sysconf.lblaw[2].ar = CONFIG_SYS_LBLAWAR2_PRELIM;
214#endif
215#if defined(CONFIG_SYS_LBLAWBAR3_PRELIM) && defined(CONFIG_SYS_LBLAWAR3_PRELIM)
216 im->sysconf.lblaw[3].bar = CONFIG_SYS_LBLAWBAR3_PRELIM;
217 im->sysconf.lblaw[3].ar = CONFIG_SYS_LBLAWAR3_PRELIM;
218#endif
219#if defined(CONFIG_SYS_LBLAWBAR4_PRELIM) && defined(CONFIG_SYS_LBLAWAR4_PRELIM)
220 im->sysconf.lblaw[4].bar = CONFIG_SYS_LBLAWBAR4_PRELIM;
221 im->sysconf.lblaw[4].ar = CONFIG_SYS_LBLAWAR4_PRELIM;
222#endif
223#if defined(CONFIG_SYS_LBLAWBAR5_PRELIM) && defined(CONFIG_SYS_LBLAWAR5_PRELIM)
224 im->sysconf.lblaw[5].bar = CONFIG_SYS_LBLAWBAR5_PRELIM;
225 im->sysconf.lblaw[5].ar = CONFIG_SYS_LBLAWAR5_PRELIM;
226#endif
227#if defined(CONFIG_SYS_LBLAWBAR6_PRELIM) && defined(CONFIG_SYS_LBLAWAR6_PRELIM)
228 im->sysconf.lblaw[6].bar = CONFIG_SYS_LBLAWBAR6_PRELIM;
229 im->sysconf.lblaw[6].ar = CONFIG_SYS_LBLAWAR6_PRELIM;
230#endif
231#if defined(CONFIG_SYS_LBLAWBAR7_PRELIM) && defined(CONFIG_SYS_LBLAWAR7_PRELIM)
232 im->sysconf.lblaw[7].bar = CONFIG_SYS_LBLAWBAR7_PRELIM;
233 im->sysconf.lblaw[7].ar = CONFIG_SYS_LBLAWAR7_PRELIM;
234#endif
235#ifdef CONFIG_SYS_GPIO1_PRELIM
236 im->gpio[0].dat = CONFIG_SYS_GPIO1_DAT;
237 im->gpio[0].dir = CONFIG_SYS_GPIO1_DIR;
238#endif
239#ifdef CONFIG_SYS_GPIO2_PRELIM
240 im->gpio[1].dat = CONFIG_SYS_GPIO2_DAT;
241 im->gpio[1].dir = CONFIG_SYS_GPIO2_DIR;
242#endif
243#if defined(CONFIG_USB_EHCI_FSL) && defined(CONFIG_ARCH_MPC831X)
244 uint32_t temp;
245 struct usb_ehci *ehci = (struct usb_ehci *)CONFIG_SYS_FSL_USB1_ADDR;
246
247
248 setbits_be32(&ehci->control, REFSEL_16MHZ | UTMI_PHY_EN);
249
250
251 do {
252 temp = __raw_readl(&ehci->control);
253 udelay(1000);
254 } while (!(temp & PHY_CLK_VALID));
255#endif
256}
257
258int cpu_init_r (void)
259{
260#ifdef CONFIG_QE
261 uint qe_base = CONFIG_SYS_IMMR + 0x00100000;
262
263 qe_init(qe_base);
264 qe_reset();
265#endif
266 return 0;
267}
268
269
270
271
272#if defined(CONFIG_DISPLAY_AER_FULL)
273static int print_83xx_arb_event(int force)
274{
275 static char* event[] = {
276 "Address Time Out",
277 "Data Time Out",
278 "Address Only Transfer Type",
279 "External Control Word Transfer Type",
280 "Reserved Transfer Type",
281 "Transfer Error",
282 "reserved",
283 "reserved"
284 };
285 static char* master[] = {
286 "e300 Core Data Transaction",
287 "reserved",
288 "e300 Core Instruction Fetch",
289 "reserved",
290 "TSEC1",
291 "TSEC2",
292 "USB MPH",
293 "USB DR",
294 "Encryption Core",
295 "I2C Boot Sequencer",
296 "JTAG",
297 "reserved",
298 "eSDHC",
299 "PCI1",
300 "PCI2",
301 "DMA",
302 "QUICC Engine 00",
303 "QUICC Engine 01",
304 "QUICC Engine 10",
305 "QUICC Engine 11",
306 "reserved",
307 "reserved",
308 "reserved",
309 "reserved",
310 "SATA1",
311 "SATA2",
312 "SATA3",
313 "SATA4",
314 "reserved",
315 "PCI Express 1",
316 "PCI Express 2",
317 "TDM-DMAC"
318 };
319 static char *transfer[] = {
320 "Address-only, Clean Block",
321 "Address-only, lwarx reservation set",
322 "Single-beat or Burst write",
323 "reserved",
324 "Address-only, Flush Block",
325 "reserved",
326 "Burst write",
327 "reserved",
328 "Address-only, sync",
329 "Address-only, tlbsync",
330 "Single-beat or Burst read",
331 "Single-beat or Burst read",
332 "Address-only, Kill Block",
333 "Address-only, icbi",
334 "Burst read",
335 "reserved",
336 "Address-only, eieio",
337 "reserved",
338 "Single-beat write",
339 "reserved",
340 "ecowx - Illegal single-beat write",
341 "reserved",
342 "reserved",
343 "reserved",
344 "Address-only, TLB Invalidate",
345 "reserved",
346 "Single-beat or Burst read",
347 "reserved",
348 "eciwx - Illegal single-beat read",
349 "reserved",
350 "Burst read",
351 "reserved"
352 };
353
354 int etype = (gd->arch.arbiter_event_attributes & AEATR_EVENT)
355 >> AEATR_EVENT_SHIFT;
356 int mstr_id = (gd->arch.arbiter_event_attributes & AEATR_MSTR_ID)
357 >> AEATR_MSTR_ID_SHIFT;
358 int tbst = (gd->arch.arbiter_event_attributes & AEATR_TBST)
359 >> AEATR_TBST_SHIFT;
360 int tsize = (gd->arch.arbiter_event_attributes & AEATR_TSIZE)
361 >> AEATR_TSIZE_SHIFT;
362 int ttype = (gd->arch.arbiter_event_attributes & AEATR_TTYPE)
363 >> AEATR_TTYPE_SHIFT;
364
365 if (!force && !gd->arch.arbiter_event_address)
366 return 0;
367
368 puts("Arbiter Event Status:\n");
369 printf(" Event Address: 0x%08lX\n",
370 gd->arch.arbiter_event_address);
371 printf(" Event Type: 0x%1x = %s\n", etype, event[etype]);
372 printf(" Master ID: 0x%02x = %s\n", mstr_id, master[mstr_id]);
373 printf(" Transfer Size: 0x%1x = %d bytes\n", (tbst<<3) | tsize,
374 tbst ? (tsize ? tsize : 8) : 16 + 8 * tsize);
375 printf(" Transfer Type: 0x%02x = %s\n", ttype, transfer[ttype]);
376
377 return gd->arch.arbiter_event_address;
378}
379
380#elif defined(CONFIG_DISPLAY_AER_BRIEF)
381
382static int print_83xx_arb_event(int force)
383{
384 if (!force && !gd->arch.arbiter_event_address)
385 return 0;
386
387 printf("Arbiter Event Status: AEATR=0x%08lX, AEADR=0x%08lX\n",
388 gd->arch.arbiter_event_attributes,
389 gd->arch.arbiter_event_address);
390
391 return gd->arch.arbiter_event_address;
392}
393#endif
394
395#ifndef CONFIG_CPU_MPC83XX
396
397
398
399int prt_83xx_rsr(void)
400{
401 static struct {
402 ulong mask;
403 char *desc;
404 } bits[] = {
405 {
406 RSR_SWSR, "Software Soft"}, {
407 RSR_SWHR, "Software Hard"}, {
408 RSR_JSRS, "JTAG Soft"}, {
409 RSR_CSHR, "Check Stop"}, {
410 RSR_SWRS, "Software Watchdog"}, {
411 RSR_BMRS, "Bus Monitor"}, {
412 RSR_SRS, "External/Internal Soft"}, {
413 RSR_HRS, "External/Internal Hard"}
414 };
415 static int n = ARRAY_SIZE(bits);
416 ulong rsr = gd->arch.reset_status;
417 int i;
418 char *sep;
419
420 puts("Reset Status:");
421
422 sep = " ";
423 for (i = 0; i < n; i++)
424 if (rsr & bits[i].mask) {
425 printf("%s%s", sep, bits[i].desc);
426 sep = ", ";
427 }
428 puts("\n");
429
430#if defined(CONFIG_DISPLAY_AER_FULL) || defined(CONFIG_DISPLAY_AER_BRIEF)
431 print_83xx_arb_event(rsr & RSR_BMRS);
432#endif
433 puts("\n");
434
435 return 0;
436}
437#endif
438