
From: Thomas Herzmann thomas.herzmann@keymile.com
The environment variable (defining a checkboardidlist function) has been replaced by a u-boot function call. This call is much faster and the environment is a leaner.
Signed-off-by: Thomas Herzmann thomas.herzmann@keymile.com Signed-off-by: Holger Brunck holger.brunck@keymile.com Acked-by: Heiko Schocher hs@denx.de cc: Wolfgang Denk wd@denx.de cc: Detlev Zundel dzu@denx.de cc: Valentin Longchamp valentin.longchamp@keymile.com Signed-off-by: Valentin Longchamp valentin.longchamp@keymile.com --- board/keymile/common/common.c | 112 ++++++++++++++++++++++++++++++++++++++ include/configs/keymile-common.h | 30 +---------- 2 files changed, 113 insertions(+), 29 deletions(-)
diff --git a/board/keymile/common/common.c b/board/keymile/common/common.c index 5704b7f..72278a0 100644 --- a/board/keymile/common/common.c +++ b/board/keymile/common/common.c @@ -32,6 +32,7 @@ #include <net.h> #include <netdev.h> #include <asm/io.h> +#include <linux/ctype.h>
#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) #include <libfdt.h> @@ -714,3 +715,114 @@ static int do_setboardid(cmd_tbl_t *cmdtp, int flag, int argc, U_BOOT_CMD(km_setboardid, 1, 0, do_setboardid, "setboardid", "read out bid and " "hwkey from IVM and set in environment");
+/* + * command km_checkboardidlist + * if "boardid" and "hwkey" are not already set in the environment, do: + * if a "boardIdListHex" exists in the environment: + * - read ivm data for boardid and hwkey + * - compare each entry of the boardIdListHex with the + * IVM data: + * if match: + * set environment variables boardid, boardId, + * hwkey, hwKey to the found values + * both (boardid and boardId) are set because + * they might be used differently in the + * application and in the init scripts (?) + * return 0 in case of match, 1 if not match or error + */ +int do_checkboardidlist(cmd_tbl_t *cmdtp, int flag, int argc, + char *const argv[]) +{ + unsigned long ivmbid = 0, ivmhwkey = 0; + unsigned long envbid = 0, envhwkey = 0; + char *p; + int verbose = argc > 1 && *argv[1] == 'v'; + int rc = 1; /* default: no match */ + + p = get_local_var("IVM_BoardId"); + strict_strtoul(p, 16, &ivmbid); + p = get_local_var("IVM_HWKey"); + strict_strtoul(p, 16, &ivmhwkey); + + if (!ivmbid || !ivmhwkey) { + printf("Error: IVM_BoardId and/or IVM_HWKey not set!\n"); + return rc; + } + + /* try to read values from environment */ + p = getenv("boardid"); + if (p != NULL) + strict_strtoul(p, 16, &envbid); + p = getenv("hwkey"); + if (p != NULL) + strict_strtoul(p, 16, &envhwkey); + + if (!envbid || !envhwkey) { + /* must set environment first */ + char *bidhwklist = getenv("boardIdListHex"); + if (bidhwklist) { + int found = 0; + char *rest = bidhwklist; + char *endp; + if (verbose) { + printf("IVM_BoardId: %ld, IVM_HWKey=%ld\n", + ivmbid, ivmhwkey); + printf("boardIdHwKeyList: %s\n", + bidhwklist); + } + while (!found) { + /* loop over each bid/hwkey pair in the list */ + unsigned long bid = 0; + unsigned long hwkey = 0; + while (*rest && !isxdigit(*rest)) + rest++; + bid = simple_strtoul(rest, &endp, 16); + if (*endp == '_') { + rest = endp + 1; + hwkey = simple_strtoul(rest, &endp, 16); + rest = endp; + while (*rest && !isxdigit(*rest)) + rest++; + } + if ((!bid) || (!hwkey)) { + /* end of list */ + break; + } + if (verbose) { + printf("trying bid=0x%lX, hwkey=%ld\n", + bid, hwkey); + } + if ((bid == ivmbid) && (hwkey == ivmhwkey)) { + char buf[10]; + + found = 1; + envbid = bid; + envhwkey = hwkey; + sprintf(buf, "%lx", bid); + setenv("boardid", buf); + sprintf(buf, "%lx", hwkey); + setenv("hwkey", buf); + saveenv(); + } + } /* end while( ! found ) */ + } + } + + /* compare now the values */ + if ((ivmbid == envbid) && (ivmhwkey == envhwkey)) { + printf("boardid=0x%3lX, hwkey=%ld\n", envbid, envhwkey); + rc = 0; + } else { + printf("Error: env bId=0x%3lX, hwKey=%ld\n", envbid, envhwkey); + printf(" IVM bId=0x%3lX, hwKey=%ld\n", ivmbid, ivmhwkey); + } + return rc; +} + +U_BOOT_CMD(km_checkbidhwk, 2, 0, do_checkboardidlist, + "check boardid and hwkey", + "[v]\n - check environment parameter "\ + ""boardIdListHex" against stored boardid and hwkey "\ + "from the IVM\n v: verbose output" +); + diff --git a/include/configs/keymile-common.h b/include/configs/keymile-common.h index 5c32023..a6d3bcf 100644 --- a/include/configs/keymile-common.h +++ b/include/configs/keymile-common.h @@ -240,7 +240,6 @@ "release=" \ "setenv actual_bank ${initial_boot_bank} && " \ "setenv subbootcmds "" \ - "checkboardidlist " \ "checkboardid " \ "ubiattach ubicopy " \ "cramfsloadfdt cramfsloadkernel " \ @@ -391,36 +390,9 @@ "default=" \ "setenv default 'run newenv; reset' && " \ "run release && saveenv; reset\0" \ - "checkboardidlist=" \ - "if test "x${boardIdListHex}" != "x"; then " \ - "IVMbidhwk=${IVM_BoardId}_${IVM_HWKey}; " \ - "found=0; " \ - "for bidhwk in "${boardIdListHex}"; do " \ - "echo trying $bidhwk ...; " \ - "if test "x$bidhwk" = "x$IVMbidhwk"; then " \ - "found=1; " \ - "echo match found for $bidhwk; " \ - "if test "x$bidhwk" != "x${boardId}_${hwKey}";then "\ - "setenv boardid ${IVM_BoardId}; " \ - "setenv boardId ${IVM_BoardId}; " \ - "setenv hwkey ${IVM_HWKey}; " \ - "setenv hwKey ${IVM_HWKey}; " \ - "echo "boardId set to ${boardId}"; " \ - "echo "hwKey set to ${hwKey}"; " \ - "saveenv; " \ - "fi; " \ - "fi; " \ - "done; " \ - "else " \ - "echo "boardIdListHex not set, not checked"; "\ - "found=1; " \ - "fi; " \ - "test "$found" = 1 \0" \ - "checkboardid=" \ - "test "x${boardId}" = "x${IVM_BoardId}" && " \ - "test "x${hwKey}" = "x${IVM_HWKey}"\0" \ "printbootargs=print bootargs\0" \ "rootfsfile="xstr(CONFIG_HOSTNAME) "/rootfsImage\0" \ + "checkboardid=km_checkbidhwk\0" \ ""
#ifndef CONFIG_KM_DEF_ENV