]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - cpu/mpc83xx/cpu_init.c
imported U-Boot Release 2009.08 from Freescale BSP L2.6.31_10.08.01
[karo-tx-uboot.git] / cpu / mpc83xx / cpu_init.c
1 /*
2  * Copyright (C) 2004-2009 Freescale Semiconductor, Inc.
3  *
4  * See file CREDITS for list of people who contributed to this
5  * project.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of
10  * the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20  * MA 02111-1307 USA
21  */
22
23 #include <common.h>
24 #include <mpc83xx.h>
25 #include <ioports.h>
26 #ifdef CONFIG_USB_EHCI_FSL
27 #include <asm/io.h>
28 #include <usb/ehci-fsl.h>
29 #endif
30
31 DECLARE_GLOBAL_DATA_PTR;
32
33 #ifdef CONFIG_QE
34 extern qe_iop_conf_t qe_iop_conf_tab[];
35 extern void qe_config_iopin(u8 port, u8 pin, int dir,
36                          int open_drain, int assign);
37 extern void qe_init(uint qe_base);
38 extern void qe_reset(void);
39
40 static void config_qe_ioports(void)
41 {
42         u8      port, pin;
43         int     dir, open_drain, assign;
44         int     i;
45
46         for (i = 0; qe_iop_conf_tab[i].assign != QE_IOP_TAB_END; i++) {
47                 port            = qe_iop_conf_tab[i].port;
48                 pin             = qe_iop_conf_tab[i].pin;
49                 dir             = qe_iop_conf_tab[i].dir;
50                 open_drain      = qe_iop_conf_tab[i].open_drain;
51                 assign          = qe_iop_conf_tab[i].assign;
52                 qe_config_iopin(port, pin, dir, open_drain, assign);
53         }
54 }
55 #endif
56
57 /*
58  * Breathe some life into the CPU...
59  *
60  * Set up the memory map,
61  * initialize a bunch of registers,
62  * initialize the UPM's
63  */
64 void cpu_init_f (volatile immap_t * im)
65 {
66         /* Pointer is writable since we allocated a register for it */
67         gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
68
69         /* Clear initial global data */
70         memset ((void *) gd, 0, sizeof (gd_t));
71
72         /* system performance tweaking */
73
74 #ifdef CONFIG_SYS_ACR_PIPE_DEP
75         /* Arbiter pipeline depth */
76         im->arbiter.acr = (im->arbiter.acr & ~ACR_PIPE_DEP) |
77                           (CONFIG_SYS_ACR_PIPE_DEP << ACR_PIPE_DEP_SHIFT);
78 #endif
79
80 #ifdef CONFIG_SYS_ACR_RPTCNT
81         /* Arbiter repeat count */
82         im->arbiter.acr = (im->arbiter.acr & ~(ACR_RPTCNT)) |
83                           (CONFIG_SYS_ACR_RPTCNT << ACR_RPTCNT_SHIFT);
84 #endif
85
86 #ifdef CONFIG_SYS_SPCR_OPT
87         /* Optimize transactions between CSB and other devices */
88         im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_OPT) |
89                            (CONFIG_SYS_SPCR_OPT << SPCR_OPT_SHIFT);
90 #endif
91
92 #ifdef CONFIG_SYS_SPCR_TSECEP
93         /* all eTSEC's Emergency priority */
94         im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSECEP) |
95                            (CONFIG_SYS_SPCR_TSECEP << SPCR_TSECEP_SHIFT);
96 #endif
97
98 #ifdef CONFIG_SYS_SPCR_TSEC1EP
99         /* TSEC1 Emergency priority */
100         im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC1EP) |
101                            (CONFIG_SYS_SPCR_TSEC1EP << SPCR_TSEC1EP_SHIFT);
102 #endif
103
104 #ifdef CONFIG_SYS_SPCR_TSEC2EP
105         /* TSEC2 Emergency priority */
106         im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC2EP) |
107                            (CONFIG_SYS_SPCR_TSEC2EP << SPCR_TSEC2EP_SHIFT);
108 #endif
109
110 #ifdef CONFIG_SYS_SCCR_ENCCM
111         /* Encryption clock mode */
112         im->clk.sccr = (im->clk.sccr & ~SCCR_ENCCM) |
113                        (CONFIG_SYS_SCCR_ENCCM << SCCR_ENCCM_SHIFT);
114 #endif
115
116 #ifdef CONFIG_SYS_SCCR_PCICM
117         /* PCI & DMA clock mode */
118         im->clk.sccr = (im->clk.sccr & ~SCCR_PCICM) |
119                        (CONFIG_SYS_SCCR_PCICM << SCCR_PCICM_SHIFT);
120 #endif
121
122 #ifdef CONFIG_SYS_SCCR_TSECCM
123         /* all TSEC's clock mode */
124         im->clk.sccr = (im->clk.sccr & ~SCCR_TSECCM) |
125                        (CONFIG_SYS_SCCR_TSECCM << SCCR_TSECCM_SHIFT);
126 #endif
127
128 #ifdef CONFIG_SYS_SCCR_TSEC1CM
129         /* TSEC1 clock mode */
130         im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC1CM) |
131                        (CONFIG_SYS_SCCR_TSEC1CM << SCCR_TSEC1CM_SHIFT);
132 #endif
133
134 #ifdef CONFIG_SYS_SCCR_TSEC2CM
135         /* TSEC2 clock mode */
136         im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC2CM) |
137                        (CONFIG_SYS_SCCR_TSEC2CM << SCCR_TSEC2CM_SHIFT);
138 #endif
139
140 #ifdef CONFIG_SYS_SCCR_TSEC1ON
141         /* TSEC1 clock switch */
142         im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC1ON) |
143                        (CONFIG_SYS_SCCR_TSEC1ON << SCCR_TSEC1ON_SHIFT);
144 #endif
145
146 #ifdef CONFIG_SYS_SCCR_TSEC2ON
147         /* TSEC2 clock switch */
148         im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC2ON) |
149                        (CONFIG_SYS_SCCR_TSEC2ON << SCCR_TSEC2ON_SHIFT);
150 #endif
151
152 #ifdef CONFIG_SYS_SCCR_USBMPHCM
153         /* USB MPH clock mode */
154         im->clk.sccr = (im->clk.sccr & ~SCCR_USBMPHCM) |
155                        (CONFIG_SYS_SCCR_USBMPHCM << SCCR_USBMPHCM_SHIFT);
156 #endif
157
158 #ifdef CONFIG_SYS_SCCR_USBDRCM
159         /* USB DR clock mode */
160         im->clk.sccr = (im->clk.sccr & ~SCCR_USBDRCM) |
161                        (CONFIG_SYS_SCCR_USBDRCM << SCCR_USBDRCM_SHIFT);
162 #endif
163
164 #ifdef CONFIG_SYS_SCCR_SATACM
165         /* SATA controller clock mode */
166         im->clk.sccr = (im->clk.sccr & ~SCCR_SATACM) |
167                        (CONFIG_SYS_SCCR_SATACM << SCCR_SATACM_SHIFT);
168 #endif
169
170         /* RSR - Reset Status Register - clear all status (4.6.1.3) */
171         gd->reset_status = im->reset.rsr;
172         im->reset.rsr = ~(RSR_RES);
173
174         /* AER - Arbiter Event Register - store status */
175         gd->arbiter_event_attributes = im->arbiter.aeatr;
176         gd->arbiter_event_address = im->arbiter.aeadr;
177
178         /*
179          * RMR - Reset Mode Register
180          * contains checkstop reset enable (4.6.1.4)
181          */
182         im->reset.rmr = (RMR_CSRE & (1<<RMR_CSRE_SHIFT));
183
184         /* LCRR - Clock Ratio Register (10.3.1.16) */
185         im->lbus.lcrr = CONFIG_SYS_LCRR;
186
187         /* Enable Time Base & Decrimenter ( so we will have udelay() )*/
188         im->sysconf.spcr |= SPCR_TBEN;
189
190         /* System General Purpose Register */
191 #ifdef CONFIG_SYS_SICRH
192 #if defined(CONFIG_MPC834x) || defined(CONFIG_MPC8313)
193         /* regarding to MPC34x manual rev.1 bits 28..29 must be preserved */
194         im->sysconf.sicrh = (im->sysconf.sicrh & 0x0000000C) | CONFIG_SYS_SICRH;
195 #else
196         im->sysconf.sicrh = CONFIG_SYS_SICRH;
197 #endif
198 #endif
199 #ifdef CONFIG_SYS_SICRL
200         im->sysconf.sicrl = CONFIG_SYS_SICRL;
201 #endif
202         /* DDR control driver register */
203 #ifdef CONFIG_SYS_DDRCDR
204         im->sysconf.ddrcdr = CONFIG_SYS_DDRCDR;
205 #endif
206         /* Output buffer impedance register */
207 #ifdef CONFIG_SYS_OBIR
208         im->sysconf.obir = CONFIG_SYS_OBIR;
209 #endif
210
211 #ifdef CONFIG_QE
212         /* Config QE ioports */
213         config_qe_ioports();
214 #endif
215
216         /*
217          * Memory Controller:
218          */
219
220         /* Map banks 0 and 1 to the FLASH banks 0 and 1 at preliminary
221          * addresses - these have to be modified later when FLASH size
222          * has been determined
223          */
224
225 #if defined(CONFIG_SYS_BR0_PRELIM)  \
226         && defined(CONFIG_SYS_OR0_PRELIM) \
227         && defined(CONFIG_SYS_LBLAWBAR0_PRELIM) \
228         && defined(CONFIG_SYS_LBLAWAR0_PRELIM)
229         im->lbus.bank[0].br = CONFIG_SYS_BR0_PRELIM;
230         im->lbus.bank[0].or = CONFIG_SYS_OR0_PRELIM;
231         im->sysconf.lblaw[0].bar = CONFIG_SYS_LBLAWBAR0_PRELIM;
232         im->sysconf.lblaw[0].ar = CONFIG_SYS_LBLAWAR0_PRELIM;
233 #else
234 #error  CONFIG_SYS_BR0_PRELIM, CONFIG_SYS_OR0_PRELIM, CONFIG_SYS_LBLAWBAR0_PRELIM & CONFIG_SYS_LBLAWAR0_PRELIM must be defined
235 #endif
236
237 #if defined(CONFIG_SYS_BR1_PRELIM) && defined(CONFIG_SYS_OR1_PRELIM)
238         im->lbus.bank[1].br = CONFIG_SYS_BR1_PRELIM;
239         im->lbus.bank[1].or = CONFIG_SYS_OR1_PRELIM;
240 #endif
241 #if defined(CONFIG_SYS_LBLAWBAR1_PRELIM) && defined(CONFIG_SYS_LBLAWAR1_PRELIM)
242         im->sysconf.lblaw[1].bar = CONFIG_SYS_LBLAWBAR1_PRELIM;
243         im->sysconf.lblaw[1].ar = CONFIG_SYS_LBLAWAR1_PRELIM;
244 #endif
245 #if defined(CONFIG_SYS_BR2_PRELIM) && defined(CONFIG_SYS_OR2_PRELIM)
246         im->lbus.bank[2].br = CONFIG_SYS_BR2_PRELIM;
247         im->lbus.bank[2].or = CONFIG_SYS_OR2_PRELIM;
248 #endif
249 #if defined(CONFIG_SYS_LBLAWBAR2_PRELIM) && defined(CONFIG_SYS_LBLAWAR2_PRELIM)
250         im->sysconf.lblaw[2].bar = CONFIG_SYS_LBLAWBAR2_PRELIM;
251         im->sysconf.lblaw[2].ar = CONFIG_SYS_LBLAWAR2_PRELIM;
252 #endif
253 #if defined(CONFIG_SYS_BR3_PRELIM) && defined(CONFIG_SYS_OR3_PRELIM)
254         im->lbus.bank[3].br = CONFIG_SYS_BR3_PRELIM;
255         im->lbus.bank[3].or = CONFIG_SYS_OR3_PRELIM;
256 #endif
257 #if defined(CONFIG_SYS_LBLAWBAR3_PRELIM) && defined(CONFIG_SYS_LBLAWAR3_PRELIM)
258         im->sysconf.lblaw[3].bar = CONFIG_SYS_LBLAWBAR3_PRELIM;
259         im->sysconf.lblaw[3].ar = CONFIG_SYS_LBLAWAR3_PRELIM;
260 #endif
261 #if defined(CONFIG_SYS_BR4_PRELIM) && defined(CONFIG_SYS_OR4_PRELIM)
262         im->lbus.bank[4].br = CONFIG_SYS_BR4_PRELIM;
263         im->lbus.bank[4].or = CONFIG_SYS_OR4_PRELIM;
264 #endif
265 #if defined(CONFIG_SYS_LBLAWBAR4_PRELIM) && defined(CONFIG_SYS_LBLAWAR4_PRELIM)
266         im->sysconf.lblaw[4].bar = CONFIG_SYS_LBLAWBAR4_PRELIM;
267         im->sysconf.lblaw[4].ar = CONFIG_SYS_LBLAWAR4_PRELIM;
268 #endif
269 #if defined(CONFIG_SYS_BR5_PRELIM) && defined(CONFIG_SYS_OR5_PRELIM)
270         im->lbus.bank[5].br = CONFIG_SYS_BR5_PRELIM;
271         im->lbus.bank[5].or = CONFIG_SYS_OR5_PRELIM;
272 #endif
273 #if defined(CONFIG_SYS_LBLAWBAR5_PRELIM) && defined(CONFIG_SYS_LBLAWAR5_PRELIM)
274         im->sysconf.lblaw[5].bar = CONFIG_SYS_LBLAWBAR5_PRELIM;
275         im->sysconf.lblaw[5].ar = CONFIG_SYS_LBLAWAR5_PRELIM;
276 #endif
277 #if defined(CONFIG_SYS_BR6_PRELIM) && defined(CONFIG_SYS_OR6_PRELIM)
278         im->lbus.bank[6].br = CONFIG_SYS_BR6_PRELIM;
279         im->lbus.bank[6].or = CONFIG_SYS_OR6_PRELIM;
280 #endif
281 #if defined(CONFIG_SYS_LBLAWBAR6_PRELIM) && defined(CONFIG_SYS_LBLAWAR6_PRELIM)
282         im->sysconf.lblaw[6].bar = CONFIG_SYS_LBLAWBAR6_PRELIM;
283         im->sysconf.lblaw[6].ar = CONFIG_SYS_LBLAWAR6_PRELIM;
284 #endif
285 #if defined(CONFIG_SYS_BR7_PRELIM) && defined(CONFIG_SYS_OR7_PRELIM)
286         im->lbus.bank[7].br = CONFIG_SYS_BR7_PRELIM;
287         im->lbus.bank[7].or = CONFIG_SYS_OR7_PRELIM;
288 #endif
289 #if defined(CONFIG_SYS_LBLAWBAR7_PRELIM) && defined(CONFIG_SYS_LBLAWAR7_PRELIM)
290         im->sysconf.lblaw[7].bar = CONFIG_SYS_LBLAWBAR7_PRELIM;
291         im->sysconf.lblaw[7].ar = CONFIG_SYS_LBLAWAR7_PRELIM;
292 #endif
293 #ifdef CONFIG_SYS_GPIO1_PRELIM
294         im->gpio[0].dat = CONFIG_SYS_GPIO1_DAT;
295         im->gpio[0].dir = CONFIG_SYS_GPIO1_DIR;
296 #endif
297 #ifdef CONFIG_SYS_GPIO2_PRELIM
298         im->gpio[1].dat = CONFIG_SYS_GPIO2_DAT;
299         im->gpio[1].dir = CONFIG_SYS_GPIO2_DIR;
300 #endif
301 #ifdef CONFIG_USB_EHCI_FSL
302 #ifndef CONFIG_MPC834x
303         uint32_t temp;
304         struct usb_ehci *ehci = (struct usb_ehci *)CONFIG_SYS_MPC8xxx_USB_ADDR;
305
306         /* Configure interface. */
307         setbits_be32(&ehci->control, REFSEL_16MHZ | UTMI_PHY_EN);
308
309         /* Wait for clock to stabilize */
310         do {
311                 temp = in_be32(&ehci->control);
312                 udelay(1000);
313         } while (!(temp & PHY_CLK_VALID));
314 #endif
315 #endif
316 }
317
318 int cpu_init_r (void)
319 {
320 #ifdef CONFIG_QE
321         uint qe_base = CONFIG_SYS_IMMR + 0x00100000; /* QE immr base */
322         qe_init(qe_base);
323         qe_reset();
324 #endif
325         return 0;
326 }
327
328 /*
329  * Print out the bus arbiter event
330  */
331 #if defined(CONFIG_DISPLAY_AER_FULL)
332 static int print_83xx_arb_event(int force)
333 {
334         static char* event[] = {
335                 "Address Time Out",
336                 "Data Time Out",
337                 "Address Only Transfer Type",
338                 "External Control Word Transfer Type",
339                 "Reserved Transfer Type",
340                 "Transfer Error",
341                 "reserved",
342                 "reserved"
343         };
344         static char* master[] = {
345                 "e300 Core Data Transaction",
346                 "reserved",
347                 "e300 Core Instruction Fetch",
348                 "reserved",
349                 "TSEC1",
350                 "TSEC2",
351                 "USB MPH",
352                 "USB DR",
353                 "Encryption Core",
354                 "I2C Boot Sequencer",
355                 "JTAG",
356                 "reserved",
357                 "eSDHC",
358                 "PCI1",
359                 "PCI2",
360                 "DMA",
361                 "QUICC Engine 00",
362                 "QUICC Engine 01",
363                 "QUICC Engine 10",
364                 "QUICC Engine 11",
365                 "reserved",
366                 "reserved",
367                 "reserved",
368                 "reserved",
369                 "SATA1",
370                 "SATA2",
371                 "SATA3",
372                 "SATA4",
373                 "reserved",
374                 "PCI Express 1",
375                 "PCI Express 2",
376                 "TDM-DMAC"
377         };
378         static char *transfer[] = {
379                 "Address-only, Clean Block",
380                 "Address-only, lwarx reservation set",
381                 "Single-beat or Burst write",
382                 "reserved",
383                 "Address-only, Flush Block",
384                 "reserved",
385                 "Burst write",
386                 "reserved",
387                 "Address-only, sync",
388                 "Address-only, tlbsync",
389                 "Single-beat or Burst read",
390                 "Single-beat or Burst read",
391                 "Address-only, Kill Block",
392                 "Address-only, icbi",
393                 "Burst read",
394                 "reserved",
395                 "Address-only, eieio",
396                 "reserved",
397                 "Single-beat write",
398                 "reserved",
399                 "ecowx - Illegal single-beat write",
400                 "reserved",
401                 "reserved",
402                 "reserved",
403                 "Address-only, TLB Invalidate",
404                 "reserved",
405                 "Single-beat or Burst read",
406                 "reserved",
407                 "eciwx - Illegal single-beat read",
408                 "reserved",
409                 "Burst read",
410                 "reserved"
411         };
412
413         int etype = (gd->arbiter_event_attributes & AEATR_EVENT)
414                     >> AEATR_EVENT_SHIFT;
415         int mstr_id = (gd->arbiter_event_attributes & AEATR_MSTR_ID)
416                       >> AEATR_MSTR_ID_SHIFT;
417         int tbst = (gd->arbiter_event_attributes & AEATR_TBST)
418                    >> AEATR_TBST_SHIFT;
419         int tsize = (gd->arbiter_event_attributes & AEATR_TSIZE)
420                     >> AEATR_TSIZE_SHIFT;
421         int ttype = (gd->arbiter_event_attributes & AEATR_TTYPE)
422                     >> AEATR_TTYPE_SHIFT;
423
424         if (!force && !gd->arbiter_event_address)
425                 return 0;
426
427         puts("Arbiter Event Status:\n");
428         printf("       Event Address: 0x%08lX\n", gd->arbiter_event_address);
429         printf("       Event Type:    0x%1x  = %s\n", etype, event[etype]);
430         printf("       Master ID:     0x%02x = %s\n", mstr_id, master[mstr_id]);
431         printf("       Transfer Size: 0x%1x  = %d bytes\n", (tbst<<3) | tsize,
432                                 tbst ? (tsize ? tsize : 8) : 16 + 8 * tsize);
433         printf("       Transfer Type: 0x%02x = %s\n", ttype, transfer[ttype]);
434
435         return gd->arbiter_event_address;
436 }
437
438 #elif defined(CONFIG_DISPLAY_AER_BRIEF)
439
440 static int print_83xx_arb_event(int force)
441 {
442         if (!force && !gd->arbiter_event_address)
443                 return 0;
444
445         printf("Arbiter Event Status: AEATR=0x%08lX, AEADR=0x%08lX\n",
446                 gd->arbiter_event_attributes, gd->arbiter_event_address);
447
448         return gd->arbiter_event_address;
449 }
450 #endif /* CONFIG_DISPLAY_AER_xxxx */
451
452 /*
453  * Figure out the cause of the reset
454  */
455 int prt_83xx_rsr(void)
456 {
457         static struct {
458                 ulong mask;
459                 char *desc;
460         } bits[] = {
461                 {
462                 RSR_SWSR, "Software Soft"}, {
463                 RSR_SWHR, "Software Hard"}, {
464                 RSR_JSRS, "JTAG Soft"}, {
465                 RSR_CSHR, "Check Stop"}, {
466                 RSR_SWRS, "Software Watchdog"}, {
467                 RSR_BMRS, "Bus Monitor"}, {
468                 RSR_SRS,  "External/Internal Soft"}, {
469                 RSR_HRS,  "External/Internal Hard"}
470         };
471         static int n = sizeof bits / sizeof bits[0];
472         ulong rsr = gd->reset_status;
473         int i;
474         char *sep;
475
476         puts("Reset Status:");
477
478         sep = " ";
479         for (i = 0; i < n; i++)
480                 if (rsr & bits[i].mask) {
481                         printf("%s%s", sep, bits[i].desc);
482                         sep = ", ";
483                 }
484         puts("\n");
485
486 #if defined(CONFIG_DISPLAY_AER_FULL) || defined(CONFIG_DISPLAY_AER_BRIEF)
487         print_83xx_arb_event(rsr & RSR_BMRS);
488 #endif
489         puts("\n");
490
491         return 0;
492 }