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