summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Opaniuk <igor.opaniuk@toradex.com>2020-04-15 16:09:19 +0300
committerIgor Opaniuk <igor.opaniuk@toradex.com>2020-05-05 12:09:18 +0300
commit10dcdc2135dc9bec980bce435305ce2d718c9fbb (patch)
tree5a31f7bcc7a397dfd179f56ca06c1ecf6083edc8
parente97dadb6d015e7adf796549ad0bd0b7d9d4f9a69 (diff)
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 <igor.opaniuk@toradex.com>
-rw-r--r--board/toradex/common/tdx-cfg-block.c103
-rw-r--r--board/toradex/common/tdx-cfg-block.h5
-rw-r--r--board/toradex/common/tdx-common.c13
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);
}