From 10dcdc2135dc9bec980bce435305ce2d718c9fbb Mon Sep 17 00:00:00 2001 From: Igor Opaniuk Date: Wed, 15 Apr 2020 16:09:19 +0300 Subject: toradex: tdx-cfg-clock: add migration routine from PID8 1. Add migration routine from PID8 (including sane value checks) 2. s/extra/carrier/g if functionality is used only for carrier board tdx config block. Signed-off-by: Igor Opaniuk --- board/toradex/common/tdx-cfg-block.c | 103 +++++++++++++++++++++++++++++++---- board/toradex/common/tdx-cfg-block.h | 5 +- board/toradex/common/tdx-common.c | 13 +++-- 3 files changed, 101 insertions(+), 20 deletions(-) diff --git a/board/toradex/common/tdx-cfg-block.c b/board/toradex/common/tdx-cfg-block.c index fe9f2e98c0..ee8ca5d6c2 100644 --- a/board/toradex/common/tdx-cfg-block.c +++ b/board/toradex/common/tdx-cfg-block.c @@ -67,7 +67,7 @@ struct toradex_tag { }; bool valid_cfgblock; -bool valid_cfgblock_extra; +bool valid_cfgblock_carrier; struct toradex_hw tdx_hw_tag; struct toradex_hw tdx_car_hw_tag; struct toradex_eth_addr tdx_eth_addr; @@ -139,7 +139,7 @@ const char * const toradex_prototype_modules[] = { [0] = "Apalis iMX8QXP 2GB ECC Wi / BT IT PROTO" }; -const char * const toradex_carriers[] = { +const char * const toradex_carrier_boards[] = { [0] = "UNKNOWN CARRIER", [155] = "Dahlia", [156] = "Verdin Development Board", @@ -275,7 +275,7 @@ int is_tdx_prototype_prodid(u16 prodid) (prodid < prototype_range_max)); } -int read_tdx_cfg_block_extra(void) +int read_tdx_cfg_block_carrier(void) { int ret = 0; u8 *config_block = NULL; @@ -283,7 +283,7 @@ int read_tdx_cfg_block_extra(void) size_t size = TDX_CFG_BLOCK_EXTRA_MAX_SIZE; int offset; - /* Allocate RAM area for extra config block */ + /* Allocate RAM area for carrier config block */ config_block = memalign(ARCH_DMA_MINALIGN, size); if (!config_block) { printf("Not enough malloc space available!\n"); @@ -300,11 +300,11 @@ int read_tdx_cfg_block_extra(void) /* Expect a valid tag first */ tag = (struct toradex_tag *)config_block; if (tag->flags != TAG_FLAG_VALID || tag->id != TAG_VALID) { - valid_cfgblock_extra = false; + valid_cfgblock_carrier = false; ret = -EINVAL; goto out; } - valid_cfgblock_extra = true; + valid_cfgblock_carrier = true; offset = 4; while (offset + sizeof(struct toradex_tag) + @@ -678,6 +678,85 @@ static int write_tag(u8 *config_block, int *offset, int tag_id, return 0; } +int check_pid8_sanity(char *pid8) +{ + char s_carrierid_verdin[5]; + char s_carrierid_dahlia[5]; + + sprintf(s_carrierid_verdin, "0%d", VERDIN_DEVELOPMENT_BOARD); + sprintf(s_carrierid_dahlia, "0%d", DAHLIA); + + /* sane value check, first 4 chars which represent carrier id */ + if (!strncmp(pid8, s_carrierid_verdin, 4)) + return 0; + + if (!strncmp(pid8, s_carrierid_dahlia, 4)) + return 0; + + return -EINVAL; +} + +int try_migrate_tdx_cfg_block_carrier(void) +{ + char pid8[8]; + int offset = 0; + int ret = CMD_RET_SUCCESS; + size_t size = TDX_CFG_BLOCK_EXTRA_MAX_SIZE; + u8 *config_block; + + memset(pid8, 0x0, 8); + ret = read_tdx_eeprom_data(TDX_EEPROM_ID_CARRIER, 0x0, (u8 *)pid8, 8); + if (ret) + return ret; + + if (check_pid8_sanity(pid8)) { + return -EINVAL; + } + + /* Allocate RAM area for config block */ + config_block = memalign(ARCH_DMA_MINALIGN, size); + if (!config_block) { + printf("Not enough malloc space available!\n"); + return CMD_RET_FAILURE; + } + + memset(config_block, 0xff, size); + /* we try parse PID8 concatenating zeroed serial number */ + tdx_car_hw_tag.ver_major = pid8[4] - '0'; + tdx_car_hw_tag.ver_minor = pid8[5] - '0'; + tdx_car_hw_tag.ver_assembly = pid8[7] - '0'; + + pid8[4] = '\0'; + tdx_car_hw_tag.prodid = simple_strtoul(pid8, NULL, 10); + + /* Valid Tag */ + write_tag(config_block, &offset, TAG_VALID, NULL, 0); + + /* Product Tag */ + write_tag(config_block, &offset, TAG_HW, (u8 *)&tdx_car_hw_tag, + sizeof(tdx_car_hw_tag)); + + /* Serial Tag */ + write_tag(config_block, &offset, TAG_CAR_SERIAL, (u8 *)&tdx_car_serial, + sizeof(tdx_car_serial)); + + memset(config_block + offset, 0, 32 - offset); + ret = write_tdx_eeprom_data(TDX_EEPROM_ID_CARRIER, 0x0, config_block, + size); + if (ret) { + printf("Failed to write Toradex Extra config block: %d\n", + ret); + ret = CMD_RET_FAILURE; + goto out; + } + + printf("Successfully migrated to Toradex Config Block from PID8\n"); + +out: + free(config_block); + return ret; +} + static int get_cfgblock_carrier_interactive(void) { char message[CONFIG_SYS_CBSIZE]; @@ -685,10 +764,10 @@ static int get_cfgblock_carrier_interactive(void) printf("Supported carrier boards: \n"); printf("CARRIER BOARD NAME\t\t [ID] \n"); - for (int i = 0; i < sizeof(toradex_carriers) / - sizeof(toradex_carriers[0]); i++) - if(toradex_carriers[i]) - printf("%s \t\t [%d]\n", toradex_carriers[i], i); + for (int i = 0; i < sizeof(toradex_carrier_boards) / + sizeof(toradex_carrier_boards[0]); i++) + if(toradex_carrier_boards[i]) + printf("%s \t\t [%d]\n", toradex_carrier_boards[i], i); sprintf(message, "Choose your carrier board (provide ID): "); len = cli_readline(message); @@ -736,8 +815,8 @@ static int do_cfgblock_carrier_create(cmd_tbl_t *cmdtp, int flag, int argc, } memset(config_block, 0xff, size); - read_tdx_cfg_block_extra(); - if (valid_cfgblock_extra && !force_overwrite) { + read_tdx_cfg_block_carrier(); + if (valid_cfgblock_carrier && !force_overwrite) { char message[CONFIG_SYS_CBSIZE]; sprintf(message, diff --git a/board/toradex/common/tdx-cfg-block.h b/board/toradex/common/tdx-cfg-block.h index bacfdf83d2..8dd6c6826d 100644 --- a/board/toradex/common/tdx-cfg-block.h +++ b/board/toradex/common/tdx-cfg-block.h @@ -94,7 +94,7 @@ enum { extern const char * const toradex_modules[]; extern const char * const toradex_prototype_modules[]; -extern const char * const toradex_carriers[]; +extern const char * const toradex_carrier_boards[]; extern bool valid_cfgblock; extern struct toradex_hw tdx_hw_tag; extern struct toradex_hw tdx_car_hw_tag; @@ -103,7 +103,8 @@ extern u32 tdx_serial; extern u32 tdx_car_serial; int read_tdx_cfg_block(void); -int read_tdx_cfg_block_extra(void); +int read_tdx_cfg_block_carrier(void); +int try_migrate_tdx_cfg_block_carrier(void); int is_tdx_prototype_prodid(u16 prodid); diff --git a/board/toradex/common/tdx-common.c b/board/toradex/common/tdx-common.c index 3d825774b7..dc87cc4b5a 100644 --- a/board/toradex/common/tdx-common.c +++ b/board/toradex/common/tdx-common.c @@ -72,7 +72,7 @@ int show_board_info(void) { unsigned char ethaddr[6]; char* tdx_module_name; - char* tdx_carrier_name; + char* tdx_carrier_board_name; if (read_tdx_cfg_block()) { printf("MISSING TORADEX CONFIG BLOCK\n"); @@ -101,11 +101,12 @@ int show_board_info(void) tdx_board_rev_str, tdx_serial_str); #ifdef CONFIG_TDX_CFG_BLOCK_EXTRA - if (read_tdx_cfg_block_extra()) { - printf("MISSING TORADEX EXTRA CONFIG BLOCKS\n"); + if (read_tdx_cfg_block_carrier()) { + printf("MISSING TORADEX CARRIER CONFIG BLOCKS\n"); + try_migrate_tdx_cfg_block_carrier(); } else { - tdx_carrier_name = (char *) - toradex_carriers[tdx_car_hw_tag.prodid]; + tdx_carrier_board_name = (char *) + toradex_carrier_boards[tdx_car_hw_tag.prodid]; sprintf(tdx_car_serial_str, "%08u", tdx_car_serial); sprintf(tdx_car_rev_str, "V%1d.%1d%c", @@ -116,7 +117,7 @@ int show_board_info(void) env_set("carrier_serial#", tdx_car_serial_str); printf("Carrier: Toradex %s %s, Serial# %s\n", - tdx_carrier_name, + tdx_carrier_board_name, tdx_car_rev_str, tdx_car_serial_str); } -- cgit v1.2.3