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