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> 9592f9222SGuillaume GARDET #include <image.h> 10592f9222SGuillaume GARDET 11592f9222SGuillaume GARDET #ifdef CONFIG_SPL_EXT_SUPPORT 12592f9222SGuillaume GARDET int spl_load_image_ext(block_dev_desc_t *block_dev, 13592f9222SGuillaume GARDET int partition, 14592f9222SGuillaume GARDET const char *filename) 15592f9222SGuillaume GARDET { 16592f9222SGuillaume GARDET s32 err; 17592f9222SGuillaume GARDET struct image_header *header; 189f12cd0eSSuriyan Ramasami loff_t filelen, actlen; 19592f9222SGuillaume GARDET disk_partition_t part_info = {}; 20592f9222SGuillaume GARDET 21592f9222SGuillaume GARDET header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - 22592f9222SGuillaume GARDET sizeof(struct image_header)); 23592f9222SGuillaume GARDET 24592f9222SGuillaume GARDET if (get_partition_info(block_dev, 25592f9222SGuillaume GARDET 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); 46*d3e488eaSGuillaume 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 57*d3e488eaSGuillaume 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 62*d3e488eaSGuillaume GARDET return err < 0; 63592f9222SGuillaume GARDET } 64592f9222SGuillaume GARDET 65592f9222SGuillaume GARDET #ifdef CONFIG_SPL_OS_BOOT 66592f9222SGuillaume GARDET int spl_load_image_ext_os(block_dev_desc_t *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 73592f9222SGuillaume GARDET if (get_partition_info(block_dev, 74592f9222SGuillaume GARDET partition, &part_info)) { 75592f9222SGuillaume GARDET printf("spl: no partition table found\n"); 76592f9222SGuillaume GARDET return -1; 77592f9222SGuillaume GARDET } 78592f9222SGuillaume GARDET 79592f9222SGuillaume GARDET ext4fs_set_blk_dev(block_dev, &part_info); 80592f9222SGuillaume GARDET 81592f9222SGuillaume GARDET err = ext4fs_mount(0); 82592f9222SGuillaume GARDET if (!err) { 83592f9222SGuillaume GARDET #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 84592f9222SGuillaume GARDET printf("%s: ext4fs mount err - %d\n", __func__, err); 85592f9222SGuillaume GARDET #endif 86592f9222SGuillaume GARDET return -1; 87592f9222SGuillaume GARDET } 88592f9222SGuillaume GARDET 89592f9222SGuillaume GARDET #if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT) 90592f9222SGuillaume GARDET file = getenv("falcon_args_file"); 91592f9222SGuillaume GARDET if (file) { 929f12cd0eSSuriyan Ramasami err = ext4fs_open(file, &filelen); 93592f9222SGuillaume GARDET if (err < 0) { 94592f9222SGuillaume GARDET puts("spl: ext4fs_open failed\n"); 95592f9222SGuillaume GARDET goto defaults; 96592f9222SGuillaume GARDET } 979f12cd0eSSuriyan Ramasami err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen, &actlen); 98*d3e488eaSGuillaume GARDET if (err < 0) { 99592f9222SGuillaume GARDET printf("spl: error reading image %s, err - %d, falling back to default\n", 100592f9222SGuillaume GARDET file, err); 101592f9222SGuillaume GARDET goto defaults; 102592f9222SGuillaume GARDET } 103592f9222SGuillaume GARDET file = getenv("falcon_image_file"); 104592f9222SGuillaume GARDET if (file) { 105592f9222SGuillaume GARDET err = spl_load_image_ext(block_dev, partition, file); 106592f9222SGuillaume GARDET if (err != 0) { 107592f9222SGuillaume GARDET puts("spl: falling back to default\n"); 108592f9222SGuillaume GARDET goto defaults; 109592f9222SGuillaume GARDET } 110592f9222SGuillaume GARDET 111592f9222SGuillaume GARDET return 0; 112592f9222SGuillaume GARDET } else { 113592f9222SGuillaume GARDET puts("spl: falcon_image_file not set in environment, falling back to default\n"); 114592f9222SGuillaume GARDET } 115592f9222SGuillaume GARDET } else { 116592f9222SGuillaume GARDET puts("spl: falcon_args_file not set in environment, falling back to default\n"); 117592f9222SGuillaume GARDET } 118592f9222SGuillaume GARDET 119592f9222SGuillaume GARDET defaults: 120592f9222SGuillaume GARDET #endif 121592f9222SGuillaume GARDET 1229f12cd0eSSuriyan Ramasami err = ext4fs_open(CONFIG_SPL_FS_LOAD_ARGS_NAME, &filelen); 123592f9222SGuillaume GARDET if (err < 0) 124592f9222SGuillaume GARDET puts("spl: ext4fs_open failed\n"); 125592f9222SGuillaume GARDET 1269f12cd0eSSuriyan Ramasami err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen, &actlen); 127*d3e488eaSGuillaume GARDET if (err < 0) { 128592f9222SGuillaume GARDET #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 129592f9222SGuillaume GARDET printf("%s: error reading image %s, err - %d\n", 130592f9222SGuillaume GARDET __func__, CONFIG_SPL_FS_LOAD_ARGS_NAME, err); 131592f9222SGuillaume GARDET #endif 132592f9222SGuillaume GARDET return -1; 133592f9222SGuillaume GARDET } 134592f9222SGuillaume GARDET 135592f9222SGuillaume GARDET return spl_load_image_ext(block_dev, partition, 136592f9222SGuillaume GARDET CONFIG_SPL_FS_LOAD_KERNEL_NAME); 137592f9222SGuillaume GARDET } 138592f9222SGuillaume GARDET #endif 139592f9222SGuillaume GARDET #endif 140