toradex: tdx-cfg-block: add new toradex oui range
authorPhilippe Schenker <philippe.schenker@toradex.com>
Mon, 20 Jun 2022 14:57:45 +0000 (16:57 +0200)
committerTom Rini <trini@konsulko.com>
Wed, 6 Jul 2022 18:30:51 +0000 (14:30 -0400)
Add new Toradex MAC OUI (8c:06:cb), to the config block. With this change
we extend the possible serial-numbers as follows:

For serial-numbers 00000000-16777215 OUI 00:14:2d is taken
For serial-numbers 16777216-33554431 OUI 8c:06:cb is taken

Lower 24-bit of the serial number are used in the NIC part of the
MAC address, the complete serial number can be calculated using the OUI.

Signed-off-by: Philippe Schenker <philippe.schenker@toradex.com>
Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com>
Reviewed-by: Fabio Estevam <festevam@denx.de>
Acked-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
board/toradex/common/tdx-cfg-block.c
board/toradex/common/tdx-cfg-block.h
board/toradex/common/tdx-common.c

index 678d4e07c210832076d64d12c31281c14b93ce8c..9305709a3c0dc12aebdcbde702772d008e41ffc6 100644 (file)
@@ -159,6 +159,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)
 {
@@ -331,8 +367,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);
@@ -974,8 +1009,7 @@ static int do_cfgblock_create(struct cmd_tbl *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);
index 43e662e41da250a14bc046a948e7e82df80bdc7f..179069848639d88fbdf6a417d3f865dafc3b4462 100644 (file)
@@ -114,4 +114,6 @@ int read_tdx_cfg_block_carrier(void);
 
 int try_migrate_tdx_cfg_block_carrier(void);
 
+void get_mac_from_serial(u32 tdx_serial, struct toradex_eth_addr *eth_addr);
+
 #endif /* _TDX_CFG_BLOCK_H */
index 5ad5d00a0d907035a6e61de478a1eaf2b02eb3d9..3798bf95378e5acd3aff82a29cc700ec1c9fbd6a 100644 (file)
@@ -20,8 +20,6 @@
 #include <asm/setup.h>
 #include "tdx-common.h"
 
-#define TORADEX_OUI 0x00142dUL
-
 #define SERIAL_STR_LEN 8
 #define MODULE_VER_STR_LEN 4 // V1.1
 #define MODULE_REV_STR_LEN 3 // [A-Z] or #[26-99]
@@ -104,8 +102,7 @@ int show_board_info(void)
 
        if (read_tdx_cfg_block()) {
                printf("MISSING TORADEX CONFIG BLOCK\n");
-               tdx_eth_addr.oui = htonl(TORADEX_OUI << 8);
-               tdx_eth_addr.nic = htonl(tdx_serial << 8);
+               get_mac_from_serial(tdx_serial, &tdx_eth_addr);
                checkboard();
        } else {
                snprintf(tdx_serial_str, sizeof(tdx_serial_str),