sbc8548.c 6.9 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0+
2
/*
3 4
 * Copyright 2007,2009 Wind River Systems, Inc. <www.windriver.com>
 *
5 6 7 8 9 10 11 12
 * Copyright 2007 Embedded Specialties, Inc.
 *
 * Copyright 2004, 2007 Freescale Semiconductor.
 *
 * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com>
 */

#include <common.h>
13
#include <init.h>
14
#include <log.h>
15
#include <net.h>
16 17 18
#include <pci.h>
#include <asm/processor.h>
#include <asm/immap_85xx.h>
19
#include <asm/fsl_pci.h>
20
#include <fsl_ddr_sdram.h>
21
#include <asm/fsl_serdes.h>
22
#include <spd_sdram.h>
23 24
#include <netdev.h>
#include <tsec.h>
25
#include <miiphy.h>
26
#include <linux/delay.h>
27
#include <linux/libfdt.h>
28 29 30 31 32 33 34 35 36 37 38
#include <fdt_support.h>

void local_bus_init(void);

int board_early_init_f (void)
{
	return 0;
}

int checkboard (void)
{
39 40
	volatile ccsr_local_ecm_t *ecm = (void *)(CONFIG_SYS_MPC85xx_ECM_ADDR);
	volatile u_char *rev= (void *)CONFIG_SYS_BD_REV;
41 42

	printf ("Board: Wind River SBC8548 Rev. 0x%01x\n",
P
Paul Gortmaker 已提交
43
			in_8(rev) >> 4);
44 45 46 47 48 49

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

P
Paul Gortmaker 已提交
50 51
	out_be32(&ecm->eedr, 0xffffffff);	/* clear ecm errors */
	out_be32(&ecm->eeer, 0xffffffff);	/* enable ecm errors */
52 53 54 55 56 57 58 59 60
	return 0;
}

/*
 * Initialize Local Bus
 */
void
local_bus_init(void)
{
61
	volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
62
	volatile fsl_lbc_t *lbc = LBC_BASE_ADDR;
63

64
	uint clkdiv, lbc_mhz, lcrr = CONFIG_SYS_LBC_LCRR;
65 66 67
	sys_info_t sysinfo;

	get_sys_info(&sysinfo);
68

69 70
	lbc_mhz = sysinfo.freq_localbus / 1000000;
	clkdiv = sysinfo.freq_systembus / sysinfo.freq_localbus;
71 72

	debug("LCRR=0x%x, CD=%d, MHz=%d\n", lcrr, clkdiv, lbc_mhz);
73

P
Paul Gortmaker 已提交
74
	out_be32(&gur->lbiuiplldcr1, 0x00078080);
75
	if (clkdiv == 16) {
P
Paul Gortmaker 已提交
76
		out_be32(&gur->lbiuiplldcr0, 0x7c0f1bf0);
77
	} else if (clkdiv == 8) {
P
Paul Gortmaker 已提交
78
		out_be32(&gur->lbiuiplldcr0, 0x6c0f1bf0);
79
	} else if (clkdiv == 4) {
P
Paul Gortmaker 已提交
80
		out_be32(&gur->lbiuiplldcr0, 0x5c0f1bf0);
81 82
	}

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
	/*
	 * Local Bus Clock > 83.3 MHz. According to timing
	 * specifications set LCRR[EADC] to 2 delay cycles.
	 */
	if (lbc_mhz > 83) {
		lcrr &= ~LCRR_EADC;
		lcrr |= LCRR_EADC_2;
	}

	/*
	 * According to MPC8548ERMAD Rev. 1.3, 13.3.1.16, 13-30
	 * disable PLL bypass for Local Bus Clock > 83 MHz.
	 */
	if (lbc_mhz >= 66)
		lcrr &= (~LCRR_DBYP);	/* DLL Enabled */

	else
		lcrr |= LCRR_DBYP;	/* DLL Bypass */
101

102
	out_be32(&lbc->lcrr, lcrr);
103 104
	asm("sync;isync;msync");

105 106 107 108 109 110 111 112 113 114
	 /*
	 * According to MPC8548ERMAD Rev.1.3 read back LCRR
	 * and terminate with isync
	 */
	lcrr = in_be32(&lbc->lcrr);
	asm ("isync;");

	/* let DLL stabilize */
	udelay(500);

P
Paul Gortmaker 已提交
115 116
	out_be32(&lbc->ltesr, 0xffffffff);	/* Clear LBC error IRQs */
	out_be32(&lbc->lteir, 0xffffffff);	/* Enable LBC error IRQs */
117 118 119 120 121
}

/*
 * Initialize SDRAM memory on the Local Bus.
 */
122
void lbc_sdram_init(void)
123
{
124
#if defined(CONFIG_SYS_LBC_SDRAM_SIZE)
125 126

	uint idx;
127
	const unsigned long size = CONFIG_SYS_LBC_SDRAM_SIZE * 1024 * 1024;
128
	volatile fsl_lbc_t *lbc = LBC_BASE_ADDR;
129
	uint *sdram_addr = (uint *)CONFIG_SYS_LBC_SDRAM_BASE;
130
	uint *sdram_addr2 = (uint *)(CONFIG_SYS_LBC_SDRAM_BASE + size/2);
131 132 133

	puts("    SDRAM: ");

134
	print_size(size, "\n");
135 136 137 138

	/*
	 * Setup SDRAM Base and Option Registers
	 */
139 140 141 142
	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);
143

