>>>>> "Tom" == Tom Rini <tr...@ti.com> writes:
Tom> From: Steve Kipisz <s-kipi...@ti.com> Tom> NOR requires that s_init be within the first 4KiB of the image so that Tom> we can perform the rest of the required pinmuxing to talk with the rest Tom> of NOR that we are found on. When NOR_BOOT is set we save our Tom> environment in NOR at 512KiB and a redundant copy at 768KiB. Why not use SPL when booting from NOR as well? You still want to relocate into DDR. Tom> Signed-off-by: Steve Kipisz <s-kipi...@ti.com> Tom> Signed-off-by: Tom Rini <tr...@ti.com> Tom> --- Tom> arch/arm/cpu/armv7/am33xx/emif4.c | 6 +- Tom> board/ti/am335x/Makefile | 2 +- Tom> board/ti/am335x/board.c | 31 ++++++++++- Tom> board/ti/am335x/mux.c | 6 +- Tom> board/ti/am335x/u-boot.lds | 110 +++++++++++++++++++++++++++++++++++++ Tom> boards.cfg | 1 + Tom> include/configs/am335x_evm.h | 27 ++++++++- Tom> 7 files changed, 174 insertions(+), 9 deletions(-) Tom> create mode 100644 board/ti/am335x/u-boot.lds Tom> diff --git a/arch/arm/cpu/armv7/am33xx/emif4.c b/arch/arm/cpu/armv7/am33xx/emif4.c Tom> index aa84e96..370230b 100644 Tom> --- a/arch/arm/cpu/armv7/am33xx/emif4.c Tom> +++ b/arch/arm/cpu/armv7/am33xx/emif4.c Tom> @@ -43,9 +43,11 @@ void dram_init_banksize(void) Tom> } Tom> -#ifdef CONFIG_SPL_BUILD Tom> +#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_NOR_BOOT) Tom> +#ifdef CONFIG_TI81XX Tom> static struct dmm_lisa_map_regs *hw_lisa_map_regs = Tom> (struct dmm_lisa_map_regs *)DMM_BASE; Tom> +#endif Tom> static struct vtp_reg *vtpreg[2] = { Tom> (struct vtp_reg *)VTP0_CTRL_ADDR, Tom> (struct vtp_reg *)VTP1_CTRL_ADDR}; Tom> @@ -53,6 +55,7 @@ static struct vtp_reg *vtpreg[2] = { Tom> static struct ddr_ctrl *ddrctrl = (struct ddr_ctrl *)DDR_CTRL_ADDR; Tom> #endif Tom> +#ifdef CONFIG_TI81XX Tom> void config_dmm(const struct dmm_lisa_map_regs *regs) Tom> { Tom> enable_dmm_clocks(); Tom> @@ -67,6 +70,7 @@ void config_dmm(const struct dmm_lisa_map_regs *regs) Tom> writel(regs->dmm_lisa_map_1, &hw_lisa_map_regs->dmm_lisa_map_1); Tom> writel(regs->dmm_lisa_map_0, &hw_lisa_map_regs->dmm_lisa_map_0); Tom> } Tom> +#endif Tom> static void config_vtp(int nr) Tom> { Tom> diff --git a/board/ti/am335x/Makefile b/board/ti/am335x/Makefile Tom> index 67a87a1..1795e3e 100644 Tom> --- a/board/ti/am335x/Makefile Tom> +++ b/board/ti/am335x/Makefile Tom> @@ -18,7 +18,7 @@ include $(TOPDIR)/config.mk Tom> LIB = $(obj)lib$(BOARD).o Tom> -ifdef CONFIG_SPL_BUILD Tom> +ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_NOR_BOOT),y) Tom> COBJS := mux.o Tom> endif Tom> diff --git a/board/ti/am335x/board.c b/board/ti/am335x/board.c Tom> index 6f6b5d0..a0ad4bc 100644 Tom> --- a/board/ti/am335x/board.c Tom> +++ b/board/ti/am335x/board.c Tom> @@ -38,7 +38,7 @@ Tom> DECLARE_GLOBAL_DATA_PTR; Tom> static struct wd_timer *wdtimer = (struct wd_timer *)WDT_BASE; Tom> -#ifdef CONFIG_SPL_BUILD Tom> +#if defined(CONFIG_SPL_BUILD) || (CONFIG_NOR_BOOT) Tom> static struct uart_sys *uart_base = (struct uart_sys *)DEFAULT_UART_BASE; Tom> #endif Tom> @@ -94,7 +94,7 @@ static int read_eeprom(struct am335x_baseboard_id *header) Tom> } Tom> /* UART Defines */ Tom> -#ifdef CONFIG_SPL_BUILD Tom> +#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_NOR_BOOT) Tom> #define UART_RESET (0x1 << 1) Tom> #define UART_CLK_RUNNING_MASK 0x1 Tom> #define UART_SMART_IDLE_EN (0x1 << 0x3) Tom> @@ -273,6 +273,24 @@ void s_init(void) Tom> { Tom> __maybe_unused struct am335x_baseboard_id header; Tom> + /* Tom> + * The ROM will only have set up sufficient pinmux to allow for the Tom> + * first 4KiB NOR to be read, we must finish doing what we know of Tom> + * the NOR mux in this space in order to continue. Tom> + */ Tom> +#ifdef CONFIG_NOR_BOOT Tom> + asm("stmfd sp!, {r2 - r4}"); Tom> + asm("movw r4, #0x8A4"); Tom> + asm("movw r3, #0x44E1"); Tom> + asm("orr r4, r4, r3, lsl #16"); Tom> + asm("mov r2, #9"); Tom> + asm("mov r3, #8"); Tom> + asm("gpmc_mux: str r2, [r4], #4"); Tom> + asm("subs r3, r3, #1"); Tom> + asm("bne gpmc_mux"); Tom> + asm("ldmfd sp!, {r2 - r4}"); Tom> +#endif Tom> + Tom> /* WDT1 is already running when the bootloader gets control Tom> * Disable it to avoid "random" resets Tom> */ Tom> @@ -283,7 +301,7 @@ void s_init(void) Tom> while (readl(&wdtimer->wdtwwps) != 0x0) Tom> ; Tom> -#ifdef CONFIG_SPL_BUILD Tom> +#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_NOR_BOOT) Tom> /* Setup the PLLs and the clocks for the peripherals */ Tom> pll_init(); Tom> @@ -324,9 +342,16 @@ void s_init(void) Tom> regVal |= UART_SMART_IDLE_EN; Tom> writel(regVal, &uart_base->uartsyscfg); Tom> +#if defined(CONFIG_NOR_BOOT) Tom> + /* We want our console now. */ Tom> + gd->baudrate = CONFIG_BAUDRATE; Tom> + serial_init(); Tom> + gd->have_console = 1; Tom> +#else Tom> gd = &gdata; Tom> preloader_console_init(); Tom> +#endif Tom> /* Initalize the board header */ Tom> enable_i2c0_pin_mux(); Tom> diff --git a/board/ti/am335x/mux.c b/board/ti/am335x/mux.c Tom> index 187468e..5b7ed63 100644 Tom> --- a/board/ti/am335x/mux.c Tom> +++ b/board/ti/am335x/mux.c Tom> @@ -190,7 +190,7 @@ static struct module_pin_mux nand_pin_mux[] = { Tom> {-1}, Tom> }; Tom> -#if defined(CONFIG_NOR) Tom> +#if defined(CONFIG_NOR) && !defined(CONFIG_NOR_BOOT) Tom> static struct module_pin_mux bone_norcape_pin_mux[] = { Tom> {OFFSET(lcd_data0), MODE(1) | PULLUDEN | RXACTIVE}, /* NOR_A0 */ Tom> {OFFSET(lcd_data1), MODE(1) | PULLUDEN | RXACTIVE}, /* NOR_A1 */ Tom> @@ -317,8 +317,10 @@ void enable_board_pin_mux(struct am335x_baseboard_id *header) Tom> configure_module_pin_mux(i2c1_pin_mux); Tom> configure_module_pin_mux(mii1_pin_mux); Tom> configure_module_pin_mux(mmc0_pin_mux); Tom> +#ifndef CONFIG_NOR Tom> configure_module_pin_mux(mmc1_pin_mux); Tom> -#if defined(CONFIG_NOR) Tom> +#endif Tom> +#if defined(CONFIG_NOR) && !defined(CONFIG_NOR_BOOT) Tom> configure_module_pin_mux(bone_norcape_pin_mux); Tom> #endif Tom> } else if (board_is_gp_evm(header)) { Tom> diff --git a/board/ti/am335x/u-boot.lds b/board/ti/am335x/u-boot.lds Tom> new file mode 100644 Tom> index 0000000..d376743 Tom> --- /dev/null Tom> +++ b/board/ti/am335x/u-boot.lds Tom> @@ -0,0 +1,110 @@ Tom> +/* Tom> + * Copyright (c) 2004-2008 Texas Instruments Tom> + * Tom> + * (C) Copyright 2002 Tom> + * Gary Jennejohn, DENX Software Engineering, <ga...@denx.de> Tom> + * Tom> + * See file CREDITS for list of people who contributed to this Tom> + * project. Tom> + * Tom> + * This program is free software; you can redistribute it and/or Tom> + * modify it under the terms of the GNU General Public License as Tom> + * published by the Free Software Foundation; either version 2 of Tom> + * the License, or (at your option) any later version. Tom> + * Tom> + * This program is distributed in the hope that it will be useful, Tom> + * but WITHOUT ANY WARRANTY; without even the implied warranty of Tom> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Tom> + * GNU General Public License for more details. Tom> + * Tom> + * You should have received a copy of the GNU General Public License Tom> + * along with this program; if not, write to the Free Software Tom> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, Tom> + * MA 02111-1307 USA Tom> + */ Tom> + Tom> +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") Tom> +OUTPUT_ARCH(arm) Tom> +ENTRY(_start) Tom> +SECTIONS Tom> +{ Tom> + . = 0x00000000; Tom> + Tom> + . = ALIGN(4); Tom> + .text : Tom> + { Tom> + __image_copy_start = .; Tom> + CPUDIR/start.o (.text*) Tom> + board/ti/am335x/libam335x.o (.text*) Tom> + *(.text*) Tom> + } Tom> + Tom> + . = ALIGN(4); Tom> + .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } Tom> + Tom> + . = ALIGN(4); Tom> + .data : { Tom> + *(.data*) Tom> + } Tom> + Tom> + . = ALIGN(4); Tom> + Tom> + . = .; Tom> + Tom> + . = ALIGN(4); Tom> + .u_boot_list : { Tom> + KEEP(*(SORT(.u_boot_list*))); Tom> + } Tom> + Tom> + . = ALIGN(4); Tom> + Tom> + __image_copy_end = .; Tom> + Tom> + .rel.dyn : { Tom> + __rel_dyn_start = .; Tom> + *(.rel*) Tom> + __rel_dyn_end = .; Tom> + } Tom> + Tom> + .dynsym : { Tom> + __dynsym_start = .; Tom> + *(.dynsym) Tom> + } Tom> + Tom> + _end = .; Tom> + Tom> + /* Tom> + * Deprecated: this MMU section is used by pxa at present but Tom> + * should not be used by new boards/CPUs. Tom> + */ Tom> + . = ALIGN(4096); Tom> + .mmutable : { Tom> + *(.mmutable) Tom> + } Tom> + Tom> +/* Tom> + * Compiler-generated __bss_start and __bss_end, see arch/arm/lib/bss.c Tom> + * __bss_base and __bss_limit are for linker only (overlay ordering) Tom> + */ Tom> + Tom> + .bss_start __rel_dyn_start (OVERLAY) : { Tom> + KEEP(*(.__bss_start)); Tom> + __bss_base = .; Tom> + } Tom> + Tom> + .bss __bss_base (OVERLAY) : { Tom> + *(.bss*) Tom> + . = ALIGN(4); Tom> + __bss_limit = .; Tom> + } Tom> + Tom> + .bss_end __bss_limit (OVERLAY) : { Tom> + KEEP(*(.__bss_end)); Tom> + } Tom> + Tom> + /DISCARD/ : { *(.dynstr*) } Tom> + /DISCARD/ : { *(.dynamic*) } Tom> + /DISCARD/ : { *(.plt*) } Tom> + /DISCARD/ : { *(.interp*) } Tom> + /DISCARD/ : { *(.gnu*) } Tom> +} Tom> diff --git a/boards.cfg b/boards.cfg Tom> index d74840d..90e018f 100644 Tom> --- a/boards.cfg Tom> +++ b/boards.cfg Tom> @@ -237,6 +237,7 @@ integratorcp_cm946es arm arm946es integrator armltd Tom> ca9x4_ct_vxp arm armv7 vexpress armltd Tom> am335x_evm arm armv7 am335x ti am33xx am335x_evm:SERIAL1,CONS_INDEX=1 Tom> am335x_evm_nor arm armv7 am335x ti am33xx am335x_evm:SERIAL1,CONS_INDEX=1,NOR Tom> +am335x_evm_norboot arm armv7 am335x ti am33xx am335x_evm:SERIAL1,CONS_INDEX=1,NOR,NOR_BOOT Tom> am335x_evm_spiboot arm armv7 am335x ti am33xx am335x_evm:SERIAL1,CONS_INDEX=1,SPI_BOOT Tom> am335x_evm_uart1 arm armv7 am335x ti am33xx am335x_evm:SERIAL2,CONS_INDEX=2 Tom> am335x_evm_uart2 arm armv7 am335x ti am33xx am335x_evm:SERIAL3,CONS_INDEX=3 Tom> diff --git a/include/configs/am335x_evm.h b/include/configs/am335x_evm.h Tom> index 343a4aa..abc477b 100644 Tom> --- a/include/configs/am335x_evm.h Tom> +++ b/include/configs/am335x_evm.h Tom> @@ -39,6 +39,9 @@ Tom> #define CONFIG_SETUP_MEMORY_TAGS Tom> #define CONFIG_INITRD_TAG Tom> +/* Custom script for NOR */ Tom> +#define CONFIG_SYS_LDSCRIPT "board/ti/am335x/u-boot.lds" Tom> + Tom> #define CONFIG_SYS_CACHELINE_SIZE 64 Tom> /* commands to include */ Tom> @@ -300,6 +303,7 @@ Tom> #define CONFIG_ENV_OVERWRITE 1 Tom> #define CONFIG_SYS_CONSOLE_INFO_QUIET Tom> +#ifndef CONFIG_NOR_BOOT Tom> /* Defines for SPL */ Tom> #define CONFIG_SPL Tom> #define CONFIG_SPL_FRAMEWORK Tom> @@ -343,6 +347,8 @@ Tom> #define CONFIG_SPL_NAND_BASE Tom> #define CONFIG_SPL_NAND_DRIVERS Tom> #define CONFIG_SPL_NAND_ECC Tom> +#endif Tom> + Tom> #define CONFIG_SYS_NAND_5_ADDR_CYCLE Tom> #define CONFIG_SYS_NAND_PAGE_COUNT (CONFIG_SYS_NAND_BLOCK_SIZE / \ Tom> CONFIG_SYS_NAND_PAGE_SIZE) Tom> @@ -376,14 +382,18 @@ Tom> * header. That is 0x800FFFC0--0x80100000 should not be used for any Tom> * other needs. Tom> */ Tom> +#ifdef CONFIG_NOR_BOOT Tom> +#define CONFIG_SYS_TEXT_BASE 0x08000000 Tom> +#else Tom> #define CONFIG_SYS_TEXT_BASE 0x80800000 Tom> +#endif Tom> #define CONFIG_SYS_SPL_MALLOC_START 0x80208000 Tom> #define CONFIG_SYS_SPL_MALLOC_SIZE 0x100000 Tom> /* Since SPL did pll and ddr initialization for us, Tom> * we don't need to do it twice. Tom> */ Tom> -#ifndef CONFIG_SPL_BUILD Tom> +#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_NOR_BOOT) Tom> #define CONFIG_SKIP_LOWLEVEL_INIT Tom> #endif Tom> @@ -470,7 +480,7 @@ Tom> #define CONFIG_PHY_ADDR 0 Tom> #define CONFIG_PHY_SMSC Tom> -#if !defined(CONFIG_SPI_BOOT) Tom> +#if !defined(CONFIG_SPI_BOOT) && !defined(CONFIG_NOR_BOOT) Tom> #define CONFIG_NAND Tom> #endif Tom> @@ -520,6 +530,19 @@ Tom> #define CONFIG_SYS_FLASH_BASE (0x08000000) Tom> #define CONFIG_SYS_FLASH_CFI_WIDTH FLASH_CFI_16BIT Tom> #define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_FLASH_BASE Tom> +#ifdef CONFIG_NOR_BOOT Tom> +#define CONFIG_ENV_IS_IN_FLASH Tom> +#define CONFIG_ENV_SECT_SIZE (128 << 10) /* 128 KiB */ Tom> +#define CONFIG_ENV_OFFSET (512 << 10) /* 512 KiB */ Tom> +#define CONFIG_ENV_OFFSET_REDUND (768 << 10) /* 768 KiB */ Tom> +#define CONFIG_CMD_MTDPARTS Tom> +#define MTDIDS_DEFAULT "nor0=physmap-flash.0" Tom> +#define MTDPARTS_DEFAULT "mtdparts=physmap-flash.0:" \ Tom> + "512k(u-boot)," \ Tom> + "128k(u-boot-env1)," \ Tom> + "128k(u-boot-env2)," \ Tom> + "4m(kernel),-(rootfs)" Tom> +#endif Tom> #define CONFIG_MTD_DEVICE Tom> #define CONFIG_CMD_FLASH Tom> #endif /* NOR support */ Tom> -- Tom> 1.7.9.5 Tom> _______________________________________________ Tom> U-Boot mailing list Tom> U-Boot@lists.denx.de Tom> http://lists.denx.de/mailman/listinfo/u-boot -- Bye, Peter Korsgaard _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot