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