P
Paul Gortmaker 已提交
144
	out_be32(&lbc->lbcr, CONFIG_SYS_LBC_LBCR);
145 146
	asm("msync");

P
Paul Gortmaker 已提交
147 148
	out_be32(&lbc->lsrt,  CONFIG_SYS_LBC_LSRT);
	out_be32(&lbc->mrtpr, CONFIG_SYS_LBC_MRTPR);
149 150 151 152 153
	asm("msync");

	/*
	 * Issue PRECHARGE ALL command.
	 */
154
	out_be32(&lbc->lsdmr, CONFIG_SYS_LBC_LSDMR_PCHALL);
155 156 157
	asm("sync;msync");
	*sdram_addr = 0xff;
	ppcDcbf((unsigned long) sdram_addr);
158 159
	*sdram_addr2 = 0xff;
	ppcDcbf((unsigned long) sdram_addr2);
160 161 162 163 164 165
	udelay(100);

	/*
	 * Issue 8 AUTO REFRESH commands.
	 */
	for (idx = 0; idx < 8; idx++) {
166
		out_be32(&lbc->lsdmr, CONFIG_SYS_LBC_LSDMR_ARFRSH);
167 168 169
		asm("sync;msync");
		*sdram_addr = 0xff;
		ppcDcbf((unsigned long) sdram_addr);
170 171
		*sdram_addr2 = 0xff;
		ppcDcbf((unsigned long) sdram_addr2);
172 173 174 175 176 177
		udelay(100);
	}

	/*
	 * Issue 8 MODE-set command.
	 */
178
	out_be32(&lbc->lsdmr, CONFIG_SYS_LBC_LSDMR_MRW);
179 180 181
	asm("sync;msync");
	*sdram_addr = 0xff;
	ppcDcbf((unsigned long) sdram_addr);
182 183
	*sdram_addr2 = 0xff;
	ppcDcbf((unsigned long) sdram_addr2);
184 185 186
	udelay(100);

	/*
187
	 * Issue RFEN command.
188
	 */
189
	out_be32(&lbc->lsdmr, CONFIG_SYS_LBC_LSDMR_RFEN);
190 191 192
	asm("sync;msync");
	*sdram_addr = 0xff;
	ppcDcbf((unsigned long) sdram_addr);
193 194
	*sdram_addr2 = 0xff;
	ppcDcbf((unsigned long) sdram_addr2);
195 196 197 198 199
	udelay(200);    /* Overkill. Must wait > 200 bus cycles */

#endif	/* enable SDRAM init */
}

200
#if defined(CONFIG_SYS_DRAM_TEST)
201 202 203
int
testdram(void)
{
204 205
	uint *pstart = (uint *) CONFIG_SYS_MEMTEST_START;
	uint *pend = (uint *) CONFIG_SYS_MEMTEST_END;
206 207 208
	uint *p;

	printf("Testing DRAM from 0x%08x to 0x%08x\n",
209 210
	       CONFIG_SYS_MEMTEST_START,
	       CONFIG_SYS_MEMTEST_END);
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238

	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

239 240 241
#ifdef CONFIG_PCI1
static struct pci_controller pci1_hose;
#endif	/* CONFIG_PCI1 */
242

243
#ifdef CONFIG_PCI
244 245 246
void
pci_init_board(void)
{
247
	volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
248 249 250
	int first_free_busno = 0;

#ifdef CONFIG_PCI1
251 252 253 254 255
	struct fsl_pci_info pci_info;
	u32 devdisr = in_be32(&gur->devdisr);
	u32 pordevsr = in_be32(&gur->pordevsr);
	u32 porpllsr = in_be32(&gur->porpllsr);

256 257 258 259 260
	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() */
261

262
		printf("PCI: Host, %d bit, %s MHz, %s, %s\n",
263
			(pci_32) ? 32 : 64,
264 265
			(pci_speed == 33000000) ? "33" :
			(pci_speed == 66000000) ? "66" : "unknown",
266
			pci_clk_sel ? "sync" : "async",
267 268
			pci_arb ? "arbiter" : "external-arbiter");

269 270 271 272 273 274 275
		SET_STD_PCI_INFO(pci_info, 1);
		set_next_law(pci_info.mem_phys,
			law_size_bits(pci_info.mem_size), pci_info.law);
		set_next_law(pci_info.io_phys,
			law_size_bits(pci_info.io_size), pci_info.law);

		first_free_busno = fsl_pci_init_port(&pci_info,
276
					&pci1_hose, first_free_busno);
277
	} else {
278
		printf("PCI: disabled\n");
279
	}
280 281

	puts("\n");
282
#else
283
	setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCI1); /* disable */
284 285
#endif

286
	setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCI2); /* disable PCI2 */
287

288
	fsl_pcie_init_board(first_free_busno);
289
}
290
#endif
291

292
int board_eth_init(struct bd_info *bis)
293 294 295 296 297 298
{
	tsec_standard_init(bis);
	pci_eth_init(bis);
	return 0;	/* otherwise cpu_eth_init gets run */
}

299 300 301 302 303 304
int last_stage_init(void)
{
	return 0;
}

#if defined(CONFIG_OF_BOARD_SETUP)
305
int ft_board_setup(void *blob, struct bd_info *bd)
306 307
{
	ft_cpu_setup(blob, bd);
308 309 310

#ifdef CONFIG_FSL_PCI_INIT
	FT_FSL_PCI_SETUP;
311
#endif
312 313

	return 0;
314 315
}
#endif