[PATCH 1/4] board: turris: Move Turris Atsha OTP code to separate file
Stefan Roese
sr at denx.de
Thu Apr 21 16:14:16 CEST 2022
On 4/8/22 16:30, Pali Rohár wrote:
> OTP code is not Atsha generic but also it is not Omnia specific. It is
> common for all Turris routers which use Atsha cryptochip for storing OTP.
> So move this common Turris specific Atsha OTP code from Turris Omnia into
> separate file. It will be used also by other Turris routers.
>
> Signed-off-by: Pali Rohár <pali at kernel.org>
Applied to u-boot-marvell/master
Thanks,
Stefan
> ---
> board/CZ.NIC/turris_atsha_otp.c | 121 +++++++++++++++++++++++
> board/CZ.NIC/turris_atsha_otp.h | 9 ++
> board/CZ.NIC/turris_omnia/Makefile | 2 +-
> board/CZ.NIC/turris_omnia/turris_omnia.c | 108 +-------------------
> 4 files changed, 135 insertions(+), 105 deletions(-)
> create mode 100644 board/CZ.NIC/turris_atsha_otp.c
> create mode 100644 board/CZ.NIC/turris_atsha_otp.h
>
> diff --git a/board/CZ.NIC/turris_atsha_otp.c b/board/CZ.NIC/turris_atsha_otp.c
> new file mode 100644
> index 000000000000..a4a77c74fb19
> --- /dev/null
> +++ b/board/CZ.NIC/turris_atsha_otp.c
> @@ -0,0 +1,121 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2017 Marek Behun <marek.behun at nic.cz>
> + * Copyright (C) 2016 Tomas Hlavacek <tomas.hlavacek at nic.cz>
> + */
> +
> +#include <env.h>
> +#include <net.h>
> +#include <dm/uclass.h>
> +#include <atsha204a-i2c.h>
> +
> +#include "turris_atsha_otp.h"
> +
> +#define TURRIS_ATSHA_OTP_VERSION 0
> +#define TURRIS_ATSHA_OTP_SERIAL 1
> +#define TURRIS_ATSHA_OTP_MAC0 3
> +#define TURRIS_ATSHA_OTP_MAC1 4
> +
> +static struct udevice *get_atsha204a_dev(void)
> +{
> + static struct udevice *dev;
> +
> + if (dev)
> + return dev;
> +
> + if (uclass_get_device_by_name(UCLASS_MISC, "atsha204a at 64", &dev)) {
> + puts("Cannot find ATSHA204A on I2C bus!\n");
> + dev = NULL;
> + }
> +
> + return dev;
> +}
> +
> +static void increment_mac(u8 *mac)
> +{
> + int i;
> +
> + for (i = 5; i >= 3; i--) {
> + mac[i] += 1;
> + if (mac[i])
> + break;
> + }
> +}
> +
> +static void set_mac_if_invalid(int i, u8 *mac)
> +{
> + u8 oldmac[6];
> +
> + if (is_valid_ethaddr(mac) &&
> + !eth_env_get_enetaddr_by_index("eth", i, oldmac))
> + eth_env_set_enetaddr_by_index("eth", i, mac);
> +}
> +
> +int turris_atsha_otp_init_mac_addresses(void)
> +{
> + struct udevice *dev = get_atsha204a_dev();
> + u8 mac0[4], mac1[4], mac[6];
> + int ret;
> +
> + if (!dev)
> + return -1;
> +
> + ret = atsha204a_wakeup(dev);
> + if (ret)
> + return ret;
> +
> + ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
> + TURRIS_ATSHA_OTP_MAC0, mac0);
> + if (ret)
> + return ret;
> +
> + ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
> + TURRIS_ATSHA_OTP_MAC1, mac1);
> + if (ret)
> + return ret;
> +
> + atsha204a_sleep(dev);
> +
> + mac[0] = mac0[1];
> + mac[1] = mac0[2];
> + mac[2] = mac0[3];
> + mac[3] = mac1[1];
> + mac[4] = mac1[2];
> + mac[5] = mac1[3];
> +
> + set_mac_if_invalid(1, mac);
> + increment_mac(mac);
> + set_mac_if_invalid(2, mac);
> + increment_mac(mac);
> + set_mac_if_invalid(0, mac);
> +
> + return 0;
> +}
> +
> +int turris_atsha_otp_get_serial_number(u32 *version_num, u32 *serial_num)
> +{
> + struct udevice *dev = get_atsha204a_dev();
> + int ret;
> +
> + if (!dev)
> + return -1;
> +
> + ret = atsha204a_wakeup(dev);
> + if (ret)
> + return ret;
> +
> + ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
> + TURRIS_ATSHA_OTP_VERSION,
> + (u8 *)version_num);
> + if (ret)
> + return ret;
> +
> + ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
> + TURRIS_ATSHA_OTP_SERIAL,
> + (u8 *)serial_num);
> + if (ret)
> + return ret;
> +
> + atsha204a_sleep(dev);
> + return 0;
> +}
> diff --git a/board/CZ.NIC/turris_atsha_otp.h b/board/CZ.NIC/turris_atsha_otp.h
> new file mode 100644
> index 000000000000..667d01af7310
> --- /dev/null
> +++ b/board/CZ.NIC/turris_atsha_otp.h
> @@ -0,0 +1,9 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +
> +#ifndef TURRIS_ATSHA_OTP_H
> +#define TURRIS_ATSHA_OTP_H
> +
> +int turris_atsha_otp_init_mac_addresses(void);
> +int turris_atsha_otp_get_serial_number(u32 *version_num, u32 *serial_num);
> +
> +#endif
> diff --git a/board/CZ.NIC/turris_omnia/Makefile b/board/CZ.NIC/turris_omnia/Makefile
> index ccdf6c352cad..b79555ab4673 100644
> --- a/board/CZ.NIC/turris_omnia/Makefile
> +++ b/board/CZ.NIC/turris_omnia/Makefile
> @@ -2,4 +2,4 @@
> #
> # Copyright (C) 2017 Marek Behun <marek.behun at nic.cz>
>
> -obj-y := turris_omnia.o
> +obj-y := turris_omnia.o ../turris_atsha_otp.o
> diff --git a/board/CZ.NIC/turris_omnia/turris_omnia.c b/board/CZ.NIC/turris_omnia/turris_omnia.c
> index 33cec6587e19..719e8750e60a 100644
> --- a/board/CZ.NIC/turris_omnia/turris_omnia.c
> +++ b/board/CZ.NIC/turris_omnia/turris_omnia.c
> @@ -14,8 +14,6 @@
> #include <log.h>
> #include <miiphy.h>
> #include <mtd.h>
> -#include <net.h>
> -#include <netdev.h>
> #include <asm/global_data.h>
> #include <asm/io.h>
> #include <asm/arch/cpu.h>
> @@ -25,10 +23,10 @@
> #include <time.h>
> #include <linux/bitops.h>
> #include <u-boot/crc.h>
> -# include <atsha204a-i2c.h>
>
> #include "../drivers/ddr/marvell/a38x/ddr3_init.h"
> #include <../serdes/a38x/high_speed_env_spec.h>
> +#include "../turris_atsha_otp.h"
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -71,11 +69,6 @@ enum status_word_bits {
> MSATA_IND_STSBIT = 0x0020,
> };
>
> -#define OMNIA_ATSHA204_OTP_VERSION 0
> -#define OMNIA_ATSHA204_OTP_SERIAL 1
> -#define OMNIA_ATSHA204_OTP_MAC0 3
> -#define OMNIA_ATSHA204_OTP_MAC1 4
> -
> /*
> * Those values and defines are taken from the Marvell U-Boot version
> * "u-boot-2013.01-2014_T3.0"
> @@ -594,49 +587,12 @@ int board_late_init(void)
> return 0;
> }
>
> -static struct udevice *get_atsha204a_dev(void)
> -{
> - static struct udevice *dev;
> -
> - if (dev)
> - return dev;
> -
> - if (uclass_get_device_by_name(UCLASS_MISC, "atsha204a at 64", &dev)) {
> - puts("Cannot find ATSHA204A on I2C bus!\n");
> - dev = NULL;
> - }
> -
> - return dev;
> -}
> -
> int show_board_info(void)
> {
> u32 version_num, serial_num;
> - int err = 1;
> -
> - struct udevice *dev = get_atsha204a_dev();
> -
> - if (dev) {
> - err = atsha204a_wakeup(dev);
> - if (err)
> - goto out;
> -
> - err = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
> - OMNIA_ATSHA204_OTP_VERSION,
> - (u8 *)&version_num);
> - if (err)
> - goto out;
> -
> - err = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
> - OMNIA_ATSHA204_OTP_SERIAL,
> - (u8 *)&serial_num);
> - if (err)
> - goto out;
> -
> - atsha204a_sleep(dev);
> - }
> + int err;
>
> -out:
> + err = turris_atsha_otp_get_serial_number(&version_num, &serial_num);
> printf("Model: Turris Omnia\n");
> printf(" RAM size: %i MiB\n", omnia_get_ram_size_gb() * 1024);
> if (err)
> @@ -648,65 +604,9 @@ out:
> return 0;
> }
>
> -static void increment_mac(u8 *mac)
> -{
> - int i;
> -
> - for (i = 5; i >= 3; i--) {
> - mac[i] += 1;
> - if (mac[i])
> - break;
> - }
> -}
> -
> -static void set_mac_if_invalid(int i, u8 *mac)
> -{
> - u8 oldmac[6];
> -
> - if (is_valid_ethaddr(mac) &&
> - !eth_env_get_enetaddr_by_index("eth", i, oldmac))
> - eth_env_set_enetaddr_by_index("eth", i, mac);
> -}
> -
> int misc_init_r(void)
> {
> - int err;
> - struct udevice *dev = get_atsha204a_dev();
> - u8 mac0[4], mac1[4], mac[6];
> -
> - if (!dev)
> - goto out;
> -
> - err = atsha204a_wakeup(dev);
> - if (err)
> - goto out;
> -
> - err = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
> - OMNIA_ATSHA204_OTP_MAC0, mac0);
> - if (err)
> - goto out;
> -
> - err = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
> - OMNIA_ATSHA204_OTP_MAC1, mac1);
> - if (err)
> - goto out;
> -
> - atsha204a_sleep(dev);
> -
> - mac[0] = mac0[1];
> - mac[1] = mac0[2];
> - mac[2] = mac0[3];
> - mac[3] = mac1[1];
> - mac[4] = mac1[2];
> - mac[5] = mac1[3];
> -
> - set_mac_if_invalid(1, mac);
> - increment_mac(mac);
> - set_mac_if_invalid(2, mac);
> - increment_mac(mac);
> - set_mac_if_invalid(0, mac);
> -
> -out:
> + turris_atsha_otp_init_mac_addresses();
> return 0;
> }
>
Viele Grüße,
Stefan Roese
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de
More information about the U-Boot
mailing list