1592f9222SGuillaume GARDET /* 2592f9222SGuillaume GARDET * SPDX-License-Identifier: GPL-2.0+ 3592f9222SGuillaume GARDET */ 4592f9222SGuillaume GARDET 5592f9222SGuillaume GARDET #include <common.h> 6592f9222SGuillaume GARDET #include <spl.h> 7592f9222SGuillaume GARDET #include <asm/u-boot.h> 8592f9222SGuillaume GARDET #include <ext4fs.h> 9339245b7SNikita Kiryanov #include <errno.h> 10592f9222SGuillaume GARDET #include <image.h> 11592f9222SGuillaume GARDET 12592f9222SGuillaume GARDET #ifdef CONFIG_SPL_EXT_SUPPORT 134101f687SSimon Glass int spl_load_image_ext(struct blk_desc *block_dev, 14592f9222SGuillaume GARDET int partition, 15592f9222SGuillaume GARDET const char *filename) 16592f9222SGuillaume GARDET { 17592f9222SGuillaume GARDET s32 err; 18592f9222SGuillaume GARDET struct image_header *header; 199f12cd0eSSuriyan Ramasami loff_t filelen, actlen; 20592f9222SGuillaume GARDET disk_partition_t part_info = {}; 21592f9222SGuillaume GARDET 22592f9222SGuillaume GARDET header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - 23592f9222SGuillaume GARDET sizeof(struct image_header)); 24592f9222SGuillaume GARDET 25*3e8bd469SSimon Glass if (part_get_info(block_dev, partition, &part_info)) { 26592f9222SGuillaume GARDET printf("spl: no partition table found\n"); 27592f9222SGuillaume GARDET return -1; 28592f9222SGuillaume GARDET } 29592f9222SGuillaume GARDET 30592f9222SGuillaume GARDET ext4fs_set_blk_dev(block_dev, &part_info); 31592f9222SGuillaume GARDET 32592f9222SGuillaume GARDET err = ext4fs_mount(0); 33592f9222SGuillaume GARDET if (!err) { 34592f9222SGuillaume GARDET #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 35592f9222SGuillaume GARDET printf("%s: ext4fs mount err - %d\n", __func__, err); 36592f9222SGuillaume GARDET #endif 37592f9222SGuillaume GARDET goto end; 38592f9222SGuillaume GARDET } 39592f9222SGuillaume GARDET 409f12cd0eSSuriyan Ramasami err = ext4fs_open(filename, &filelen); 41592f9222SGuillaume GARDET if (err < 0) { 42592f9222SGuillaume GARDET puts("spl: ext4fs_open failed\n"); 43592f9222SGuillaume GARDET goto end; 44592f9222SGuillaume GARDET } 459f12cd0eSSuriyan Ramasami err = ext4fs_read((char *)header, sizeof(struct image_header), &actlen); 46d3e488eaSGuillaume GARDET if (err < 0) { 47592f9222SGuillaume GARDET puts("spl: ext4fs_read failed\n"); 48592f9222SGuillaume GARDET goto end; 49592f9222SGuillaume GARDET } 50592f9222SGuillaume GARDET 51592f9222SGuillaume GARDET spl_parse_image_header(header); 52592f9222SGuillaume GARDET 539f12cd0eSSuriyan Ramasami err = ext4fs_read((char *)spl_image.load_addr, filelen, &actlen); 54592f9222SGuillaume GARDET 55592f9222SGuillaume GARDET end: 56592f9222SGuillaume GARDET #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 57d3e488eaSGuillaume GARDET if (err < 0) 58592f9222SGuillaume GARDET printf("%s: error reading image %s, err - %d\n", 59592f9222SGuillaume GARDET __func__, filename, err); 60592f9222SGuillaume GARDET #endif 61592f9222SGuillaume GARDET 62d3e488eaSGuillaume GARDET return err < 0; 63592f9222SGuillaume GARDET } 64592f9222SGuillaume GARDET 65592f9222SGuillaume GARDET #ifdef CONFIG_SPL_OS_BOOT 664101f687SSimon Glass int spl_load_image_ext_os(struct blk_desc *block_dev, int partition) 67592f9222SGuillaume GARDET { 68592f9222SGuillaume GARDET int err; 699f12cd0eSSuriyan Ramasami __maybe_unused loff_t filelen, actlen; 70592f9222SGuillaume GARDET disk_partition_t part_info = {}; 71592f9222SGuillaume GARDET __maybe_unused char *file; 72592f9222SGuillaume GARDET 73*3e8bd469SSimon Glass if (part_get_info(block_dev, partition, &part_info)) { 74592f9222SGuillaume GARDET printf("spl: no partition table found\n"); 75592f9222SGuillaume GARDET return -1; 76592f9222SGuillaume GARDET } 77592f9222SGuillaume GARDET 78592f9222SGuillaume GARDET ext4fs_set_blk_dev(block_dev, &part_info); 79592f9222SGuillaume GARDET 80592f9222SGuillaume GARDET err = ext4fs_mount(0); 81592f9222SGuillaume GARDET if (!err) { 82592f9222SGuillaume GARDET #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 83592f9222SGuillaume GARDET printf("%s: ext4fs mount err - %d\n", __func__, err); 84592f9222SGuillaume GARDET #endif 85592f9222SGuillaume GARDET return -1; 86592f9222SGuillaume GARDET } 87592f9222SGuillaume GARDET 88592f9222SGuillaume GARDET #if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT) 89592f9222SGuillaume GARDET file = getenv("falcon_args_file"); 90592f9222SGuillaume GARDET if (file) { 919f12cd0eSSuriyan Ramasami err = ext4fs_open(file, &filelen); 92592f9222SGuillaume GARDET if (err < 0) { 93592f9222SGuillaume GARDET puts("spl: ext4fs_open failed\n"); 94592f9222SGuillaume GARDET goto defaults; 95592f9222SGuillaume GARDET } 969f12cd0eSSuriyan Ramasami err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen, &actlen); 97d3e488eaSGuillaume GARDET if (err < 0) { 98592f9222SGuillaume GARDET printf("spl: error reading image %s, err - %d, falling back to default\n", 99592f9222SGuillaume GARDET file, err); 100592f9222SGuillaume GARDET goto defaults; 101592f9222SGuillaume GARDET } 102592f9222SGuillaume GARDET file = getenv("falcon_image_file"); 103592f9222SGuillaume GARDET if (file) { 104592f9222SGuillaume GARDET err = spl_load_image_ext(block_dev, partition, file); 105592f9222SGuillaume GARDET if (err != 0) { 106592f9222SGuillaume GARDET puts("spl: falling back to default\n"); 107592f9222SGuillaume GARDET goto defaults; 108592f9222SGuillaume GARDET } 109592f9222SGuillaume GARDET 110592f9222SGuillaume GARDET return 0; 111592f9222SGuillaume GARDET } else { 112592f9222SGuillaume GARDET puts("spl: falcon_image_file not set in environment, falling back to default\n"); 113592f9222SGuillaume GARDET } 114592f9222SGuillaume GARDET } else { 115592f9222SGuillaume GARDET puts("spl: falcon_args_file not set in environment, falling back to default\n"); 116592f9222SGuillaume GARDET } 117592f9222SGuillaume GARDET 118592f9222SGuillaume GARDET defaults: 119592f9222SGuillaume GARDET #endif 120592f9222SGuillaume GARDET 1219f12cd0eSSuriyan Ramasami err = ext4fs_open(CONFIG_SPL_FS_LOAD_ARGS_NAME, &filelen); 122592f9222SGuillaume GARDET if (err < 0) 123592f9222SGuillaume GARDET puts("spl: ext4fs_open failed\n"); 124592f9222SGuillaume GARDET 1259f12cd0eSSuriyan Ramasami err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen, &actlen); 126d3e488eaSGuillaume GARDET if (err < 0) { 127592f9222SGuillaume GARDET #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 128592f9222SGuillaume GARDET printf("%s: error reading image %s, err - %d\n", 129592f9222SGuillaume GARDET __func__, CONFIG_SPL_FS_LOAD_ARGS_NAME, err); 130592f9222SGuillaume GARDET #endif 131592f9222SGuillaume GARDET return -1; 132592f9222SGuillaume GARDET } 133592f9222SGuillaume GARDET 134592f9222SGuillaume GARDET return spl_load_image_ext(block_dev, partition, 135592f9222SGuillaume GARDET CONFIG_SPL_FS_LOAD_KERNEL_NAME); 136592f9222SGuillaume GARDET } 137339245b7SNikita Kiryanov #else 1384101f687SSimon Glass int spl_load_image_ext_os(struct blk_desc *block_dev, int partition) 139339245b7SNikita Kiryanov { 140339245b7SNikita Kiryanov return -ENOSYS; 141339245b7SNikita Kiryanov } 142592f9222SGuillaume GARDET #endif 143592f9222SGuillaume GARDET #endif 144