xref: /rk3399_rockchip-uboot/board/freescale/mpc837xerdb/mpc837xerdb.c (revision 2bd7460e9283ec98565189b3cdbcfb2bcdcdd635)
15e918a98SKim Phillips /*
25e918a98SKim Phillips  * Copyright (C) 2007 Freescale Semiconductor, Inc.
35e918a98SKim Phillips  * Kevin Lam <kevin.lam@freescale.com>
45e918a98SKim Phillips  * Joe D'Abbraccio <joe.d'abbraccio@freescale.com>
55e918a98SKim Phillips  *
65e918a98SKim Phillips  * See file CREDITS for list of people who contributed to this
75e918a98SKim Phillips  * project.
85e918a98SKim Phillips  *
95e918a98SKim Phillips  * This program is free software; you can redistribute it and/or
105e918a98SKim Phillips  * modify it under the terms of the GNU General Public License as
115e918a98SKim Phillips  * published by the Free Software Foundation; either version 2 of
125e918a98SKim Phillips  * the License, or (at your option) any later version.
135e918a98SKim Phillips  */
145e918a98SKim Phillips 
155e918a98SKim Phillips #include <common.h>
165e918a98SKim Phillips #include <i2c.h>
175e918a98SKim Phillips #include <asm/io.h>
18*2bd7460eSAnton Vorontsov #include <asm/fsl_serdes.h>
195e918a98SKim Phillips #include <spd_sdram.h>
2089c7784eSTimur Tabi #include <vsc7385.h>
2189c7784eSTimur Tabi 
225e918a98SKim Phillips 
235e918a98SKim Phillips #if defined(CFG_DRAM_TEST)
245e918a98SKim Phillips int
255e918a98SKim Phillips testdram(void)
265e918a98SKim Phillips {
275e918a98SKim Phillips 	uint *pstart = (uint *) CFG_MEMTEST_START;
285e918a98SKim Phillips 	uint *pend = (uint *) CFG_MEMTEST_END;
295e918a98SKim Phillips 	uint *p;
305e918a98SKim Phillips 
315e918a98SKim Phillips 	printf("Testing DRAM from 0x%08x to 0x%08x\n",
325e918a98SKim Phillips 	       CFG_MEMTEST_START,
335e918a98SKim Phillips 	       CFG_MEMTEST_END);
345e918a98SKim Phillips 
355e918a98SKim Phillips 	printf("DRAM test phase 1:\n");
365e918a98SKim Phillips 	for (p = pstart; p < pend; p++)
375e918a98SKim Phillips 		*p = 0xaaaaaaaa;
385e918a98SKim Phillips 
395e918a98SKim Phillips 	for (p = pstart; p < pend; p++) {
405e918a98SKim Phillips 		if (*p != 0xaaaaaaaa) {
415e918a98SKim Phillips 			printf("DRAM test fails at: %08x\n", (uint) p);
425e918a98SKim Phillips 			return 1;
435e918a98SKim Phillips 		}
445e918a98SKim Phillips 	}
455e918a98SKim Phillips 
465e918a98SKim Phillips 	printf("DRAM test phase 2:\n");
475e918a98SKim Phillips 	for (p = pstart; p < pend; p++)
485e918a98SKim Phillips 		*p = 0x55555555;
495e918a98SKim Phillips 
505e918a98SKim Phillips 	for (p = pstart; p < pend; p++) {
515e918a98SKim Phillips 		if (*p != 0x55555555) {
525e918a98SKim Phillips 			printf("DRAM test fails at: %08x\n", (uint) p);
535e918a98SKim Phillips 			return 1;
545e918a98SKim Phillips 		}
555e918a98SKim Phillips 	}
565e918a98SKim Phillips 
575e918a98SKim Phillips 	printf("DRAM test passed.\n");
585e918a98SKim Phillips 	return 0;
595e918a98SKim Phillips }
605e918a98SKim Phillips #endif
615e918a98SKim Phillips 
625e918a98SKim Phillips #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC)
635e918a98SKim Phillips void ddr_enable_ecc(unsigned int dram_size);
645e918a98SKim Phillips #endif
655e918a98SKim Phillips int fixed_sdram(void);
665e918a98SKim Phillips 
675e918a98SKim Phillips long int initdram(int board_type)
685e918a98SKim Phillips {
695e918a98SKim Phillips 	immap_t *im = (immap_t *) CFG_IMMR;
705e918a98SKim Phillips 	u32 msize = 0;
715e918a98SKim Phillips 
725e918a98SKim Phillips 	if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im)
735e918a98SKim Phillips 		return -1;
745e918a98SKim Phillips 
755e918a98SKim Phillips #if defined(CONFIG_SPD_EEPROM)
765e918a98SKim Phillips 	msize = spd_sdram();
775e918a98SKim Phillips #else
785e918a98SKim Phillips 	msize = fixed_sdram();
795e918a98SKim Phillips #endif
805e918a98SKim Phillips 
815e918a98SKim Phillips #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC)
825e918a98SKim Phillips 	/* Initialize DDR ECC byte */
835e918a98SKim Phillips 	ddr_enable_ecc(msize * 1024 * 1024);
845e918a98SKim Phillips #endif
855e918a98SKim Phillips 	/* return total bus DDR size(bytes) */
865e918a98SKim Phillips 	return (msize * 1024 * 1024);
875e918a98SKim Phillips }
885e918a98SKim Phillips 
895e918a98SKim Phillips #if !defined(CONFIG_SPD_EEPROM)
905e918a98SKim Phillips /*************************************************************************
915e918a98SKim Phillips  *  fixed sdram init -- doesn't use serial presence detect.
925e918a98SKim Phillips  ************************************************************************/
935e918a98SKim Phillips int fixed_sdram(void)
945e918a98SKim Phillips {
955e918a98SKim Phillips 	immap_t *im = (immap_t *) CFG_IMMR;
965e918a98SKim Phillips 	u32 msize = CFG_DDR_SIZE * 1024 * 1024;
975e918a98SKim Phillips 	u32 msize_log2 = __ilog2(msize);
985e918a98SKim Phillips 
995e918a98SKim Phillips 	im->sysconf.ddrlaw[0].bar = CFG_DDR_SDRAM_BASE >> 12;
1005e918a98SKim Phillips 	im->sysconf.ddrlaw[0].ar = LBLAWAR_EN | (msize_log2 - 1);
1015e918a98SKim Phillips 
1025e918a98SKim Phillips 	im->sysconf.ddrcdr = CFG_DDRCDR_VALUE;
1035e918a98SKim Phillips 	udelay(50000);
1045e918a98SKim Phillips 
1055e918a98SKim Phillips 	im->ddr.sdram_clk_cntl = CFG_DDR_SDRAM_CLK_CNTL;
1065e918a98SKim Phillips 	udelay(1000);
1075e918a98SKim Phillips 
1085e918a98SKim Phillips 	im->ddr.csbnds[0].csbnds = CFG_DDR_CS0_BNDS;
1095e918a98SKim Phillips 	im->ddr.cs_config[0] = CFG_DDR_CS0_CONFIG;
1105e918a98SKim Phillips 	udelay(1000);
1115e918a98SKim Phillips 
1125e918a98SKim Phillips 	im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0;
1135e918a98SKim Phillips 	im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1;
1145e918a98SKim Phillips 	im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;
1155e918a98SKim Phillips 	im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3;
1165e918a98SKim Phillips 	im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG;
1175e918a98SKim Phillips 	im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2;
1185e918a98SKim Phillips 	im->ddr.sdram_mode = CFG_DDR_MODE;
1195e918a98SKim Phillips 	im->ddr.sdram_mode2 = CFG_DDR_MODE2;
1205e918a98SKim Phillips 	im->ddr.sdram_interval = CFG_DDR_INTERVAL;
1215e918a98SKim Phillips 	sync();
1225e918a98SKim Phillips 	udelay(1000);
1235e918a98SKim Phillips 
1245e918a98SKim Phillips 	im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
1255e918a98SKim Phillips 	udelay(2000);
1265e918a98SKim Phillips 	return CFG_DDR_SIZE;
1275e918a98SKim Phillips }
1285e918a98SKim Phillips #endif	/*!CFG_SPD_EEPROM */
1295e918a98SKim Phillips 
1305e918a98SKim Phillips int checkboard(void)
1315e918a98SKim Phillips {
1325e918a98SKim Phillips 	puts("Board: Freescale MPC837xERDB\n");
1335e918a98SKim Phillips 	return 0;
1345e918a98SKim Phillips }
1355e918a98SKim Phillips 
136*2bd7460eSAnton Vorontsov int board_early_init_f(void)
137*2bd7460eSAnton Vorontsov {
138*2bd7460eSAnton Vorontsov #ifdef CONFIG_FSL_SERDES
139*2bd7460eSAnton Vorontsov 	immap_t *immr = (immap_t *)CFG_IMMR;
140*2bd7460eSAnton Vorontsov 	u32 spridr = in_be32(&immr->sysconf.spridr);
141*2bd7460eSAnton Vorontsov 
142*2bd7460eSAnton Vorontsov 	/* we check only part num, and don't look for CPU revisions */
143*2bd7460eSAnton Vorontsov 	switch (spridr >> 16) {
144*2bd7460eSAnton Vorontsov 	case SPR_8379E_REV10 >> 16:
145*2bd7460eSAnton Vorontsov 	case SPR_8379_REV10 >> 16:
146*2bd7460eSAnton Vorontsov 		fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA,
147*2bd7460eSAnton Vorontsov 				 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
148*2bd7460eSAnton Vorontsov 		fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_SATA,
149*2bd7460eSAnton Vorontsov 				 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
150*2bd7460eSAnton Vorontsov 		break;
151*2bd7460eSAnton Vorontsov 	case SPR_8378E_REV10 >> 16:
152*2bd7460eSAnton Vorontsov 	case SPR_8378_REV10 >> 16:
153*2bd7460eSAnton Vorontsov 		fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_PEX,
154*2bd7460eSAnton Vorontsov 				 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
155*2bd7460eSAnton Vorontsov 		break;
156*2bd7460eSAnton Vorontsov 	case SPR_8377E_REV10 >> 16:
157*2bd7460eSAnton Vorontsov 	case SPR_8377_REV10 >> 16:
158*2bd7460eSAnton Vorontsov 		fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA,
159*2bd7460eSAnton Vorontsov 				 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
160*2bd7460eSAnton Vorontsov 		fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX,
161*2bd7460eSAnton Vorontsov 				 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
162*2bd7460eSAnton Vorontsov 		break;
163*2bd7460eSAnton Vorontsov 	default:
164*2bd7460eSAnton Vorontsov 		printf("serdes not configured: unknown CPU part number: "
165*2bd7460eSAnton Vorontsov 		       "%04x\n", spridr >> 16);
166*2bd7460eSAnton Vorontsov 		break;
167*2bd7460eSAnton Vorontsov 	}
168*2bd7460eSAnton Vorontsov #endif /* CONFIG_FSL_SERDES */
169*2bd7460eSAnton Vorontsov 	return 0;
170*2bd7460eSAnton Vorontsov }
171*2bd7460eSAnton Vorontsov 
17289c7784eSTimur Tabi /*
17389c7784eSTimur Tabi  * Miscellaneous late-boot configurations
17489c7784eSTimur Tabi  *
17589c7784eSTimur Tabi  * If a VSC7385 microcode image is present, then upload it.
17689c7784eSTimur Tabi */
17789c7784eSTimur Tabi int misc_init_r(void)
17889c7784eSTimur Tabi {
17989c7784eSTimur Tabi 	int rc = 0;
18089c7784eSTimur Tabi 
18189c7784eSTimur Tabi #ifdef CONFIG_VSC7385_IMAGE
18289c7784eSTimur Tabi 	if (vsc7385_upload_firmware((void *) CONFIG_VSC7385_IMAGE,
18389c7784eSTimur Tabi 		CONFIG_VSC7385_IMAGE_SIZE)) {
18489c7784eSTimur Tabi 		puts("Failure uploading VSC7385 microcode.\n");
18589c7784eSTimur Tabi 		rc = 1;
18689c7784eSTimur Tabi 	}
18789c7784eSTimur Tabi #endif
18889c7784eSTimur Tabi 
18989c7784eSTimur Tabi 	return rc;
19089c7784eSTimur Tabi }
19189c7784eSTimur Tabi 
1925e918a98SKim Phillips #if defined(CONFIG_OF_BOARD_SETUP)
1935e918a98SKim Phillips 
1945e918a98SKim Phillips void ft_board_setup(void *blob, bd_t *bd)
1955e918a98SKim Phillips {
1965e918a98SKim Phillips #ifdef CONFIG_PCI
1975e918a98SKim Phillips 	ft_pci_setup(blob, bd);
1985e918a98SKim Phillips #endif
1995e918a98SKim Phillips 	ft_cpu_setup(blob, bd);
2005e918a98SKim Phillips }
2015e918a98SKim Phillips #endif /* CONFIG_OF_BOARD_SETUP */
202