fdt: Pass the device serial number through devicetree
authorPaul Kocialkowski <contact@paulk.fr>
Thu, 21 May 2015 09:27:03 +0000 (11:27 +0200)
committerSimon Glass <sjg@chromium.org>
Fri, 5 Jun 2015 14:32:07 +0000 (08:32 -0600)
Before device-tree, the device serial number used to be passed to the kernel
using ATAGs (on ARM). This is now deprecated and all the handover to the kernel
should now be done using device-tree. Thus, this passes the serial-number
property to the kernel using the serial-number property of the root node, as
expected by the kernel.

The serial number is a string that somewhat represents the device's serial
number. It might come from some form of storage (e.g. an eeprom) and be
programmed at factory-time by the manufacturer or come from identification
bits available in e.g. the SoC.

Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
Reviewed-by: Simon Glass <sgj@chromium.org>
common/fdt_support.c
common/image-fdt.c
doc/device-tree-bindings/root.txt [new file with mode: 0644]
include/fdt_support.h

index 9e501484625d8583cd1d122e8e6c83f9c6948ac5..10648b5a4a86e0d94765b94b02af7b0e4ca9fc76 100644 (file)
@@ -194,6 +194,31 @@ static inline int fdt_setprop_uxx(void *fdt, int nodeoffset, const char *name,
                return fdt_setprop_u32(fdt, nodeoffset, name, (uint32_t)val);
 }
 
+int fdt_root(void *fdt)
+{
+       char *serial;
+       int err;
+
+       err = fdt_check_header(fdt);
+       if (err < 0) {
+               printf("fdt_root: %s\n", fdt_strerror(err));
+               return err;
+       }
+
+       serial = getenv("serial#");
+       if (serial) {
+               err = fdt_setprop(fdt, 0, "serial-number", serial,
+                                 strlen(serial) + 1);
+
+               if (err < 0) {
+                       printf("WARNING: could not set serial-number %s.\n",
+                              fdt_strerror(err));
+                       return err;
+               }
+       }
+
+       return 0;
+}
 
 int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end)
 {
index 7e2da7b3b7218d10c40167e1d80c0d678ff47c1a..80e3e63805cdca31ec0c780c45ab79c3ec601dc1 100644 (file)
@@ -471,6 +471,10 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
        int ret = -EPERM;
        int fdt_ret;
 
+       if (fdt_root(blob) < 0) {
+               printf("ERROR: root node setup failed\n");
+               goto err;
+       }
        if (fdt_chosen(blob) < 0) {
                printf("ERROR: /chosen node create failed\n");
                goto err;
diff --git a/doc/device-tree-bindings/root.txt b/doc/device-tree-bindings/root.txt
new file mode 100644 (file)
index 0000000..001ccf3
--- /dev/null
@@ -0,0 +1,4 @@
+The root node
+
+Optional properties:
+  - serial-number : a string representing the device's serial number
index 5d4f28dc786e7b91e58b4b1b3190f4ad96e0d411..56185c9531605729a3f58faa5b30ed111c145534 100644 (file)
@@ -16,6 +16,7 @@ u32 fdt_getprop_u32_default_node(const void *fdt, int off, int cell,
                                const char *prop, const u32 dflt);
 u32 fdt_getprop_u32_default(const void *fdt, const char *path,
                                const char *prop, const u32 dflt);
+int fdt_root(void *fdt);
 int fdt_chosen(void *fdt);
 int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end);
 void do_fixup_by_path(void *fdt, const char *path, const char *prop,