Hi Alison,

On Thu, 18 Sep 2014 13:47:18 +0800, Alison Wang <b18...@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.w...@freescale.com>
> Signed-off-by: Jason Jin <jason....@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, <ga...@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.
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to