From 3cc971647652381d3e5f141f85ee5c41714025d3 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Tue, 5 Jun 2018 13:52:32 +0200 Subject: cmd: fpga: Remove fit image support passed without fpga device The patch applied in 2010 "cmd_fpga: cleanup help and check parameters" (sha1: a790b5b2326be9d7c9ad9e3d9b51a8bfabc62d07" was adding this checking + if (dev == FPGA_INVALID_DEVICE) { + puts("FPGA device not specified\n"); + op = FPGA_NONE; + } which simply broke one command flow which was setenv fpga fpga loadmk // legacy image fpga loadmk : //fit image Also this sequence for FIT image is completely broken setenv fpga setenv fpgadata : fpga loadmk (Note: For legacy images this is working fine). even from code I don't think this has ever worked properly for fit image (dev = FPGA_INVALID_DEVICE should be rejected by fpga core). Fit image support was in 2008 added by: "[new uImage] Add new uImage fromat support to fpga command" (sha1: c28c4d193dbfb20b2dd3a5447640fd6de7fd0720) Just a summary of these facts that none found this for pretty long time it shouldn't be a problem to remove this flow (without fpga dev) completely to simplify the code. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 25 ------------------------- 1 file changed, 25 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index 74ae80c807..791fe5cb77 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -127,31 +127,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) case 3: /* fpga */ dev = (int)simple_strtoul(argv[2], NULL, 16); debug("%s: device = %d\n", __func__, dev); - /* FIXME - this is a really weak test */ - if ((argc == 3) && (dev > fpga_count())) { - /* must be buffer ptr */ - debug("%s: Assuming buffer pointer in arg 3\n", - __func__); - -#if defined(CONFIG_FIT) - if (fit_parse_subimage(argv[2], (ulong)fpga_data, - &fit_addr, &fit_uname)) { - fpga_data = (void *)fit_addr; - debug("* fpga: subimage '%s' from FIT image ", - fit_uname); - debug("at 0x%08lx\n", fit_addr); - } else -#endif - { - fpga_data = (void *)(uintptr_t)dev; - debug("* fpga: cmdline image addr = 0x%08lx\n", - (ulong)fpga_data); - } - - debug("%s: fpga_data = 0x%lx\n", - __func__, (ulong)fpga_data); - dev = FPGA_INVALID_DEVICE; /* reset device num */ - } } if (dev == FPGA_INVALID_DEVICE) { -- cgit v1.2.3 From 550109691ec87a129fd5c5777e1211257ff3c6c9 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Wed, 30 May 2018 09:57:42 +0200 Subject: cmd: fpga: Move error handling to do_fpga() Clean fpga_get_op() error handling by moving checking/print to do_fpga. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index 791fe5cb77..abe6837202 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -74,6 +74,9 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) op = (int)fpga_get_op(argv[1]); switch (op) { + case FPGA_NONE: + printf("Unknown fpga operation \"%s\"\n", argv[1]); + return CMD_RET_USAGE; #if defined(CONFIG_CMD_FPGA_LOADFS) case FPGA_LOADFS: if (argc < 9) @@ -360,9 +363,6 @@ static int fpga_get_op(char *opstr) op = FPGA_LOADS; #endif - if (op == FPGA_NONE) - printf("Unknown fpga operation \"%s\"\n", opstr); - return op; } -- cgit v1.2.3 From 323fe38e74a96a4585f04c356baa0b739e7b34b5 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Wed, 30 May 2018 10:00:40 +0200 Subject: cmd: fpga: Move fpga_get_op to avoid local function declaration Move fpga_get_op() to top of file to remove local function declaration and also remove useless retyping. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 85 ++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 41 insertions(+), 44 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index abe6837202..de8505e9d4 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -13,9 +13,6 @@ #include #include -/* Local functions */ -static int fpga_get_op(char *opstr); - /* Local defines */ enum { FPGA_NONE = -1, @@ -30,6 +27,46 @@ enum { FPGA_LOADS, }; +/* + * Map op to supported operations. We don't use a table since we + * would just have to relocate it from flash anyway. + */ +static int fpga_get_op(char *opstr) +{ + int op = FPGA_NONE; + + if (!strcmp("info", opstr)) + op = FPGA_INFO; + else if (!strcmp("loadb", opstr)) + op = FPGA_LOADB; + else if (!strcmp("load", opstr)) + op = FPGA_LOAD; +#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 +#if defined(CONFIG_CMD_FPGA_LOADFS) + else if (!strcmp("loadfs", opstr)) + op = FPGA_LOADFS; +#endif +#if defined(CONFIG_CMD_FPGA_LOADMK) + else if (!strcmp("loadmk", opstr)) + op = FPGA_LOADMK; +#endif + else if (!strcmp("dump", opstr)) + op = FPGA_DUMP; +#if defined(CONFIG_CMD_FPGA_LOAD_SECURE) + else if (!strcmp("loads", opstr)) + op = FPGA_LOADS; +#endif + + return op; +} + /* ------------------------------------------------------------------------- */ /* command form: * fpga @@ -71,7 +108,7 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) return CMD_RET_USAGE; } - op = (int)fpga_get_op(argv[1]); + op = fpga_get_op(argv[1]); switch (op) { case FPGA_NONE: @@ -326,46 +363,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) return rc; } -/* - * Map op to supported operations. We don't use a table since we - * would just have to relocate it from flash anyway. - */ -static int fpga_get_op(char *opstr) -{ - int op = FPGA_NONE; - - if (!strcmp("info", opstr)) - op = FPGA_INFO; - else if (!strcmp("loadb", opstr)) - op = FPGA_LOADB; - else if (!strcmp("load", opstr)) - op = FPGA_LOAD; -#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 -#if defined(CONFIG_CMD_FPGA_LOADFS) - else if (!strcmp("loadfs", opstr)) - op = FPGA_LOADFS; -#endif -#if defined(CONFIG_CMD_FPGA_LOADMK) - else if (!strcmp("loadmk", opstr)) - op = FPGA_LOADMK; -#endif - else if (!strcmp("dump", opstr)) - op = FPGA_DUMP; -#if defined(CONFIG_CMD_FPGA_LOAD_SECURE) - else if (!strcmp("loads", opstr)) - op = FPGA_LOADS; -#endif - - return op; -} - #if defined(CONFIG_CMD_FPGA_LOADFS) || defined(CONFIG_CMD_FPGA_LOAD_SECURE) U_BOOT_CMD(fpga, 9, 1, do_fpga, #else -- cgit v1.2.3 From ccd65203275f74b5bb6fa8c7920627493c28e65f Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Wed, 30 May 2018 10:04:34 +0200 Subject: cmd: fpga: Cleanup error handling in connection to FPGA_NONE Incorrect command is already handled and FPGA_NONE should be used only one. In case of error CMD_RET_USAGE can be returned directly without any addition logic around. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index de8505e9d4..af2f514dca 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -171,11 +171,10 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) if (dev == FPGA_INVALID_DEVICE) { puts("FPGA device not specified\n"); - op = FPGA_NONE; + return CMD_RET_USAGE; } switch (op) { - case FPGA_NONE: case FPGA_INFO: break; #if defined(CONFIG_CMD_FPGA_LOADFS) @@ -219,13 +218,10 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) if (wrong_parms) { puts("Wrong parameters for FPGA request\n"); - op = FPGA_NONE; + return CMD_RET_USAGE; } switch (op) { - case FPGA_NONE: - return CMD_RET_USAGE; - case FPGA_INFO: rc = fpga_info(dev); break; -- cgit v1.2.3 From 44d839bd5f3c7508c50fc083a48425188022d958 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Wed, 30 May 2018 11:18:38 +0200 Subject: cmd: fpga: Move parameter checking for loadfs/loads There is no reason to check parameters in separate switch before main one. This patch is simplifying error path and checking parameters right after assignment. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index af2f514dca..48902286f1 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -123,6 +123,14 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) fpga_fsinfo.interface = argv[6]; fpga_fsinfo.dev_part = argv[7]; fpga_fsinfo.filename = argv[8]; + + /* Blocksize can be zero */ + if (!fpga_fsinfo.interface || !fpga_fsinfo.dev_part || + !fpga_fsinfo.filename) { + puts("ERR: Wrong interface, dev_part or filename\n"); + return CMD_RET_USAGE; + } + argc = 5; break; #endif @@ -136,6 +144,19 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) NULL, 16); fpga_sec_info.encflag = (u8)simple_strtoul(argv[6], NULL, 16); fpga_sec_info.authflag = (u8)simple_strtoul(argv[5], NULL, 16); + + if (fpga_sec_info.authflag >= FPGA_NO_ENC_OR_NO_AUTH && + fpga_sec_info.encflag >= FPGA_NO_ENC_OR_NO_AUTH) { + puts("ERR: Use for NonSecure bitstream\n"); + return CMD_RET_USAGE; + } + + if (fpga_sec_info.encflag == FPGA_ENC_USR_KEY && + !fpga_sec_info.userkey_addr) { + puts("ERR: User key not provided\n"); + return CMD_RET_USAGE; + } + argc = 5; break; #endif @@ -177,29 +198,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) switch (op) { case FPGA_INFO: break; -#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; - break; -#endif -#if defined(CONFIG_CMD_FPGA_LOAD_SECURE) - case FPGA_LOADS: - if (fpga_sec_info.authflag >= FPGA_NO_ENC_OR_NO_AUTH && - fpga_sec_info.encflag >= FPGA_NO_ENC_OR_NO_AUTH) { - puts("ERR: use for NonSecure bitstream\n"); - wrong_parms = 1; - } - - if (fpga_sec_info.encflag == FPGA_ENC_USR_KEY && - !fpga_sec_info.userkey_addr) { - wrong_parms = 1; - puts("ERR:User key not provided\n"); - } - break; -#endif case FPGA_LOAD: case FPGA_LOADP: case FPGA_LOADB: -- cgit v1.2.3 From aa93ac59dcf6c7a7593cd7d67b8f8a5b01353efb Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 4 Jun 2018 13:57:19 +0200 Subject: cmd: fpga: Remove parameter checking from fpga loadfs command Parameter checking is dead code because all the time there must be all params assigned. If they are not assigned there is no 9th parameters passed and checking before return CMD_RET_USAGE. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 7 ------- 1 file changed, 7 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index 48902286f1..b03dd9dc0a 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -124,13 +124,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) fpga_fsinfo.dev_part = argv[7]; fpga_fsinfo.filename = argv[8]; - /* Blocksize can be zero */ - if (!fpga_fsinfo.interface || !fpga_fsinfo.dev_part || - !fpga_fsinfo.filename) { - puts("ERR: Wrong interface, dev_part or filename\n"); - return CMD_RET_USAGE; - } - argc = 5; break; #endif -- cgit v1.2.3 From 5cadab60fbd917648335d5d672eb3b1752d5b225 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Wed, 30 May 2018 11:28:57 +0200 Subject: cmd: fpga: Clean wrong_parms handling There is no reason to check parameters in separate switch. Check them directly when they are read. Also there is no reason to check loadmk case separately because fpga_data address must be non zero too. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index b03dd9dc0a..0e5f4117c0 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -83,7 +83,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) char *devstr = env_get("fpga"); char *datastr = env_get("fpgadata"); int rc = FPGA_FAIL; - int wrong_parms = 0; #if defined(CONFIG_FIT) const char *fit_uname = NULL; ulong fit_addr; @@ -160,7 +159,10 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) switch (argc) { case 5: /* fpga */ data_size = simple_strtoul(argv[4], NULL, 16); - + if (!data_size) { + puts("Zero data_size\n"); + return CMD_RET_USAGE; + } case 4: /* fpga */ #if defined(CONFIG_FIT) if (fit_parse_subimage(argv[3], (ulong)fpga_data, @@ -177,7 +179,10 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) (ulong)fpga_data); } debug("%s: fpga_data = 0x%lx\n", __func__, (ulong)fpga_data); - + if (!fpga_data) { + puts("Zero fpga_data address\n"); + return CMD_RET_USAGE; + } case 3: /* fpga */ dev = (int)simple_strtoul(argv[2], NULL, 16); debug("%s: device = %d\n", __func__, dev); @@ -188,30 +193,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) return CMD_RET_USAGE; } - switch (op) { - case FPGA_INFO: - break; - case FPGA_LOAD: - case FPGA_LOADP: - case FPGA_LOADB: - case FPGA_LOADBP: - case FPGA_DUMP: - if (!fpga_data || !data_size) - wrong_parms = 1; - break; -#if defined(CONFIG_CMD_FPGA_LOADMK) - case FPGA_LOADMK: - if (!fpga_data) - wrong_parms = 1; - break; -#endif - } - - if (wrong_parms) { - puts("Wrong parameters for FPGA request\n"); - return CMD_RET_USAGE; - } - switch (op) { case FPGA_INFO: rc = fpga_info(dev); -- cgit v1.2.3 From 9657d97cf5f0284dbab36915654fb5d082332281 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 4 Jun 2018 14:55:20 +0200 Subject: cmd: fpga: Create new do_fpga_wrapper for using u-boot subcommands Create command wrapper to clean fpga subcommands. The function logic is taken from cmd_dm.c Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index 0e5f4117c0..ac12af2fa0 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -331,10 +331,48 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) return rc; } +static cmd_tbl_t fpga_commands[] = { +}; + +static int do_fpga_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, + char *const argv[]) +{ + cmd_tbl_t *fpga_cmd; + int ret; + + if (argc < 2) + return CMD_RET_USAGE; + + fpga_cmd = find_cmd_tbl(argv[1], fpga_commands, + ARRAY_SIZE(fpga_commands)); + + /* This should be removed when all functions are converted */ + if (!fpga_cmd) + return do_fpga(cmdtp, flag, argc, argv); + + /* FIXME This can't be reached till all functions are converted */ + if (!fpga_cmd) { + debug("fpga: non existing command\n"); + return CMD_RET_USAGE; + } + + argc -= 2; + argv += 2; + + if (argc > fpga_cmd->maxargs) { + debug("fpga: more parameters passed\n"); + return CMD_RET_USAGE; + } + + ret = fpga_cmd->cmd(fpga_cmd, flag, argc, argv); + + return cmd_process_error(fpga_cmd, ret); +} + #if defined(CONFIG_CMD_FPGA_LOADFS) || defined(CONFIG_CMD_FPGA_LOAD_SECURE) -U_BOOT_CMD(fpga, 9, 1, do_fpga, +U_BOOT_CMD(fpga, 9, 1, do_fpga_wrapper, #else -U_BOOT_CMD(fpga, 6, 1, do_fpga, +U_BOOT_CMD(fpga, 6, 1, do_fpga_wrapper, #endif "loadable FPGA image support", "[operation type] [device number] [image address] [image size]\n" -- cgit v1.2.3 From f4c7a4aea261e9eab3068f91a08f3c84bd58d89f Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 4 Jun 2018 14:57:34 +0200 Subject: cmd: fpga: Extract fpga info command to separate function Move fpga info to U_BOOT_CMD_MKENT subcommand. Also use strtol instead of simple_strtoul. The reason is that if -1 is passed (or fpga info without "fpga" variable) the list of all fpgas is shown. This functionality is in the fpga core but it couldn't be performed. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index ac12af2fa0..039803870b 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -13,10 +13,26 @@ #include #include +static long do_fpga_get_device(char *arg) +{ + long dev = FPGA_INVALID_DEVICE; + char *devstr = env_get("fpga"); + + if (devstr) + /* Should be strtol to handle -1 cases */ + dev = simple_strtol(devstr, NULL, 16); + + if (arg) + dev = simple_strtol(arg, NULL, 16); + + debug("%s: device = %ld\n", __func__, dev); + + return dev; +} + /* Local defines */ enum { FPGA_NONE = -1, - FPGA_INFO, FPGA_LOAD, FPGA_LOADB, FPGA_DUMP, @@ -35,9 +51,7 @@ static int fpga_get_op(char *opstr) { int op = FPGA_NONE; - if (!strcmp("info", opstr)) - op = FPGA_INFO; - else if (!strcmp("loadb", opstr)) + if (!strcmp("loadb", opstr)) op = FPGA_LOADB; else if (!strcmp("load", opstr)) op = FPGA_LOAD; @@ -194,10 +208,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) } switch (op) { - case FPGA_INFO: - rc = fpga_info(dev); - break; - case FPGA_LOAD: rc = fpga_load(dev, fpga_data, data_size, BIT_FULL); break; @@ -331,7 +341,16 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) return rc; } +static int do_fpga_info(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + long dev = do_fpga_get_device(argv[0]); + + return fpga_info(dev); +} + static cmd_tbl_t fpga_commands[] = { + U_BOOT_CMD_MKENT(info, 1, 1, do_fpga_info, "", ""), }; static int do_fpga_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, -- cgit v1.2.3 From 857547959ba5d794013390484bd6617278ee6706 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 4 Jun 2018 15:51:23 +0200 Subject: cmd: fpga: Fix dump and all direct fpga load commands Separate dump, load, loadb, loadp and loadbp commands to separate functions to make it clear how they are called and what parameters they need. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 166 +++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 122 insertions(+), 44 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index 039803870b..9c715db805 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -30,15 +30,42 @@ static long do_fpga_get_device(char *arg) return dev; } +static int do_fpga_check_params(long *dev, long *fpga_data, size_t *data_size, + cmd_tbl_t *cmdtp, int argc, char *const argv[]) +{ + size_t local_data_size; + long local_fpga_data; + + debug("%s %d, %d\n", __func__, argc, cmdtp->maxargs); + + if (argc != cmdtp->maxargs) { + debug("fpga: incorrect parameters passed\n"); + return CMD_RET_USAGE; + } + + *dev = do_fpga_get_device(argv[0]); + + local_fpga_data = simple_strtol(argv[1], NULL, 16); + if (!local_fpga_data) { + debug("fpga: zero fpga_data address\n"); + return CMD_RET_USAGE; + } + *fpga_data = local_fpga_data; + + local_data_size = simple_strtoul(argv[2], NULL, 16); + if (!local_data_size) { + debug("fpga: zero size\n"); + return CMD_RET_USAGE; + } + *data_size = local_data_size; + + return 0; +} + /* Local defines */ enum { FPGA_NONE = -1, - FPGA_LOAD, - FPGA_LOADB, - FPGA_DUMP, FPGA_LOADMK, - FPGA_LOADP, - FPGA_LOADBP, FPGA_LOADFS, FPGA_LOADS, }; @@ -51,28 +78,14 @@ static int fpga_get_op(char *opstr) { int op = FPGA_NONE; - if (!strcmp("loadb", opstr)) - op = FPGA_LOADB; - else if (!strcmp("load", opstr)) - op = FPGA_LOAD; -#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 #if defined(CONFIG_CMD_FPGA_LOADFS) - else if (!strcmp("loadfs", opstr)) + if (!strcmp("loadfs", opstr)) op = FPGA_LOADFS; #endif #if defined(CONFIG_CMD_FPGA_LOADMK) else if (!strcmp("loadmk", opstr)) op = FPGA_LOADMK; #endif - else if (!strcmp("dump", opstr)) - op = FPGA_DUMP; #if defined(CONFIG_CMD_FPGA_LOAD_SECURE) else if (!strcmp("loads", opstr)) op = FPGA_LOADS; @@ -208,26 +221,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) } switch (op) { - case FPGA_LOAD: - rc = fpga_load(dev, fpga_data, data_size, BIT_FULL); - break; - -#if defined(CONFIG_CMD_FPGA_LOADP) - case FPGA_LOADP: - rc = fpga_load(dev, fpga_data, data_size, BIT_PARTIAL); - break; -#endif - - case FPGA_LOADB: - rc = fpga_loadbitstream(dev, fpga_data, data_size, BIT_FULL); - break; - -#if defined(CONFIG_CMD_FPGA_LOADBP) - case FPGA_LOADBP: - rc = fpga_loadbitstream(dev, fpga_data, data_size, BIT_PARTIAL); - break; -#endif - #if defined(CONFIG_CMD_FPGA_LOADFS) case FPGA_LOADFS: rc = fpga_fsload(dev, fpga_data, data_size, &fpga_fsinfo); @@ -330,10 +323,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) break; #endif - case FPGA_DUMP: - rc = fpga_dump(dev, fpga_data, data_size); - break; - default: printf("Unknown operation\n"); return CMD_RET_USAGE; @@ -349,8 +338,97 @@ static int do_fpga_info(cmd_tbl_t *cmdtp, int flag, int argc, return fpga_info(dev); } +static int do_fpga_dump(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + size_t data_size = 0; + long fpga_data, dev; + int ret; + + ret = do_fpga_check_params(&dev, &fpga_data, &data_size, + cmdtp, argc, argv); + if (ret) + return ret; + + return fpga_dump(dev, (void *)fpga_data, data_size); +} + +static int do_fpga_load(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + size_t data_size = 0; + long fpga_data, dev; + int ret; + + ret = do_fpga_check_params(&dev, &fpga_data, &data_size, + cmdtp, argc, argv); + if (ret) + return ret; + + return fpga_load(dev, (void *)fpga_data, data_size, BIT_FULL); +} + +static int do_fpga_loadb(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + size_t data_size = 0; + long fpga_data, dev; + int ret; + + ret = do_fpga_check_params(&dev, &fpga_data, &data_size, + cmdtp, argc, argv); + if (ret) + return ret; + + return fpga_loadbitstream(dev, (void *)fpga_data, data_size, BIT_FULL); +} + +#if defined(CONFIG_CMD_FPGA_LOADP) +static int do_fpga_loadp(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + size_t data_size = 0; + long fpga_data, dev; + int ret; + + ret = do_fpga_check_params(&dev, &fpga_data, &data_size, + cmdtp, argc, argv); + if (ret) + return ret; + + return fpga_load(dev, (void *)fpga_data, data_size, BIT_PARTIAL); +} +#endif + +#if defined(CONFIG_CMD_FPGA_LOADBP) +static int do_fpga_loadbp(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + size_t data_size = 0; + long fpga_data, dev; + int ret; + + ret = do_fpga_check_params(&dev, &fpga_data, &data_size, + cmdtp, argc, argv); + if (ret) + return ret; + + return fpga_loadbitstream(dev, (void *)fpga_data, data_size, + BIT_PARTIAL); +} +#endif + static cmd_tbl_t fpga_commands[] = { U_BOOT_CMD_MKENT(info, 1, 1, do_fpga_info, "", ""), + U_BOOT_CMD_MKENT(dump, 3, 1, do_fpga_dump, "", ""), + U_BOOT_CMD_MKENT(load, 3, 1, do_fpga_load, "", ""), + U_BOOT_CMD_MKENT(loadb, 3, 1, do_fpga_loadb, "", ""), +#if defined(CONFIG_CMD_FPGA_LOADP) + U_BOOT_CMD_MKENT(loadp, 3, 1, do_fpga_loadp, "", ""), +#endif +#if defined(CONFIG_CMD_FPGA_LOADBP) + U_BOOT_CMD_MKENT(loadbp, 3, 1, do_fpga_loadbp, "", ""), +#endif }; static int do_fpga_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, -- cgit v1.2.3 From 49503f9afae1ebeae53b4d2fb863c5a706677127 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 4 Jun 2018 15:51:16 +0200 Subject: cmd: fpga: Fix loadfs command Convert loadfs command to fpga subcommands. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 58 ++++++++++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 30 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index 9c715db805..826f63371a 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -66,7 +66,6 @@ static int do_fpga_check_params(long *dev, long *fpga_data, size_t *data_size, enum { FPGA_NONE = -1, FPGA_LOADMK, - FPGA_LOADFS, FPGA_LOADS, }; @@ -78,12 +77,8 @@ static int fpga_get_op(char *opstr) { int op = FPGA_NONE; -#if defined(CONFIG_CMD_FPGA_LOADFS) - if (!strcmp("loadfs", opstr)) - op = FPGA_LOADFS; -#endif #if defined(CONFIG_CMD_FPGA_LOADMK) - else if (!strcmp("loadmk", opstr)) + if (!strcmp("loadmk", opstr)) op = FPGA_LOADMK; #endif #if defined(CONFIG_CMD_FPGA_LOAD_SECURE) @@ -114,10 +109,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) const char *fit_uname = NULL; ulong fit_addr; #endif -#if defined(CONFIG_CMD_FPGA_LOADFS) - fpga_fs_info fpga_fsinfo; - fpga_fsinfo.fstype = FS_TYPE_ANY; -#endif #if defined(CONFIG_CMD_FPGA_LOAD_SECURE) struct fpga_secure_info fpga_sec_info; @@ -140,19 +131,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) case FPGA_NONE: printf("Unknown fpga operation \"%s\"\n", argv[1]); return CMD_RET_USAGE; -#if defined(CONFIG_CMD_FPGA_LOADFS) - case FPGA_LOADFS: - if (argc < 9) - return CMD_RET_USAGE; - 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]; - - argc = 5; - break; -#endif #if defined(CONFIG_CMD_FPGA_LOAD_SECURE) case FPGA_LOADS: if (argc < 7) @@ -221,18 +199,11 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) } switch (op) { -#if defined(CONFIG_CMD_FPGA_LOADFS) - case FPGA_LOADFS: - rc = fpga_fsload(dev, fpga_data, data_size, &fpga_fsinfo); - break; -#endif - #if defined(CONFIG_CMD_FPGA_LOAD_SECURE) case FPGA_LOADS: rc = fpga_loads(dev, fpga_data, data_size, &fpga_sec_info); break; #endif - #if defined(CONFIG_CMD_FPGA_LOADMK) case FPGA_LOADMK: switch (genimg_get_format(fpga_data)) { @@ -330,6 +301,30 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) return rc; } +#if defined(CONFIG_CMD_FPGA_LOADFS) +static int do_fpga_loadfs(cmd_tbl_t *cmdtp, int flag, int argc, + char *const argv[]) +{ + size_t data_size = 0; + long fpga_data, dev; + int ret; + fpga_fs_info fpga_fsinfo; + + ret = do_fpga_check_params(&dev, &fpga_data, &data_size, + cmdtp, argc, argv); + if (ret) + return ret; + + fpga_fsinfo.fstype = FS_TYPE_ANY; + fpga_fsinfo.blocksize = (unsigned int)simple_strtoul(argv[3], NULL, 16); + fpga_fsinfo.interface = argv[4]; + fpga_fsinfo.dev_part = argv[5]; + fpga_fsinfo.filename = argv[6]; + + return fpga_fsload(dev, (void *)fpga_data, data_size, &fpga_fsinfo); +} +#endif + static int do_fpga_info(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { @@ -429,6 +424,9 @@ static cmd_tbl_t fpga_commands[] = { #if defined(CONFIG_CMD_FPGA_LOADBP) U_BOOT_CMD_MKENT(loadbp, 3, 1, do_fpga_loadbp, "", ""), #endif +#if defined(CONFIG_CMD_FPGA_LOADFS) + U_BOOT_CMD_MKENT(loadfs, 7, 1, do_fpga_loadfs, "", ""), +#endif }; static int do_fpga_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, -- cgit v1.2.3 From 2892fe801d8c3c19670782de755484624886a2a6 Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Mon, 4 Jun 2018 16:15:58 +0200 Subject: cmd: fpga: Fix loadmk command Convert loadmk command to fpga subcommands. Not all combinations are working but they have never worked properly. This will be fixed later. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 238 ++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 123 insertions(+), 115 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index 826f63371a..9cb0116af7 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -65,7 +65,6 @@ static int do_fpga_check_params(long *dev, long *fpga_data, size_t *data_size, /* Local defines */ enum { FPGA_NONE = -1, - FPGA_LOADMK, FPGA_LOADS, }; @@ -77,12 +76,8 @@ static int fpga_get_op(char *opstr) { int op = FPGA_NONE; -#if defined(CONFIG_CMD_FPGA_LOADMK) - if (!strcmp("loadmk", opstr)) - op = FPGA_LOADMK; -#endif #if defined(CONFIG_CMD_FPGA_LOAD_SECURE) - else if (!strcmp("loads", opstr)) + if (!strcmp("loads", opstr)) op = FPGA_LOADS; #endif @@ -102,24 +97,13 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) int op, dev = FPGA_INVALID_DEVICE; size_t data_size = 0; void *fpga_data = NULL; - char *devstr = env_get("fpga"); - char *datastr = env_get("fpgadata"); int rc = FPGA_FAIL; -#if defined(CONFIG_FIT) - const char *fit_uname = NULL; - ulong fit_addr; -#endif #if defined(CONFIG_CMD_FPGA_LOAD_SECURE) struct fpga_secure_info fpga_sec_info; memset(&fpga_sec_info, 0, sizeof(fpga_sec_info)); #endif - if (devstr) - dev = (int) simple_strtoul(devstr, NULL, 16); - if (datastr) - fpga_data = (void *)simple_strtoul(datastr, NULL, 16); - if (argc > 9 || argc < 2) { debug("%s: Too many or too few args (%d)\n", __func__, argc); return CMD_RET_USAGE; @@ -169,15 +153,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) return CMD_RET_USAGE; } case 4: /* fpga */ -#if defined(CONFIG_FIT) - if (fit_parse_subimage(argv[3], (ulong)fpga_data, - &fit_addr, &fit_uname)) { - fpga_data = (void *)fit_addr; - debug("* fpga: subimage '%s' from FIT image ", - fit_uname); - debug("at 0x%08lx\n", fit_addr); - } else -#endif { fpga_data = (void *)simple_strtoul(argv[3], NULL, 16); debug("* fpga: cmdline image address = 0x%08lx\n", @@ -204,95 +179,6 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) rc = fpga_loads(dev, fpga_data, data_size, &fpga_sec_info); break; #endif -#if defined(CONFIG_CMD_FPGA_LOADMK) - case FPGA_LOADMK: - switch (genimg_get_format(fpga_data)) { -#if defined(CONFIG_IMAGE_FORMAT_LEGACY) - case IMAGE_FORMAT_LEGACY: - { - image_header_t *hdr = - (image_header_t *)fpga_data; - ulong data; - uint8_t comp; - - comp = image_get_comp(hdr); - if (comp == IH_COMP_GZIP) { -#if defined(CONFIG_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\n"); - return 1; - } - data_size = image_size; -#else - puts("Gunzip image is not supported\n"); - return 1; -#endif - } else { - data = (ulong)image_get_data(hdr); - data_size = image_get_data_size(hdr); - } - rc = fpga_load(dev, (void *)data, data_size, - BIT_FULL); - } - break; -#endif -#if defined(CONFIG_FIT) - case IMAGE_FORMAT_FIT: - { - const void *fit_hdr = (const void *)fpga_data; - int noffset; - const void *fit_data; - - if (fit_uname == NULL) { - puts("No FIT subimage unit name\n"); - return 1; - } - - if (!fit_check_format(fit_hdr)) { - puts("Bad FIT image format\n"); - return 1; - } - - /* get fpga component image node offset */ - noffset = fit_image_get_node(fit_hdr, - fit_uname); - if (noffset < 0) { - printf("Can't find '%s' FIT subimage\n", - fit_uname); - return 1; - } - - /* verify integrity */ - if (!fit_image_verify(fit_hdr, noffset)) { - puts ("Bad Data Hash\n"); - return 1; - } - - /* get fpga subimage data address and length */ - if (fit_image_get_data(fit_hdr, noffset, - &fit_data, &data_size)) { - puts("Fpga subimage data not found\n"); - return 1; - } - - rc = fpga_load(dev, fit_data, data_size, - BIT_FULL); - } - break; -#endif - default: - puts("** Unknown image type\n"); - rc = FPGA_FAIL; - break; - } - break; -#endif default: printf("Unknown operation\n"); @@ -413,6 +299,125 @@ static int do_fpga_loadbp(cmd_tbl_t *cmdtp, int flag, int argc, } #endif +#if defined(CONFIG_CMD_FPGA_LOADMK) +static int do_fpga_loadmk(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + size_t data_size = 0; + void *fpga_data = NULL; +#if defined(CONFIG_FIT) + const char *fit_uname = NULL; + ulong fit_addr; +#endif + ulong dev = do_fpga_get_device(argv[0]); + char *datastr = env_get("fpgadata"); + + if (datastr) + fpga_data = (void *)simple_strtoul(datastr, NULL, 16); + + if (argc == 2) { +#if defined(CONFIG_FIT) + if (fit_parse_subimage(argv[1], (ulong)fpga_data, + &fit_addr, &fit_uname)) { + fpga_data = (void *)fit_addr; + debug("* fpga: subimage '%s' from FIT image ", + fit_uname); + debug("at 0x%08lx\n", fit_addr); + } else +#endif + { + fpga_data = (void *)simple_strtoul(argv[1], NULL, 16); + debug("* fpga: cmdline image address = 0x%08lx\n", + (ulong)fpga_data); + } + debug("%s: fpga_data = 0x%lx\n", __func__, (ulong)fpga_data); + if (!fpga_data) { + puts("Zero fpga_data address\n"); + return CMD_RET_USAGE; + } + } + + switch (genimg_get_format(fpga_data)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) + case IMAGE_FORMAT_LEGACY: + { + image_header_t *hdr = (image_header_t *)fpga_data; + ulong data; + u8 comp; + + comp = image_get_comp(hdr); + if (comp == IH_COMP_GZIP) { +#if defined(CONFIG_GZIP) + ulong image_buf = image_get_data(hdr); + ulong image_size = ~0UL; + + data = image_get_load(hdr); + + if (gunzip((void *)data, ~0UL, (void *)image_buf, + &image_size) != 0) { + puts("GUNZIP: error\n"); + return 1; + } + data_size = image_size; +#else + puts("Gunzip image is not supported\n"); + return 1; +#endif + } else { + data = (ulong)image_get_data(hdr); + data_size = image_get_data_size(hdr); + } + return fpga_load(dev, (void *)data, data_size, + BIT_FULL); + } +#endif +#if defined(CONFIG_FIT) + case IMAGE_FORMAT_FIT: + { + const void *fit_hdr = (const void *)fpga_data; + int noffset; + const void *fit_data; + + if (!fit_uname) { + puts("No FIT subimage unit name\n"); + return 1; + } + + if (!fit_check_format(fit_hdr)) { + puts("Bad FIT image format\n"); + return 1; + } + + /* get fpga component image node offset */ + noffset = fit_image_get_node(fit_hdr, fit_uname); + if (noffset < 0) { + printf("Can't find '%s' FIT subimage\n", fit_uname); + return 1; + } + + /* verify integrity */ + if (!fit_image_verify(fit_hdr, noffset)) { + puts("Bad Data Hash\n"); + return 1; + } + + /* get fpga subimage data address and length */ + if (fit_image_get_data(fit_hdr, noffset, &fit_data, + &data_size)) { + puts("Fpga subimage data not found\n"); + return 1; + } + + return fpga_load(dev, fit_data, data_size, BIT_FULL); + } +#endif + default: + puts("** Unknown image type\n"); + return FPGA_FAIL; + } +} +#endif + static cmd_tbl_t fpga_commands[] = { U_BOOT_CMD_MKENT(info, 1, 1, do_fpga_info, "", ""), U_BOOT_CMD_MKENT(dump, 3, 1, do_fpga_dump, "", ""), @@ -427,6 +432,9 @@ static cmd_tbl_t fpga_commands[] = { #if defined(CONFIG_CMD_FPGA_LOADFS) U_BOOT_CMD_MKENT(loadfs, 7, 1, do_fpga_loadfs, "", ""), #endif +#if defined(CONFIG_CMD_FPGA_LOADMK) + U_BOOT_CMD_MKENT(loadmk, 2, 1, do_fpga_loadmk, "", ""), +#endif }; static int do_fpga_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, -- cgit v1.2.3 From 8c75f7943df0e849cf1431cd1b3d3e67180a158c Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Thu, 26 Jul 2018 15:33:51 +0200 Subject: 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 Reviewed-by: Simon Glass --- cmd/fpga.c | 55 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 20 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index 9cb0116af7..de9d19dd8e 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -22,7 +22,7 @@ static long do_fpga_get_device(char *arg) /* Should be strtol to handle -1 cases */ dev = simple_strtol(devstr, NULL, 16); - if (arg) + if (dev == FPGA_INVALID_DEVICE && arg) dev = simple_strtol(arg, NULL, 16); 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]); char *datastr = env_get("fpgadata"); - if (datastr) - fpga_data = (void *)simple_strtoul(datastr, NULL, 16); + debug("fpga: argc %x, dev %lx, datastr %s\n", argc, dev, datastr); + + 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) { + 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 (fit_parse_subimage(argv[1], (ulong)fpga_data, - &fit_addr, &fit_uname)) { - fpga_data = (void *)fit_addr; - debug("* fpga: subimage '%s' from FIT image ", - fit_uname); - debug("at 0x%08lx\n", fit_addr); - } else + if (fit_parse_subimage(datastr, (ulong)fpga_data, + &fit_addr, &fit_uname)) { + fpga_data = (void *)fit_addr; + debug("* fpga: subimage '%s' from FIT image ", + fit_uname); + debug("at 0x%08lx\n", fit_addr); + } else #endif - { - fpga_data = (void *)simple_strtoul(argv[1], NULL, 16); - debug("* fpga: cmdline image address = 0x%08lx\n", - (ulong)fpga_data); - } - debug("%s: fpga_data = 0x%lx\n", __func__, (ulong)fpga_data); - if (!fpga_data) { - puts("Zero fpga_data address\n"); - return CMD_RET_USAGE; - } + { + fpga_data = (void *)simple_strtoul(datastr, NULL, 16); + debug("* fpga: cmdline image address = 0x%08lx\n", + (ulong)fpga_data); + } + debug("%s: fpga_data = 0x%lx\n", __func__, (ulong)fpga_data); + if (!fpga_data) { + puts("Zero fpga_data address\n"); + return CMD_RET_USAGE; } switch (genimg_get_format(fpga_data)) { -- cgit v1.2.3 From a2d1033b2078e5c16b86b31c7ba41c92111cb45a Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Tue, 5 Jun 2018 16:43:38 +0200 Subject: cmd: fpga: Use CMD_RET_FAILURE instead of simple 1 Use standard return command failure macro. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index de9d19dd8e..89fae86b82 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -371,7 +371,7 @@ static int do_fpga_loadmk(cmd_tbl_t *cmdtp, int flag, int argc, if (gunzip((void *)data, ~0UL, (void *)image_buf, &image_size) != 0) { puts("GUNZIP: error\n"); - return 1; + return CMD_RET_FAILURE; } data_size = image_size; #else @@ -395,32 +395,32 @@ static int do_fpga_loadmk(cmd_tbl_t *cmdtp, int flag, int argc, if (!fit_uname) { puts("No FIT subimage unit name\n"); - return 1; + return CMD_RET_FAILURE; } if (!fit_check_format(fit_hdr)) { puts("Bad FIT image format\n"); - return 1; + return CMD_RET_FAILURE; } /* get fpga component image node offset */ noffset = fit_image_get_node(fit_hdr, fit_uname); if (noffset < 0) { printf("Can't find '%s' FIT subimage\n", fit_uname); - return 1; + return CMD_RET_FAILURE; } /* verify integrity */ if (!fit_image_verify(fit_hdr, noffset)) { puts("Bad Data Hash\n"); - return 1; + return CMD_RET_FAILURE; } /* get fpga subimage data address and length */ if (fit_image_get_data(fit_hdr, noffset, &fit_data, &data_size)) { puts("Fpga subimage data not found\n"); - return 1; + return CMD_RET_FAILURE; } return fpga_load(dev, fit_data, data_size, BIT_FULL); @@ -428,7 +428,7 @@ static int do_fpga_loadmk(cmd_tbl_t *cmdtp, int flag, int argc, #endif default: puts("** Unknown image type\n"); - return FPGA_FAIL; + return CMD_RET_FAILURE; } } #endif -- cgit v1.2.3 From b5d19a93407fbe6cab096bdc145b4f92b7067a3b Mon Sep 17 00:00:00 2001 From: Michal Simek Date: Tue, 5 Jun 2018 15:14:39 +0200 Subject: cmd: fpga: Fix loads command Convert last loads command to fpga subcommands. Signed-off-by: Michal Simek Reviewed-by: Simon Glass --- cmd/fpga.c | 148 +++++++++++++++---------------------------------------------- 1 file changed, 36 insertions(+), 112 deletions(-) (limited to 'cmd/fpga.c') diff --git a/cmd/fpga.c b/cmd/fpga.c index 89fae86b82..88a8e3f318 100644 --- a/cmd/fpga.c +++ b/cmd/fpga.c @@ -62,130 +62,57 @@ static int do_fpga_check_params(long *dev, long *fpga_data, size_t *data_size, return 0; } -/* Local defines */ -enum { - FPGA_NONE = -1, - FPGA_LOADS, -}; - -/* - * Map op to supported operations. We don't use a table since we - * would just have to relocate it from flash anyway. - */ -static int fpga_get_op(char *opstr) -{ - int op = FPGA_NONE; - #if defined(CONFIG_CMD_FPGA_LOAD_SECURE) - if (!strcmp("loads", opstr)) - op = FPGA_LOADS; -#endif - - return op; -} - -/* ------------------------------------------------------------------------- */ -/* command form: - * fpga - * 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. - */ -int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) +int do_fpga_loads(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { - int op, dev = FPGA_INVALID_DEVICE; size_t data_size = 0; - void *fpga_data = NULL; - int rc = FPGA_FAIL; -#if defined(CONFIG_CMD_FPGA_LOAD_SECURE) + long fpga_data, dev; + int ret; struct fpga_secure_info fpga_sec_info; memset(&fpga_sec_info, 0, sizeof(fpga_sec_info)); -#endif - if (argc > 9 || argc < 2) { - debug("%s: Too many or too few args (%d)\n", __func__, argc); + if (argc < 5) { + debug("fpga: incorrect parameters passed\n"); return CMD_RET_USAGE; } - op = fpga_get_op(argv[1]); - - switch (op) { - case FPGA_NONE: - printf("Unknown fpga operation \"%s\"\n", argv[1]); + if (argc == 6) + fpga_sec_info.userkey_addr = (u8 *)(uintptr_t) + simple_strtoull(argv[5], + NULL, 16); + else + /* + * If 6th parameter is not passed then do_fpga_check_params + * will get 5 instead of expected 6 which means that function + * return CMD_RET_USAGE. Increase number of params +1 to pass + * this. + */ + argc++; + + fpga_sec_info.encflag = (u8)simple_strtoul(argv[4], NULL, 16); + fpga_sec_info.authflag = (u8)simple_strtoul(argv[3], NULL, 16); + + if (fpga_sec_info.authflag >= FPGA_NO_ENC_OR_NO_AUTH && + fpga_sec_info.encflag >= FPGA_NO_ENC_OR_NO_AUTH) { + debug("fpga: Use for NonSecure bitstream\n"); return CMD_RET_USAGE; -#if defined(CONFIG_CMD_FPGA_LOAD_SECURE) - case FPGA_LOADS: - if (argc < 7) - return CMD_RET_USAGE; - if (argc == 8) - fpga_sec_info.userkey_addr = (u8 *)(uintptr_t) - simple_strtoull(argv[7], - NULL, 16); - fpga_sec_info.encflag = (u8)simple_strtoul(argv[6], NULL, 16); - fpga_sec_info.authflag = (u8)simple_strtoul(argv[5], NULL, 16); - - if (fpga_sec_info.authflag >= FPGA_NO_ENC_OR_NO_AUTH && - fpga_sec_info.encflag >= FPGA_NO_ENC_OR_NO_AUTH) { - puts("ERR: Use for NonSecure bitstream\n"); - return CMD_RET_USAGE; - } - - if (fpga_sec_info.encflag == FPGA_ENC_USR_KEY && - !fpga_sec_info.userkey_addr) { - puts("ERR: User key not provided\n"); - return CMD_RET_USAGE; - } - - argc = 5; - break; -#endif - default: - break; } - switch (argc) { - case 5: /* fpga */ - data_size = simple_strtoul(argv[4], NULL, 16); - if (!data_size) { - puts("Zero data_size\n"); - return CMD_RET_USAGE; - } - case 4: /* fpga */ - { - fpga_data = (void *)simple_strtoul(argv[3], NULL, 16); - debug("* fpga: cmdline image address = 0x%08lx\n", - (ulong)fpga_data); - } - debug("%s: fpga_data = 0x%lx\n", __func__, (ulong)fpga_data); - if (!fpga_data) { - puts("Zero fpga_data address\n"); - return CMD_RET_USAGE; - } - case 3: /* fpga */ - dev = (int)simple_strtoul(argv[2], NULL, 16); - debug("%s: device = %d\n", __func__, dev); - } - - if (dev == FPGA_INVALID_DEVICE) { - puts("FPGA device not specified\n"); + if (fpga_sec_info.encflag == FPGA_ENC_USR_KEY && + !fpga_sec_info.userkey_addr) { + debug("fpga: User key not provided\n"); return CMD_RET_USAGE; } - switch (op) { -#if defined(CONFIG_CMD_FPGA_LOAD_SECURE) - case FPGA_LOADS: - rc = fpga_loads(dev, fpga_data, data_size, &fpga_sec_info); - break; -#endif + ret = do_fpga_check_params(&dev, &fpga_data, &data_size, + cmdtp, argc, argv); + if (ret) + return ret; - default: - printf("Unknown operation\n"); - return CMD_RET_USAGE; - } - return rc; + return fpga_loads(dev, (void *)fpga_data, data_size, &fpga_sec_info); } +#endif #if defined(CONFIG_CMD_FPGA_LOADFS) static int do_fpga_loadfs(cmd_tbl_t *cmdtp, int flag, int argc, @@ -450,6 +377,9 @@ static cmd_tbl_t fpga_commands[] = { #if defined(CONFIG_CMD_FPGA_LOADMK) U_BOOT_CMD_MKENT(loadmk, 2, 1, do_fpga_loadmk, "", ""), #endif +#if defined(CONFIG_CMD_FPGA_LOAD_SECURE) + U_BOOT_CMD_MKENT(loads, 6, 1, do_fpga_loads, "", ""), +#endif }; static int do_fpga_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, @@ -463,12 +393,6 @@ static int do_fpga_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, fpga_cmd = find_cmd_tbl(argv[1], fpga_commands, ARRAY_SIZE(fpga_commands)); - - /* This should be removed when all functions are converted */ - if (!fpga_cmd) - return do_fpga(cmdtp, flag, argc, argv); - - /* FIXME This can't be reached till all functions are converted */ if (!fpga_cmd) { debug("fpga: non existing command\n"); return CMD_RET_USAGE; -- cgit v1.2.3