xpedite1000.c 6.9 KB
Newer Older
W
wdenk 已提交
1
/*
P
Peter Tyser 已提交
2
 * Copyright (C) 2003 Travis B. Sawyer <travis.sawyer@sandburst.com>
W
wdenk 已提交
3 4 5 6 7 8 9 10 11 12 13
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
P
Peter Tyser 已提交
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
W
wdenk 已提交
15 16 17 18 19 20 21 22 23 24 25 26
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <common.h>
#include <asm/processor.h>
#include <spd_sdram.h>
#include <i2c.h>
27
#include <net.h>
W
wdenk 已提交
28

29 30
DECLARE_GLOBAL_DATA_PTR;

W
wdenk 已提交
31
int board_early_init_f(void)
W
wdenk 已提交
32 33
{
	unsigned long sdrreg;
P
Peter Tyser 已提交
34

35 36 37 38 39 40 41 42 43 44
	/*
	 * Enable GPIO for pins 18 - 24
	 * 18 = SEEPROM_WP
	 * 19 = #M_RST
	 * 20 = #MONARCH
	 * 21 = #LED_ALARM
	 * 22 = #LED_ACT
	 * 23 = #LED_STATUS1
	 * 24 = #LED_STATUS2
	 */
W
wdenk 已提交
45
	mfsdr(sdr_pfc0, sdrreg);
46
	mtsdr(sdr_pfc0, (sdrreg & ~SDR0_PFC0_TRE_ENABLE) | 0x00003e00);
47
	out32(CONFIG_SYS_GPIO_BASE + 0x018, (USR_LED0 | USR_LED1 | USR_LED2 | USR_LED3));
W
wdenk 已提交
48 49 50 51 52
	LED0_OFF();
	LED1_OFF();
	LED2_OFF();
	LED3_OFF();

P
Peter Tyser 已提交
53 54 55 56 57
	/* Setup the external bus controller/chip selects */
	mtebc(pb0ap, 0x04055200);	/* 16MB Strata FLASH */
	mtebc(pb0cr, 0xff098000);	/* BAS=0xff0 16MB R/W 8-bit */
	mtebc(pb1ap, 0x04055200);	/* 512KB Socketed AMD FLASH */
	mtebc(pb1cr, 0xfe018000);	/* BAS=0xfe0 1MB R/W 8-bit */
58 59 60 61
	mtebc(pb6ap, 0x05006400);	/* 32-64MB AMD MirrorBit FLASH */
	mtebc(pb6cr, 0xf00da000);	/* BAS=0xf00 64MB R/W i6-bit */
	mtebc(pb7ap, 0x05006400);	/* 32-64MB AMD MirrorBit FLASH */
	mtebc(pb7cr, 0xf40da000);	/* BAS=0xf40 64MB R/W 16-bit */
W
wdenk 已提交
62

S
Stefan Roese 已提交
63
	/*
P
Peter Tyser 已提交
64 65
	 * Setup the interrupt controller polarities, triggers, etc.
	 *
S
Stefan Roese 已提交
66 67 68 69 70 71 72 73 74 75 76
	 * Because of the interrupt handling rework to handle 440GX interrupts
	 * with the common code, we needed to change names of the UIC registers.
	 * Here the new relationship:
	 *
	 * U-Boot name	440GX name
	 * -----------------------
	 * UIC0		UICB0
	 * UIC1		UIC0
	 * UIC2		UIC1
	 * UIC3		UIC2
	 */
