uboot/common/spl/spl_ext.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2
   3#include <common.h>
   4#include <spl.h>
   5#include <asm/u-boot.h>
   6#include <ext4fs.h>
   7#include <errno.h>
   8#include <image.h>
   9
  10int spl_load_image_ext(struct spl_image_info *spl_image,
  11                       struct blk_desc *block_dev, int partition,
  12                       const char *filename)
  13{
  14        s32 err;
  15        struct image_header *header;
  16        loff_t filelen, actlen;
  17        disk_partition_t part_info = {};
  18
  19        header = spl_get_load_buffer(-sizeof(*header), sizeof(*header));
  20
  21        if (part_get_info(block_dev, partition, &part_info)) {
  22                printf("spl: no partition table found\n");
  23                return -1;
  24        }
  25
  26        ext4fs_set_blk_dev(block_dev, &part_info);
  27
  28        err = ext4fs_mount(0);
  29        if (!err) {
  30#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
  31                printf("%s: ext4fs mount err - %d\n", __func__, err);
  32#endif
  33                goto end;
  34        }
  35
  36        err = ext4fs_open(filename, &filelen);
  37        if (err < 0) {
  38                puts("spl: ext4fs_open failed\n");
  39                goto end;
  40        }
  41        err = ext4fs_read((char *)header, 0, sizeof(struct image_header), &actlen);
  42        if (err < 0) {
  43                puts("spl: ext4fs_read failed\n");
  44                goto end;
  45        }
  46
  47        err = spl_parse_image_header(spl_image, header);
  48        if (err < 0) {
  49                puts("spl: ext: failed to parse image header\n");
  50                goto end;
  51        }
  52
  53        err = ext4fs_read((char *)spl_image->load_addr, 0, filelen, &actlen);
  54
  55end:
  56#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
  57        if (err < 0)
  58                printf("%s: error reading image %s, err - %d\n",
  59                       __func__, filename, err);
  60#endif
  61
  62        return err < 0;
  63}
  64
  65#ifdef CONFIG_SPL_OS_BOOT
  66int spl_load_image_ext_os(struct spl_image_info *spl_image,
  67                          struct blk_desc *block_dev, int partition)
  68{
  69        int err;
  70        __maybe_unused loff_t filelen, actlen;
  71        disk_partition_t part_info = {};
  72        __maybe_unused char *file;
  73
  74        if (part_get_info(block_dev, partition, &part_info)) {
  75                printf("spl: no partition table found\n");
  76                return -1;
  77        }
  78
  79        ext4fs_set_blk_dev(block_dev, &part_info);
  80
  81        err = ext4fs_mount(0);
  82        if (!err) {
  83#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
  84                printf("%s: ext4fs mount err - %d\n", __func__, err);
  85#endif
  86                return -1;
  87        }
  88#if defined(CONFIG_SPL_ENV_SUPPORT)
  89        file = env_get("falcon_args_file");
  90        if (file) {
  91                err = ext4fs_open(file, &filelen);
  92                if (err < 0) {
  93                        puts("spl: ext4fs_open failed\n");
  94                        goto defaults;
  95                }
  96                err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, 0, filelen, &actlen);
  97                if (err < 0) {
  98                        printf("spl: error reading image %s, err - %d, falling back to default\n",
  99                               file, err);
 100                        goto defaults;
 101                }
 102                file = env_get("falcon_image_file");
 103                if (file) {
 104                        err = spl_load_image_ext(spl_image, block_dev,
 105                                                 partition, file);
 106                        if (err != 0) {
 107                                puts("spl: falling back to default\n");
 108                                goto defaults;
 109                        }
 110
 111                        return 0;
 112                } else {
 113                        puts("spl: falcon_image_file not set in environment, falling back to default\n");
 114                }
 115        } else {
 116                puts("spl: falcon_args_file not set in environment, falling back to default\n");
 117        }
 118
 119defaults:
 120#endif
 121
 122        err = ext4fs_open(CONFIG_SPL_FS_LOAD_ARGS_NAME, &filelen);
 123        if (err < 0)
 124                puts("spl: ext4fs_open failed\n");
 125
 126        err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, 0, filelen, &actlen);
 127        if (err < 0) {
 128#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
 129                printf("%s: error reading image %s, err - %d\n",
 130                       __func__, CONFIG_SPL_FS_LOAD_ARGS_NAME, err);
 131#endif
 132                return -1;
 133        }
 134
 135        return spl_load_image_ext(spl_image, block_dev, partition,
 136                        CONFIG_SPL_FS_LOAD_KERNEL_NAME);
 137}
 138#else
 139int spl_load_image_ext_os(struct spl_image_info *spl_image,
 140                          struct blk_desc *block_dev, int partition)
 141{
 142        return -ENOSYS;
 143}
 144#endif
 145