xref: /rk3399_rockchip-uboot/board/freescale/mpc837xerdb/mpc837xerdb.c (revision 55c531984dcf933e4cd13a187a7e08e873b7ced1)
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>
182bd7460eSAnton Vorontsov #include <asm/fsl_serdes.h>
191ac4f320SJean-Christophe PLAGNIOL-VILLARD #include <fdt_support.h>
205e918a98SKim Phillips #include <spd_sdram.h>
2189c7784eSTimur Tabi #include <vsc7385.h>
2289c7784eSTimur Tabi 
236d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SYS_DRAM_TEST)
245e918a98SKim Phillips int
255e918a98SKim Phillips testdram(void)
265e918a98SKim Phillips {
276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	uint *pstart = (uint *) CONFIG_SYS_MEMTEST_START;
286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	uint *pend = (uint *) CONFIG_SYS_MEMTEST_END;
295e918a98SKim Phillips 	uint *p;
305e918a98SKim Phillips 
315e918a98SKim Phillips 	printf("Testing DRAM from 0x%08x to 0x%08x\n",
326d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	       CONFIG_SYS_MEMTEST_START,
336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	       CONFIG_SYS_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 
679973e3c6SBecky Bruce phys_size_t initdram(int board_type)
685e918a98SKim Phillips {
696d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	immap_t *im = (immap_t *) CONFIG_SYS_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 {
956d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
966d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	u32 msize = CONFIG_SYS_DDR_SIZE * 1024 * 1024;
975e918a98SKim Phillips 	u32 msize_log2 = __ilog2(msize);
985e918a98SKim Phillips 
996d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000;
1005e918a98SKim Phillips 	im->sysconf.ddrlaw[0].ar = LBLAWAR_EN | (msize_log2 - 1);
1015e918a98SKim Phillips 
1026d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->sysconf.ddrcdr = CONFIG_SYS_DDRCDR_VALUE;
1035e918a98SKim Phillips 	udelay(50000);
1045e918a98SKim Phillips 
1056d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.sdram_clk_cntl = CONFIG_SYS_DDR_SDRAM_CLK_CNTL;
1065e918a98SKim Phillips 	udelay(1000);
1075e918a98SKim Phillips 
1086d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.csbnds[0].csbnds = CONFIG_SYS_DDR_CS0_BNDS;
1096d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.cs_config[0] = CONFIG_SYS_DDR_CS0_CONFIG;
1105e918a98SKim Phillips 	udelay(1000);
1115e918a98SKim Phillips 
1126d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0;
1136d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1;
1146d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2;
1156d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3;
1166d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.sdram_cfg = CONFIG_SYS_DDR_SDRAM_CFG;
1176d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.sdram_cfg2 = CONFIG_SYS_DDR_SDRAM_CFG2;
1186d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.sdram_mode = CONFIG_SYS_DDR_MODE;
1196d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.sdram_mode2 = CONFIG_SYS_DDR_MODE2;
1206d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.sdram_interval = CONFIG_SYS_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);
1266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	return CONFIG_SYS_DDR_SIZE;
1275e918a98SKim Phillips }
1286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #endif	/*!CONFIG_SYS_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 
1362bd7460eSAnton Vorontsov int board_early_init_f(void)
1372bd7460eSAnton Vorontsov {
1382bd7460eSAnton Vorontsov #ifdef CONFIG_FSL_SERDES
1396d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
1402bd7460eSAnton Vorontsov 	u32 spridr = in_be32(&immr->sysconf.spridr);
1412bd7460eSAnton Vorontsov 
1422bd7460eSAnton Vorontsov 	/* we check only part num, and don't look for CPU revisions */
143e5c4ade4SKim Phillips 	switch (PARTID_NO_E(spridr)) {
144e5c4ade4SKim Phillips 	case SPR_8377:
1452bd7460eSAnton Vorontsov 		fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA,
1462bd7460eSAnton Vorontsov 				 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
1472bd7460eSAnton Vorontsov 		fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX,
1482bd7460eSAnton Vorontsov 				 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
1492bd7460eSAnton Vorontsov 		break;
150e5c4ade4SKim Phillips 	case SPR_8378:
151*55c53198SAnton Vorontsov 		fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX,
152e5c4ade4SKim Phillips 				 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
153e5c4ade4SKim Phillips 		break;
154e5c4ade4SKim Phillips 	case SPR_8379:
155e5c4ade4SKim Phillips 		fsl_setup_serdes(CONFIG_FSL_SERDES1, FSL_SERDES_PROTO_SATA,
156e5c4ade4SKim Phillips 				 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
157e5c4ade4SKim Phillips 		fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_SATA,
158e5c4ade4SKim Phillips 				 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
159e5c4ade4SKim Phillips 		break;
1602bd7460eSAnton Vorontsov 	default:
1612bd7460eSAnton Vorontsov 		printf("serdes not configured: unknown CPU part number: "
1622bd7460eSAnton Vorontsov 		       "%04x\n", spridr >> 16);
1632bd7460eSAnton Vorontsov 		break;
1642bd7460eSAnton Vorontsov 	}
1652bd7460eSAnton Vorontsov #endif /* CONFIG_FSL_SERDES */
1662bd7460eSAnton Vorontsov 	return 0;
1672bd7460eSAnton Vorontsov }
1682bd7460eSAnton Vorontsov 
16989c7784eSTimur Tabi /*
17089c7784eSTimur Tabi  * Miscellaneous late-boot configurations
17189c7784eSTimur Tabi  *
17289c7784eSTimur Tabi  * If a VSC7385 microcode image is present, then upload it.
17389c7784eSTimur Tabi */
17489c7784eSTimur Tabi int misc_init_r(void)
17589c7784eSTimur Tabi {
17689c7784eSTimur Tabi 	int rc = 0;
17789c7784eSTimur Tabi 
17889c7784eSTimur Tabi #ifdef CONFIG_VSC7385_IMAGE
17989c7784eSTimur Tabi 	if (vsc7385_upload_firmware((void *) CONFIG_VSC7385_IMAGE,
18089c7784eSTimur Tabi 		CONFIG_VSC7385_IMAGE_SIZE)) {
18189c7784eSTimur Tabi 		puts("Failure uploading VSC7385 microcode.\n");
18289c7784eSTimur Tabi 		rc = 1;
18389c7784eSTimur Tabi 	}
18489c7784eSTimur Tabi #endif
18589c7784eSTimur Tabi 
18689c7784eSTimur Tabi 	return rc;
18789c7784eSTimur Tabi }
18889c7784eSTimur Tabi 
1895e918a98SKim Phillips #if defined(CONFIG_OF_BOARD_SETUP)
1905e918a98SKim Phillips 
1915e918a98SKim Phillips void ft_board_setup(void *blob, bd_t *bd)
1925e918a98SKim Phillips {
1935e918a98SKim Phillips #ifdef CONFIG_PCI
1945e918a98SKim Phillips 	ft_pci_setup(blob, bd);
1955e918a98SKim Phillips #endif
1965e918a98SKim Phillips 	ft_cpu_setup(blob, bd);
19718e69a35SAnton Vorontsov 	fdt_fixup_dr_usb(blob, bd);
1985e918a98SKim Phillips }
1995e918a98SKim Phillips #endif /* CONFIG_OF_BOARD_SETUP */
200