cmd: fpga: Add support for missing fpga loadmk commands

There are ways how to call fpga loadmk

1. Full command
fpga loadmk [dev] [address]

2. Dev setup via variable
set fpga [dev]
fpga loadmk [address]

3. Address setup via variable
set fpgadata [address]
fpga loadmk [dev]

4. Dev and address setup via variables
set fpga [dev]
set fpgadata [address]
fpga loadmk

Before this patch only cases 1 and 3 are working but the part of code
was trying to support also cases 2 and 4.
This patch is adding support for cases 2 and 4 to have all of
combinations supported.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
lime2-spi
Michal Simek 6 years ago
parent 2892fe801d
commit 8c75f7943d
  1. 55
      cmd/fpga.c

@ -22,7 +22,7 @@ static long do_fpga_get_device(char *arg)
/* Should be strtol to handle -1 cases */ /* Should be strtol to handle -1 cases */
dev = simple_strtol(devstr, NULL, 16); dev = simple_strtol(devstr, NULL, 16);
if (arg) if (dev == FPGA_INVALID_DEVICE && arg)
dev = simple_strtol(arg, NULL, 16); dev = simple_strtol(arg, NULL, 16);
debug("%s: device = %ld\n", __func__, dev); debug("%s: device = %ld\n", __func__, dev);
@ -312,29 +312,44 @@ static int do_fpga_loadmk(cmd_tbl_t *cmdtp, int flag, int argc,
ulong dev = do_fpga_get_device(argv[0]); ulong dev = do_fpga_get_device(argv[0]);
char *datastr = env_get("fpgadata"); char *datastr = env_get("fpgadata");
if (datastr) debug("fpga: argc %x, dev %lx, datastr %s\n", argc, dev, datastr);
fpga_data = (void *)simple_strtoul(datastr, NULL, 16);
if (dev == FPGA_INVALID_DEVICE) {
debug("fpga: Invalid fpga device\n");
return CMD_RET_USAGE;
}
if (argc == 0 && !datastr) {
debug("fpga: No datastr passed\n");
return CMD_RET_USAGE;
}
if (argc == 2) { if (argc == 2) {
datastr = argv[1];
debug("fpga: Full command with two args\n");
} else if (argc == 1 && !datastr) {
debug("fpga: Dev is setup - fpgadata passed\n");
datastr = argv[0];
}
#if defined(CONFIG_FIT) #if defined(CONFIG_FIT)
if (fit_parse_subimage(argv[1], (ulong)fpga_data, if (fit_parse_subimage(datastr, (ulong)fpga_data,
&fit_addr, &fit_uname)) { &fit_addr, &fit_uname)) {
fpga_data = (void *)fit_addr; fpga_data = (void *)fit_addr;
debug("* fpga: subimage '%s' from FIT image ", debug("* fpga: subimage '%s' from FIT image ",
fit_uname); fit_uname);
debug("at 0x%08lx\n", fit_addr); debug("at 0x%08lx\n", fit_addr);
} else } else
#endif #endif
{ {
fpga_data = (void *)simple_strtoul(argv[1], NULL, 16); fpga_data = (void *)simple_strtoul(datastr, NULL, 16);
debug("* fpga: cmdline image address = 0x%08lx\n", debug("* fpga: cmdline image address = 0x%08lx\n",
(ulong)fpga_data); (ulong)fpga_data);
} }
debug("%s: fpga_data = 0x%lx\n", __func__, (ulong)fpga_data); debug("%s: fpga_data = 0x%lx\n", __func__, (ulong)fpga_data);
if (!fpga_data) { if (!fpga_data) {
puts("Zero fpga_data address\n"); puts("Zero fpga_data address\n");
return CMD_RET_USAGE; return CMD_RET_USAGE;
}
} }
switch (genimg_get_format(fpga_data)) { switch (genimg_get_format(fpga_data)) {

Loading…
Cancel
Save