board: turris: Initialize serial# env
authorPali Rohár <pali@kernel.org>
Sat, 27 Aug 2022 18:06:30 +0000 (20:06 +0200)
committerStefan Roese <sr@denx.de>
Tue, 13 Sep 2022 04:38:08 +0000 (06:38 +0200)
Store serial number from atsha cryptochip into the serial# env variable.
U-Boot automatically puts content of this variable into the root device
tree property serial-number when booting Linux kernel. Refactor turris
atsha code and from turris_atsha_otp_get_serial_number() function returns
directly string suitable for printing or storing into device tree. Because
during different boot stages is env storage read-only, it is not possible
to always store serial number into env storage. So introduce a new function
turris_atsha_otp_init_serial_number() which is called at later stage and
which ensures that serial number is correctly stored into env.

Signed-off-by: Pali Rohár <pali@kernel.org>
Reviewed-by: Marek Behún <kabel@kernel.org>
Reviewed-by: Stefan Roese <sr@denx.de>
board/CZ.NIC/turris_atsha_otp.c
board/CZ.NIC/turris_atsha_otp.h
board/CZ.NIC/turris_omnia/turris_omnia.c

index aa4e29b..a29fe36 100644 (file)
@@ -93,30 +93,57 @@ int turris_atsha_otp_init_mac_addresses(int first_idx)
        return 0;
 }
 
-int turris_atsha_otp_get_serial_number(u32 *version_num, u32 *serial_num)
+int turris_atsha_otp_init_serial_number(void)
+{
+       char serial[17];
+       int ret;
+
+       ret = turris_atsha_otp_get_serial_number(serial);
+       if (ret)
+               return ret;
+
+       if (!env_get("serial#"))
+               return -1;
+
+       return 0;
+}
+
+int turris_atsha_otp_get_serial_number(char serial[17])
 {
        struct udevice *dev = get_atsha204a_dev();
+       u32 version_num, serial_num;
+       const char *serial_env;
        int ret;
 
        if (!dev)
                return -1;
 
+       serial_env = env_get("serial#");
+       if (serial_env && strlen(serial_env) == 16) {
+               memcpy(serial, serial_env, 17);
+               return 0;
+       }
+
        ret = atsha204a_wakeup(dev);
        if (ret)
                return ret;
 
        ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
                             TURRIS_ATSHA_OTP_VERSION,
-                            (u8 *)version_num);
+                            (u8 *)&version_num);
        if (ret)
                return ret;
 
        ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
                             TURRIS_ATSHA_OTP_SERIAL,
-                            (u8 *)serial_num);
+                            (u8 *)&serial_num);
        if (ret)
                return ret;
 
        atsha204a_sleep(dev);
+
+       sprintf(serial, "%08X%08X", be32_to_cpu(version_num), be32_to_cpu(serial_num));
+       env_set("serial#", serial);
+
        return 0;
 }
index bd4308f..2cfe20b 100644 (file)
@@ -4,6 +4,7 @@
 #define TURRIS_ATSHA_OTP_H
 
 int turris_atsha_otp_init_mac_addresses(int first_idx);
-int turris_atsha_otp_get_serial_number(u32 *version_num, u32 *serial_num);
+int turris_atsha_otp_init_serial_number(void);
+int turris_atsha_otp_get_serial_number(char serial[17]);
 
 #endif
index ab5061e..cf8a602 100644 (file)
@@ -963,19 +963,15 @@ int board_late_init(void)
 
 int show_board_info(void)
 {
-       u32 version_num, serial_num;
+       char serial[17];
        int err;
 
-       err = turris_atsha_otp_get_serial_number(&version_num, &serial_num);
+       err = turris_atsha_otp_get_serial_number(serial);
        printf("Model: Turris Omnia\n");
        printf("  MCU type: %s\n", omnia_get_mcu_type());
        printf("  MCU version: %s\n", omnia_get_mcu_version());
        printf("  RAM size: %i MiB\n", omnia_get_ram_size_gb() * 1024);
-       if (err)
-               printf("  Serial Number: unknown\n");
-       else
-               printf("  Serial Number: %08X%08X\n", be32_to_cpu(version_num),
-                      be32_to_cpu(serial_num));
+       printf("  Serial Number: %s\n", !err ? serial : "unknown");
 
        return 0;
 }
@@ -983,6 +979,7 @@ int show_board_info(void)
 int misc_init_r(void)
 {
        turris_atsha_otp_init_mac_addresses(1);
+       turris_atsha_otp_init_serial_number();
        return 0;
 }