All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] rockchip: derive ethaddr from cpuid
@ 2019-07-09 10:37 Rohan Garg
  2019-07-10  6:37 ` Kever Yang
  0 siblings, 1 reply; 6+ messages in thread
From: Rohan Garg @ 2019-07-09 10:37 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>

---

 board/rockchip/evb_rk3399/evb-rk3399.c | 98 ++++++++++++++++++++++++++
 configs/rock-pi-4-rk3399_defconfig     |  1 +
 2 files changed, 99 insertions(+)

diff --git a/board/rockchip/evb_rk3399/evb-rk3399.c b/board/rockchip/evb_rk3399/evb-rk3399.c
index eb1b832274..af57cd86a5 100644
--- a/board/rockchip/evb_rk3399/evb-rk3399.c
+++ b/board/rockchip/evb_rk3399/evb-rk3399.c
@@ -6,8 +6,11 @@
 #include <common.h>
 #include <dm.h>
 #include <dm/pinctrl.h>
+#include <environment.h>
+#include <misc.h>
 #include <asm/arch-rockchip/periph.h>
 #include <power/regulator.h>
+#include <u-boot/sha256.h>
 
 int board_init(void)
 {
@@ -33,3 +36,98 @@ int board_init(void)
 out:
 	return 0;
 }
+
+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
+}
+
+int misc_init_r(void)
+{
+	setup_serial();
+	setup_macaddr();
+	return 0;
+}
diff --git a/configs/rock-pi-4-rk3399_defconfig b/configs/rock-pi-4-rk3399_defconfig
index be670df23f..dc84ded86c 100644
--- a/configs/rock-pi-4-rk3399_defconfig
+++ b/configs/rock-pi-4-rk3399_defconfig
@@ -58,3 +58,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] rockchip: derive ethaddr from cpuid
  2019-07-09 10:37 [U-Boot] [PATCH] rockchip: derive ethaddr from cpuid Rohan Garg
@ 2019-07-10  6:37 ` Kever Yang
  2019-07-10 10:03   ` Heiko Stübner
  2019-07-10 12:07   ` Rohan Garg
  0 siblings, 2 replies; 6+ messages in thread
From: Kever Yang @ 2019-07-10  6:37 UTC (permalink / raw)
  To: u-boot

Hi Rohan,

     The code change looks good to me, but could you help to separate

the rock pi config update into another patch?


Thanks,

- Kever

On 2019/7/9 下午6:37, 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>
>
> ---
>
>   board/rockchip/evb_rk3399/evb-rk3399.c | 98 ++++++++++++++++++++++++++
>   configs/rock-pi-4-rk3399_defconfig     |  1 +
>   2 files changed, 99 insertions(+)
>
> diff --git a/board/rockchip/evb_rk3399/evb-rk3399.c b/board/rockchip/evb_rk3399/evb-rk3399.c
> index eb1b832274..af57cd86a5 100644
> --- a/board/rockchip/evb_rk3399/evb-rk3399.c
> +++ b/board/rockchip/evb_rk3399/evb-rk3399.c
> @@ -6,8 +6,11 @@
>   #include <common.h>
>   #include <dm.h>
>   #include <dm/pinctrl.h>
> +#include <environment.h>
> +#include <misc.h>
>   #include <asm/arch-rockchip/periph.h>
>   #include <power/regulator.h>
> +#include <u-boot/sha256.h>
>   
>   int board_init(void)
>   {
> @@ -33,3 +36,98 @@ int board_init(void)
>   out:
>   	return 0;
>   }
> +
> +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
> +}
> +
> +int misc_init_r(void)
> +{
> +	setup_serial();
> +	setup_macaddr();
> +	return 0;
> +}
> diff --git a/configs/rock-pi-4-rk3399_defconfig b/configs/rock-pi-4-rk3399_defconfig
> index be670df23f..dc84ded86c 100644
> --- a/configs/rock-pi-4-rk3399_defconfig
> +++ b/configs/rock-pi-4-rk3399_defconfig
> @@ -58,3 +58,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] rockchip: derive ethaddr from cpuid
  2019-07-10  6:37 ` Kever Yang
@ 2019-07-10 10:03   ` Heiko Stübner
  2019-07-10 12:08     ` Rohan Garg
  2019-07-10 12:07   ` Rohan Garg
  1 sibling, 1 reply; 6+ messages in thread
From: Heiko Stübner @ 2019-07-10 10:03 UTC (permalink / raw)
  To: u-boot

Hi Rohan, Kever,

Am Mittwoch, 10. Juli 2019, 08:37:33 CEST schrieb Kever Yang:
> Hi Rohan,
> 
>      The code change looks good to me, but could you help to separate
> the rock pi config update into another patch?

Also, that code looks pretty much like the same in rk3399-puma.

So maybe it might be good to have this in a common location so
more boards can access common code instead of duplicating that
whole function numerous times?


