[U-Boot] [PATCH v2 04/12] SPL: Add NOR flash booting support
Daniel Schwierzeck
daniel.schwierzeck at gmail.com
Mon Aug 27 19:29:17 CEST 2012
Hi Stefan,
2012/8/27 Stefan Roese <sr at denx.de>:
> SPL NOR flash booting support is quite simple. Only copying of the
> images is needed.
>
> On MPC5xxx we need to make sure to only use the standard memcpy()
> implementation and not the MPC5xxx specific one. As the MPC5xxx
> version has some complexity which is not needed for this SPL
> booting.
>
> Signed-off-by: Stefan Roese <sr at denx.de>
> ---
> Changes in v2:
> - Add option to skip copying of the mkimage header
>
> common/spl/Makefile | 1 +
> common/spl/spl.c | 5 ++++
> common/spl/spl_nor.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> include/spl.h | 3 +++
> 4 files changed, 80 insertions(+)
> create mode 100644 common/spl/spl_nor.c
>
> diff --git a/common/spl/Makefile b/common/spl/Makefile
> index b61b438..53a82c4 100644
> --- a/common/spl/Makefile
> +++ b/common/spl/Makefile
> @@ -15,6 +15,7 @@ LIB = $(obj)libspl.o
>
> ifdef CONFIG_SPL_BUILD
> COBJS-$(CONFIG_SPL_FRAMEWORK) += spl.o
> +COBJS-$(CONFIG_SPL_NOR_SUPPORT) += spl_nor.o
> COBJS-$(CONFIG_SPL_YMODEM_SUPPORT) += spl_ymodem.o
> endif
>
> diff --git a/common/spl/spl.c b/common/spl/spl.c
> index 13bebbc..61936ee 100644
> --- a/common/spl/spl.c
> +++ b/common/spl/spl.c
> @@ -155,6 +155,11 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
> spl_nand_load_image();
> break;
> #endif
> +#ifdef CONFIG_SPL_NOR_SUPPORT
> + case BOOT_DEVICE_NOR:
> + spl_nor_load_image();
> + break;
> +#endif
> #ifdef CONFIG_SPL_YMODEM_SUPPORT
> case BOOT_DEVICE_UART:
> spl_ymodem_load_image();
> diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c
> new file mode 100644
> index 0000000..a1c13a4
> --- /dev/null
> +++ b/common/spl/spl_nor.c
> @@ -0,0 +1,71 @@
> +/*
> + * Copyright (C) 2012 Stefan Roese <sr at 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.
> + */
> +
> +#include <common.h>
> +#include <spl.h>
> +
> +/*
> + * Don't use the special MPC5xxx memcpy implementation, only use
> + * the standard one.
> + */
> +#if defined(CONFIG_MPC512X) || defined(CONFIG_MPC5200)
> +extern void *__memcpy(void *, const void *, size_t);
> +#define memcpy __memcpy
> +#endif
can't we move this to arch-specifc spl code?
I think arch/CPU/SoC specific definitions should be avoided in new
generic frameworks.
how about:
__weak void *spl_memcpy(void *dst, const void *src, size_t size)
{
return memcpy(dst, src, size);
}
and in arch/powerpc/cpu/mpc5xxx/spl_boot.c:
void *spl_memcpy(void *dst, const void *src, size_t size)
{
return __memcpy(dst, src, size);
}
> +
> +void spl_nor_load_image(void)
> +{
> + /*
> + * Loading of the payload to SDRAM is done with skipping of
> + * the mkimage header in this SPL NOR driver
> + */
> + spl_image.flags |= SPL_COPY_PAYLOAD_ONLY;
> +
> + if (spl_start_uboot()) {
> + /*
> + * Load real U-Boot from its location in NOR flash to its
> + * defined location in SDRAM
> + */
> + spl_parse_image_header(
> + (const struct image_header *)CONFIG_SYS_UBOOT_BASE);
> +
> + memcpy((void *)spl_image.load_addr,
> + (void *)(CONFIG_SYS_UBOOT_BASE +
> + sizeof(struct image_header)),
> + spl_image.size);
> + } else {
> + /*
> + * Load Linux from its location in NOR flash to its defined
> + * location in SDRAM
> + */
> + spl_parse_image_header(
> + (const struct image_header *)CONFIG_SYS_OS_BASE);
> +
> + memcpy((void *)spl_image.load_addr,
> + (void *)(CONFIG_SYS_OS_BASE +
> + sizeof(struct image_header)),
> + spl_image.size);
> +
> + /*
> + * Copy DT blob (fdt) to SDRAM. Passing pointer to flash
> + * doesn't work (16 KiB should be enough for DT)
> + */
> + memcpy((void *)CONFIG_SYS_SPL_ARGS_ADDR,
> + (void *)(CONFIG_SYS_FDT_BASE),
> + (16 << 10));
> + }
> +}
> diff --git a/include/spl.h b/include/spl.h
> index 673c4a4..4a76239 100644
> --- a/include/spl.h
> +++ b/include/spl.h
> @@ -60,6 +60,9 @@ void spl_display_print(void);
> /* NAND SPL functions */
> void spl_nand_load_image(void);
>
> +/* NOR SPL functions */
> +void spl_nor_load_image(void);
> +
> /* MMC SPL functions */
> void spl_mmc_load_image(void);
>
> --
> 1.7.12
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
--
Best regards,
Daniel
More information about the U-Boot
mailing list