From 10be5b5d3a8d8dd1aa8be95d339c0fdf498c3687 Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Thu, 21 May 2015 11:27:03 +0200 Subject: 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 Reviewed-by: Simon Glass diff --git a/common/fdt_support.c b/common/fdt_support.c index 9e50148..10648b5 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 7e2da7b..80e3e63 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; diff --git a/doc/device-tree-bindings/root.txt b/doc/device-tree-bindings/root.txt new file mode 100644 index 0000000..001ccf3 --- /dev/null +++ b/doc/device-tree-bindings/root.txt @@ -0,0 +1,4 @@ +The root node + +Optional properties: + - serial-number : a string representing the device's serial number diff --git a/include/fdt_support.h b/include/fdt_support.h index 5d4f28d..56185c9 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -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, -- cgit v0.10.2 From 3c4c142e5deed2a9362e65e45372044652ac57b5 Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Sun, 24 May 2015 12:01:53 +0200 Subject: fdt: Documentation for a few support functions aside their prototypes This instroduces comments that explain the purpose, parameters and return codes of a few fdt support functions, that are used to fill the fdt. Signed-off-by: Paul Kocialkowski Acked-by: Simon Glass diff --git a/include/fdt_support.h b/include/fdt_support.h index 56185c9..0edc4fa 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -16,9 +16,35 @@ 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); + +/** + * Add data to the root of the FDT before booting the OS. + * + * See doc/device-tree-bindings/root.txt + * + * @param fdt FDT address in memory + * @return 0 if ok, or -FDT_ERR_... on error + */ int fdt_root(void *fdt); + +/** + * Add chosen data the FDT before booting the OS. + * + * In particular, this adds the kernel command line (bootargs) to the FDT. + * + * @param fdt FDT address in memory + * @return 0 if ok, or -FDT_ERR_... on error + */ int fdt_chosen(void *fdt); + +/** + * Add initrd information to the FDT before booting the OS. + * + * @param fdt FDT address in memory + * @return 0 if ok, or -FDT_ERR_... on error + */ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end); + void do_fixup_by_path(void *fdt, const char *path, const char *prop, const void *val, int len, int create); void do_fixup_by_path_u32(void *fdt, const char *path, const char *prop, -- cgit v0.10.2