[U-Boot] [PATCH 6/6] am335x_evm: Add support to boot from NOR.

Peter Korsgaard
2013-05-12T21:34:14Z

>>>>> "Tom" == Tom Rini <trini@ti.com> writes:

Tom> From: Steve Kipisz <s-kipisz2@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-kipisz2@ti.com>
Tom> Signed-off-by: Tom Rini <trini@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, <garyj@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 at lists.denx.de
Tom> http://lists.denx.de/mailman/listinfo/u-boot

--
Bye, Peter Korsgaard