summaryrefslogtreecommitdiff
path: root/board/toradex/common/tdx-cfg-block.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/toradex/common/tdx-cfg-block.c')
-rw-r--r--board/toradex/common/tdx-cfg-block.c158
1 files changed, 130 insertions, 28 deletions
diff --git a/board/toradex/common/tdx-cfg-block.c b/board/toradex/common/tdx-cfg-block.c
index ab23f58973..3e6e204951 100644
--- a/board/toradex/common/tdx-cfg-block.c
+++ b/board/toradex/common/tdx-cfg-block.c
@@ -12,7 +12,6 @@
#if defined(CONFIG_TARGET_APALIS_IMX6) || \
defined(CONFIG_TARGET_APALIS_IMX8) || \
- defined(CONFIG_TARGET_APALIS_IMX8X) || \
defined(CONFIG_TARGET_COLIBRI_IMX6) || \
defined(CONFIG_TARGET_COLIBRI_IMX8X) || \
defined(CONFIG_TARGET_VERDIN_IMX8MM) || \
@@ -144,6 +143,17 @@ const char * const toradex_modules[] = {
[59] = "Verdin iMX8M Mini Quad 2GB IT",
[60] = "Verdin iMX8M Mini DualLite 1GB WB IT",
[61] = "Verdin iMX8M Plus Quad 2GB",
+ [62] = "Colibri iMX6ULL 1GB IT (eMMC)",
+ [63] = "Verdin iMX8M Plus Quad 4GB IT",
+ [64] = "Verdin iMX8M Plus Quad 2GB Wi-Fi / BT IT",
+ [65] = "Verdin iMX8M Plus QuadLite 1GB IT",
+ [66] = "Verdin iMX8M Plus Quad 8GB Wi-Fi / BT",
+ [67] = "Apalis iMX8 QuadMax 8GB Wi-Fi / BT IT",
+ [68] = "Verdin iMX8M Mini Quad 2GB WB IT No CAN",
+ [69] = "UNKNOWN MODULE",
+ [70] = "Verdin iMX8M Plus Quad 8GB WB IT",
+ [86] = "Verdin iMX8M Mini DualLite 2GB IT",
+ [87] = "Verdin iMX8M Mini Quad 2GB IT",
};
const char * const toradex_carrier_boards[] = {
@@ -158,6 +168,42 @@ const char * const toradex_display_adapters[] = {
[159] = "Verdin DSI to LVDS Adapter",
};
+const u32 toradex_ouis[] = {
+ [0] = 0x00142dUL,
+ [1] = 0x8c06cbUL,
+};
+
+static u32 get_serial_from_mac(struct toradex_eth_addr *eth_addr)
+{
+ int i;
+ u32 oui = ntohl(eth_addr->oui) >> 8;
+ u32 nic = ntohl(eth_addr->nic) >> 8;
+
+ for (i = 0; i < ARRAY_SIZE(toradex_ouis); i++) {
+ if (toradex_ouis[i] == oui)
+ break;
+ }
+
+ return (u32)((i << 24) + nic);
+}
+
+void get_mac_from_serial(u32 tdx_serial, struct toradex_eth_addr *eth_addr)
+{
+ u8 oui_index = tdx_serial >> 24;
+ u32 nic = tdx_serial & GENMASK(23, 0);
+ u32 oui;
+
+ if (oui_index >= ARRAY_SIZE(toradex_ouis)) {
+ puts("Can't find OUI for this serial#\n");
+ oui_index = 0;
+ }
+
+ oui = toradex_ouis[oui_index];
+
+ eth_addr->oui = htonl(oui << 8);
+ eth_addr->nic = htonl(nic << 8);
+}
+
#ifdef CONFIG_TDX_CFG_BLOCK_IS_IN_MMC
static int tdx_cfg_block_mmc_storage(u8 *config_block, int write)
{
@@ -330,8 +376,7 @@ int read_tdx_cfg_block(void)
memcpy(&tdx_eth_addr, config_block + offset,
6);
- /* NIC part of MAC address is serial number */
- tdx_serial = ntohl(tdx_eth_addr.nic) >> 8;
+ tdx_serial = get_serial_from_mac(&tdx_eth_addr);
break;
case TAG_HW:
memcpy(&tdx_hw_tag, config_block + offset, 8);
@@ -353,13 +398,28 @@ 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];
char *soc;
char it = 'n';
char wb = 'n';
+ char mem8g = 'n';
+ char can = 'y';
int len = 0;
+ int ret = 0;
/* Unknown module by default */
tdx_hw_tag.prodid = 0;
@@ -373,7 +433,6 @@ static int get_cfgblock_interactive(void)
it = console_buffer[0];
#if defined(CONFIG_TARGET_APALIS_IMX8) || \
- defined(CONFIG_TARGET_APALIS_IMX8X) || \
defined(CONFIG_TARGET_COLIBRI_IMX6ULL) || \
defined(CONFIG_TARGET_COLIBRI_IMX8X) || \
defined(CONFIG_TARGET_VERDIN_IMX8MM) || \
@@ -381,6 +440,21 @@ static int get_cfgblock_interactive(void)
sprintf(message, "Does the module have Wi-Fi / Bluetooth? [y/N] ");
len = cli_readline(message);
wb = console_buffer[0];
+
+#if defined(CONFIG_TARGET_APALIS_IMX8)
+ if ((wb == 'y' || wb == 'Y') && (it == 'y' || it == 'Y')) {
+ sprintf(message, "Does your module have 8GB of RAM? [y/N] ");
+ len = cli_readline(message);
+ mem8g = console_buffer[0];
+ }
+#endif
+#if defined(CONFIG_TARGET_VERDIN_IMX8MM)
+ if (is_cpu_type(MXC_CPU_IMX8MM) && (wb == 'y' || wb == 'Y')) {
+ sprintf(message, "Does your module have CAN? [y/N] ");
+ len = cli_readline(message);
+ can = console_buffer[0];
+ }
+#endif
#endif
soc = env_get("soc");
@@ -414,7 +488,10 @@ static int get_cfgblock_interactive(void)
if (wb == 'y' || wb == 'Y')
tdx_hw_tag.prodid = COLIBRI_IMX6ULL_WIFI_BT_IT;
else
- tdx_hw_tag.prodid = COLIBRI_IMX6ULL_IT;
+ if (gd->ram_size == 0x20000000)
+ tdx_hw_tag.prodid = COLIBRI_IMX6ULL_IT;
+ else
+ tdx_hw_tag.prodid = COLIBRI_IMX6ULL_IT_EMMC;
} else {
if (wb == 'y' || wb == 'Y')
tdx_hw_tag.prodid = COLIBRI_IMX6ULL_WIFI_BT;
@@ -423,13 +500,20 @@ static int get_cfgblock_interactive(void)
}
#endif
} else if (!strcmp("imx7d", soc))
- tdx_hw_tag.prodid = COLIBRI_IMX7D;
+ if (gd->ram_size == 0x20000000)
+ tdx_hw_tag.prodid = COLIBRI_IMX7D;
+ else
+ tdx_hw_tag.prodid = COLIBRI_IMX7D_EMMC;
else if (!strcmp("imx7s", soc))
tdx_hw_tag.prodid = COLIBRI_IMX7S;
else if (is_cpu_type(MXC_CPU_IMX8QM)) {
if (it == 'y' || it == 'Y') {
- if (wb == 'y' || wb == 'Y')
- tdx_hw_tag.prodid = APALIS_IMX8QM_WIFI_BT_IT;
+ if (wb == 'y' || wb == 'Y') {
+ if (mem8g == 'y' || mem8g == 'Y')
+ tdx_hw_tag.prodid = APALIS_IMX8QM_8GB_WIFI_BT_IT;
+ else
+ tdx_hw_tag.prodid = APALIS_IMX8QM_WIFI_BT_IT;
+ }
else
tdx_hw_tag.prodid = APALIS_IMX8QM_IT;
} else {
@@ -439,16 +523,7 @@ static int get_cfgblock_interactive(void)
tdx_hw_tag.prodid = APALIS_IMX8QP;
}
} else if (is_cpu_type(MXC_CPU_IMX8QXP)) {
-#ifdef CONFIG_TARGET_APALIS_IMX8X
- if (it == 'y' || it == 'Y' || wb == 'y' || wb == 'Y') {
- tdx_hw_tag.prodid = APALIS_IMX8QXP_WIFI_BT_IT;
- } else {
- if (gd->ram_size == 0x40000000)
- tdx_hw_tag.prodid = APALIS_IMX8DXP;
- else
- tdx_hw_tag.prodid = APALIS_IMX8QXP;
- }
-#elif CONFIG_TARGET_COLIBRI_IMX8X
+#ifdef CONFIG_TARGET_COLIBRI_IMX8X
if (it == 'y' || it == 'Y') {
if (wb == 'y' || wb == 'Y')
tdx_hw_tag.prodid = COLIBRI_IMX8QXP_WIFI_BT_IT;
@@ -467,17 +542,32 @@ static int get_cfgblock_interactive(void)
else
tdx_hw_tag.prodid = VERDIN_IMX8MMDL;
} else if (is_cpu_type(MXC_CPU_IMX8MM)) {
- if (wb == 'y' || wb == 'Y')
+ if (can == 'n' || can == 'N')
+ tdx_hw_tag.prodid = VERDIN_IMX8MMQ_WIFI_BT_IT_NO_CAN;
+ else if (wb == 'y' || wb == 'Y')
tdx_hw_tag.prodid = VERDIN_IMX8MMQ_WIFI_BT_IT;
else
tdx_hw_tag.prodid = VERDIN_IMX8MMQ_IT;
} else if (is_cpu_type(MXC_CPU_IMX8MN)) {
tdx_hw_tag.prodid = VERDIN_IMX8MNQ_WIFI_BT;
+ } else if (is_cpu_type(MXC_CPU_IMX8MPL)) {
+ tdx_hw_tag.prodid = VERDIN_IMX8MPQL_IT;
} else if (is_cpu_type(MXC_CPU_IMX8MP)) {
if (wb == 'y' || wb == 'Y')
- tdx_hw_tag.prodid = VERDIN_IMX8MPQ_WIFI_BT_IT;
+ if (gd->ram_size == 0x80000000)
+ tdx_hw_tag.prodid = VERDIN_IMX8MPQ_2GB_WIFI_BT_IT;
+ else if (gd->ram_size == 0x200000000)
+ if (it == 'y' || it == 'Y')
+ tdx_hw_tag.prodid = VERDIN_IMX8MPQ_8GB_WIFI_BT_IT;
+ else
+ tdx_hw_tag.prodid = VERDIN_IMX8MPQ_8GB_WIFI_BT;
+ else
+ tdx_hw_tag.prodid = VERDIN_IMX8MPQ_WIFI_BT_IT;
else
- tdx_hw_tag.prodid = VERDIN_IMX8MPQ;
+ if (it == 'y' || it == 'Y')
+ tdx_hw_tag.prodid = VERDIN_IMX8MPQ_IT;
+ else
+ tdx_hw_tag.prodid = VERDIN_IMX8MPQ;
} else if (!strcmp("tegra20", soc)) {
if (it == 'y' || it == 'Y')
if (gd->ram_size == 0x10000000)
@@ -533,13 +623,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 -
@@ -558,6 +653,8 @@ static int get_cfgblock_interactive(void)
static int get_cfgblock_barcode(char *barcode, struct toradex_hw *tag,
u32 *serial)
{
+ char revision[3] = {barcode[6], barcode[7], '\0'};
+
if (strlen(barcode) < 16) {
printf("Argument too short, barcode is 16 chars long\n");
return -1;
@@ -566,7 +663,7 @@ static int get_cfgblock_barcode(char *barcode, struct toradex_hw *tag,
/* Get hardware information from the first 8 digits */
tag->ver_major = barcode[4] - '0';
tag->ver_minor = barcode[5] - '0';
- tag->ver_assembly = barcode[7] - '0';
+ tag->ver_assembly = simple_strtoul(revision, NULL, 10);
barcode[4] = '\0';
tag->prodid = simple_strtoul(barcode, NULL, 10);
@@ -744,6 +841,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");
@@ -757,13 +855,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: ");
@@ -940,8 +1043,7 @@ static int do_cfgblock_create(cmd_tbl_t *cmdtp, int flag, int argc,
}
/* Convert serial number to MAC address (the storage format) */
- tdx_eth_addr.oui = htonl(0x00142dUL << 8);
- tdx_eth_addr.nic = htonl(tdx_serial << 8);
+ get_mac_from_serial(tdx_serial, &tdx_eth_addr);
/* Valid Tag */
write_tag(config_block, &offset, TAG_VALID, NULL, 0);