P
Peter Tyser 已提交
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
	mtdcr(uic1sr, 0xffffffff);	/* clear all */
	mtdcr(uic1er, 0x00000000);	/* disable all */
	mtdcr(uic1cr, 0x00000003);	/* SMI & UIC1 crit are critical */
	mtdcr(uic1pr, 0xfffffe00);	/* per ref-board manual */
	mtdcr(uic1tr, 0x01c00000);	/* per ref-board manual */
	mtdcr(uic1vr, 0x00000001);	/* int31 highest, base=0x000 */
	mtdcr(uic1sr, 0xffffffff);	/* clear all */

	mtdcr(uic2sr, 0xffffffff);	/* clear all */
	mtdcr(uic2er, 0x00000000);	/* disable all */
	mtdcr(uic2cr, 0x00000000);	/* all non-critical */
	mtdcr(uic2pr, 0xffffc0ff);	/* per ref-board manual */
	mtdcr(uic2tr, 0x00ff8000);	/* per ref-board manual */
	mtdcr(uic2vr, 0x00000001);	/* int31 highest, base=0x000 */
	mtdcr(uic2sr, 0xffffffff);	/* clear all */

	mtdcr(uic3sr, 0xffffffff);	/* clear all */
	mtdcr(uic3er, 0x00000000);	/* disable all */
	mtdcr(uic3cr, 0x00000000);	/* all non-critical */
	mtdcr(uic3pr, 0xffffffff);	/* per ref-board manual */
	mtdcr(uic3tr, 0x00ff8c0f);	/* per ref-board manual */
	mtdcr(uic3vr, 0x00000001);	/* int31 highest, base=0x000 */
	mtdcr(uic3sr, 0xffffffff);	/* clear all */

	mtdcr(uic0sr, 0xfc000000);	/* clear all */
	mtdcr(uic0er, 0x00000000);	/* disable all */
	mtdcr(uic0cr, 0x00000000);	/* all non-critical */
	mtdcr(uic0pr, 0xfc000000);	/* */
	mtdcr(uic0tr, 0x00000000);	/* */
	mtdcr(uic0vr, 0x00000001);	/* */
W
wdenk 已提交
107 108 109 110 111 112

	LED0_ON();

	return 0;
}

P
Peter Tyser 已提交
113
int checkboard(void)
W
wdenk 已提交
114
{
115 116 117 118 119 120 121 122 123 124 125 126 127 128
	char *s;

	printf("Board: X-ES %s PMC SBC\n", CONFIG_SYS_BOARD_NAME);
	printf("       ");
	s = getenv("board_rev");
	if (s)
		printf("Rev %s, ", s);
	s = getenv("serial#");
	if (s)
		printf("Serial# %s, ", s);
	s = getenv("board_cfg");
	if (s)
		printf("Cfg %s", s);
	printf("\n");
W
wdenk 已提交
129

P
Peter Tyser 已提交
130
	return 0;
W
wdenk 已提交
131 132
}

P
Peter Tyser 已提交
133
phys_size_t initdram(int board_type)
W
wdenk 已提交
134
{
135
	return spd_sdram();
W
wdenk 已提交
136 137
}

P
Peter Tyser 已提交
138 139 140 141
/*
 * This routine is called just prior to registering the hose and gives
 * the board the opportunity to check things. Returning a value of zero
 * indicates that things are bad & PCI initialization should be aborted.
W
wdenk 已提交
142
 *
P
Peter Tyser 已提交
143 144 145 146 147
 * Different boards may wish to customize the pci controller structure
 * (add regions, override default access routines, etc) or perform
 * certain pre-initialization actions.
 */

148
#if defined(CONFIG_PCI)
P
Peter Tyser 已提交
149
int pci_pre_init(struct pci_controller * hose)
W
wdenk 已提交
150 151
{
	unsigned long strap;
P
Peter Tyser 已提交
152

W
wdenk 已提交
153 154
	/* See if we're supposed to setup the pci */
	mfsdr(sdr_sdstp1, strap);
P
Peter Tyser 已提交
155 156
	if ((strap & 0x00010000) == 0)
		return 0;
W
wdenk 已提交
157

158
#if defined(CONFIG_SYS_PCI_FORCE_PCI_CONV)
W
wdenk 已提交
159 160 161 162 163
	/* Setup System Device Register PCIX0_XCR */
	mfsdr(sdr_xcr, strap);
	strap &= 0x0f000000;
	mtsdr(sdr_xcr, strap);
#endif
P
Peter Tyser 已提交
164

W
wdenk 已提交
165 166
	return 1;
}
167
#endif /* defined(CONFIG_PCI) */
W
wdenk 已提交
168

