[COMMON] script: dtc: Update dtc for Device Tree Overlay
authorHyunki Koo <hyunki00.koo@samsung.com>
Mon, 29 Jan 2018 11:36:24 +0000 (20:36 +0900)
committerJungi Lee <jungilsi.lee@samsung.com>
Thu, 19 Jul 2018 01:48:54 +0000 (10:48 +0900)
Change-Id: I00b8471767b066b614d979517b85d520007b07f3
Signed-off-by: Changki Kim <changki.kim@samsung.com>
26 files changed:
scripts/dtc/Makefile
scripts/dtc/checks.c
scripts/dtc/data.c
scripts/dtc/dt_to_config [changed mode: 0755->0644]
scripts/dtc/dtc-lexer.l
scripts/dtc/dtc-lexer.lex.c_shipped
scripts/dtc/dtc-parser.tab.c_shipped
scripts/dtc/dtc-parser.y
scripts/dtc/dtc.c
scripts/dtc/dtc.h
scripts/dtc/dtx_diff [changed mode: 0755->0644]
scripts/dtc/fdtdump.c
scripts/dtc/flattree.c
scripts/dtc/libfdt/fdt_addresses.c [new file with mode: 0644]
scripts/dtc/libfdt/fdt_overlay.c [new file with mode: 0644]
scripts/dtc/libfdt/fdt_rw.c
scripts/dtc/libfdt/libfdt.h
scripts/dtc/libfdt/libfdt_env.h
scripts/dtc/livetree.c
scripts/dtc/srcpos.h
scripts/dtc/treesource.c
scripts/dtc/update-dtc-source.sh [changed mode: 0755->0644]
scripts/dtc/util.c
scripts/dtc/util.h
scripts/dtc/version_gen.h
scripts/dtc/version_non_gen.h [new file with mode: 0644]

index 0dc922bb7aea524ca251a5ac345fc00c20c5617e..2a48022c41e7d184660c59de87fa7dce0b345d4b 100644 (file)
@@ -1,4 +1,3 @@
-# SPDX-License-Identifier: GPL-2.0
 # scripts/dtc makefile
 
 hostprogs-y    := dtc
