diff options
Diffstat (limited to 'arch')
31 files changed, 28 insertions, 11152 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 4c780455136..a0d1146a057 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -181,6 +181,10 @@ config SYS_SUPPORTS_APM_EMULATION default y if PMAC_APM_EMU bool +config DTC + bool + default y + config DEFAULT_UIMAGE bool help diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 4458abb67c5..8da2bf963b5 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -33,7 +33,7 @@ ifeq ($(call cc-option-yn, -fstack-protector),y) BOOTCFLAGS += -fno-stack-protector endif -BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj) -I$(srctree)/$(src)/libfdt +BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj) DTS_FLAGS ?= -p 1024 @@ -53,9 +53,14 @@ zliblinuxheader := zlib.h zconf.h zutil.h $(addprefix $(obj)/,$(zlib) cuboot-c2k.o gunzip_util.o main.o prpmc2800.o): \ $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader)) -src-libfdt := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c +libfdt := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c +libfdtheader := fdt.h libfdt.h libfdt_internal.h + +$(addprefix $(obj)/,$(libfdt) libfdt-wrapper.o simpleboot.o): \ + $(addprefix $(obj)/,$(libfdtheader)) + src-wlib := string.S crt0.S crtsavres.S stdio.c main.c \ - $(addprefix libfdt/,$(src-libfdt)) libfdt-wrapper.c \ + $(libfdt) libfdt-wrapper.c \ ns16550.c serial.c simple_alloc.c div64.S util.S \ gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \ 4xx.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c bamboo.c \ @@ -96,6 +101,12 @@ $(addprefix $(obj)/,$(zlibheader)): $(obj)/%: $(srctree)/lib/zlib_inflate/% $(addprefix $(obj)/,$(zliblinuxheader)): $(obj)/%: $(srctree)/include/linux/% $(call cmd,copy_zliblinuxheader) +quiet_cmd_copy_libfdt = COPY $@ + cmd_copy_libfdt = cp $< $@ + +$(addprefix $(obj)/,$(libfdt) $(libfdtheader)): $(obj)/%: $(srctree)/scripts/dtc/libfdt/% + $(call cmd,copy_libfdt) + $(obj)/empty.c: @touch $@ @@ -103,6 +114,7 @@ $(obj)/zImage.lds $(obj)/zImage.coff.lds $(obj)/zImage.ps3.lds: $(obj)/%: $(srct @cp $< $@ clean-files := $(zlib) $(zlibheader) $(zliblinuxheader) \ + $(libfdt) $(libfdtheader) \ empty.c zImage.coff.lds zImage.ps3.lds zImage.lds quiet_cmd_bootcc = BOOTCC $@ @@ -114,6 +126,8 @@ quiet_cmd_bootas = BOOTAS $@ quiet_cmd_bootar = BOOTAR $@ cmd_bootar = $(CROSS32AR) -cr $@.$$$$ $(filter-out FORCE,$^); mv $@.$$$$ $@ +$(obj-libfdt): $(obj)/%.o: $(srctree)/scripts/dtc/libfdt/%.c FORCE + $(call if_changed_dep,bootcc) $(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c FORCE $(Q)mkdir -p $(dir $@) $(call if_changed_dep,bootcc) @@ -124,7 +138,7 @@ $(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S FORCE $(obj)/wrapper.a: $(obj-wlib) FORCE $(call if_changed,bootar) -hostprogs-y := addnote addRamDisk hack-coff mktree dtc +hostprogs-y := addnote addRamDisk hack-coff mktree targets += $(patsubst $(obj)/%,%,$(obj-boot) wrapper.a) extra-y := $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \ @@ -133,47 +147,10 @@ extra-y := $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \ dtstree := $(srctree)/$(src)/dts wrapper :=$(srctree)/$(src)/wrapper -wrapperbits := $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree dtc) \ +wrapperbits := $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree) \ $(wrapper) FORCE ############# -# Bits for building dtc -# DTC_GENPARSER := 1 # Uncomment to rebuild flex/bison output - -dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o srcpos.o checks.o -dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o -dtc-objs := $(addprefix dtc-src/, $(dtc-objs)) - -# prerequisites on generated files needs to be explicit -$(obj)/dtc-src/dtc-parser.tab.o: $(obj)/dtc-src/dtc-parser.tab.c $(obj)/dtc-src/dtc-parser.tab.h -$(obj)/dtc-src/dtc-lexer.lex.o: $(obj)/dtc-src/dtc-lexer.lex.c $(obj)/dtc-src/dtc-parser.tab.h - -HOSTCFLAGS += -I$(src)/dtc-src/ -I$(src)/libfdt/ - -targets += dtc-src/dtc-parser.tab.c -targets += dtc-src/dtc-lexer.lex.c - -clean-files += dtc-src/dtc-parser.tab.h - -ifdef DTC_GENPARSER -BISON = bison -FLEX = flex - -quiet_cmd_bison = BISON $@ - cmd_bison = $(BISON) -o$@ -d $<; cp $@ $@_shipped -quiet_cmd_flex = FLEX $@ - cmd_flex = $(FLEX) -o$@ $<; cp $@ $@_shipped - -$(obj)/dtc-src/dtc-parser.tab.c: $(src)/dtc-src/dtc-parser.y FORCE - $(call if_changed,bison) - -$(obj)/dtc-src/dtc-parser.tab.h: $(obj)/dtc-src/dtc-parser.tab.c - -$(obj)/dtc-src/dtc-lexer.lex.c: $(src)/dtc-src/dtc-lexer.l FORCE - $(call if_changed,flex) -endif - -############# # Bits for building various flavours of zImage ifneq ($(CROSS32_COMPILE),) @@ -347,8 +324,10 @@ $(obj)/treeImage.%: vmlinux $(obj)/%.dtb $(wrapperbits) $(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb) # Rule to build device tree blobs -$(obj)/%.dtb: $(dtstree)/%.dts $(obj)/dtc - $(obj)/dtc -O dtb -o $(obj)/$*.dtb -b 0 $(DTS_FLAGS) $(dtstree)/$*.dts +DTC = $(objtree)/scripts/dtc/dtc + +$(obj)/%.dtb: $(dtstree)/%.dts + $(DTC) -O dtb -o $(obj)/$*.dtb -b 0 $(DTS_FLAGS) $(dtstree)/$*.dts # If there isn't a platform selected then just strip the vmlinux. ifeq (,$(image-y)) diff --git a/arch/powerpc/boot/dtc-src/Makefile.dtc b/arch/powerpc/boot/dtc-src/Makefile.dtc deleted file mode 100644 index 6ddf9ecac66..00000000000 --- a/arch/powerpc/boot/dtc-src/Makefile.dtc +++ /dev/null @@ -1,9 +0,0 @@ -# Makefile.dtc -# -# This is not a complete Makefile of itself. Instead, it is designed to -# be easily embeddable into other systems of Makefiles. -# -DTC_SRCS = dtc.c flattree.c fstree.c data.c livetree.c treesource.c srcpos.c \ - checks.c -DTC_GEN_SRCS = dtc-lexer.lex.c dtc-parser.tab.c -DTC_OBJS = $(DTC_SRCS:%.c=%.o) $(DTC_GEN_SRCS:%.c=%.o) diff --git a/arch/powerpc/boot/dtc-src/checks.c b/arch/powerpc/boot/dtc-src/checks.c deleted file mode 100644 index 95485796f25..00000000000 --- a/arch/powerpc/boot/dtc-src/checks.c +++ /dev/null @@ -1,587 +0,0 @@ -/* - * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2007. - * - * - * This program 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 program 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "dtc.h" - -#ifdef TRACE_CHECKS -#define TRACE(c, ...) \ - do { \ - fprintf(stderr, "=== %s: ", (c)->name); \ - fprintf(stderr, __VA_ARGS__); \ - fprintf(stderr, "\n"); \ - } while (0) -#else -#define TRACE(c, fmt, ...) do { } while (0) -#endif - -enum checklevel { - IGNORE = 0, - WARN = 1, - ERROR = 2, -}; - -enum checkstatus { - UNCHECKED = 0, - PREREQ, - PASSED, - FAILED, -}; - -struct check; - -typedef void (*tree_check_fn)(struct check *c, struct node *dt); -typedef void (*node_check_fn)(struct check *c, struct node *dt, struct node *node); -typedef void (*prop_check_fn)(struct check *c, struct node *dt, - struct node *node, struct property *prop); - -struct check { - const char *name; - tree_check_fn tree_fn; - node_check_fn node_fn; - prop_check_fn prop_fn; - void *data; - enum checklevel level; - enum checkstatus status; - int inprogress; - int num_prereqs; - struct check **prereq; -}; - -#define CHECK(nm, tfn, nfn, pfn, d, lvl, ...) \ - static struct check *nm##_prereqs[] = { __VA_ARGS__ }; \ - static struct check nm = { \ - .name = #nm, \ - .tree_fn = (tfn), \ - .node_fn = (nfn), \ - .prop_fn = (pfn), \ - .data = (d), \ - .level = (lvl), \ - .status = UNCHECKED, \ - .num_prereqs = ARRAY_SIZE(nm##_prereqs), \ - .prereq = nm##_prereqs, \ - }; - -#define TREE_CHECK(nm, d, lvl, ...) \ - CHECK(nm, check_##nm, NULL, NULL, d, lvl, __VA_ARGS__) -#define NODE_CHECK(nm, d, lvl, ...) \ - CHECK(nm, NULL, check_##nm, NULL, d, lvl, __VA_ARGS__) -#define PROP_CHECK(nm, d, lvl, ...) \ - CHECK(nm, NULL, NULL, check_##nm, d, lvl, __VA_ARGS__) -#define BATCH_CHECK(nm, lvl, ...) \ - CHECK(nm, NULL, NULL, NULL, NULL, lvl, __VA_ARGS__) - -#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->level < WARN) || (c->level <= quiet)) - return; /* Suppress message */ - - fprintf(stderr, "%s (%s): ", - (c->level == ERROR) ? "ERROR" : "Warning", c->name); - vfprintf(stderr, fmt, ap); - fprintf(stderr, "\n"); -} - -#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 node *dt, struct node *node) -{ - struct node *child; - struct property *prop; - - TRACE(c, "%s", node->fullpath); - if (c->node_fn) - c->node_fn(c, dt, node); - - if (c->prop_fn) - for_each_property(node, prop) { - TRACE(c, "%s\t'%s'", node->fullpath, prop->name); - c->prop_fn(c, dt, node, prop); - } - - for_each_child(node, child) - check_nodes_props(c, dt, child); -} - -static int run_check(struct check *c, struct node *dt) -{ - int error = 0; - int i; - - assert(!c->inprogress); - - if (c->status != UNCHECKED) - goto out; - - c->inprogress = 1; - - for (i = 0; i < c->num_prereqs; i++) { - struct check *prq = c->prereq[i]; - error |= run_check(prq, dt); - if (prq->status != PASSED) { - c->status = PREREQ; - check_msg(c, "Failed prerequisite '%s'", - c->prereq[i]->name); - } - } - - if (c->status != UNCHECKED) - goto out; - - if (c->node_fn || c->prop_fn) - check_nodes_props(c, dt, dt); - - if (c->tree_fn) - c->tree_fn(c, dt); - if (c->status == UNCHECKED) - c->status = PASSED; - - TRACE(c, "\tCompleted, status %d", c->status); - -out: - c->inprogress = 0; - if ((c->status != PASSED) && (c->level == ERROR)) - error = 1; - return error; -} - -/* - * Utility check functions - */ - -static void check_is_string(struct check *c, struct node *root, - struct node *node) -{ - struct property *prop; - char *propname = c->data; - - prop = get_property(node, propname); - if (!prop) - return; /* Not present, assumed ok */ - - if (!data_is_one_string(prop->val)) - FAIL(c, "\"%s\" property in %s is not a string", - propname, node->fullpath); -} -#define CHECK_IS_STRING(nm, propname, lvl) \ - CHECK(nm, NULL, check_is_string, NULL, (propname), (lvl)) - -static void check_is_cell(struct check *c, struct node *root, - struct node *node) -{ - struct property *prop; - char *propname = c->data; - - prop = get_property(node, propname); - if (!prop) - return; /* Not present, assumed ok */ - - if (prop->val.len != sizeof(cell_t)) - FAIL(c, "\"%s\" property in %s is not a single cell", - propname, node->fullpath); -} -#define CHECK_IS_CELL(nm, propname, lvl) \ - CHECK(nm, NULL, check_is_cell, NULL, (propname), (lvl)) - -/* - * Structural check functions - */ - -static void check_duplicate_node_names(struct check *c, struct node *dt, - struct node *node) -{ - struct node *child, *child2; - - for_each_child(node, child) - for (child2 = child->next_sibling; - child2; - child2 = child2->next_sibling) - if (streq(child->name, child2->name)) - FAIL(c, "Duplicate node name %s", - child->fullpath); -} -NODE_CHECK(duplicate_node_names, NULL, ERROR); - -static void check_duplicate_property_names(struct check *c, struct node *dt, - struct node *node) -{ - struct property *prop, *prop2; - - for_each_property(node, prop) - for (prop2 = prop->next; prop2; prop2 = prop2->next) - if (streq(prop->name, prop2->name)) - FAIL(c, "Duplicate property name %s in %s", - prop->name, node->fullpath); -} -NODE_CHECK(duplicate_property_names, NULL, ERROR); - -#define LOWERCASE "abcdefghijklmnopqrstuvwxyz" -#define UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ" -#define DIGITS "0123456789" -#define PROPNODECHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-" - -static void check_node_name_chars(struct check *c, struct node *dt, - struct node *node) -{ - int n = strspn(node->name, c->data); - - if (n < strlen(node->name)) - FAIL(c, "Bad character '%c' in node %s", - node->name[n], node->fullpath); -} -NODE_CHECK(node_name_chars, PROPNODECHARS "@", ERROR); - -static void check_node_name_format(struct check *c, struct node *dt, - struct node *node) -{ - if (strchr(get_unitname(node), '@')) - FAIL(c, "Node %s has multiple '@' characters in name", - node->fullpath); -} -NODE_CHECK(node_name_format, NULL, ERROR, &node_name_chars); - -static void check_property_name_chars(struct check *c, struct node *dt, - struct node *node, struct property *prop) -{ - int n = strspn(prop->name, c->data); - - if (n < strlen(prop->name)) - FAIL(c, "Bad character '%c' in property name \"%s\", node %s", - prop->name[n], prop->name, node->fullpath); -} -PROP_CHECK(property_name_chars, PROPNODECHARS, ERROR); - -static void check_explicit_phandles(struct check *c, struct node *root, - struct node *node) -{ - struct property *prop; - struct node *other; - cell_t phandle; - - prop = get_property(node, "linux,phandle"); - if (! prop) - return; /* No phandle, that's fine */ - - if (prop->val.len != sizeof(cell_t)) { - FAIL(c, "%s has bad length (%d) linux,phandle property", - node->fullpath, prop->val.len); - return; - } - - phandle = propval_cell(prop); - if ((phandle == 0) || (phandle == -1)) { - FAIL(c, "%s has invalid linux,phandle value 0x%x", - node->fullpath, phandle); - return; - } - - other = get_node_by_phandle(root, phandle); - if (other) { - FAIL(c, "%s has duplicated phandle 0x%x (seen before at %s)", - node->fullpath, phandle, other->fullpath); - return; - } - - node->phandle = phandle; -} -NODE_CHECK(explicit_phandles, NULL, ERROR); - -static void check_name_properties(struct check *c, struct node *root, - struct node *node) -{ - struct property **pp, *prop = NULL; - - for (pp = &node->proplist; *pp; pp = &((*pp)->next)) - if (streq((*pp)->name, "name")) { - prop = *pp; - break; - } - - if (!prop) - return; /* No name property, that's fine */ - - if ((prop->val.len != node->basenamelen+1) - || (memcmp(prop->val.val, node->name, node->basenamelen) != 0)) { - 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. - * Delete it */ - *pp = prop->next; - free(prop->name); - data_free(prop->val); - free(prop); - } -} -CHECK_IS_STRING(name_is_string, "name", ERROR); -NODE_CHECK(name_properties, NULL, ERROR, &name_is_string); - -/* - * Reference fixup functions - */ - -static void fixup_phandle_references(struct check *c, struct node *dt, - struct node *node, struct property *prop) -{ - struct marker *m = prop->val.markers; - struct node *refnode; - cell_t phandle; - - for_each_marker_of_type(m, REF_PHANDLE) { - assert(m->offset + sizeof(cell_t) <= prop->val.len); - - refnode = get_node_by_ref(dt, m->ref); - if (! refnode) { - FAIL(c, "Reference to non-existent node or label \"%s\"\n", - m->ref); - continue; - } - - phandle = get_node_phandle(dt, refnode); - *((cell_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle); - } -} -CHECK(phandle_references, NULL, NULL, fixup_phandle_references, NULL, ERROR, - &duplicate_node_names, &explicit_phandles); - -static void fixup_path_references(struct check *c, struct node *dt, - struct node *node, struct property *prop) -{ - struct marker *m = prop->val.markers; - struct node *refnode; - char *path; - - for_each_marker_of_type(m, REF_PATH) { - assert(m->offset <= prop->val.len); - - refnode = get_node_by_ref(dt, m->ref); - if (!refnode) { - FAIL(c, "Reference to non-existent node or label \"%s\"\n", - m->ref); - continue; - } - - path = refnode->fullpath; - prop->val = data_insert_at_marker(prop->val, m, path, - strlen(path) + 1); - } -} -CHECK(path_references, NULL, NULL, fixup_path_references, NULL, ERROR, - &duplicate_node_names); - -/* - * Semantic checks - */ -CHECK_IS_CELL(address_cells_is_cell, "#address-cells", WARN); -CHECK_IS_CELL(size_cells_is_cell, "#size-cells", WARN); -CHECK_IS_CELL(interrupt_cells_is_cell, "#interrupt-cells", WARN); - -CHECK_IS_STRING(device_type_is_string, "device_type", WARN); -CHECK_IS_STRING(model_is_string, "model", WARN); -CHECK_IS_STRING(status_is_string, "status", WARN); - -static void fixup_addr_size_cells(struct check *c, struct node *dt, - struct node *node) -{ - struct property *prop; - - node->addr_cells = -1; - node->size_cells = -1; - - prop = get_property(node, "#address-cells"); - if (prop) - node->addr_cells = propval_cell(prop); - - prop = get_property(node, "#size-cells"); - if (prop) - node->size_cells = propval_cell(prop); -} -CHECK(addr_size_cells, NULL, fixup_addr_size_cells, NULL, NULL, WARN, - &address_cells_is_cell, &size_cells_is_cell); - -#define node_addr_cells(n) \ - (((n)->addr_cells == -1) ? 2 : (n)->addr_cells) -#define node_size_cells(n) \ - (((n)->size_cells == -1) ? 1 : (n)->size_cells) - -static void check_reg_format(struct check *c, struct node *dt, - struct node *node) -{ - struct property *prop; - int addr_cells, size_cells, entrylen; - - prop = get_property(node, "reg"); - if (!prop) - return; /* No "reg", that's fine */ - - if (!node->parent) { - FAIL(c, "Root node has a \"reg\" property"); - return; - } - - if (prop->val.len == 0) - 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 ((prop->val.len % entrylen) != 0) - 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); -} -NODE_CHECK(reg_format, NULL, WARN, &addr_size_cells); - -static void check_ranges_format(struct check *c, struct node *dt, - struct node *node) -{ - struct property *prop; - int c_addr_cells, p_addr_cells, c_size_cells, p_size_cells, entrylen; - - prop = get_property(node, "ranges"); - if (!prop) - return; - - if (!node->parent) { - FAIL(c, "Root node has a \"ranges\" property"); - return; - } - - p_addr_cells = node_addr_cells(node->parent); - p_size_cells = node_size_cells(node->parent); - c_addr_cells = node_addr_cells(node); - c_size_cells = node_size_cells(node); - entrylen = (p_addr_cells + c_addr_cells + c_size_cells) * sizeof(cell_t); - - if (prop->val.len == 0) { - if (p_addr_cells != c_addr_cells) - 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, "%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, "\"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); - } -} -NODE_CHECK(ranges_format, NULL, WARN, &addr_size_cells); - -/* - * Style checks - */ -static void check_avoid_default_addr_size(struct check *c, struct node *dt, - struct node *node) -{ - struct property *reg, *ranges; - - if (!node->parent) - return; /* Ignore root node */ - - reg = get_property(node, "reg"); - ranges = get_property(node, "ranges"); - - if (!reg && !ranges) - return; - - if ((node->parent->addr_cells == -1)) - FAIL(c, "Relying on default #address-cells value for %s", - node->fullpath); - - if ((node->parent->size_cells == -1)) - FAIL(c, "Relying on default #size-cells value for %s", - node->fullpath); -} -NODE_CHECK(avoid_default_addr_size, NULL, WARN, &addr_size_cells); - -static void check_obsolete_chosen_interrupt_controller(struct check *c, - struct node *dt) -{ - struct node *chosen; - struct property *prop; - - chosen = get_node_by_path(dt, "/chosen"); - if (!chosen) - return; - - prop = get_property(chosen, "interrupt-controller"); - if (prop) - FAIL(c, "/chosen has obsolete \"interrupt-controller\" " - "property"); -} -TREE_CHECK(obsolete_chosen_interrupt_controller, NULL, WARN); - -static struct check *check_table[] = { - &duplicate_node_names, &duplicate_property_names, - &node_name_chars, &node_name_format, &property_name_chars, - &name_is_string, &name_properties, - &explicit_phandles, - &phandle_references, &path_references, - - &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell, - &device_type_is_string, &model_is_string, &status_is_string, - - &addr_size_cells, ®_format, &ranges_format, - - &avoid_default_addr_size, - &obsolete_chosen_interrupt_controller, -}; - -void process_checks(int force, struct boot_info *bi) -{ - struct node *dt = bi->dt; - int i; - int error = 0; - - for (i = 0; i < ARRAY_SIZE(check_table); i++) { - struct check *c = check_table[i]; - - if (c->level != IGNORE) - error = error || run_check(c, dt); - } - - if (error) { - if (!force) { - fprintf(stderr, "ERROR: Input tree has errors, aborting " - "(use -f to force output)\n"); - exit(2); - } else if (quiet < 3) { - fprintf(stderr, "Warning: Input tree has errors, " - "output forced\n"); - } - } -} diff --git a/arch/powerpc/boot/dtc-src/data.c b/arch/powerpc/boot/dtc-src/data.c deleted file mode 100644 index dd2e3d39d4c..00000000000 --- a/arch/powerpc/boot/dtc-src/data.c +++ /dev/null @@ -1,321 +0,0 @@ -/* - * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. - * - * - * This program 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 program 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "dtc.h" - -void data_free(struct data d) -{ - struct marker *m, *nm; - - m = d.markers; - while (m) { - nm = m->next; - free(m->ref); - free(m); - m = nm; - } - - if (d.val) - free(d.val); -} - -struct data data_grow_for(struct data d, int xlen) -{ - struct data nd; - int newsize; - - if (xlen == 0) - return d; - - nd = d; - - newsize = xlen; - - while ((d.len + xlen) > newsize) - newsize *= 2; - - nd.val = xrealloc(d.val, newsize); - - return nd; -} - -struct data data_copy_mem(const char *mem, int len) -{ - struct data d; - - d = data_grow_for(empty_data, len); - - d.len = len; - memcpy(d.val, mem, len); - - return d; -} - -static char get_oct_char(const char *s, int *i) -{ - char x[4]; - char *endx; - long val; - - x[3] = '\0'; - strncpy(x, s + *i, 3); - - val = strtol(x, &endx, 8); - - assert(endx > x); - - (*i) += endx - x; - return val; -} - -static char get_hex_char(const char *s, int *i) -{ - char x[3]; - char *endx; - long val; - - x[2] = '\0'; - strncpy(x, s + *i, 2); - - val = strtol(x, &endx, 16); - if (!(endx > x)) - die("\\x used with no following hex digits\n"); - - (*i) += endx - x; - return val; -} - -struct data data_copy_escape_string(const char *s, int len) -{ - int i = 0; - struct data d; - char *q; - - d = data_grow_for(empty_data, strlen(s)+1); - - q = d.val; - while (i < len) { - char c = s[i++]; - - if (c != '\\') { - q[d.len++] = c; - continue; - } - - c = s[i++]; - assert(c); - switch (c) { - case 'a': - q[d.len++] = '\a'; - break; - case 'b': - q[d.len++] = '\b'; - break; - case 't': - q[d.len++] = '\t'; - break; - case 'n': - q[d.len++] = '\n'; - break; - case 'v': - q[d.len++] = '\v'; - break; - case 'f': - q[d.len++] = '\f'; - break; - case 'r': - q[d.len++] = '\r'; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - i--; /* need to re-read the first digit as - * part of the octal value */ - q[d.len++] = get_oct_char(s, &i); - break; - case 'x': - q[d.len++] = get_hex_char(s, &i); - break; - default: - q[d.len++] = c; - } - } - - q[d.len++] = '\0'; - return d; -} - -struct data data_copy_file(FILE *f, size_t maxlen) -{ - stru |