diff options
author | Philippe Schenker <philippe.schenker@toradex.com> | 2022-06-03 16:09:14 +0200 |
---|---|---|
committer | Philippe Schenker <philippe.schenker@toradex.com> | 2022-06-14 10:35:16 +0200 |
commit | 3a3cfe7970e92db0aa7ee7f8a6c5977c6cdc4bce (patch) | |
tree | eb1930388280cf2ffb6a0ec27f1687048d2e5122 | |
parent | cc59807f744f4c63f1edb9e51a1c2a75f3e53cd8 (diff) |
toradex: tdx-cfg-block: extend assembly version
[ backport https://lists.denx.de/pipermail/u-boot/2022-June/486350.html ]
There are two decimal digits reserved to encode the module version and
revision. This code so far implemented A-Z which used 0-25 of this
range.
This commit extends the range to make use of all 99 numbers. After
capital letters the form with a hashtag and number (e.g. #26) is used.
Examples:
If the assembly version is between zero and 25 the numbering is as follows,
as it also has been before this commit:
0: V0.0A
1: V0.0B
...
25: V0.0Z
New numbering of assembly version:
If the number is between 26 and 99 the new assembly version name is:
26: V0.0#26
27: V0.0#27
...
99: V0.0#99
Signed-off-by: Philippe Schenker <philippe.schenker@toradex.com>
[ps: backport: replace dectoul() with simple_strtoul()]
-rw-r--r-- | board/toradex/common/tdx-cfg-block.c | 32 | ||||
-rw-r--r-- | board/toradex/common/tdx-common.c | 25 |
2 files changed, 48 insertions, 9 deletions
diff --git a/board/toradex/common/tdx-cfg-block.c b/board/toradex/common/tdx-cfg-block.c index b125d4b35a9..56c4ac981a0 100644 --- a/board/toradex/common/tdx-cfg-block.c +++ b/board/toradex/common/tdx-cfg-block.c @@ -358,6 +358,18 @@ out: return ret; } +static int parse_assembly_string(char *string_to_parse, u16 *assembly) +{ + if (string_to_parse[3] >= 'A' && string_to_parse[3] <= 'Z') + *assembly = string_to_parse[3] - 'A'; + else if (string_to_parse[3] == '#') + *assembly = simple_strtoul(&string_to_parse[4], NULL, 10); + else + return -EINVAL; + + return 0; +} + static int get_cfgblock_interactive(void) { char message[CONFIG_SYS_CBSIZE]; @@ -366,6 +378,7 @@ static int get_cfgblock_interactive(void) char wb = 'n'; char mem8g = 'n'; int len = 0; + int ret = 0; /* Unknown module by default */ tdx_hw_tag.prodid = 0; @@ -557,13 +570,18 @@ static int get_cfgblock_interactive(void) } while (len < 4) { - sprintf(message, "Enter the module version (e.g. V1.1B): V"); + sprintf(message, "Enter the module version (e.g. V1.1B or V1.1#26): V"); len = cli_readline(message); } tdx_hw_tag.ver_major = console_buffer[0] - '0'; tdx_hw_tag.ver_minor = console_buffer[2] - '0'; - tdx_hw_tag.ver_assembly = console_buffer[3] - 'A'; + + ret = parse_assembly_string(console_buffer, &tdx_hw_tag.ver_assembly); + if (ret) { + printf("Parsing module version failed\n"); + return ret; + } if (cpu_is_pxa27x() && tdx_hw_tag.ver_major == 1) tdx_hw_tag.prodid -= (COLIBRI_PXA270_312MHZ - @@ -770,6 +788,7 @@ static int get_cfgblock_carrier_interactive(void) { char message[CONFIG_SYS_CBSIZE]; int len; + int ret = 0; printf("Supported carrier boards:\n"); printf("CARRIER BOARD NAME\t\t [ID]\n"); @@ -783,13 +802,18 @@ static int get_cfgblock_carrier_interactive(void) tdx_car_hw_tag.prodid = simple_strtoul(console_buffer, NULL, 10); do { - sprintf(message, "Enter carrier board version (e.g. V1.1B): V"); + sprintf(message, "Enter carrier board version (e.g. V1.1B or V1.1#26): V"); len = cli_readline(message); } while (len < 4); tdx_car_hw_tag.ver_major = console_buffer[0] - '0'; tdx_car_hw_tag.ver_minor = console_buffer[2] - '0'; - tdx_car_hw_tag.ver_assembly = console_buffer[3] - 'A'; + + ret = parse_assembly_string(console_buffer, &tdx_car_hw_tag.ver_assembly); + if (ret) { + printf("Parsing module version failed\n"); + return ret; + } while (len < 8) { sprintf(message, "Enter carrier board serial number: "); diff --git a/board/toradex/common/tdx-common.c b/board/toradex/common/tdx-common.c index 8f099723e58..a6a3cace033 100644 --- a/board/toradex/common/tdx-common.c +++ b/board/toradex/common/tdx-common.c @@ -16,7 +16,7 @@ #define SERIAL_STR_LEN 8 #define MODULE_VER_STR_LEN 4 // V1.1 -#define MODULE_REV_STR_LEN 1 // [A-Z] +#define MODULE_REV_STR_LEN 3 // [A-Z] or #[26-99] #ifdef CONFIG_TDX_CFG_BLOCK static char tdx_serial_str[SERIAL_STR_LEN + 1]; @@ -75,6 +75,21 @@ void get_board_serial(struct tag_serialnr *serialnr) } #endif /* CONFIG_SERIAL_TAG */ +static const char *get_board_assembly(u16 ver_assembly) +{ + static char ver_name[MODULE_REV_STR_LEN + 1]; + + if (ver_assembly < 26) { + ver_name[0] = (char)ver_assembly + 'A'; + ver_name[1] = '\0'; + } else { + snprintf(ver_name, sizeof(ver_name), + "#%u", ver_assembly); + } + + return ver_name; +} + int show_board_info(void) { unsigned char ethaddr[6]; @@ -88,10 +103,10 @@ int show_board_info(void) snprintf(tdx_serial_str, sizeof(tdx_serial_str), "%08u", tdx_serial); snprintf(tdx_board_rev_str, sizeof(tdx_board_rev_str), - "V%1d.%1d%c", + "V%1d.%1d%s", tdx_hw_tag.ver_major, tdx_hw_tag.ver_minor, - (char)tdx_hw_tag.ver_assembly + 'A'); + get_board_assembly(tdx_hw_tag.ver_assembly)); env_set("serial#", tdx_serial_str); @@ -110,10 +125,10 @@ int show_board_info(void) snprintf(tdx_car_serial_str, sizeof(tdx_car_serial_str), "%08u", tdx_car_serial); snprintf(tdx_car_rev_str, sizeof(tdx_car_rev_str), - "V%1d.%1d%c", + "V%1d.%1d%s", tdx_car_hw_tag.ver_major, tdx_car_hw_tag.ver_minor, - (char)tdx_car_hw_tag.ver_assembly + 'A'); + get_board_assembly(tdx_car_hw_tag.ver_assembly)); env_set("carrier_serial#", tdx_car_serial_str); printf("Carrier: Toradex %s %s, Serial# %s\n", |