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(struct blk_desc *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(struct blk_desc *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 err = spl_parse_image_header(header); 61 if (err <= 0) 62 goto end; 63 64 err = file_fat_read(filename, (u8 *)spl_image.load_addr, 0); 65 66 end: 67 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 68 if (err <= 0) 69 printf("%s: error reading image %s, err - %d\n", 70 __func__, filename, err); 71 #endif 72 73 return (err <= 0); 74 } 75 76 #ifdef CONFIG_SPL_OS_BOOT 77 int spl_load_image_fat_os(struct blk_desc *block_dev, int partition) 78 { 79 int err; 80 __maybe_unused char *file; 81 82 err = spl_register_fat_device(block_dev, partition); 83 if (err) 84 return err; 85 86 #if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT) 87 file = getenv("falcon_args_file"); 88 if (file) { 89 err = file_fat_read(file, (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); 90 if (err <= 0) { 91 printf("spl: error reading image %s, err - %d, falling back to default\n", 92 file, err); 93 goto defaults; 94 } 95 file = getenv("falcon_image_file"); 96 if (file) { 97 err = spl_load_image_fat(block_dev, partition, file); 98 if (err != 0) { 99 puts("spl: falling back to default\n"); 100 goto defaults; 101 } 102 103 return 0; 104 } else 105 puts("spl: falcon_image_file not set in environment, falling back to default\n"); 106 } else 107 puts("spl: falcon_args_file not set in environment, falling back to default\n"); 108 109 defaults: 110 #endif 111 112 err = file_fat_read(CONFIG_SPL_FS_LOAD_ARGS_NAME, 113 (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); 114 if (err <= 0) { 115 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 116 printf("%s: error reading image %s, err - %d\n", 117 __func__, CONFIG_SPL_FS_LOAD_ARGS_NAME, err); 118 #endif 119 return -1; 120 } 121 122 return spl_load_image_fat(block_dev, partition, 123 CONFIG_SPL_FS_LOAD_KERNEL_NAME); 124 } 125 #else 126 int spl_load_image_fat_os(struct blk_desc *block_dev, int partition) 127 { 128 return -ENOSYS; 129 } 130 #endif 131 #endif 132