* [U-Boot] [PATCH v4 1/3] rockchip: rk3399: derive ethaddr from cpuid
@ 2019-08-12 15:04 Rohan Garg
2019-08-12 15:04 ` [U-Boot] [PATCH v4 2/3] rockchip: rk3399: Enable CONFIG_MISC_INIT_R for the Rock PI 4 Rohan Garg
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Rohan Garg @ 2019-08-12 15:04 UTC (permalink / raw)
To: u-boot
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 | 4 +
arch/arm/mach-rockchip/board.c | 21 ++++
arch/arm/mach-rockchip/misc.c | 114 ++++++++++++++++++++++
4 files changed, 152 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..b6b03c934e
--- /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>
+ */
+
+int rockchip_cpuid_from_efuse(const u32 cpuid_offset,
+ const u32 cpuid_length,
+ u8 *cpuid);
+int rockchip_cpuid_set(const u8 *cpuid, const u32 cpuid_length);
+int rockchip_setup_macaddr(void);
diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
index aed379a0dc..207f900011 100644
--- a/arch/arm/mach-rockchip/Makefile
+++ b/arch/arm/mach-rockchip/Makefile
@@ -25,6 +25,10 @@ endif
obj-$(CONFIG_$(SPL_TPL_)RAM) += sdram_common.o
+ifdef CONFIG_MISC_INIT_R
+obj-y += misc.o
+endif
+
obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036/
obj-$(CONFIG_ROCKCHIP_RK3128) += rk3128/
ifndef CONFIG_TPL_BUILD
diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c
index b2a88e789d..4a30a1865e 100644
--- a/arch/arm/mach-rockchip/board.c
+++ b/arch/arm/mach-rockchip/board.c
@@ -11,6 +11,7 @@
#include <asm/arch-rockchip/boot_mode.h>
#include <asm/arch-rockchip/clock.h>
#include <asm/arch-rockchip/periph.h>
+#include <asm/arch-rockchip/misc.h>
#include <power/regulator.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -102,3 +103,23 @@ int fastboot_set_reboot_flag(void)
return 0;
}
#endif
+
+__weak int misc_init_r(void)
+{
+ const u32 cpuid_offset = 0x7;
+ const u32 cpuid_length = 0x10;
+ u8 cpuid[cpuid_length];
+ int ret;
+
+ ret = rockchip_cpuid_from_efuse(cpuid_offset, cpuid_length, cpuid);
+ if (ret)
+ return ret;
+
+ ret = rockchip_cpuid_set(cpuid, cpuid_length);
+ if (ret)
+ return ret;
+
+ ret = rockchip_setup_macaddr();
+
+ return ret;
+}
diff --git a/arch/arm/mach-rockchip/misc.c b/arch/arm/mach-rockchip/misc.c
new file mode 100644
index 0000000000..2144b41eae
--- /dev/null
+++ b/arch/arm/mach-rockchip/misc.c
@@ -0,0 +1,114 @@
+/* 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 <environment.h>
+#include <dm.h>
+#include <dm/uclass-internal.h>
+#include <misc.h>
+#include <u-boot/sha256.h>
+
+#include <asm/arch-rockchip/misc.h>
+
+int 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 -1;
+
+ if (!cpuid) {
+ debug("%s: could not retrieve 'cpuid#'\n", __func__);
+ return -1;
+ }
+
+ ret = hash_block("sha256", (void *)cpuid, strlen(cpuid), hash, &size);
+ if (ret) {
+ debug("%s: failed to calculate SHA256\n", __func__);
+ return -1;
+ }
+
+ /* 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
+ return 0;
+}
+
+int 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 -1;
+ }
+
+ /* 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 -1;
+ }
+#endif
+ return 0;
+}
+
+int 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);
+
+ return 0;
+}
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* [U-Boot] [PATCH v4 2/3] rockchip: rk3399: Enable CONFIG_MISC_INIT_R for the Rock PI 4
2019-08-12 15:04 [U-Boot] [PATCH v4 1/3] rockchip: rk3399: derive ethaddr from cpuid Rohan Garg
@ 2019-08-12 15:04 ` Rohan Garg
2019-08-23 9:36 ` Kever Yang
2019-08-12 15:04 ` [U-Boot] [PATCH v4 3/3] board: puma: Use rockchip_* helpers to setup cpuid and macaddr Rohan Garg
2019-08-23 9:35 ` [U-Boot] [PATCH v4 1/3] rockchip: rk3399: derive ethaddr from cpuid Kever Yang
2 siblings, 1 reply; 6+ messages in thread
From: Rohan Garg @ 2019-08-12 15:04 UTC (permalink / raw)
To: u-boot
This enables us to set a static MAC address
Signed-off-by: Rohan Garg <rohan.garg@collabora.com>
---
configs/rock-pi-4-rk3399_defconfig | 1 +
1 file changed, 1 insertion(+)
diff --git a/configs/rock-pi-4-rk3399_defconfig b/configs/rock-pi-4-rk3399_defconfig
index 14ae39a561..602be5a928 100644
--- a/configs/rock-pi-4-rk3399_defconfig
+++ b/configs/rock-pi-4-rk3399_defconfig
@@ -56,3 +56,4 @@ CONFIG_USB_ETHER_SMSC95XX=y
CONFIG_USE_TINY_PRINTF=y
CONFIG_SPL_TINY_MEMSET=y
CONFIG_ERRNO_STR=y
+CONFIG_MISC_INIT_R=y
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v4 2/3] rockchip: rk3399: Enable CONFIG_MISC_INIT_R for the Rock PI 4
2019-08-12 15:04 ` [U-Boot] [PATCH v4 2/3] rockchip: rk3399: Enable CONFIG_MISC_INIT_R for the Rock PI 4 Rohan Garg
@ 2019-08-23 9:36 ` Kever Yang
0 siblings, 0 replies; 6+ messages in thread
From: Kever Yang @ 2019-08-23 9:36 UTC (permalink / raw)
To: u-boot
On 2019/8/12 下午11:04, Rohan Garg wrote:
> This enables us to set a static MAC address
>
> Signed-off-by: Rohan Garg <rohan.garg@collabora.com>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
Thanks,
- Kever
> ---
>
> configs/rock-pi-4-rk3399_defconfig | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/configs/rock-pi-4-rk3399_defconfig b/configs/rock-pi-4-rk3399_defconfig
> index 14ae39a561..602be5a928 100644
> --- a/configs/rock-pi-4-rk3399_defconfig
> +++ b/configs/rock-pi-4-rk3399_defconfig
> @@ -56,3 +56,4 @@ CONFIG_USB_ETHER_SMSC95XX=y
> CONFIG_USE_TINY_PRINTF=y
> CONFIG_SPL_TINY_MEMSET=y
> CONFIG_ERRNO_STR=y
> +CONFIG_MISC_INIT_R=y
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v4 3/3] board: puma: Use rockchip_* helpers to setup cpuid and macaddr
2019-08-12 15:04 [U-Boot] [PATCH v4 1/3] rockchip: rk3399: derive ethaddr from cpuid Rohan Garg
2019-08-12 15:04 ` [U-Boot] [PATCH v4 2/3] rockchip: rk3399: Enable CONFIG_MISC_INIT_R for the Rock PI 4 Rohan Garg
@ 2019-08-12 15:04 ` Rohan Garg
2019-08-23 9:36 ` [U-Boot] [PATCH v4 3/3] board: puma: Use rockchip_* helpers to setup cpuid and macaddr【请注意,邮件由u-boot-bounces@lists.denx.de代发】 " Kever Yang
2019-08-23 9:35 ` [U-Boot] [PATCH v4 1/3] rockchip: rk3399: derive ethaddr from cpuid Kever Yang
2 siblings, 1 reply; 6+ messages in thread
From: Rohan Garg @ 2019-08-12 15:04 UTC (permalink / raw)
To: u-boot
We should use the shared helpers to setup the necessary parts
Signed-off-by: Rohan Garg <rohan.garg@collabora.com>
---
.../puma_rk3399/puma-rk3399.c | 108 +++---------------
1 file changed, 18 insertions(+), 90 deletions(-)
diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
index a7e7f022ba..562a6ec9c8 100644
--- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c
+++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
@@ -18,97 +18,10 @@
#include <asm/arch-rockchip/hardware.h>
#include <asm/arch-rockchip/grf_rk3399.h>
#include <asm/arch-rockchip/periph.h>
+#include <asm/arch-rockchip/misc.h>
#include <power/regulator.h>
#include <u-boot/sha256.h>
-static void 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
-}
-
-static void setup_serial(void)
-{
-#if CONFIG_IS_ENABLED(ROCKCHIP_EFUSE)
- const u32 cpuid_offset = 0x7;
- const u32 cpuid_length = 0x10;
-
- struct udevice *dev;
- int ret, i;
- u8 cpuid[cpuid_length];
- u8 low[cpuid_length/2], high[cpuid_length/2];
- char cpuid_str[cpuid_length * 2 + 1];
- u64 serialno;
- char serialno_str[17];
-
- /* 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;
- }
-
- 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);
-#endif
-}
-
static void setup_iodomain(void)
{
const u32 GRF_IO_VSEL_GPIO4CD_SHIFT = 3;
@@ -198,8 +111,23 @@ static int setup_boottargets(void)
int misc_init_r(void)
{
- setup_serial();
- setup_macaddr();
+ const u32 cpuid_offset = 0x7;
+ const u32 cpuid_length = 0x10;
+ u8 cpuid[cpuid_length];
+ int ret;
+
+ ret = rockchip_cpuid_from_efuse(cpuid_offset, cpuid_length, cpuid);
+ if (ret)
+ return ret;
+
+ ret = rockchip_cpuid_set(cpuid, cpuid_length);
+ if (ret)
+ return ret;
+
+ ret = rockchip_setup_macaddr();
+ if (ret)
+ return ret;
+
setup_iodomain();
setup_boottargets();
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* [U-Boot] [PATCH v4 3/3] board: puma: Use rockchip_* helpers to setup cpuid and macaddr【请注意,邮件由u-boot-bounces@lists.denx.de代发】 setup cpuid and macaddr
2019-08-12 15:04 ` [U-Boot] [PATCH v4 3/3] board: puma: Use rockchip_* helpers to setup cpuid and macaddr Rohan Garg
@ 2019-08-23 9:36 ` Kever Yang
0 siblings, 0 replies; 6+ messages in thread
From: Kever Yang @ 2019-08-23 9:36 UTC (permalink / raw)
To: u-boot
On 2019/8/12 下午11:04, Rohan Garg wrote:
> We should use the shared helpers to setup the necessary parts
>
> Signed-off-by: Rohan Garg <rohan.garg@collabora.com>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
Thanks,
- Kever
> ---
>
> .../puma_rk3399/puma-rk3399.c | 108 +++---------------
> 1 file changed, 18 insertions(+), 90 deletions(-)
>
> diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
> index a7e7f022ba..562a6ec9c8 100644
> --- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c
> +++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
> @@ -18,97 +18,10 @@
> #include <asm/arch-rockchip/hardware.h>
> #include <asm/arch-rockchip/grf_rk3399.h>
> #include <asm/arch-rockchip/periph.h>
> +#include <asm/arch-rockchip/misc.h>
> #include <power/regulator.h>
> #include <u-boot/sha256.h>
>
> -static void 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
> -}
> -
> -static void setup_serial(void)
> -{
> -#if CONFIG_IS_ENABLED(ROCKCHIP_EFUSE)
> - const u32 cpuid_offset = 0x7;
> - const u32 cpuid_length = 0x10;
> -
> - struct udevice *dev;
> - int ret, i;
> - u8 cpuid[cpuid_length];
> - u8 low[cpuid_length/2], high[cpuid_length/2];
> - char cpuid_str[cpuid_length * 2 + 1];
> - u64 serialno;
> - char serialno_str[17];
> -
> - /* 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;
> - }
> -
> - 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);
> -#endif
> -}
> -
> static void setup_iodomain(void)
> {
> const u32 GRF_IO_VSEL_GPIO4CD_SHIFT = 3;
> @@ -198,8 +111,23 @@ static int setup_boottargets(void)
>
> int misc_init_r(void)
> {
> - setup_serial();
> - setup_macaddr();
> + const u32 cpuid_offset = 0x7;
> + const u32 cpuid_length = 0x10;
> + u8 cpuid[cpuid_length];
> + int ret;
> +
> + ret = rockchip_cpuid_from_efuse(cpuid_offset, cpuid_length, cpuid);
> + if (ret)
> + return ret;
> +
> + ret = rockchip_cpuid_set(cpuid, cpuid_length);
> + if (ret)
> + return ret;
> +
> + ret = rockchip_setup_macaddr();
> + if (ret)
> + return ret;
> +
> setup_iodomain();
> setup_boottargets();
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v4 1/3] rockchip: rk3399: derive ethaddr from cpuid
2019-08-12 15:04 [U-Boot] [PATCH v4 1/3] rockchip: rk3399: derive ethaddr from cpuid Rohan Garg
2019-08-12 15:04 ` [U-Boot] [PATCH v4 2/3] rockchip: rk3399: Enable CONFIG_MISC_INIT_R for the Rock PI 4 Rohan Garg
2019-08-12 15:04 ` [U-Boot] [PATCH v4 3/3] board: puma: Use rockchip_* helpers to setup cpuid and macaddr Rohan Garg
@ 2019-08-23 9:35 ` Kever Yang
2 siblings, 0 replies; 6+ messages in thread
From: Kever Yang @ 2019-08-23 9:35 UTC (permalink / raw)
To: u-boot
Hi Rohan,
On 2019/8/12 下午11:04, Rohan Garg wrote:
> 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>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
Thanks,
- Kever
>
> ---
>
> arch/arm/include/asm/arch-rockchip/misc.h | 13 +++
> arch/arm/mach-rockchip/Makefile | 4 +
> arch/arm/mach-rockchip/board.c | 21 ++++
> arch/arm/mach-rockchip/misc.c | 114 ++++++++++++++++++++++
> 4 files changed, 152 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..b6b03c934e
> --- /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>
> + */
> +
> +int rockchip_cpuid_from_efuse(const u32 cpuid_offset,
> + const u32 cpuid_length,
> + u8 *cpuid);
> +int rockchip_cpuid_set(const u8 *cpuid, const u32 cpuid_length);
> +int rockchip_setup_macaddr(void);
> diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
> index aed379a0dc..207f900011 100644
> --- a/arch/arm/mach-rockchip/Makefile
> +++ b/arch/arm/mach-rockchip/Makefile
> @@ -25,6 +25,10 @@ endif
>
> obj-$(CONFIG_$(SPL_TPL_)RAM) += sdram_common.o
>
> +ifdef CONFIG_MISC_INIT_R
> +obj-y += misc.o
> +endif
> +
> obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036/
> obj-$(CONFIG_ROCKCHIP_RK3128) += rk3128/
> ifndef CONFIG_TPL_BUILD
> diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c
> index b2a88e789d..4a30a1865e 100644
> --- a/arch/arm/mach-rockchip/board.c
> +++ b/arch/arm/mach-rockchip/board.c
> @@ -11,6 +11,7 @@
> #include <asm/arch-rockchip/boot_mode.h>
> #include <asm/arch-rockchip/clock.h>
> #include <asm/arch-rockchip/periph.h>
> +#include <asm/arch-rockchip/misc.h>
> #include <power/regulator.h>
>
> DECLARE_GLOBAL_DATA_PTR;
> @@ -102,3 +103,23 @@ int fastboot_set_reboot_flag(void)
> return 0;
> }
> #endif
> +
> +__weak int misc_init_r(void)
> +{
> + const u32 cpuid_offset = 0x7;
> + const u32 cpuid_length = 0x10;
> + u8 cpuid[cpuid_length];
> + int ret;
> +
> + ret = rockchip_cpuid_from_efuse(cpuid_offset, cpuid_length, cpuid);
> + if (ret)
> + return ret;
> +
> + ret = rockchip_cpuid_set(cpuid, cpuid_length);
> + if (ret)
> + return ret;
> +
> + ret = rockchip_setup_macaddr();
> +
> + return ret;
> +}
> diff --git a/arch/arm/mach-rockchip/misc.c b/arch/arm/mach-rockchip/misc.c
> new file mode 100644
> index 0000000000..2144b41eae
> --- /dev/null
> +++ b/arch/arm/mach-rockchip/misc.c
> @@ -0,0 +1,114 @@
> +/* 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 <environment.h>
> +#include <dm.h>
> +#include <dm/uclass-internal.h>
> +#include <misc.h>
> +#include <u-boot/sha256.h>
> +
> +#include <asm/arch-rockchip/misc.h>
> +
> +int 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 -1;
> +
> + if (!cpuid) {
> + debug("%s: could not retrieve 'cpuid#'\n", __func__);
> + return -1;
> + }
> +
> + ret = hash_block("sha256", (void *)cpuid, strlen(cpuid), hash, &size);
> + if (ret) {
> + debug("%s: failed to calculate SHA256\n", __func__);
> + return -1;
> + }
> +
> + /* 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
> + return 0;
> +}
> +
> +int 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 -1;
> + }
> +
> + /* 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 -1;
> + }
> +#endif
> + return 0;
> +}
> +
> +int 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);
> +
> + return 0;
> +}
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-08-23 9:36 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-08-12 15:04 [U-Boot] [PATCH v4 1/3] rockchip: rk3399: derive ethaddr from cpuid Rohan Garg
2019-08-12 15:04 ` [U-Boot] [PATCH v4 2/3] rockchip: rk3399: Enable CONFIG_MISC_INIT_R for the Rock PI 4 Rohan Garg
2019-08-23 9:36 ` Kever Yang
2019-08-12 15:04 ` [U-Boot] [PATCH v4 3/3] board: puma: Use rockchip_* helpers to setup cpuid and macaddr Rohan Garg
2019-08-23 9:36 ` [U-Boot] [PATCH v4 3/3] board: puma: Use rockchip_* helpers to setup cpuid and macaddr【请注意,邮件由u-boot-bounces@lists.denx.de代发】 " Kever Yang
2019-08-23 9:35 ` [U-Boot] [PATCH v4 1/3] rockchip: rk3399: derive ethaddr from cpuid Kever Yang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox