From: "Pali Rohár" <pali@kernel.org>
To: "Marek Behún" <kabel@kernel.org>, "Stefan Roese" <sr@denx.de>
Cc: u-boot@lists.denx.de
Subject: [PATCH] board: turris: Initialize serial# env
Date: Sat, 27 Aug 2022 20:06:30 +0200 [thread overview]
Message-ID: <20220827180630.31933-1-pali@kernel.org> (raw)
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>
---
board/CZ.NIC/turris_atsha_otp.c | 33 +++++++++++++++++++++---
board/CZ.NIC/turris_atsha_otp.h | 3 ++-
board/CZ.NIC/turris_omnia/turris_omnia.c | 11 +++-----
3 files changed, 36 insertions(+), 11 deletions(-)
diff --git a/board/CZ.NIC/turris_atsha_otp.c b/board/CZ.NIC/turris_atsha_otp.c
index aa4e29b1560e..a29fe3623174 100644
--- a/board/CZ.NIC/turris_atsha_otp.c
+++ b/board/CZ.NIC/turris_atsha_otp.c
@@ -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;
}
diff --git a/board/CZ.NIC/turris_atsha_otp.h b/board/CZ.NIC/turris_atsha_otp.h
index bd4308fdc3ef..2cfe20bbc3a7 100644
--- a/board/CZ.NIC/turris_atsha_otp.h
+++ b/board/CZ.NIC/turris_atsha_otp.h
@@ -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
diff --git a/board/CZ.NIC/turris_omnia/turris_omnia.c b/board/CZ.NIC/turris_omnia/turris_omnia.c
index ab5061ef582b..cf8a6026702b 100644
--- a/board/CZ.NIC/turris_omnia/turris_omnia.c
+++ b/board/CZ.NIC/turris_omnia/turris_omnia.c
@@ -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;
}
--
2.20.1
next reply other threads:[~2022-08-27 18:06 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-27 18:06 Pali Rohár [this message]
2022-08-28 3:48 ` [PATCH] board: turris: Initialize serial# env Marek Behún
2022-08-30 12:26 ` Stefan Roese
2022-09-13 6:59 ` Stefan Roese
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220827180630.31933-1-pali@kernel.org \
--to=pali@kernel.org \
--cc=kabel@kernel.org \
--cc=sr@denx.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox