sbc8548.c 8.9 KB
Newer Older
1
/*
2 3
 * Copyright 2007,2009 Wind River Systems, Inc. <www.windriver.com>
 *
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
 * Copyright 2007 Embedded Specialties, Inc.
 *
 * Copyright 2004, 2007 Freescale Semiconductor.
 *
 * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com>
 *
 * 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
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
 * 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 <pci.h>
#include <asm/processor.h>
#include <asm/immap_85xx.h>
33
#include <asm/fsl_pci.h>
34
#include <asm/fsl_ddr_sdram.h>
35
#include <asm/fsl_serdes.h>
36
#include <spd_sdram.h>
37 38
#include <netdev.h>
#include <tsec.h>
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#include <miiphy.h>
#include <libfdt.h>
#include <fdt_support.h>

DECLARE_GLOBAL_DATA_PTR;

void local_bus_init(void);

int board_early_init_f (void)
{
	return 0;
}

int checkboard (void)
{
54 55
	volatile ccsr_local_ecm_t *ecm = (void *)(CONFIG_SYS_MPC85xx_ECM_ADDR);
	volatile u_char *rev= (void *)CONFIG_SYS_BD_REV;
56 57

	printf ("Board: Wind River SBC8548 Rev. 0x%01x\n",
P
Paul Gortmaker 已提交
58
			in_8(rev) >> 4);
59 60 61 62 63 64

	/*
	 * Initialize local bus.
	 */
	local_bus_init ();

P
Paul Gortmaker 已提交
65 66
	out_be32(&ecm->eedr, 0xffffffff);	/* clear ecm errors */
	out_be32(&ecm->eeer, 0xffffffff);	/* enable ecm errors */
67 68 69 70 71 72 73 74 75
	return 0;
}

/*
 * Initialize Local Bus
 */
void
local_bus_init(void)
{
76
	volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
77
	volatile fsl_lbc_t *lbc = LBC_BASE_ADDR;
78 79 80 81 82 83

	uint clkdiv;
	uint lbc_hz;
	sys_info_t sysinfo;

	get_sys_info(&sysinfo);
P
Paul Gortmaker 已提交
84
	clkdiv = (in_be32(&lbc->lcrr) & LCRR_CLKDIV) * 2;
85 86
	lbc_hz = sysinfo.freqSystemBus / 1000000 / clkdiv;

P
Paul Gortmaker 已提交
87
	out_be32(&gur->lbiuiplldcr1, 0x00078080);
88
	if (clkdiv == 16) {
P
Paul Gortmaker 已提交
89
		out_be32(&gur->lbiuiplldcr0, 0x7c0f1bf0);
90
	} else if (clkdiv == 8) {
P
Paul Gortmaker 已提交
91
		out_be32(&gur->lbiuiplldcr0, 0x6c0f1bf0);
92
	} else if (clkdiv == 4) {
P
Paul Gortmaker 已提交
93
		out_be32(&gur->lbiuiplldcr0, 0x5c0f1bf0);
94 95
	}

P
Paul Gortmaker 已提交
96
	setbits_be32(&lbc->lcrr, 0x00030000);
97 98 99

	asm("sync;isync;msync");

P
Paul Gortmaker 已提交
100 101
	out_be32(&lbc->ltesr, 0xffffffff);	/* Clear LBC error IRQs */
	out_be32(&lbc->lteir, 0xffffffff);	/* Enable LBC error IRQs */
102 103 104 105 106 107 108 109
}

/*
 * Initialize SDRAM memory on the Local Bus.
 */
