blob: f46aacfff89925db8c10e98321aa96ecfef5283a [file] [log] [blame]
Stefan Roese326c9712005-08-01 16:41:48 +02001/*
Stefan Roesefa257472007-10-15 11:29:33 +02002 * (C) Copyright 2006-2007
3 * Stefan Roese, DENX Software Engineering, sr@denx.de.
Stefan Roese326c9712005-08-01 16:41:48 +02004 *
Wolfgang Denkbd8ec7e2013-10-07 13:07:26 +02005 * SPDX-License-Identifier: GPL-2.0+
Stefan Roese326c9712005-08-01 16:41:48 +02006 */
7
8#include <common.h>
Stefan Roese247e9d72010-09-09 19:18:00 +02009#include <asm/ppc4xx.h>
Stefan Roese326c9712005-08-01 16:41:48 +020010#include <asm/processor.h>
Stefan Roesefa257472007-10-15 11:29:33 +020011#include <asm/io.h>
Stefan Roese326c9712005-08-01 16:41:48 +020012#include <spd_sdram.h>
Ira Snyder4dbd9762008-04-29 11:18:54 -070013#include <libfdt.h>
14#include <fdt_support.h>
Stefan Roese326c9712005-08-01 16:41:48 +020015
Wolfgang Denk6405a152006-03-31 18:32:53 +020016DECLARE_GLOBAL_DATA_PTR;
17
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +020018extern flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; /* info for FLASH chips */
Stefan Roese1d026382005-08-11 18:03:14 +020019
Stefan Roese3559a872009-10-19 14:14:08 +020020static inline u32 get_async_pci_freq(void)
21{
22 if (in_8((void *)(CONFIG_SYS_BCSR_BASE + 5)) &
23 CONFIG_SYS_BCSR5_PCI66EN)
24 return 66666666;
25 else
26 return 33333333;
27}
28
Stefan Roese326c9712005-08-01 16:41:48 +020029int board_early_init_f(void)
30{
31 register uint reg;
32
33 /*--------------------------------------------------------------------
34 * Setup the external bus controller/chip selects
35 *-------------------------------------------------------------------*/
Stefan Roese918010a2009-09-09 16:25:29 +020036 mtdcr(EBC0_CFGADDR, EBC0_CFG);
37 reg = mfdcr(EBC0_CFGDATA);
38 mtdcr(EBC0_CFGDATA, reg | 0x04000000); /* Set ATC */
Stefan Roese326c9712005-08-01 16:41:48 +020039
Stefan Roese326c9712005-08-01 16:41:48 +020040 /*--------------------------------------------------------------------
Stefan Roese326c9712005-08-01 16:41:48 +020041 * Setup the GPIO pins
42 *-------------------------------------------------------------------*/
43 /*CPLD cs */
Stefan Roesee75a8a12005-12-15 09:43:12 +010044 /*setup Address lines for flash size 64Meg. */
45 out32(GPIO0_OSRL, in32(GPIO0_OSRL) | 0x50010000);
46 out32(GPIO0_TSRL, in32(GPIO0_TSRL) | 0x50010000);
47 out32(GPIO0_ISR1L, in32(GPIO0_ISR1L) | 0x50000000);
Stefan Roese326c9712005-08-01 16:41:48 +020048
49 /*setup emac */
50 out32(GPIO0_TCR, in32(GPIO0_TCR) | 0xC080);
51 out32(GPIO0_TSRL, in32(GPIO0_TSRL) | 0x40);
52 out32(GPIO0_ISR1L, in32(GPIO0_ISR1L) | 0x55);
53 out32(GPIO0_OSRH, in32(GPIO0_OSRH) | 0x50004000);
54 out32(GPIO0_ISR1H, in32(GPIO0_ISR1H) | 0x00440000);
55
56 /*UART1 */
57 out32(GPIO1_TCR, in32(GPIO1_TCR) | 0x02000000);
58 out32(GPIO1_OSRL, in32(GPIO1_OSRL) | 0x00080000);
59 out32(GPIO1_ISR2L, in32(GPIO1_ISR2L) | 0x00010000);
60
Stefan Roesed0ab2f32005-10-28 12:21:06 +020061 /* external interrupts IRQ0...3 */
Wolfgang Denkfd983682006-05-30 17:45:30 +020062 out32(GPIO1_TCR, in32(GPIO1_TCR) & ~0x00f00000);
63 out32(GPIO1_TSRL, in32(GPIO1_TSRL) & ~0x0000ff00);
Stefan Roesed0ab2f32005-10-28 12:21:06 +020064 out32(GPIO1_ISR1L, in32(GPIO1_ISR1L) | 0x00005500);
65
Stefan Roeseb1669da2007-01-30 17:04:19 +010066#ifdef CONFIG_440EP
Stefan Roese326c9712005-08-01 16:41:48 +020067 /*setup USB 2.0 */
68 out32(GPIO1_TCR, in32(GPIO1_TCR) | 0xc0000000);
69 out32(GPIO1_OSRL, in32(GPIO1_OSRL) | 0x50000000);
70 out32(GPIO0_TCR, in32(GPIO0_TCR) | 0xf);
71 out32(GPIO0_OSRH, in32(GPIO0_OSRH) | 0xaa);
72 out32(GPIO0_ISR2H, in32(GPIO0_ISR2H) | 0x00000500);
Stefan Roeseb1669da2007-01-30 17:04:19 +010073#endif
Stefan Roese326c9712005-08-01 16:41:48 +020074
75 /*--------------------------------------------------------------------
Stefan Roese65a6b7e2005-11-03 08:31:33 +010076 * Setup the interrupt controller polarities, triggers, etc.
77 *-------------------------------------------------------------------*/
Stefan Roese707fd362009-09-24 09:55:50 +020078 mtdcr(UIC0SR, 0xffffffff); /* clear all */
79 mtdcr(UIC0ER, 0x00000000); /* disable all */
80 mtdcr(UIC0CR, 0x00000009); /* ATI & UIC1 crit are critical */
81 mtdcr(UIC0PR, 0xfffffe13); /* per ref-board manual */
82 mtdcr(UIC0TR, 0x01c00008); /* per ref-board manual */
83 mtdcr(UIC0VR, 0x00000001); /* int31 highest, base=0x000 */
84 mtdcr(UIC0SR, 0xffffffff); /* clear all */
Stefan Roese65a6b7e2005-11-03 08:31:33 +010085
Stefan Roese707fd362009-09-24 09:55:50 +020086 mtdcr(UIC1SR, 0xffffffff); /* clear all */
87 mtdcr(UIC1ER, 0x00000000); /* disable all */
88 mtdcr(UIC1CR, 0x00000000); /* all non-critical */
89 mtdcr(UIC1PR, 0xffffe0ff); /* per ref-board manual */
90 mtdcr(UIC1TR, 0x00ffc000); /* per ref-board manual */
91 mtdcr(UIC1VR, 0x00000001); /* int31 highest, base=0x000 */
92 mtdcr(UIC1SR, 0xffffffff); /* clear all */
Stefan Roese65a6b7e2005-11-03 08:31:33 +010093
94 /*--------------------------------------------------------------------
Stefan Roese326c9712005-08-01 16:41:48 +020095 * Setup other serial configuration
96 *-------------------------------------------------------------------*/
Stefan Roese918010a2009-09-09 16:25:29 +020097 mfsdr(SDR0_PCI0, reg);
98 mtsdr(SDR0_PCI0, 0x80000000 | reg); /* PCI arbiter enabled */
99 mtsdr(SDR0_PFC0, 0x00003e00); /* Pin function */
100 mtsdr(SDR0_PFC1, 0x00048000); /* Pin function: UART0 has 4 pins */
Stefan Roese326c9712005-08-01 16:41:48 +0200101
Stefan Roese3559a872009-10-19 14:14:08 +0200102 /* Check and reconfigure the PCI sync clock if necessary */
103 ppc4xx_pci_sync_clock_config(get_async_pci_freq());
104
Stefan Roese326c9712005-08-01 16:41:48 +0200105 /*clear tmrclk divisor */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200106 *(unsigned char *)(CONFIG_SYS_BCSR_BASE | 0x04) = 0x00;
Stefan Roese326c9712005-08-01 16:41:48 +0200107
108 /*enable ethernet */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200109 *(unsigned char *)(CONFIG_SYS_BCSR_BASE | 0x08) = 0xf0;
Stefan Roese326c9712005-08-01 16:41:48 +0200110
Stefan Roeseb1669da2007-01-30 17:04:19 +0100111#ifdef CONFIG_440EP
Stefan Roese326c9712005-08-01 16:41:48 +0200112 /*enable usb 1.1 fs device and remove usb 2.0 reset */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200113 *(unsigned char *)(CONFIG_SYS_BCSR_BASE | 0x09) = 0x00;
Stefan Roeseb1669da2007-01-30 17:04:19 +0100114#endif
Stefan Roese326c9712005-08-01 16:41:48 +0200115
116 /*get rid of flash write protect */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200117 *(unsigned char *)(CONFIG_SYS_BCSR_BASE | 0x07) = 0x00;
Stefan Roese326c9712005-08-01 16:41:48 +0200118
119 return 0;
120}
121
Stefan Roese1d026382005-08-11 18:03:14 +0200122int misc_init_r (void)
123{
Stefan Roese1d026382005-08-11 18:03:14 +0200124 uint pbcr;
125 int size_val = 0;
126
127 /* Re-do sizing to get full correct info */
Stefan Roese918010a2009-09-09 16:25:29 +0200128 mtdcr(EBC0_CFGADDR, PB0CR);
129 pbcr = mfdcr(EBC0_CFGDATA);
Stefan Roese1d026382005-08-11 18:03:14 +0200130 switch (gd->bd->bi_flashsize) {
131 case 1 << 20:
132 size_val = 0;
133 break;
134 case 2 << 20:
135 size_val = 1;
136 break;
137 case 4 << 20:
138 size_val = 2;
139 break;
140 case 8 << 20:
141 size_val = 3;
142 break;
143 case 16 << 20:
144 size_val = 4;
145 break;
146 case 32 << 20:
147 size_val = 5;
148 break;
149 case 64 << 20:
150 size_val = 6;
151 break;
152 case 128 << 20:
153 size_val = 7;
154 break;
155 }
156 pbcr = (pbcr & 0x0001ffff) | gd->bd->bi_flashstart | (size_val << 17);
Stefan Roese918010a2009-09-09 16:25:29 +0200157 mtdcr(EBC0_CFGADDR, PB0CR);
158 mtdcr(EBC0_CFGDATA, pbcr);
Stefan Roese1d026382005-08-11 18:03:14 +0200159
Stefan Roesee8c34722005-11-05 15:50:16 +0100160 /* adjust flash start and offset */
161 gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize;
162 gd->bd->bi_flashoffset = 0;
163
Stefan Roese1d026382005-08-11 18:03:14 +0200164 /* Monitor protection ON by default */
165 (void)flash_protect(FLAG_PROTECT_SET,
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200166 -CONFIG_SYS_MONITOR_LEN,
Stefan Roese1d026382005-08-11 18:03:14 +0200167 0xffffffff,
168 &flash_info[0]);
169
170 return 0;
171}
172
Stefan Roese326c9712005-08-01 16:41:48 +0200173int checkboard(void)
174{
Wolfgang Denk5c1cfee2011-05-04 10:32:28 +0000175 char buf[64];
176 int i = getenv_f("serial#", buf, sizeof(buf));
Stefan Roesec0958942007-01-13 07:59:19 +0100177 u8 rev;
Stefan Roese3559a872009-10-19 14:14:08 +0200178 u32 clock = get_async_pci_freq();
Stefan Roese326c9712005-08-01 16:41:48 +0200179
Stefan Roeseb1669da2007-01-30 17:04:19 +0100180#ifdef CONFIG_440EP
Stefan Roese5b9ab142005-10-03 15:27:50 +0200181 printf("Board: Yosemite - AMCC PPC440EP Evaluation Board");
Stefan Roeseb1669da2007-01-30 17:04:19 +0100182#else
183 printf("Board: Yellowstone - AMCC PPC440GR Evaluation Board");
184#endif
Stefan Roesec0958942007-01-13 07:59:19 +0100185
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200186 rev = in_8((void *)(CONFIG_SYS_BCSR_BASE + 0));
Stefan Roese3559a872009-10-19 14:14:08 +0200187 printf(", Rev. %X, PCI-Async=%d MHz", rev, clock / 1000000);
Stefan Roesec0958942007-01-13 07:59:19 +0100188
Wolfgang Denk5c1cfee2011-05-04 10:32:28 +0000189 if (i > 0) {
Stefan Roese5b9ab142005-10-03 15:27:50 +0200190 puts(", serial# ");
Wolfgang Denk5c1cfee2011-05-04 10:32:28 +0000191 puts(buf);
Stefan Roese5b9ab142005-10-03 15:27:50 +0200192 }
193 putc('\n');
194
Stefan Roese3559a872009-10-19 14:14:08 +0200195 /*
196 * Reconfiguration of the PCI sync clock is already done,
197 * now check again if everything is in range:
198 */
199 if (ppc4xx_pci_sync_clock_config(clock)) {
200 printf("ERROR: PCI clocking incorrect (async=%d "
201 "sync=%ld)!\n", clock, get_PCI_freq());
202 }
203
Stefan Roese326c9712005-08-01 16:41:48 +0200204 return (0);
205}
206
207/*************************************************************************
Simon Glassd35f3382017-04-06 12:47:05 -0600208 * dram_init -- doesn't use serial presence detect.
Stefan Roese326c9712005-08-01 16:41:48 +0200209 *
210 * Assumes: 256 MB, ECC, non-registered
211 * PLB @ 133 MHz
212 *
213 ************************************************************************/
Stefan Roesee75a8a12005-12-15 09:43:12 +0100214#define NUM_TRIES 64
215#define NUM_READS 10
216
217void sdram_tr1_set(int ram_address, int* tr1_value)
218{
219 int i;
220 int j, k;
221 volatile unsigned int* ram_pointer = (unsigned int*)ram_address;
222 int first_good = -1, last_bad = 0x1ff;
223
224 unsigned long test[NUM_TRIES] = {
225 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
226 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
227 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
228 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
229 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
230 0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
231 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
232 0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
233 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
234 0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
235 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
236 0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
237 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
238 0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
239 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
240 0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55 };
241
242 /* go through all possible SDRAM0_TR1[RDCT] values */
243 for (i=0; i<=0x1ff; i++) {
244 /* set the current value for TR1 */
Stefan Roese6987e652009-09-24 13:59:57 +0200245 mtsdram(SDRAM0_TR1, (0x80800800 | i));
Stefan Roesee75a8a12005-12-15 09:43:12 +0100246
247 /* write values */
248 for (j=0; j<NUM_TRIES; j++) {
249 ram_pointer[j] = test[j];
250
251 /* clear any cache at ram location */
252 __asm__("dcbf 0,%0": :"r" (&ram_pointer[j]));
253 }
254
255 /* read values back */
256 for (j=0; j<NUM_TRIES; j++) {
257 for (k=0; k<NUM_READS; k++) {
258 /* clear any cache at ram location */
259 __asm__("dcbf 0,%0": :"r" (&ram_pointer[j]));
260
261 if (ram_pointer[j] != test[j])
262 break;
263 }
264
265 /* read error */
266 if (k != NUM_READS) {
267 break;
268 }
269 }
270
271 /* we have a SDRAM0_TR1[RDCT] that is part of the window */
272 if (j == NUM_TRIES) {
273 if (first_good == -1)
274 first_good = i; /* found beginning of window */
275 } else { /* bad read */
276 /* if we have not had a good read then don't care */
277 if(first_good != -1) {
278 /* first failure after a good read */
279 last_bad = i-1;
280 break;
281 }
282 }
283 }
284
285 /* return the current value for TR1 */
286 *tr1_value = (first_good + last_bad) / 2;
287}
288
Simon Glassd35f3382017-04-06 12:47:05 -0600289int dram_init(void)
Stefan Roese326c9712005-08-01 16:41:48 +0200290{
291 register uint reg;
Stefan Roesee75a8a12005-12-15 09:43:12 +0100292 int tr1_bank1, tr1_bank2;
Stefan Roese326c9712005-08-01 16:41:48 +0200293
294 /*--------------------------------------------------------------------
295 * Setup some default
296 *------------------------------------------------------------------*/
Stefan Roese6987e652009-09-24 13:59:57 +0200297 mtsdram(SDRAM0_UABBA, 0x00000000); /* ubba=0 (default) */
298 mtsdram(SDRAM0_SLIO, 0x00000000); /* rdre=0 wrre=0 rarw=0 */
299 mtsdram(SDRAM0_DEVOPT, 0x00000000); /* dll=0 ds=0 (normal) */
300 mtsdram(SDRAM0_CLKTR, 0x40000000); /* ?? */
301 mtsdram(SDRAM0_WDDCTR, 0x40000000); /* ?? */
Stefan Roese326c9712005-08-01 16:41:48 +0200302
303 /*clear this first, if the DDR is enabled by a debugger
Stefan Roesee75a8a12005-12-15 09:43:12 +0100304 then you can not make changes. */
Stefan Roese6987e652009-09-24 13:59:57 +0200305 mtsdram(SDRAM0_CFG0, 0x00000000); /* Disable EEC */
Stefan Roese326c9712005-08-01 16:41:48 +0200306
307 /*--------------------------------------------------------------------
308 * Setup for board-specific specific mem
309 *------------------------------------------------------------------*/
310 /*
311 * Following for CAS Latency = 2.5 @ 133 MHz PLB
312 */
Stefan Roese6987e652009-09-24 13:59:57 +0200313 mtsdram(SDRAM0_B0CR, 0x000a4001); /* SDBA=0x000 128MB, Mode 3, enabled */
314 mtsdram(SDRAM0_B1CR, 0x080a4001); /* SDBA=0x080 128MB, Mode 3, enabled */
Stefan Roese326c9712005-08-01 16:41:48 +0200315
Stefan Roese6987e652009-09-24 13:59:57 +0200316 mtsdram(SDRAM0_TR0, 0x410a4012); /* ?? */
317 mtsdram(SDRAM0_RTR, 0x04080000); /* ?? */
318 mtsdram(SDRAM0_CFG1, 0x00000000); /* Self-refresh exit, disable PM */
319 mtsdram(SDRAM0_CFG0, 0x30000000); /* Disable EEC */
Stefan Roese326c9712005-08-01 16:41:48 +0200320 udelay(400); /* Delay 200 usecs (min) */
321
322 /*--------------------------------------------------------------------
323 * Enable the controller, then wait for DCEN to complete
324 *------------------------------------------------------------------*/
Stefan Roese6987e652009-09-24 13:59:57 +0200325 mtsdram(SDRAM0_CFG0, 0x80000000); /* Enable */
Stefan Roese326c9712005-08-01 16:41:48 +0200326
327 for (;;) {
Stefan Roese6987e652009-09-24 13:59:57 +0200328 mfsdram(SDRAM0_MCSTS, reg);
Stefan Roese326c9712005-08-01 16:41:48 +0200329 if (reg & 0x80000000)
330 break;
331 }
Stefan Roesee75a8a12005-12-15 09:43:12 +0100332
333 sdram_tr1_set(0x00000000, &tr1_bank1);
334 sdram_tr1_set(0x08000000, &tr1_bank2);
Stefan Roese6987e652009-09-24 13:59:57 +0200335 mtsdram(SDRAM0_TR1, (((tr1_bank1+tr1_bank2)/2) | 0x80800800));
Stefan Roese326c9712005-08-01 16:41:48 +0200336
Simon Glass39f90ba2017-03-31 08:40:25 -0600337 gd->ram_size = CONFIG_SYS_SDRAM_BANKS *
338 (CONFIG_SYS_KBYTES_SDRAM * 1024); /* set bytes */
339
340 return 0;
Stefan Roese326c9712005-08-01 16:41:48 +0200341}
Stefan Roese326c9712005-08-01 16:41:48 +0200342
343/*************************************************************************
Stefan Roese326c9712005-08-01 16:41:48 +0200344 * hw_watchdog_reset
345 *
346 * This routine is called to reset (keep alive) the watchdog timer
347 *
348 ************************************************************************/
349#if defined(CONFIG_HW_WATCHDOG)
350void hw_watchdog_reset(void)
351{
352
353}
354#endif
Stefan Roese03687752006-10-07 11:30:52 +0200355
356void board_reset(void)
357{
358 /* give reset to BCSR */
Jean-Christophe PLAGNIOL-VILLARD03836942008-10-16 15:01:15 +0200359 *(unsigned char *)(CONFIG_SYS_BCSR_BASE | 0x06) = 0x09;
Stefan Roese03687752006-10-07 11:30:52 +0200360}