[U-Boot] [PATCH v3 3/5] NAND boot: MPC8536DS support

Wolfgang Denk wd at denx.de
Tue Sep 22 21:15:30 CEST 2009


Dear Mingkai Hu,

In message <1252649951-28543-2-git-send-email-Mingkai.hu at freescale.com> you wrote:
> MPC8536E can support booting from NAND flash which uses the
> image u-boot-nand.bin. This image contains two parts: a 4K
> NAND loader and a main U-Boot image. The former is appended
> to the latter to produce u-boot-nand.bin. The 4K NAND loader
> includes the corresponding nand_spl directory, along with the
> code twisted by CONFIG_NAND_SPL. The main U-Boot image just
> like a general U-Boot image except the parts that included by
> CONFIG_SYS_RAMBOOT.
...
> diff --git a/cpu/mpc85xx/nand_init.c b/cpu/mpc85xx/nand_init.c
> new file mode 100644
> index 0000000..c29b22d
...
> +void cpu_init_early_f(void)
> +{
> +	int i;
> +
> +	/* Pointer is writable since we allocated a register for it */
> +	gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
> +
> +	/* Clear initial global data */
> +	for (i = 0; i < sizeof(gd_t); i++)
> +		((char *)gd)[i] = 0;
> +
> +	set_tlb(0, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,
> +		MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> +		1, 0, BOOKE_PAGESZ_4K, 0);
> +
> +	/* set up CCSR if we want it moved */
> +#if (CONFIG_SYS_CCSRBAR_DEFAULT != CONFIG_SYS_CCSRBAR_PHYS)
> +	{
> +		volatile u32 *ccsr_virt =
> +			(volatile u32 *)(CONFIG_SYS_CCSRBAR + 0x1000);

Please do not declare vaiables righjt in the middle of the code.
Consider moving this code into a separate function instead.

> diff --git a/cpu/mpc85xx/u-boot-nand.lds b/cpu/mpc85xx/u-boot-nand.lds
> index c14e946..a0fc8f1 100644
> --- a/cpu/mpc85xx/u-boot-nand.lds
> +++ b/cpu/mpc85xx/u-boot-nand.lds
> @@ -65,10 +65,8 @@ SECTIONS
>      PROVIDE (etext = .);
>      .rodata    :
>     {
> -    *(.rodata)
> -    *(.rodata1)
> -    *(.rodata.str1.4)
>      *(.eh_frame)
> +    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))

Please rebase your patch against current code.

...
>  /*
> + * Config the L2 Cache as L2 SRAM
> + */
> +#define CONFIG_SYS_INIT_L2_ADDR		0xf8f80000
> +#ifdef CONFIG_PHYS_64BIT
> +#define CONFIG_SYS_INIT_L2_ADDR_PHYS	0xff8f80000ull
> +#else
> +#define CONFIG_SYS_INIT_L2_ADDR_PHYS	CONFIG_SYS_INIT_L2_ADDR
> +#endif
> +#define CONFIG_SYS_L2_SIZE		(512 << 10)
> +#define CONFIG_SYS_INIT_L2_END		(CONFIG_SYS_INIT_L2_ADDR + CONFIG_SYS_L2_SIZE)

Line too long, please fix globally.

> diff --git a/nand_spl/board/freescale/mpc8536ds/Makefile b/nand_spl/board/freescale/mpc8536ds/Makefile
> new file mode 100644
> index 0000000..c9104d3
> --- /dev/null
> +++ b/nand_spl/board/freescale/mpc8536ds/Makefile
...
> +$(obj)start.S:
> +	@rm -f $(obj)start.S
> +	ln -sf $(SRCTREE)/cpu/mpc85xx/start.S $(obj)start.S
> +
> +$(obj)resetvec.S:
> +	@rm -f $(obj)resetvec.S
> +	ln -s $(SRCTREE)/cpu/$(CPU)/resetvec.S $(obj)resetvec.S
> +
> +$(obj)nand_boot_fsl_elbc.c:
> +	@rm -f $(obj)nand_boot_fsl_elbc.c
> +	ln -sf $(SRCTREE)/nand_spl/nand_boot_fsl_elbc.c \
> +	       $(obj)nand_boot_fsl_elbc.c
> +
> +$(obj)ns16550.c:
> +	@rm -f $(obj)ns16550.c
> +	ln -sf $(SRCTREE)/drivers/serial/ns16550.c $(obj)ns16550.c
> +
> +$(obj)nand_init.c:
> +	@rm -f $(obj)nand_init.c
> +	ln -sf $(SRCTREE)/cpu/mpc85xx/nand_init.c $(obj)nand_init.c
> +
> +$(obj)cache.c:
> +	@rm -f $(obj)cache.c
> +	ln -sf $(SRCTREE)/lib_ppc/cache.c $(obj)cache.c
> +
> +$(obj)tlb.c:
> +	@rm -f $(obj)tlb.c
> +	ln -sf $(SRCTREE)/cpu/mpc85xx/tlb.c $(obj)tlb.c
> +
> +$(obj)tlb_table.c:
> +	@rm -f $(obj)tlb_table.c
> +	ln -sf $(SRCTREE)/board/$(BOARDDIR)/tlb.c $(obj)tlb_table.c

Consider using the same file name here; it will simplify the Makefile
rules.

> +
> +$(obj)law.c:
> +	@rm -f $(obj)law.c
> +	ln -sf $(SRCTREE)/drivers/misc/fsl_law.c $(obj)law.c

Ditto.

> +
> +$(obj)law_table.c:
> +	@rm -f $(obj)law_table.c
> +	ln -sf $(SRCTREE)/board/$(BOARDDIR)/law.c $(obj)law_table.c

Ditto.

Please sort list.

And why do you need a separate rule everywhere? They look all the
same to me  (except for the inconsistent file names) ?

> +#########################################################################
> +
> +$(obj)%.o:	$(obj)%.S
> +	$(CC) $(AFLAGS) -c -o $@ $<
> +
> +$(obj)%.o:	$(obj)%.c
> +	$(CC) $(CFLAGS) -c -o $@ $<
> +
> +# defines $(obj).depend target
> +include $(SRCTREE)/rules.mk
> +
> +sinclude $(obj).depend
> +
> +#########################################################################
> diff --git a/nand_spl/board/freescale/mpc8536ds/nand_boot.c b/nand_spl/board/freescale/mpc8536ds/nand_boot.c
> new file mode 100644
> index 0000000..77973d1
> --- /dev/null
> +++ b/nand_spl/board/freescale/mpc8536ds/nand_boot.c
...
> +void board_init_f(ulong bootflag)
> +{
> +	u8 sysclk_ratio;
> +	uint plat_ratio, bus_clk, sys_clk;
> +	volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
> +
> +	/* initialize selected port with appropriate baud rate */
> +	sysclk_ratio = *((volatile unsigned char *)(PIXIS_BASE + PIXIS_SPD));

Please use I/O accessors.

...
> +	NS16550_init((NS16550_t)(CONFIG_SYS_CCSRBAR + 0x4500),
> +			bus_clk / 16 / CONFIG_BAUDRATE);

Smells like I/O accessors should be used here (and further down
below), too?


Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Real Programmers always confuse Christmas and Halloween because
OCT 31 == DEC 25 !  - Andrew Rutherford (andrewr at ucs.adelaide.edu.au)


More information about the U-Boot mailing list