From patchwork Wed Oct 15 15:53:12 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guillaume GARDET X-Patchwork-Id: 400019 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 397241400DD for ; Thu, 16 Oct 2014 02:55:25 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 362D7AB599; Wed, 15 Oct 2014 17:55:11 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id xjIhLUoopW7R; Wed, 15 Oct 2014 17:55:11 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 60708A7772; Wed, 15 Oct 2014 17:55:08 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id E44CEA74B5 for ; Wed, 15 Oct 2014 17:54:55 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id A0bT+4r+Za6h for ; Wed, 15 Oct 2014 17:54:55 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from smtp6-g21.free.fr (smtp6-g21.free.fr [212.27.42.6]) by theia.denx.de (Postfix) with ESMTPS id B5F97A7461 for ; Wed, 15 Oct 2014 17:54:52 +0200 (CEST) Received: from OLI01.site (unknown [82.244.147.214]) by smtp6-g21.free.fr (Postfix) with ESMTP id ACF5782318; Wed, 15 Oct 2014 17:53:48 +0200 (CEST) From: Guillaume GARDET To: u-boot@lists.denx.de Date: Wed, 15 Oct 2014 17:53:12 +0200 Message-Id: <1413388395-11425-3-git-send-email-guillaume.gardet@free.fr> X-Mailer: git-send-email 1.8.4.5 In-Reply-To: <1413388395-11425-1-git-send-email-guillaume.gardet@free.fr> References: <20140930133307.GX25506@bill-the-cat> <1413388395-11425-1-git-send-email-guillaume.gardet@free.fr> Cc: Tom Rini Subject: [U-Boot] [PATCH V2 2/5] spl: Add EXT support to SPL X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.13 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de Add EXT filesystem support to SPL. Signed-off-by: Guillaume GARDET Cc: Tom Rini --- common/spl/Makefile | 1 + common/spl/spl_ext.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++ common/spl/spl_mmc.c | 18 ++++++- fs/Makefile | 1 + include/spl.h | 4 ++ 5 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 common/spl/spl_ext.c diff --git a/common/spl/Makefile b/common/spl/Makefile index 64569c2..10a4589 100644 --- a/common/spl/Makefile +++ b/common/spl/Makefile @@ -18,5 +18,6 @@ obj-$(CONFIG_SPL_NET_SUPPORT) += spl_net.o obj-$(CONFIG_SPL_MMC_SUPPORT) += spl_mmc.o obj-$(CONFIG_SPL_USB_SUPPORT) += spl_usb.o obj-$(CONFIG_SPL_FAT_SUPPORT) += spl_fat.o +obj-$(CONFIG_SPL_EXT_SUPPORT) += spl_ext.o obj-$(CONFIG_SPL_SATA_SUPPORT) += spl_sata.o endif diff --git a/common/spl/spl_ext.c b/common/spl/spl_ext.c new file mode 100644 index 0000000..7342268 --- /dev/null +++ b/common/spl/spl_ext.c @@ -0,0 +1,138 @@ +/* + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include +#include + +#ifdef CONFIG_SPL_EXT_SUPPORT +int spl_load_image_ext(block_dev_desc_t *block_dev, + int partition, + const char *filename) +{ + s32 err; + struct image_header *header; + int filelen; + disk_partition_t part_info = {}; + + header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - + sizeof(struct image_header)); + + if (get_partition_info(block_dev, + partition, &part_info)) { + printf("spl: no partition table found\n"); + goto end; + } + + ext4fs_set_blk_dev(block_dev, &part_info); + + err = ext4fs_mount(0); + if (!err) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT + printf("%s: ext4fs mount err - %d\n", __func__, err); +#endif + goto end; + } + + filelen = err = ext4fs_open(filename); + if (err < 0) { + puts("spl: ext4fs_open failed\n"); + goto end; + } + err = ext4fs_read((char *)header, sizeof(struct image_header)); + if (err <= 0) { + puts("spl: ext4fs_read failed\n"); + goto end; + } + + spl_parse_image_header(header); + + err = ext4fs_read((char *)spl_image.load_addr, filelen); + +end: +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT + if (err <= 0) + printf("%s: error reading image %s, err - %d\n", + __func__, filename, err); +#endif + + return (err <= 0); +} + +#ifdef CONFIG_SPL_OS_BOOT +int spl_load_image_ext_os(block_dev_desc_t *block_dev, int partition) +{ + int err; + int filelen; + disk_partition_t part_info = {}; + __maybe_unused char *file; + + if (get_partition_info(block_dev, + partition, &part_info)) { + printf("spl: no partition table found\n"); + return -1; + } + + ext4fs_set_blk_dev(block_dev, &part_info); + + err = ext4fs_mount(0); + if (!err) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT + printf("%s: ext4fs mount err - %d\n", __func__, err); +#endif + return -1; + } + +#if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT) + file = getenv("falcon_args_file"); + if (file) { + filelen = err = ext4fs_open(file); + if (err < 0) { + puts("spl: ext4fs_open failed\n"); + goto defaults; + } + err = ext4fs_read( (void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen); + if (err <= 0) { + printf("spl: error reading image %s, err - %d, falling back to default\n", + file, err); + goto defaults; + } + file = getenv("falcon_image_file"); + if (file) { + err = spl_load_image_ext(block_dev, partition, file); + if (err != 0) { + puts("spl: falling back to default\n"); + goto defaults; + } + + return 0; + } else + puts("spl: falcon_image_file not set in environment, falling back to default\n"); + } else + puts("spl: falcon_args_file not set in environment, falling back to default\n"); + +defaults: +#endif + + filelen = err = ext4fs_open(CONFIG_SPL_FS_LOAD_ARGS_NAME); + if (err < 0) { + puts("spl: ext4fs_open failed\n"); + } + err = ext4fs_read( (void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen); + if (err <= 0) { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT + printf("%s: error reading image %s, err - %d\n", + __func__, CONFIG_SPL_FS_LOAD_ARGS_NAME, err); +#endif + return -1; + } + + return spl_load_image_ext(block_dev, partition, + CONFIG_SPL_FS_LOAD_KERNEL_NAME); +} +#endif +#endif + diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c index a631e0a..ee71f79 100644 --- a/common/spl/spl_mmc.c +++ b/common/spl/spl_mmc.c @@ -100,9 +100,10 @@ void spl_mmc_load_image(void) #endif err = mmc_load_image_raw(mmc, CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR); -#ifdef CONFIG_SPL_FAT_SUPPORT +#if defined(CONFIG_SPL_FAT_SUPPORT) || defined(CONFIG_SPL_EXT_SUPPORT) } else if (boot_mode == MMCSD_MODE_FS) { - debug("boot mode - FAT\n"); + debug("boot mode - FS\n"); +#ifdef CONFIG_SPL_FAT_SUPPORT #ifdef CONFIG_SPL_OS_BOOT if (spl_start_uboot() || spl_load_image_fat_os(&mmc->block_dev, CONFIG_SYS_MMC_SD_FS_BOOT_PARTITION)) @@ -110,7 +111,20 @@ void spl_mmc_load_image(void) err = spl_load_image_fat(&mmc->block_dev, CONFIG_SYS_MMC_SD_FS_BOOT_PARTITION, CONFIG_SPL_FS_LOAD_PAYLOAD_NAME); + if(err) +#endif /* CONFIG_SPL_FAT_SUPPORT */ + { +#ifdef CONFIG_SPL_EXT_SUPPORT +#ifdef CONFIG_SPL_OS_BOOT + if (spl_start_uboot() || spl_load_image_ext_os(&mmc->block_dev, + CONFIG_SYS_MMC_SD_FS_BOOT_PARTITION)) #endif + err = spl_load_image_ext(&mmc->block_dev, + CONFIG_SYS_MMC_SD_FS_BOOT_PARTITION, + CONFIG_SPL_FS_LOAD_PAYLOAD_NAME); +#endif /* CONFIG_SPL_EXT_SUPPORT */ + } +#endif /* defined(CONFIG_SPL_FAT_SUPPORT) || defined(CONFIG_SPL_EXT_SUPPORT) */ #ifdef CONFIG_SUPPORT_EMMC_BOOT } else if (boot_mode == MMCSD_MODE_EMMCBOOT) { /* diff --git a/fs/Makefile b/fs/Makefile index 1822165..51d06fc 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -8,6 +8,7 @@ ifdef CONFIG_SPL_BUILD obj-$(CONFIG_SPL_FAT_SUPPORT) += fat/ +obj-$(CONFIG_SPL_EXT_SUPPORT) += ext4/ else obj-y += fs.o diff --git a/include/spl.h b/include/spl.h index 58c81dc..f4688c0 100644 --- a/include/spl.h +++ b/include/spl.h @@ -72,6 +72,10 @@ void spl_sata_load_image(void); int spl_load_image_fat(block_dev_desc_t *block_dev, int partition, const char *filename); int spl_load_image_fat_os(block_dev_desc_t *block_dev, int partition); +/* SPL EXT image functions */ +int spl_load_image_ext(block_dev_desc_t *block_dev, int partition, const char *filename); +int spl_load_image_ext_os(block_dev_desc_t *block_dev, int partition); + #ifdef CONFIG_SPL_BOARD_INIT void spl_board_init(void); #endif