[U-Boot] [PATCH 6/7] arm: ls102xa: Add SD boot support for LS1021AQDS board

Albert ARIBAUD albert.u.boot at aribaud.net
Thu Sep 18 13:20:42 CEST 2014


Hi Alison,

On Thu, 18 Sep 2014 13:47:18 +0800, Alison Wang <b18965 at freescale.com>
wrote:

> This patch adds SD boot support for LS1021AQDS board. SPL
> framework is used. PBL initialize the internal RAM and copy
> SPL to it, then SPL initialize DDR using SPD and copy u-boot
> from SD card to DDR, finally SPL transfer control to u-boot.
> 
> Signed-off-by: Alison Wang <alison.wang at freescale.com>
> Signed-off-by: Jason Jin <jason.jin at freescale.com>
> ---
>  arch/arm/cpu/armv7/ls102xa/Makefile           |  1 +
>  arch/arm/cpu/armv7/ls102xa/spl.c              | 35 +++++++++++
>  arch/arm/cpu/armv7/ls102xa/u-boot-spl.lds     | 89 +++++++++++++++++++++++++++
>  arch/arm/include/asm/arch-ls102xa/spl.h       | 20 ++++++
>  board/freescale/ls1021aqds/MAINTAINERS        |  1 +
>  board/freescale/ls1021aqds/ddr.c              |  5 +-
>  board/freescale/ls1021aqds/ls1021aqds.c       | 31 ++++++++++
>  board/freescale/ls1021aqds/ls102xa_pbi.cfg    |  8 +++
>  board/freescale/ls1021aqds/ls102xa_rcw_sd.cfg | 14 +++++
>  configs/ls1021aqds_sdcard_defconfig           |  4 ++
>  include/configs/ls1021aqds.h                  | 67 ++++++++++++++++++++
>  11 files changed, 274 insertions(+), 1 deletion(-)
>  create mode 100644 arch/arm/cpu/armv7/ls102xa/spl.c
>  create mode 100644 arch/arm/cpu/armv7/ls102xa/u-boot-spl.lds
>  create mode 100644 arch/arm/include/asm/arch-ls102xa/spl.h
>  create mode 100644 board/freescale/ls1021aqds/ls102xa_pbi.cfg
>  create mode 100644 board/freescale/ls1021aqds/ls102xa_rcw_sd.cfg
>  create mode 100644 configs/ls1021aqds_sdcard_defconfig
> 
> diff --git a/arch/arm/cpu/armv7/ls102xa/Makefile b/arch/arm/cpu/armv7/ls102xa/Makefile
> index d82ce8d..56ef3a7 100644
> --- a/arch/arm/cpu/armv7/ls102xa/Makefile
> +++ b/arch/arm/cpu/armv7/ls102xa/Makefile
> @@ -10,3 +10,4 @@ obj-y	+= timer.o
>  
>  obj-$(CONFIG_OF_LIBFDT) += fdt.o
>  obj-$(CONFIG_SYS_HAS_SERDES) += fsl_ls1_serdes.o ls102xa_serdes.o
> +obj-$(CONFIG_SPL) += spl.o
> diff --git a/arch/arm/cpu/armv7/ls102xa/spl.c b/arch/arm/cpu/armv7/ls102xa/spl.c
> new file mode 100644
> index 0000000..77ea1ee
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/ls102xa/spl.c
> @@ -0,0 +1,35 @@
> +/*
> + * Copyright 2014 Freescale Semiconductor, Inc.
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <spl.h>
> +
> +u32 spl_boot_device(void)
> +{
> +#ifdef CONFIG_SPL_MMC_SUPPORT
> +	return BOOT_DEVICE_MMC1;
> +#endif
> +	return BOOT_DEVICE_NAND;
> +}
> +
> +u32 spl_boot_mode(void)
> +{
> +	switch (spl_boot_device()) {
> +	case BOOT_DEVICE_MMC1:
> +#ifdef CONFIG_SPL_FAT_SUPPORT
> +		return MMCSD_MODE_FAT;
> +#else
> +		return MMCSD_MODE_RAW;
> +#endif
> +		break;
> +	case BOOT_DEVICE_NAND:
> +		return 0;
> +		break;
> +	default:
> +		puts("spl: error: unsupported device\n");
> +		hang();
> +	}
> +}
> diff --git a/arch/arm/cpu/armv7/ls102xa/u-boot-spl.lds b/arch/arm/cpu/armv7/ls102xa/u-boot-spl.lds
> new file mode 100644
> index 0000000..10671e7
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/ls102xa/u-boot-spl.lds
> @@ -0,0 +1,89 @@
> +/*
> + * Copyright (c) 2004-2008 Texas Instruments
> + *
> + * (C) Copyright 2002
> + * Gary Jennejohn, DENX Software Engineering, <garyj at denx.de>
> + *
> + * Copyright 2014 Freescale Semiconductor, Inc.
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
> +OUTPUT_ARCH(arm)
> +ENTRY(_start)
> +SECTIONS
> +{
> +	. = 0x00000000;
> +
> +	. = ALIGN(4);
> +	.text :
> +	{
> +		__image_copy_start = .;
> +		*(.vectors)
> +		CPUDIR/start.o (.text*)
> +		*(.text*)
> +	}
> +
> +	. = ALIGN(4);
> +	.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
> +
> +	. = ALIGN(4);
> +	.data : {
> +		*(.data*)
> +	}
> +
> +	. = ALIGN(4);
> +	.u_boot_list : {
> +		KEEP(*(SORT(.u_boot_list*_i2c_*)));
> +	}

IS this required? And if it is, could it not be added to the
arch/arm/cpu/u-boot-spl.lds file? This way you would not need an .lds
file at all.

> +	. = .;
> +
> +	__image_copy_end = .;
> +
> +	.rel.dyn : {
> +		__rel_dyn_start = .;
> +		*(.rel*)
> +		__rel_dyn_end = .;
> +	}
> +
> +	.end :
> +	{
> +		*(.__end)
> +	}
> +
> +	_image_binary_end = .;
> +
> +	.bss __rel_dyn_start (OVERLAY) : {
> +		__bss_start = .;
> +		*(.bss*)
> +		 . = ALIGN(4);
> +		__bss_end = .;
> +	}
> +
> +	.dynsym _image_binary_end : { *(.dynsym) }
> +	.dynbss : { *(.dynbss) }
> +	.dynstr : { *(.dynstr*) }
> +	.dynamic : { *(.dynamic*) }
> +	.hash : { *(.hash*) }
> +	.plt : { *(.plt*) }
> +	.interp : { *(.interp*) }
> +	.gnu : { *(.gnu*) }
> +	.ARM.exidx : { *(.ARM.exidx*) }
> +}
> +
> +#if defined(CONFIG_SPL_MAX_SIZE)
> +ASSERT(__image_copy_end - __image_copy_start < (CONFIG_SPL_MAX_SIZE), \
> +	"SPL image too big");
> +#endif
> +
> +#if defined(CONFIG_SPL_BSS_MAX_SIZE)
> +ASSERT(__bss_end - __bss_start < (CONFIG_SPL_BSS_MAX_SIZE), \
> +	"SPL image BSS too big");
> +#endif
> +
> +#if defined(CONFIG_SPL_MAX_FOOTPRINT)
> +ASSERT(__bss_end - _start < (CONFIG_SPL_MAX_FOOTPRINT), \
> +	"SPL image plus BSS too big");
> +#endif
> diff --git a/arch/arm/include/asm/arch-ls102xa/spl.h b/arch/arm/include/asm/arch-ls102xa/spl.h
> new file mode 100644
> index 0000000..26e4ea1
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-ls102xa/spl.h
> @@ -0,0 +1,20 @@
> +/*
> + * Copyright 2014 Freescale Semiconductor, Inc.
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#ifndef __ASM_ARCH_SPL_H__
> +#define __ASM_ARCH_SPL_H__
> +
> +#define BOOT_DEVICE_NONE	0
> +#define BOOT_DEVICE_XIP		1
> +#define BOOT_DEVICE_XIPWAIT	2
> +#define BOOT_DEVICE_NAND	3
> +#define BOOT_DEVICE_ONENAND	4
> +#define BOOT_DEVICE_MMC1	5
> +#define BOOT_DEVICE_MMC2	6
> +#define BOOT_DEVICE_MMC2_2	7
> +#define BOOT_DEVICE_SPI		10
> +
> +#endif	/* __ASM_ARCH_SPL_H__ */
> diff --git a/board/freescale/ls1021aqds/MAINTAINERS b/board/freescale/ls1021aqds/MAINTAINERS
> index 021d82b..9244057 100644
> --- a/board/freescale/ls1021aqds/MAINTAINERS
> +++ b/board/freescale/ls1021aqds/MAINTAINERS
> @@ -4,3 +4,4 @@ S:	Maintained
>  F:	board/freescale/ls1021aqds/
>  F:	include/configs/ls1021aqds.h
>  F:	configs/ls1021aqds_nor_defconfig
> +F:	configs/ls1021aqds_sdcard_defconfig
> diff --git a/board/freescale/ls1021aqds/ddr.c b/board/freescale/ls1021aqds/ddr.c
> index 679c654..369088e 100644
> --- a/board/freescale/ls1021aqds/ddr.c
> +++ b/board/freescale/ls1021aqds/ddr.c
> @@ -146,9 +146,12 @@ phys_size_t initdram(int board_type)
>  {
>  	phys_size_t dram_size;
>  
> +#if defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SPL)
>  	puts("Initializing DDR....using SPD\n");
>  	dram_size = fsl_ddr_sdram();
> -
> +#else
> +	dram_size =  fsl_ddr_sdram_size();
> +#endif
>  	return dram_size;
>  }
>  
> diff --git a/board/freescale/ls1021aqds/ls1021aqds.c b/board/freescale/ls1021aqds/ls1021aqds.c
> index 12e83f7..85a53c9 100644
> --- a/board/freescale/ls1021aqds/ls1021aqds.c
> +++ b/board/freescale/ls1021aqds/ls1021aqds.c
> @@ -13,6 +13,7 @@
>  #include <mmc.h>
>  #include <fsl_esdhc.h>
>  #include <fsl_ifc.h>
> +#include <spl.h>
>  
>  #include "../common/qixis.h"
>  #include "ls1021aqds_qixis.h"
> @@ -29,10 +30,13 @@ enum {
>  int checkboard(void)
>  {
>  	char buf[64];
> +#if !defined(CONFIG_SD_BOOT) && !defined(CONFIG_QSPI_BOOT)
>  	u8 sw;
> +#endif
>  
>  	puts("Board: LS1021AQDS\n");
>  
> +#if !defined(CONFIG_SD_BOOT) && !defined(CONFIG_QSPI_BOOT)
>  	sw = QIXIS_READ(brdcfg[0]);
>  	sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
>  
> @@ -46,6 +50,7 @@ int checkboard(void)
>  		printf("IFCCard\n");
>  	else
>  		printf("invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH);
> +#endif
>  
>  	printf("Sys ID:0x%02x, Sys Ver: 0x%02x\n",
>  	       QIXIS_READ(id), QIXIS_READ(arch));
> @@ -155,6 +160,32 @@ int board_early_init_f(void)
>  	return 0;
>  }
>  
> +#ifdef CONFIG_SPL_BUILD
> +void board_init_f(ulong dummy)
> +{
> +	struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
> +
> +	/* Set global data pointer */
> +	gd = &gdata;
> +
> +	/* Clear the BSS */
> +	memset(__bss_start, 0, __bss_end - __bss_start);
> +
> +	get_clocks();
> +
> +	preloader_console_init();
> +
> +#ifdef CONFIG_SPL_I2C_SUPPORT
> +	i2c_init_all();
> +#endif
> +	out_le32(&cci->ctrl_ord, CCI400_CTRLORD_TERM_BARRIER);
> +
> +	dram_init();
> +
> +	board_init_r(NULL, 0);
> +}
> +#endif
> +
>  int config_board_mux(int ctrl_type)
>  {
>  	u8 reg12;
> diff --git a/board/freescale/ls1021aqds/ls102xa_pbi.cfg b/board/freescale/ls1021aqds/ls102xa_pbi.cfg
> new file mode 100644
> index 0000000..edf9f94
> --- /dev/null
> +++ b/board/freescale/ls1021aqds/ls102xa_pbi.cfg
> @@ -0,0 +1,8 @@
> +#PBI commands
> +
> +#Configure Scratch register
> +09ee0200 10000000
> +#Configure alternate space
> +09570158 00080000
> +#Flush PBL data
> +096100c0 000FFFFF
> diff --git a/board/freescale/ls1021aqds/ls102xa_rcw_sd.cfg b/board/freescale/ls1021aqds/ls102xa_rcw_sd.cfg
> new file mode 100644
> index 0000000..e05ec16
> --- /dev/null
> +++ b/board/freescale/ls1021aqds/ls102xa_rcw_sd.cfg
> @@ -0,0 +1,14 @@
> +#PBL preamble and RCW header
> +aa55aa55 01ee0100
> +
> +#enable IFC, disable QSPI and DSPI
> +#0608000a 00000000 00000000 00000000
> +#00000000 00404000 60025a00 21042000
> +#00200000 00000000 00000000 01038000
> +#00000000 001b1200 00000000 00000000
> +
> +#disable IFC, enable QSPI and DSPI
> +0608000a 00000000 00000000 00000000
> +60000000 00407900 e0025a00 21046000
> +00000000 00000000 00000000 00038000
> +20024800 001b7200 00000000 00000000
> diff --git a/configs/ls1021aqds_sdcard_defconfig b/configs/ls1021aqds_sdcard_defconfig
> new file mode 100644
> index 0000000..e03c3b4
> --- /dev/null
> +++ b/configs/ls1021aqds_sdcard_defconfig
> @@ -0,0 +1,4 @@
> +CONFIG_SPL=y
> +CONFIG_SYS_EXTRA_OPTIONS="RAMBOOT_PBL,SPL_FSL_PBL,SD_BOOT"
> ++S:CONFIG_ARM=y
> ++S:CONFIG_TARGET_LS1021AQDS=y
> diff --git a/include/configs/ls1021aqds.h b/include/configs/ls1021aqds.h
> index 657e3b6..440c118 100644
> --- a/include/configs/ls1021aqds.h
> +++ b/include/configs/ls1021aqds.h
> @@ -37,8 +37,48 @@ unsigned long get_board_sys_clk(void);
>  unsigned long get_board_ddr_clk(void);
>  #endif
>  
> +#if defined(CONFIG_SD_BOOT) || defined(CONFIG_QSPI_BOOT)
> +#define CONFIG_SYS_CLK_FREQ            100000000
> +#define CONFIG_DDR_CLK_FREQ            100000000
> +#define CONFIG_QIXIS_I2C_ACCESS
> +#else
>  #define CONFIG_SYS_CLK_FREQ		get_board_sys_clk()
>  #define CONFIG_DDR_CLK_FREQ		get_board_ddr_clk()
> +#endif
> +
> +#ifdef CONFIG_RAMBOOT_PBL
> +#define CONFIG_SYS_FSL_PBL_PBI	board/freescale/ls1021aqds/ls102xa_pbi.cfg
> +#endif
> +
> +#ifdef CONFIG_SD_BOOT
> +#define CONFIG_SYS_FSL_PBL_RCW	board/freescale/ls1021aqds/ls102xa_rcw_sd.cfg
> +#define CONFIG_SPL_PBL_PAD
> +#define CONFIG_SPL_FRAMEWORK
> +#define CONFIG_SPL_LDSCRIPT	"arch/arm/cpu/armv7/ls102xa/u-boot-spl.lds"
> +#define CONFIG_SPL_LIBCOMMON_SUPPORT
> +#define CONFIG_SPL_LIBGENERIC_SUPPORT
> +#define CONFIG_SPL_ENV_SUPPORT
> +#define CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT
> +#define CONFIG_SPL_I2C_SUPPORT
> +#define CONFIG_SPL_WATCHDOG_SUPPORT
> +#define CONFIG_SPL_SERIAL_SUPPORT
> +#define CONFIG_SPL_MMC_SUPPORT
> +#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR		0xe8
> +#define CONFIG_SYS_U_BOOT_MAX_SIZE_SECTORS		0x400
> +
> +#define CONFIG_SPL_TEXT_BASE		0x10000000
> +#define CONFIG_SPL_MAX_SIZE		0x1a000
> +#define CONFIG_SPL_STACK		0x1001d000
> +#define CONFIG_SPL_PAD_TO		0x1c000
> +#define CONFIG_SYS_TEXT_BASE		0x82000000
> +
> +#define CONFIG_SYS_SPL_MALLOC_START	0x80200000
> +#define CONFIG_SYS_SPL_MALLOC_SIZE	0x100000
> +#define CONFIG_SPL_BSS_START_ADDR	0x80100000
> +#define CONFIG_SPL_BSS_MAX_SIZE		0x80000
> +#define CONFIG_SYS_MONITOR_LEN		0x80000
> +#define CONFIG_SYS_NO_FLASH
> +#endif
>  
>  #ifndef CONFIG_SYS_TEXT_BASE
>  #define CONFIG_SYS_TEXT_BASE		0x67f80000
> @@ -70,6 +110,7 @@ unsigned long get_board_ddr_clk(void);
>  /*
>   * IFC Definitions
>   */
> +#if !defined(CONFIG_SD_BOOT) && !defined(CONFIG_QSPI_BOOT)
>  #define CONFIG_FSL_IFC
>  #define CONFIG_SYS_FLASH_BASE		0x60000000
>  #define CONFIG_SYS_FLASH_BASE_PHYS	CONFIG_SYS_FLASH_BASE
> @@ -161,6 +202,7 @@ unsigned long get_board_ddr_clk(void);
>  #define CONFIG_CMD_NAND
>  
>  #define CONFIG_SYS_NAND_BLOCK_SIZE	(128 * 1024)
> +#endif
>  
>  /*
>   * QIXIS Definitions
> @@ -322,7 +364,12 @@ unsigned long get_board_ddr_clk(void);
>  
>  #define CONFIG_CMDLINE_TAG
>  #define CONFIG_CMDLINE_EDITING
> +
> +#if !defined(CONFIG_SD_BOOT) && !defined(CONFIG_QSPI_BOOT)
>  #define CONFIG_CMD_IMLS
> +#else
> +#undef CONFIG_CMD_IMLS
> +#endif
>  
>  #define CONFIG_HWCONFIG
>  #define HWCONFIG_BUFFER_SIZE		128
> @@ -370,17 +417,37 @@ unsigned long get_board_ddr_clk(void);
>  #define CONFIG_SYS_INIT_SP_ADDR \
>  	(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
>  
> +#ifdef CONFIG_SPL_BUILD
> +#define CONFIG_SYS_MONITOR_BASE CONFIG_SPL_TEXT_BASE
> +#else
>  #define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE    /* start of monitor */
> +#endif
>  
>  /*
>   * Environment
>   */
>  #define CONFIG_ENV_OVERWRITE
>  
> +#if defined(CONFIG_SD_BOOT)
> +#define CONFIG_ENV_OFFSET		(1024 * 1024)
> +#define CONFIG_ENV_IS_IN_MMC
> +#define CONFIG_SYS_MMC_ENV_DEV		0
> +#define CONFIG_ENV_SIZE			0x2000
> +#elif defined(CONFIG_NAND_BOOT)
> +#define CONFIG_ENV_IS_IN_NAND
> +#define CONFIG_ENV_SIZE			0x2000
> +#define CONFIG_ENV_OFFSET		(10 * CONFIG_SYS_NAND_BLOCK_SIZE)
> +#elif defined(CONFIG_QSPI_BOOT)
> +#define CONFIG_ENV_IS_IN_SPI_FLASH
> +#define CONFIG_ENV_SIZE			0x2000          /* 8KB */
> +#define CONFIG_ENV_OFFSET		0x100000        /* 1MB */
> +#define CONFIG_ENV_SECT_SIZE		0x10000
> +#else
>  #define CONFIG_ENV_IS_IN_FLASH
>  #define CONFIG_ENV_ADDR		(CONFIG_SYS_MONITOR_BASE - CONFIG_ENV_SECT_SIZE)
>  #define CONFIG_ENV_SIZE			0x2000
>  #define CONFIG_ENV_SECT_SIZE		0x20000 /* 128K (one sector) */
> +#endif
>  
>  #define CONFIG_OF_LIBFDT
>  #define CONFIG_OF_BOARD_SETUP


Amicalement,
-- 
Albert.


More information about the U-Boot mailing list