public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Rohan Garg <rohan.garg@collabora.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 1/3] rockchip: rk3399: derive ethaddr from cpuid
Date: Fri, 12 Jul 2019 16:22:26 +0200	[thread overview]
Message-ID: <20190712142228.13201-1-rohan.garg@collabora.com> (raw)

Generate a MAC address based on the cpuid available in the efuse
block: Use the first 6 byte of the cpuid's SHA256 hash and set the
locally administered bits. Also ensure that the multicast bit is
cleared.

The MAC address is only generated and set if there is no ethaddr
present in the saved environment.

This is based off of Klaus Goger's work in 8adc9d

Signed-off-by: Rohan Garg <rohan.garg@collabora.com>

---

 arch/arm/include/asm/arch-rockchip/misc.h |  13 +++
 arch/arm/mach-rockchip/Makefile           |   2 +
 arch/arm/mach-rockchip/misc.c             | 108 ++++++++++++++++++++++
 board/rockchip/evb_rk3399/evb-rk3399.c    |  13 +++
 4 files changed, 136 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-rockchip/misc.h
 create mode 100644 arch/arm/mach-rockchip/misc.c

diff --git a/arch/arm/include/asm/arch-rockchip/misc.h b/arch/arm/include/asm/arch-rockchip/misc.h
new file mode 100644
index 0000000000..11ca4eb033
--- /dev/null
+++ b/arch/arm/include/asm/arch-rockchip/misc.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * RK3399: Architecture common definitions
+ *
+ * Copyright (C) 2019 Collabora Inc - https://www.collabora.com/
+ *      Rohan Garg <rohan.garg@collabora.com>
+ */
+
+void rockchip_cpuid_from_efuse(const u32 cpuid_offset,
+							   const u32 cpuid_length,
+							   u8 *cpuid);
+void rockchip_cpuid_set(const u8 *cpuid, const u32 cpuid_length);
+void rockchip_setup_macaddr(void);
diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
index 23760a959a..43d895564f 100644
--- a/arch/arm/mach-rockchip/Makefile
+++ b/arch/arm/mach-rockchip/Makefile
@@ -47,6 +47,8 @@ obj-y += rk_timer.o
 endif
 endif
 
+obj-y += misc.o
+
 obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036/
 obj-$(CONFIG_ROCKCHIP_RK3128) += rk3128/
 ifndef CONFIG_TPL_BUILD
