xref: /openbmc/u-boot/board/ve8313/ve8313.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
24e43b2e8SHeiko Schocher /*
34e43b2e8SHeiko Schocher  * Copyright (C) Freescale Semiconductor, Inc. 2006-2007
44e43b2e8SHeiko Schocher  *
54e43b2e8SHeiko Schocher  * Author: Scott Wood <scottwood@freescale.com>
64e43b2e8SHeiko Schocher  *
74e43b2e8SHeiko Schocher  * (C) Copyright 2010
84e43b2e8SHeiko Schocher  * Heiko Schocher, DENX Software Engineering, hs@denx.de.
94e43b2e8SHeiko Schocher  */
104e43b2e8SHeiko Schocher 
114e43b2e8SHeiko Schocher #include <common.h>
12b08c8c48SMasahiro Yamada #include <linux/libfdt.h>
134e43b2e8SHeiko Schocher #include <pci.h>
144e43b2e8SHeiko Schocher #include <mpc83xx.h>
154e43b2e8SHeiko Schocher #include <ns16550.h>
164e43b2e8SHeiko Schocher #include <nand.h>
174e43b2e8SHeiko Schocher 
184e43b2e8SHeiko Schocher #include <asm/bitops.h>
194e43b2e8SHeiko Schocher #include <asm/io.h>
204e43b2e8SHeiko Schocher 
214e43b2e8SHeiko Schocher DECLARE_GLOBAL_DATA_PTR;
224e43b2e8SHeiko Schocher 
234e43b2e8SHeiko Schocher extern void disable_addr_trans (void);
244e43b2e8SHeiko Schocher extern void enable_addr_trans (void);
254e43b2e8SHeiko Schocher 
checkboard(void)264e43b2e8SHeiko Schocher int checkboard(void)
274e43b2e8SHeiko Schocher {
284e43b2e8SHeiko Schocher 	puts("Board: ve8313\n");
294e43b2e8SHeiko Schocher 	return 0;
304e43b2e8SHeiko Schocher }
314e43b2e8SHeiko Schocher 
fixed_sdram(void)324e43b2e8SHeiko Schocher static long fixed_sdram(void)
334e43b2e8SHeiko Schocher {
344e43b2e8SHeiko Schocher 	u32 msize = CONFIG_SYS_DDR_SIZE * 1024 * 1024;
354e43b2e8SHeiko Schocher 
364e43b2e8SHeiko Schocher #ifndef CONFIG_SYS_RAMBOOT
374e43b2e8SHeiko Schocher 	volatile immap_t *im = (volatile immap_t *)CONFIG_SYS_IMMR;
384e43b2e8SHeiko Schocher 	u32 msize_log2 = __ilog2(msize);
394e43b2e8SHeiko Schocher 
404e43b2e8SHeiko Schocher 	out_be32(&im->sysconf.ddrlaw[0].bar,
414e43b2e8SHeiko Schocher 		(CONFIG_SYS_DDR_SDRAM_BASE & 0xfffff000));
424e43b2e8SHeiko Schocher 	out_be32(&im->sysconf.ddrlaw[0].ar, (LBLAWAR_EN | (msize_log2 - 1)));
434e43b2e8SHeiko Schocher 	out_be32(&im->sysconf.ddrcdr, CONFIG_SYS_DDRCDR_VALUE);
444e43b2e8SHeiko Schocher 
454e43b2e8SHeiko Schocher 	/*
464e43b2e8SHeiko Schocher 	 * Erratum DDR3 requires a 50ms delay after clearing DDRCDR[DDR_cfg],
474e43b2e8SHeiko Schocher 	 * or the DDR2 controller may fail to initialize correctly.
484e43b2e8SHeiko Schocher 	 */
494e43b2e8SHeiko Schocher 	__udelay(50000);
504e43b2e8SHeiko Schocher 
512e651b24SJoe Hershberger #if ((CONFIG_SYS_DDR_SDRAM_BASE & 0x00FFFFFF) != 0)
522e651b24SJoe Hershberger #warning Chip select bounds is only configurable in 16MB increments
532e651b24SJoe Hershberger #endif
542e651b24SJoe Hershberger 	out_be32(&im->ddr.csbnds[0].csbnds,
552e651b24SJoe Hershberger 		((CONFIG_SYS_DDR_SDRAM_BASE >> CSBNDS_SA_SHIFT) & CSBNDS_SA) |
562e651b24SJoe Hershberger 		(((CONFIG_SYS_DDR_SDRAM_BASE + msize - 1) >> CSBNDS_EA_SHIFT) &
572e651b24SJoe Hershberger 			CSBNDS_EA));
582e651b24SJoe Hershberger 	out_be32(&im->ddr.cs_config[0], CONFIG_SYS_DDR_CS0_CONFIG);
594e43b2e8SHeiko Schocher 
604e43b2e8SHeiko Schocher 	/* Currently we use only one CS, so disable the other bank. */
614e43b2e8SHeiko Schocher 	out_be32(&im->ddr.cs_config[1], 0);
624e43b2e8SHeiko Schocher 
634e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_clk_cntl, CONFIG_SYS_DDR_CLK_CNTL);
644e43b2e8SHeiko Schocher 	out_be32(&im->ddr.timing_cfg_3, CONFIG_SYS_DDR_TIMING_3);
654e43b2e8SHeiko Schocher 	out_be32(&im->ddr.timing_cfg_1, CONFIG_SYS_DDR_TIMING_1);
664e43b2e8SHeiko Schocher 	out_be32(&im->ddr.timing_cfg_2, CONFIG_SYS_DDR_TIMING_2);
674e43b2e8SHeiko Schocher 	out_be32(&im->ddr.timing_cfg_0, CONFIG_SYS_DDR_TIMING_0);
684e43b2e8SHeiko Schocher 
694e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_cfg, CONFIG_SYS_SDRAM_CFG);
704e43b2e8SHeiko Schocher 
714e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_cfg2, CONFIG_SYS_SDRAM_CFG2);
724e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_mode, CONFIG_SYS_DDR_MODE);
734e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_mode2, CONFIG_SYS_DDR_MODE_2);
744e43b2e8SHeiko Schocher 
754e43b2e8SHeiko Schocher 	out_be32(&im->ddr.sdram_interval, CONFIG_SYS_DDR_INTERVAL);
764e43b2e8SHeiko Schocher 	sync();
774e43b2e8SHeiko Schocher 
784e43b2e8SHeiko Schocher 	/* enable DDR controller */
794e43b2e8SHeiko Schocher 	setbits_be32(&im->ddr.sdram_cfg, SDRAM_CFG_MEM_EN);
804e43b2e8SHeiko Schocher 
814e43b2e8SHeiko Schocher 	/* now check the real size */
824e43b2e8SHeiko Schocher 	disable_addr_trans ();
834e43b2e8SHeiko Schocher 	msize = get_ram_size (CONFIG_SYS_DDR_BASE, msize);
844e43b2e8SHeiko Schocher 	enable_addr_trans ();
854e43b2e8SHeiko Schocher #endif
864e43b2e8SHeiko Schocher 
874e43b2e8SHeiko Schocher 	return msize;
884e43b2e8SHeiko Schocher }
894e43b2e8SHeiko Schocher 
dram_init(void)90f1683aa7SSimon Glass int dram_init(void)
914e43b2e8SHeiko Schocher {
924e43b2e8SHeiko Schocher 	volatile immap_t *im = (volatile immap_t *)CONFIG_SYS_IMMR;
93a2243b84SKumar Gala 	volatile fsl_lbc_t *lbc = &im->im_lbc;
944e43b2e8SHeiko Schocher 	u32 msize;
954e43b2e8SHeiko Schocher 
964e43b2e8SHeiko Schocher 	if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im)
974e43b2e8SHeiko Schocher 		return -1;
984e43b2e8SHeiko Schocher 
994e43b2e8SHeiko Schocher 	/* DDR SDRAM - Main SODIMM */
1004e43b2e8SHeiko Schocher 	msize = fixed_sdram();
1014e43b2e8SHeiko Schocher 
1024e43b2e8SHeiko Schocher 	/* Local Bus setup lbcr and mrtpr */
1034e43b2e8SHeiko Schocher 	out_be32(&lbc->lbcr, CONFIG_SYS_LBC_LBCR);
1044e43b2e8SHeiko Schocher 	out_be32(&lbc->mrtpr, CONFIG_SYS_LBC_MRTPR);
1054e43b2e8SHeiko Schocher 	sync();
1064e43b2e8SHeiko Schocher 
1074e43b2e8SHeiko Schocher 	/* return total bus SDRAM size(bytes)  -- DDR */
108088454cdSSimon Glass 	gd->ram_size = msize;
109088454cdSSimon Glass 
110088454cdSSimon Glass 	return 0;
1114e43b2e8SHeiko Schocher }
1124e43b2e8SHeiko Schocher 
1134e43b2e8SHeiko Schocher #define VE8313_WDT_EN	0x00020000
1144e43b2e8SHeiko Schocher #define VE8313_WDT_TRIG	0x00040000
1154e43b2e8SHeiko Schocher 
board_early_init_f(void)1164e43b2e8SHeiko Schocher int board_early_init_f (void)
1174e43b2e8SHeiko Schocher {
1184e43b2e8SHeiko Schocher 	volatile immap_t *im = (volatile immap_t *)CONFIG_SYS_IMMR;
1194e43b2e8SHeiko Schocher 	volatile gpio83xx_t *gpio = (volatile gpio83xx_t *)im->gpio;
1204e43b2e8SHeiko Schocher 
1214e43b2e8SHeiko Schocher #if defined(CONFIG_HW_WATCHDOG)
1224e43b2e8SHeiko Schocher 	/* enable WDT */
1234e43b2e8SHeiko Schocher 	clrbits_be32(&gpio->dat, VE8313_WDT_EN | VE8313_WDT_TRIG);
1244e43b2e8SHeiko Schocher #else
1254e43b2e8SHeiko Schocher 	/* disable WDT */
1264e43b2e8SHeiko Schocher 	setbits_be32(&gpio->dat, VE8313_WDT_EN | VE8313_WDT_TRIG);
1274e43b2e8SHeiko Schocher #endif
1284e43b2e8SHeiko Schocher 	/* set WDT pins as output */
1294e43b2e8SHeiko Schocher 	setbits_be32(&gpio->dir, VE8313_WDT_EN | VE8313_WDT_TRIG);
1304e43b2e8SHeiko Schocher 
1314e43b2e8SHeiko Schocher 	return 0;
1324e43b2e8SHeiko Schocher }
1334e43b2e8SHeiko Schocher 
1344e43b2e8SHeiko Schocher #if defined(CONFIG_HW_WATCHDOG)
hw_watchdog_reset(void)1354e43b2e8SHeiko Schocher void hw_watchdog_reset(void)
1364e43b2e8SHeiko Schocher {
1374e43b2e8SHeiko Schocher 	volatile immap_t *im = (volatile immap_t *)CONFIG_SYS_IMMR;
1384e43b2e8SHeiko Schocher 	volatile gpio83xx_t *gpio = (volatile gpio83xx_t *)im->gpio;
1394e43b2e8SHeiko Schocher 	unsigned long reg;
1404e43b2e8SHeiko Schocher 
1414e43b2e8SHeiko Schocher 	reg = in_be32(&gpio->dat);
1424e43b2e8SHeiko Schocher 	if (reg & VE8313_WDT_TRIG)
1434e43b2e8SHeiko Schocher 		clrbits_be32(&gpio->dat, VE8313_WDT_TRIG);
1444e43b2e8SHeiko Schocher 	else
1454e43b2e8SHeiko Schocher 		setbits_be32(&gpio->dat, VE8313_WDT_TRIG);
1464e43b2e8SHeiko Schocher }
1474e43b2e8SHeiko Schocher #endif
1484e43b2e8SHeiko Schocher 
1494e43b2e8SHeiko Schocher 
1504e43b2e8SHeiko Schocher #if defined(CONFIG_PCI)
1514e43b2e8SHeiko Schocher static struct pci_region pci_regions[] = {
1524e43b2e8SHeiko Schocher 	{
1534e43b2e8SHeiko Schocher 		bus_start: CONFIG_SYS_PCI1_MEM_BASE,
1544e43b2e8SHeiko Schocher 		phys_start: CONFIG_SYS_PCI1_MEM_PHYS,
1554e43b2e8SHeiko Schocher 		size: CONFIG_SYS_PCI1_MEM_SIZE,
1564e43b2e8SHeiko Schocher 		flags: PCI_REGION_MEM | PCI_REGION_PREFETCH
1574e43b2e8SHeiko Schocher 	},
1584e43b2e8SHeiko Schocher 	{
1594e43b2e8SHeiko Schocher 		bus_start: CONFIG_SYS_PCI1_MMIO_BASE,
1604e43b2e8SHeiko Schocher 		phys_start: CONFIG_SYS_PCI1_MMIO_PHYS,
1614e43b2e8SHeiko Schocher 		size: CONFIG_SYS_PCI1_MMIO_SIZE,
1624e43b2e8SHeiko Schocher 		flags: PCI_REGION_MEM
1634e43b2e8SHeiko Schocher 	},
1644e43b2e8SHeiko Schocher 	{
1654e43b2e8SHeiko Schocher 		bus_start: CONFIG_SYS_PCI1_IO_BASE,
1664e43b2e8SHeiko Schocher 		phys_start: CONFIG_SYS_PCI1_IO_PHYS,
1674e43b2e8SHeiko Schocher 		size: CONFIG_SYS_PCI1_IO_SIZE,
1684e43b2e8SHeiko Schocher 		flags: PCI_REGION_IO
1694e43b2e8SHeiko Schocher 	}
1704e43b2e8SHeiko Schocher };
1714e43b2e8SHeiko Schocher 
pci_init_board(void)1724e43b2e8SHeiko Schocher void pci_init_board(void)
1734e43b2e8SHeiko Schocher {
1744e43b2e8SHeiko Schocher 	volatile immap_t *immr = (volatile immap_t *)CONFIG_SYS_IMMR;
1754e43b2e8SHeiko Schocher 	volatile clk83xx_t *clk = (volatile clk83xx_t *)&immr->clk;
1764e43b2e8SHeiko Schocher 	volatile law83xx_t *pci_law = immr->sysconf.pcilaw;
1774e43b2e8SHeiko Schocher 	struct pci_region *reg[] = { pci_regions };
1784e43b2e8SHeiko Schocher 
1794e43b2e8SHeiko Schocher 	/* Enable all 3 PCI_CLK_OUTPUTs. */
1804e43b2e8SHeiko Schocher 	setbits_be32(&clk->occr, 0xe0000000);
1814e43b2e8SHeiko Schocher 
1824e43b2e8SHeiko Schocher 	/*
1834e43b2e8SHeiko Schocher 	 * Configure PCI Local Access Windows
1844e43b2e8SHeiko Schocher 	 */
1854e43b2e8SHeiko Schocher 	out_be32(&pci_law[0].bar, CONFIG_SYS_PCI1_MEM_PHYS & LAWBAR_BAR);
1864e43b2e8SHeiko Schocher 	out_be32(&pci_law[0].ar, LBLAWAR_EN | LBLAWAR_512MB);
1874e43b2e8SHeiko Schocher 
1884e43b2e8SHeiko Schocher 	out_be32(&pci_law[1].bar, CONFIG_SYS_PCI1_IO_PHYS & LAWBAR_BAR);
1894e43b2e8SHeiko Schocher 	out_be32(&pci_law[1].ar, LBLAWAR_EN | LBLAWAR_1MB);
1904e43b2e8SHeiko Schocher 
1916aa3d3bfSPeter Tyser 	mpc83xx_pci_init(1, reg);
1924e43b2e8SHeiko Schocher }
1934e43b2e8SHeiko Schocher #endif
1944e43b2e8SHeiko Schocher 
1954e43b2e8SHeiko Schocher #if defined(CONFIG_OF_BOARD_SETUP)
ft_board_setup(void * blob,bd_t * bd)196e895a4b0SSimon Glass int ft_board_setup(void *blob, bd_t *bd)
1974e43b2e8SHeiko Schocher {
1984e43b2e8SHeiko Schocher 	ft_cpu_setup(blob, bd);
1994e43b2e8SHeiko Schocher #ifdef CONFIG_PCI
2004e43b2e8SHeiko Schocher 	ft_pci_setup(blob, bd);
2014e43b2e8SHeiko Schocher #endif
202e895a4b0SSimon Glass 
203e895a4b0SSimon Glass 	return 0;
2044e43b2e8SHeiko Schocher }
2054e43b2e8SHeiko Schocher #endif
206