diff mbox

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

Message ID 1368053157-28317-6-git-send-email-trini@ti.com
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Tom Rini May 8, 2013, 10:45 p.m. UTC
From: Steve Kipisz <s-kipisz2@ti.com>

NOR requires that s_init be within the first 4KiB of the image so that
we can perform the rest of the required pinmuxing to talk with the rest
of NOR that we are found on.  When NOR_BOOT is set we save our
environment in NOR at 512KiB and a redundant copy at 768KiB.

Signed-off-by: Steve Kipisz <s-kipisz2@ti.com>
Signed-off-by: Tom Rini <trini@ti.com>
---
 arch/arm/cpu/armv7/am33xx/emif4.c |    6 +-
 board/ti/am335x/Makefile          |    2 +-
 board/ti/am335x/board.c           |   31 ++++++++++-
 board/ti/am335x/mux.c             |    6 +-
 board/ti/am335x/u-boot.lds        |  110 +++++++++++++++++++++++++++++++++++++
 boards.cfg                        |    1 +
 include/configs/am335x_evm.h      |   27 ++++++++-
 7 files changed, 174 insertions(+), 9 deletions(-)
 create mode 100644 board/ti/am335x/u-boot.lds

Comments

Peter Korsgaard May 12, 2013, 9:34 p.m. UTC | #1
>>>>> "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@lists.denx.de
 Tom> http://lists.denx.de/mailman/listinfo/u-boot
Tom Rini May 12, 2013, 9:42 p.m. UTC | #2
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 05/12/2013 05:34 PM, Peter Korsgaard wrote:
>>>>>> "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.

Frankly, I'm allergic to SPL for NOR.  It's the historical and well
understood case, we're r/o until we move from flash to DDR.  And it is
fast enough here at least that it doesn't seem like we'd gain on
falcon mode like we do on other medium.

- -- 
Tom
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBAgAGBQJRkAy9AAoJENk4IS6UOR1WxigP/1S8n8bVGDSsBR89VR3ned+9
MXaIGwzm449ifV28VI0R8NrnEi/GLrcPBVBdaKkaJuHI/rsApX4hAmYxYIVT7JeK
mCPARP/ZxLoGWLqsfTMqfuoGcqzhBU0tOWHZ2WiGr/lf3ChMR4yw/O/HjD1R4Ew+
46EVMfgte5AQ11Xv47vdMrG8i15WbPDqotYA/gRUlz/bpBGSXkZpmFHyXzfH7NE2
3buO3V+Z76dLUMaWgetFg5gGtbJ6EVhC1oZKWgPym46h63HwMhhtl8APGS1goE+j
8ilKilQZEKQz9bh4t3jhQcCYqvG3YFY/xvjq10dviujVBD173dd4AI63S0PyN3gV
1m1nwdlkUZfGQqsQpq2fiJ2MgD78hKomsrszz6+Rqdy20bDTdWQXERjTUWnc2UGg
tcF2OzIe63W+RFgnY+9jkYsYnj+NofJYgeD2prFc5/mT5ObPeQKSUQ7c5ZMMjibo
aZ+XwknoBjv76YgPzdUZADkazqnbHiXf0ulPjpviOjSK9Gh+WhLArTQuwQkWjGEi
1CTlvJspb8UcxNycNl9sYdVVtRNO/80UM/vwjvwPHsrsdSUQuo0GVcuhq/YQxhw6
CnA2jUFLsODdROauLTdee5e1F2tZKtGSFWe6qy09C5kTWoc+9g3HN0ix+Q64JSVO
nN3t5RKPCLleQxV0V44E
=lkA1
-----END PGP SIGNATURE-----
Peter Korsgaard May 12, 2013, 9:53 p.m. UTC | #3
>>>>> "Tom" == Tom Rini <trini@ti.com> writes:

 >> Why not use SPL when booting from NOR as well? You still want to 
 >> relocate into DDR.

 Tom> Frankly, I'm allergic to SPL for NOR.  It's the historical and well
 Tom> understood case, we're r/o until we move from flash to DDR.  And it is
 Tom> fast enough here at least that it doesn't seem like we'd gain on
 Tom> falcon mode like we do on other medium.

Ok. It would be good to mention this in the commit message.
Tom Rini May 13, 2013, 1:35 p.m. UTC | #4
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 05/12/2013 05:53 PM, Peter Korsgaard wrote:
>>>>>> "Tom" == Tom Rini <trini@ti.com> writes:
> 
>>> Why not use SPL when booting from NOR as well? You still want
>>> to relocate into DDR.
> 
> Tom> Frankly, I'm allergic to SPL for NOR.  It's the historical and
> well Tom> understood case, we're r/o until we move from flash to
> DDR.  And it is Tom> fast enough here at least that it doesn't seem
> like we'd gain on Tom> falcon mode like we do on other medium.
> 
> Ok. It would be good to mention this in the commit message.

I'll reword things slightly.

- -- 
Tom
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBAgAGBQJRkOwwAAoJENk4IS6UOR1WD/sP/RzsGGI7Bi8WdwOZRmukJLsD
47NHRtTbCAcdSNCbkbaKcibO17Id7HILJMo6k7OPFIO5R4/qACfzjCgod06f5439
Ex3306B952p/udozgk+U6+HctDcfAr58zhOQe2zSEP7tQVh3mK9tOMiZfCWoyNo4
liBaAot6e0qWaddnTaoePbTz4fRoRGs7ayEovnIo1/6hPhtZKPowZmf5+3D/+iSg
+jnfOnzLU2CY8xKSMC77ZnkuaeKzsjPShz94r5TXhNdPrmCN450l21uZ6HdxjM9J
qjSKxjdVuxitWdFdqaRAFenuyzplxyH5Tj0IVxz/dcxcm3zBmLf6uMGOeMU33mjr
oRbOjVlcAGFTRkwjQ0JaTEjokGaEkw7o/AT5nchBNKJq+btn28Ql6UvSnl0NUtfq
qj4rG5mgkYNIxNNgvJfHNkYr5yP74CFxIE0U8G+wtjENNd7AOpE7OX4DVChkfdi5
vzrAWSBAml1r4hOtXKuzCZeAb/hHn0+1t84QC6z/mdnZ4+1P504alFkoOST3tkW3
FUJa4P/aLHwQxoLDbxkAUeMtgsirPx7KZzsOYxQZck6jy+DS6LVj5VtTUtpnXqYu
u3vZRQqYOAPYo3e9g55Vg2pdumJopCBvlp9bVb3JIhymekMFRLwvS3gKvLM+kgQe
ZOj62cEWS/LiVK0LQzIT
=3p8m
-----END PGP SIGNATURE-----
diff mbox

Patch

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