Hi Stefan, 2012/8/27 Stefan Roese <s...@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 <s...@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 <s...@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@lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot -- Best regards, Daniel _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot