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 253e8bd469SSimon 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 517e0f2267SMarek Vasut err = spl_parse_image_header(header); 527e0f2267SMarek Vasut if (err < 0) { 537e0f2267SMarek Vasut puts("spl: ext4fs_read failed\n"); 547e0f2267SMarek Vasut goto end; 557e0f2267SMarek Vasut } 56592f9222SGuillaume GARDET 579f12cd0eSSuriyan Ramasami err = ext4fs_read((char *)spl_image.load_addr, filelen, &actlen); 58592f9222SGuillaume GARDET 59592f9222SGuillaume GARDET end: 60592f9222SGuillaume GARDET #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 61d3e488eaSGuillaume GARDET if (err < 0) 62592f9222SGuillaume GARDET printf("%s: error reading image %s, err - %d\n", 63592f9222SGuillaume GARDET __func__, filename, err); 64592f9222SGuillaume GARDET #endif 65592f9222SGuillaume GARDET 66d3e488eaSGuillaume GARDET return err < 0; 67592f9222SGuillaume GARDET } 68592f9222SGuillaume GARDET 69592f9222SGuillaume GARDET #ifdef CONFIG_SPL_OS_BOOT 704101f687SSimon Glass int spl_load_image_ext_os(struct blk_desc *block_dev, int partition) 71592f9222SGuillaume GARDET { 72592f9222SGuillaume GARDET int err; 739f12cd0eSSuriyan Ramasami __maybe_unused loff_t filelen, actlen; 74592f9222SGuillaume GARDET disk_partition_t part_info = {}; 75592f9222SGuillaume GARDET __maybe_unused char *file; 76592f9222SGuillaume GARDET 773e8bd469SSimon Glass if (part_get_info(block_dev, partition, &part_info)) { 78592f9222SGuillaume GARDET printf("spl: no partition table found\n"); 79592f9222SGuillaume GARDET return -1; 80592f9222SGuillaume GARDET } 81592f9222SGuillaume GARDET 82592f9222SGuillaume GARDET ext4fs_set_blk_dev(block_dev, &part_info); 83592f9222SGuillaume GARDET 84592f9222SGuillaume GARDET err = ext4fs_mount(0); 85592f9222SGuillaume GARDET if (!err) { 86592f9222SGuillaume GARDET #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 87592f9222SGuillaume GARDET printf("%s: ext4fs mount err - %d\n", __func__, err); 88592f9222SGuillaume GARDET #endif 89592f9222SGuillaume GARDET return -1; 90592f9222SGuillaume GARDET } 91*58c95d53SPetr Kulhavy #if defined(CONFIG_SPL_ENV_SUPPORT) 92592f9222SGuillaume GARDET file = getenv("falcon_args_file"); 93592f9222SGuillaume GARDET if (file) { 949f12cd0eSSuriyan Ramasami err = ext4fs_open(file, &filelen); 95592f9222SGuillaume GARDET if (err < 0) { 96592f9222SGuillaume GARDET puts("spl: ext4fs_open failed\n"); 97592f9222SGuillaume GARDET goto defaults; 98592f9222SGuillaume GARDET } 999f12cd0eSSuriyan Ramasami err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen, &actlen); 100d3e488eaSGuillaume GARDET if (err < 0) { 101592f9222SGuillaume GARDET printf("spl: error reading image %s, err - %d, falling back to default\n", 102592f9222SGuillaume GARDET file, err); 103592f9222SGuillaume GARDET goto defaults; 104592f9222SGuillaume GARDET } 105592f9222SGuillaume GARDET file = getenv("falcon_image_file"); 106592f9222SGuillaume GARDET if (file) { 107592f9222SGuillaume GARDET err = spl_load_image_ext(block_dev, partition, file); 108592f9222SGuillaume GARDET if (err != 0) { 109592f9222SGuillaume GARDET puts("spl: falling back to default\n"); 110592f9222SGuillaume GARDET goto defaults; 111592f9222SGuillaume GARDET } 112592f9222SGuillaume GARDET 113592f9222SGuillaume GARDET return 0; 114592f9222SGuillaume GARDET } else { 115592f9222SGuillaume GARDET puts("spl: falcon_image_file not set in environment, falling back to default\n"); 116592f9222SGuillaume GARDET } 117592f9222SGuillaume GARDET } else { 118592f9222SGuillaume GARDET puts("spl: falcon_args_file not set in environment, falling back to default\n"); 119592f9222SGuillaume GARDET } 120592f9222SGuillaume GARDET 121592f9222SGuillaume GARDET defaults: 122592f9222SGuillaume GARDET #endif 123592f9222SGuillaume GARDET 1249f12cd0eSSuriyan Ramasami err = ext4fs_open(CONFIG_SPL_FS_LOAD_ARGS_NAME, &filelen); 125592f9222SGuillaume GARDET if (err < 0) 126592f9222SGuillaume GARDET puts("spl: ext4fs_open failed\n"); 127592f9222SGuillaume GARDET 1289f12cd0eSSuriyan Ramasami err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen, &actlen); 129d3e488eaSGuillaume GARDET if (err < 0) { 130592f9222SGuillaume GARDET #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 131592f9222SGuillaume GARDET printf("%s: error reading image %s, err - %d\n", 132592f9222SGuillaume GARDET __func__, CONFIG_SPL_FS_LOAD_ARGS_NAME, err); 133592f9222SGuillaume GARDET #endif 134592f9222SGuillaume GARDET return -1; 135592f9222SGuillaume GARDET } 136592f9222SGuillaume GARDET 137592f9222SGuillaume GARDET return spl_load_image_ext(block_dev, partition, 138592f9222SGuillaume GARDET CONFIG_SPL_FS_LOAD_KERNEL_NAME); 139592f9222SGuillaume GARDET } 140339245b7SNikita Kiryanov #else 1414101f687SSimon Glass int spl_load_image_ext_os(struct blk_desc *block_dev, int partition) 142339245b7SNikita Kiryanov { 143339245b7SNikita Kiryanov return -ENOSYS; 144339245b7SNikita Kiryanov } 145592f9222SGuillaume GARDET #endif 146592f9222SGuillaume GARDET #endif 147