rpi: set board serial number in environment
authorLubomir Rintel <lkundrak@v3.sk>
Mon, 22 Feb 2016 21:06:47 +0000 (22:06 +0100)
committerTom Rini <trini@konsulko.com>
Wed, 24 Feb 2016 23:44:12 +0000 (18:44 -0500)
Gets propagated into the device tree and then into /proc/cpuinfo where
users often expect it.

Signed-off-by: Lubomir Rintel <lkundrak@v3.sk>
Tested-by: Stephen Warren <swarren@wwwdotorg.org>
Reviewed-by: Stephen Warren <swarren@wwwdotorg.org>
arch/arm/mach-bcm283x/include/mach/mbox.h
board/raspberrypi/rpi/rpi.c

index af94dff2ac639f11303a349f8afad0413e10e60b..4a143917f0f8ed4a7b53345dfe4b040ad635abb5 100644 (file)
@@ -150,6 +150,17 @@ struct bcm2835_mbox_tag_get_mac_address {
        } body;
 };
 
+#define BCM2835_MBOX_TAG_GET_BOARD_SERIAL      0x00010004
+
+struct bcm2835_mbox_tag_get_board_serial {
+       struct bcm2835_mbox_tag_hdr tag_hdr;
+       union {
+               struct __packed {
+                       u64 serial;
+               } resp;
+       } body;
+};
+
 #define BCM2835_MBOX_TAG_GET_ARM_MEMORY                0x00010005
 
 struct bcm2835_mbox_tag_get_arm_mem {
index 7f4fe64385e4d31419713de109947151aa26759e..1d3a4e09cfa3c3f2ca12d253c1c64ea947722908 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <common.h>
+#include <inttypes.h>
 #include <config.h>
 #include <dm.h>
 #include <fdt_support.h>
@@ -56,6 +57,12 @@ struct msg_get_board_rev {
        u32 end_tag;
 };
 
+struct msg_get_board_serial {
+       struct bcm2835_mbox_hdr hdr;
+       struct bcm2835_mbox_tag_get_board_serial get_board_serial;
+       u32 end_tag;
+};
+
 struct msg_get_mac_address {
        struct bcm2835_mbox_hdr hdr;
        struct bcm2835_mbox_tag_get_mac_address get_mac_address;
@@ -281,6 +288,30 @@ static void set_board_info(void)
 }
 #endif /* CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG */
 
+static void set_serial_number(void)
+{
+       ALLOC_CACHE_ALIGN_BUFFER(struct msg_get_board_serial, msg, 1);
+       int ret;
+       char serial_string[17] = { 0 };
+
+       if (getenv("serial#"))
+               return;
+
+       BCM2835_MBOX_INIT_HDR(msg);
+       BCM2835_MBOX_INIT_TAG_NO_REQ(&msg->get_board_serial, GET_BOARD_SERIAL);
+
+       ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg->hdr);
+       if (ret) {
+               printf("bcm2835: Could not query board serial\n");
+               /* Ignore error; not critical */
+               return;
+       }
+
+       snprintf(serial_string, sizeof(serial_string), "%016" PRIx64,
+                msg->get_board_serial.body.resp.serial);
+       setenv("serial#", serial_string);
+}
+
 int misc_init_r(void)
 {
        set_fdtfile();
@@ -288,6 +319,8 @@ int misc_init_r(void)
 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
        set_board_info();
 #endif
+       set_serial_number();
+
        return 0;
 }