]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
spl: Add EXT support to SPL
authorGuillaume GARDET <guillaume.gardet@free.fr>
Wed, 15 Oct 2014 15:53:12 +0000 (17:53 +0200)
committerTom Rini <trini@ti.com>
Mon, 27 Oct 2014 21:54:03 +0000 (17:54 -0400)
Add EXT filesystem support to SPL.

Signed-off-by: Guillaume GARDET <guillaume.gardet@free.fr>
[trini: Fix a warning and checkpatch problems]
Signed-off-by: Tom Rini <trini@ti.com>
common/spl/Makefile
common/spl/spl_ext.c [new file with mode: 0644]
common/spl/spl_mmc.c
fs/Makefile
include/spl.h

index 64569c2cc6d563732a259c237db0ac7d52060bc9..10a458996965ac872b3e13a1a6932a1666c85577 100644 (file)
@@ -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 (file)
index 0000000..d9eba5a
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <spl.h>
+#include <asm/u-boot.h>
+#include <ext4fs.h>
+#include <image.h>
+
+#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
index a631e0abf6f553fde86f4c6a042255f51253c072..ee71f793a67ff289f7adba10d3db9d83b7d2182f 100644 (file)
@@ -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) {
                /*
index 18221658fcbd3d79c80ab07c1b53183831cdc451..51d06fccb61ecbe0ad853e021f060fd1b4fdecd4 100644 (file)
@@ -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
 
index 4a63c1d3681523b2251a86a9eb6114cf9ab4337b..16b3566a947398493fe102afa7e210048e1b2429 100644 (file)
@@ -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