Blame view
common/cmd_fpga.c
8.91 KB
4a9cbbe83 Initial revision |
1 2 3 4 |
/* * (C) Copyright 2000, 2001 * Rich Ireland, Enterasys Networks, rireland@enterasys.com. * |
1a4596601 Add GPL-2.0+ SPDX... |
5 |
* SPDX-License-Identifier: GPL-2.0+ |
4a9cbbe83 Initial revision |
6 7 8 9 10 11 12 |
*/ /* * FPGA support */ #include <common.h> #include <command.h> |
8bde7f776 * Code cleanup: |
13 |
#include <fpga.h> |
1a897668a fpga: Added suppo... |
14 |
#include <fs.h> |
c3d2b4b48 Code cleanup. |
15 |
#include <malloc.h> |
4a9cbbe83 Initial revision |
16 |
|
4a9cbbe83 Initial revision |
17 |
/* Local functions */ |
fc598412c cmd: fpga: Clean ... |
18 |
static int fpga_get_op(char *opstr); |
4a9cbbe83 Initial revision |
19 20 21 22 23 |
/* Local defines */ #define FPGA_NONE -1 #define FPGA_INFO 0 #define FPGA_LOAD 1 |
30ce5ab04 * Patch by Gleb N... |
24 |
#define FPGA_LOADB 2 |
4a9cbbe83 Initial revision |
25 |
#define FPGA_DUMP 3 |
f0ff4692f Add FPGA Altera C... |
26 |
#define FPGA_LOADMK 4 |
67193864b fpga: Add support... |
27 28 |
#define FPGA_LOADP 5 #define FPGA_LOADBP 6 |
1a897668a fpga: Added suppo... |
29 |
#define FPGA_LOADFS 7 |
4a9cbbe83 Initial revision |
30 31 32 33 34 35 36 37 38 |
/* ------------------------------------------------------------------------- */ /* command form: * fpga <op> <device number> <data addr> <datasize> * where op is 'load', 'dump', or 'info' * If there is no device number field, the fpga environment variable is used. * If there is no data addr field, the fpgadata environment variable is used. * The info command requires no data address field. */ |
fc598412c cmd: fpga: Clean ... |
39 |
int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) |
4a9cbbe83 Initial revision |
40 |
{ |
d4ca31c40 * Cleanup lowboot... |
41 42 43 |
int op, dev = FPGA_INVALID_DEVICE; size_t data_size = 0; void *fpga_data = NULL; |
fc598412c cmd: fpga: Clean ... |
44 45 |
char *devstr = getenv("fpga"); char *datastr = getenv("fpgadata"); |
d4ca31c40 * Cleanup lowboot... |
46 |
int rc = FPGA_FAIL; |
a790b5b23 cmd_fpga: cleanup... |
47 |
int wrong_parms = 0; |
fc598412c cmd: fpga: Clean ... |
48 |
#if defined(CONFIG_FIT) |
c28c4d193 [new uImage] Add ... |
49 50 51 |
const char *fit_uname = NULL; ulong fit_addr; #endif |
1a897668a fpga: Added suppo... |
52 53 54 55 |
#if defined(CONFIG_CMD_FPGA_LOADFS) fpga_fs_info fpga_fsinfo; fpga_fsinfo.fstype = FS_TYPE_ANY; #endif |
d4ca31c40 * Cleanup lowboot... |
56 57 |
if (devstr) |
fc598412c cmd: fpga: Clean ... |
58 |
dev = (int) simple_strtoul(devstr, NULL, 16); |
d4ca31c40 * Cleanup lowboot... |
59 |
if (datastr) |
fc598412c cmd: fpga: Clean ... |
60 |
fpga_data = (void *)simple_strtoul(datastr, NULL, 16); |
d4ca31c40 * Cleanup lowboot... |
61 62 |
switch (argc) { |
1a897668a fpga: Added suppo... |
63 64 65 66 67 68 69 70 |
#if defined(CONFIG_CMD_FPGA_LOADFS) case 9: fpga_fsinfo.blocksize = (unsigned int) simple_strtoul(argv[5], NULL, 16); fpga_fsinfo.interface = argv[6]; fpga_fsinfo.dev_part = argv[7]; fpga_fsinfo.filename = argv[8]; #endif |
d4ca31c40 * Cleanup lowboot... |
71 |
case 5: /* fpga <op> <dev> <data> <datasize> */ |
fc598412c cmd: fpga: Clean ... |
72 |
data_size = simple_strtoul(argv[4], NULL, 16); |
c28c4d193 [new uImage] Add ... |
73 |
|
d4ca31c40 * Cleanup lowboot... |
74 |
case 4: /* fpga <op> <dev> <data> */ |
c28c4d193 [new uImage] Add ... |
75 |
#if defined(CONFIG_FIT) |
fc598412c cmd: fpga: Clean ... |
76 77 |
if (fit_parse_subimage(argv[3], (ulong)fpga_data, &fit_addr, &fit_uname)) { |
c28c4d193 [new uImage] Add ... |
78 |
fpga_data = (void *)fit_addr; |
fc598412c cmd: fpga: Clean ... |
79 80 81 82 |
debug("* fpga: subimage '%s' from FIT image ", fit_uname); debug("at 0x%08lx ", fit_addr); |
c28c4d193 [new uImage] Add ... |
83 84 85 |
} else #endif { |
fc598412c cmd: fpga: Clean ... |
86 |
fpga_data = (void *)simple_strtoul(argv[3], NULL, 16); |
06297db06 FPGA: use debug()... |
87 88 |
debug("* fpga: cmdline image address = 0x%08lx ", |
fc598412c cmd: fpga: Clean ... |
89 |
(ulong)fpga_data); |
c28c4d193 [new uImage] Add ... |
90 |
} |
fc598412c cmd: fpga: Clean ... |
91 92 |
debug("%s: fpga_data = 0x%x ", __func__, (uint)fpga_data); |
c28c4d193 [new uImage] Add ... |
93 |
|
d4ca31c40 * Cleanup lowboot... |
94 |
case 3: /* fpga <op> <dev | data addr> */ |
fc598412c cmd: fpga: Clean ... |
95 |
dev = (int)simple_strtoul(argv[2], NULL, 16); |
06297db06 FPGA: use debug()... |
96 97 |
debug("%s: device = %d ", __func__, dev); |
d4ca31c40 * Cleanup lowboot... |
98 |
/* FIXME - this is a really weak test */ |
fc598412c cmd: fpga: Clean ... |
99 100 |
if ((argc == 3) && (dev > fpga_count())) { /* must be buffer ptr */ |
06297db06 FPGA: use debug()... |
101 102 |
debug("%s: Assuming buffer pointer in arg 3 ", |
fc598412c cmd: fpga: Clean ... |
103 |
__func__); |
c28c4d193 [new uImage] Add ... |
104 105 |
#if defined(CONFIG_FIT) |
fc598412c cmd: fpga: Clean ... |
106 107 |
if (fit_parse_subimage(argv[2], (ulong)fpga_data, &fit_addr, &fit_uname)) { |
c28c4d193 [new uImage] Add ... |
108 |
fpga_data = (void *)fit_addr; |
fc598412c cmd: fpga: Clean ... |
109 110 111 112 |
debug("* fpga: subimage '%s' from FIT image ", fit_uname); debug("at 0x%08lx ", fit_addr); |
c28c4d193 [new uImage] Add ... |
113 114 115 |
} else #endif { |
fc598412c cmd: fpga: Clean ... |
116 117 118 119 |
fpga_data = (void *)dev; debug("* fpga: cmdline image addr = 0x%08lx ", (ulong)fpga_data); |
c28c4d193 [new uImage] Add ... |
120 |
} |
06297db06 FPGA: use debug()... |
121 122 |
debug("%s: fpga_data = 0x%x ", |
fc598412c cmd: fpga: Clean ... |
123 |
__func__, (uint)fpga_data); |
d4ca31c40 * Cleanup lowboot... |
124 125 |
dev = FPGA_INVALID_DEVICE; /* reset device num */ } |
c28c4d193 [new uImage] Add ... |
126 |
|
d4ca31c40 * Cleanup lowboot... |
127 |
case 2: /* fpga <op> */ |
fc598412c cmd: fpga: Clean ... |
128 |
op = (int)fpga_get_op(argv[1]); |
d4ca31c40 * Cleanup lowboot... |
129 |
break; |
c28c4d193 [new uImage] Add ... |
130 |
|
d4ca31c40 * Cleanup lowboot... |
131 |
default: |
fc598412c cmd: fpga: Clean ... |
132 133 |
debug("%s: Too many or too few args (%d) ", __func__, argc); |
d4ca31c40 * Cleanup lowboot... |
134 135 136 |
op = FPGA_NONE; /* force usage display */ break; } |
a790b5b23 cmd_fpga: cleanup... |
137 138 139 140 141 142 143 144 145 146 |
if (dev == FPGA_INVALID_DEVICE) { puts("FPGA device not specified "); op = FPGA_NONE; } switch (op) { case FPGA_NONE: case FPGA_INFO: break; |
1a897668a fpga: Added suppo... |
147 148 149 150 151 152 153 |
#if defined(CONFIG_CMD_FPGA_LOADFS) case FPGA_LOADFS: /* Blocksize can be zero */ if (!fpga_fsinfo.interface || !fpga_fsinfo.dev_part || !fpga_fsinfo.filename) wrong_parms = 1; #endif |
a790b5b23 cmd_fpga: cleanup... |
154 |
case FPGA_LOAD: |
67193864b fpga: Add support... |
155 |
case FPGA_LOADP: |
a790b5b23 cmd_fpga: cleanup... |
156 |
case FPGA_LOADB: |
67193864b fpga: Add support... |
157 |
case FPGA_LOADBP: |
a790b5b23 cmd_fpga: cleanup... |
158 159 160 161 |
case FPGA_DUMP: if (!fpga_data || !data_size) wrong_parms = 1; break; |
64e809afe fpga: Guard the L... |
162 |
#if defined(CONFIG_CMD_FPGA_LOADMK) |
a790b5b23 cmd_fpga: cleanup... |
163 164 165 166 |
case FPGA_LOADMK: if (!fpga_data) wrong_parms = 1; break; |
64e809afe fpga: Guard the L... |
167 |
#endif |
a790b5b23 cmd_fpga: cleanup... |
168 169 170 171 172 173 174 |
} if (wrong_parms) { puts("Wrong parameters for FPGA request "); op = FPGA_NONE; } |
d4ca31c40 * Cleanup lowboot... |
175 176 |
switch (op) { case FPGA_NONE: |
4c12eeb8b Convert cmd_usage... |
177 |
return CMD_RET_USAGE; |
d4ca31c40 * Cleanup lowboot... |
178 179 |
case FPGA_INFO: |
fc598412c cmd: fpga: Clean ... |
180 |
rc = fpga_info(dev); |
d4ca31c40 * Cleanup lowboot... |
181 182 183 |
break; case FPGA_LOAD: |
7a78bd267 fpga: Define bits... |
184 |
rc = fpga_load(dev, fpga_data, data_size, BIT_FULL); |
d4ca31c40 * Cleanup lowboot... |
185 |
break; |
67193864b fpga: Add support... |
186 187 188 189 190 |
#if defined(CONFIG_CMD_FPGA_LOADP) case FPGA_LOADP: rc = fpga_load(dev, fpga_data, data_size, BIT_PARTIAL); break; #endif |
30ce5ab04 * Patch by Gleb N... |
191 |
case FPGA_LOADB: |
7a78bd267 fpga: Define bits... |
192 |
rc = fpga_loadbitstream(dev, fpga_data, data_size, BIT_FULL); |
30ce5ab04 * Patch by Gleb N... |
193 |
break; |
67193864b fpga: Add support... |
194 195 196 197 198 |
#if defined(CONFIG_CMD_FPGA_LOADBP) case FPGA_LOADBP: rc = fpga_loadbitstream(dev, fpga_data, data_size, BIT_PARTIAL); break; #endif |
1a897668a fpga: Added suppo... |
199 200 201 202 203 |
#if defined(CONFIG_CMD_FPGA_LOADFS) case FPGA_LOADFS: rc = fpga_fsload(dev, fpga_data, data_size, &fpga_fsinfo); break; #endif |
64e809afe fpga: Guard the L... |
204 |
#if defined(CONFIG_CMD_FPGA_LOADMK) |
f0ff4692f Add FPGA Altera C... |
205 |
case FPGA_LOADMK: |
fc598412c cmd: fpga: Clean ... |
206 |
switch (genimg_get_format(fpga_data)) { |
21d29f7f9 bootm: make use o... |
207 |
#if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
d5934ad77 [new uImage] Add ... |
208 209 |
case IMAGE_FORMAT_LEGACY: { |
fc598412c cmd: fpga: Clean ... |
210 211 212 |
image_header_t *hdr = (image_header_t *)fpga_data; ulong data; |
32d7cdd36 fpga: Add support... |
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
uint8_t comp; comp = image_get_comp(hdr); if (comp == IH_COMP_GZIP) { ulong image_buf = image_get_data(hdr); data = image_get_load(hdr); ulong image_size = ~0UL; if (gunzip((void *)data, ~0UL, (void *)image_buf, &image_size) != 0) { puts("GUNZIP: error "); return 1; } data_size = image_size; } else { data = (ulong)image_get_data(hdr); data_size = image_get_data_size(hdr); } |
7a78bd267 fpga: Define bits... |
233 234 |
rc = fpga_load(dev, (void *)data, data_size, BIT_FULL); |
f0ff4692f Add FPGA Altera C... |
235 |
} |
d5934ad77 [new uImage] Add ... |
236 |
break; |
21d29f7f9 bootm: make use o... |
237 |
#endif |
d5934ad77 [new uImage] Add ... |
238 239 |
#if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: |
c28c4d193 [new uImage] Add ... |
240 241 242 |
{ const void *fit_hdr = (const void *)fpga_data; int noffset; |
e6a857da7 fpga: constify to... |
243 |
const void *fit_data; |
c28c4d193 [new uImage] Add ... |
244 245 |
if (fit_uname == NULL) { |
fc598412c cmd: fpga: Clean ... |
246 247 |
puts("No FIT subimage unit name "); |
c28c4d193 [new uImage] Add ... |
248 249 |
return 1; } |
fc598412c cmd: fpga: Clean ... |
250 251 252 |
if (!fit_check_format(fit_hdr)) { puts("Bad FIT image format "); |
c28c4d193 [new uImage] Add ... |
253 254 255 256 |
return 1; } /* get fpga component image node offset */ |
fc598412c cmd: fpga: Clean ... |
257 258 |
noffset = fit_image_get_node(fit_hdr, fit_uname); |
c28c4d193 [new uImage] Add ... |
259 |
if (noffset < 0) { |
fc598412c cmd: fpga: Clean ... |
260 261 262 |
printf("Can't find '%s' FIT subimage ", fit_uname); |
c28c4d193 [new uImage] Add ... |
263 264 265 266 |
return 1; } /* verify integrity */ |
b8da83665 image: Rename fit... |
267 |
if (!fit_image_verify(fit_hdr, noffset)) { |
c28c4d193 [new uImage] Add ... |
268 269 270 271 272 273 |
puts ("Bad Data Hash "); return 1; } /* get fpga subimage data address and length */ |
fc598412c cmd: fpga: Clean ... |
274 275 276 277 |
if (fit_image_get_data(fit_hdr, noffset, &fit_data, &data_size)) { puts("Fpga subimage data not found "); |
c28c4d193 [new uImage] Add ... |
278 279 |
return 1; } |
7a78bd267 fpga: Define bits... |
280 281 |
rc = fpga_load(dev, fit_data, data_size, BIT_FULL); |
c28c4d193 [new uImage] Add ... |
282 |
} |
d5934ad77 [new uImage] Add ... |
283 284 285 |
break; #endif default: |
fc598412c cmd: fpga: Clean ... |
286 287 |
puts("** Unknown image type "); |
d5934ad77 [new uImage] Add ... |
288 289 |
rc = FPGA_FAIL; break; |
f0ff4692f Add FPGA Altera C... |
290 291 |
} break; |
64e809afe fpga: Guard the L... |
292 |
#endif |
f0ff4692f Add FPGA Altera C... |
293 |
|
d4ca31c40 * Cleanup lowboot... |
294 |
case FPGA_DUMP: |
fc598412c cmd: fpga: Clean ... |
295 |
rc = fpga_dump(dev, fpga_data, data_size); |
d4ca31c40 * Cleanup lowboot... |
296 297 298 |
break; default: |
fc598412c cmd: fpga: Clean ... |
299 300 |
printf("Unknown operation "); |
4c12eeb8b Convert cmd_usage... |
301 |
return CMD_RET_USAGE; |
d4ca31c40 * Cleanup lowboot... |
302 |
} |
fc598412c cmd: fpga: Clean ... |
303 |
return rc; |
4a9cbbe83 Initial revision |
304 |
} |
4a9cbbe83 Initial revision |
305 306 307 308 |
/* * Map op to supported operations. We don't use a table since we * would just have to relocate it from flash anyway. */ |
fc598412c cmd: fpga: Clean ... |
309 |
static int fpga_get_op(char *opstr) |
4a9cbbe83 Initial revision |
310 311 |
{ int op = FPGA_NONE; |
fc598412c cmd: fpga: Clean ... |
312 |
if (!strcmp("info", opstr)) |
4a9cbbe83 Initial revision |
313 |
op = FPGA_INFO; |
fc598412c cmd: fpga: Clean ... |
314 |
else if (!strcmp("loadb", opstr)) |
30ce5ab04 * Patch by Gleb N... |
315 |
op = FPGA_LOADB; |
fc598412c cmd: fpga: Clean ... |
316 |
else if (!strcmp("load", opstr)) |
4a9cbbe83 Initial revision |
317 |
op = FPGA_LOAD; |
67193864b fpga: Add support... |
318 319 320 321 322 323 324 325 |
#if defined(CONFIG_CMD_FPGA_LOADP) else if (!strcmp("loadp", opstr)) op = FPGA_LOADP; #endif #if defined(CONFIG_CMD_FPGA_LOADBP) else if (!strcmp("loadbp", opstr)) op = FPGA_LOADBP; #endif |
1a897668a fpga: Added suppo... |
326 327 328 329 |
#if defined(CONFIG_CMD_FPGA_LOADFS) else if (!strcmp("loadfs", opstr)) op = FPGA_LOADFS; #endif |
64e809afe fpga: Guard the L... |
330 |
#if defined(CONFIG_CMD_FPGA_LOADMK) |
fc598412c cmd: fpga: Clean ... |
331 |
else if (!strcmp("loadmk", opstr)) |
f0ff4692f Add FPGA Altera C... |
332 |
op = FPGA_LOADMK; |
64e809afe fpga: Guard the L... |
333 |
#endif |
fc598412c cmd: fpga: Clean ... |
334 |
else if (!strcmp("dump", opstr)) |
4a9cbbe83 Initial revision |
335 |
op = FPGA_DUMP; |
4a9cbbe83 Initial revision |
336 |
|
fc598412c cmd: fpga: Clean ... |
337 338 339 |
if (op == FPGA_NONE) printf("Unknown fpga operation \"%s\" ", opstr); |
4a9cbbe83 Initial revision |
340 341 |
return op; } |
1a897668a fpga: Added suppo... |
342 343 344 |
#if defined(CONFIG_CMD_FPGA_LOADFS) U_BOOT_CMD(fpga, 9, 1, do_fpga, #else |
fc598412c cmd: fpga: Clean ... |
345 |
U_BOOT_CMD(fpga, 6, 1, do_fpga, |
1a897668a fpga: Added suppo... |
346 |
#endif |
fc598412c cmd: fpga: Clean ... |
347 348 349 350 351 352 353 354 355 356 357 |
"loadable FPGA image support", "[operation type] [device number] [image address] [image size] " "fpga operations: " " dump\t[dev]\t\t\tLoad device to memory buffer " " info\t[dev]\t\t\tlist known device information " " load\t[dev] [address] [size]\tLoad device from memory buffer " |
67193864b fpga: Add support... |
358 359 360 361 362 |
#if defined(CONFIG_CMD_FPGA_LOADP) " loadp\t[dev] [address] [size]\t" "Load device from memory buffer with partial bitstream " #endif |
fc598412c cmd: fpga: Clean ... |
363 364 365 |
" loadb\t[dev] [address] [size]\t" "Load device from bitstream buffer (Xilinx only) " |
67193864b fpga: Add support... |
366 367 368 369 370 371 |
#if defined(CONFIG_CMD_FPGA_LOADBP) " loadbp\t[dev] [address] [size]\t" "Load device from bitstream buffer with partial bitstream" "(Xilinx only) " #endif |
1a897668a fpga: Added suppo... |
372 373 374 375 376 377 378 379 |
#if defined(CONFIG_CMD_FPGA_LOADFS) "Load device from filesystem (FAT by default) (Xilinx only) " " loadfs [dev] [address] [image size] [blocksize] <interface> " " [<dev[:part]>] <filename> " #endif |
64e809afe fpga: Guard the L... |
380 |
#if defined(CONFIG_CMD_FPGA_LOADMK) |
fc598412c cmd: fpga: Clean ... |
381 |
" loadmk [dev] [address]\tLoad device generated with mkimage" |
c28c4d193 [new uImage] Add ... |
382 |
#if defined(CONFIG_FIT) |
fc598412c cmd: fpga: Clean ... |
383 384 385 386 387 |
" " "\tFor loadmk operating on FIT format uImage address must include " "\tsubimage unit name in the form of addr:<subimg_uname>" |
c28c4d193 [new uImage] Add ... |
388 |
#endif |
64e809afe fpga: Guard the L... |
389 |
#endif |
c28c4d193 [new uImage] Add ... |
390 |
); |