From 592f922261993bad8cfb96395342e25eda6776e3 Mon Sep 17 00:00:00 2001 From: Guillaume GARDET Date: Wed, 15 Oct 2014 17:53:12 +0200 Subject: spl: Add EXT support to SPL Add EXT filesystem support to SPL. Signed-off-by: Guillaume GARDET [trini: Fix a warning and checkpatch problems] Signed-off-by: Tom Rini --- common/spl/Makefile | 1 + common/spl/spl_ext.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++ common/spl/spl_mmc.c | 18 ++++++- fs/Makefile | 1 + include/spl.h | 4 ++ 5 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 common/spl/spl_ext.c diff --git a/common/spl/Makefile b/common/spl/Makefile index 64569c2cc6..10a4589969 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 0000000000..d9eba5aef3 --- /dev/null +++ b/common/spl/spl_ext.c @@ -0,0 +1,139 @@ +/* + * 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"); + 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 + 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 a631e0abf6..ee71f793a6 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 18221658fc..51d06fccb6 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 4a63c1d368..16b3566a94 100644 --- a/include/spl.h +++ b/include/spl.h @@ -74,6 +74,10 @@ int spl_load_image_fat_os(block_dev_desc_t *block_dev, int partition); void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image); +/* 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 -- cgit v1.2.1