From mboxrd@z Thu Jan 1 00:00:00 1970 From: Scott Wood Date: Tue, 23 Jul 2013 19:21:20 -0500 Subject: [U-Boot] [PATCH 6/7 v9] NAND: TPL : introduce the TPL based on the SPL In-Reply-To: <1374571024-15729-6-git-send-email-ying.zhang@freescale.com> (from ying.zhang@freescale.com on Tue Jul 23 04:17:03 2013) Message-ID: <1374625280.15592.49@snotra> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 07/23/2013 04:17:03 AM, ying.zhang at freescale.com wrote: > From: Ying Zhang > > Due to the nand SPL on some board(e.g. P1022DS)has a size limit, it > can > not be more than 4K. So, the SPL cannot initialize the DDR with the > SPD > code. This patch introduces TPL to enable a loader stub that is loaded > by the code from the SPL. It initializes the DDR with the SPD or other > operations. > > The TPL's size is sizeable, the maximum size is decided by the > memory's > size that TPL runs. It initializes the DDR through SPD code, and copys > final uboot image to DDR. So there are three stage uboot images: > * spl_boot, * tpl_boot, * final uboot image > > This patch is on top of the patch: > SPL: Makefile: Build a separate autoconf.mk for SPL > > Signed-off-by: Ying Zhang > --- > Change from v8: > - Modify the doc/README.TPL. > - Modify the Makefile. > - Modify the drivers/mtd/nand/fsl_elbc_spl.c. > - Modify the spl/Makefile. > Change from v7: > - Modify the doc/README.TPL > - Modify the spl/Makefile. > Change from v6: > - Modify the description of the patch. > - Add the separate the autoconf.mk for TPL. > - Delete the file tpl/Makefile and the directory tpl. > - Reuse the spl/Makefie in TPL. > Change from v5: > - Use ifdef to define "nand_load_image" to non-static for non-SPL. > Change from v4: > - No change. > Change from v3: > - No change. > Change from v2: > - No change. > Change from v1: > - Split from "powerpc/p1022ds: nand: introduce the TPL based on the > SPL". > > Makefile | 53 > +++++++++++++++++++++++++++++++++------ > README | 16 +++++++++++ > config.mk | 30 ++++++++++++++++++++- > doc/README.TPL | 45 > +++++++++++++++++++++++++++++++++ > drivers/mtd/nand/Makefile | 1 + > drivers/mtd/nand/fsl_elbc_spl.c | 20 ++++++++++++++ > spl/Makefile | 29 +++++++++++++++------ > 7 files changed, 176 insertions(+), 18 deletions(-) > create mode 100644 doc/README.TPL > > diff --git a/Makefile b/Makefile > index 64e0ea1..b95ec5b 100644 > --- a/Makefile > +++ b/Makefile > @@ -118,10 +118,11 @@ endif # ifneq ($(BUILD_DIR),) > > OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) > SPLTREE := $(OBJTREE)/spl > +TPLTREE := $(OBJTREE)/tpl > SRCTREE := $(CURDIR) > TOPDIR := $(SRCTREE) > LNDIR := $(OBJTREE) > -export TOPDIR SRCTREE OBJTREE SPLTREE > +export TOPDIR SRCTREE OBJTREE SPLTREE TPLTREE > > MKCONFIG := $(SRCTREE)/mkconfig > export MKCONFIG > @@ -413,6 +414,7 @@ ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin > $(obj)System.map > ALL-$(CONFIG_NAND_U_BOOT) += $(obj)u-boot-nand.bin > ALL-$(CONFIG_ONENAND_U_BOOT) += $(obj)u-boot-onenand.bin > ALL-$(CONFIG_SPL) += $(obj)spl/u-boot-spl.bin > +ALL-$(CONFIG_TPL) += $(obj)tpl/u-boot-tpl.bin > ALL-$(CONFIG_OF_SEPARATE) += $(obj)u-boot.dtb $(obj)u-boot-dtb.bin > ifneq ($(CONFIG_SPL_TARGET),) > ALL-$(CONFIG_SPL) += $(obj)$(subst ",,$(CONFIG_SPL_TARGET)) > @@ -491,13 +493,27 @@ $(obj)u-boot.sha1: $(obj)u-boot.bin > $(obj)u-boot.dis: $(obj)u-boot > $(OBJDUMP) -d $< > $@ > > +# $@ is output, $(1) and $(2) are inputs, $(3) is padded > intermediate, > +# $(4) is pad-to > +SPL_PAD_APPEND = \ > + $(OBJCOPY) ${OBJCFLAGS} --pad-to=$(4) -I binary -O > binary \ > + $(1) $(obj)$(3); \ > + cat $(obj)$(3) $(obj)$(2) > $@; \ > + rm $(obj)$(3) > > +ifdef CONFIG_TPL > +PAD_BIN := $(obj)tpl/u-boot-with-tpl.bin > +else > +PAD_BIN := $(obj)u-boot.bin > +endif I'd call this SPL_PAYLOAD. PAD_BIN sounds like what gets passed in $(3), not $(2). > -$(obj)u-boot-with-spl.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.bin > - $(OBJCOPY) ${OBJCFLAGS} --pad-to=$(CONFIG_SPL_PAD_TO) \ > - -I binary -O binary $< > $(obj)spl/u-boot-spl-pad.bin > - cat $(obj)spl/u-boot-spl-pad.bin $(obj)u-boot.bin > $@ > - rm $(obj)spl/u-boot-spl-pad.bin > +$(obj)u-boot-with-spl.bin: $(obj)spl/u-boot-spl.bin $(PAD_BIN) > + $(call SPL_PAD_APPEND, \ > + > $<,$(PAD_BIN),spl/u-boot-spl-pad.bin,$(CONFIG_SPL_PAD_TO)) > + > +$(obj)tpl/u-boot-with-tpl.bin: $(obj)tpl/u-boot-tpl.bin > $(obj)u-boot.bin > + $(call SPL_PAD_APPEND, \ > + $<,u-boot.bin, > tpl/u-boot-tpl-pad.bin,$(CONFIG_TPL_PAD_TO)) No space before "tpl/u-boot-tpl-pad.bin", and no line break. Did you test this with an out-of-tree build? > $(obj)u-boot-with-spl.imx: $(obj)spl/u-boot-spl.bin $(obj)u-boot.bin > $(MAKE) -C $(SRCTREE)/arch/arm/imx-common \ > @@ -623,6 +639,10 @@ $(obj)u-boot-nand.bin: nand_spl > $(obj)u-boot.bin > $(obj)spl/u-boot-spl.bin: $(SUBDIR_TOOLS) depend > $(MAKE) -C spl all > > +$(obj)tpl/u-boot-tpl.bin: $(SUBDIR_TOOLS) depend > + $(shell [ -d ${TPLTREE} ] || mkdir -p ${TPLTREE}) > + $(MAKE) -C spl all CONFIG_TPL_BUILD=y Let config.mk create the directory. Also, there's no reason to test whether the directory already exists when using "mkdir -p". And you're already in a shell at that point. :-P > diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile > index bb81e84..5270b3c 100644 > --- a/drivers/mtd/nand/Makefile > +++ b/drivers/mtd/nand/Makefile > @@ -39,6 +39,7 @@ COBJS-$(CONFIG_SPL_NAND_SIMPLE) += nand_spl_simple.o > COBJS-$(CONFIG_SPL_NAND_LOAD) += nand_spl_load.o > COBJS-$(CONFIG_SPL_NAND_ECC) += nand_ecc.o > COBJS-$(CONFIG_SPL_NAND_BASE) += nand_base.o > +COBJS-$(CONFIG_SPL_ENV_IN_NAND) += nand.o This belongs in the next patch. It's about the mpc85xx NAND TPL, not about TPL in general. Likewise with the fsl_elbc_spl.c changes. > diff --git a/drivers/mtd/nand/fsl_elbc_spl.c > b/drivers/mtd/nand/fsl_elbc_spl.c > index 50ff4fe..9b959d1 100644 > --- a/drivers/mtd/nand/fsl_elbc_spl.c > +++ b/drivers/mtd/nand/fsl_elbc_spl.c > @@ -47,7 +47,11 @@ static void nand_wait(void) > } > } > > +#ifdef CONFIG_TPL_BUILD > +int nand_spl_load_image(uint32_t offs, unsigned int uboot_size, void > *vdst) > +#else > static int nand_load_image(uint32_t offs, unsigned int uboot_size, > void *vdst) > +#endif > { > fsl_lbc_t *regs = LBC_BASE_ADDR; > uchar *buf = (uchar *)CONFIG_SYS_NAND_BASE; > @@ -137,19 +141,35 @@ void nand_boot(void) > /* > * Load U-Boot image from NAND into RAM > */ > +#ifdef CONFIG_TPL_BUILD > + nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS, > + CONFIG_SYS_NAND_U_BOOT_SIZE, > + (void *)CONFIG_SYS_NAND_U_BOOT_DST); > +#else > nand_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS, > CONFIG_SYS_NAND_U_BOOT_SIZE, > (void *)CONFIG_SYS_NAND_U_BOOT_DST); > +#endif Please use a #define to control the name of the function so the callers can stay the same -- and add a comment explaining why we don't just always use nand_spl_load_image (non-static makes the code too large for certain SPLs). > #ifdef CONFIG_NAND_ENV_DST > +#ifdef CONFIG_TPL_BUILD > + nand_spl_load_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, > + (void *)CONFIG_NAND_ENV_DST); > +#else Whitespace > nand_load_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, > (void *)CONFIG_NAND_ENV_DST); > +#endif > > #ifdef CONFIG_ENV_OFFSET_REDUND > +#ifdef CONFIG_TPL_BUILD > + nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, > CONFIG_ENV_SIZE, > + (void *)CONFIG_NAND_ENV_DST + CONFIG_ENV_SIZE); > +#else Whitespace > diff --git a/spl/Makefile b/spl/Makefile > index eef8c87..37b01e3 100644 > --- a/spl/Makefile > +++ b/spl/Makefile > @@ -18,10 +18,23 @@ > CONFIG_SPL_BUILD := y > export CONFIG_SPL_BUILD > > +ifeq ($(CONFIG_TPL_BUILD),y) > +export CONFIG_TPL_BUILD > +SPL_BIN := u-boot-tpl > +else > +SPL_BIN := u-boot-spl > +endif > + > include $(TOPDIR)/config.mk > > # We want the final binaries in this directory > +ifeq ($(CONFIG_TPL_BUILD),y) > +obj := $(OBJTREE)/tpl/ > +SPL_TREE := $(TPLTREE) > +else > obj := $(OBJTREE)/spl/ > +SPL_TREE := $(SPLTREE) > +endif > > HAVE_VENDOR_COMMON_LIB = $(if $(wildcard > $(SRCTREE)/board/$(VENDOR)/common/Makefile),y,n) > > @@ -111,12 +124,12 @@ endif > > # Add GCC lib > ifeq ("$(USE_PRIVATE_LIBGCC)", "yes") > -PLATFORM_LIBGCC = $(SPLTREE)/arch/$(ARCH)/lib/libgcc.o > +PLATFORM_LIBGCC = $(SPL_TREE)/arch/$(ARCH)/lib/libgcc.o > PLATFORM_LIBS := $(filter-out %/libgcc.o, $(filter-out -lgcc, > $(PLATFORM_LIBS))) $(PLATFORM_LIBGCC) > endif Please do not have one variable named SPLTREE and another named SPL_TREE. -Scott