void
sdram_init(void)
{
110
#if defined(CONFIG_SYS_LBC_SDRAM_SIZE)
111 112

	uint idx;
113
	volatile fsl_lbc_t *lbc = LBC_BASE_ADDR;
114
	uint *sdram_addr = (uint *)CONFIG_SYS_LBC_SDRAM_BASE;
115 116 117 118
	uint lsdmr_common;

	puts("    SDRAM: ");

119
	print_size (CONFIG_SYS_LBC_SDRAM_SIZE * 1024 * 1024, "\n");
120 121 122 123

	/*
	 * Setup SDRAM Base and Option Registers
	 */
124 125 126 127
	set_lbc_or(3, CONFIG_SYS_OR3_PRELIM);
	set_lbc_br(3, CONFIG_SYS_BR3_PRELIM);
	set_lbc_or(4, CONFIG_SYS_OR4_PRELIM);
	set_lbc_br(4, CONFIG_SYS_BR4_PRELIM);
128

P
Paul Gortmaker 已提交
129
	out_be32(&lbc->lbcr, CONFIG_SYS_LBC_LBCR);
130 131
	asm("msync");

P
Paul Gortmaker 已提交
132 133
	out_be32(&lbc->lsrt,  CONFIG_SYS_LBC_LSRT);
	out_be32(&lbc->mrtpr, CONFIG_SYS_LBC_MRTPR);
134 135 136 137 138
	asm("msync");

	/*
	 * MPC8548 uses "new" 15-16 style addressing.
	 */
139
	lsdmr_common = CONFIG_SYS_LBC_LSDMR_COMMON;
140
	lsdmr_common |= LSDMR_BSMA1516;
141 142 143 144

	/*
	 * Issue PRECHARGE ALL command.
	 */
P
Paul Gortmaker 已提交
145
	out_be32(&lbc->lsdmr, lsdmr_common | LSDMR_OP_PCHALL);
146 147 148 149 150 151 152 153 154
	asm("sync;msync");
	*sdram_addr = 0xff;
	ppcDcbf((unsigned long) sdram_addr);
	udelay(100);

	/*
	 * Issue 8 AUTO REFRESH commands.
	 */
	for (idx = 0; idx < 8; idx++) {
P
Paul Gortmaker 已提交
155
		out_be32(&lbc->lsdmr, lsdmr_common | LSDMR_OP_ARFRSH);
156 157 158 159 160 161 162 163 164
		asm("sync;msync");
		*sdram_addr = 0xff;
		ppcDcbf((unsigned long) sdram_addr);
		udelay(100);
	}

	/*
	 * Issue 8 MODE-set command.
	 */
P
Paul Gortmaker 已提交
165
	out_be32(&lbc->lsdmr, lsdmr_common | LSDMR_OP_MRW);
166 167 168 169 170 171 172 173
	asm("sync;msync");
	*sdram_addr = 0xff;
	ppcDcbf((unsigned long) sdram_addr);
	udelay(100);

	/*
	 * Issue NORMAL OP command.
	 */
P
Paul Gortmaker 已提交
174
	out_be32(&lbc->lsdmr, lsdmr_common | LSDMR_OP_NORMAL);
175 176 177 178 179 180 181 182
	asm("sync;msync");
	*sdram_addr = 0xff;
	ppcDcbf((unsigned long) sdram_addr);
	udelay(200);    /* Overkill. Must wait > 200 bus cycles */

#endif	/* enable SDRAM init */
}

183
#if defined(CONFIG_SYS_DRAM_TEST)
184 185 186
int
testdram(void)
{
187 188
	uint *pstart = (uint *) CONFIG_SYS_MEMTEST_START;
	uint *pend = (uint *) CONFIG_SYS_MEMTEST_END;
189 190 191
	uint *p;

	printf("Testing DRAM from 0x%08x to 0x%08x\n",
192 193
	       CONFIG_SYS_MEMTEST_START,
	       CONFIG_SYS_MEMTEST_END);
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221

	printf("DRAM test phase 1:\n");
	for (p = pstart; p < pend; p++)
		*p = 0xaaaaaaaa;

	for (p = pstart; p < pend; p++) {
		if (*p != 0xaaaaaaaa) {
			printf ("DRAM test fails at: %08x\n", (uint) p);
			return 1;
		}
	}

	printf("DRAM test phase 2:\n");
	for (p = pstart; p < pend; p++)
		*p = 0x55555555;

	for (p = pstart; p < pend; p++) {
		if (*p != 0x55555555) {
			printf ("DRAM test fails at: %08x\n", (uint) p);
			return 1;
		}
	}

	printf("DRAM test passed.\n");
	return 0;
}
#endif

P
Paul Gortmaker 已提交
222 223
#if !defined(CONFIG_SPD_EEPROM)
#define CONFIG_SYS_DDR_CONTROL 0xc300c000
224 225 226 227
/*************************************************************************
 *  fixed_sdram init -- doesn't use serial presence detect.
 *  assumes 256MB DDR2 SDRAM SODIMM, without ECC, running at DDR400 speed.
 ************************************************************************/
