1773b5940SDan Murphy /* 2773b5940SDan Murphy * (C) Copyright 2014 3773b5940SDan Murphy * Texas Instruments, <www.ti.com> 4773b5940SDan Murphy * 5773b5940SDan Murphy * Dan Murphy <dmurphy@ti.com> 6773b5940SDan Murphy * 7773b5940SDan Murphy * SPDX-License-Identifier: GPL-2.0+ 8773b5940SDan Murphy * 9773b5940SDan Murphy * FAT Image Functions copied from spl_mmc.c 10773b5940SDan Murphy */ 11773b5940SDan Murphy 12773b5940SDan Murphy #include <common.h> 13773b5940SDan Murphy #include <spl.h> 14773b5940SDan Murphy #include <asm/u-boot.h> 15773b5940SDan Murphy #include <fat.h> 16*339245b7SNikita Kiryanov #include <errno.h> 17773b5940SDan Murphy #include <image.h> 18773b5940SDan Murphy 19773b5940SDan Murphy static int fat_registered; 20773b5940SDan Murphy 21773b5940SDan Murphy #ifdef CONFIG_SPL_FAT_SUPPORT 22773b5940SDan Murphy static int spl_register_fat_device(block_dev_desc_t *block_dev, int partition) 23773b5940SDan Murphy { 24773b5940SDan Murphy int err = 0; 25773b5940SDan Murphy 26773b5940SDan Murphy if (fat_registered) 27773b5940SDan Murphy return err; 28773b5940SDan Murphy 29773b5940SDan Murphy err = fat_register_device(block_dev, partition); 30773b5940SDan Murphy if (err) { 31773b5940SDan Murphy #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 328cffe5bdSDan Murphy printf("%s: fat register err - %d\n", __func__, err); 33773b5940SDan Murphy #endif 347d2b4e77SGuillaume GARDET return err; 35773b5940SDan Murphy } 36773b5940SDan Murphy 37773b5940SDan Murphy fat_registered = 1; 38773b5940SDan Murphy 39773b5940SDan Murphy return err; 40773b5940SDan Murphy } 41773b5940SDan Murphy 42773b5940SDan Murphy int spl_load_image_fat(block_dev_desc_t *block_dev, 43773b5940SDan Murphy int partition, 44773b5940SDan Murphy const char *filename) 45773b5940SDan Murphy { 46773b5940SDan Murphy int err; 47773b5940SDan Murphy struct image_header *header; 48773b5940SDan Murphy 49773b5940SDan Murphy err = spl_register_fat_device(block_dev, partition); 508cffe5bdSDan Murphy if (err) 51773b5940SDan Murphy goto end; 52773b5940SDan Murphy 53773b5940SDan Murphy header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - 54773b5940SDan Murphy sizeof(struct image_header)); 55773b5940SDan Murphy 56773b5940SDan Murphy err = file_fat_read(filename, header, sizeof(struct image_header)); 57773b5940SDan Murphy if (err <= 0) 58773b5940SDan Murphy goto end; 59773b5940SDan Murphy 60773b5940SDan Murphy spl_parse_image_header(header); 61773b5940SDan Murphy 62773b5940SDan Murphy err = file_fat_read(filename, (u8 *)spl_image.load_addr, 0); 63773b5940SDan Murphy 64773b5940SDan Murphy end: 65773b5940SDan Murphy #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 66773b5940SDan Murphy if (err <= 0) 678cffe5bdSDan Murphy printf("%s: error reading image %s, err - %d\n", 688cffe5bdSDan Murphy __func__, filename, err); 69773b5940SDan Murphy #endif 70773b5940SDan Murphy 71773b5940SDan Murphy return (err <= 0); 72773b5940SDan Murphy } 73773b5940SDan Murphy 74773b5940SDan Murphy #ifdef CONFIG_SPL_OS_BOOT 75773b5940SDan Murphy int spl_load_image_fat_os(block_dev_desc_t *block_dev, int partition) 76773b5940SDan Murphy { 77773b5940SDan Murphy int err; 78ae1590edSTom Rini __maybe_unused char *file; 79773b5940SDan Murphy 80773b5940SDan Murphy err = spl_register_fat_device(block_dev, partition); 818cffe5bdSDan Murphy if (err) 828cffe5bdSDan Murphy return err; 83773b5940SDan Murphy 84ae1590edSTom Rini #if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT) 85ae1590edSTom Rini file = getenv("falcon_args_file"); 86ae1590edSTom Rini if (file) { 87ae1590edSTom Rini err = file_fat_read(file, (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); 88ae1590edSTom Rini if (err <= 0) { 89ae1590edSTom Rini printf("spl: error reading image %s, err - %d, falling back to default\n", 90ae1590edSTom Rini file, err); 91ae1590edSTom Rini goto defaults; 92ae1590edSTom Rini } 93ae1590edSTom Rini file = getenv("falcon_image_file"); 94ae1590edSTom Rini if (file) { 95ae1590edSTom Rini err = spl_load_image_fat(block_dev, partition, file); 96ae1590edSTom Rini if (err != 0) { 97ae1590edSTom Rini puts("spl: falling back to default\n"); 98ae1590edSTom Rini goto defaults; 99ae1590edSTom Rini } 100ae1590edSTom Rini 101ae1590edSTom Rini return 0; 102ae1590edSTom Rini } else 103ae1590edSTom Rini puts("spl: falcon_image_file not set in environment, falling back to default\n"); 104ae1590edSTom Rini } else 105ae1590edSTom Rini puts("spl: falcon_args_file not set in environment, falling back to default\n"); 106ae1590edSTom Rini 107ae1590edSTom Rini defaults: 108ae1590edSTom Rini #endif 109ae1590edSTom Rini 110205b4f33SGuillaume GARDET err = file_fat_read(CONFIG_SPL_FS_LOAD_ARGS_NAME, 111773b5940SDan Murphy (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); 112773b5940SDan Murphy if (err <= 0) { 113773b5940SDan Murphy #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 1148cffe5bdSDan Murphy printf("%s: error reading image %s, err - %d\n", 115205b4f33SGuillaume GARDET __func__, CONFIG_SPL_FS_LOAD_ARGS_NAME, err); 116773b5940SDan Murphy #endif 117773b5940SDan Murphy return -1; 118773b5940SDan Murphy } 119773b5940SDan Murphy 120773b5940SDan Murphy return spl_load_image_fat(block_dev, partition, 121205b4f33SGuillaume GARDET CONFIG_SPL_FS_LOAD_KERNEL_NAME); 122773b5940SDan Murphy } 123*339245b7SNikita Kiryanov #else 124*339245b7SNikita Kiryanov int spl_load_image_fat_os(block_dev_desc_t *block_dev, int partition) 125*339245b7SNikita Kiryanov { 126*339245b7SNikita Kiryanov return -ENOSYS; 127*339245b7SNikita Kiryanov } 128773b5940SDan Murphy #endif 129773b5940SDan Murphy #endif 130