[U-Boot] [PATCH 23/30] km/common: replace env var checkboardidlist by function

Valentin Longchamp
2011-04-08T14:24:13Z

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
--
1.7.0.5