169
#if defined(CONFIG_PCI) && defined(CONFIG_SYS_PCI_TARGET_INIT)
P
Peter Tyser 已提交
170 171 172 173 174 175
/*
 * The bootstrap configuration provides default settings for the pci
 * inbound map (PIM). But the bootstrap config choices are limited and
 * may not be sufficient for a given board.
 */
void pci_target_init(struct pci_controller * hose)
W
wdenk 已提交
176
{
P
Peter Tyser 已提交
177 178 179 180 181 182 183
	/* Disable everything */
	out32r(PCIX0_PIM0SA, 0);
	out32r(PCIX0_PIM1SA, 0);
	out32r(PCIX0_PIM2SA, 0);
	out32r(PCIX0_EROMBA, 0); /* disable expansion rom */

	/*
W
wdenk 已提交
184 185
	 * Map all of SDRAM to PCI address 0x0000_0000. Note that the 440 strapping
	 * options to not support sizes such as 128/256 MB.
P
Peter Tyser 已提交
186 187 188 189
	 */
	out32r(PCIX0_PIM0LAL, CONFIG_SYS_SDRAM_BASE);
	out32r(PCIX0_PIM0LAH, 0);
	out32r(PCIX0_PIM0SA, ~(gd->ram_size - 1) | 1);
W
wdenk 已提交
190

P
Peter Tyser 已提交
191
	out32r(PCIX0_BAR0, 0);
W
wdenk 已提交
192

P
Peter Tyser 已提交
193 194 195
	/* Program the board's subsystem id/vendor id */
	out16r(PCIX0_SBSYSVID, CONFIG_SYS_PCI_SUBSYS_VENDORID);
	out16r(PCIX0_SBSYSID, CONFIG_SYS_PCI_SUBSYS_DEVICEID);
W
wdenk 已提交
196

P
Peter Tyser 已提交
197
	out16r(PCIX0_CMD, in16r(PCIX0_CMD) | PCI_COMMAND_MEMORY);
W
wdenk 已提交
198
}
199
#endif /* defined(CONFIG_PCI) && defined(CONFIG_SYS_PCI_TARGET_INIT) */
W
wdenk 已提交
200

P
Peter Tyser 已提交
201 202 203 204 205 206
#if defined(CONFIG_PCI)
/*
 * This routine is called to determine if a pci scan should be
 * performed. With various hardware environments (especially cPCI and
 * PPMC) it's insufficient to depend on the state of the arbiter enable
 * bit in the strap register, or generic host/adapter assumptions.
W
wdenk 已提交
207
 *
P
Peter Tyser 已提交
208 209
 * Rather than hard-code a bad assumption in the general 440 code, the
 * 440 pci code requires the board to decide at runtime.
W
wdenk 已提交
210
 *
P
Peter Tyser 已提交
211 212
 * Return 0 for adapter mode, non-zero for host (monarch) mode.
 */
W
wdenk 已提交
213 214
int is_pci_host(struct pci_controller *hose)
{
215
	return ((in32(CONFIG_SYS_GPIO_BASE + 0x1C) & 0x00000800) == 0);
W
wdenk 已提交
216 217 218 219 220 221 222 223 224 225
}
#endif /* defined(CONFIG_PCI) */

#ifdef CONFIG_POST
/*
 * Returns 1 if keys pressed to start the power-on long-running tests
 * Called from board_init_f().
 */
int post_hotkeys_pressed(void)
{
P
Peter Tyser 已提交
226
	return ctrlc();
W
wdenk 已提交
227 228
}

P
Peter Tyser 已提交
229
void post_word_store(ulong a)
W
wdenk 已提交
230 231
{
	volatile ulong *save_addr =
232
		(volatile ulong *)(CONFIG_SYS_POST_WORD_ADDR);
W
wdenk 已提交
233 234 235 236

	*save_addr = a;
}

P
Peter Tyser 已提交
237
ulong post_word_load(void)
W
wdenk 已提交
238 239
{
	volatile ulong *save_addr =
240
		(volatile ulong *)(CONFIG_SYS_POST_WORD_ADDR);
W
wdenk 已提交
241 242 243

	return *save_addr;
}
P
Peter Tyser 已提交
244
#endif