[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