18bd522ceSDave Liu /* 28bd522ceSDave Liu * Copyright (C) 2007 Freescale Semiconductor, Inc. 38bd522ceSDave Liu * 48bd522ceSDave Liu * Author: Scott Wood <scottwood@freescale.com> 58bd522ceSDave Liu * Dave Liu <daveliu@freescale.com> 68bd522ceSDave Liu * 78bd522ceSDave Liu * See file CREDITS for list of people who contributed to this 88bd522ceSDave Liu * project. 98bd522ceSDave Liu * 108bd522ceSDave Liu * This program is free software; you can redistribute it and/or 118bd522ceSDave Liu * modify it under the terms of the GNU General Public License as 128bd522ceSDave Liu * published by the Free Software Foundation; either version 2 of 138bd522ceSDave Liu * the License, or (at your option) any later version. 148bd522ceSDave Liu * 158bd522ceSDave Liu * This program is distributed in the hope that it will be useful, 168bd522ceSDave Liu * but WITHOUT ANY WARRANTY; without even the implied warranty of 178bd522ceSDave Liu * MERCHANTABILITY or FITNESS for A PARTICULAR PURPOSE. See the 188bd522ceSDave Liu * GNU General Public License for more details. 198bd522ceSDave Liu * 208bd522ceSDave Liu * You should have received a copy of the GNU General Public License 218bd522ceSDave Liu * along with this program; if not, write to the Free Software 228bd522ceSDave Liu * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 238bd522ceSDave Liu * MA 02111-1307 USA 248bd522ceSDave Liu */ 258bd522ceSDave Liu 268bd522ceSDave Liu #include <common.h> 27b8b71ffbSAnton Vorontsov #include <hwconfig.h> 288bd522ceSDave Liu #include <i2c.h> 298bd522ceSDave Liu #include <libfdt.h> 3025f5f0d4SAnton Vorontsov #include <fdt_support.h> 318bd522ceSDave Liu #include <pci.h> 328bd522ceSDave Liu #include <mpc83xx.h> 3310efa024SBen Warren #include <netdev.h> 348f11e34bSAnton Vorontsov #include <asm/io.h> 35*2e95004dSAnton Vorontsov #include <ns16550.h> 36*2e95004dSAnton Vorontsov #include <nand.h> 378bd522ceSDave Liu 388bd522ceSDave Liu DECLARE_GLOBAL_DATA_PTR; 398bd522ceSDave Liu 408bd522ceSDave Liu int board_early_init_f(void) 418bd522ceSDave Liu { 426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *im = (immap_t *)CONFIG_SYS_IMMR; 438bd522ceSDave Liu 448bd522ceSDave Liu if (im->pmc.pmccr1 & PMCCR1_POWER_OFF) 458bd522ceSDave Liu gd->flags |= GD_FLG_SILENT; 468bd522ceSDave Liu 478bd522ceSDave Liu return 0; 488bd522ceSDave Liu } 498bd522ceSDave Liu 50*2e95004dSAnton Vorontsov #ifndef CONFIG_NAND_SPL 51*2e95004dSAnton Vorontsov 528bd522ceSDave Liu static u8 read_board_info(void) 538bd522ceSDave Liu { 548bd522ceSDave Liu u8 val8; 558bd522ceSDave Liu i2c_set_bus_num(0); 568bd522ceSDave Liu 576d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_read(CONFIG_SYS_I2C_PCF8574A_ADDR, 0, 0, &val8, 1) == 0) 588bd522ceSDave Liu return val8; 598bd522ceSDave Liu else 608bd522ceSDave Liu return 0; 618bd522ceSDave Liu } 628bd522ceSDave Liu 638bd522ceSDave Liu int checkboard(void) 648bd522ceSDave Liu { 658bd522ceSDave Liu static const char * const rev_str[] = { 668bd522ceSDave Liu "0.0", 678bd522ceSDave Liu "0.1", 688bd522ceSDave Liu "1.0", 698bd522ceSDave Liu "1.1", 708bd522ceSDave Liu "<unknown>", 718bd522ceSDave Liu }; 728bd522ceSDave Liu u8 info; 738bd522ceSDave Liu int i; 748bd522ceSDave Liu 758bd522ceSDave Liu info = read_board_info(); 768bd522ceSDave Liu i = (!info) ? 4: info & 0x03; 778bd522ceSDave Liu 788bd522ceSDave Liu printf("Board: Freescale MPC8315ERDB Rev %s\n", rev_str[i]); 798bd522ceSDave Liu 808bd522ceSDave Liu return 0; 818bd522ceSDave Liu } 828bd522ceSDave Liu 838bd522ceSDave Liu static struct pci_region pci_regions[] = { 848bd522ceSDave Liu { 856d0f6bcfSJean-Christophe PLAGNIOL-VILLARD bus_start: CONFIG_SYS_PCI_MEM_BASE, 866d0f6bcfSJean-Christophe PLAGNIOL-VILLARD phys_start: CONFIG_SYS_PCI_MEM_PHYS, 876d0f6bcfSJean-Christophe PLAGNIOL-VILLARD size: CONFIG_SYS_PCI_MEM_SIZE, 888bd522ceSDave Liu flags: PCI_REGION_MEM | PCI_REGION_PREFETCH 898bd522ceSDave Liu }, 908bd522ceSDave Liu { 916d0f6bcfSJean-Christophe PLAGNIOL-VILLARD bus_start: CONFIG_SYS_PCI_MMIO_BASE, 926d0f6bcfSJean-Christophe PLAGNIOL-VILLARD phys_start: CONFIG_SYS_PCI_MMIO_PHYS, 936d0f6bcfSJean-Christophe PLAGNIOL-VILLARD size: CONFIG_SYS_PCI_MMIO_SIZE, 948bd522ceSDave Liu flags: PCI_REGION_MEM 958bd522ceSDave Liu }, 968bd522ceSDave Liu { 976d0f6bcfSJean-Christophe PLAGNIOL-VILLARD bus_start: CONFIG_SYS_PCI_IO_BASE, 986d0f6bcfSJean-Christophe PLAGNIOL-VILLARD phys_start: CONFIG_SYS_PCI_IO_PHYS, 996d0f6bcfSJean-Christophe PLAGNIOL-VILLARD size: CONFIG_SYS_PCI_IO_SIZE, 1008bd522ceSDave Liu flags: PCI_REGION_IO 1018bd522ceSDave Liu } 1028bd522ceSDave Liu }; 1038bd522ceSDave Liu 1048f11e34bSAnton Vorontsov static struct pci_region pcie_regions_0[] = { 1058f11e34bSAnton Vorontsov { 1068f11e34bSAnton Vorontsov .bus_start = CONFIG_SYS_PCIE1_MEM_BASE, 1078f11e34bSAnton Vorontsov .phys_start = CONFIG_SYS_PCIE1_MEM_PHYS, 1088f11e34bSAnton Vorontsov .size = CONFIG_SYS_PCIE1_MEM_SIZE, 1098f11e34bSAnton Vorontsov .flags = PCI_REGION_MEM, 1108f11e34bSAnton Vorontsov }, 1118f11e34bSAnton Vorontsov { 1128f11e34bSAnton Vorontsov .bus_start = CONFIG_SYS_PCIE1_IO_BASE, 1138f11e34bSAnton Vorontsov .phys_start = CONFIG_SYS_PCIE1_IO_PHYS, 1148f11e34bSAnton Vorontsov .size = CONFIG_SYS_PCIE1_IO_SIZE, 1158f11e34bSAnton Vorontsov .flags = PCI_REGION_IO, 1168f11e34bSAnton Vorontsov }, 1178f11e34bSAnton Vorontsov }; 1188f11e34bSAnton Vorontsov 1198f11e34bSAnton Vorontsov static struct pci_region pcie_regions_1[] = { 1208f11e34bSAnton Vorontsov { 1218f11e34bSAnton Vorontsov .bus_start = CONFIG_SYS_PCIE2_MEM_BASE, 1228f11e34bSAnton Vorontsov .phys_start = CONFIG_SYS_PCIE2_MEM_PHYS, 1238f11e34bSAnton Vorontsov .size = CONFIG_SYS_PCIE2_MEM_SIZE, 1248f11e34bSAnton Vorontsov .flags = PCI_REGION_MEM, 1258f11e34bSAnton Vorontsov }, 1268f11e34bSAnton Vorontsov { 1278f11e34bSAnton Vorontsov .bus_start = CONFIG_SYS_PCIE2_IO_BASE, 1288f11e34bSAnton Vorontsov .phys_start = CONFIG_SYS_PCIE2_IO_PHYS, 1298f11e34bSAnton Vorontsov .size = CONFIG_SYS_PCIE2_IO_SIZE, 1308f11e34bSAnton Vorontsov .flags = PCI_REGION_IO, 1318f11e34bSAnton Vorontsov }, 1328f11e34bSAnton Vorontsov }; 1338f11e34bSAnton Vorontsov 1348bd522ceSDave Liu void pci_init_board(void) 1358bd522ceSDave Liu { 1366d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile immap_t *immr = (volatile immap_t *)CONFIG_SYS_IMMR; 1378f11e34bSAnton Vorontsov volatile sysconf83xx_t *sysconf = &immr->sysconf; 1388bd522ceSDave Liu volatile clk83xx_t *clk = (volatile clk83xx_t *)&immr->clk; 1398bd522ceSDave Liu volatile law83xx_t *pci_law = immr->sysconf.pcilaw; 1408f11e34bSAnton Vorontsov volatile law83xx_t *pcie_law = sysconf->pcielaw; 1418bd522ceSDave Liu struct pci_region *reg[] = { pci_regions }; 1428f11e34bSAnton Vorontsov struct pci_region *pcie_reg[] = { pcie_regions_0, pcie_regions_1, }; 1438bd522ceSDave Liu int warmboot; 1448bd522ceSDave Liu 1458bd522ceSDave Liu /* Enable all 3 PCI_CLK_OUTPUTs. */ 1468bd522ceSDave Liu clk->occr |= 0xe0000000; 1478bd522ceSDave Liu 1488bd522ceSDave Liu /* 1498bd522ceSDave Liu * Configure PCI Local Access Windows 1508bd522ceSDave Liu */ 1516d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_law[0].bar = CONFIG_SYS_PCI_MEM_PHYS & LAWBAR_BAR; 1528bd522ceSDave Liu pci_law[0].ar = LBLAWAR_EN | LBLAWAR_512MB; 1538bd522ceSDave Liu 1546d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_law[1].bar = CONFIG_SYS_PCI_IO_PHYS & LAWBAR_BAR; 1558bd522ceSDave Liu pci_law[1].ar = LBLAWAR_EN | LBLAWAR_1MB; 1568bd522ceSDave Liu 1578bd522ceSDave Liu warmboot = gd->bd->bi_bootflags & BOOTFLAG_WARM; 1588bd522ceSDave Liu warmboot |= immr->pmc.pmccr1 & PMCCR1_POWER_OFF; 1598bd522ceSDave Liu 1608bd522ceSDave Liu mpc83xx_pci_init(1, reg, warmboot); 1618f11e34bSAnton Vorontsov 1628f11e34bSAnton Vorontsov /* Configure the clock for PCIE controller */ 1638f11e34bSAnton Vorontsov clrsetbits_be32(&clk->sccr, SCCR_PCIEXP1CM | SCCR_PCIEXP2CM, 1648f11e34bSAnton Vorontsov SCCR_PCIEXP1CM_1 | SCCR_PCIEXP2CM_1); 1658f11e34bSAnton Vorontsov 1668f11e34bSAnton Vorontsov /* Deassert the resets in the control register */ 1678f11e34bSAnton Vorontsov out_be32(&sysconf->pecr1, 0xE0008000); 1688f11e34bSAnton Vorontsov out_be32(&sysconf->pecr2, 0xE0008000); 1698f11e34bSAnton Vorontsov udelay(2000); 1708f11e34bSAnton Vorontsov 1718f11e34bSAnton Vorontsov /* Configure PCI Express Local Access Windows */ 1728f11e34bSAnton Vorontsov out_be32(&pcie_law[0].bar, CONFIG_SYS_PCIE1_BASE & LAWBAR_BAR); 1738f11e34bSAnton Vorontsov out_be32(&pcie_law[0].ar, LBLAWAR_EN | LBLAWAR_512MB); 1748f11e34bSAnton Vorontsov 1758f11e34bSAnton Vorontsov out_be32(&pcie_law[1].bar, CONFIG_SYS_PCIE2_BASE & LAWBAR_BAR); 1768f11e34bSAnton Vorontsov out_be32(&pcie_law[1].ar, LBLAWAR_EN | LBLAWAR_512MB); 1778f11e34bSAnton Vorontsov 1788f11e34bSAnton Vorontsov mpc83xx_pcie_init(2, pcie_reg, warmboot); 1798bd522ceSDave Liu } 1808bd522ceSDave Liu 1818bd522ceSDave Liu #if defined(CONFIG_OF_BOARD_SETUP) 18225f5f0d4SAnton Vorontsov void fdt_tsec1_fixup(void *fdt, bd_t *bd) 18325f5f0d4SAnton Vorontsov { 18425f5f0d4SAnton Vorontsov const char disabled[] = "disabled"; 18525f5f0d4SAnton Vorontsov const char *path; 18625f5f0d4SAnton Vorontsov int ret; 18725f5f0d4SAnton Vorontsov 188b8b71ffbSAnton Vorontsov if (hwconfig_arg_cmp("board_type", "tsec1")) { 189021f6df6SAnton Vorontsov return; 190b8b71ffbSAnton Vorontsov } else if (!hwconfig_arg_cmp("board_type", "ulpi")) { 191b8b71ffbSAnton Vorontsov printf("NOTICE: No or unknown board_type hwconfig specified.\n" 192b8b71ffbSAnton Vorontsov " Assuming board with TSEC1.\n"); 19325f5f0d4SAnton Vorontsov return; 19425f5f0d4SAnton Vorontsov } 19525f5f0d4SAnton Vorontsov 19625f5f0d4SAnton Vorontsov ret = fdt_path_offset(fdt, "/aliases"); 19725f5f0d4SAnton Vorontsov if (ret < 0) { 19825f5f0d4SAnton Vorontsov printf("WARNING: can't find /aliases node\n"); 19925f5f0d4SAnton Vorontsov return; 20025f5f0d4SAnton Vorontsov } 20125f5f0d4SAnton Vorontsov 20225f5f0d4SAnton Vorontsov path = fdt_getprop(fdt, ret, "ethernet0", NULL); 20325f5f0d4SAnton Vorontsov if (!path) { 20425f5f0d4SAnton Vorontsov printf("WARNING: can't find ethernet0 alias\n"); 20525f5f0d4SAnton Vorontsov return; 20625f5f0d4SAnton Vorontsov } 20725f5f0d4SAnton Vorontsov 20825f5f0d4SAnton Vorontsov do_fixup_by_path(fdt, path, "status", disabled, sizeof(disabled), 1); 20925f5f0d4SAnton Vorontsov } 21025f5f0d4SAnton Vorontsov 2118bd522ceSDave Liu void ft_board_setup(void *blob, bd_t *bd) 2128bd522ceSDave Liu { 2138bd522ceSDave Liu ft_cpu_setup(blob, bd); 2148bd522ceSDave Liu #ifdef CONFIG_PCI 2158bd522ceSDave Liu ft_pci_setup(blob, bd); 2168bd522ceSDave Liu #endif 21725f5f0d4SAnton Vorontsov fdt_fixup_dr_usb(blob, bd); 21825f5f0d4SAnton Vorontsov fdt_tsec1_fixup(blob, bd); 2198bd522ceSDave Liu } 2208bd522ceSDave Liu #endif 22110efa024SBen Warren 22210efa024SBen Warren int board_eth_init(bd_t *bis) 22310efa024SBen Warren { 22410efa024SBen Warren cpu_eth_init(bis); /* Initialize TSECs first */ 22510efa024SBen Warren return pci_eth_init(bis); 22610efa024SBen Warren } 227*2e95004dSAnton Vorontsov 228*2e95004dSAnton Vorontsov #else /* CONFIG_NAND_SPL */ 229*2e95004dSAnton Vorontsov 230*2e95004dSAnton Vorontsov int checkboard(void) 231*2e95004dSAnton Vorontsov { 232*2e95004dSAnton Vorontsov puts("Board: Freescale MPC8315ERDB\n"); 233*2e95004dSAnton Vorontsov return 0; 234*2e95004dSAnton Vorontsov } 235*2e95004dSAnton Vorontsov 236*2e95004dSAnton Vorontsov void board_init_f(ulong bootflag) 237*2e95004dSAnton Vorontsov { 238*2e95004dSAnton Vorontsov board_early_init_f(); 239*2e95004dSAnton Vorontsov NS16550_init((NS16550_t)(CONFIG_SYS_IMMR + 0x4500), 240*2e95004dSAnton Vorontsov CONFIG_SYS_NS16550_CLK / 16 / CONFIG_BAUDRATE); 241*2e95004dSAnton Vorontsov puts("NAND boot... "); 242*2e95004dSAnton Vorontsov init_timebase(); 243*2e95004dSAnton Vorontsov initdram(0); 244*2e95004dSAnton Vorontsov relocate_code(CONFIG_SYS_NAND_U_BOOT_RELOC + 0x10000, (gd_t *)gd, 245*2e95004dSAnton Vorontsov CONFIG_SYS_NAND_U_BOOT_RELOC); 246*2e95004dSAnton Vorontsov } 247*2e95004dSAnton Vorontsov 248*2e95004dSAnton Vorontsov void board_init_r(gd_t *gd, ulong dest_addr) 249*2e95004dSAnton Vorontsov { 250*2e95004dSAnton Vorontsov nand_boot(); 251*2e95004dSAnton Vorontsov } 252*2e95004dSAnton Vorontsov 253*2e95004dSAnton Vorontsov void putc(char c) 254*2e95004dSAnton Vorontsov { 255*2e95004dSAnton Vorontsov if (gd->flags & GD_FLG_SILENT) 256*2e95004dSAnton Vorontsov return; 257*2e95004dSAnton Vorontsov 258*2e95004dSAnton Vorontsov if (c == '\n') 259*2e95004dSAnton Vorontsov NS16550_putc((NS16550_t)(CONFIG_SYS_IMMR + 0x4500), '\r'); 260*2e95004dSAnton Vorontsov 261*2e95004dSAnton Vorontsov NS16550_putc((NS16550_t)(CONFIG_SYS_IMMR + 0x4500), c); 262*2e95004dSAnton Vorontsov } 263*2e95004dSAnton Vorontsov 264*2e95004dSAnton Vorontsov #endif /* CONFIG_NAND_SPL */ 265