ARM: 8804/1: zImage: atags_to_fdt: add serial-number for ATAG_SERIAL
authorBen Dooks <ben-linux@fluff.org>
Fri, 12 Oct 2018 08:12:01 +0000 (09:12 +0100)
committerRussell King <rmk+kernel@armlinux.org.uk>
Thu, 8 Nov 2018 10:57:08 +0000 (10:57 +0000)
If the system passes an ATAG_SERIAL, convert that into a /serial-number
node so that the system serial number will be passed through the FDT and
be present under the kernel.

Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
arch/arm/boot/compressed/atags_to_fdt.c

index 41fa731..330cd3c 100644 (file)
@@ -98,6 +98,24 @@ static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline)
        setprop_string(fdt, "/chosen", "bootargs", cmdline);
 }
 
+static void hex_str(char *out, uint32_t value)
+{
+       uint32_t digit;
+       int idx;
+
+       for (idx = 7; idx >= 0; idx--) {
+               digit = value >> 28;
+               value <<= 4;
+               digit &= 0xf;
+               if (digit < 10)
+                       digit += '0';
+               else
+                       digit += 'A'-10;
+               *out++ = digit;
+       }
+       *out = '\0';
+}
+
 /*
  * Convert and fold provided ATAGs into the provided FDT.
  *
@@ -180,6 +198,11 @@ int atags_to_fdt(void *atag_list, void *fdt, int total_space)
                                        initrd_start);
                        setprop_cell(fdt, "/chosen", "linux,initrd-end",
                                        initrd_start + initrd_size);
+               } else if (atag->hdr.tag == ATAG_SERIAL) {
+                       char serno[16+2];
+                       hex_str(serno, atag->u.serialnr.high);
+                       hex_str(serno+8, atag->u.serialnr.low);
+                       setprop_string(fdt, "/", "serial-number", serno);
                }
        }