diff options
author | Paul Kocialkowski <contact@paulk.fr> | 2015-05-21 11:27:03 +0200 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2015-06-05 08:32:07 -0600 |
commit | 10be5b5d3a8d8dd1aa8be95d339c0fdf498c3687 (patch) | |
tree | 39c7a6addc8e855cdd0da37561e1224c28e59997 /common | |
parent | d8abb46b37fadff0349adb376df6d3ecd09ee7d1 (diff) |
fdt: Pass the device serial number through devicetree
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>
Diffstat (limited to 'common')
-rw-r--r-- | common/fdt_support.c | 25 | ||||
-rw-r--r-- | common/image-fdt.c | 4 |
2 files changed, 29 insertions, 0 deletions
diff --git a/common/fdt_support.c b/common/fdt_support.c index 9e501484625..10648b5a4a8 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -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) { diff --git a/common/image-fdt.c b/common/image-fdt.c index 7e2da7b3b72..80e3e63805c 100644 --- a/common/image-fdt.c +++ b/common/image-fdt.c @@ -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; |