blob: 8a4e76c0ffd7e08a77934d3eeb29a32ba5a2a4d0 [file] [log] [blame]
wdenkba56f622004-02-06 23:19:44 +00001/*
2 * Copyright (C) 2003 Travis B. Sawyer <travis.sawyer@sandburst.com>
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
24#include <common.h>
25#include <asm/processor.h>
26#include <spd_sdram.h>
27#include <i2c.h>
Wolfgang Denkd2567be2009-03-28 20:16:16 +010028#include <net.h>
wdenkba56f622004-02-06 23:19:44 +000029
Wolfgang Denkd87080b2006-03-31 18:32:53 +020030DECLARE_GLOBAL_DATA_PTR;
31
wdenk3c74e322004-02-22 23:46:08 +000032int board_early_init_f(void)
wdenkba56f622004-02-06 23:19:44 +000033{
34 unsigned long sdrreg;
35 /* TBS: Setup the GPIO access for the user LEDs */
36 mfsdr(sdr_pfc0, sdrreg);
37 mtsdr(sdr_pfc0, (sdrreg & ~0x00000100) | 0x00000E00);
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020038 out32(CONFIG_SYS_GPIO_BASE + 0x018, (USR_LED0 | USR_LED1 | USR_LED2 | USR_LED3));
wdenkba56f622004-02-06 23:19:44 +000039 LED0_OFF();
40 LED1_OFF();
41 LED2_OFF();
42 LED3_OFF();
43
44 /*--------------------------------------------------------------------
45 * Setup the external bus controller/chip selects
46 *-------------------------------------------------------------------*/
Peter Tyser11ad3092009-07-17 19:01:03 -050047 mtebc (pb0ap, 0x04055200); /* 16MB Strata FLASH */
48 mtebc (pb0cr, 0xff098000); /* BAS=0xff0 16MB R/W 8-bit */
49 mtebc (pb1ap, 0x04055200); /* 512KB Socketed AMD FLASH */
50 mtebc (pb1cr, 0xfe018000); /* BAS=0xfe0 1MB R/W 8-bit */
wdenkba56f622004-02-06 23:19:44 +000051
52 /*--------------------------------------------------------------------
53 * Setup the interrupt controller polarities, triggers, etc.
54 *-------------------------------------------------------------------*/
Stefan Roese5de85142008-06-26 17:36:39 +020055 /*
56 * Because of the interrupt handling rework to handle 440GX interrupts
57 * with the common code, we needed to change names of the UIC registers.
58 * Here the new relationship:
59 *
60 * U-Boot name 440GX name
61 * -----------------------
62 * UIC0 UICB0
63 * UIC1 UIC0
64 * UIC2 UIC1
65 * UIC3 UIC2
66 */
wdenkba56f622004-02-06 23:19:44 +000067 mtdcr (uic1sr, 0xffffffff); /* clear all */
68 mtdcr (uic1er, 0x00000000); /* disable all */
Stefan Roese5de85142008-06-26 17:36:39 +020069 mtdcr (uic1cr, 0x00000003); /* SMI & UIC1 crit are critical */
70 mtdcr (uic1pr, 0xfffffe00); /* per ref-board manual */
71 mtdcr (uic1tr, 0x01c00000); /* per ref-board manual */
wdenkba56f622004-02-06 23:19:44 +000072 mtdcr (uic1vr, 0x00000001); /* int31 highest, base=0x000 */
73 mtdcr (uic1sr, 0xffffffff); /* clear all */
74
75 mtdcr (uic2sr, 0xffffffff); /* clear all */
76 mtdcr (uic2er, 0x00000000); /* disable all */
77 mtdcr (uic2cr, 0x00000000); /* all non-critical */
Stefan Roese5de85142008-06-26 17:36:39 +020078 mtdcr (uic2pr, 0xffffc0ff); /* per ref-board manual */
79 mtdcr (uic2tr, 0x00ff8000); /* per ref-board manual */
wdenkba56f622004-02-06 23:19:44 +000080 mtdcr (uic2vr, 0x00000001); /* int31 highest, base=0x000 */
81 mtdcr (uic2sr, 0xffffffff); /* clear all */
82
Stefan Roese5de85142008-06-26 17:36:39 +020083 mtdcr (uic3sr, 0xffffffff); /* clear all */
84 mtdcr (uic3er, 0x00000000); /* disable all */
85 mtdcr (uic3cr, 0x00000000); /* all non-critical */
86 mtdcr (uic3pr, 0xffffffff); /* per ref-board manual */
87 mtdcr (uic3tr, 0x00ff8c0f); /* per ref-board manual */
88 mtdcr (uic3vr, 0x00000001); /* int31 highest, base=0x000 */
89 mtdcr (uic3sr, 0xffffffff); /* clear all */
90
91 mtdcr (uic0sr, 0xfc000000); /* clear all */
92 mtdcr (uic0er, 0x00000000); /* disable all */
93 mtdcr (uic0cr, 0x00000000); /* all non-critical */
94 mtdcr (uic0pr, 0xfc000000); /* */
95 mtdcr (uic0tr, 0x00000000); /* */
96 mtdcr (uic0vr, 0x00000001); /* */
wdenkba56f622004-02-06 23:19:44 +000097
98 LED0_ON();
99
100
101 return 0;
102}
103
104int checkboard (void)
105{
wdenkba56f622004-02-06 23:19:44 +0000106 printf ("Board: XES XPedite1000 440GX\n");
wdenkba56f622004-02-06 23:19:44 +0000107
108 return (0);
109}
110
111
Becky Bruce9973e3c2008-06-09 16:03:40 -0500112phys_size_t initdram (int board_type)
wdenkba56f622004-02-06 23:19:44 +0000113{
Peter Tyser108d6d02009-07-17 19:01:05 -0500114 return spd_sdram();
wdenkba56f622004-02-06 23:19:44 +0000115}
116
wdenkba56f622004-02-06 23:19:44 +0000117
118/*************************************************************************
119 * pci_pre_init
120 *
121 * This routine is called just prior to registering the hose and gives
122 * the board the opportunity to check things. Returning a value of zero
123 * indicates that things are bad & PCI initialization should be aborted.
124 *
125 * Different boards may wish to customize the pci controller structure
126 * (add regions, override default access routines, etc) or perform
127 * certain pre-initialization actions.
128 *
129 ************************************************************************/
Stefan Roese466fff12007-06-25 15:57:39 +0200130#if defined(CONFIG_PCI)
wdenkba56f622004-02-06 23:19:44 +0000131int pci_pre_init(struct pci_controller * hose )
132{
133 unsigned long strap;
wdenk3c74e322004-02-22 23:46:08 +0000134 /* See if we're supposed to setup the pci */
135 mfsdr(sdr_sdstp1, strap);
136 if ((strap & 0x00010000) == 0) {
137 return (0);
wdenkba56f622004-02-06 23:19:44 +0000138 }
139
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200140#if defined(CONFIG_SYS_PCI_FORCE_PCI_CONV)
wdenk3c74e322004-02-22 23:46:08 +0000141 /* Setup System Device Register PCIX0_XCR */
142 mfsdr(sdr_xcr, strap);
143 strap &= 0x0f000000;
144 mtsdr(sdr_xcr, strap);
145#endif
wdenkba56f622004-02-06 23:19:44 +0000146 return 1;
147}
Stefan Roese466fff12007-06-25 15:57:39 +0200148#endif /* defined(CONFIG_PCI) */
wdenkba56f622004-02-06 23:19:44 +0000149
150/*************************************************************************
151 * pci_target_init
152 *
153 * The bootstrap configuration provides default settings for the pci
154 * inbound map (PIM). But the bootstrap config choices are limited and
155 * may not be sufficient for a given board.
156 *
157 ************************************************************************/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200158#if defined(CONFIG_PCI) && defined(CONFIG_SYS_PCI_TARGET_INIT)
wdenkba56f622004-02-06 23:19:44 +0000159void pci_target_init(struct pci_controller * hose )
160{
wdenkba56f622004-02-06 23:19:44 +0000161 /*--------------------------------------------------------------------------+
162 * Disable everything
163 *--------------------------------------------------------------------------*/
164 out32r( PCIX0_PIM0SA, 0 ); /* disable */
165 out32r( PCIX0_PIM1SA, 0 ); /* disable */
166 out32r( PCIX0_PIM2SA, 0 ); /* disable */
167 out32r( PCIX0_EROMBA, 0 ); /* disable expansion rom */
168
169 /*--------------------------------------------------------------------------+
170 * Map all of SDRAM to PCI address 0x0000_0000. Note that the 440 strapping
171 * options to not support sizes such as 128/256 MB.
172 *--------------------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200173 out32r( PCIX0_PIM0LAL, CONFIG_SYS_SDRAM_BASE );
wdenkba56f622004-02-06 23:19:44 +0000174 out32r( PCIX0_PIM0LAH, 0 );
175 out32r( PCIX0_PIM0SA, ~(gd->ram_size - 1) | 1 );
176
177 out32r( PCIX0_BAR0, 0 );
178
179 /*--------------------------------------------------------------------------+
180 * Program the board's subsystem id/vendor id
181 *--------------------------------------------------------------------------*/
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200182 out16r( PCIX0_SBSYSVID, CONFIG_SYS_PCI_SUBSYS_VENDORID );
183 out16r( PCIX0_SBSYSID, CONFIG_SYS_PCI_SUBSYS_DEVICEID );
wdenkba56f622004-02-06 23:19:44 +0000184
185 out16r( PCIX0_CMD, in16r(PCIX0_CMD) | PCI_COMMAND_MEMORY );
186}
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200187#endif /* defined(CONFIG_PCI) && defined(CONFIG_SYS_PCI_TARGET_INIT) */
wdenkba56f622004-02-06 23:19:44 +0000188
189
190/*************************************************************************
191 * is_pci_host
192 *
193 * This routine is called to determine if a pci scan should be
194 * performed. With various hardware environments (especially cPCI and
195 * PPMC) it's insufficient to depend on the state of the arbiter enable
196 * bit in the strap register, or generic host/adapter assumptions.
197 *
198 * Rather than hard-code a bad assumption in the general 440 code, the
199 * 440 pci code requires the board to decide at runtime.
200 *
201 * Return 0 for adapter mode, non-zero for host (monarch) mode.
202 *
203 *
204 ************************************************************************/
205#if defined(CONFIG_PCI)
206int is_pci_host(struct pci_controller *hose)
207{
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200208 return ((in32(CONFIG_SYS_GPIO_BASE + 0x1C) & 0x00000800) == 0);
wdenkba56f622004-02-06 23:19:44 +0000209}
210#endif /* defined(CONFIG_PCI) */
211
212#ifdef CONFIG_POST
213/*
214 * Returns 1 if keys pressed to start the power-on long-running tests
215 * Called from board_init_f().
216 */
217int post_hotkeys_pressed(void)
218{
219
220 return (ctrlc());
221}
222
223void post_word_store (ulong a)
224{
225 volatile ulong *save_addr =
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200226 (volatile ulong *)(CONFIG_SYS_POST_WORD_ADDR);
wdenkba56f622004-02-06 23:19:44 +0000227
228 *save_addr = a;
229}
230
231ulong post_word_load (void)
232{
233 volatile ulong *save_addr =
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200234 (volatile ulong *)(CONFIG_SYS_POST_WORD_ADDR);
wdenkba56f622004-02-06 23:19:44 +0000235
236 return *save_addr;
237}
238#endif
239
240/*-----------------------------------------------------------------------------
241 * board_get_enetaddr -- Read the MAC Addresses in the I2C EEPROM
242 *-----------------------------------------------------------------------------
243 */
Mike Frysingerd8d21e62009-02-16 18:03:14 -0500244static int read_i2c;
245static void board_get_enetaddr(uchar *enet)
wdenkba56f622004-02-06 23:19:44 +0000246{
247 int i;
248 unsigned char buff[0x100], *cp;
249
Mike Frysingerd8d21e62009-02-16 18:03:14 -0500250 if (read_i2c)
251 return;
252
wdenkba56f622004-02-06 23:19:44 +0000253 /* Initialize I2C */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200254 i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
wdenkba56f622004-02-06 23:19:44 +0000255
256 /* Read 256 bytes in EEPROM */
257 i2c_read (0x50, 0, 1, buff, 0x100);
258
Mike Frysingerd8d21e62009-02-16 18:03:14 -0500259 cp = &buff[0xF4];
wdenkba56f622004-02-06 23:19:44 +0000260 for (i = 0; i < 6; i++,cp++)
261 enet[i] = *cp;
262
Mike Frysingerd8d21e62009-02-16 18:03:14 -0500263 printf("MAC address = %pM\n", enet);
264 read_i2c = 1;
265}
wdenkba56f622004-02-06 23:19:44 +0000266
Mike Frysingerd8d21e62009-02-16 18:03:14 -0500267int misc_init_r(void)
268{
269 uchar enetaddr[6], i2c_enetaddr[6];
270
271 if (!eth_getenv_enetaddr("ethaddr", enetaddr)) {
272 board_get_enetaddr(i2c_enetaddr);
Mike Frysinger0baeca42009-03-26 11:17:41 -0400273 eth_setenv_enetaddr("ethaddr", i2c_enetaddr);
Mike Frysingerd8d21e62009-02-16 18:03:14 -0500274 }
275
276#ifdef CONFIG_HAS_ETH1
277 if (!eth_getenv_enetaddr("eth1addr", enetaddr)) {
278 board_get_enetaddr(i2c_enetaddr);
Mike Frysinger0baeca42009-03-26 11:17:41 -0400279 eth_setenv_enetaddr("eth1addr", i2c_enetaddr);
Mike Frysingerd8d21e62009-02-16 18:03:14 -0500280 }
281#endif
282
283#ifdef CONFIG_HAS_ETH2
284 if (!eth_getenv_enetaddr("eth2addr", enetaddr)) {
285 board_get_enetaddr(i2c_enetaddr);
Mike Frysinger0baeca42009-03-26 11:17:41 -0400286 eth_setenv_enetaddr("eth2addr", i2c_enetaddr);
Mike Frysingerd8d21e62009-02-16 18:03:14 -0500287 }
288#endif
289
290#ifdef CONFIG_HAS_ETH3
291 if (!eth_getenv_enetaddr("eth3addr", enetaddr)) {
292 board_get_enetaddr(i2c_enetaddr);
Mike Frysinger0baeca42009-03-26 11:17:41 -0400293 eth_setenv_enetaddr("eth3addr", i2c_enetaddr);
Mike Frysingerd8d21e62009-02-16 18:03:14 -0500294 }
295#endif
296
297 return 0;
wdenkba56f622004-02-06 23:19:44 +0000298}