Heiko


> On 2019/7/9 下午6:37, 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>
> >
> > ---
> >
> >   board/rockchip/evb_rk3399/evb-rk3399.c | 98 ++++++++++++++++++++++++++
> >   configs/rock-pi-4-rk3399_defconfig     |  1 +
> >   2 files changed, 99 insertions(+)
> >
> > diff --git a/board/rockchip/evb_rk3399/evb-rk3399.c b/board/rockchip/evb_rk3399/evb-rk3399.c
> > index eb1b832274..af57cd86a5 100644
> > --- a/board/rockchip/evb_rk3399/evb-rk3399.c
> > +++ b/board/rockchip/evb_rk3399/evb-rk3399.c
> > @@ -6,8 +6,11 @@
> >   #include <common.h>
> >   #include <dm.h>
> >   #include <dm/pinctrl.h>
> > +#include <environment.h>
> > +#include <misc.h>
> >   #include <asm/arch-rockchip/periph.h>
> >   #include <power/regulator.h>
> > +#include <u-boot/sha256.h>
> >   
> >   int board_init(void)
> >   {
> > @@ -33,3 +36,98 @@ int board_init(void)
> >   out:
> >   	return 0;
> >   }
> > +
> > +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
> > +}
> > +
> > +int misc_init_r(void)
> > +{
> > +	setup_serial();
> > +	setup_macaddr();
> > +	return 0;
> > +}
> > diff --git a/configs/rock-pi-4-rk3399_defconfig b/configs/rock-pi-4-rk3399_defconfig
> > index be670df23f..dc84ded86c 100644
> > --- a/configs/rock-pi-4-rk3399_defconfig
> > +++ b/configs/rock-pi-4-rk3399_defconfig
> > @@ -58,3 +58,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
> 
> 
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] rockchip: derive ethaddr from cpuid
  2019-07-10  6:37 ` Kever Yang
  2019-07-10 10:03   ` Heiko Stübner
@ 2019-07-10 12:07   ` Rohan Garg
  1 sibling, 0 replies; 6+ messages in thread
From: Rohan Garg @ 2019-07-10 12:07 UTC (permalink / raw)
  To: u-boot

Hey Kever
 
> the rock pi config update into another patch?
 
Will do.

Cheers
Rohan Garg
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20190710/e6fbfe7a/attachment.sig>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] rockchip: derive ethaddr from cpuid
  2019-07-10 10:03   ` Heiko Stübner
@ 2019-07-10 12:08     ` Rohan Garg
  2019-07-10 12:53       ` Heiko Stübner
  0 siblings, 1 reply; 6+ messages in thread
From: Rohan Garg @ 2019-07-10 12:08 UTC (permalink / raw)
  To: u-boot

Hey Heiko
> Also, that code looks pretty much like the same in rk3399-puma.
> 
> So maybe it might be good to have this in a common location so
> more boards can access common code instead of duplicating that
> whole function numerous times?

Sounds good to me, do you have any recommendations where something like this 
would live?

Cheers
Rohan Garg
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20190710/edbc6773/attachment.sig>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH] rockchip: derive ethaddr from cpuid
  2019-07-10 12:08     ` Rohan Garg
@ 2019-07-10 12:53       ` Heiko Stübner
  0 siblings, 0 replies; 6+ messages in thread
From: Heiko Stübner @ 2019-07-10 12:53 UTC (permalink / raw)
  To: u-boot

Hi Rohan,

Am Mittwoch, 10. Juli 2019, 14:08:31 CEST schrieb Rohan Garg:
> Hey Heiko
> > Also, that code looks pretty much like the same in rk3399-puma.
> > 
> > So maybe it might be good to have this in a common location so
> > more boards can access common code instead of duplicating that
> > whole function numerous times?
> 
> Sounds good to me, do you have any recommendations where something like this 
> would live?

From a cursory glance, it looks like most Rockchip socs have that cpu-id
value in the efuse (I checked rk3288, rk3399, rk3328 ... rk3368 efuse looks
similar but I'm not sure yet if it also has that id value).

So in any case I'd suggest somewhere in mach-rockchip, so that all
Rockchip socs can profit from that if they want.

It might be good to separate the cpu-id reading from the serial-generation
though, to parameterize the offset+length.

cpu_id = rockchip_cpuid_from_efuse(offset, length);
	//containing the efuse related code
rockchip_cpuid_set(cpu_id);
	//containing the calculations and env-setting


Heiko

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-07-10 12:53 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-09 10:37 [U-Boot] [PATCH] rockchip: derive ethaddr from cpuid Rohan Garg
2019-07-10  6:37 ` Kever Yang
2019-07-10 10:03   ` Heiko Stübner
2019-07-10 12:08     ` Rohan Garg
2019-07-10 12:53       ` Heiko Stübner
2019-07-10 12:07   ` Rohan Garg

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.