]>
Commit | Line | Data |
---|---|---|
773b5940 DM |
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> | |
339245b7 | 16 | #include <errno.h> |
773b5940 | 17 | #include <image.h> |
97ca364f | 18 | #include <libfdt.h> |
773b5940 DM |
19 | |
20 | static int fat_registered; | |
21 | ||
4101f687 | 22 | static int spl_register_fat_device(struct blk_desc *block_dev, int partition) |
773b5940 DM |
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 | |
8cffe5bd | 32 | printf("%s: fat register err - %d\n", __func__, err); |
773b5940 | 33 | #endif |
7d2b4e77 | 34 | return err; |
773b5940 DM |
35 | } |
36 | ||
37 | fat_registered = 1; | |
38 | ||
39 | return err; | |
40 | } | |
41 | ||
97ca364f LV |
42 | static ulong spl_fit_read(struct spl_load_info *load, ulong file_offset, |
43 | ulong size, void *buf) | |
44 | { | |
45 | loff_t actread; | |
46 | int ret; | |
47 | char *filename = (char *)load->filename; | |
48 | ||
49 | ret = fat_read_file(filename, buf, file_offset, size, &actread); | |
50 | if (ret) | |
51 | return ret; | |
52 | ||
53 | return actread; | |
54 | } | |
55 | ||
710e9ca5 SG |
56 | int spl_load_image_fat(struct spl_image_info *spl_image, |
57 | struct blk_desc *block_dev, int partition, | |
58 | const char *filename) | |
773b5940 DM |
59 | { |
60 | int err; | |
61 | struct image_header *header; | |
62 | ||
63 | err = spl_register_fat_device(block_dev, partition); | |
8cffe5bd | 64 | if (err) |
773b5940 DM |
65 | goto end; |
66 | ||
67 | header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - | |
68 | sizeof(struct image_header)); | |
69 | ||
70 | err = file_fat_read(filename, header, sizeof(struct image_header)); | |
71 | if (err <= 0) | |
72 | goto end; | |
73 | ||
97ca364f LV |
74 | if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) && |
75 | image_get_magic(header) == FDT_MAGIC) { | |
76 | struct spl_load_info load; | |
77 | ||
78 | debug("Found FIT\n"); | |
79 | load.read = spl_fit_read; | |
80 | load.bl_len = 1; | |
81 | load.filename = (void *)filename; | |
82 | load.priv = NULL; | |
773b5940 | 83 | |
f4d7d859 | 84 | return spl_load_simple_fit(spl_image, &load, 0, header); |
97ca364f | 85 | } else { |
710e9ca5 | 86 | err = spl_parse_image_header(spl_image, header); |
97ca364f LV |
87 | if (err) |
88 | goto end; | |
89 | ||
1eefe14f | 90 | err = file_fat_read(filename, |
710e9ca5 | 91 | (u8 *)(uintptr_t)spl_image->load_addr, 0); |
97ca364f | 92 | } |
773b5940 DM |
93 | |
94 | end: | |
95 | #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT | |
96 | if (err <= 0) | |
8cffe5bd DM |
97 | printf("%s: error reading image %s, err - %d\n", |
98 | __func__, filename, err); | |
773b5940 DM |
99 | #endif |
100 | ||
101 | return (err <= 0); | |
102 | } | |
103 | ||
104 | #ifdef CONFIG_SPL_OS_BOOT | |
710e9ca5 SG |
105 | int spl_load_image_fat_os(struct spl_image_info *spl_image, |
106 | struct blk_desc *block_dev, int partition) | |
773b5940 DM |
107 | { |
108 | int err; | |
ae1590ed | 109 | __maybe_unused char *file; |
773b5940 DM |
110 | |
111 | err = spl_register_fat_device(block_dev, partition); | |
8cffe5bd DM |
112 | if (err) |
113 | return err; | |
773b5940 | 114 | |
ae1590ed | 115 | #if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT) |
00caae6d | 116 | file = env_get("falcon_args_file"); |
ae1590ed TR |
117 | if (file) { |
118 | err = file_fat_read(file, (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); | |
119 | if (err <= 0) { | |
120 | printf("spl: error reading image %s, err - %d, falling back to default\n", | |
121 | file, err); | |
122 | goto defaults; | |
123 | } | |
00caae6d | 124 | file = env_get("falcon_image_file"); |
ae1590ed | 125 | if (file) { |
710e9ca5 SG |
126 | err = spl_load_image_fat(spl_image, block_dev, |
127 | partition, file); | |
ae1590ed TR |
128 | if (err != 0) { |
129 | puts("spl: falling back to default\n"); | |
130 | goto defaults; | |
131 | } | |
132 | ||
133 | return 0; | |
134 | } else | |
135 | puts("spl: falcon_image_file not set in environment, falling back to default\n"); | |
136 | } else | |
137 | puts("spl: falcon_args_file not set in environment, falling back to default\n"); | |
138 | ||
139 | defaults: | |
140 | #endif | |
141 | ||
205b4f33 | 142 | err = file_fat_read(CONFIG_SPL_FS_LOAD_ARGS_NAME, |
773b5940 DM |
143 | (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); |
144 | if (err <= 0) { | |
145 | #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT | |
8cffe5bd | 146 | printf("%s: error reading image %s, err - %d\n", |
205b4f33 | 147 | __func__, CONFIG_SPL_FS_LOAD_ARGS_NAME, err); |
773b5940 DM |
148 | #endif |
149 | return -1; | |
150 | } | |
151 | ||
710e9ca5 | 152 | return spl_load_image_fat(spl_image, block_dev, partition, |
205b4f33 | 153 | CONFIG_SPL_FS_LOAD_KERNEL_NAME); |
773b5940 | 154 | } |
339245b7 | 155 | #else |
710e9ca5 SG |
156 | int spl_load_image_fat_os(struct spl_image_info *spl_image, |
157 | struct blk_desc *block_dev, int partition) | |
339245b7 NK |
158 | { |
159 | return -ENOSYS; | |
160 | } | |
773b5940 | 161 | #endif |