xref: /rk3399_rockchip-uboot/board/sbc8349/sbc8349.c (revision 0e00a84cdedf7a1949486746225b35984b351eca)
191e25769SPaul Gortmaker /*
291e25769SPaul Gortmaker  * sbc8349.c -- WindRiver SBC8349 board support.
391e25769SPaul Gortmaker  * Copyright (c) 2006-2007 Wind River Systems, Inc.
491e25769SPaul Gortmaker  *
591e25769SPaul Gortmaker  * Paul Gortmaker <paul.gortmaker@windriver.com>
691e25769SPaul Gortmaker  * Based on board/mpc8349emds/mpc8349emds.c (and previous 834x releases.)
791e25769SPaul Gortmaker  *
81a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
991e25769SPaul Gortmaker  */
1091e25769SPaul Gortmaker 
1191e25769SPaul Gortmaker #include <common.h>
1291e25769SPaul Gortmaker #include <ioports.h>
1391e25769SPaul Gortmaker #include <mpc83xx.h>
1491e25769SPaul Gortmaker #include <asm/mpc8349_pci.h>
1591e25769SPaul Gortmaker #include <i2c.h>
1691e25769SPaul Gortmaker #include <spd_sdram.h>
17a30a549aSJon Loeliger #include <miiphy.h>
18b3458d2cSKim Phillips #if defined(CONFIG_OF_LIBFDT)
19*0e00a84cSMasahiro Yamada #include <linux/libfdt.h>
2091e25769SPaul Gortmaker #endif
2191e25769SPaul Gortmaker 
22088454cdSSimon Glass DECLARE_GLOBAL_DATA_PTR;
23088454cdSSimon Glass 
2491e25769SPaul Gortmaker int fixed_sdram(void);
2591e25769SPaul Gortmaker void sdram_init(void);
2691e25769SPaul Gortmaker 
270f898604SPeter Tyser #if defined(CONFIG_DDR_ECC) && defined(CONFIG_MPC83xx)
2891e25769SPaul Gortmaker void ddr_enable_ecc(unsigned int dram_size);
2991e25769SPaul Gortmaker #endif
3091e25769SPaul Gortmaker 
3191e25769SPaul Gortmaker #ifdef CONFIG_BOARD_EARLY_INIT_F
board_early_init_f(void)3291e25769SPaul Gortmaker int board_early_init_f (void)
3391e25769SPaul Gortmaker {
3491e25769SPaul Gortmaker 	return 0;
3591e25769SPaul Gortmaker }
3691e25769SPaul Gortmaker #endif
3791e25769SPaul Gortmaker 
3891e25769SPaul Gortmaker #define ns2clk(ns) (ns / (1000000000 / CONFIG_8349_CLKIN) + 1)
3991e25769SPaul Gortmaker 
dram_init(void)40f1683aa7SSimon Glass int dram_init(void)
4191e25769SPaul Gortmaker {
426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
4391e25769SPaul Gortmaker 	u32 msize = 0;
4491e25769SPaul Gortmaker 
4591e25769SPaul Gortmaker 	if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im)
4691e25769SPaul Gortmaker 		return -1;
4791e25769SPaul Gortmaker 
4891e25769SPaul Gortmaker 	/* DDR SDRAM - Main SODIMM */
496d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_BASE & LAWBAR_BAR;
5091e25769SPaul Gortmaker #if defined(CONFIG_SPD_EEPROM)
5191e25769SPaul Gortmaker 	msize = spd_sdram();
5291e25769SPaul Gortmaker #else
5391e25769SPaul Gortmaker 	msize = fixed_sdram();
5491e25769SPaul Gortmaker #endif
5591e25769SPaul Gortmaker 	/*
5691e25769SPaul Gortmaker 	 * Initialize SDRAM if it is on local bus.
5791e25769SPaul Gortmaker 	 */
5891e25769SPaul Gortmaker 	sdram_init();
5991e25769SPaul Gortmaker 
6091e25769SPaul Gortmaker #if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
6191e25769SPaul Gortmaker 	/*
6291e25769SPaul Gortmaker 	 * Initialize and enable DDR ECC.
6391e25769SPaul Gortmaker 	 */
6491e25769SPaul Gortmaker 	ddr_enable_ecc(msize * 1024 * 1024);
6591e25769SPaul Gortmaker #endif
66088454cdSSimon Glass 	/* set total bus SDRAM size(bytes)  -- DDR */
67088454cdSSimon Glass 	gd->ram_size = msize * 1024 * 1024;
68088454cdSSimon Glass 
69088454cdSSimon Glass 	return 0;
7091e25769SPaul Gortmaker }
7191e25769SPaul Gortmaker 
7291e25769SPaul Gortmaker #if !defined(CONFIG_SPD_EEPROM)
7391e25769SPaul Gortmaker /*************************************************************************
7491e25769SPaul Gortmaker  *  fixed sdram init -- doesn't use serial presence detect.
7591e25769SPaul Gortmaker  ************************************************************************/
fixed_sdram(void)7691e25769SPaul Gortmaker int fixed_sdram(void)
7791e25769SPaul Gortmaker {
786d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
792e651b24SJoe Hershberger 	u32 msize = CONFIG_SYS_DDR_SIZE;
802e651b24SJoe Hershberger 	u32 ddr_size = msize << 20;	/* DDR size in bytes */
812e651b24SJoe Hershberger 	u32 ddr_size_log2 = __ilog2(msize);
8291e25769SPaul Gortmaker 
836d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->sysconf.ddrlaw[0].bar = CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000;
8491e25769SPaul Gortmaker 	im->sysconf.ddrlaw[0].ar = LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE);
8591e25769SPaul Gortmaker 
866d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if (CONFIG_SYS_DDR_SIZE != 256)
8791e25769SPaul Gortmaker #warning Currently any ddr size other than 256 is not supported
8891e25769SPaul Gortmaker #endif
892e651b24SJoe Hershberger 
902e651b24SJoe Hershberger #if ((CONFIG_SYS_DDR_SDRAM_BASE & 0x00FFFFFF) != 0)
912e651b24SJoe Hershberger #warning Chip select bounds is only configurable in 16MB increments
922e651b24SJoe Hershberger #endif
932e651b24SJoe Hershberger 	im->ddr.csbnds[2].csbnds =
942e651b24SJoe Hershberger 		((CONFIG_SYS_DDR_SDRAM_BASE >> CSBNDS_SA_SHIFT) & CSBNDS_SA) |
952e651b24SJoe Hershberger 		(((CONFIG_SYS_DDR_SDRAM_BASE + ddr_size - 1) >>
962e651b24SJoe Hershberger 				CSBNDS_EA_SHIFT) & CSBNDS_EA);
972e651b24SJoe Hershberger 	im->ddr.cs_config[2] = CONFIG_SYS_DDR_CS2_CONFIG;
9891e25769SPaul Gortmaker 
9991e25769SPaul Gortmaker 	/* currently we use only one CS, so disable the other banks */
10091e25769SPaul Gortmaker 	im->ddr.cs_config[0] = 0;
10191e25769SPaul Gortmaker 	im->ddr.cs_config[1] = 0;
10291e25769SPaul Gortmaker 	im->ddr.cs_config[3] = 0;
10391e25769SPaul Gortmaker 
1046d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1;
1056d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2;
10691e25769SPaul Gortmaker 
10791e25769SPaul Gortmaker 	im->ddr.sdram_cfg =
10891e25769SPaul Gortmaker 		SDRAM_CFG_SREN
10991e25769SPaul Gortmaker #if defined(CONFIG_DDR_2T_TIMING)
11091e25769SPaul Gortmaker 		| SDRAM_CFG_2T_EN
11191e25769SPaul Gortmaker #endif
112bbea46f7SKim Phillips 		| SDRAM_CFG_SDRAM_TYPE_DDR1;
11391e25769SPaul Gortmaker #if defined (CONFIG_DDR_32BIT)
11491e25769SPaul Gortmaker 	/* for 32-bit mode burst length is 8 */
11591e25769SPaul Gortmaker 	im->ddr.sdram_cfg |= (SDRAM_CFG_32_BE | SDRAM_CFG_8_BE);
11691e25769SPaul Gortmaker #endif
1176d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.sdram_mode = CONFIG_SYS_DDR_MODE;
11891e25769SPaul Gortmaker 
1196d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	im->ddr.sdram_interval = CONFIG_SYS_DDR_INTERVAL;
12091e25769SPaul Gortmaker 	udelay(200);
12191e25769SPaul Gortmaker 
12291e25769SPaul Gortmaker 	/* enable DDR controller */
12391e25769SPaul Gortmaker 	im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN;
12491e25769SPaul Gortmaker 	return msize;
12591e25769SPaul Gortmaker }
1266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #endif/*!CONFIG_SYS_SPD_EEPROM*/
12791e25769SPaul Gortmaker 
12891e25769SPaul Gortmaker 
checkboard(void)12991e25769SPaul Gortmaker int checkboard (void)
13091e25769SPaul Gortmaker {
13191e25769SPaul Gortmaker 	puts("Board: Wind River SBC834x\n");
13291e25769SPaul Gortmaker 	return 0;
13391e25769SPaul Gortmaker }
13491e25769SPaul Gortmaker 
13591e25769SPaul Gortmaker /*
13691e25769SPaul Gortmaker  * if board is fitted with SDRAM
13791e25769SPaul Gortmaker  */
1386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SYS_BR2_PRELIM)  \
1396d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	&& defined(CONFIG_SYS_OR2_PRELIM) \
1406d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	&& defined(CONFIG_SYS_LBLAWBAR2_PRELIM) \
1416d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	&& defined(CONFIG_SYS_LBLAWAR2_PRELIM)
14291e25769SPaul Gortmaker /*
14391e25769SPaul Gortmaker  * Initialize SDRAM memory on the Local Bus.
14491e25769SPaul Gortmaker  */
14591e25769SPaul Gortmaker 
sdram_init(void)14691e25769SPaul Gortmaker void sdram_init(void)
14791e25769SPaul Gortmaker {
1486d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *immap = (immap_t *)CONFIG_SYS_IMMR;
149f51cdaf1SBecky Bruce 	volatile fsl_lbc_t *lbc = &immap->im_lbc;
1506d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	uint *sdram_addr = (uint *)CONFIG_SYS_LBC_SDRAM_BASE;
15191e25769SPaul Gortmaker 
15291e25769SPaul Gortmaker 	puts("\n   SDRAM on Local Bus: ");
1536d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	print_size (CONFIG_SYS_LBC_SDRAM_SIZE * 1024 * 1024, "\n");
15491e25769SPaul Gortmaker 
15591e25769SPaul Gortmaker 	/*
15691e25769SPaul Gortmaker 	 * Setup SDRAM Base and Option Registers, already done in cpu_init.c
15791e25769SPaul Gortmaker 	 */
15891e25769SPaul Gortmaker 
15991e25769SPaul Gortmaker 	/* setup mtrpt, lsrt and lbcr for LB bus */
1606d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	lbc->lbcr = CONFIG_SYS_LBC_LBCR;
1616d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	lbc->mrtpr = CONFIG_SYS_LBC_MRTPR;
1626d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	lbc->lsrt = CONFIG_SYS_LBC_LSRT;
16391e25769SPaul Gortmaker 	asm("sync");
16491e25769SPaul Gortmaker 
16591e25769SPaul Gortmaker 	/*
16691e25769SPaul Gortmaker 	 * Configure the SDRAM controller Machine Mode Register.
16791e25769SPaul Gortmaker 	 */
1686d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	lbc->lsdmr = CONFIG_SYS_LBC_LSDMR_5; /* 0x40636733; normal operation */
16991e25769SPaul Gortmaker 
1706d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	lbc->lsdmr = CONFIG_SYS_LBC_LSDMR_1; /* 0x68636733; precharge all the banks */
17191e25769SPaul Gortmaker 	asm("sync");
17291e25769SPaul Gortmaker 	*sdram_addr = 0xff;
17391e25769SPaul Gortmaker 	udelay(100);
17491e25769SPaul Gortmaker 
1756d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	lbc->lsdmr = CONFIG_SYS_LBC_LSDMR_2; /* 0x48636733; auto refresh */
17691e25769SPaul Gortmaker 	asm("sync");
17791e25769SPaul Gortmaker 	/*1 times*/
17891e25769SPaul Gortmaker 	*sdram_addr = 0xff;
17991e25769SPaul Gortmaker 	udelay(100);
18091e25769SPaul Gortmaker 	/*2 times*/
18191e25769SPaul Gortmaker 	*sdram_addr = 0xff;
18291e25769SPaul Gortmaker 	udelay(100);
18391e25769SPaul Gortmaker 	/*3 times*/
18491e25769SPaul Gortmaker 	*sdram_addr = 0xff;
18591e25769SPaul Gortmaker 	udelay(100);
18691e25769SPaul Gortmaker 	/*4 times*/
18791e25769SPaul Gortmaker 	*sdram_addr = 0xff;
18891e25769SPaul Gortmaker 	udelay(100);
18991e25769SPaul Gortmaker 	/*5 times*/
19091e25769SPaul Gortmaker 	*sdram_addr = 0xff;
19191e25769SPaul Gortmaker 	udelay(100);
19291e25769SPaul Gortmaker 	/*6 times*/
19391e25769SPaul Gortmaker 	*sdram_addr = 0xff;
19491e25769SPaul Gortmaker 	udelay(100);
19591e25769SPaul Gortmaker 	/*7 times*/
19691e25769SPaul Gortmaker 	*sdram_addr = 0xff;
19791e25769SPaul Gortmaker 	udelay(100);
19891e25769SPaul Gortmaker 	/*8 times*/
19991e25769SPaul Gortmaker 	*sdram_addr = 0xff;
20091e25769SPaul Gortmaker 	udelay(100);
20191e25769SPaul Gortmaker 
20291e25769SPaul Gortmaker 	/* 0x58636733; mode register write operation */
2036d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	lbc->lsdmr = CONFIG_SYS_LBC_LSDMR_4;
20491e25769SPaul Gortmaker 	asm("sync");
20591e25769SPaul Gortmaker 	*sdram_addr = 0xff;
20691e25769SPaul Gortmaker 	udelay(100);
20791e25769SPaul Gortmaker 
2086d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	lbc->lsdmr = CONFIG_SYS_LBC_LSDMR_5; /* 0x40636733; normal operation */
20991e25769SPaul Gortmaker 	asm("sync");
21091e25769SPaul Gortmaker 	*sdram_addr = 0xff;
21191e25769SPaul Gortmaker 	udelay(100);
21291e25769SPaul Gortmaker }
21391e25769SPaul Gortmaker #else
sdram_init(void)21491e25769SPaul Gortmaker void sdram_init(void)
21591e25769SPaul Gortmaker {
21691e25769SPaul Gortmaker 	puts("   SDRAM on Local Bus: Disabled in config\n");
21791e25769SPaul Gortmaker }
21891e25769SPaul Gortmaker #endif
21991e25769SPaul Gortmaker 
2202408b3f2SPaul Gortmaker #if defined(CONFIG_OF_BOARD_SETUP)
ft_board_setup(void * blob,bd_t * bd)221e895a4b0SSimon Glass int ft_board_setup(void *blob, bd_t *bd)
22291e25769SPaul Gortmaker {
2232408b3f2SPaul Gortmaker 	ft_cpu_setup(blob, bd);
2242408b3f2SPaul Gortmaker #ifdef CONFIG_PCI
2252408b3f2SPaul Gortmaker 	ft_pci_setup(blob, bd);
2262408b3f2SPaul Gortmaker #endif
227e895a4b0SSimon Glass 
228e895a4b0SSimon Glass 	return 0;
22991e25769SPaul Gortmaker }
23091e25769SPaul Gortmaker #endif
231