index 62ea8f83d4a023a9780c6dc219d8f29ba244c506..2a8fdcdebcb7f9a84261e374adeb33c75c309ea7 100644 (file)
@@ -72,16 +72,17 @@ struct check {
 #define CHECK(_nm, _fn, _d, ...) \
        CHECK_ENTRY(_nm, _fn, _d, false, false, __VA_ARGS__)
 
-static inline void  PRINTF(3, 4) check_msg(struct check *c, struct dt_info *dti,
-                                          const char *fmt, ...)
+#ifdef __GNUC__
+static inline void check_msg(struct check *c, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
+#endif
+static inline void check_msg(struct check *c, const char *fmt, ...)
 {
        va_list ap;
        va_start(ap, fmt);
 
        if ((c->warn && (quiet < 1))
            || (c->error && (quiet < 2))) {
-               fprintf(stderr, "%s: %s (%s): ",
-                       strcmp(dti->outname, "-") ? dti->outname : "<stdout>",
+               fprintf(stderr, "%s (%s): ",
                        (c->error) ? "ERROR" : "Warning", c->name);
                vfprintf(stderr, fmt, ap);
                fprintf(stderr, "\n");
@@ -89,11 +90,11 @@ static inline void  PRINTF(3, 4) check_msg(struct check *c, struct dt_info *dti,
        va_end(ap);
 }
 
-#define FAIL(c, dti, ...)                                              \
-       do {                                                            \
-               TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__);  \
-               (c)->status = FAILED;                                   \
-               check_msg((c), dti, __VA_ARGS__);                       \
+#define FAIL(c, ...) \
+       do { \
+               TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \
+               (c)->status = FAILED; \
+               check_msg((c), __VA_ARGS__); \
        } while (0)
 
 static void check_nodes_props(struct check *c, struct dt_info *dti, struct node *node)
@@ -126,7 +127,7 @@ static bool run_check(struct check *c, struct dt_info *dti)
                error = error || run_check(prq, dti);
                if (prq->status != PASSED) {
                        c->status = PREREQ;
-                       check_msg(c, dti, "Failed prerequisite '%s'",
+                       check_msg(c, "Failed prerequisite '%s'",
                                  c->prereq[i]->name);
                }
        }
@@ -156,7 +157,7 @@ out:
 static inline void check_always_fail(struct check *c, struct dt_info *dti,
                                     struct node *node)
 {
-       FAIL(c, dti, "always_fail check");
+       FAIL(c, "always_fail check");
 }
 CHECK(always_fail, check_always_fail, NULL);
 
@@ -171,7 +172,7 @@ static void check_is_string(struct check *c, struct dt_info *dti,
                return; /* Not present, assumed ok */
 
        if (!data_is_one_string(prop->val))
-               FAIL(c, dti, "\"%s\" property in %s is not a string",
+               FAIL(c, "\"%s\" property in %s is not a string",
                     propname, node->fullpath);
 }
 #define WARNING_IF_NOT_STRING(nm, propname) \
@@ -190,7 +191,7 @@ static void check_is_cell(struct check *c, struct dt_info *dti,
                return; /* Not present, assumed ok */
 
        if (prop->val.len != sizeof(cell_t))
-               FAIL(c, dti, "\"%s\" property in %s is not a single cell",
+               FAIL(c, "\"%s\" property in %s is not a single cell",
                     propname, node->fullpath);
 }
 #define WARNING_IF_NOT_CELL(nm, propname) \
@@ -212,7 +213,7 @@ static void check_duplicate_node_names(struct check *c, struct dt_info *dti,
                     child2;
                     child2 = child2->next_sibling)
                        if (streq(child->name, child2->name))
-                               FAIL(c, dti, "Duplicate node name %s",
+                               FAIL(c, "Duplicate node name %s",
                                     child->fullpath);
 }
 ERROR(duplicate_node_names, check_duplicate_node_names, NULL);
@@ -227,7 +228,7 @@ static void check_duplicate_property_names(struct check *c, struct dt_info *dti,
                        if (prop2->deleted)
                                continue;
                        if (streq(prop->name, prop2->name))
-                               FAIL(c, dti, "Duplicate property name %s in %s",
+                               FAIL(c, "Duplicate property name %s in %s",
                                     prop->name, node->fullpath);
                }
        }
@@ -246,7 +247,7 @@ static void check_node_name_chars(struct check *c, struct dt_info *dti,
        int n = strspn(node->name, c->data);
 
        if (n < strlen(node->name))
-               FAIL(c, dti, "Bad character '%c' in node %s",
+               FAIL(c, "Bad character '%c' in node %s",
                     node->name[n], node->fullpath);
 }
 ERROR(node_name_chars, check_node_name_chars, PROPNODECHARS "@");
@@ -257,7 +258,7 @@ static void check_node_name_chars_strict(struct check *c, struct dt_info *dti,
        int n = strspn(node->name, c->data);
 
        if (n < node->basenamelen)
-               FAIL(c, dti, "Character '%c' not recommended in node %s",
+               FAIL(c, "Character '%c' not recommended in node %s",
                     node->name[n], node->fullpath);
 }
 CHECK(node_name_chars_strict, check_node_name_chars_strict, PROPNODECHARSSTRICT);
@@ -266,7 +267,7 @@ static void check_node_name_format(struct check *c, struct dt_info *dti,
                                   struct node *node)
 {
        if (strchr(get_unitname(node), '@'))
-               FAIL(c, dti, "Node %s has multiple '@' characters in name",
+               FAIL(c, "Node %s has multiple '@' characters in name",
                     node->fullpath);
 }
 ERROR(node_name_format, check_node_name_format, NULL, &node_name_chars);
@@ -285,11 +286,11 @@ static void check_unit_address_vs_reg(struct check *c, struct dt_info *dti,
 
        if (prop) {
                if (!unitname[0])
-                       FAIL(c, dti, "Node %s has a reg or ranges property, but no unit name",
+                       FAIL(c, "Node %s has a reg or ranges property, but no unit name",
                            node->fullpath);
        } else {
                if (unitname[0])
-                       FAIL(c, dti, "Node %s has a unit name, but no reg property",
+                       FAIL(c, "Node %s has a unit name, but no reg property",
                            node->fullpath);
        }
 }
@@ -304,7 +305,7 @@ static void check_property_name_chars(struct check *c, struct dt_info *dti,
                int n = strspn(prop->name, c->data);
 
                if (n < strlen(prop->name))
-                       FAIL(c, dti, "Bad character '%c' in property name \"%s\", node %s",
+                       FAIL(c, "Bad character '%c' in property name \"%s\", node %s",
                             prop->name[n], prop->name, node->fullpath);
        }
 }
@@ -336,7 +337,7 @@ static void check_property_name_chars_strict(struct check *c,
                        n = strspn(name, c->data);
                }
                if (n < strlen(name))
-                       FAIL(c, dti, "Character '%c' not recommended in property name \"%s\", node %s",
+                       FAIL(c, "Character '%c' not recommended in property name \"%s\", node %s",
                             name[n], prop->name, node->fullpath);
        }
 }
@@ -370,7 +371,7 @@ static void check_duplicate_label(struct check *c, struct dt_info *dti,
                return;
 
        if ((othernode != node) || (otherprop != prop) || (othermark != mark))
-               FAIL(c, dti, "Duplicate label '%s' on " DESCLABEL_FMT
+               FAIL(c, "Duplicate label '%s' on " DESCLABEL_FMT
                     " and " DESCLABEL_FMT,
                     label, DESCLABEL_ARGS(node, prop, mark),
                     DESCLABEL_ARGS(othernode, otherprop, othermark));
@@ -410,7 +411,7 @@ static cell_t check_phandle_prop(struct check *c, struct dt_info *dti,
                return 0;
 
        if (prop->val.len != sizeof(cell_t)) {
-               FAIL(c, dti, "%s has bad length (%d) %s property",
+               FAIL(c, "%s has bad length (%d) %s property",
                     node->fullpath, prop->val.len, prop->name);
                return 0;
        }
@@ -422,7 +423,7 @@ static cell_t check_phandle_prop(struct check *c, struct dt_info *dti,
                        /* "Set this node's phandle equal to some
                         * other node's phandle".  That's nonsensical
                         * by construction. */ {
-                       FAIL(c, dti, "%s in %s is a reference to another node",
+                       FAIL(c, "%s in %s is a reference to another node",
                             prop->name, node->fullpath);
                }
                /* But setting this node's phandle equal to its own
@@ -436,7 +437,7 @@ static cell_t check_phandle_prop(struct check *c, struct dt_info *dti,
        phandle = propval_cell(prop);
 
        if ((phandle == 0) || (phandle == -1)) {
-               FAIL(c, dti, "%s has bad value (0x%x) in %s property",
+               FAIL(c, "%s has bad value (0x%x) in %s property",
                     node->fullpath, phandle, prop->name);
                return 0;
        }
@@ -463,7 +464,7 @@ static void check_explicit_phandles(struct check *c, struct dt_info *dti,
                return;
 
        if (linux_phandle && phandle && (phandle != linux_phandle))
-               FAIL(c, dti, "%s has mismatching 'phandle' and 'linux,phandle'"
+               FAIL(c, "%s has mismatching 'phandle' and 'linux,phandle'"
                     " properties", node->fullpath);
 
        if (linux_phandle && !phandle)
@@ -471,7 +472,7 @@ static void check_explicit_phandles(struct check *c, struct dt_info *dti,
 
        other = get_node_by_phandle(root, phandle);
        if (other && (other != node)) {
-               FAIL(c, dti, "%s has duplicated phandle 0x%x (seen before at %s)",
+               FAIL(c, "%s has duplicated phandle 0x%x (seen before at %s)",
                     node->fullpath, phandle, other->fullpath);
                return;
        }
@@ -496,7 +497,7 @@ static void check_name_properties(struct check *c, struct dt_info *dti,
 
        if ((prop->val.len != node->basenamelen+1)
            || (memcmp(prop->val.val, node->name, node->basenamelen) != 0)) {
-               FAIL(c, dti, "\"name\" property in %s is incorrect (\"%s\" instead"
+               FAIL(c, "\"name\" property in %s is incorrect (\"%s\" instead"
                     " of base node name)", node->fullpath, prop->val.val);
        } else {
                /* The name property is correct, and therefore redundant.
@@ -529,18 +530,18 @@ static void fixup_phandle_references(struct check *c, struct dt_info *dti,
                        assert(m->offset + sizeof(cell_t) <= prop->val.len);
 
                        refnode = get_node_by_ref(dt, m->ref);
-                       if (! refnode) {
+                       if (!refnode) {
                                if (!(dti->dtsflags & DTSF_PLUGIN))
-                                       FAIL(c, dti, "Reference to non-existent node or "
+                                       FAIL(c, "Reference to non-existent node or "
                                                        "label \"%s\"\n", m->ref);
                                else /* mark the entry as unresolved */
-                                       *((fdt32_t *)(prop->val.val + m->offset)) =
+                                       *((cell_t *)(prop->val.val + m->offset)) =
                                                cpu_to_fdt32(0xffffffff);
                                continue;
                        }
 
                        phandle = get_node_phandle(dt, refnode);
-                       *((fdt32_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
+                       *((cell_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
                }
        }
 }
@@ -563,7 +564,7 @@ static void fixup_path_references(struct check *c, struct dt_info *dti,
 
                        refnode = get_node_by_ref(dt, m->ref);
                        if (!refnode) {
-                               FAIL(c, dti, "Reference to non-existent node or label \"%s\"\n",
+                               FAIL(c, "Reference to non-existent node or label \"%s\"\n",
                                     m->ref);
                                continue;
                        }
@@ -622,19 +623,19 @@ static void check_reg_format(struct check *c, struct dt_info *dti,
                return; /* No "reg", that's fine */
 
        if (!node->parent) {
-               FAIL(c, dti, "Root node has a \"reg\" property");
+               FAIL(c, "Root node has a \"reg\" property");
                return;
        }
 
        if (prop->val.len == 0)
-               FAIL(c, dti, "\"reg\" property in %s is empty", node->fullpath);
+               FAIL(c, "\"reg\" property in %s is empty", node->fullpath);
 
        addr_cells = node_addr_cells(node->parent);
        size_cells = node_size_cells(node->parent);
        entrylen = (addr_cells + size_cells) * sizeof(cell_t);
 
        if (!entrylen || (prop->val.len % entrylen) != 0)
-               FAIL(c, dti, "\"reg\" property in %s has invalid length (%d bytes) "
+               FAIL(c, "\"reg\" property in %s has invalid length (%d bytes) "
                     "(#address-cells == %d, #size-cells == %d)",
                     node->fullpath, prop->val.len, addr_cells, size_cells);
 }
@@ -651,7 +652,7 @@ static void check_ranges_format(struct check *c, struct dt_info *dti,
                return;
 
        if (!node->parent) {
-               FAIL(c, dti, "Root node has a \"ranges\" property");
+               FAIL(c, "Root node has a \"ranges\" property");
                return;
        }
 
@@ -663,17 +664,17 @@ static void check_ranges_format(struct check *c, struct dt_info *dti,
 
        if (prop->val.len == 0) {
                if (p_addr_cells != c_addr_cells)
-                       FAIL(c, dti, "%s has empty \"ranges\" property but its "
+                       FAIL(c, "%s has empty \"ranges\" property but its "
                             "#address-cells (%d) differs from %s (%d)",
                             node->fullpath, c_addr_cells, node->parent->fullpath,
                             p_addr_cells);
                if (p_size_cells != c_size_cells)
-                       FAIL(c, dti, "%s has empty \"ranges\" property but its "
+                       FAIL(c, "%s has empty \"ranges\" property but its "
                             "#size-cells (%d) differs from %s (%d)",
                             node->fullpath, c_size_cells, node->parent->fullpath,
                             p_size_cells);
        } else if ((prop->val.len % entrylen) != 0) {
-               FAIL(c, dti, "\"ranges\" property in %s has invalid length (%d bytes) "
+               FAIL(c, "\"ranges\" property in %s has invalid length (%d bytes) "
                     "(parent #address-cells == %d, child #address-cells == %d, "
                     "#size-cells == %d)", node->fullpath, prop->val.len,
                     p_addr_cells, c_addr_cells, c_size_cells);
@@ -681,229 +682,6 @@ static void check_ranges_format(struct check *c, struct dt_info *dti,
 }
 WARNING(ranges_format, check_ranges_format, NULL, &addr_size_cells);
 
-static const struct bus_type pci_bus = {
-       .name = "PCI",
-};
-
-static void check_pci_bridge(struct check *c, struct dt_info *dti, struct node *node)
-{
-       struct property *prop;
-       cell_t *cells;
-
-       prop = get_property(node, "device_type");
-       if (!prop || !streq(prop->val.val, "pci"))
-               return;
-
-       node->bus = &pci_bus;
-
-       if (!strneq(node->name, "pci", node->basenamelen) &&
-           !strneq(node->name, "pcie", node->basenamelen))
-               FAIL(c, dti, "Node %s node name is not \"pci\" or \"pcie\"",
-                            node->fullpath);
-
-       prop = get_property(node, "ranges");
-       if (!prop)
-               FAIL(c, dti, "Node %s missing ranges for PCI bridge (or not a bridge)",
-                            node->fullpath);
-
-       if (node_addr_cells(node) != 3)
-               FAIL(c, dti, "Node %s incorrect #address-cells for PCI bridge",
-                            node->fullpath);
-       if (node_size_cells(node) != 2)
-               FAIL(c, dti, "Node %s incorrect #size-cells for PCI bridge",
-                            node->fullpath);
-
-       prop = get_property(node, "bus-range");
-       if (!prop) {
-               FAIL(c, dti, "Node %s missing bus-range for PCI bridge",
-                            node->fullpath);
-               return;
-       }
-       if (prop->val.len != (sizeof(cell_t) * 2)) {
-               FAIL(c, dti, "Node %s bus-range must be 2 cells",
-                            node->fullpath);
-               return;
-       }
-       cells = (cell_t *)prop->val.val;
-       if (fdt32_to_cpu(cells[0]) > fdt32_to_cpu(cells[1]))
-               FAIL(c, dti, "Node %s bus-range 1st cell must be less than or equal to 2nd cell",
-                            node->fullpath);
-       if (fdt32_to_cpu(cells[1]) > 0xff)
-               FAIL(c, dti, "Node %s bus-range maximum bus number must be less than 256",
-                            node->fullpath);
-}
-WARNING(pci_bridge, check_pci_bridge, NULL,
-       &device_type_is_string, &addr_size_cells);
-
-static void check_pci_device_bus_num(struct check *c, struct dt_info *dti, struct node *node)
-{
-       struct property *prop;
-       unsigned int bus_num, min_bus, max_bus;
-       cell_t *cells;
-
-       if (!node->parent || (node->parent->bus != &pci_bus))
-               return;
-
-       prop = get_property(node, "reg");
-       if (!prop)
-               return;
-
-       cells = (cell_t *)prop->val.val;
-       bus_num = (fdt32_to_cpu(cells[0]) & 0x00ff0000) >> 16;
-
-       prop = get_property(node->parent, "bus-range");
-       if (!prop) {
-               min_bus = max_bus = 0;
-       } else {
-               cells = (cell_t *)prop->val.val;
-               min_bus = fdt32_to_cpu(cells[0]);
-               max_bus = fdt32_to_cpu(cells[0]);
-       }
-       if ((bus_num < min_bus) || (bus_num > max_bus))
-               FAIL(c, dti, "Node %s PCI bus number %d out of range, expected (%d - %d)",
-                    node->fullpath, bus_num, min_bus, max_bus);
-}
-WARNING(pci_device_bus_num, check_pci_device_bus_num, NULL, &reg_format, &pci_bridge);
-
-static void check_pci_device_reg(struct check *c, struct dt_info *dti, struct node *node)
-{
-       struct property *prop;
-       const char *unitname = get_unitname(node);
-       char unit_addr[5];
-       unsigned int dev, func, reg;
-       cell_t *cells;
-
-       if (!node->parent || (node->parent->bus != &pci_bus))
-               return;
-
-       prop = get_property(node, "reg");
-       if (!prop) {
-               FAIL(c, dti, "Node %s missing PCI reg property", node->fullpath);
-               return;
-       }
-
-       cells = (cell_t *)prop->val.val;
-       if (cells[1] || cells[2])
-               FAIL(c, dti, "Node %s PCI reg config space address cells 2 and 3 must be 0",
-                            node->fullpath);
-
-       reg = fdt32_to_cpu(cells[0]);
-       dev = (reg & 0xf800) >> 11;
-       func = (reg & 0x700) >> 8;
-
-       if (reg & 0xff000000)
-               FAIL(c, dti, "Node %s PCI reg address is not configuration space",
-                            node->fullpath);
-       if (reg & 0x000000ff)
-               FAIL(c, dti, "Node %s PCI reg config space address register number must be 0",
-                            node->fullpath);
-
-       if (func == 0) {
-               snprintf(unit_addr, sizeof(unit_addr), "%x", dev);
-               if (streq(unitname, unit_addr))
-                       return;
-       }
-
-       snprintf(unit_addr, sizeof(unit_addr), "%x,%x", dev, func);
-       if (streq(unitname, unit_addr))
-               return;
-
-       FAIL(c, dti, "Node %s PCI unit address format error, expected \"%s\"",
-            node->fullpath, unit_addr);
-}
-WARNING(pci_device_reg, check_pci_device_reg, NULL, &reg_format, &pci_bridge);
-
-static const struct bus_type simple_bus = {
-       .name = "simple-bus",
-};
-
-static bool node_is_compatible(struct node *node, const char *compat)
-{
-       struct property *prop;
-       const char *str, *end;
-
-       prop = get_property(node, "compatible");
-       if (!prop)
-               return false;
-
-       for (str = prop->val.val, end = str + prop->val.len; str < end;
-            str += strnlen(str, end - str) + 1) {
-               if (strneq(str, compat, end - str))
-                       return true;
-       }
-       return false;
-}
-
-static void check_simple_bus_bridge(struct check *c, struct dt_info *dti, struct node *node)
-{
-       if (node_is_compatible(node, "simple-bus"))
-               node->bus = &simple_bus;
-}
-WARNING(simple_bus_bridge, check_simple_bus_bridge, NULL, &addr_size_cells);
-
-static void check_simple_bus_reg(struct check *c, struct dt_info *dti, struct node *node)
-{
-       struct property *prop;
-       const char *unitname = get_unitname(node);
-       char unit_addr[17];
-       unsigned int size;
-       uint64_t reg = 0;
-       cell_t *cells = NULL;
-
-       if (!node->parent || (node->parent->bus != &simple_bus))
-               return;
-
-       prop = get_property(node, "reg");
-       if (prop)
-               cells = (cell_t *)prop->val.val;
-       else {
-               prop = get_property(node, "ranges");
-               if (prop && prop->val.len)
-                       /* skip of child address */
-                       cells = ((cell_t *)prop->val.val) + node_addr_cells(node);
-       }
-
-       if (!cells) {
-               if (node->parent->parent && !(node->bus == &simple_bus))
-                       FAIL(c, dti, "Node %s missing or empty reg/ranges property", node->fullpath);
-               return;
-       }
-
-       size = node_addr_cells(node->parent);
-       while (size--)
-               reg = (reg << 32) | fdt32_to_cpu(*(cells++));
-
-       snprintf(unit_addr, sizeof(unit_addr), "%llx", (unsigned long long)reg);
-       if (!streq(unitname, unit_addr))
-               FAIL(c, dti, "Node %s simple-bus unit address format error, expected \"%s\"",
-                    node->fullpath, unit_addr);
-}
-WARNING(simple_bus_reg, check_simple_bus_reg, NULL, &reg_format, &simple_bus_bridge);
-
-static void check_unit_address_format(struct check *c, struct dt_info *dti,
-                                     struct node *node)
-{
-       const char *unitname = get_unitname(node);
-
-       if (node->parent && node->parent->bus)
-               return;
-
-       if (!unitname[0])
-               return;
-
-       if (!strncmp(unitname, "0x", 2)) {
-               FAIL(c, dti, "Node %s unit name should not have leading \"0x\"",
-                   node->fullpath);
-               /* skip over 0x for next test */
-               unitname += 2;
-       }
-       if (unitname[0] == '0' && isxdigit(unitname[1]))
-               FAIL(c, dti, "Node %s unit name should not have leading 0s",
-                   node->fullpath);
-}
-WARNING(unit_address_format, check_unit_address_format, NULL,
-       &node_name_format, &pci_bridge, &simple_bus_bridge);
-
 /*
  * Style checks
  */
@@ -922,11 +700,11 @@ static void check_avoid_default_addr_size(struct check *c, struct dt_info *dti,
                return;
 
        if (node->parent->addr_cells == -1)
-               FAIL(c, dti, "Relying on default #address-cells value for %s",
+               FAIL(c, "Relying on default #address-cells value for %s",
                     node->fullpath);
 
        if (node->parent->size_cells == -1)
-               FAIL(c, dti, "Relying on default #size-cells value for %s",
+               FAIL(c, "Relying on default #size-cells value for %s",
                     node->fullpath);
 }
 WARNING(avoid_default_addr_size, check_avoid_default_addr_size, NULL,
@@ -950,7 +728,7 @@ static void check_obsolete_chosen_interrupt_controller(struct check *c,
 
        prop = get_property(chosen, "interrupt-controller");
        if (prop)
-               FAIL(c, dti, "/chosen has obsolete \"interrupt-controller\" "
+               FAIL(c, "/chosen has obsolete \"interrupt-controller\" "
                     "property");
 }
 WARNING(obsolete_chosen_interrupt_controller,
@@ -975,14 +753,6 @@ static struct check *check_table[] = {
        &addr_size_cells, &reg_format, &ranges_format,
 
        &unit_address_vs_reg,
-       &unit_address_format,
-
-       &pci_bridge,
-       &pci_device_reg,
-       &pci_device_bus_num,
-
-       &simple_bus_bridge,
-       &simple_bus_reg,
 
        &avoid_default_addr_size,
        &obsolete_chosen_interrupt_controller,
index aa37a16c889186aff62274ec708e89dea7dbd971..8cae23746882e4747ea5d13e300484452fc48eee 100644 (file)
@@ -171,9 +171,9 @@ struct data data_merge(struct data d1, struct data d2)
 struct data data_append_integer(struct data d, uint64_t value, int bits)
 {
        uint8_t value_8;
-       fdt16_t value_16;
-       fdt32_t value_32;
-       fdt64_t value_64;
+       uint16_t value_16;
+       uint32_t value_32;
+       uint64_t value_64;
 
        switch (bits) {
        case 8:
@@ -197,14 +197,14 @@ struct data data_append_integer(struct data d, uint64_t value, int bits)
        }
 }
 
-struct data data_append_re(struct data d, uint64_t address, uint64_t size)
+struct data data_append_re(struct data d, const struct fdt_reserve_entry *re)
 {
-       struct fdt_reserve_entry re;
+       struct fdt_reserve_entry bere;
 
-       re.address = cpu_to_fdt64(address);
-       re.size = cpu_to_fdt64(size);
+       bere.address = cpu_to_fdt64(re->address);
+       bere.size = cpu_to_fdt64(re->size);
 
-       return data_append_data(d, &re, sizeof(re));
+       return data_append_data(d, &bere, sizeof(bere));
 }
 
 struct data data_append_cell(struct data d, cell_t word)
old mode 100755 (executable)
new mode 100644 (file)
index 5dfd1bf..9a248b5
@@ -1,4 +1,4 @@
-#!/usr/bin/env perl
+#!/usr/bin/perl
 
 # Copyright 2016 by Frank Rowand
 # Copyright 2016 by Gaurav Minocha
index fd825ebba69cb25e160e057f53bef994970093fc..c600603044f398e7f07ee0ebdc8c025712fd735f 100644 (file)
@@ -62,8 +62,7 @@ static int dts_version = 1;
 
 static void push_input_file(const char *filename);
 static bool pop_input_file(void);
-static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
-
+static void lexical_error(const char *fmt, ...);
 %}
 
 %%
index 64c243772398d614d7cd0a6ec9cfd0d6baeb8da3..e0835ad4a848f3fbae44369bb863b17752ae68b7 100644 (file)
@@ -9,7 +9,7 @@
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 6
-#define YY_FLEX_SUBMINOR_VERSION 1
+#define YY_FLEX_SUBMINOR_VERSION 0
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
@@ -88,13 +88,25 @@ typedef unsigned int flex_uint32_t;
 
 #endif /* ! FLEXINT_H */
 
-/* TODO: this is always defined, so inline it */
-#define yyconst const
+#ifdef __cplusplus
 
-#if defined(__GNUC__) && __GNUC__ >= 3
-#define yynoreturn __attribute__((__noreturn__))
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif /* defined (__STDC__) */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
 #else
-#define yynoreturn
+#define yyconst
 #endif
 
 /* Returned upon end-of-file. */
@@ -155,7 +167,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE;
 typedef size_t yy_size_t;
 #endif
 
-extern int yyleng;
+extern yy_size_t yyleng;
 
 extern FILE *yyin, *yyout;
 
@@ -194,7 +206,7 @@ struct yy_buffer_state
        /* Size of input buffer in bytes, not including room for EOB
         * characters.
         */
-       int yy_buf_size;
+       yy_size_t yy_buf_size;
 
        /* Number of characters read into yy_ch_buf, not including EOB
         * characters.
@@ -222,7 +234,7 @@ struct yy_buffer_state
 
     int yy_bs_lineno; /**< The line count. */
     int yy_bs_column; /**< The column count. */
-
+    
        /* Whether to try to fill the input buffer when we reach the
         * end of it.
         */
@@ -250,7 +262,7 @@ struct yy_buffer_state
 /* Stack of input buffers. */
 static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
 static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
-static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
 
 /* We provide macros for accessing buffer states in case in the
  * future we want to put the buffer states in a more general
@@ -270,10 +282,10 @@ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
 /* yy_hold_char holds the character lost when yytext is formed. */
 static char yy_hold_char;
 static int yy_n_chars;         /* number of characters read into yy_ch_buf */
-int yyleng;
+yy_size_t yyleng;
 
 /* Points to current character in buffer. */
-static char *yy_c_buf_p = NULL;
+static char *yy_c_buf_p = (char *) 0;
 static int yy_init = 0;                /* whether we need to initialize */
 static int yy_start = 0;       /* start state number */
 
@@ -298,7 +310,7 @@ static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file  );
 
 YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size  );
 YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str  );
-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len  );
+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len  );
 
 void *yyalloc (yy_size_t  );
 void *yyrealloc (void *,yy_size_t  );
@@ -335,7 +347,7 @@ void yyfree (void *  );
 
 typedef unsigned char YY_CHAR;
 
-FILE *yyin = NULL, *yyout = NULL;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
 
 typedef int yy_state_type;
 
@@ -352,14 +364,17 @@ extern char *yytext;
 static yy_state_type yy_get_previous_state (void );
 static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
 static int yy_get_next_buffer (void );
-static void yynoreturn yy_fatal_error (yyconst char* msg  );
+#if defined(__GNUC__) && __GNUC__ >= 3
+__attribute__((__noreturn__))
+#endif
+static void yy_fatal_error (yyconst char msg[]  );
 
 /* Done after the current pattern has been matched and before the
  * corresponding action - sets up yytext.
  */
 #define YY_DO_BEFORE_ACTION \
        (yytext_ptr) = yy_bp; \
-       yyleng = (int) (yy_cp - yy_bp); \
+       yyleng = (size_t) (yy_cp - yy_bp); \
        (yy_hold_char) = *yy_cp; \
        *yy_cp = '\0'; \
        (yy_c_buf_p) = yy_cp;
@@ -655,9 +670,8 @@ static int dts_version = 1;
 
 static void push_input_file(const char *filename);
 static bool pop_input_file(void);
-static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
-
-#line 661 "dtc-lexer.lex.c"
+static void lexical_error(const char *fmt, ...);
+#line 675 "dtc-lexer.lex.c"
 
 #define INITIAL 0
 #define BYTESTRING 1
@@ -699,7 +713,7 @@ FILE *yyget_out (void );
 
 void yyset_out  (FILE * _out_str  );
 
-                       int yyget_leng (void );
+yy_size_t yyget_leng (void );
 
 char *yyget_text (void );
 
@@ -720,7 +734,7 @@ extern int yywrap (void );
 #endif
 
 #ifndef YY_NO_UNPUT
-    
+
 #endif
 
 #ifndef yytext_ptr
@@ -756,7 +770,7 @@ static int input (void );
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
+#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -780,7 +794,7 @@ static int input (void );
        else \
                { \
                errno=0; \
-               while ( (result = (int) fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+               while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
                        { \
                        if( errno != EINTR) \
                                { \
@@ -879,9 +893,9 @@ YY_DECL
                }
 
        {
-#line 69 "dtc-lexer.l"
+#line 68 "dtc-lexer.l"
 
-#line 885 "dtc-lexer.lex.c"
+#line 899 "dtc-lexer.lex.c"
 
        while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
@@ -912,7 +926,7 @@ yy_match:
                                if ( yy_current_state >= 166 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
-                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
                while ( yy_current_state != 165 );
@@ -938,7 +952,7 @@ do_action:  /* This label is used only to access EOF actions. */
 case 1:
 /* rule 1 can match eol */
 YY_RULE_SETUP
-#line 70 "dtc-lexer.l"
+#line 69 "dtc-lexer.l"
 {
                        char *name = strchr(yytext, '\"') + 1;
                        yytext[yyleng-1] = '\0';
@@ -948,7 +962,7 @@ YY_RULE_SETUP
 case 2:
 /* rule 2 can match eol */
 YY_RULE_SETUP
-#line 76 "dtc-lexer.l"
+#line 75 "dtc-lexer.l"
 {
                        char *line, *fnstart, *fnend;
                        struct data fn;
@@ -982,7 +996,7 @@ case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(BYTESTRING):
 case YY_STATE_EOF(PROPNODENAME):
 case YY_STATE_EOF(V1):
-#line 105 "dtc-lexer.l"
+#line 104 "dtc-lexer.l"
 {
                        if (!pop_input_file()) {
                                yyterminate();
@@ -992,7 +1006,7 @@ case YY_STATE_EOF(V1):
 case 3:
 /* rule 3 can match eol */
 YY_RULE_SETUP
-#line 111 "dtc-lexer.l"
+#line 110 "dtc-lexer.l"
 {
                        DPRINT("String: %s\n", yytext);
                        yylval.data = data_copy_escape_string(yytext+1,
@@ -1002,7 +1016,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 118 "dtc-lexer.l"
+#line 117 "dtc-lexer.l"
 {
                        DPRINT("Keyword: /dts-v1/\n");
                        dts_version = 1;
@@ -1012,7 +1026,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 125 "dtc-lexer.l"
+#line 124 "dtc-lexer.l"
 {
                        DPRINT("Keyword: /plugin/\n");
                        return DT_PLUGIN;
@@ -1020,7 +1034,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 130 "dtc-lexer.l"
+#line 129 "dtc-lexer.l"
 {
                        DPRINT("Keyword: /memreserve/\n");
                        BEGIN_DEFAULT();
@@ -1029,7 +1043,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 136 "dtc-lexer.l"
+#line 135 "dtc-lexer.l"
 {
                        DPRINT("Keyword: /bits/\n");
                        BEGIN_DEFAULT();
@@ -1038,7 +1052,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 142 "dtc-lexer.l"
+#line 141 "dtc-lexer.l"
 {
                        DPRINT("Keyword: /delete-property/\n");
                        DPRINT("<PROPNODENAME>\n");
@@ -1048,7 +1062,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 149 "dtc-lexer.l"
+#line 148 "dtc-lexer.l"
 {
                        DPRINT("Keyword: /delete-node/\n");
                        DPRINT("<PROPNODENAME>\n");
@@ -1058,7 +1072,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 156 "dtc-lexer.l"
+#line 155 "dtc-lexer.l"
 {
                        DPRINT("Label: %s\n", yytext);
                        yylval.labelref = xstrdup(yytext);
@@ -1068,7 +1082,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 163 "dtc-lexer.l"
+#line 162 "dtc-lexer.l"
 {
                        char *e;
                        DPRINT("Integer Literal: '%s'\n", yytext);
@@ -1094,7 +1108,7 @@ YY_RULE_SETUP
 case 12:
 /* rule 12 can match eol */
 YY_RULE_SETUP
-#line 185 "dtc-lexer.l"
+#line 184 "dtc-lexer.l"
 {
                        struct data d;
                        DPRINT("Character literal: %s\n", yytext);
@@ -1118,7 +1132,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 206 "dtc-lexer.l"
+#line 205 "dtc-lexer.l"
 {      /* label reference */
                        DPRINT("Ref: %s\n", yytext+1);
                        yylval.labelref = xstrdup(yytext+1);
@@ -1127,7 +1141,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 212 "dtc-lexer.l"
+#line 211 "dtc-lexer.l"
 {      /* new-style path reference */
                        yytext[yyleng-1] = '\0';
                        DPRINT("Ref: %s\n", yytext+2);
@@ -1137,7 +1151,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 219 "dtc-lexer.l"
+#line 218 "dtc-lexer.l"
 {
                        yylval.byte = strtol(yytext, NULL, 16);
                        DPRINT("Byte: %02x\n", (int)yylval.byte);
@@ -1146,7 +1160,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 225 "dtc-lexer.l"
+#line 224 "dtc-lexer.l"
 {
                        DPRINT("/BYTESTRING\n");
                        BEGIN_DEFAULT();
@@ -1155,7 +1169,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 231 "dtc-lexer.l"
+#line 230 "dtc-lexer.l"
 {
                        DPRINT("PropNodeName: %s\n", yytext);
                        yylval.propnodename = xstrdup((yytext[0] == '\\') ?
@@ -1166,7 +1180,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 239 "dtc-lexer.l"
+#line 238 "dtc-lexer.l"
 {
                        DPRINT("Binary Include\n");
                        return DT_INCBIN;
@@ -1175,64 +1189,64 @@ YY_RULE_SETUP
 case 19:
 /* rule 19 can match eol */
 YY_RULE_SETUP
-#line 244 "dtc-lexer.l"
+#line 243 "dtc-lexer.l"
 /* eat whitespace */
        YY_BREAK
 case 20:
 /* rule 20 can match eol */
 YY_RULE_SETUP
-#line 245 "dtc-lexer.l"
+#line 244 "dtc-lexer.l"
 /* eat C-style comments */
        YY_BREAK
 case 21:
 /* rule 21 can match eol */
 YY_RULE_SETUP
-#line 246 "dtc-lexer.l"
+#line 245 "dtc-lexer.l"
 /* eat C++-style comments */
        YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 248 "dtc-lexer.l"
+#line 247 "dtc-lexer.l"
 { return DT_LSHIFT; };
        YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 249 "dtc-lexer.l"
+#line 248 "dtc-lexer.l"
 { return DT_RSHIFT; };
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 250 "dtc-lexer.l"
+#line 249 "dtc-lexer.l"
 { return DT_LE; };
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 251 "dtc-lexer.l"
+#line 250 "dtc-lexer.l"
 { return DT_GE; };
        YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 252 "dtc-lexer.l"
+#line 251 "dtc-lexer.l"
 { return DT_EQ; };
        YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 253 "dtc-lexer.l"
+#line 252 "dtc-lexer.l"
 { return DT_NE; };
        YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 254 "dtc-lexer.l"
+#line 253 "dtc-lexer.l"
 { return DT_AND; };
        YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 255 "dtc-lexer.l"
+#line 254 "dtc-lexer.l"
 { return DT_OR; };
        YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 257 "dtc-lexer.l"
+#line 256 "dtc-lexer.l"
 {
                        DPRINT("Char: %c (\\x%02x)\n", yytext[0],
                                (unsigned)yytext[0]);
@@ -1250,10 +1264,10 @@ YY_RULE_SETUP
        YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 272 "dtc-lexer.l"
+#line 271 "dtc-lexer.l"
 ECHO;
        YY_BREAK
-#line 1257 "dtc-lexer.lex.c"
+#line 1271 "dtc-lexer.lex.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -1439,7 +1453,7 @@ static int yy_get_next_buffer (void)
 
        else
                {
-                       int num_to_read =
+                       yy_size_t num_to_read =
                        YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
 
                while ( num_to_read <= 0 )
@@ -1453,7 +1467,7 @@ static int yy_get_next_buffer (void)
 
                        if ( b->yy_is_our_buffer )
                                {
-                               int new_size = b->yy_buf_size * 2;
+                               yy_size_t new_size = b->yy_buf_size * 2;
 
                                if ( new_size <= 0 )
                                        b->yy_buf_size += b->yy_buf_size / 8;
@@ -1466,7 +1480,7 @@ static int yy_get_next_buffer (void)
                                }
                        else
                                /* Can't grow it, we don't own it. */
-                               b->yy_ch_buf = NULL;
+                               b->yy_ch_buf = 0;
 
                        if ( ! b->yy_ch_buf )
                                YY_FATAL_ERROR(
@@ -1549,7 +1563,7 @@ static int yy_get_next_buffer (void)
                        if ( yy_current_state >= 166 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
-               yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                }
 
        return yy_current_state;
@@ -1577,7 +1591,7 @@ static int yy_get_next_buffer (void)
                if ( yy_current_state >= 166 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
-       yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
        yy_is_jam = (yy_current_state == 165);
 
                return yy_is_jam ? 0 : yy_current_state;
@@ -1611,7 +1625,7 @@ static int yy_get_next_buffer (void)
 
                else
                        { /* need more input */
-                       int offset = (yy_c_buf_p) - (yytext_ptr);
+                       yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
                        ++(yy_c_buf_p);
 
                        switch ( yy_get_next_buffer(  ) )
@@ -1635,7 +1649,7 @@ static int yy_get_next_buffer (void)
                                case EOB_ACT_END_OF_FILE:
                                        {
                                        if ( yywrap( ) )
-                                               return 0;
+                                               return EOF;
 
                                        if ( ! (yy_did_buffer_switch_on_eof) )
                                                YY_NEW_FILE;
@@ -1885,7 +1899,7 @@ void yypop_buffer_state (void)
  */
 static void yyensure_buffer_stack (void)
 {
-       int num_to_alloc;
+       yy_size_t num_to_alloc;
     
        if (!(yy_buffer_stack)) {
 
@@ -1893,15 +1907,15 @@ static void yyensure_buffer_stack (void)
                 * scanner will even need a stack. We use 2 instead of 1 to avoid an
                 * immediate realloc on the next call.
          */
-      num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
+               num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
                (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
                                                                (num_to_alloc * sizeof(struct yy_buffer_state*)
                                                                );
                if ( ! (yy_buffer_stack) )
                        YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
-
+                                                                 
                memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-
+                               
                (yy_buffer_stack_max) = num_to_alloc;
                (yy_buffer_stack_top) = 0;
                return;
@@ -1930,7 +1944,7 @@ static void yyensure_buffer_stack (void)
  * @param base the character buffer
  * @param size the size in bytes of the character buffer
  * 
- * @return the newly allocated buffer state object.
+ * @return the newly allocated buffer state object. 
  */
 YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
 {
@@ -1940,7 +1954,7 @@ YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
             base[size-2] != YY_END_OF_BUFFER_CHAR ||
             base[size-1] != YY_END_OF_BUFFER_CHAR )
                /* They forgot to leave room for the EOB's. */
-               return NULL;
+               return 0;
 
        b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
        if ( ! b )
@@ -1949,7 +1963,7 @@ YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
        b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
        b->yy_buf_pos = b->yy_ch_buf = base;
        b->yy_is_our_buffer = 0;
-       b->yy_input_file = NULL;
+       b->yy_input_file = 0;
        b->yy_n_chars = b->yy_buf_size;
        b->yy_is_interactive = 0;
        b->yy_at_bol = 1;
@@ -1972,7 +1986,7 @@ YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
 YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
 {
     
-       return yy_scan_bytes(yystr,(int) strlen(yystr) );
+       return yy_scan_bytes(yystr,strlen(yystr) );
 }
 
 /** Setup the input buffer state to scan the given bytes. The next call to yylex() will
@@ -1982,7 +1996,7 @@ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
  * 
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
+YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, yy_size_t  _yybytes_len )
 {
        YY_BUFFER_STATE b;
        char *buf;
@@ -1990,7 +2004,7 @@ YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
        yy_size_t i;
     
        /* Get memory for full buffer, including space for trailing EOB's. */
-       n = (yy_size_t) _yybytes_len + 2;
+       n = _yybytes_len + 2;
        buf = (char *) yyalloc(n  );
        if ( ! buf )
                YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
@@ -2016,7 +2030,7 @@ YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
 #define YY_EXIT_FAILURE 2
 #endif
 
-static void yynoreturn yy_fatal_error (yyconst char* msg )
+static void yy_fatal_error (yyconst char* msg )
 {
                        (void) fprintf( stderr, "%s\n", msg );
        exit( YY_EXIT_FAILURE );
@@ -2046,7 +2060,7 @@ static void yynoreturn yy_fatal_error (yyconst char* msg )
  */
 int yyget_lineno  (void)
 {
-    
+        
     return yylineno;
 }
 
@@ -2069,7 +2083,7 @@ FILE *yyget_out  (void)
 /** Get the length of the current token.
  * 
  */
-int yyget_leng  (void)
+yy_size_t yyget_leng  (void)
 {
         return yyleng;
 }
@@ -2125,10 +2139,10 @@ static int yy_init_globals (void)
      * This function is called from yylex_destroy(), so don't allocate here.
      */
 
-    (yy_buffer_stack) = NULL;
+    (yy_buffer_stack) = 0;
     (yy_buffer_stack_top) = 0;
     (yy_buffer_stack_max) = 0;
-    (yy_c_buf_p) = NULL;
+    (yy_c_buf_p) = (char *) 0;
     (yy_init) = 0;
     (yy_start) = 0;
 
@@ -2137,8 +2151,8 @@ static int yy_init_globals (void)
     yyin = stdin;
     yyout = stdout;
 #else
-    yyin = NULL;
-    yyout = NULL;
+    yyin = (FILE *) 0;
+    yyout = (FILE *) 0;
 #endif
 
     /* For future reference: Set errno on error, since we are called by
@@ -2176,7 +2190,6 @@ int yylex_destroy  (void)
 #ifndef yytext_ptr
 static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
 {
-               
        int i;
        for ( i = 0; i < n; ++i )
                s1[i] = s2[i];
@@ -2196,12 +2209,11 @@ static int yy_flex_strlen (yyconst char * s )
 
 void *yyalloc (yy_size_t  size )
 {
-                       return malloc(size);
+                       return (void *) malloc( size );
 }
 
 void *yyrealloc  (void * ptr, yy_size_t  size )
 {
-               
        /* The cast to (char *) in the following accommodates both
         * implementations that use char* generic pointers, and those
         * that use void* generic pointers.  It works with the latter
@@ -2209,7 +2221,7 @@ void *yyrealloc  (void * ptr, yy_size_t  size )
         * any pointer type to void*, and deal with argument conversions
         * as though doing an assignment.
         */
-       return realloc(ptr, size);
+       return (void *) realloc( (char *) ptr, size );
 }
 
 void yyfree (void * ptr )
@@ -2219,7 +2231,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 272 "dtc-lexer.l"
+#line 271 "dtc-lexer.l"
 
 
 
index 0a7a5ed86f042f52a8811c11f14125319df8a712..aea514fa69286401700e2d6786af0bd587acd8b4 100644 (file)
@@ -448,7 +448,7 @@ union yyalloc
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  30
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  84
+#define YYNRULES  85
 /* YYNSTATES -- Number of states.  */
 #define YYNSTATES  149
 
@@ -499,14 +499,14 @@ static const yytype_uint8 yytranslate[] =
 static const yytype_uint16 yyrline[] =
 {
        0,   109,   109,   117,   121,   128,   129,   139,   142,   149,
-     153,   161,   165,   170,   181,   191,   206,   214,   217,   224,
-     228,   232,   236,   244,   248,   252,   256,   260,   276,   286,
-     294,   297,   301,   308,   324,   329,   348,   362,   369,   370,
-     371,   378,   382,   383,   387,   388,   392,   393,   397,   398,
-     402,   403,   407,   408,   412,   413,   414,   418,   419,   420,
-     421,   422,   426,   427,   428,   432,   433,   434,   438,   439,
-     448,   457,   461,   462,   463,   464,   469,   472,   476,   484,
-     487,   491,   499,   503,   507
+     153,   161,   165,   170,   181,   200,   213,   220,   228,   231,
+     238,   242,   246,   250,   258,   262,   266,   270,   274,   290,
+     300,   308,   311,   315,   322,   338,   343,   362,   376,   383,
+     384,   385,   392,   396,   397,   401,   402,   406,   407,   411,
+     412,   416,   417,   421,   422,   426,   427,   428,   432,   433,
+     434,   435,   436,   440,   441,   442,   446,   447,   448,   452,
+     453,   462,   471,   475,   476,   477,   478,   483,   486,   490,
+     498,   501,   505,   513,   517,   521
 };
 #endif
 
@@ -582,20 +582,20 @@ static const yytype_int8 yypact[] =
 static const yytype_uint8 yydefact[] =
 {
        0,     0,     0,     5,     7,     3,     1,     6,     0,     0,
-       0,     7,     0,    38,    39,     0,     0,    10,     0,     2,
-       8,     4,     0,     0,     0,    72,     0,    41,    42,    44,
-      46,    48,    50,    52,    54,    57,    64,    67,    71,     0,
-      17,    11,     0,     0,     0,     0,    73,    74,    75,    40,
+      16,     7,     0,    39,    40,     0,     0,    10,     0,     2,
+       8,     4,     0,     0,     0,    73,     0,    42,    43,    45,
+      47,    49,    51,    53,    55,    58,    65,    68,    72,     0,
+      18,    11,     0,     0,     0,     0,    74,    75,    76,    41,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     9,
-      79,     0,     0,    14,    12,    45,     0,    47,    49,    51,
-      53,    55,    56,    60,    61,    59,    58,    62,    63,    65,
-      66,    69,    68,    70,     0,     0,     0,     0,    18,     0,
-      79,    15,    13,     0,     0,     0,    20,    30,    82,    22,
-      84,     0,    81,    80,    43,    21,    83,     0,     0,    16,
-      29,    19,    31,     0,    23,    32,    26,     0,    76,    34,
-       0,     0,     0,     0,    37,    36,    24,    35,    33,     0,
-      77,    78,    25,     0,    28,     0,     0,     0,    27
+      80,     0,     0,    14,    12,    46,     0,    48,    50,    52,
+      54,    56,    57,    61,    62,    60,    59,    63,    64,    66,
+      67,    70,    69,    71,     0,     0,     0,     0,    19,     0,
+      80,    15,    13,     0,     0,     0,    21,    31,    83,    23,
+      85,     0,    82,    81,    44,    22,    84,     0,     0,    17,
+      30,    20,    32,     0,    24,    33,    27,     0,    77,    35,
+       0,     0,     0,     0,    38,    37,    25,    36,    34,     0,
+      78,    79,    26,     0,    29,     0,     0,     0,    28
 };
 
   /* YYPGOTO[NTERM-NUM].  */
@@ -678,28 +678,28 @@ static const yytype_uint8 yystos[] =
 static const yytype_uint8 yyr1[] =
 {
        0,    48,    49,    50,    50,    51,    51,    52,    52,    53,
-      53,    54,    54,    54,    54,    54,    55,    56,    56,    57,
-      57,    57,    57,    58,    58,    58,    58,    58,    58,    58,
-      59,    59,    59,    60,    60,    60,    60,    60,    61,    61,
-      61,    62,    63,    63,    64,    64,    65,    65,    66,    66,
-      67,    67,    68,    68,    69,    69,    69,    70,    70,    70,
-      70,    70,    71,    71,    71,    72,    72,    72,    73,    73,
-      73,    73,    74,    74,    74,    74,    75,    75,    75,    76,
-      76,    76,    77,    77,    77
+      53,    54,    54,    54,    54,    54,    54,    55,    56,    56,
+      57,    57,    57,    57,    58,    58,    58,    58,    58,    58,
+      58,    59,    59,    59,    60,    60,    60,    60,    60,    61,
+      61,    61,    62,    63,    63,    64,    64,    65,    65,    66,
+      66,    67,    67,    68,    68,    69,    69,    69,    70,    70,
+      70,    70,    70,    71,    71,    71,    72,    72,    72,    73,
+      73,    73,    73,    74,    74,    74,    74,    75,    75,    75,
+      76,    76,    76,    77,    77,    77
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
 static const yytype_uint8 yyr2[] =
 {
        0,     2,     3,     2,     4,     1,     2,     0,     2,     4,
-       2,     2,     3,     4,     3,     4,     5,     0,     2,     4,
-       2,     3,     2,     2,     3,     4,     2,     9,     5,     2,
-       0,     2,     2,     3,     1,     2,     2,     2,     1,     1,
-       3,     1,     1,     5,     1,     3,     1,     3,     1,     3,
-       1,     3,     1,     3,     1,     3,     3,     1,     3,     3,
-       3,     3,     3,     3,     1,     3,     3,     1,     3,     3,
-       3,     1,     1,     2,     2,     2,     0,     2,     2,     0,
-       2,     2,     2,     3,     2
+       2,     2,     3,     4,     3,     4,     0,     5,     0,     2,
+       4,     2,     3,     2,     2,     3,     4,     2,     9,     5,
+       2,     0,     2,     2,     3,     1,     2,     2,     2,     1,
+       1,     3,     1,     1,     5,     1,     3,     1,     3,     1,
+       3,     1,     3,     1,     3,     1,     3,     3,     1,     3,
+       3,     3,     3,     3,     3,     1,     3,     3,     1,     3,
+       3,     3,     1,     1,     2,     2,     2,     0,     2,     2,
+       0,     2,     2,     2,     3,     2
 };
 
 
@@ -1572,17 +1572,26 @@ yyreduce:
     {
                        struct node *target = get_node_by_ref((yyvsp[-2].node), (yyvsp[-1].labelref));
 
-                       if (target)
+                       if (target) {
                                merge_nodes(target, (yyvsp[0].node));
-                       else
-                               ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref));
+                       } else {
+                               /*
+                                * We rely on the rule being always:
+                                *   versioninfo plugindecl memreserves devicetree
+                                * so $-1 is what we want (plugindecl)
+                                */
+                               if ((yyvsp[(-1) - (3)].flags) & DTSF_PLUGIN)
+                                       add_orphan_node((yyvsp[-2].node), (yyvsp[0].node), (yyvsp[-1].labelref));
+                               else
+                                       ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref));
+                       }
                        (yyval.node) = (yyvsp[-2].node);
                }
-#line 1582 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1591 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
   case 15:
-#line 192 "dtc-parser.y" /* yacc.c:1646  */
+#line 201 "dtc-parser.y" /* yacc.c:1646  */
     {
                        struct node *target = get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].labelref));
 
@@ -1594,100 +1603,109 @@ yyreduce:
 
                        (yyval.node) = (yyvsp[-3].node);
                }
-#line 1598 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1607 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
   case 16:
-#line 207 "dtc-parser.y" /* yacc.c:1646  */
+#line 213 "dtc-parser.y" /* yacc.c:1646  */
     {
-                       (yyval.node) = build_node((yyvsp[-3].proplist), (yyvsp[-2].nodelist));
+                       /* build empty node */
+                       (yyval.node) = name_node(build_node(NULL, NULL), "");
                }
-#line 1606 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1616 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
   case 17:
-#line 214 "dtc-parser.y" /* yacc.c:1646  */
+#line 221 "dtc-parser.y" /* yacc.c:1646  */
     {
-                       (yyval.proplist) = NULL;
+                       (yyval.node) = build_node((yyvsp[-3].proplist), (yyvsp[-2].nodelist));
                }
-#line 1614 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1624 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
   case 18:
-#line 218 "dtc-parser.y" /* yacc.c:1646  */
+#line 228 "dtc-parser.y" /* yacc.c:1646  */
     {
-                       (yyval.proplist) = chain_property((yyvsp[0].prop), (yyvsp[-1].proplist));
+                       (yyval.proplist) = NULL;
                }
-#line 1622 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1632 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
   case 19:
-#line 225 "dtc-parser.y" /* yacc.c:1646  */
+#line 232 "dtc-parser.y" /* yacc.c:1646  */
     {
-                       (yyval.prop) = build_property((yyvsp[-3].propnodename), (yyvsp[-1].data));
+                       (yyval.proplist) = chain_property((yyvsp[0].prop), (yyvsp[-1].proplist));
                }
-#line 1630 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1640 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
   case 20:
-#line 229 "dtc-parser.y" /* yacc.c:1646  */
+#line 239 "dtc-parser.y" /* yacc.c:1646  */
     {
-                       (yyval.prop) = build_property((yyvsp[-1].propnodename), empty_data);
+                       (yyval.prop) = build_property((yyvsp[-3].propnodename), (yyvsp[-1].data));
                }
-#line 1638 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1648 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
   case 21:
-#line 233 "dtc-parser.y" /* yacc.c:1646  */
+#line 243 "dtc-parser.y" /* yacc.c:1646  */
     {
-                       (yyval.prop) = build_property_delete((yyvsp[-1].propnodename));
+                       (yyval.prop) = build_property((yyvsp[-1].propnodename), empty_data);
                }
-#line 1646 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1656 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
   case 22:
-#line 237 "dtc-parser.y" /* yacc.c:1646  */
+#line 247 "dtc-parser.y" /* yacc.c:1646  */
+    {
+                       (yyval.prop) = build_property_delete((yyvsp[-1].propnodename));
+               }
+#line 1664 "dtc-parser.tab.c" /* yacc.c:1646  */
+    break;
+
+  case 23:
+#line 251 "dtc-parser.y" /* yacc.c:1646  */
     {
                        add_label(&(yyvsp[0].prop)->labels, (yyvsp[-1].labelref));
                        (yyval.prop) = (yyvsp[0].prop);
                }
-#line 1655 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1673 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 23:
-#line 245 "dtc-parser.y" /* yacc.c:1646  */
+  case 24:
+#line 259 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.data) = data_merge((yyvsp[-1].data), (yyvsp[0].data));
                }
-#line 1663 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1681 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 24:
-#line 249 "dtc-parser.y" /* yacc.c:1646  */
+  case 25:
+#line 263 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.data) = data_merge((yyvsp[-2].data), (yyvsp[-1].array).data);
                }
-#line 1671 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1689 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 25:
-#line 253 "dtc-parser.y" /* yacc.c:1646  */
+  case 26:
+#line 267 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.data) = data_merge((yyvsp[-3].data), (yyvsp[-1].data));
                }
-#line 1679 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1697 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 26:
-#line 257 "dtc-parser.y" /* yacc.c:1646  */
+  case 27:
+#line 271 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.data) = data_add_marker((yyvsp[-1].data), REF_PATH, (yyvsp[0].labelref));
                }
-#line 1687 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1705 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 27:
-#line 261 "dtc-parser.y" /* yacc.c:1646  */
+  case 28:
+#line 275 "dtc-parser.y" /* yacc.c:1646  */
     {
                        FILE *f = srcfile_relative_open((yyvsp[-5].data).val, NULL);
                        struct data d;
@@ -1703,11 +1721,11 @@ yyreduce:
                        (yyval.data) = data_merge((yyvsp[-8].data), d);
                        fclose(f);
                }
-#line 1707 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1725 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 28:
-#line 277 "dtc-parser.y" /* yacc.c:1646  */
+  case 29:
+#line 291 "dtc-parser.y" /* yacc.c:1646  */
     {
                        FILE *f = srcfile_relative_open((yyvsp[-1].data).val, NULL);
                        struct data d = empty_data;
@@ -1717,43 +1735,43 @@ yyreduce:
                        (yyval.data) = data_merge((yyvsp[-4].data), d);
                        fclose(f);
                }
-#line 1721 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1739 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 29:
-#line 287 "dtc-parser.y" /* yacc.c:1646  */
+  case 30:
+#line 301 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
                }
-#line 1729 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1747 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 30:
-#line 294 "dtc-parser.y" /* yacc.c:1646  */
+  case 31:
+#line 308 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.data) = empty_data;
                }
-#line 1737 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1755 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 31:
-#line 298 "dtc-parser.y" /* yacc.c:1646  */
+  case 32:
+#line 312 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.data) = (yyvsp[-1].data);
                }
-#line 1745 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1763 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 32:
-#line 302 "dtc-parser.y" /* yacc.c:1646  */
+  case 33:
+#line 316 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
                }
-#line 1753 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1771 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 33:
-#line 309 "dtc-parser.y" /* yacc.c:1646  */
+  case 34:
+#line 323 "dtc-parser.y" /* yacc.c:1646  */
     {
                        unsigned long long bits;
 
@@ -1769,20 +1787,20 @@ yyreduce:
                        (yyval.array).data = empty_data;
                        (yyval.array).bits = bits;
                }
-#line 1773 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1791 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 34:
-#line 325 "dtc-parser.y" /* yacc.c:1646  */
+  case 35:
+#line 339 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.array).data = empty_data;
                        (yyval.array).bits = 32;
                }
-#line 1782 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1800 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 35:
-#line 330 "dtc-parser.y" /* yacc.c:1646  */
+  case 36:
+#line 344 "dtc-parser.y" /* yacc.c:1646  */
     {
                        if ((yyvsp[-1].array).bits < 64) {
                                uint64_t mask = (1ULL << (yyvsp[-1].array).bits) - 1;
@@ -1801,11 +1819,11 @@ yyreduce:
 
                        (yyval.array).data = data_append_integer((yyvsp[-1].array).data, (yyvsp[0].integer), (yyvsp[-1].array).bits);
                }
-#line 1805 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1823 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 36:
-#line 349 "dtc-parser.y" /* yacc.c:1646  */
+  case 37:
+#line 363 "dtc-parser.y" /* yacc.c:1646  */
     {
                        uint64_t val = ~0ULL >> (64 - (yyvsp[-1].array).bits);
 
@@ -1819,129 +1837,129 @@ yyreduce:
 
                        (yyval.array).data = data_append_integer((yyvsp[-1].array).data, val, (yyvsp[-1].array).bits);
                }
-#line 1823 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1841 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 37:
-#line 363 "dtc-parser.y" /* yacc.c:1646  */
+  case 38:
+#line 377 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.array).data = data_add_marker((yyvsp[-1].array).data, LABEL, (yyvsp[0].labelref));
                }
-#line 1831 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1849 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 40:
-#line 372 "dtc-parser.y" /* yacc.c:1646  */
+  case 41:
+#line 386 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.integer) = (yyvsp[-1].integer);
                }
-#line 1839 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1857 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 43:
-#line 383 "dtc-parser.y" /* yacc.c:1646  */
+  case 44:
+#line 397 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-4].integer) ? (yyvsp[-2].integer) : (yyvsp[0].integer); }
-#line 1845 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1863 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 45:
-#line 388 "dtc-parser.y" /* yacc.c:1646  */
+  case 46:
+#line 402 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) || (yyvsp[0].integer); }
-#line 1851 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1869 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 47:
-#line 393 "dtc-parser.y" /* yacc.c:1646  */
+  case 48:
+#line 407 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) && (yyvsp[0].integer); }
-#line 1857 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1875 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 49:
-#line 398 "dtc-parser.y" /* yacc.c:1646  */
+  case 50:
+#line 412 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) | (yyvsp[0].integer); }
-#line 1863 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1881 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 51:
-#line 403 "dtc-parser.y" /* yacc.c:1646  */
+  case 52:
+#line 417 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) ^ (yyvsp[0].integer); }
-#line 1869 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1887 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 53:
-#line 408 "dtc-parser.y" /* yacc.c:1646  */
+  case 54:
+#line 422 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) & (yyvsp[0].integer); }
-#line 1875 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1893 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 55:
-#line 413 "dtc-parser.y" /* yacc.c:1646  */
+  case 56:
+#line 427 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) == (yyvsp[0].integer); }
-#line 1881 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1899 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 56:
-#line 414 "dtc-parser.y" /* yacc.c:1646  */
+  case 57:
+#line 428 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) != (yyvsp[0].integer); }
-#line 1887 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1905 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 58:
-#line 419 "dtc-parser.y" /* yacc.c:1646  */
+  case 59:
+#line 433 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) < (yyvsp[0].integer); }
-#line 1893 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1911 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 59:
-#line 420 "dtc-parser.y" /* yacc.c:1646  */
+  case 60:
+#line 434 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) > (yyvsp[0].integer); }
-#line 1899 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1917 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 60:
-#line 421 "dtc-parser.y" /* yacc.c:1646  */
+  case 61:
+#line 435 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) <= (yyvsp[0].integer); }
-#line 1905 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1923 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 61:
-#line 422 "dtc-parser.y" /* yacc.c:1646  */
+  case 62:
+#line 436 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) >= (yyvsp[0].integer); }
-#line 1911 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1929 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 62:
-#line 426 "dtc-parser.y" /* yacc.c:1646  */
+  case 63:
+#line 440 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) << (yyvsp[0].integer); }
-#line 1917 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1935 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 63:
-#line 427 "dtc-parser.y" /* yacc.c:1646  */
+  case 64:
+#line 441 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) >> (yyvsp[0].integer); }
-#line 1923 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1941 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 65:
-#line 432 "dtc-parser.y" /* yacc.c:1646  */
+  case 66:
+#line 446 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) + (yyvsp[0].integer); }
-#line 1929 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1947 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 66:
-#line 433 "dtc-parser.y" /* yacc.c:1646  */
+  case 67:
+#line 447 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) - (yyvsp[0].integer); }
-#line 1935 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1953 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 68:
-#line 438 "dtc-parser.y" /* yacc.c:1646  */
+  case 69:
+#line 452 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = (yyvsp[-2].integer) * (yyvsp[0].integer); }
-#line 1941 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1959 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 69:
-#line 440 "dtc-parser.y" /* yacc.c:1646  */
+  case 70:
+#line 454 "dtc-parser.y" /* yacc.c:1646  */
     {
                        if ((yyvsp[0].integer) != 0) {
                                (yyval.integer) = (yyvsp[-2].integer) / (yyvsp[0].integer);
@@ -1950,11 +1968,11 @@ yyreduce:
                                (yyval.integer) = 0;
                        }
                }
-#line 1954 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1972 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 70:
-#line 449 "dtc-parser.y" /* yacc.c:1646  */
+  case 71:
+#line 463 "dtc-parser.y" /* yacc.c:1646  */
     {
                        if ((yyvsp[0].integer) != 0) {
                                (yyval.integer) = (yyvsp[-2].integer) % (yyvsp[0].integer);
@@ -1963,103 +1981,103 @@ yyreduce:
                                (yyval.integer) = 0;
                        }
                }
-#line 1967 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1985 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 73:
-#line 462 "dtc-parser.y" /* yacc.c:1646  */
+  case 74:
+#line 476 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = -(yyvsp[0].integer); }
-#line 1973 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1991 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 74:
-#line 463 "dtc-parser.y" /* yacc.c:1646  */
+  case 75:
+#line 477 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = ~(yyvsp[0].integer); }
-#line 1979 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 1997 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 75:
-#line 464 "dtc-parser.y" /* yacc.c:1646  */
+  case 76:
+#line 478 "dtc-parser.y" /* yacc.c:1646  */
     { (yyval.integer) = !(yyvsp[0].integer); }
-#line 1985 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 2003 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 76:
-#line 469 "dtc-parser.y" /* yacc.c:1646  */
+  case 77:
+#line 483 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.data) = empty_data;
                }
-#line 1993 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 2011 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 77:
-#line 473 "dtc-parser.y" /* yacc.c:1646  */
+  case 78:
+#line 487 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.data) = data_append_byte((yyvsp[-1].data), (yyvsp[0].byte));
                }
-#line 2001 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 2019 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 78:
-#line 477 "dtc-parser.y" /* yacc.c:1646  */
+  case 79:
+#line 491 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
                }
-#line 2009 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 2027 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 79:
-#line 484 "dtc-parser.y" /* yacc.c:1646  */
+  case 80:
+#line 498 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.nodelist) = NULL;
                }
-#line 2017 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 2035 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 80:
-#line 488 "dtc-parser.y" /* yacc.c:1646  */
+  case 81:
+#line 502 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.nodelist) = chain_node((yyvsp[-1].node), (yyvsp[0].nodelist));
                }
-#line 2025 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 2043 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 81:
-#line 492 "dtc-parser.y" /* yacc.c:1646  */
+  case 82:
+#line 506 "dtc-parser.y" /* yacc.c:1646  */
     {
                        ERROR(&(yylsp[0]), "Properties must precede subnodes");
                        YYERROR;
                }
-#line 2034 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 2052 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 82:
-#line 500 "dtc-parser.y" /* yacc.c:1646  */
+  case 83:
+#line 514 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.node) = name_node((yyvsp[0].node), (yyvsp[-1].propnodename));
                }
-#line 2042 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 2060 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 83:
-#line 504 "dtc-parser.y" /* yacc.c:1646  */
+  case 84:
+#line 518 "dtc-parser.y" /* yacc.c:1646  */
     {
                        (yyval.node) = name_node(build_node_delete(), (yyvsp[-1].propnodename));
                }
-#line 2050 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 2068 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
-  case 84:
-#line 508 "dtc-parser.y" /* yacc.c:1646  */
+  case 85:
+#line 522 "dtc-parser.y" /* yacc.c:1646  */
     {
                        add_label(&(yyvsp[0].node)->labels, (yyvsp[-1].labelref));
                        (yyval.node) = (yyvsp[0].node);
                }
-#line 2059 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 2077 "dtc-parser.tab.c" /* yacc.c:1646  */
     break;
 
 
-#line 2063 "dtc-parser.tab.c" /* yacc.c:1646  */
+#line 2081 "dtc-parser.tab.c" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -2294,7 +2312,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 514 "dtc-parser.y" /* yacc.c:1906  */
+#line 528 "dtc-parser.y" /* yacc.c:1906  */
 
 
 void yyerror(char const *s)
index ca3f5003427cb5e280eb6ec4343547f7f37bd428..affc81a8f9abedc2dec26bd8f713aac337e2ac6e 100644 (file)
@@ -182,10 +182,19 @@ devicetree:
                {
                        struct node *target = get_node_by_ref($1, $2);
 
-                       if (target)
+                       if (target) {
                                merge_nodes(target, $3);
-                       else
-                               ERROR(&@2, "Label or path %s not found", $2);
+                       } else {
+                               /*
+                                * We rely on the rule being always:
+                                *   versioninfo plugindecl memreserves devicetree
+                                * so $-1 is what we want (plugindecl)
+                                */
+                               if ($<flags>-1 & DTSF_PLUGIN)
+                                       add_orphan_node($1, $3, $2);
+                               else
+                                       ERROR(&@2, "Label or path %s not found", $2);
+                       }
                        $$ = $1;
                }
        | devicetree DT_DEL_NODE DT_REF ';'
@@ -200,6 +209,11 @@ devicetree:
 
                        $$ = $1;
                }
+       | /* empty */
+               {
+                       /* build empty node */
+                       $$ = name_node(build_node(NULL, NULL), "");
+               }
        ;
 
 nodedef:
index f5eed9d72c0241bbe36c90aebe7dd7f60cc430fb..a4edf4c7aebfb368319041d2bf960a66490780e9 100644 (file)
@@ -138,7 +138,7 @@ static const char *guess_type_by_name(const char *fname, const char *fallback)
 static const char *guess_input_format(const char *fname, const char *fallback)
 {
        struct stat statbuf;
-       fdt32_t magic;
+       uint32_t magic;
        FILE *f;
 
        if (stat(fname, &statbuf) != 0)
@@ -159,7 +159,8 @@ static const char *guess_input_format(const char *fname, const char *fallback)
        }
        fclose(f);
 
-       if (fdt32_to_cpu(magic) == FDT_MAGIC)
+       magic = fdt32_to_cpu(magic);
+       if (magic == FDT_MAGIC)
                return "dtb";
 
        return guess_type_by_name(fname, fallback);
@@ -215,7 +216,7 @@ int main(int argc, char *argv[])
                        alignsize = strtol(optarg, NULL, 0);
                        if (!is_power_of_2(alignsize))
                                die("Invalid argument \"%d\" to -a option\n",
-                                   alignsize);
+                                   optarg);
                        break;
                case 'f':
                        force = true;
@@ -308,8 +309,6 @@ int main(int argc, char *argv[])
        else
                die("Unknown input format \"%s\"\n", inform);
 
-       dti->outname = outname;
-
        if (depfile) {
                fputc('\n', depfile);
                fclose(depfile);
index fc24e17510fde472ebf10d88c7fb008b4eb1aab6..092bef9d8f4a29c0c618d4a5a24a9f9754ca29b5 100644 (file)
@@ -43,6 +43,7 @@
 #define debug(...)
 #endif
 
+
 #define DEFAULT_FDT_VERSION    17
 
 /*
@@ -113,7 +114,7 @@ struct data data_insert_at_marker(struct data d, struct marker *m,
 struct data data_merge(struct data d1, struct data d2);
 struct data data_append_cell(struct data d, cell_t word);
 struct data data_append_integer(struct data d, uint64_t word, int bits);
-struct data data_append_re(struct data d, uint64_t address, uint64_t size);
+struct data data_append_re(struct data d, const struct fdt_reserve_entry *re);
 struct data data_append_addr(struct data d, uint64_t addr);
 struct data data_append_byte(struct data d, uint8_t byte);
 struct data data_append_zeroes(struct data d, int len);
@@ -135,10 +136,6 @@ struct label {
        struct label *next;
 };
 
-struct bus_type {
-       const char *name;
-};
-
 struct property {
        bool deleted;
        char *name;
@@ -165,7 +162,6 @@ struct node {
        int addr_cells, size_cells;
 
        struct label *labels;
-       const struct bus_type *bus;
 };
 
 #define for_each_label_withdel(l0, l) \
@@ -202,6 +198,7 @@ struct node *build_node_delete(void);
 struct node *name_node(struct node *node, char *name);
 struct node *chain_node(struct node *first, struct node *list);
 struct node *merge_nodes(struct node *old_node, struct node *new_node);
+void add_orphan_node(struct node *old_node, struct node *new_node, char *ref);
 
 void add_property(struct node *node, struct property *prop);
 void delete_property_by_name(struct node *node, char *name);
@@ -231,7 +228,7 @@ uint32_t guess_boot_cpuid(struct node *tree);
 /* Boot info (tree plus memreserve information */
 
 struct reserve_info {
-       uint64_t address, size;
+       struct fdt_reserve_entry re;
 
        struct reserve_info *next;
 
@@ -250,7 +247,6 @@ struct dt_info {
        struct reserve_info *reservelist;
        uint32_t boot_cpuid_phys;
        struct node *dt;                /* the device tree */
-       const char *outname;            /* filename being written to, "-" for stdout */
 };
 
 /* DTS version flags definitions */
old mode 100755 (executable)
new mode 100644 (file)
index 8c4fbad..ec47f95
@@ -86,7 +86,6 @@ eod
 compile_to_dts() {
 
        dtx="$1"
-       dtc_include="$2"
 
        if [ -d "${dtx}" ] ; then
 
@@ -114,7 +113,7 @@ compile_to_dts() {
                # -----  input is DTS (source)
 
                if ( cpp ${cpp_flags} -x assembler-with-cpp ${dtx} \
-                       | ${DTC} ${dtc_include} -I dts ) ; then
+                       | ${DTC} -I dts ) ; then
                        return
                fi
 
@@ -321,25 +320,30 @@ fi
 
 cpp_flags="\
        -nostdinc                                  \
-       -I${srctree}/scripts/dtc/include-prefixes  \
+       -I${srctree}/arch/${ARCH}/boot/dts         \
+       -I${srctree}/arch/${ARCH}/boot/dts/include \
+       -I${srctree}/drivers/of/testcase-data      \
        -undef -D__DTS__"
 
-DTC="\
-       ${DTC}                                     \
-       -i ${srctree}/scripts/dtc/include-prefixes \
-       -O dts -qq -f ${dtc_sort} -o -"
+dtc_flags="\
+       -i ${srctree}/arch/${ARCH}/boot/dts/ \
+       -i ${srctree}/kernel/dts             \
+       ${dtx_path_1_dtc_include}            \
+       ${dtx_path_2_dtc_include}"
+
+DTC="${DTC} ${dtc_flags} -O dts -qq -f ${dtc_sort} -o -"
 
 
 # -----  do the diff or decompile
 
 if (( ${cmd_diff} )) ; then
 
-       diff ${diff_flags} --label "${dtx_file_1}" --label "${dtx_file_2}" \
-               <(compile_to_dts "${dtx_file_1}" "${dtx_path_1_dtc_include}") \
-               <(compile_to_dts "${dtx_file_2}" "${dtx_path_2_dtc_include}")
+       diff ${diff_flags} \
+               <(compile_to_dts "${dtx_file_1}") \
+               <(compile_to_dts "${dtx_file_2}")
 
 else
 
-       compile_to_dts "${dtx_file_1}" "${dtx_path_1_dtc_include}"
+       compile_to_dts "${dtx_file_1}"
 
 fi
index 7d460a50b513d0557990e6534870bbdd9e000533..207a46d648649622125ad1c166584be68a8ac5b0 100644 (file)
@@ -1,4 +1,3 @@
-// SPDX-License-Identifier: GPL-2.0
 /*
  * fdtdump.c - Contributed by Pantelis Antoniou <pantelis.antoniou AT gmail.com>
  */
index fcf71541d8a7e543766f45077ebfc1184c7d6cab..ebac548b3fa81a1658b0d60dcb369c2c50f1cab0 100644 (file)
@@ -49,7 +49,7 @@ static struct version_info {
 
 struct emitter {
        void (*cell)(void *, cell_t);
-       void (*string)(void *, const char *, int);
+       void (*string)(void *, char *, int);
        void (*align)(void *, int);
        void (*data)(void *, struct data);
        void (*beginnode)(void *, struct label *labels);
@@ -64,7 +64,7 @@ static void bin_emit_cell(void *e, cell_t val)
        *dtbuf = data_append_cell(*dtbuf, val);
 }
 
-static void bin_emit_string(void *e, const char *str, int len)
+static void bin_emit_string(void *e, char *str, int len)
 {
        struct data *dtbuf = e;
 
@@ -144,14 +144,22 @@ static void asm_emit_cell(void *e, cell_t val)
                (val >> 8) & 0xff, val & 0xff);
 }
 
-static void asm_emit_string(void *e, const char *str, int len)
+static void asm_emit_string(void *e, char *str, int len)
 {
        FILE *f = e;
+       char c = 0;
 
-       if (len != 0)
-               fprintf(f, "\t.string\t\"%.*s\"\n", len, str);
-       else
-               fprintf(f, "\t.string\t\"%s\"\n", str);
+       if (len != 0) {
+               /* XXX: ewww */
+               c = str[len];
+               str[len] = '\0';
+       }
+
+       fprintf(f, "\t.string\t\"%s\"\n", str);
+
+       if (len != 0) {
+               str[len] = c;
+       }
 }
 
 static void asm_emit_align(void *e, int a)
@@ -171,7 +179,7 @@ static void asm_emit_data(void *e, struct data d)
                emit_offset_label(f, m->ref, m->offset);
 
        while ((d.len - off) >= sizeof(uint32_t)) {
-               asm_emit_cell(e, fdt32_to_cpu(*((fdt32_t *)(d.val+off))));
+               asm_emit_cell(e, fdt32_to_cpu(*((uint32_t *)(d.val+off))));
                off += sizeof(uint32_t);
        }
 
@@ -310,16 +318,17 @@ static struct data flatten_reserve_list(struct reserve_info *reservelist,
 {
        struct reserve_info *re;
        struct data d = empty_data;
+       static struct fdt_reserve_entry null_re = {0,0};
        int    j;
 
        for (re = reservelist; re; re = re->next) {
-               d = data_append_re(d, re->address, re->size);
+               d = data_append_re(d, &re->re);
        }
        /*
         * Add additional reserved slots if the user asked for them.
         */
        for (j = 0; j < reservenum; j++) {
-               d = data_append_re(d, 0, 0);
+               d = data_append_re(d, &null_re);
        }
 
        return d;
@@ -535,11 +544,11 @@ void dt_to_asm(FILE *f, struct dt_info *dti, int version)
                        fprintf(f, "\t.globl\t%s\n", l->label);
                        fprintf(f, "%s:\n", l->label);
                }
-               ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->address >> 32));
+               ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.address >> 32));
                ASM_EMIT_BELONG(f, "0x%08x",
-                               (unsigned int)(re->address & 0xffffffff));
-               ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size >> 32));
-               ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size & 0xffffffff));
+                               (unsigned int)(re->re.address & 0xffffffff));
+               ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size >> 32));
+               ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size & 0xffffffff));
        }
        for (i = 0; i < reservenum; i++) {
                fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
@@ -600,7 +609,7 @@ static void flat_read_chunk(struct inbuf *inb, void *p, int len)
 
 static uint32_t flat_read_word(struct inbuf *inb)
 {
-       fdt32_t val;
+       uint32_t val;
 
        assert(((inb->ptr - inb->base) % sizeof(val)) == 0);
 
@@ -709,15 +718,13 @@ static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb)
         * First pass, count entries.
         */
        while (1) {
-               uint64_t address, size;
-
                flat_read_chunk(inb, &re, sizeof(re));
-               address  = fdt64_to_cpu(re.address);
-               size = fdt64_to_cpu(re.size);
-               if (size == 0)
+               re.address  = fdt64_to_cpu(re.address);
+               re.size = fdt64_to_cpu(re.size);
+               if (re.size == 0)
                        break;
 
-               new = build_reserve_entry(address, size);
+               new = build_reserve_entry(re.address, re.size);
                reservelist = add_reserve_entry(reservelist, new);
        }
 
@@ -810,7 +817,6 @@ static struct node *unflatten_tree(struct inbuf *dtbuf,
 struct dt_info *dt_from_blob(const char *fname)
 {
        FILE *f;
-       fdt32_t magic_buf, totalsize_buf;
        uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys;
        uint32_t off_dt, off_str, off_mem_rsvmap;
        int rc;
@@ -827,7 +833,7 @@ struct dt_info *dt_from_blob(const char *fname)
 
        f = srcfile_relative_open(fname, NULL);
 
-       rc = fread(&magic_buf, sizeof(magic_buf), 1, f);
+       rc = fread(&magic, sizeof(magic), 1, f);
        if (ferror(f))
                die("Error reading DT blob magic number: %s\n",
                    strerror(errno));
@@ -838,11 +844,11 @@ struct dt_info *dt_from_blob(const char *fname)
                        die("Mysterious short read reading magic number\n");
        }
 
-       magic = fdt32_to_cpu(magic_buf);
+       magic = fdt32_to_cpu(magic);
        if (magic != FDT_MAGIC)
                die("Blob has incorrect magic number\n");
 
-       rc = fread(&totalsize_buf, sizeof(totalsize_buf), 1, f);
+       rc = fread(&totalsize, sizeof(totalsize), 1, f);
        if (ferror(f))
                die("Error reading DT blob size: %s\n", strerror(errno));
        if (rc < 1) {
@@ -852,7 +858,7 @@ struct dt_info *dt_from_blob(const char *fname)
                        die("Mysterious short read reading blob size\n");
        }
 
-       totalsize = fdt32_to_cpu(totalsize_buf);
+       totalsize = fdt32_to_cpu(totalsize);
        if (totalsize < FDT_V1_SIZE)
                die("DT blob size (%d) is too small\n", totalsize);
 
diff --git a/scripts/dtc/libfdt/fdt_addresses.c b/scripts/dtc/libfdt/fdt_addresses.c
new file mode 100644 (file)
index 0000000..0415b92
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2014 David Gibson <david@gibson.dropbear.id.au>
+ *
+ * libfdt is dual licensed: you can use it either under the terms of
+ * the GPL, or the BSD license, at your option.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation; either version 2 of the
+ *     License, or (at your option) any later version.
+ *
+ *     This library is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public License
+ *     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Alternatively,
+ *
+ *  b) Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *     2. Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+int fdt_address_cells(const void *fdt, int nodeoffset)
+{
+       const fdt32_t *ac;
+       int val;
+       int len;
+
+       ac = fdt_getprop(fdt, nodeoffset, "#address-cells", &len);
+       if (!ac)
+               return 2;
+
+       if (len != sizeof(*ac))
+               return -FDT_ERR_BADNCELLS;
+
+       val = fdt32_to_cpu(*ac);
+       if ((val <= 0) || (val > FDT_MAX_NCELLS))
+               return -FDT_ERR_BADNCELLS;
+
+       return val;
+}
+
+int fdt_size_cells(const void *fdt, int nodeoffset)
+{
+       const fdt32_t *sc;
+       int val;
+       int len;
+
+       sc = fdt_getprop(fdt, nodeoffset, "#size-cells", &len);
+       if (!sc)
+               return 2;
+
+       if (len != sizeof(*sc))
+               return -FDT_ERR_BADNCELLS;
+
+       val = fdt32_to_cpu(*sc);
+       if ((val < 0) || (val > FDT_MAX_NCELLS))
+               return -FDT_ERR_BADNCELLS;
+
+       return val;
+}
diff --git a/scripts/dtc/libfdt/fdt_overlay.c b/scripts/dtc/libfdt/fdt_overlay.c
new file mode 100644 (file)
index 0000000..56cb70e
--- /dev/null
@@ -0,0 +1,676 @@
+#include "libfdt_env.h"
+
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_internal.h"
+
+/**
+ * overlay_get_target_phandle - retrieves the target phandle of a fragment
+ * @fdto: pointer to the device tree overlay blob
+ * @fragment: node offset of the fragment in the overlay
+ *
+ * overlay_get_target_phandle() retrieves the target phandle of an
+ * overlay fragment when that fragment uses a phandle (target
+ * property) instead of a path (target-path property).
+ *
+ * returns:
+ *      the phandle pointed by the target property
+ *      0, if the phandle was not found
+ *     -1, if the phandle was malformed
+ */
+static uint32_t overlay_get_target_phandle(const void *fdto, int fragment)
+{
+       const uint32_t *val;
+       int len;
+
+       val = fdt_getprop(fdto, fragment, "target", &len);
+       if (!val)
+               return 0;
+
+       if ((len != sizeof(*val)) || (*val == (uint32_t)-1))
+               return (uint32_t)-1;
+
+       return fdt32_to_cpu(*val);
+}
+
+/**
+ * overlay_get_target - retrieves the offset of a fragment's target
+ * @fdt: Base device tree blob
+ * @fdto: Device tree overlay blob
+ * @fragment: node offset of the fragment in the overlay
+ *
+ * overlay_get_target() retrieves the target offset in the base
+ * device tree of a fragment, no matter how the actual targetting is
+ * done (through a phandle or a path)
+ *
+ * returns:
+ *      the targetted node offset in the base device tree
+ *      Negative error code on error
+ */
+static int overlay_get_target(const void *fdt, const void *fdto,
+                             int fragment)
+{
+       uint32_t phandle;
+       const char *path;
+       int path_len;
+
+       /* Try first to do a phandle based lookup */
+       phandle = overlay_get_target_phandle(fdto, fragment);
+       if (phandle == (uint32_t)-1)
+               return -FDT_ERR_BADPHANDLE;
+
+       if (phandle)
+               return fdt_node_offset_by_phandle(fdt, phandle);
+
+       /* And then a path based lookup */
+       path = fdt_getprop(fdto, fragment, "target-path", &path_len);
+       if (!path) {
+               /*
+                * If we haven't found either a target or a
+                * target-path property in a node that contains a
+                * __overlay__ subnode (we wouldn't be called
+                * otherwise), consider it a improperly written
+                * overlay
+                */
+               if (path_len == -FDT_ERR_NOTFOUND)
+                       return -FDT_ERR_BADOVERLAY;
+
+               return path_len;
+       }
+
+       return fdt_path_offset(fdt, path);
+}
+
+/**
+ * overlay_phandle_add_offset - Increases a phandle by an offset
+ * @fdt: Base device tree blob
+ * @node: Device tree overlay blob
+ * @name: Name of the property to modify (phandle or linux,phandle)
+ * @delta: offset to apply
+ *
+ * overlay_phandle_add_offset() increments a node phandle by a given
+ * offset.
+ *
+ * returns:
+ *      0 on success.
+ *      Negative error code on error
+ */
+static int overlay_phandle_add_offset(void *fdt, int node,
+                                     const char *name, uint32_t delta)
+{
+       const uint32_t *val;
+       uint32_t adj_val;
+       int len;
+
+       val = fdt_getprop(fdt, node, name, &len);
+       if (!val)
+               return len;
+
+       if (len != sizeof(*val))
+               return -FDT_ERR_BADPHANDLE;
+
+       adj_val = fdt32_to_cpu(*val);
+       if ((adj_val + delta) < adj_val)
+               return -FDT_ERR_NOPHANDLES;
+
+       adj_val += delta;
+       if (adj_val == (uint32_t)-1)
+               return -FDT_ERR_NOPHANDLES;
+
+       return fdt_setprop_inplace_u32(fdt, node, name, adj_val);
+}
+
+/**
+ * overlay_adjust_node_phandles - Offsets the phandles of a node
+ * @fdto: Device tree overlay blob
+ * @node: Offset of the node we want to adjust
+ * @delta: Offset to shift the phandles of
+ *
+ * overlay_adjust_node_phandles() adds a constant to all the phandles
+ * of a given node. This is mainly use as part of the overlay
+ * application process, when we want to update all the overlay
+ * phandles to not conflict with the overlays of the base device tree.
+ *
+ * returns:
+ *      0 on success
+ *      Negative error code on failure
+ */
+static int overlay_adjust_node_phandles(void *fdto, int node,
+                                       uint32_t delta)
+{
+       int child;
+       int ret;
+
+       ret = overlay_phandle_add_offset(fdto, node, "phandle", delta);
+       if (ret && ret != -FDT_ERR_NOTFOUND)
+               return ret;
+
+       ret = overlay_phandle_add_offset(fdto, node, "linux,phandle", delta);
+       if (ret && ret != -FDT_ERR_NOTFOUND)
+               return ret;
+
+       fdt_for_each_subnode(child, fdto, node) {
+               ret = overlay_adjust_node_phandles(fdto, child, delta);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+/**
+ * overlay_adjust_local_phandles - Adjust the phandles of a whole overlay
+ * @fdto: Device tree overlay blob
+ * @delta: Offset to shift the phandles of
+ *
+ * overlay_adjust_local_phandles() adds a constant to all the
+ * phandles of an overlay. This is mainly use as part of the overlay
+ * application process, when we want to update all the overlay
+ * phandles to not conflict with the overlays of the base device tree.
+ *
+ * returns:
+ *      0 on success
+ *      Negative error code on failure
+ */
+static int overlay_adjust_local_phandles(void *fdto, uint32_t delta)
+{
+       /*
+        * Start adjusting the phandles from the overlay root
+        */
+       return overlay_adjust_node_phandles(fdto, 0, delta);
+}
+
+/**
+ * overlay_update_local_node_references - Adjust the overlay references
+ * @fdto: Device tree overlay blob
+ * @tree_node: Node offset of the node to operate on
+ * @fixup_node: Node offset of the matching local fixups node
+ * @delta: Offset to shift the phandles of
+ *
+ * overlay_update_local_nodes_references() update the phandles
+ * pointing to a node within the device tree overlay by adding a
+ * constant delta.
+ *
+ * This is mainly used as part of a device tree application process,
+ * where you want the device tree overlays phandles to not conflict
+ * with the ones from the base device tree before merging them.
+ *
+ * returns:
+ *      0 on success
+ *      Negative error code on failure
+ */
+static int overlay_update_local_node_references(void *fdto,
+                                               int tree_node,
+                                               int fixup_node,
+                                               uint32_t delta)
+{
+       int fixup_prop;
+       int fixup_child;
+       int ret;
+
+       fdt_for_each_property_offset(fixup_prop, fdto, fixup_node) {
+               const uint32_t *fixup_val;
+               const char *tree_val;
+               const char *name;
+               int fixup_len;
+               int tree_len;
+               int i;
+
+               fixup_val = fdt_getprop_by_offset(fdto, fixup_prop,
+                                                 &name, &fixup_len);
+               if (!fixup_val)
+                       return fixup_len;
+
+               if (fixup_len % sizeof(uint32_t))
+                       return -FDT_ERR_BADOVERLAY;
+
+               tree_val = fdt_getprop(fdto, tree_node, name, &tree_len);
+               if (!tree_val) {
+                       if (tree_len == -FDT_ERR_NOTFOUND)
+                               return -FDT_ERR_BADOVERLAY;
+
+                       return tree_len;
+               }
+
+               for (i = 0; i < (fixup_len / sizeof(uint32_t)); i++) {
+                       uint32_t adj_val, poffset;
+
+                       poffset = fdt32_to_cpu(fixup_val[i]);
+
+                       /*
+                        * phandles to fixup can be unaligned.
+                        *
+                        * Use a memcpy for the architectures that do
+                        * not support unaligned accesses.
+                        */
+                       memcpy(&adj_val, tree_val + poffset, sizeof(adj_val));
+
+                       adj_val = fdt32_to_cpu(adj_val);
+                       adj_val += delta;
+                       adj_val = cpu_to_fdt32(adj_val);
+
+                       ret = fdt_setprop_inplace_namelen_partial(fdto,
+                                                                 tree_node,
+                                                                 name,
+                                                                 strlen(name),
+                                                                 poffset,
+                                                                 &adj_val,
+                                                                 sizeof(adj_val));
+                       if (ret == -FDT_ERR_NOSPACE)
+                               return -FDT_ERR_BADOVERLAY;
+
+                       if (ret)
+                               return ret;
+               }
+       }
+
+       fdt_for_each_subnode(fixup_child, fdto, fixup_node) {
+               const char *fixup_child_name = fdt_get_name(fdto, fixup_child,
+                                                           NULL);
+               int tree_child;
+
+               tree_child = fdt_subnode_offset(fdto, tree_node,
+                                               fixup_child_name);
+               if (ret == -FDT_ERR_NOTFOUND)
+                       return -FDT_ERR_BADOVERLAY;
+               if (tree_child < 0)
+                       return tree_child;
+
+               ret = overlay_update_local_node_references(fdto,
+                                                          tree_child,
+                                                          fixup_child,
+                                                          delta);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+/**
+ * overlay_update_local_references - Adjust the overlay references
+ * @fdto: Device tree overlay blob
+ * @delta: Offset to shift the phandles of
+ *
+ * overlay_update_local_references() update all the phandles pointing
+ * to a node within the device tree overlay by adding a constant
+ * delta to not conflict with the base overlay.
+ *
+ * This is mainly used as part of a device tree application process,
+ * where you want the device tree overlays phandles to not conflict
+ * with the ones from the base device tree before merging them.
+ *
+ * returns:
+ *      0 on success
+ *      Negative error code on failure
+ */
+static int overlay_update_local_references(void *fdto, uint32_t delta)
+{
+       int fixups;
+
+       fixups = fdt_path_offset(fdto, "/__local_fixups__");
+       if (fixups < 0) {
+               /* There's no local phandles to adjust, bail out */
+               if (fixups == -FDT_ERR_NOTFOUND)
+                       return 0;
+
+               return fixups;
+       }
+
+       /*
+        * Update our local references from the root of the tree
+        */
+       return overlay_update_local_node_references(fdto, 0, fixups,
+                                                   delta);
+}
+
+/**
+ * overlay_fixup_one_phandle - Set an overlay phandle to the base one
+ * @fdt: Base Device Tree blob
+ * @fdto: Device tree overlay blob
+ * @symbols_off: Node offset of the symbols node in the base device tree
+ * @path: Path to a node holding a phandle in the overlay
+ * @path_len: number of path characters to consider
+ * @name: Name of the property holding the phandle reference in the overlay
+ * @name_len: number of name characters to consider
+ * @poffset: Offset within the overlay property where the phandle is stored
+ * @label: Label of the node referenced by the phandle
+ *
+ * overlay_fixup_one_phandle() resolves an overlay phandle pointing to
+ * a node in the base device tree.
+ *
+ * This is part of the device tree overlay application process, when
+ * you want all the phandles in the overlay to point to the actual
+ * base dt nodes.
+ *
+ * returns:
+ *      0 on success
+ *      Negative error code on failure
+ */
+static int overlay_fixup_one_phandle(void *fdt, void *fdto,
+                                    int symbols_off,
+                                    const char *path, uint32_t path_len,
+                                    const char *name, uint32_t name_len,
+                                    int poffset, const char *label)
+{
+       const char *symbol_path;
+       uint32_t phandle;
+       int symbol_off, fixup_off;
+       int prop_len;
+
+       if (symbols_off < 0)
+               return symbols_off;
+
+       symbol_path = fdt_getprop(fdt, symbols_off, label,
+                                 &prop_len);
+       if (!symbol_path)
+               return prop_len;
+
+       symbol_off = fdt_path_offset(fdt, symbol_path);
+       if (symbol_off < 0)
+               return symbol_off;
+
+       phandle = fdt_get_phandle(fdt, symbol_off);
+       if (!phandle)
+               return -FDT_ERR_NOTFOUND;
+
+       fixup_off = fdt_path_offset_namelen(fdto, path, path_len);
+       if (fixup_off == -FDT_ERR_NOTFOUND)
+               return -FDT_ERR_BADOVERLAY;
+       if (fixup_off < 0)
+               return fixup_off;
+
+       phandle = cpu_to_fdt32(phandle);
+       return fdt_setprop_inplace_namelen_partial(fdto, fixup_off,
+                                                  name, name_len, poffset,
+                                                  &phandle, sizeof(phandle));
+};
+
+/**
+ * overlay_fixup_phandle - Set an overlay phandle to the base one
+ * @fdt: Base Device Tree blob
+ * @fdto: Device tree overlay blob
+ * @symbols_off: Node offset of the symbols node in the base device tree
+ * @property: Property offset in the overlay holding the list of fixups
+ *
+ * overlay_fixup_phandle() resolves all the overlay phandles pointed
+ * to in a __fixups__ property, and updates them to match the phandles
+ * in use in the base device tree.
+ *
+ * This is part of the device tree overlay application process, when
+ * you want all the phandles in the overlay to point to the actual
+ * base dt nodes.
+ *
+ * returns:
+ *      0 on success
+ *      Negative error code on failure
+ */
+static int overlay_fixup_phandle(void *fdt, void *fdto, int symbols_off,
+                                int property)
+{
+       const char *value;
+       const char *label;
+       int len;
+
+       value = fdt_getprop_by_offset(fdto, property,
+                                     &label, &len);
+       if (!value) {
+               if (len == -FDT_ERR_NOTFOUND)
+                       return -FDT_ERR_INTERNAL;
+
+               return len;
+       }
+
+       do {
+               const char *path, *name, *fixup_end;
+               const char *fixup_str = value;
+               uint32_t path_len, name_len;
+               uint32_t fixup_len;
+               char *sep, *endptr;
+               int poffset, ret;
+
+               fixup_end = memchr(value, '\0', len);
+               if (!fixup_end)
+                       return -FDT_ERR_BADOVERLAY;
+               fixup_len = fixup_end - fixup_str;
+
+               len -= fixup_len + 1;
+               value += fixup_len + 1;
+
+               path = fixup_str;
+               sep = memchr(fixup_str, ':', fixup_len);
+               if (!sep || *sep != ':')
+                       return -FDT_ERR_BADOVERLAY;
+
+               path_len = sep - path;
+               if (path_len == (fixup_len - 1))
+                       return -FDT_ERR_BADOVERLAY;
+
+               fixup_len -= path_len + 1;
+               name = sep + 1;
+               sep = memchr(name, ':', fixup_len);
+               if (!sep || *sep != ':')
+                       return -FDT_ERR_BADOVERLAY;
+
+               name_len = sep - name;
+               if (!name_len)
+                       return -FDT_ERR_BADOVERLAY;
+
+               poffset = strtoul(sep + 1, &endptr, 10);
+               if ((*endptr != '\0') || (endptr <= (sep + 1)))
+                       return -FDT_ERR_BADOVERLAY;
+
+               ret = overlay_fixup_one_phandle(fdt, fdto, symbols_off,
+                                               path, path_len, name, name_len,
+                                               poffset, label);
+               if (ret)
+                       return ret;
+       } while (len > 0);
+
+       return 0;
+}
+
+/**
+ * overlay_fixup_phandles - Resolve the overlay phandles to the base
+ *                          device tree
+ * @fdt: Base Device Tree blob
+ * @fdto: Device tree overlay blob
+ *
+ * overlay_fixup_phandles() resolves all the overlay phandles pointing
+ * to nodes in the base device tree.
+ *
+ * This is one of the steps of the device tree overlay application
+ * process, when you want all the phandles in the overlay to point to
+ * the actual base dt nodes.
+ *
+ * returns:
+ *      0 on success
+ *      Negative error code on failure
+ */
+static int overlay_fixup_phandles(void *fdt, void *fdto)
+{
+       int fixups_off, symbols_off;
+       int property;
+
+       /* We can have overlays without any fixups */
+       fixups_off = fdt_path_offset(fdto, "/__fixups__");
+       if (fixups_off == -FDT_ERR_NOTFOUND)
+               return 0; /* nothing to do */
+       if (fixups_off < 0)
+               return fixups_off;
+
+       /* And base DTs without symbols */
+       symbols_off = fdt_path_offset(fdt, "/__symbols__");
+       if ((symbols_off < 0 && (symbols_off != -FDT_ERR_NOTFOUND)))
+               return symbols_off;
+
+       fdt_for_each_property_offset(property, fdto, fixups_off) {
+               int ret;
+
+               ret = overlay_fixup_phandle(fdt, fdto, symbols_off, property);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+/**
+ * overlay_apply_node - Merges a node into the base device tree
+ * @fdt: Base Device Tree blob
+ * @target: Node offset in the base device tree to apply the fragment to
+ * @fdto: Device tree overlay blob
+ * @node: Node offset in the overlay holding the changes to merge
+ *
+ * overlay_apply_node() merges a node into a target base device tree
+ * node pointed.
+ *
+ * This is part of the final step in the device tree overlay
+ * application process, when all the phandles have been adjusted and
+ * resolved and you just have to merge overlay into the base device
+ * tree.
+ *
+ * returns:
+ *      0 on success
+ *      Negative error code on failure
+ */
+static int overlay_apply_node(void *fdt, int target,
+                             void *fdto, int node)
+{
+       int property;
+       int subnode;
+
+       fdt_for_each_property_offset(property, fdto, node) {
+               const char *name;
+               const void *prop;
+               int prop_len;
+               int ret;
+
+               prop = fdt_getprop_by_offset(fdto, property, &name,
+                                            &prop_len);
+               if (prop_len == -FDT_ERR_NOTFOUND)
+                       return -FDT_ERR_INTERNAL;
+               if (prop_len < 0)
+                       return prop_len;
+
+               ret = fdt_setprop(fdt, target, name, prop, prop_len);
+               if (ret)
+                       return ret;
+       }
+
+       fdt_for_each_subnode(subnode, fdto, node) {
+               const char *name = fdt_get_name(fdto, subnode, NULL);
+               int nnode;
+               int ret;
+
+               nnode = fdt_add_subnode(fdt, target, name);
+               if (nnode == -FDT_ERR_EXISTS) {
+                       nnode = fdt_subnode_offset(fdt, target, name);
+                       if (nnode == -FDT_ERR_NOTFOUND)
+                               return -FDT_ERR_INTERNAL;
+               }
+
+               if (nnode < 0)
+                       return nnode;
+
+               ret = overlay_apply_node(fdt, nnode, fdto, subnode);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+/**
+ * overlay_merge - Merge an overlay into its base device tree
+ * @fdt: Base Device Tree blob
+ * @fdto: Device tree overlay blob
+ *
+ * overlay_merge() merges an overlay into its base device tree.
+ *
+ * This is the final step in the device tree overlay application
+ * process, when all the phandles have been adjusted and resolved and
+ * you just have to merge overlay into the base device tree.
+ *
+ * returns:
+ *      0 on success
+ *      Negative error code on failure
+ */
+static int overlay_merge(void *fdt, void *fdto)
+{
+       int fragment;
+
+       fdt_for_each_subnode(fragment, fdto, 0) {
+               int overlay;
+               int target;
+               int ret;
+
+               /*
+                * Each fragments will have an __overlay__ node. If
+                * they don't, it's not supposed to be merged
+                */
+               overlay = fdt_subnode_offset(fdto, fragment, "__overlay__");
+               if (overlay == -FDT_ERR_NOTFOUND)
+                       continue;
+
+               if (overlay < 0)
+                       return overlay;
+
+               target = overlay_get_target(fdt, fdto, fragment);
+               if (target < 0)
+                       return target;
+
+               ret = overlay_apply_node(fdt, target, fdto, overlay);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+int fdt_overlay_apply(void *fdt, void *fdto)
+{
+       uint32_t delta = fdt_get_max_phandle(fdt);
+       int ret;
+
+       FDT_CHECK_HEADER(fdt);
+       FDT_CHECK_HEADER(fdto);
+
+       ret = overlay_adjust_local_phandles(fdto, delta);
+       if (ret)
+               goto err;
+
+       ret = overlay_update_local_references(fdto, delta);
+       if (ret)
+               goto err;
+
+       ret = overlay_fixup_phandles(fdt, fdto);
+       if (ret)
+               goto err;
+
+       ret = overlay_merge(fdt, fdto);
+       if (ret)
+               goto err;
+
+       /*
+        * The overlay has been damaged, erase its magic.
+        */
+       fdt_set_magic(fdto, ~0);
+
+       return 0;
+
+err:
+       /*
+        * The overlay might have been damaged, erase its magic.
+        */
+       fdt_set_magic(fdto, ~0);
+
+       /*
+        * The base device tree might have been damaged, erase its
+        * magic.
+        */
+       fdt_set_magic(fdt, ~0);
+
+       return ret;
+}
index 3fd5847377c9b5be3d1cfc4e9485b25b5cdf6cf9..2eed4f58387c2eaafcd4344903fc85f515b17018 100644 (file)
@@ -283,8 +283,7 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name,
        if (err)
                return err;
 
-       if (len)
-               memcpy(prop->data, val, len);
+       memcpy(prop->data, val, len);
        return 0;
 }
 
index ba86caa73d0168f97038cbac839c5572c8574f60..b842b156fa17b57081fa2ee1cd09a0974297b4ef 100644 (file)
 /* Low-level functions (you probably don't need these)                */
 /**********************************************************************/
 
-#ifndef SWIG /* This function is not useful in Python */
 const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen);
-#endif
 static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
 {
        return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen);
@@ -212,6 +210,7 @@ int fdt_next_subnode(const void *fdt, int offset);
 /**********************************************************************/
 /* General functions                                                  */
 /**********************************************************************/
+
 #define fdt_get_header(fdt, field) \
        (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field))
 #define fdt_magic(fdt)                 (fdt_get_header(fdt, magic))
@@ -355,10 +354,8 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size);
  * useful for finding subnodes based on a portion of a larger string,
  * such as a full path.
  */
-#ifndef SWIG /* Not available in Python */
 int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
                               const char *name, int namelen);
-#endif
 /**
  * fdt_subnode_offset - find a subnode of a given node
  * @fdt: pointer to the device tree blob
@@ -394,9 +391,7 @@ int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
  * Identical to fdt_path_offset(), but only consider the first namelen
  * characters of path as the path name.
  */
-#ifndef SWIG /* Not available in Python */
 int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen);
-#endif
 
 /**
  * fdt_path_offset - find a tree node by its full path
@@ -555,12 +550,10 @@ const struct fdt_property *fdt_get_property_by_offset(const void *fdt,
  * Identical to fdt_get_property(), but only examine the first namelen
  * characters of name for matching the property name.
  */
-#ifndef SWIG /* Not available in Python */
 const struct fdt_property *fdt_get_property_namelen(const void *fdt,
                                                    int nodeoffset,
                                                    const char *name,
                                                    int namelen, int *lenp);
-#endif
 
 /**
  * fdt_get_property - find a given property in a given node
@@ -631,10 +624,8 @@ static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,
  *             -FDT_ERR_BADSTRUCTURE,
  *             -FDT_ERR_TRUNCATED, standard meanings
  */
-#ifndef SWIG /* This function is not useful in Python */
 const void *fdt_getprop_by_offset(const void *fdt, int offset,
                                  const char **namep, int *lenp);
-#endif
 
 /**
  * fdt_getprop_namelen - get property value based on substring
@@ -647,7 +638,6 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
  * Identical to fdt_getprop(), but only examine the first namelen
  * characters of name for matching the property name.
  */
-#ifndef SWIG /* Not available in Python */
 const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
                                const char *name, int namelen, int *lenp);
 static inline void *fdt_getprop_namelen_w(void *fdt, int nodeoffset,
@@ -657,7 +647,6 @@ static inline void *fdt_getprop_namelen_w(void *fdt, int nodeoffset,
        return (void *)(uintptr_t)fdt_getprop_namelen(fdt, nodeoffset, name,
                                                      namelen, lenp);
 }
-#endif
 
 /**
  * fdt_getprop - retrieve the value of a given property
@@ -718,10 +707,8 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
  * Identical to fdt_get_alias(), but only examine the first namelen
  * characters of name for matching the alias name.
  */
-#ifndef SWIG /* Not available in Python */
 const char *fdt_get_alias_namelen(const void *fdt,
                                  const char *name, int namelen);
-#endif
 
 /**
  * fdt_get_alias - retrieve the path referenced by a given alias
@@ -1119,12 +1106,10 @@ int fdt_size_cells(const void *fdt, int nodeoffset);
  * of the name. It is useful when you want to manipulate only one value of
  * an array and you have a string that doesn't end with \0.
  */
-#ifndef SWIG /* Not available in Python */
 int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
                                        const char *name, int namelen,
                                        uint32_t idx, const void *val,
                                        int len);
-#endif
 
 /**
  * fdt_setprop_inplace - change a property's value, but not its size
@@ -1154,10 +1139,8 @@ int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
  *     -FDT_ERR_BADSTRUCTURE,
  *     -FDT_ERR_TRUNCATED, standard meanings
  */
-#ifndef SWIG /* Not available in Python */
 int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
                        const void *val, int len);
-#endif
 
 /**
  * fdt_setprop_inplace_u32 - change the value of a 32-bit integer property
@@ -1544,36 +1527,6 @@ static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
 #define fdt_setprop_string(fdt, nodeoffset, name, str) \
        fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
 
-
-/**
- * fdt_setprop_empty - set a property to an empty value
- * @fdt: pointer to the device tree blob
- * @nodeoffset: offset of the node whose property to change
- * @name: name of the property to change
- *
- * fdt_setprop_empty() sets the value of the named property in the
- * given node to an empty (zero length) value, or creates a new empty
- * property if it does not already exist.
- *
- * This function may insert or delete data from the blob, and will
- * therefore change the offsets of some existing nodes.
- *
- * returns:
- *     0, on success
- *     -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
- *             contain the new property value
- *     -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
- *     -FDT_ERR_BADLAYOUT,
- *     -FDT_ERR_BADMAGIC,
- *     -FDT_ERR_BADVERSION,
- *     -FDT_ERR_BADSTATE,
- *     -FDT_ERR_BADSTRUCTURE,
- *     -FDT_ERR_BADLAYOUT,
- *     -FDT_ERR_TRUNCATED, standard meanings
- */
-#define fdt_setprop_empty(fdt, nodeoffset, name) \
-       fdt_setprop((fdt), (nodeoffset), (name), NULL, 0)
-
 /**
  * fdt_appendprop - append to or create a property
  * @fdt: pointer to the device tree blob
@@ -1751,10 +1704,8 @@ int fdt_delprop(void *fdt, int nodeoffset, const char *name);
  * creating subnodes based on a portion of a larger string, such as a
  * full path.
  */
-#ifndef SWIG /* Not available in Python */
 int fdt_add_subnode_namelen(void *fdt, int parentoffset,
                            const char *name, int namelen);
-#endif
 
 /**
  * fdt_add_subnode - creates a new node
index 952056cddf09a8f7beffec104a9507961b3d85e1..99f936dacc60a661ecc76cd2373771ec94d976d4 100644 (file)
 #include <string.h>
 
 #ifdef __CHECKER__
-#define FDT_FORCE __attribute__((force))
-#define FDT_BITWISE __attribute__((bitwise))
+#define __force __attribute__((force))
+#define __bitwise __attribute__((bitwise))
 #else
-#define FDT_FORCE
-#define FDT_BITWISE
+#define __force
+#define __bitwise
 #endif
 
-typedef uint16_t FDT_BITWISE fdt16_t;
-typedef uint32_t FDT_BITWISE fdt32_t;
-typedef uint64_t FDT_BITWISE fdt64_t;
+typedef uint16_t __bitwise fdt16_t;
+typedef uint32_t __bitwise fdt32_t;
+typedef uint64_t __bitwise fdt64_t;
 
 #define EXTRACT_BYTE(x, n)     ((unsigned long long)((uint8_t *)&x)[n])
 #define CPU_TO_FDT16(x) ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
@@ -80,29 +80,29 @@ typedef uint64_t FDT_BITWISE fdt64_t;
 
 static inline uint16_t fdt16_to_cpu(fdt16_t x)
 {
-       return (FDT_FORCE uint16_t)CPU_TO_FDT16(x);
+       return (__force uint16_t)CPU_TO_FDT16(x);
 }
 static inline fdt16_t cpu_to_fdt16(uint16_t x)
 {
-       return (FDT_FORCE fdt16_t)CPU_TO_FDT16(x);
+       return (__force fdt16_t)CPU_TO_FDT16(x);
 }
 
 static inline uint32_t fdt32_to_cpu(fdt32_t x)
 {
-       return (FDT_FORCE uint32_t)CPU_TO_FDT32(x);
+       return (__force uint32_t)CPU_TO_FDT32(x);
 }
 static inline fdt32_t cpu_to_fdt32(uint32_t x)
 {
-       return (FDT_FORCE fdt32_t)CPU_TO_FDT32(x);
+       return (__force fdt32_t)CPU_TO_FDT32(x);
 }
 
 static inline uint64_t fdt64_to_cpu(fdt64_t x)
 {
-       return (FDT_FORCE uint64_t)CPU_TO_FDT64(x);
+       return (__force uint64_t)CPU_TO_FDT64(x);
 }
 static inline fdt64_t cpu_to_fdt64(uint64_t x)
 {
-       return (FDT_FORCE fdt64_t)CPU_TO_FDT64(x);
+       return (__force fdt64_t)CPU_TO_FDT64(x);
 }
 #undef CPU_TO_FDT64
 #undef CPU_TO_FDT32
index 3673de07e4e58c1d1e86619a4be6f479f1429c08..17ff9c1ae881973ff81cb6b34114761a97cb6101 100644 (file)
@@ -216,6 +216,28 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)
        return old_node;
 }
 
+void add_orphan_node(struct node *dt, struct node *new_node, char *ref)
+{
+       static unsigned int next_orphan_fragment;
+       struct node *node;
+       struct property *p;
+       struct data d = empty_data;
+       char *name;
+
+       d = data_add_marker(d, REF_PHANDLE, ref);
+       d = data_append_integer(d, 0xffffffff, 32);
+
+       p = build_property("target", d);
+
+       xasprintf(&name, "fragment@%u",
+                       next_orphan_fragment++);
+       name_node(new_node, "__overlay__");
+       node = build_node(p, new_node);
+       name_node(node, name);
+
+       add_child(dt, node);
+}
+
 struct node *chain_node(struct node *first, struct node *list)
 {
        assert(first->next_sibling == NULL);
@@ -319,8 +341,8 @@ struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size)
 
        memset(new, 0, sizeof(*new));
 
-       new->address = address;
-       new->size = size;
+       new->re.address = address;
+       new->re.size = size;
 
        return new;
 }
@@ -393,7 +415,7 @@ struct property *get_property(struct node *node, const char *propname)
 cell_t propval_cell(struct property *prop)
 {
        assert(prop->val.len == sizeof(cell_t));
-       return fdt32_to_cpu(*((fdt32_t *)prop->val.val));
+       return fdt32_to_cpu(*((cell_t *)prop->val.val));
 }
 
 struct property *get_property_by_label(struct node *tree, const char *label,
@@ -599,13 +621,13 @@ static int cmp_reserve_info(const void *ax, const void *bx)
        a = *((const struct reserve_info * const *)ax);
        b = *((const struct reserve_info * const *)bx);
 
-       if (a->address < b->address)
+       if (a->re.address < b->re.address)
                return -1;
-       else if (a->address > b->address)
+       else if (a->re.address > b->re.address)
                return 1;
-       else if (a->size < b->size)
+       else if (a->re.size < b->re.size)
                return -1;
-       else if (a->size > b->size)
+       else if (a->re.size > b->re.size)
                return 1;
        else
                return 0;
@@ -902,7 +924,7 @@ static void add_local_fixup_entry(struct dt_info *dti,
                struct node *refnode)
 {
        struct node *wn, *nwn;  /* local fixup node, walk node, new */
-       fdt32_t value_32;
+       uint32_t value_32;
        char **compp;
        int i, depth;
 
index 7caca8257c6d192e2b35c4c2fc9b317b1e74a870..2cdfcd82e95e09044827277fa66b83864c9e80bf 100644 (file)
@@ -22,7 +22,6 @@
 
 #include <stdio.h>
 #include <stdbool.h>
-#include "util.h"
 
 struct srcfile_state {
        FILE *f;
@@ -107,10 +106,12 @@ extern void srcpos_update(struct srcpos *pos, const char *text, int len);
 extern struct srcpos *srcpos_copy(struct srcpos *pos);
 extern char *srcpos_string(struct srcpos *pos);
 
-extern void PRINTF(3, 0) srcpos_verror(struct srcpos *pos, const char *prefix,
-                                       const char *fmt, va_list va);
-extern void PRINTF(3, 4) srcpos_error(struct srcpos *pos, const char *prefix,
-                                     const char *fmt, ...);
+extern void srcpos_verror(struct srcpos *pos, const char *prefix,
+                         const char *fmt, va_list va)
+       __attribute__((format(printf, 3, 0)));
+extern void srcpos_error(struct srcpos *pos, const char *prefix,
+                        const char *fmt, ...)
+       __attribute__((format(printf, 3, 4)));
 
 extern void srcpos_set_line(char *f, int l);
 
index 2461a3d068a0d1d73169dafa7598e455dda8738b..c9d8967969f9ec03b264a9d769a18bc2df8529d2 100644 (file)
@@ -137,7 +137,7 @@ static void write_propval_string(FILE *f, struct data val)
 static void write_propval_cells(FILE *f, struct data val)
 {
        void *propend = val.val + val.len;
-       fdt32_t *cp = (fdt32_t *)val.val;
+       cell_t *cp = (cell_t *)val.val;
        struct marker *m = val.markers;
 
        fprintf(f, "<");
@@ -275,8 +275,8 @@ void dt_to_source(FILE *f, struct dt_info *dti)
                for_each_label(re->labels, l)
                        fprintf(f, "%s: ", l->label);
                fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n",
-                       (unsigned long long)re->address,
-                       (unsigned long long)re->size);
+                       (unsigned long long)re->re.address,
+                       (unsigned long long)re->re.size);
        }
 
        write_tree_source_node(f, dti->dt, 0);
old mode 100755 (executable)
new mode 100644 (file)
index 62f0d53..965f5fb
@@ -1,5 +1,4 @@
 #!/bin/sh
-# SPDX-License-Identifier: GPL-2.0
 # Simple script to update the version of DTC carried by the Linux kernel
 #
 # This script assumes that the dtc and the linux git trees are in the
@@ -35,21 +34,12 @@ DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c
                srcpos.h treesource.c util.c util.h version_gen.h Makefile.dtc \
                dtc-lexer.l dtc-parser.y"
 DTC_GENERATED="dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h"
-LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_empty_tree.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h"
-
-get_last_dtc_version() {
-       git log --oneline scripts/dtc/ | grep 'upstream' | head -1 | sed -e 's/^.* \(.*\)/\1/'
-}
-
-last_dtc_ver=$(get_last_dtc_version)
+LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_empty_tree.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c fdt_wip.c fdt_address.c fdt_overlay.c libfdt.h libfdt_env.h libfdt_internal.h"
 
 # Build DTC
 cd $DTC_UPSTREAM_PATH
 make clean
 make check
-dtc_version=$(git describe HEAD)
-dtc_log=$(git log --oneline ${last_dtc_ver}..)
-
 
 # Copy the files into the Linux tree
 cd $DTC_LINUX_PATH
@@ -70,13 +60,4 @@ sed -i -- 's/#include <libfdt_env.h>/#include "libfdt_env.h"/g' ./libfdt/libfdt.
 sed -i -- 's/#include <fdt.h>/#include "fdt.h"/g' ./libfdt/libfdt.h
 git add ./libfdt/libfdt.h
 
-commit_msg=$(cat << EOF
-scripts/dtc: Update to upstream version ${dtc_version}
-
-This adds the following commits from upstream:
-
-${dtc_log}
-EOF
-)
-
-git commit -e -v -s -m "${commit_msg}"
+git commit -e -v -m "scripts/dtc: Update to upstream version [CHANGEME]"
index 9953c32a024473c60d5b9db39b3ed6fee5ba8532..40e522e0c6e6eceaf9311b52b04b4bbd58ceb775 100644 (file)
@@ -34,7 +34,7 @@
 
 #include "libfdt.h"
 #include "util.h"
-#include "version_gen.h"
+#include "version_non_gen.h"
 
 char *xstrdup(const char *s)
 {
@@ -396,7 +396,7 @@ void utilfdt_print_data(const char *data, int len)
                } while (s < data + len);
 
        } else if ((len % 4) == 0) {
-               const fdt32_t *cell = (const fdt32_t *)data;
+               const uint32_t *cell = (const uint32_t *)data;
 
                printf(" = <");
                for (i = 0, len /= 4; i < len; i++)
@@ -412,16 +412,15 @@ void utilfdt_print_data(const char *data, int len)
        }
 }
 
-void NORETURN util_version(void)
+void util_version(void)
 {
        printf("Version: %s\n", DTC_VERSION);
        exit(0);
 }
 
-void NORETURN util_usage(const char *errmsg, const char *synopsis,
-                        const char *short_opts,
-                        struct option const long_opts[],
-                        const char * const opts_help[])
+void util_usage(const char *errmsg, const char *synopsis,
+               const char *short_opts, struct option const long_opts[],
+               const char * const opts_help[])
 {
        FILE *fp = errmsg ? stderr : stdout;
        const char a_arg[] = "<arg>";
index ad5f41199edbb74f3bdb97bdfc908caab6145571..f5c4f1b50d3036d645a15fb0f05f2db4474eaace 100644 (file)
  *                                                                   USA
  */
 
-#ifdef __GNUC__
-#define PRINTF(i, j)   __attribute__((format (printf, i, j)))
-#define NORETURN       __attribute__((noreturn))
-#else
-#define PRINTF(i, j)
-#define NORETURN
-#endif
-
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
 
-static inline void NORETURN PRINTF(1, 2) die(const char *str, ...)
+static inline void __attribute__((noreturn)) die(const char *str, ...)
 {
        va_list ap;
 
@@ -61,14 +53,13 @@ static inline void *xrealloc(void *p, size_t len)
        void *new = realloc(p, len);
 
        if (!new)
-               die("realloc() failed (len=%zd)\n", len);
+               die("realloc() failed (len=%d)\n", len);
 
        return new;
 }
 
 extern char *xstrdup(const char *s);
-
-extern int PRINTF(2, 3) xasprintf(char **strp, const char *fmt, ...);
+extern int xasprintf(char **strp, const char *fmt, ...);
 extern char *join_path(const char *path, const char *name);
 
 /**
@@ -197,7 +188,7 @@ void utilfdt_print_data(const char *data, int len);
 /**
  * Show source version and exit
  */
-void NORETURN util_version(void);
+void util_version(void) __attribute__((noreturn));
 
 /**
  * Show usage and exit
@@ -211,10 +202,9 @@ void NORETURN util_version(void);
  * @param long_opts    The structure of long options
  * @param opts_help    An array of help strings (should align with long_opts)
  */
-void NORETURN util_usage(const char *errmsg, const char *synopsis,
-                        const char *short_opts,
-                        struct option const long_opts[],
-                        const char * const opts_help[]);
+void util_usage(const char *errmsg, const char *synopsis,
+               const char *short_opts, struct option const long_opts[],
+               const char * const opts_help[]) __attribute__((noreturn));
 
 /**
  * Show usage and exit
index 1229e07b4912bd477ce7839257f0fb36105d8dde..ad9b05ae698b0495ecbda42ffcf4743555313a27 100644 (file)
@@ -1 +1 @@
-#define DTC_VERSION "DTC 1.4.4-g756ffc4f"
+#define DTC_VERSION "DTC 1.4.1-g53bf130b"
diff --git a/scripts/dtc/version_non_gen.h b/scripts/dtc/version_non_gen.h
new file mode 100644 (file)
index 0000000..bddc1fd
--- /dev/null
@@ -0,0 +1 @@
+#define DTC_VERSION "DTC 1.4.2-Android-build"