228
phys_size_t fixed_sdram(void)
229
{
230
	volatile ccsr_ddr_t *ddr = (void *)(CONFIG_SYS_MPC85xx_DDR_ADDR);
231

P
Paul Gortmaker 已提交
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
	out_be32(&ddr->cs0_bnds, 0x0000007f);
	out_be32(&ddr->cs1_bnds, 0x008000ff);
	out_be32(&ddr->cs2_bnds, 0x00000000);
	out_be32(&ddr->cs3_bnds, 0x00000000);
	out_be32(&ddr->cs0_config, 0x80010101);
	out_be32(&ddr->cs1_config, 0x80010101);
	out_be32(&ddr->cs2_config, 0x00000000);
	out_be32(&ddr->cs3_config, 0x00000000);
	out_be32(&ddr->timing_cfg_3, 0x00000000);
	out_be32(&ddr->timing_cfg_0, 0x00220802);
	out_be32(&ddr->timing_cfg_1, 0x38377322);
	out_be32(&ddr->timing_cfg_2, 0x0fa044C7);
	out_be32(&ddr->sdram_cfg, 0x4300C000);
	out_be32(&ddr->sdram_cfg_2, 0x24401000);
	out_be32(&ddr->sdram_mode, 0x23C00542);
	out_be32(&ddr->sdram_mode_2, 0x00000000);
	out_be32(&ddr->sdram_interval, 0x05080100);
	out_be32(&ddr->sdram_md_cntl, 0x00000000);
	out_be32(&ddr->sdram_data_init, 0x00000000);
	out_be32(&ddr->sdram_clk_cntl, 0x03800000);
252 253 254 255 256
	asm("sync;isync;msync");
	udelay(500);

	#if defined (CONFIG_DDR_ECC)
	  /* Enable ECC checking */
P
Paul Gortmaker 已提交
257
	  out_be32(&ddr->sdram_cfg, CONFIG_SYS_DDR_CONTROL | 0x20000000);
258
	#else
P
Paul Gortmaker 已提交
259
	  out_be32(&ddr->sdram_cfg, CONFIG_SYS_DDR_CONTROL);
260 261
	#endif

262
	return CONFIG_SYS_SDRAM_SIZE * 1024 * 1024;
263 264 265
}
#endif

266 267 268
#ifdef CONFIG_PCI1
static struct pci_controller pci1_hose;
#endif	/* CONFIG_PCI1 */
269 270 271 272 273 274

#ifdef CONFIG_PCIE1
static struct pci_controller pcie1_hose;
#endif	/* CONFIG_PCIE1 */


275
#ifdef CONFIG_PCI
276 277 278
void
pci_init_board(void)
{
279
	volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
280 281 282 283
	struct fsl_pci_info pci_info[2];
	u32 devdisr, pordevsr, porpllsr, io_sel;
	int first_free_busno = 0;
	int num = 0;
284

285 286 287
#ifdef CONFIG_PCIE1
	int pcie_configured;
#endif
288

289 290 291 292
	devdisr = in_be32(&gur->devdisr);
	pordevsr = in_be32(&gur->pordevsr);
	porpllsr = in_be32(&gur->porpllsr);
	io_sel = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> 19;
293

294 295 296 297 298 299 300 301
	debug("   pci_init_board: devdisr=%x, io_sel=%x\n", devdisr, io_sel);

#ifdef CONFIG_PCI1
	if (!(devdisr & MPC85xx_DEVDISR_PCI1)) {
		uint pci_32 = pordevsr & MPC85xx_PORDEVSR_PCI1_PCI32;
		uint pci_arb = pordevsr & MPC85xx_PORDEVSR_PCI1_ARB;
		uint pci_clk_sel = porpllsr & MPC85xx_PORDEVSR_PCI1_SPD;
		uint pci_speed = CONFIG_SYS_CLK_FREQ;	/* get_clock_freq() */
302

303
		printf("PCI: Host, %d bit, %s MHz, %s, %s\n",
304
			(pci_32) ? 32 : 64,
305 306
			(pci_speed == 33000000) ? "33" :
			(pci_speed == 66000000) ? "66" : "unknown",
307
			pci_clk_sel ? "sync" : "async",
308 309 310 311
			pci_arb ? "arbiter" : "external-arbiter");

		SET_STD_PCI_INFO(pci_info[num], 1);
		first_free_busno = fsl_pci_init_port(&pci_info[num++],
312
					&pci1_hose, first_free_busno);
313
	} else {
314
		printf("PCI: disabled\n");
315
	}
316 317

	puts("\n");
318
#else
319
	setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCI1); /* disable */
320 321
#endif

322
	setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCI2); /* disable PCI2 */
323 324

#ifdef CONFIG_PCIE1
325
	pcie_configured = is_serdes_configured(PCIE1);
326

327 328
	if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE)){
		SET_STD_PCIE_INFO(pci_info[num], 1);
329
		printf("PCIE: base address %lx\n", pci_info[num].regs);
330
		first_free_busno = fsl_pci_init_port(&pci_info[num++],
331
					&pcie1_hose, first_free_busno);
332
	} else {
333
		printf("PCIE: disabled\n");
334
	}
335 336

	puts("\n");
337
#else
338
	setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCIE); /* disable */
339 340
#endif
}
341
#endif
342

343 344 345 346 347 348 349
int board_eth_init(bd_t *bis)
{
	tsec_standard_init(bis);
	pci_eth_init(bis);
	return 0;	/* otherwise cpu_eth_init gets run */
}

350 351 352 353 354 355
int last_stage_init(void)
{
	return 0;
}

#if defined(CONFIG_OF_BOARD_SETUP)
356 357 358
void ft_board_setup(void *blob, bd_t *bd)
{
	ft_cpu_setup(blob, bd);
359 360 361

#ifdef CONFIG_FSL_PCI_INIT
	FT_FSL_PCI_SETUP;
362 363 364
#endif
}
#endif