diff --git a/arch/arm/mach-rockchip/misc.c b/arch/arm/mach-rockchip/misc.c
new file mode 100644
index 0000000000..3e6110cc8b
--- /dev/null
+++ b/arch/arm/mach-rockchip/misc.c
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * RK3399: Architecture common definitions
+ *
+ * Copyright (C) 2019 Collabora Inc - https://www.collabora.com/
+ *      Rohan Garg <rohan.garg@collabora.com>
+ *
+ * Based on puma-rk3399.c:
+ *      (C) Copyright 2017 Theobroma Systems Design und Consulting GmbH
+ */
+
+#include <common.h>
+#include <u-boot/sha256.h>
+#include <dm/uclass-internal.h>
+#include <environment.h>
+
+#include <asm/arch-rockchip/misc.h>
+
+void rockchip_setup_macaddr(void)
+{
+#if CONFIG_IS_ENABLED(CMD_NET)
+	int ret;
+	const char *cpuid = env_get("cpuid#");
+	u8 hash[SHA256_SUM_LEN];
+	int size = sizeof(hash);
+	u8 mac_addr[6];
+
+	/* Only generate a MAC address, if none is set in the environment */
+	if (env_get("ethaddr"))
+		return;
+
+	if (!cpuid) {
+		debug("%s: could not retrieve 'cpuid#'\n", __func__);
+		return;
+	}
+
+	ret = hash_block("sha256", (void *)cpuid, strlen(cpuid), hash, &size);
+	if (ret) {
+		debug("%s: failed to calculate SHA256\n", __func__);
+		return;
+	}
+
+	/* Copy 6 bytes of the hash to base the MAC address on */
+	memcpy(mac_addr, hash, 6);
+
+	/* Make this a valid MAC address and set it */
+	mac_addr[0] &= 0xfe;  /* clear multicast bit */
+	mac_addr[0] |= 0x02;  /* set local assignment bit (IEEE802) */
+	eth_env_set_enetaddr("ethaddr", mac_addr);
+#endif
+}
+
+void rockchip_cpuid_from_efuse(const u32 cpuid_offset,
+                               const u32 cpuid_length,
+                               u8 *cpuid)
+{
+#if CONFIG_IS_ENABLED(ROCKCHIP_EFUSE)
+	struct udevice *dev;
+	int ret;
+
+	/* retrieve the device */
+	ret = uclass_get_device_by_driver(UCLASS_MISC,
+					  DM_GET_DRIVER(rockchip_efuse), &dev);
+	if (ret) {
+		debug("%s: could not find efuse device\n", __func__);
+		return;
+	}
+
+	/* read the cpu_id range from the efuses */
+	ret = misc_read(dev, cpuid_offset, cpuid, sizeof(cpuid));
+	if (ret) {
+		debug("%s: reading cpuid from the efuses failed\n",
+		      __func__);
+		return;
+	}
+#endif
+}
+
+void rockchip_cpuid_set(const u8 *cpuid, const u32 cpuid_length)
+{
+    u8 low[cpuid_length/2], high[cpuid_length/2];
+	char cpuid_str[cpuid_length * 2 + 1];
+	u64 serialno;
+	char serialno_str[17];
+	int i;
+
+    memset(cpuid_str, 0, sizeof(cpuid_str));
+	for (i = 0; i < 16; i++)
+		sprintf(&cpuid_str[i * 2], "%02x", cpuid[i]);
+
+	debug("cpuid: %s\n", cpuid_str);
+
+	/*
+	 * Mix the cpuid bytes using the same rules as in
+	 *   ${linux}/drivers/soc/rockchip/rockchip-cpuinfo.c
+	 */
+	for (i = 0; i < 8; i++) {
+		low[i] = cpuid[1 + (i << 1)];
+		high[i] = cpuid[i << 1];
+	}
+
+	serialno = crc32_no_comp(0, low, 8);
+	serialno |= (u64)crc32_no_comp(serialno, high, 8) << 32;
+	snprintf(serialno_str, sizeof(serialno_str), "%016llx", serialno);
+
+	env_set("cpuid#", cpuid_str);
+	env_set("serial#", serialno_str);
+}
diff --git a/board/rockchip/evb_rk3399/evb-rk3399.c b/board/rockchip/evb_rk3399/evb-rk3399.c
index eb1b832274..9253866c02 100644
--- a/board/rockchip/evb_rk3399/evb-rk3399.c
+++ b/board/rockchip/evb_rk3399/evb-rk3399.c
@@ -7,6 +7,7 @@
 #include <dm.h>
 #include <dm/pinctrl.h>
 #include <asm/arch-rockchip/periph.h>
+#include <asm/arch-rockchip/misc.h>
 #include <power/regulator.h>
 
 int board_init(void)
@@ -33,3 +34,15 @@ int board_init(void)
 out:
 	return 0;
 }
+
+int misc_init_r(void)
+{
+	const u32 cpuid_offset = 0x7;
+	const u32 cpuid_length = 0x10;
+	u8 cpuid[cpuid_length];
+
+	rockchip_cpuid_from_efuse(cpuid_offset, cpuid_length, cpuid);
+	rockchip_cpuid_set(cpuid, cpuid_length);
+	rockchip_setup_macaddr();
+	return 0;
+}
-- 
2.17.1

             reply	other threads:[~2019-07-12 14:22 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-12 14:22 Rohan Garg [this message]
2019-07-12 14:22 ` [U-Boot] [PATCH v2 2/3] rockchip: rk3399: Enable CONFIG_MISC_INIT_R for the Rock PI 4 Rohan Garg
2019-07-12 14:22 ` [U-Boot] [PATCH v2 3/3] board: puma: Use rockchip_* helpers to setup cpuid and macaddr Rohan Garg
2019-07-15 13:15 ` [U-Boot] [PATCH v2 1/3] rockchip: rk3399: derive ethaddr from cpuid Kever Yang
2019-07-19 14:56   ` Rohan Garg
2019-07-21  4:24     ` Kever Yang

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=20190712142228.13201-1-rohan.garg@collabora.com \
    --to=rohan.garg@collabora.com \
    --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