public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: "Pali Rohár" <pali@kernel.org>
To: Stefan Roese <sr@denx.de>, Marek Behun <marek.behun@nic.cz>
Cc: u-boot@lists.denx.de
Subject: [PATCH 1/4] board: turris: Move Turris Atsha OTP code to separate file
Date: Fri,  8 Apr 2022 16:30:12 +0200	[thread overview]
Message-ID: <20220408143015.23163-1-pali@kernel.org> (raw)

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@kernel.org>
---
 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@nic.cz>
+ * Copyright (C) 2016 Tomas Hlavacek <tomas.hlavacek@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@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@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@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;
 }
 
-- 
2.20.1


             reply	other threads:[~2022-04-08 14:32 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-08 14:30 Pali Rohár [this message]
2022-04-08 14:30 ` [PATCH 2/4] board: turris: Do not cache Atsha device in BSS Pali Rohár
2022-04-08 17:45   ` Marek Behún
2022-04-21 14:14   ` Stefan Roese
2022-04-08 14:30 ` [PATCH 3/4] board: turris: Allow to specify first eth idx of first MAC address Pali Rohár
2022-04-08 17:45   ` Marek Behún
2022-04-21 14:15   ` Stefan Roese
2022-04-08 14:30 ` [PATCH 4/4] board: turris: Rename atsha204a@64 DT node to crypto@64 Pali Rohár
2022-04-08 17:46   ` Marek Behún
2022-04-21 14:15   ` Stefan Roese
2022-04-08 17:45 ` [PATCH 1/4] board: turris: Move Turris Atsha OTP code to separate file Marek Behún
2022-04-21 14:14 ` 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=20220408143015.23163-1-pali@kernel.org \
    --to=pali@kernel.org \
    --cc=marek.behun@nic.cz \
    --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