diff mbox

[U-Boot,v2,3/5] rockchip: board: puma_rk3399: add support for serial# and cpuid# via efuses

Message ID 1493392319-52041-4-git-send-email-philipp.tomsich@theobroma-systems.com
State Superseded
Delegated to: Simon Glass
Headers show

Commit Message

Philipp Tomsich April 28, 2017, 3:11 p.m. UTC
With our efuse driver for the RK3399 ready, we can add the
board-specific code that consumes the cpuid from the efuse block and
postprocesses it into the system serial (using the same CRC32 based
derivation as in Linux).

We expose the cpuid via two distinct environment variables:
   serial# - the serial number, as derived in Linux
   cpuid#  - the raw 16 byte CPU id field from the fuse block

Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Tested-by: Klaus Goger <klaus.goger@theobroma-systems.com>
---

Changes in v2: None

 board/theobroma-systems/puma_rk3399/puma-rk3399.c | 79 +++++++++++++++++++++++
 include/configs/puma_rk3399.h                     |  4 ++
 2 files changed, 83 insertions(+)

Comments

Simon Glass April 30, 2017, 3:48 a.m. UTC | #1
On 28 April 2017 at 09:11, Philipp Tomsich
<philipp.tomsich@theobroma-systems.com> wrote:
> With our efuse driver for the RK3399 ready, we can add the
> board-specific code that consumes the cpuid from the efuse block and
> postprocesses it into the system serial (using the same CRC32 based
> derivation as in Linux).
>
> We expose the cpuid via two distinct environment variables:
>    serial# - the serial number, as derived in Linux
>    cpuid#  - the raw 16 byte CPU id field from the fuse block
>
> Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
> Tested-by: Klaus Goger <klaus.goger@theobroma-systems.com>
> ---
>
> Changes in v2: None
>
>  board/theobroma-systems/puma_rk3399/puma-rk3399.c | 79 +++++++++++++++++++++++
>  include/configs/puma_rk3399.h                     |  4 ++
>  2 files changed, 83 insertions(+)

Reviewed-by: Simon Glass <sjg@chromium.org>

Similar comment to the previous patch about finding the right device.
diff mbox

Patch

diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
index fb4d31e..b434ad5 100644
--- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c
+++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
@@ -7,9 +7,13 @@ 
 #include <dm.h>
 #include <dm/pinctrl.h>
 #include <dm/uclass-internal.h>
+#include <misc.h>
 #include <asm/arch/periph.h>
 #include <power/regulator.h>
 
+#define RK3399_CPUID_OFF  0x7
+#define RK3399_CPUID_LEN  0x10
+
 DECLARE_GLOBAL_DATA_PTR;
 
 int board_init(void)
@@ -55,6 +59,81 @@  out:
 	return 0;
 }
 
+static void setup_serial(void)
+{
+#if CONFIG_IS_ENABLED(ROCKCHIP_EFUSE)
+	struct udevice *dev;
+	int ret, i;
+	u8 cpuid[RK3399_CPUID_LEN];
+	u8 low[RK3399_CPUID_LEN/2], high[RK3399_CPUID_LEN/2];
+	char cpuid_str[RK3399_CPUID_LEN * 2 + 1];
+	u64 serialno;
+	char serialno_str[16];
+
+	/* the first misc device will be used */
+	ret = uclass_get_device(UCLASS_MISC, 0, &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, RK3399_CPUID_OFF, &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), "%llx", serialno);
+
+	setenv("cpuid#", cpuid_str);
+	setenv("serial#", serialno_str);
+#endif
+
+	return;
+}
+
+int misc_init_r(void)
+{
+	setup_serial();
+
+	return 0;
+}
+
+#ifdef CONFIG_SERIAL_TAG
+void get_board_serial(struct tag_serialnr *serialnr)
+{
+	char *serial_string;
+	u64 serial = 0;
+
+	serial_string = getenv("serial#");
+
+	if (serial_string)
+		serial = simple_strtoull(serial_string, NULL, 16);
+
+	serialnr->high = (u32)(serial >> 32);
+	serialnr->low = (u32)(serial & 0xffffffff);
+}
+#endif
+
 int dram_init(void)
 {
 	gd->ram_size = 0x80000000;
diff --git a/include/configs/puma_rk3399.h b/include/configs/puma_rk3399.h
index fd62c72..4081362 100644
--- a/include/configs/puma_rk3399.h
+++ b/include/configs/puma_rk3399.h
@@ -22,6 +22,10 @@ 
 
 #define SDRAM_BANK_SIZE			(2UL << 30)
 
+#define CONFIG_MISC_INIT_R
+#define CONFIG_SERIAL_TAG
+#define CONFIG_ENV_OVERWRITE
+
 #define CONFIG_SYS_WHITE_ON_BLACK
 
 #endif