mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-08-20 06:01:26 +02:00
board: turris: Initialize serial# env
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>
This commit is contained in:
parent
8ac3615e8d
commit
7bb9ea47e1
@ -93,30 +93,57 @@ int turris_atsha_otp_init_mac_addresses(int first_idx)
|
|||||||
return 0;
|
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();
|
struct udevice *dev = get_atsha204a_dev();
|
||||||
|
u32 version_num, serial_num;
|
||||||
|
const char *serial_env;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -1;
|
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);
|
ret = atsha204a_wakeup(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
|
ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
|
||||||
TURRIS_ATSHA_OTP_VERSION,
|
TURRIS_ATSHA_OTP_VERSION,
|
||||||
(u8 *)version_num);
|
(u8 *)&version_num);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
|
ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
|
||||||
TURRIS_ATSHA_OTP_SERIAL,
|
TURRIS_ATSHA_OTP_SERIAL,
|
||||||
(u8 *)serial_num);
|
(u8 *)&serial_num);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
atsha204a_sleep(dev);
|
atsha204a_sleep(dev);
|
||||||
|
|
||||||
|
sprintf(serial, "%08X%08X", be32_to_cpu(version_num), be32_to_cpu(serial_num));
|
||||||
|
env_set("serial#", serial);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#define TURRIS_ATSHA_OTP_H
|
#define TURRIS_ATSHA_OTP_H
|
||||||
|
|
||||||
int turris_atsha_otp_init_mac_addresses(int first_idx);
|
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
|
#endif
|
||||||
|
@ -963,19 +963,15 @@ int board_late_init(void)
|
|||||||
|
|
||||||
int show_board_info(void)
|
int show_board_info(void)
|
||||||
{
|
{
|
||||||
u32 version_num, serial_num;
|
char serial[17];
|
||||||
int err;
|
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("Model: Turris Omnia\n");
|
||||||
printf(" MCU type: %s\n", omnia_get_mcu_type());
|
printf(" MCU type: %s\n", omnia_get_mcu_type());
|
||||||
printf(" MCU version: %s\n", omnia_get_mcu_version());
|
printf(" MCU version: %s\n", omnia_get_mcu_version());
|
||||||
printf(" RAM size: %i MiB\n", omnia_get_ram_size_gb() * 1024);
|
printf(" RAM size: %i MiB\n", omnia_get_ram_size_gb() * 1024);
|
||||||
if (err)
|
printf(" Serial Number: %s\n", !err ? serial : "unknown");
|
||||||
printf(" Serial Number: unknown\n");
|
|
||||||
else
|
|
||||||
printf(" Serial Number: %08X%08X\n", be32_to_cpu(version_num),
|
|
||||||
be32_to_cpu(serial_num));
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -983,6 +979,7 @@ int show_board_info(void)
|
|||||||
int misc_init_r(void)
|
int misc_init_r(void)
|
||||||
{
|
{
|
||||||
turris_atsha_otp_init_mac_addresses(1);
|
turris_atsha_otp_init_mac_addresses(1);
|
||||||
|
turris_atsha_otp_init_serial_number();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user