1 /* 2 * (C) Copyright 2014 3 * Texas Instruments, <www.ti.com> 4 * 5 * Dan Murphy <dmurphy@ti.com> 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 * 9 * FAT Image Functions copied from spl_mmc.c 10 */ 11 12 #include <common.h> 13 #include <spl.h> 14 #include <asm/u-boot.h> 15 #include <fat.h> 16 #include <errno.h> 17 #include <image.h> 18 19 static int fat_registered; 20 21 #ifdef CONFIG_SPL_FAT_SUPPORT 22 static int spl_register_fat_device(block_dev_desc_t *block_dev, int partition) 23 { 24 int err = 0; 25 26 if (fat_registered) 27 return err; 28 29 err = fat_register_device(block_dev, partition); 30 if (err) { 31 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 32 printf("%s: fat register err - %d\n", __func__, err); 33 #endif 34 return err; 35 } 36 37 fat_registered = 1; 38 39 return err; 40 } 41 42 int spl_load_image_fat(block_dev_desc_t *block_dev, 43 int partition, 44 const char *filename) 45 { 46 int err; 47 struct image_header *header; 48 49 err = spl_register_fat_device(block_dev, partition); 50 if (err) 51 goto end; 52 53 header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - 54 sizeof(struct image_header)); 55 56 err = file_fat_read(filename, header, sizeof(struct image_header)); 57 if (err <= 0) 58 goto end; 59 60 spl_parse_image_header(header); 61 62 err = file_fat_read(filename, (u8 *)spl_image.load_addr, 0); 63 64 end: 65 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 66 if (err <= 0) 67 printf("%s: error reading image %s, err - %d\n", 68 __func__, filename, err); 69 #endif 70 71 return (err <= 0); 72 } 73 74 #ifdef CONFIG_SPL_OS_BOOT 75 int spl_load_image_fat_os(block_dev_desc_t *block_dev, int partition) 76 { 77 int err; 78 __maybe_unused char *file; 79 80 err = spl_register_fat_device(block_dev, partition); 81 if (err) 82 return err; 83 84 #if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT) 85 file = getenv("falcon_args_file"); 86 if (file) { 87 err = file_fat_read(file, (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); 88 if (err <= 0) { 89 printf("spl: error reading image %s, err - %d, falling back to default\n", 90 file, err); 91 goto defaults; 92 } 93 file = getenv("falcon_image_file"); 94 if (file) { 95 err = spl_load_image_fat(block_dev, partition, file); 96 if (err != 0) { 97 puts("spl: falling back to default\n"); 98 goto defaults; 99 } 100 101 return 0; 102 } else 103 puts("spl: falcon_image_file not set in environment, falling back to default\n"); 104 } else 105 puts("spl: falcon_args_file not set in environment, falling back to default\n"); 106 107 defaults: 108 #endif 109 110 err = file_fat_read(CONFIG_SPL_FS_LOAD_ARGS_NAME, 111 (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); 112 if (err <= 0) { 113 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 114 printf("%s: error reading image %s, err - %d\n", 115 __func__, CONFIG_SPL_FS_LOAD_ARGS_NAME, err); 116 #endif 117 return -1; 118 } 119 120 return spl_load_image_fat(block_dev, partition, 121 CONFIG_SPL_FS_LOAD_KERNEL_NAME); 122 } 123 #else 124 int spl_load_image_fat_os(block_dev_desc_t *block_dev, int partition) 125 { 126 return -ENOSYS; 127 } 128 #endif 129 #endif 130