blob: 5c930d38880f431b29c80ab2ad69b8ab49a2d1c0 [file] [log] [blame]
Eran Libertyf046ccd2005-07-28 10:08:46 -05001/*
Vivek Mahajan4ef01012009-05-25 17:23:16 +05302 * Copyright (C) 2004-2009 Freescale Semiconductor, Inc.
Eran Libertyf046ccd2005-07-28 10:08:46 -05003 *
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
Eran Libertyf046ccd2005-07-28 10:08:46 -050021 */
22
23#include <common.h>
24#include <mpc83xx.h>
25#include <ioports.h>
Vivek Mahajan4ef01012009-05-25 17:23:16 +053026#ifdef CONFIG_USB_EHCI_FSL
27#include <asm/io.h>
28#include <usb/ehci-fsl.h>
29#endif
Eran Libertyf046ccd2005-07-28 10:08:46 -050030
Wolfgang Denkd87080b2006-03-31 18:32:53 +020031DECLARE_GLOBAL_DATA_PTR;
32
Dave Liu7737d5c2006-11-03 12:11:15 -060033#ifdef CONFIG_QE
34extern qe_iop_conf_t qe_iop_conf_tab[];
35extern void qe_config_iopin(u8 port, u8 pin, int dir,
36 int open_drain, int assign);
37extern void qe_init(uint qe_base);
38extern void qe_reset(void);
39
40static 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
Eran Libertyf046ccd2005-07-28 10:08:46 -050057/*
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 */
64void cpu_init_f (volatile immap_t * im)
65{
Eran Libertyf046ccd2005-07-28 10:08:46 -050066 /* Pointer is writable since we allocated a register for it */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020067 gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
Eran Libertyf046ccd2005-07-28 10:08:46 -050068
69 /* Clear initial global data */
70 memset ((void *) gd, 0, sizeof (gd_t));
71
Timur Tabi2ad6b512006-10-31 18:44:42 -060072 /* system performance tweaking */
73
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020074#ifdef CONFIG_SYS_ACR_PIPE_DEP
Timur Tabi2ad6b512006-10-31 18:44:42 -060075 /* Arbiter pipeline depth */
Kumar Gala4feab4d2007-02-27 23:51:42 -060076 im->arbiter.acr = (im->arbiter.acr & ~ACR_PIPE_DEP) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020077 (CONFIG_SYS_ACR_PIPE_DEP << ACR_PIPE_DEP_SHIFT);
Timur Tabi2ad6b512006-10-31 18:44:42 -060078#endif
79
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020080#ifdef CONFIG_SYS_ACR_RPTCNT
Kim Phillips9e896472008-01-16 12:06:16 -060081 /* Arbiter repeat count */
82 im->arbiter.acr = (im->arbiter.acr & ~(ACR_RPTCNT)) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020083 (CONFIG_SYS_ACR_RPTCNT << ACR_RPTCNT_SHIFT);
Kim Phillips9e896472008-01-16 12:06:16 -060084#endif
85
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020086#ifdef CONFIG_SYS_SPCR_OPT
Michael Barkowski5bbeea82008-03-20 13:15:34 -040087 /* Optimize transactions between CSB and other devices */
88 im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_OPT) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020089 (CONFIG_SYS_SPCR_OPT << SPCR_OPT_SHIFT);
Michael Barkowski5bbeea82008-03-20 13:15:34 -040090#endif
91
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020092#ifdef CONFIG_SYS_SPCR_TSECEP
Dave Liua8cb43a2008-01-17 18:23:19 +080093 /* all eTSEC's Emergency priority */
Kim Phillips9e896472008-01-16 12:06:16 -060094 im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSECEP) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020095 (CONFIG_SYS_SPCR_TSECEP << SPCR_TSECEP_SHIFT);
Kim Phillips9e896472008-01-16 12:06:16 -060096#endif
97
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020098#ifdef CONFIG_SYS_SPCR_TSEC1EP
Timur Tabi2ad6b512006-10-31 18:44:42 -060099 /* TSEC1 Emergency priority */
Kim Phillips9e896472008-01-16 12:06:16 -0600100 im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC1EP) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200101 (CONFIG_SYS_SPCR_TSEC1EP << SPCR_TSEC1EP_SHIFT);
Timur Tabi2ad6b512006-10-31 18:44:42 -0600102#endif
103
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200104#ifdef CONFIG_SYS_SPCR_TSEC2EP
Timur Tabi2ad6b512006-10-31 18:44:42 -0600105 /* TSEC2 Emergency priority */
Kim Phillips9e896472008-01-16 12:06:16 -0600106 im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC2EP) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200107 (CONFIG_SYS_SPCR_TSEC2EP << SPCR_TSEC2EP_SHIFT);
Kumar Gala4feab4d2007-02-27 23:51:42 -0600108#endif
109
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200110#ifdef CONFIG_SYS_SCCR_ENCCM
Kumar Gala4feab4d2007-02-27 23:51:42 -0600111 /* Encryption clock mode */
Kim Phillips9e896472008-01-16 12:06:16 -0600112 im->clk.sccr = (im->clk.sccr & ~SCCR_ENCCM) |
Norbert van Bolhuisb5816262009-03-13 08:58:14 +0100113 (CONFIG_SYS_SCCR_ENCCM << SCCR_ENCCM_SHIFT);
Timur Tabi2ad6b512006-10-31 18:44:42 -0600114#endif
115
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200116#ifdef CONFIG_SYS_SCCR_PCICM
Kim Phillips9e896472008-01-16 12:06:16 -0600117 /* PCI & DMA clock mode */
118 im->clk.sccr = (im->clk.sccr & ~SCCR_PCICM) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200119 (CONFIG_SYS_SCCR_PCICM << SCCR_PCICM_SHIFT);
Kim Phillips9e896472008-01-16 12:06:16 -0600120#endif
121
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200122#ifdef CONFIG_SYS_SCCR_TSECCM
Kim Phillips9e896472008-01-16 12:06:16 -0600123 /* all TSEC's clock mode */
124 im->clk.sccr = (im->clk.sccr & ~SCCR_TSECCM) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200125 (CONFIG_SYS_SCCR_TSECCM << SCCR_TSECCM_SHIFT);
Kim Phillips9e896472008-01-16 12:06:16 -0600126#endif
127
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200128#ifdef CONFIG_SYS_SCCR_TSEC1CM
Kim Phillips9e896472008-01-16 12:06:16 -0600129 /* TSEC1 clock mode */
130 im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC1CM) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200131 (CONFIG_SYS_SCCR_TSEC1CM << SCCR_TSEC1CM_SHIFT);
Kim Phillips9e896472008-01-16 12:06:16 -0600132#endif
133
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200134#ifdef CONFIG_SYS_SCCR_TSEC2CM
Kim Phillips9e896472008-01-16 12:06:16 -0600135 /* TSEC2 clock mode */
136 im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC2CM) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200137 (CONFIG_SYS_SCCR_TSEC2CM << SCCR_TSEC2CM_SHIFT);
Kim Phillips9e896472008-01-16 12:06:16 -0600138#endif
139
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200140#ifdef CONFIG_SYS_SCCR_TSEC1ON
Kim Phillips9e896472008-01-16 12:06:16 -0600141 /* TSEC1 clock switch */
142 im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC1ON) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200143 (CONFIG_SYS_SCCR_TSEC1ON << SCCR_TSEC1ON_SHIFT);
Kim Phillips9e896472008-01-16 12:06:16 -0600144#endif
145
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200146#ifdef CONFIG_SYS_SCCR_TSEC2ON
Kim Phillips9e896472008-01-16 12:06:16 -0600147 /* TSEC2 clock switch */
148 im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC2ON) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200149 (CONFIG_SYS_SCCR_TSEC2ON << SCCR_TSEC2ON_SHIFT);
Kim Phillips9e896472008-01-16 12:06:16 -0600150#endif
151
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200152#ifdef CONFIG_SYS_SCCR_USBMPHCM
Kim Phillips9e896472008-01-16 12:06:16 -0600153 /* USB MPH clock mode */
154 im->clk.sccr = (im->clk.sccr & ~SCCR_USBMPHCM) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200155 (CONFIG_SYS_SCCR_USBMPHCM << SCCR_USBMPHCM_SHIFT);
Kim Phillips9e896472008-01-16 12:06:16 -0600156#endif
157
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200158#ifdef CONFIG_SYS_SCCR_USBDRCM
Kim Phillips9e896472008-01-16 12:06:16 -0600159 /* USB DR clock mode */
160 im->clk.sccr = (im->clk.sccr & ~SCCR_USBDRCM) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200161 (CONFIG_SYS_SCCR_USBDRCM << SCCR_USBDRCM_SHIFT);
Kim Phillips9e896472008-01-16 12:06:16 -0600162#endif
163
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200164#ifdef CONFIG_SYS_SCCR_SATACM
Kim Phillips9e896472008-01-16 12:06:16 -0600165 /* SATA controller clock mode */
166 im->clk.sccr = (im->clk.sccr & ~SCCR_SATACM) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200167 (CONFIG_SYS_SCCR_SATACM << SCCR_SATACM_SHIFT);
Timur Tabi2ad6b512006-10-31 18:44:42 -0600168#endif
169
Eran Libertyf046ccd2005-07-28 10:08:46 -0500170 /* 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
Nick Spence46497052008-08-28 14:09:19 -0700174 /* AER - Arbiter Event Register - store status */
175 gd->arbiter_event_attributes = im->arbiter.aeatr;
176 gd->arbiter_event_address = im->arbiter.aeadr;
177
Eran Libertyf046ccd2005-07-28 10:08:46 -0500178 /*
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) */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200185 im->lbus.lcrr = CONFIG_SYS_LCRR;
Eran Libertyf046ccd2005-07-28 10:08:46 -0500186
187 /* Enable Time Base & Decrimenter ( so we will have udelay() )*/
188 im->sysconf.spcr |= SPCR_TBEN;
189
190 /* System General Purpose Register */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200191#ifdef CONFIG_SYS_SICRH
Peter Tyser2c7920a2009-05-22 17:23:25 -0500192#if defined(CONFIG_MPC834x) || defined(CONFIG_MPC8313)
Andre Schwarz846f1572008-06-23 11:40:56 +0200193 /* regarding to MPC34x manual rev.1 bits 28..29 must be preserved */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200194 im->sysconf.sicrh = (im->sysconf.sicrh & 0x0000000C) | CONFIG_SYS_SICRH;
Andre Schwarz846f1572008-06-23 11:40:56 +0200195#else
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200196 im->sysconf.sicrh = CONFIG_SYS_SICRH;
Kumar Gala9260a562006-01-11 11:12:57 -0600197#endif
Andre Schwarz846f1572008-06-23 11:40:56 +0200198#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200199#ifdef CONFIG_SYS_SICRL
200 im->sysconf.sicrl = CONFIG_SYS_SICRL;
Kumar Gala9260a562006-01-11 11:12:57 -0600201#endif
Dave Liu24c3aca2006-12-07 21:13:15 +0800202 /* DDR control driver register */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200203#ifdef CONFIG_SYS_DDRCDR
204 im->sysconf.ddrcdr = CONFIG_SYS_DDRCDR;
Dave Liu24c3aca2006-12-07 21:13:15 +0800205#endif
Dave Liu19580e62007-09-18 12:37:57 +0800206 /* Output buffer impedance register */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200207#ifdef CONFIG_SYS_OBIR
208 im->sysconf.obir = CONFIG_SYS_OBIR;
Dave Liu19580e62007-09-18 12:37:57 +0800209#endif
Dave Liu24c3aca2006-12-07 21:13:15 +0800210
Dave Liu7737d5c2006-11-03 12:11:15 -0600211#ifdef CONFIG_QE
212 /* Config QE ioports */
213 config_qe_ioports();
214#endif
Eran Libertyf046ccd2005-07-28 10:08:46 -0500215
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
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200225#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;
Eran Libertyf046ccd2005-07-28 10:08:46 -0500233#else
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200234#error CONFIG_SYS_BR0_PRELIM, CONFIG_SYS_OR0_PRELIM, CONFIG_SYS_LBLAWBAR0_PRELIM & CONFIG_SYS_LBLAWAR0_PRELIM must be defined
Eran Libertyf046ccd2005-07-28 10:08:46 -0500235#endif
236
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200237#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;
Kumar Galac99f3842006-01-25 16:12:46 -0600240#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200241#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;
Eran Libertyf046ccd2005-07-28 10:08:46 -0500244#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200245#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;
Kumar Galac99f3842006-01-25 16:12:46 -0600248#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200249#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;
Eran Libertyf046ccd2005-07-28 10:08:46 -0500252#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200253#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;
Kumar Galac99f3842006-01-25 16:12:46 -0600256#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200257#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;
Eran Libertyf046ccd2005-07-28 10:08:46 -0500260#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200261#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;
Kumar Galac99f3842006-01-25 16:12:46 -0600264#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200265#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;
Eran Libertyf046ccd2005-07-28 10:08:46 -0500268#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200269#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;
Kumar Galac99f3842006-01-25 16:12:46 -0600272#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200273#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;
Eran Libertyf046ccd2005-07-28 10:08:46 -0500276#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200277#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;
Kumar Galac99f3842006-01-25 16:12:46 -0600280#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200281#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;
Eran Libertyf046ccd2005-07-28 10:08:46 -0500284#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200285#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;
Kumar Galac99f3842006-01-25 16:12:46 -0600288#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200289#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;
Eran Libertyf046ccd2005-07-28 10:08:46 -0500292#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200293#ifdef CONFIG_SYS_GPIO1_PRELIM
294 im->gpio[0].dat = CONFIG_SYS_GPIO1_DAT;
295 im->gpio[0].dir = CONFIG_SYS_GPIO1_DIR;
Kumar Galaa15b44d2006-01-11 11:21:14 -0600296#endif
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200297#ifdef CONFIG_SYS_GPIO2_PRELIM
298 im->gpio[1].dat = CONFIG_SYS_GPIO2_DAT;
299 im->gpio[1].dir = CONFIG_SYS_GPIO2_DIR;
Kumar Galaa15b44d2006-01-11 11:21:14 -0600300#endif
Vivek Mahajan4ef01012009-05-25 17:23:16 +0530301#ifdef CONFIG_USB_EHCI_FSL
Valeriy Glushkovd89e1c32009-06-30 15:48:40 +0300302#ifndef CONFIG_MPC834x
Vivek Mahajan4ef01012009-05-25 17:23:16 +0530303 uint32_t temp;
304 struct usb_ehci *ehci = (struct usb_ehci *)CONFIG_SYS_MPC8xxx_USB_ADDR;
305
306 /* Configure interface. */
Vivek Mahajandb7b43e2009-06-24 10:08:40 +0530307 setbits_be32(&ehci->control, REFSEL_16MHZ | UTMI_PHY_EN);
Vivek Mahajan4ef01012009-05-25 17:23:16 +0530308
309 /* Wait for clock to stabilize */
310 do {
Vivek Mahajandb7b43e2009-06-24 10:08:40 +0530311 temp = in_be32(&ehci->control);
Vivek Mahajan4ef01012009-05-25 17:23:16 +0530312 udelay(1000);
313 } while (!(temp & PHY_CLK_VALID));
314#endif
Valeriy Glushkovd89e1c32009-06-30 15:48:40 +0300315#endif
Eran Libertyf046ccd2005-07-28 10:08:46 -0500316}
317
Eran Libertyf046ccd2005-07-28 10:08:46 -0500318int cpu_init_r (void)
319{
Dave Liu7737d5c2006-11-03 12:11:15 -0600320#ifdef CONFIG_QE
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200321 uint qe_base = CONFIG_SYS_IMMR + 0x00100000; /* QE immr base */
Dave Liu7737d5c2006-11-03 12:11:15 -0600322 qe_init(qe_base);
323 qe_reset();
324#endif
Eran Libertyf046ccd2005-07-28 10:08:46 -0500325 return 0;
326}
Dave Liu9be39a62007-06-25 10:41:56 +0800327
328/*
Nick Spence46497052008-08-28 14:09:19 -0700329 * Print out the bus arbiter event
330 */
331#if defined(CONFIG_DISPLAY_AER_FULL)
332static 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
440static 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/*
Dave Liu9be39a62007-06-25 10:41:56 +0800453 * Figure out the cause of the reset
454 */
455int 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 }
Nick Spence46497052008-08-28 14:09:19 -0700484 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
Dave Liu9be39a62007-06-25 10:41:56 +0800491 return 0;
492}