1576afd4fSJean-Christophe PLAGNIOL-VILLARD /* 2576afd4fSJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2002 3576afd4fSJean-Christophe PLAGNIOL-VILLARD * Sysgo Real-Time Solutions, GmbH <www.elinos.com> 4576afd4fSJean-Christophe PLAGNIOL-VILLARD * Marius Groeger <mgroeger@sysgo.de> 5576afd4fSJean-Christophe PLAGNIOL-VILLARD * 6576afd4fSJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2002 7576afd4fSJean-Christophe PLAGNIOL-VILLARD * David Mueller, ELSOFT AG, <d.mueller@elsoft.ch> 8576afd4fSJean-Christophe PLAGNIOL-VILLARD * 9576afd4fSJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2003 10576afd4fSJean-Christophe PLAGNIOL-VILLARD * Texas Instruments, <www.ti.com> 11576afd4fSJean-Christophe PLAGNIOL-VILLARD * Kshitij Gupta <Kshitij@ti.com> 12576afd4fSJean-Christophe PLAGNIOL-VILLARD * 13576afd4fSJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2004 14576afd4fSJean-Christophe PLAGNIOL-VILLARD * ARM Ltd. 15576afd4fSJean-Christophe PLAGNIOL-VILLARD * Philippe Robin, <philippe.robin@arm.com> 16576afd4fSJean-Christophe PLAGNIOL-VILLARD * 171a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 18576afd4fSJean-Christophe PLAGNIOL-VILLARD */ 19576afd4fSJean-Christophe PLAGNIOL-VILLARD 20576afd4fSJean-Christophe PLAGNIOL-VILLARD #include <common.h> 21576afd4fSJean-Christophe PLAGNIOL-VILLARD #include <netdev.h> 227c045d0bSLinus Walleij #include <asm/io.h> 23*3f394e70SLinus Walleij #include <dm/platdata.h> 24*3f394e70SLinus Walleij #include <dm/platform_data/serial_pl01x.h> 25701ed16eSLinus Walleij #include "arm-ebi.h" 261dc26801SLinus Walleij #include "integrator-sc.h" 27576afd4fSJean-Christophe PLAGNIOL-VILLARD 28576afd4fSJean-Christophe PLAGNIOL-VILLARD DECLARE_GLOBAL_DATA_PTR; 29576afd4fSJean-Christophe PLAGNIOL-VILLARD 30*3f394e70SLinus Walleij static const struct pl01x_serial_platdata serial_platdata = { 31*3f394e70SLinus Walleij .base = 0x16000000, 32*3f394e70SLinus Walleij #ifdef CONFIG_ARCH_CINTEGRATOR 33*3f394e70SLinus Walleij .type = TYPE_PL011, 34*3f394e70SLinus Walleij .clock = 14745600, 35*3f394e70SLinus Walleij #else 36*3f394e70SLinus Walleij .type = TYPE_PL010, 37*3f394e70SLinus Walleij .clock = 0, /* Not used for PL010 */ 38*3f394e70SLinus Walleij #endif 39*3f394e70SLinus Walleij }; 40*3f394e70SLinus Walleij 41*3f394e70SLinus Walleij U_BOOT_DEVICE(integrator_serials) = { 42*3f394e70SLinus Walleij .name = "serial_pl01x", 43*3f394e70SLinus Walleij .platdata = &serial_platdata, 44*3f394e70SLinus Walleij }; 45*3f394e70SLinus Walleij 46576afd4fSJean-Christophe PLAGNIOL-VILLARD void peripheral_power_enable (void); 47576afd4fSJean-Christophe PLAGNIOL-VILLARD 48576afd4fSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SHOW_BOOT_PROGRESS) 49576afd4fSJean-Christophe PLAGNIOL-VILLARD void show_boot_progress(int progress) 50576afd4fSJean-Christophe PLAGNIOL-VILLARD { 51576afd4fSJean-Christophe PLAGNIOL-VILLARD printf("Boot reached stage %d\n", progress); 52576afd4fSJean-Christophe PLAGNIOL-VILLARD } 53576afd4fSJean-Christophe PLAGNIOL-VILLARD #endif 54576afd4fSJean-Christophe PLAGNIOL-VILLARD 55576afd4fSJean-Christophe PLAGNIOL-VILLARD #define COMP_MODE_ENABLE ((unsigned int)0x0000EAEF) 56576afd4fSJean-Christophe PLAGNIOL-VILLARD 57576afd4fSJean-Christophe PLAGNIOL-VILLARD /* 58576afd4fSJean-Christophe PLAGNIOL-VILLARD * Miscellaneous platform dependent initialisations 59576afd4fSJean-Christophe PLAGNIOL-VILLARD */ 60576afd4fSJean-Christophe PLAGNIOL-VILLARD 61576afd4fSJean-Christophe PLAGNIOL-VILLARD int board_init (void) 62576afd4fSJean-Christophe PLAGNIOL-VILLARD { 63701ed16eSLinus Walleij u32 val; 64701ed16eSLinus Walleij 65576afd4fSJean-Christophe PLAGNIOL-VILLARD /* arch number of Integrator Board */ 66576afd4fSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_ARCH_CINTEGRATOR 67576afd4fSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_CINTEGRATOR; 68576afd4fSJean-Christophe PLAGNIOL-VILLARD #else 69576afd4fSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_arch_number = MACH_TYPE_INTEGRATOR; 70576afd4fSJean-Christophe PLAGNIOL-VILLARD #endif 71576afd4fSJean-Christophe PLAGNIOL-VILLARD 72576afd4fSJean-Christophe PLAGNIOL-VILLARD /* adress of boot parameters */ 73576afd4fSJean-Christophe PLAGNIOL-VILLARD gd->bd->bi_boot_params = 0x00000100; 74576afd4fSJean-Christophe PLAGNIOL-VILLARD 75576afd4fSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CM_REMAP 76576afd4fSJean-Christophe PLAGNIOL-VILLARD extern void cm_remap(void); 77576afd4fSJean-Christophe PLAGNIOL-VILLARD cm_remap(); /* remaps writeable memory to 0x00000000 */ 78576afd4fSJean-Christophe PLAGNIOL-VILLARD #endif 79576afd4fSJean-Christophe PLAGNIOL-VILLARD 801dc26801SLinus Walleij #ifdef CONFIG_ARCH_CINTEGRATOR 81701ed16eSLinus Walleij /* 821dc26801SLinus Walleij * Flash protection on the Integrator/CP is in a simple register 831dc26801SLinus Walleij */ 841dc26801SLinus Walleij val = readl(CP_FLASHPROG); 851dc26801SLinus Walleij val |= (CP_FLASHPROG_FLVPPEN | CP_FLASHPROG_FLWREN); 861dc26801SLinus Walleij writel(val, CP_FLASHPROG); 871dc26801SLinus Walleij #else 881dc26801SLinus Walleij /* 891dc26801SLinus Walleij * The Integrator/AP has some special protection mechanisms 901dc26801SLinus Walleij * for the external memories, first the External Bus Interface (EBI) 911dc26801SLinus Walleij * then the system controller (SC). 921dc26801SLinus Walleij * 93701ed16eSLinus Walleij * The system comes up with the flash memory non-writable and 94701ed16eSLinus Walleij * configuration locked. If we want U-Boot to be used for flash 95701ed16eSLinus Walleij * access we cannot have the flash memory locked. 96701ed16eSLinus Walleij */ 97701ed16eSLinus Walleij writel(EBI_UNLOCK_MAGIC, EBI_BASE + EBI_LOCK_REG); 98701ed16eSLinus Walleij val = readl(EBI_BASE + EBI_CSR1_REG); 99701ed16eSLinus Walleij val &= EBI_CSR_WREN_MASK; 100701ed16eSLinus Walleij val |= EBI_CSR_WREN_ENABLE; 101701ed16eSLinus Walleij writel(val, EBI_BASE + EBI_CSR1_REG); 102701ed16eSLinus Walleij writel(0, EBI_BASE + EBI_LOCK_REG); 103701ed16eSLinus Walleij 1041dc26801SLinus Walleij /* 1051dc26801SLinus Walleij * Set up the system controller to remove write protection from 1061dc26801SLinus Walleij * the flash memory and enable Vpp 1071dc26801SLinus Walleij */ 1081dc26801SLinus Walleij writel(SC_CTRL_FLASHVPP | SC_CTRL_FLASHWP, SC_CTRLS); 1091dc26801SLinus Walleij #endif 1101dc26801SLinus Walleij 111576afd4fSJean-Christophe PLAGNIOL-VILLARD icache_enable (); 112576afd4fSJean-Christophe PLAGNIOL-VILLARD 113576afd4fSJean-Christophe PLAGNIOL-VILLARD return 0; 114576afd4fSJean-Christophe PLAGNIOL-VILLARD } 115576afd4fSJean-Christophe PLAGNIOL-VILLARD 116576afd4fSJean-Christophe PLAGNIOL-VILLARD int misc_init_r (void) 117576afd4fSJean-Christophe PLAGNIOL-VILLARD { 118576afd4fSJean-Christophe PLAGNIOL-VILLARD setenv("verify", "n"); 119576afd4fSJean-Christophe PLAGNIOL-VILLARD return (0); 120576afd4fSJean-Christophe PLAGNIOL-VILLARD } 121576afd4fSJean-Christophe PLAGNIOL-VILLARD 12246b5ccbfSLinus Walleij /* 12346b5ccbfSLinus Walleij * The Integrator remaps the Flash memory to 0x00000000 and executes U-Boot 12446b5ccbfSLinus Walleij * from there, which means we cannot test the RAM underneath the ROM at this 12546b5ccbfSLinus Walleij * point. It will be unmapped later on, when we are executing from the 12646b5ccbfSLinus Walleij * relocated in RAM U-Boot. We simply assume that this RAM is usable if the 12746b5ccbfSLinus Walleij * RAM on higher addresses works fine. 12846b5ccbfSLinus Walleij */ 12946b5ccbfSLinus Walleij #define REMAPPED_FLASH_SZ 0x40000 13046b5ccbfSLinus Walleij 131576afd4fSJean-Christophe PLAGNIOL-VILLARD int dram_init (void) 132576afd4fSJean-Christophe PLAGNIOL-VILLARD { 13326c82638SLinus Walleij gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE; 134576afd4fSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CM_SPD_DETECT 135576afd4fSJean-Christophe PLAGNIOL-VILLARD { 136576afd4fSJean-Christophe PLAGNIOL-VILLARD extern void dram_query(void); 1377c045d0bSLinus Walleij u32 cm_reg_sdram; 1387c045d0bSLinus Walleij u32 sdram_shift; 139576afd4fSJean-Christophe PLAGNIOL-VILLARD 140576afd4fSJean-Christophe PLAGNIOL-VILLARD dram_query(); /* Assembler accesses to CM registers */ 141576afd4fSJean-Christophe PLAGNIOL-VILLARD /* Queries the SPD values */ 142576afd4fSJean-Christophe PLAGNIOL-VILLARD 143576afd4fSJean-Christophe PLAGNIOL-VILLARD /* Obtain the SDRAM size from the CM SDRAM register */ 144576afd4fSJean-Christophe PLAGNIOL-VILLARD 1457c045d0bSLinus Walleij cm_reg_sdram = readl(CM_BASE + OS_SDRAM); 146576afd4fSJean-Christophe PLAGNIOL-VILLARD /* Register SDRAM size 147576afd4fSJean-Christophe PLAGNIOL-VILLARD * 148576afd4fSJean-Christophe PLAGNIOL-VILLARD * 0xXXXXXXbbb000bb 16 MB 149576afd4fSJean-Christophe PLAGNIOL-VILLARD * 0xXXXXXXbbb001bb 32 MB 150576afd4fSJean-Christophe PLAGNIOL-VILLARD * 0xXXXXXXbbb010bb 64 MB 151576afd4fSJean-Christophe PLAGNIOL-VILLARD * 0xXXXXXXbbb011bb 128 MB 152576afd4fSJean-Christophe PLAGNIOL-VILLARD * 0xXXXXXXbbb100bb 256 MB 153576afd4fSJean-Christophe PLAGNIOL-VILLARD * 154576afd4fSJean-Christophe PLAGNIOL-VILLARD */ 155576afd4fSJean-Christophe PLAGNIOL-VILLARD sdram_shift = ((cm_reg_sdram & 0x0000001C)/4)%4; 15646b5ccbfSLinus Walleij gd->ram_size = get_ram_size((long *) CONFIG_SYS_SDRAM_BASE + 15746b5ccbfSLinus Walleij REMAPPED_FLASH_SZ, 15826c82638SLinus Walleij 0x01000000 << sdram_shift); 159576afd4fSJean-Christophe PLAGNIOL-VILLARD } 16026c82638SLinus Walleij #else 16146b5ccbfSLinus Walleij gd->ram_size = get_ram_size((long *) CONFIG_SYS_SDRAM_BASE + 16246b5ccbfSLinus Walleij REMAPPED_FLASH_SZ, 16326c82638SLinus Walleij PHYS_SDRAM_1_SIZE); 164576afd4fSJean-Christophe PLAGNIOL-VILLARD #endif /* CM_SPD_DETECT */ 16546b5ccbfSLinus Walleij /* We only have one bank of RAM, set it to whatever was detected */ 16646b5ccbfSLinus Walleij gd->bd->bi_dram[0].size = gd->ram_size; 167576afd4fSJean-Christophe PLAGNIOL-VILLARD 168576afd4fSJean-Christophe PLAGNIOL-VILLARD return 0; 169576afd4fSJean-Christophe PLAGNIOL-VILLARD } 170576afd4fSJean-Christophe PLAGNIOL-VILLARD 1717194ab80SBen Warren #ifdef CONFIG_CMD_NET 172576afd4fSJean-Christophe PLAGNIOL-VILLARD int board_eth_init(bd_t *bis) 173576afd4fSJean-Christophe PLAGNIOL-VILLARD { 1747194ab80SBen Warren int rc = 0; 1757194ab80SBen Warren #ifdef CONFIG_SMC91111 1767194ab80SBen Warren rc = smc91111_initialize(0, CONFIG_SMC91111_BASE); 1777194ab80SBen Warren #endif 1787194ab80SBen Warren rc += pci_eth_init(bis); 1797194ab80SBen Warren return rc; 180576afd4fSJean-Christophe PLAGNIOL-VILLARD } 181576afd4fSJean-Christophe PLAGNIOL-VILLARD #endif 182