From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Schocher Date: Thu, 21 Jan 2016 07:06:31 +0100 Subject: [U-Boot] [PATCHv4 4/7] spl: support loading from UBI volumes In-Reply-To: <20160117031358.GE28493@localhost.localdomain> References: <20160117030929.GA28493@localhost.localdomain> <20160117031358.GE28493@localhost.localdomain> Message-ID: <56A07567.8070402@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hello Ladislav, Am 17.01.2016 um 04:13 schrieb Ladislav Michl: > Add support for loading from UBI volumes on the top of NAND. > > Signed-off-by: Ladislav Michl > --- > common/spl/Makefile | 3 +++ > common/spl/spl.c | 4 ++++ > common/spl/spl_ubi.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > include/spl.h | 4 ++++ > 4 files changed, 79 insertions(+) > create mode 100644 common/spl/spl_ubi.c Reviewed-by: Heiko Schocher bye, Heiko > > diff --git a/common/spl/Makefile b/common/spl/Makefile > index 10a4589..36e5338 100644 > --- a/common/spl/Makefile > +++ b/common/spl/Makefile > @@ -12,8 +12,11 @@ ifdef CONFIG_SPL_BUILD > obj-$(CONFIG_SPL_FRAMEWORK) += spl.o > obj-$(CONFIG_SPL_NOR_SUPPORT) += spl_nor.o > obj-$(CONFIG_SPL_YMODEM_SUPPORT) += spl_ymodem.o > +ifndef CONFIG_SPL_UBI > obj-$(CONFIG_SPL_NAND_SUPPORT) += spl_nand.o > +endif > obj-$(CONFIG_SPL_ONENAND_SUPPORT) += spl_onenand.o > +obj-$(CONFIG_SPL_UBI) += spl_ubi.o > obj-$(CONFIG_SPL_NET_SUPPORT) += spl_net.o > obj-$(CONFIG_SPL_MMC_SUPPORT) += spl_mmc.o > obj-$(CONFIG_SPL_USB_SUPPORT) += spl_usb.o > diff --git a/common/spl/spl.c b/common/spl/spl.c > index e5167bf..b945a48 100644 > --- a/common/spl/spl.c > +++ b/common/spl/spl.c > @@ -288,8 +288,12 @@ static int spl_load_image(u32 boot_device) > #endif > #ifdef CONFIG_SPL_NAND_SUPPORT > case BOOT_DEVICE_NAND: > +#ifdef CONFIG_SPL_UBI > + return spl_ubi_load_image(boot_device); > +#else > return spl_nand_load_image(); > #endif > +#endif > #ifdef CONFIG_SPL_ONENAND_SUPPORT > case BOOT_DEVICE_ONENAND: > return spl_onenand_load_image(); > diff --git a/common/spl/spl_ubi.c b/common/spl/spl_ubi.c > new file mode 100644 > index 0000000..dd8ce36 > --- /dev/null > +++ b/common/spl/spl_ubi.c > @@ -0,0 +1,68 @@ > +/* > + * Copyright (C) 2016 > + * Ladislav Michl > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +int spl_ubi_load_image(u32 boot_device) > +{ > + int ret; > + struct image_header *header; > + struct ubispl_info info; > + struct ubispl_load volumes[2]; > + > +#ifdef CONFIG_SPL_NAND_SUPPORT > + if (boot_device == BOOT_DEVICE_NAND) > + nand_init(); > +#endif > + info.ubi = (struct ubi_scan_info *) CONFIG_SPL_UBI_INFO_ADDR; > + info.fastmap = 1; > + info.read = nand_spl_read_block; > + > + info.peb_offset = CONFIG_SPL_UBI_PEB_OFFSET; > + info.peb_size = CONFIG_SYS_NAND_BLOCK_SIZE; > + info.vid_offset = CONFIG_SPL_UBI_VID_OFFSET; > + info.leb_start = CONFIG_SPL_UBI_LEB_START; > + info.peb_count = CONFIG_SPL_UBI_MAX_PEBS - info.peb_offset; > + > +#ifdef CONFIG_SPL_OS_BOOT > + if (!spl_start_uboot()) { > + volumes[0].vol_id = CONFIG_SPL_UBI_LOAD_KERNEL_ID; > + volumes[0].load_addr = (void *)CONFIG_SYS_LOAD_ADDR; > + volumes[1].vol_id = CONFIG_SPL_UBI_LOAD_ARGS_ID; > + volumes[1].load_addr = (void *)CONFIG_SYS_SPL_ARGS_ADDR; > + > + ret = ubispl_load_volumes(&info, volumes, 2); > + if (!ret) { > + header = (struct image_header *) volumes[0].load_addr; > + spl_parse_image_header(header); > + puts("Linux loaded.\n"); > + goto out; > + } > + puts("Loading Linux failed, falling back to U-Boot.\n"); > + } > +#endif > + header = (struct image_header *) > + (CONFIG_SYS_TEXT_BASE - sizeof(struct image_header)); > + volumes[0].vol_id = CONFIG_SPL_UBI_LOAD_MONITOR_ID; > + volumes[0].load_addr = (void *)header; > + > + ret = ubispl_load_volumes(&info, volumes, 1); > + if (!ret) > + spl_parse_image_header(header); > +#ifdef CONFIG_SPL_OS_BOOT > +out: > +#endif > +#ifdef CONFIG_SPL_NAND_SUPPORT > + if (boot_device == BOOT_DEVICE_NAND) > + nand_deselect(); > +#endif > + return ret; > +} > diff --git a/include/spl.h b/include/spl.h > index 92cdc04..1ab9295 100644 > --- a/include/spl.h > +++ b/include/spl.h > @@ -40,6 +40,7 @@ u32 spl_boot_mode(void); > void spl_set_header_raw_uboot(void); > void spl_parse_image_header(const struct image_header *header); > void spl_board_prepare_for_linux(void); > +int spl_board_ubi_load_image(u32 boot_device); > void __noreturn jump_to_image_linux(void *arg); > int spl_start_uboot(void); > void spl_display_print(void); > @@ -53,6 +54,9 @@ int spl_onenand_load_image(void); > /* NOR SPL functions */ > int spl_nor_load_image(void); > > +/* UBI SPL functions */ > +int spl_ubi_load_image(u32 boot_device); > + > /* MMC SPL functions */ > int spl_mmc_load_image(u32 boot_device); > > -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany