History

Merge tag 'devicetree-for-4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux

Pull DeviceTree updates from Rob Herring: - fix sparse warnings in drivers/of/ - add more overlay unittests - update dtc to v1.4.4-8-g756ffc4f52f6. This adds more checks on dts files such as unit-address formatting and stricter character sets for node and property names - add a common DT modalias function - move trivial-devices.txt up and out of i2c dir - ARM NVIC interrupt controller binding - vendor prefixes for Sensirion, Dioo, Nordic, ROHM - correct some binding file locations * tag 'devicetree-for-4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux: (24 commits) of: fix sparse warnings in fdt, irq, reserved mem, and resolver code of: fix sparse warning in of_pci_range_parser_one of: fix sparse warnings in of_find_next_cache_node of/unittest: Missing unlocks on error of: fix uninitialized variable warning for overlay test of: fix unittest build without CONFIG_OF_OVERLAY of: Add unit tests for applying overlays of: per-file dtc compiler flags fpga: region: add missing DT documentation for config complete timeout of: Add vendor prefix for ROHM Semiconductor of: fix "/cpus" reference leak in of_numa_parse_cpu_nodes() of: Add vendor prefix for Nordic Semiconductor dt-bindings: arm,nvic: Binding for ARM NVIC interrupt controller on Cortex-M dtc: update warning settings for new bus and node/property name checks scripts/dtc: Update to upstream version v1.4.4-8-g756ffc4f52f6 scripts/dtc: automate getting dtc version and log in update script of: Add function for generating a DT modalias with a newline of: fix of_device_get_modalias returned length when truncating buffers Documentation: devicetree: move trivial-devices out of I2C realm dt-bindings: add vendor prefix for Dioo ..

Linus Torvalds committed 9 years ago

Commit 3ef2bc02 parents 2eecf3a 17a703549 files · +1152 −233Browse files

Unified · Split

49 files
  1. Documentation/devicetree/bindings/display/atmel/hlcdc-dc.txt +1 −1
  2. Documentation/devicetree/bindings/fpga/fpga-region.txt +2 −0
  3. Documentation/devicetree/bindings/interrupt-controller/arm,nvic.txt +36 −0
  4. Documentation/devicetree/bindings/mfd/atmel-hlcdc.txt +1 −1
  5. Documentation/devicetree/bindings/net/faraday,ftmac.txt +5 −2
  6. Documentation/devicetree/bindings/trivial-devices.txt +0 −0
  7. Documentation/devicetree/bindings/vendor-prefixes.txt +3 −0
  8. arch/powerpc/platforms/pseries/ibmebus.c +1 −4
  9. drivers/base/platform.c +1 −1
  10. drivers/macintosh/macio_sysfs.c +1 −6
  11. drivers/of/address.c +1 −1
  12. drivers/of/base.c +6 −7
  13. drivers/of/device.c +17 −3
  14. drivers/of/fdt.c +11 −7
  15. drivers/of/irq.c +1 −1
  16. drivers/of/of_numa.c +2 −0
  17. drivers/of/of_private.h +12 −0
  18. drivers/of/of_reserved_mem.c +1 −1
  19. drivers/of/resolver.c +1 −1
  20. drivers/of/unittest-data/Makefile +14 −3
  21. drivers/of/unittest-data/overlay.dts +53 −0
  22. drivers/of/unittest-data/overlay_bad_phandle.dts +20 −0
  23. drivers/of/unittest-data/overlay_base.dts +80 −0
  24. drivers/of/unittest.c +321 −0
  25. drivers/tty/serdev/core.c +1 −4
  26. drivers/usb/common/ulpi.c +1 −1
  27. include/linux/of_device.h +3 −4
  28. include/linux/of_irq.h +1 −1
  29. scripts/Makefile.lib +13 −1
  30. scripts/dtc/checks.c +319 −42
  31. scripts/dtc/data.c +8 −8
  32. scripts/dtc/dtc-lexer.l +2 −1
  33. scripts/dtc/dtc-lexer.lex.c_shipped +39 −38
  34. scripts/dtc/dtc-parser.tab.c_shipped +3 −3
  35. scripts/dtc/dtc-parser.y +3 −3
  36. scripts/dtc/dtc.c +5 −4
  37. scripts/dtc/dtc.h +8 −3
  38. scripts/dtc/flattree.c +26 −32
  39. scripts/dtc/libfdt/fdt_rw.c +2 −1
  40. scripts/dtc/libfdt/libfdt.h +50 −1
  41. scripts/dtc/libfdt/libfdt_env.h +13 −13
  42. scripts/dtc/livetree.c +12 −10
  43. scripts/dtc/srcpos.c +1 −1
  44. scripts/dtc/srcpos.h +5 −6
  45. scripts/dtc/treesource.c +3 −3
  46. scripts/dtc/update-dtc-source.sh +19 −1
  47. scripts/dtc/util.c +6 −5
  48. scripts/dtc/util.h +17 −7
  49. scripts/dtc/version_gen.h +1 −1
Documentation/devicetree/bindings/display/atmel/hlcdc-dc.txt+1−1
@@ -1,7 +1,7 @@
11 Device-Tree bindings for Atmel's HLCDC (High LCD Controller) DRM driver
22
33 The Atmel HLCDC Display Controller is subdevice of the HLCDC MFD device.
4−See ../mfd/atmel-hlcdc.txt for more details.
4+See ../../mfd/atmel-hlcdc.txt for more details.
55
66 Required properties:
77 - compatible: value should be "atmel,hlcdc-display-controller"
Documentation/devicetree/bindings/fpga/fpga-region.txt+2−0
@@ -193,6 +193,8 @@ Optional properties: · 192 unmodified lines
193193 - region-freeze-timeout-us : The maximum time in microseconds to wait for
194194 bridges to successfully become disabled before the region has been
195195 programmed.
196+- config-complete-timeout-us : The maximum time in microseconds time for the
197+ FPGA to go to operating mode after the region has been programmed.
196198 - child nodes : devices in the FPGA after programming.
197199
198200 In the example below, when an overlay is applied targeting fpga-region0,
Documentation/devicetree/bindings/interrupt-controller/arm,nvic.txt+36−0
@@ -0,0 +1,36 @@
1+* ARM Nested Vector Interrupt Controller (NVIC)
2+
3+The NVIC provides an interrupt controller that is tightly coupled to
4+Cortex-M based processor cores. The NVIC implemented on different SoCs
5+vary in the number of interrupts and priority bits per interrupt.
6+
7+Main node required properties:
8+
9+- compatible : should be one of:
10+ "arm,v6m-nvic"
11+ "arm,v7m-nvic"
12+ "arm,v8m-nvic"
13+- interrupt-controller : Identifies the node as an interrupt controller
14+- #interrupt-cells : Specifies the number of cells needed to encode an
15+ interrupt source. The type shall be a <u32> and the value shall be 2.
16+
17+ The 1st cell contains the interrupt number for the interrupt type.
18+
19+ The 2nd cell is the priority of the interrupt.
20+
21+- reg : Specifies base physical address(s) and size of the NVIC registers.
22+ This is at a fixed address (0xe000e100) and size (0xc00).
23+
24+- arm,num-irq-priority-bits: The number of priority bits implemented by the
25+ given SoC
26+
27+Example:
28+
29+ intc: interrupt-controller@e000e100 {
30+ compatible = "arm,v7m-nvic";
31+ #interrupt-cells = <2>;
32+ #address-cells = <1>;
33+ interrupt-controller;
34+ reg = <0xe000e100 0xc00>;
35+ arm,num-irq-priority-bits = <4>;
36+ };
Documentation/devicetree/bindings/mfd/atmel-hlcdc.txt+1−1
@@ -15,7 +15,7 @@ Required properties: · 14 unmodified lines
1515
1616 The HLCDC IP exposes two subdevices:
1717 - a PWM chip: see ../pwm/atmel-hlcdc-pwm.txt
18− - a Display Controller: see ../display/atmel-hlcdc-dc.txt
18+ - a Display Controller: see ../display/atmel/hlcdc-dc.txt
1919
2020 Example:
2121
Documentation/devicetree/bindings/net/faraday,ftmac.txtrenamed from Documentation/devicetree/bindings/net/moxa,moxart-mac.txt+5−2
@@ -1,8 +1,11 @@
1−MOXA ART Ethernet Controller
1+Faraday Ethernet Controller
22
33 Required properties:
44
5−- compatible : Must be "moxa,moxart-mac"
5+- compatible : Must contain "faraday,ftmac", as well as one of
6+ the SoC specific identifiers:
7+ "andestech,atmac100"
8+ "moxa,moxart-mac"
69 - reg : Should contain register location and length
710 - interrupts : Should contain the mac interrupt number
811
Documentation/devicetree/bindings/trivial-devices.txtrenamed from Documentation/devicetree/bindings/i2c/trivial-devices.txt+0−0

File renamed without changes.

Documentation/devicetree/bindings/vendor-prefixes.txt+3−0
@@ -80,6 +80,7 @@ denx Denx Software Engineering · 79 unmodified lines
8080 devantech Devantech, Ltd.
8181 digi Digi International Inc.
8282 digilent Diglent, Inc.
83+dioo Dioo Microcircuit Co., Ltd
8384 dlg Dialog Semiconductor
8485 dlink D-Link Corporation
8586 dmo Data Modul AG
@@ -215,6 +216,7 @@ newhaven Newhaven Display International · 129 unmodified lines
215216 ni National Instruments
216217 nintendo Nintendo
217218 nokia Nokia
219+nordic Nordic Semiconductor
218220 nuvoton Nuvoton Technology Corporation
219221 nvd New Vision Display
220222 nvidia NVIDIA
@@ -261,6 +263,7 @@ richtek Richtek Technology Corporation · 40 unmodified lines
261263 ricoh Ricoh Co. Ltd.
262264 rikomagic Rikomagic Tech Corp. Ltd
263265 rockchip Fuzhou Rockchip Electronics Co., Ltd
266+rohm ROHM Semiconductor Co., Ltd
264267 samsung Samsung Semiconductor
265268 samtec Samtec/Softing company
266269 sandisk Sandisk Corporation
arch/powerpc/platforms/pseries/ibmebus.c+1−4
@@ -410,10 +410,7 @@ static ssize_t name_show(struct device *dev, · 409 unmodified lines
410410 static ssize_t modalias_show(struct device *dev,
411411 struct device_attribute *attr, char *buf)
412412 {
413− ssize_t len = of_device_get_modalias(dev, buf, PAGE_SIZE - 2);
414− buf[len] = '\n';
415− buf[len+1] = 0;
416− return len+1;
413+ return of_device_modalias(dev, buf, PAGE_SIZE);
417414 }
418415
419416 static struct device_attribute ibmebus_bus_device_attrs[] = {
drivers/base/platform.c+1−1
@@ -847,7 +847,7 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *a, · 846 unmodified lines
847847 struct platform_device *pdev = to_platform_device(dev);
848848 int len;
849849
850− len = of_device_get_modalias(dev, buf, PAGE_SIZE -1);
850+ len = of_device_modalias(dev, buf, PAGE_SIZE);
851851 if (len != -ENODEV)
852852 return len;
853853
drivers/macintosh/macio_sysfs.c+1−6
@@ -41,12 +41,7 @@ compatible_show (struct device *dev, struct device_attribute *attr, char *buf) · 40 unmodified lines
4141 static ssize_t modalias_show (struct device *dev, struct device_attribute *attr,
4242 char *buf)
4343 {
44− int len = of_device_get_modalias(dev, buf, PAGE_SIZE - 2);
45−
46− buf[len] = '\n';
47− buf[len+1] = 0;
48−
49− return len+1;
44+ return of_device_modalias(dev, buf, PAGE_SIZE);
5045 }
5146
5247 static ssize_t devspec_show(struct device *dev,
drivers/of/address.c+1−1
@@ -263,7 +263,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser, · 262 unmodified lines
263263 if (!parser->range || parser->range + parser->np > parser->end)
264264 return NULL;
265265
266− range->pci_space = parser->range[0];
266+ range->pci_space = be32_to_cpup(parser->range);
267267 range->flags = of_bus_pci_get_flags(parser->range);
268268 range->pci_addr = of_read_number(parser->range + 1, ns);
269269 range->cpu_addr = of_translate_address(parser->node,
drivers/of/base.c+6−7
@@ -2281,15 +2281,14 @@ EXPORT_SYMBOL_GPL(of_console_check); · 2280 unmodified lines
22812281 */
22822282 struct device_node *of_find_next_cache_node(const struct device_node *np)
22832283 {
2284− struct device_node *child;
2285− const phandle *handle;
2284+ struct device_node *child, *cache_node;
22862285
2287− handle = of_get_property(np, "l2-cache", NULL);
2288− if (!handle)
2289− handle = of_get_property(np, "next-level-cache", NULL);
2286+ cache_node = of_parse_phandle(np, "l2-cache", 0);
2287+ if (!cache_node)
2288+ cache_node = of_parse_phandle(np, "next-level-cache", 0);
22902289
2291− if (handle)
2292− return of_find_node_by_phandle(be32_to_cpup(handle));
2290+ if (cache_node)
2291+ return cache_node;
22932292
22942293 /* OF on pmac has nodes instead of properties named "l2-cache"
22952294 * beneath CPU nodes.
drivers/of/device.c+17−3
@@ -176,7 +176,7 @@ const void *of_device_get_match_data(const struct device *dev) · 175 unmodified lines
176176 }
177177 EXPORT_SYMBOL(of_device_get_match_data);
178178
179−ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len)
179+static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len)
180180 {
181181 const char *compat;
182182 int cplen, i;
@@ -223,9 +223,8 @@ ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len) · 40 unmodified lines
223223 str[i] = '_';
224224 }
225225
226− return tsize;
226+ return repend;
227227 }
228−EXPORT_SYMBOL_GPL(of_device_get_modalias);
229228
230229 int of_device_request_module(struct device *dev)
231230 {
@@ -250,6 +249,21 @@ int of_device_request_module(struct device *dev) · 18 unmodified lines
250249 }
251250 EXPORT_SYMBOL_GPL(of_device_request_module);
252251
252+/**
253+ * of_device_modalias - Fill buffer with newline terminated modalias string
254+ */
255+ssize_t of_device_modalias(struct device *dev, char *str, ssize_t len)
256+{
257+ ssize_t sl = of_device_get_modalias(dev, str, len - 2);
258+ if (sl < 0)
259+ return sl;
260+
261+ str[sl++] = '\n';
262+ str[sl] = 0;
263+ return sl;
264+}
265+EXPORT_SYMBOL_GPL(of_device_modalias);
266+
253267 /**
254268 * of_device_uevent - Display OF related uevent information
255269 */
drivers/of/fdt.c+11−7
@@ -31,6 +31,8 @@ · 30 unmodified lines
3131 #include <asm/setup.h> /* for COMMAND_LINE_SIZE */
3232 #include <asm/page.h>
3333
34+#include "of_private.h"
35+
3436 /*
3537 * of_fdt_limit_memory - limit the number of regions in the /memory node
3638 * @limit: maximum entries
@@ -46,8 +48,8 @@ void of_fdt_limit_memory(int limit) · 9 unmodified lines
4648 const void *val;
4749 int nr_address_cells = OF_ROOT_NODE_ADDR_CELLS_DEFAULT;
4850 int nr_size_cells = OF_ROOT_NODE_SIZE_CELLS_DEFAULT;
49− const uint32_t *addr_prop;
50− const uint32_t *size_prop;
51+ const __be32 *addr_prop;
52+ const __be32 *size_prop;
5153 int root_offset;
5254 int cell_size;
5355
@@ -469,11 +471,11 @@ static int unflatten_dt_nodes(const void *blob, · 415 unmodified lines
469471 * Returns NULL on failure or the memory chunk containing the unflattened
470472 * device tree on success.
471473 */
472−static void *__unflatten_device_tree(const void *blob,
473− struct device_node *dad,
474− struct device_node **mynodes,
475− void *(*dt_alloc)(u64 size, u64 align),
476− bool detached)
474+void *__unflatten_device_tree(const void *blob,
475+ struct device_node *dad,
476+ struct device_node **mynodes,
477+ void *(*dt_alloc)(u64 size, u64 align),
478+ bool detached)
477479 {
478480 int size;
479481 void *mem;
@@ -1261,6 +1263,8 @@ void __init unflatten_device_tree(void) · 781 unmodified lines
12611263
12621264 /* Get pointer to "/chosen" and "/aliases" nodes for use everywhere */
12631265 of_alias_scan(early_init_dt_alloc_memory_arch);
1266+
1267+ unittest_unflatten_overlay_base();
12641268 }
12651269
12661270 /**
drivers/of/irq.c+1−1
@@ -102,7 +102,7 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq) · 101 unmodified lines
102102 struct device_node *ipar, *tnode, *old = NULL, *newpar = NULL;
103103 __be32 initial_match_array[MAX_PHANDLE_ARGS];
104104 const __be32 *match_array = initial_match_array;
105− const __be32 *tmp, *imap, *imask, dummy_imask[] = { [0 ... MAX_PHANDLE_ARGS] = ~0 };
105+ const __be32 *tmp, *imap, *imask, dummy_imask[] = { [0 ... MAX_PHANDLE_ARGS] = cpu_to_be32(~0) };
106106 u32 intsize = 1, addrsize, newintsize = 0, newaddrsize = 0;
107107 int imaplen, match, i, rc = -EINVAL;
108108
drivers/of/of_numa.c+2−0
@@ -57,6 +57,8 @@ static void __init of_numa_parse_cpu_nodes(void) · 56 unmodified lines
5757 else
5858 node_set(nid, numa_nodes_parsed);
5959 }
60+
61+ of_node_put(cpus);
6062 }
6163
6264 static int __init of_numa_parse_memory_nodes(void)
drivers/of/of_private.h+12−0
@@ -55,6 +55,18 @@ static inline int of_property_notify(int action, struct device_node *np, · 54 unmodified lines
5555 }
5656 #endif /* CONFIG_OF_DYNAMIC */
5757
58+#if defined(CONFIG_OF_UNITTEST) && defined(CONFIG_OF_OVERLAY)
59+extern void __init unittest_unflatten_overlay_base(void);
60+#else
61+static inline void unittest_unflatten_overlay_base(void) {};
62+#endif
63+
64+extern void *__unflatten_device_tree(const void *blob,
65+ struct device_node *dad,
66+ struct device_node **mynodes,
67+ void *(*dt_alloc)(u64 size, u64 align),
68+ bool detached);
69+
5870 /**
5971 * General utilities for working with live trees.
6072 *
drivers/of/of_reserved_mem.c+1−1
@@ -197,7 +197,7 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem) · 196 unmodified lines
197197 const struct of_device_id *i;
198198
199199 for (i = __reservedmem_of_table; i < &__rmem_of_table_sentinel; i++) {
200− reservedmem_of_init_fn initfn = i->data;
200+ int const (*initfn)(struct reserved_mem *rmem) = i->data;
201201 const char *compat = i->compatible;
202202
203203 if (!of_flat_dt_is_compatible(rmem->fdt_node, compat))
drivers/of/resolver.c+1−1
@@ -92,7 +92,7 @@ static void adjust_overlay_phandles(struct device_node *overlay, · 91 unmodified lines
9292 if (phandle == OF_PHANDLE_ILLEGAL)
9393 continue;
9494
95− *(uint32_t *)prop->value = cpu_to_be32(overlay->phandle);
95+ *(__be32 *)prop->value = cpu_to_be32(overlay->phandle);
9696 }
9797
9898 for_each_child_of_node(overlay, child)
drivers/of/unittest-data/Makefile+14−3
@@ -1,7 +1,18 @@
11 obj-y += testcases.dtb.o
2+obj-y += overlay.dtb.o
3+obj-y += overlay_bad_phandle.dtb.o
4+obj-y += overlay_base.dtb.o
25
36 targets += testcases.dtb testcases.dtb.S
7+targets += overlay.dtb overlay.dtb.S
8+targets += overlay_bad_phandle.dtb overlay_bad_phandle.dtb.S
9+targets += overlay_base.dtb overlay_base.dtb.S
410
5−.SECONDARY: \
6− $(obj)/testcases.dtb.S \
7− $(obj)/testcases.dtb
11+.PRECIOUS: \
12+ $(obj)/%.dtb.S \
13+ $(obj)/%.dtb
14+
15+# enable creation of __symbols__ node
16+DTC_FLAGS_overlay := -@
17+DTC_FLAGS_overlay_bad_phandle := -@
18+DTC_FLAGS_overlay_base := -@
drivers/of/unittest-data/overlay.dts+53−0
@@ -0,0 +1,53 @@
1+/dts-v1/;
2+/plugin/;
3+
4+/ {
5+
6+ fragment@0 {
7+ target = <&electric_1>;
8+
9+ __overlay__ {
10+ status = "ok";
11+
12+ hvac_2: hvac-large-1 {
13+ compatible = "ot,hvac-large";
14+ heat-range = < 40 75 >;
15+ cool-range = < 65 80 >;
16+ };
17+ };
18+ };
19+
20+ fragment@1 {
21+ target = <&rides_1>;
22+
23+ __overlay__ {
24+ #address-cells = <1>;
25+ #size-cells = <1>;
26+ status = "ok";
27+
28+ ride@200 {
29+ compatible = "ot,ferris-wheel";
30+ reg = < 0x00000200 0x100 >;
31+ hvac-provider = < &hvac_2 >;
32+ hvac-thermostat = < 27 32 > ;
33+ hvac-zones = < 12 5 >;
34+ hvac-zone-names = "operator", "snack-bar";
35+ spin-controller = < &spin_ctrl_1 3 >;
36+ spin-rph = < 30 >;
37+ gondolas = < 16 >;
38+ gondola-capacity = < 6 >;
39+ };
40+ };
41+ };
42+
43+ fragment@2 {
44+ target = <&lights_2>;
45+
46+ __overlay__ {
47+ status = "ok";
48+ color = "purple", "white", "red", "green";
49+ rate = < 3 256 >;
50+ };
51+ };
52+
53+};
drivers/of/unittest-data/overlay_bad_phandle.dts+20−0
@@ -0,0 +1,20 @@
1+/dts-v1/;
2+/plugin/;
3+
4+/ {
5+
6+ fragment@0 {
7+ target = <&electric_1>;
8+
9+ __overlay__ {
10+
11+ // This label should cause an error when the overlay
12+ // is applied. There is already a phandle value
13+ // in the base tree for motor-1.
14+ spin_ctrl_1_conflict: motor-1 {
15+ accelerate = < 3 >;
16+ decelerate = < 5 >;
17+ };
18+ };
19+ };
20+};
drivers/of/unittest-data/overlay_base.dts+80−0
@@ -0,0 +1,80 @@
1+/dts-v1/;
2+/plugin/;
3+
4+/*
5+ * Base device tree that overlays will be applied against.
6+ *
7+ * Do not add any properties in node "/".
8+ * Do not add any nodes other than "/testcase-data-2" in node "/".
9+ * Do not add anything that would result in dtc creating node "/__fixups__".
10+ * dtc will create nodes "/__symbols__" and "/__local_fixups__".
11+ */
12+
13+/ {
14+ testcase-data-2 {
15+ #address-cells = <1>;
16+ #size-cells = <1>;
17+
18+ electric_1: substation@100 {
19+ compatible = "ot,big-volts-control";
20+ reg = < 0x00000100 0x100 >;
21+ status = "disabled";
22+
23+ hvac_1: hvac-medium-1 {
24+ compatible = "ot,hvac-medium";
25+ heat-range = < 50 75 >;
26+ cool-range = < 60 80 >;
27+ };
28+
29+ spin_ctrl_1: motor-1 {
30+ compatible = "ot,ferris-wheel-motor";
31+ spin = "clockwise";
32+ };
33+
34+ spin_ctrl_2: motor-8 {
35+ compatible = "ot,roller-coaster-motor";
36+ };
37+ };
38+
39+ rides_1: fairway-1 {
40+ #address-cells = <1>;
41+ #size-cells = <1>;
42+ compatible = "ot,rides";
43+ status = "disabled";
44+ orientation = < 127 >;
45+
46+ ride@100 {
47+ compatible = "ot,roller-coaster";
48+ reg = < 0x00000100 0x100 >;
49+ hvac-provider = < &hvac_1 >;
50+ hvac-thermostat = < 29 > ;
51+ hvac-zones = < 14 >;
52+ hvac-zone-names = "operator";
53+ spin-controller = < &spin_ctrl_2 5 &spin_ctrl_2 7 >;
54+ spin-controller-names = "track_1", "track_2";
55+ queues = < 2 >;
56+ };
57+ };
58+
59+ lights_1: lights@30000 {
60+ compatible = "ot,work-lights";
61+ reg = < 0x00030000 0x1000 >;
62+ status = "disabled";
63+ };
64+
65+ lights_2: lights@40000 {
66+ compatible = "ot,show-lights";
67+ reg = < 0x00040000 0x1000 >;
68+ status = "disabled";
69+ rate = < 13 138 >;
70+ };
71+
72+ retail_1: vending@50000 {
73+ reg = < 0x00050000 0x1000 >;
74+ compatible = "ot,tickets";
75+ status = "disabled";
76+ };
77+
78+ };
79+};
80+
drivers/of/unittest.c+321−0
@@ -8,6 +8,7 @@ · 7 unmodified lines
88 #include <linux/err.h>
99 #include <linux/errno.h>
1010 #include <linux/hashtable.h>
11+#include <linux/libfdt.h>
1112 #include <linux/of.h>
1213 #include <linux/of_fdt.h>
1314 #include <linux/of_irq.h>
@@ -1925,6 +1926,324 @@ out: · 1911 unmodified lines
19251926 static inline void __init of_unittest_overlay(void) { }
19261927 #endif
19271928
1929+/*
1930+ * __dtb_ot_begin[] and __dtb_ot_end[] are created by cmd_dt_S_dtb
1931+ * in scripts/Makefile.lib
1932+ */
1933+
1934+#define OVERLAY_INFO_EXTERN(name) \
1935+ extern uint8_t __dtb_##name##_begin[]; \
1936+ extern uint8_t __dtb_##name##_end[]
1937+
1938+#define OVERLAY_INFO(name, expected) \
1939+{ .dtb_begin = __dtb_##name##_begin, \
1940+ .dtb_end = __dtb_##name##_end, \
1941+ .expected_result = expected, \
1942+}
1943+
1944+struct overlay_info {
1945+ uint8_t *dtb_begin;
1946+ uint8_t *dtb_end;
1947+ void *data;
1948+ struct device_node *np_overlay;
1949+ int expected_result;
1950+ int overlay_id;
1951+};
1952+
1953+OVERLAY_INFO_EXTERN(overlay_base);
1954+OVERLAY_INFO_EXTERN(overlay);
1955+OVERLAY_INFO_EXTERN(overlay_bad_phandle);
1956+
1957+#ifdef CONFIG_OF_OVERLAY
1958+
1959+/* order of entries is hard-coded into users of overlays[] */
1960+static struct overlay_info overlays[] = {
1961+ OVERLAY_INFO(overlay_base, -9999),
1962+ OVERLAY_INFO(overlay, 0),
1963+ OVERLAY_INFO(overlay_bad_phandle, -EINVAL),
1964+ {}
1965+};
1966+
1967+static struct device_node *overlay_base_root;
1968+
1969+/*
1970+ * Create base device tree for the overlay unittest.
1971+ *
1972+ * This is called from very early boot code.
1973+ *
1974+ * Do as much as possible the same way as done in __unflatten_device_tree
1975+ * and other early boot steps for the normal FDT so that the overlay base
1976+ * unflattened tree will have the same characteristics as the real tree
1977+ * (such as having memory allocated by the early allocator). The goal
1978+ * is to test "the real thing" as much as possible, and test "test setup
1979+ * code" as little as possible.
1980+ *
1981+ * Have to stop before resolving phandles, because that uses kmalloc.
1982+ */
1983+void __init unittest_unflatten_overlay_base(void)
1984+{
1985+ struct overlay_info *info;
1986+ u32 data_size;
1987+ u32 size;
1988+
1989+ info = &overlays[0];
1990+
1991+ if (info->expected_result != -9999) {
1992+ pr_err("No dtb 'overlay_base' to attach\n");
1993+ return;
1994+ }
1995+
1996+ data_size = info->dtb_end - info->dtb_begin;
1997+ if (!data_size) {
1998+ pr_err("No dtb 'overlay_base' to attach\n");
1999+ return;
2000+ }
2001+
2002+ size = fdt_totalsize(info->dtb_begin);
2003+ if (size != data_size) {
2004+ pr_err("dtb 'overlay_base' header totalsize != actual size");
2005+ return;
2006+ }
2007+
2008+ info->data = early_init_dt_alloc_memory_arch(size,
2009+ roundup_pow_of_two(FDT_V17_SIZE));
2010+ if (!info->data) {
2011+ pr_err("alloc for dtb 'overlay_base' failed");
2012+ return;
2013+ }
2014+
2015+ memcpy(info->data, info->dtb_begin, size);
2016+
2017+ __unflatten_device_tree(info->data, NULL, &info->np_overlay,
2018+ early_init_dt_alloc_memory_arch, true);
2019+ overlay_base_root = info->np_overlay;
2020+}
2021+
2022+/*
2023+ * The purpose of of_unittest_overlay_data_add is to add an
2024+ * overlay in the normal fashion. This is a test of the whole
2025+ * picture, instead of testing individual elements.
2026+ *
2027+ * A secondary purpose is to be able to verify that the contents of
2028+ * /proc/device-tree/ contains the updated structure and values from
2029+ * the overlay. That must be verified separately in user space.
2030+ *
2031+ * Return 0 on unexpected error.
2032+ */
2033+static int __init overlay_data_add(int onum)
2034+{
2035+ struct overlay_info *info;
2036+ int k;
2037+ int ret;
2038+ u32 size;
2039+ u32 size_from_header;
2040+
2041+ for (k = 0, info = overlays; info; info++, k++) {
2042+ if (k == onum)
2043+ break;
2044+ }
2045+ if (onum > k)
2046+ return 0;
2047+
2048+ size = info->dtb_end - info->dtb_begin;
2049+ if (!size) {
2050+ pr_err("no overlay to attach, %d\n", onum);
2051+ ret = 0;
2052+ }
2053+
2054+ size_from_header = fdt_totalsize(info->dtb_begin);
2055+ if (size_from_header != size) {
2056+ pr_err("overlay header totalsize != actual size, %d", onum);
2057+ return 0;
2058+ }
2059+
2060+ /*
2061+ * Must create permanent copy of FDT because of_fdt_unflatten_tree()
2062+ * will create pointers to the passed in FDT in the EDT.
2063+ */
2064+ info->data = kmemdup(info->dtb_begin, size, GFP_KERNEL);
2065+ if (!info->data) {
2066+ pr_err("unable to allocate memory for data, %d\n", onum);
2067+ return 0;
2068+ }
2069+
2070+ of_fdt_unflatten_tree(info->data, NULL, &info->np_overlay);
2071+ if (!info->np_overlay) {
2072+ pr_err("unable to unflatten overlay, %d\n", onum);
2073+ ret = 0;
2074+ goto out_free_data;
2075+ }
2076+ of_node_set_flag(info->np_overlay, OF_DETACHED);
2077+
2078+ ret = of_resolve_phandles(info->np_overlay);
2079+ if (ret) {
2080+ pr_err("resolve ot phandles (ret=%d), %d\n", ret, onum);
2081+ goto out_free_np_overlay;
2082+ }
2083+
2084+ ret = of_overlay_create(info->np_overlay);
2085+ if (ret < 0) {
2086+ pr_err("of_overlay_create() (ret=%d), %d\n", ret, onum);
2087+ goto out_free_np_overlay;
2088+ } else {
2089+ info->overlay_id = ret;
2090+ ret = 0;
2091+ }
2092+
2093+ pr_debug("__dtb_overlay_begin applied, overlay id %d\n", ret);
2094+
2095+ goto out;
2096+
2097+out_free_np_overlay:
2098+ /*
2099+ * info->np_overlay is the unflattened device tree
2100+ * It has not been spliced into the live tree.
2101+ */
2102+
2103+ /* todo: function to free unflattened device tree */
2104+
2105+out_free_data:
2106+ kfree(info->data);
2107+
2108+out:
2109+ return (ret == info->expected_result);
2110+}
2111+
2112+/*
2113+ * The purpose of of_unittest_overlay_high_level is to add an overlay
2114+ * in the normal fashion. This is a test of the whole picture,
2115+ * instead of individual elements.
2116+ *
2117+ * The first part of the function is _not_ normal overlay usage; it is
2118+ * finishing splicing the base overlay device tree into the live tree.
2119+ */
2120+static __init void of_unittest_overlay_high_level(void)
2121+{
2122+ struct device_node *last_sibling;
2123+ struct device_node *np;
2124+ struct device_node *of_symbols;
2125+ struct device_node *overlay_base_symbols;
2126+ struct device_node **pprev;
2127+ struct property *prop;
2128+ int ret;
2129+
2130+ if (!overlay_base_root) {
2131+ unittest(0, "overlay_base_root not initialized\n");
2132+ return;
2133+ }
2134+
2135+ /*
2136+ * Could not fixup phandles in unittest_unflatten_overlay_base()
2137+ * because kmalloc() was not yet available.
2138+ */
2139+ of_resolve_phandles(overlay_base_root);
2140+
2141+ /*
2142+ * do not allow overlay_base to duplicate any node already in
2143+ * tree, this greatly simplifies the code
2144+ */
2145+
2146+ /*
2147+ * remove overlay_base_root node "__local_fixups", after
2148+ * being used by of_resolve_phandles()
2149+ */
2150+ pprev = &overlay_base_root->child;
2151+ for (np = overlay_base_root->child; np; np = np->sibling) {
2152+ if (!of_node_cmp(np->name, "__local_fixups__")) {
2153+ *pprev = np->sibling;
2154+ break;
2155+ }
2156+ pprev = &np->sibling;
2157+ }
2158+
2159+ /* remove overlay_base_root node "__symbols__" if in live tree */
2160+ of_symbols = of_get_child_by_name(of_root, "__symbols__");
2161+ if (of_symbols) {
2162+ /* will have to graft properties from node into live tree */
2163+ pprev = &overlay_base_root->child;
2164+ for (np = overlay_base_root->child; np; np = np->sibling) {
2165+ if (!of_node_cmp(np->name, "__symbols__")) {
2166+ overlay_base_symbols = np;
2167+ *pprev = np->sibling;
2168+ break;
2169+ }
2170+ pprev = &np->sibling;
2171+ }
2172+ }
2173+
2174+ for (np = overlay_base_root->child; np; np = np->sibling) {
2175+ if (of_get_child_by_name(of_root, np->name)) {
2176+ unittest(0, "illegal node name in overlay_base %s",
2177+ np->name);
2178+ return;
2179+ }
2180+ }
2181+
2182+ /*
2183+ * overlay 'overlay_base' is not allowed to have root
2184+ * properties, so only need to splice nodes into main device tree.
2185+ *
2186+ * root node of *overlay_base_root will not be freed, it is lost
2187+ * memory.
2188+ */
2189+
2190+ for (np = overlay_base_root->child; np; np = np->sibling)
2191+ np->parent = of_root;
2192+
2193+ mutex_lock(&of_mutex);
2194+
2195+ for (last_sibling = np = of_root->child; np; np = np->sibling)
2196+ last_sibling = np;
2197+
2198+ if (last_sibling)
2199+ last_sibling->sibling = overlay_base_root->child;
2200+ else
2201+ of_root->child = overlay_base_root->child;
2202+
2203+ for_each_of_allnodes_from(overlay_base_root, np)
2204+ __of_attach_node_sysfs(np);
2205+
2206+ if (of_symbols) {
2207+ for_each_property_of_node(overlay_base_symbols, prop) {
2208+ ret = __of_add_property(of_symbols, prop);
2209+ if (ret) {
2210+ unittest(0,
2211+ "duplicate property '%s' in overlay_base node __symbols__",
2212+ prop->name);
2213+ goto err_unlock;
2214+ }
2215+ ret = __of_add_property_sysfs(of_symbols, prop);
2216+ if (ret) {
2217+ unittest(0,
2218+ "unable to add property '%s' in overlay_base node __symbols__ to sysfs",
2219+ prop->name);
2220+ goto err_unlock;
2221+ }
2222+ }
2223+ }
2224+
2225+ mutex_unlock(&of_mutex);
2226+
2227+
2228+ /* now do the normal overlay usage test */
2229+
2230+ unittest(overlay_data_add(1),
2231+ "Adding overlay 'overlay' failed\n");
2232+
2233+ unittest(overlay_data_add(2),
2234+ "Adding overlay 'overlay_bad_phandle' failed\n");
2235+ return;
2236+
2237+err_unlock:
2238+ mutex_unlock(&of_mutex);
2239+}
2240+
2241+#else
2242+
2243+static inline __init void of_unittest_overlay_high_level(void) {}
2244+
2245+#endif
2246+
19282247 static int __init of_unittest(void)
19292248 {
19302249 struct device_node *np;
@@ -1962,6 +2281,8 @@ static int __init of_unittest(void) · 31 unmodified lines
19622281 /* Double check linkage after removing testcase data */
19632282 of_unittest_check_tree_linkage();
19642283
2284+ of_unittest_overlay_high_level();
2285+
19652286 pr_info("end of unittest - %i passed, %i failed\n",
19662287 unittest_results.passed, unittest_results.failed);
19672288
drivers/tty/serdev/core.c+1−4
@@ -224,10 +224,7 @@ static int serdev_drv_remove(struct device *dev) · 223 unmodified lines
224224 static ssize_t modalias_show(struct device *dev,
225225 struct device_attribute *attr, char *buf)
226226 {
227− ssize_t len = of_device_get_modalias(dev, buf, PAGE_SIZE - 2);
228− buf[len] = '\n';
229− buf[len+1] = 0;
230− return len+1;
227+ return of_device_modalias(dev, buf, PAGE_SIZE);
231228 }
232229
233230 static struct device_attribute serdev_device_attrs[] = {
drivers/usb/common/ulpi.c+1−1
@@ -107,7 +107,7 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, · 106 unmodified lines
107107 int len;
108108 struct ulpi *ulpi = to_ulpi_dev(dev);
109109
110− len = of_device_get_modalias(dev, buf, PAGE_SIZE - 1);
110+ len = of_device_modalias(dev, buf, PAGE_SIZE);
111111 if (len != -ENODEV)
112112 return len;
113113
include/linux/of_device.h+3−4
@@ -34,8 +34,7 @@ extern void of_device_unregister(struct platform_device *ofdev); · 33 unmodified lines
3434
3535 extern const void *of_device_get_match_data(const struct device *dev);
3636
37−extern ssize_t of_device_get_modalias(struct device *dev,
38− char *str, ssize_t len);
37+extern ssize_t of_device_modalias(struct device *dev, char *str, ssize_t len);
3938 extern int of_device_request_module(struct device *dev);
4039
4140 extern void of_device_uevent(struct device *dev, struct kobj_uevent_env *env);
@@ -72,8 +71,8 @@ static inline const void *of_device_get_match_data(const struct device *dev) · 30 unmodified lines
7271 return NULL;
7372 }
7473
75−static inline int of_device_get_modalias(struct device *dev,
76− char *str, ssize_t len)
74+static inline int of_device_modalias(struct device *dev,
75+ char *str, ssize_t len)
7776 {
7877 return -ENODEV;
7978 }
include/linux/of_irq.h+1−1
@@ -8,7 +8,7 @@ · 7 unmodified lines
88 #include <linux/ioport.h>
99 #include <linux/of.h>
1010
11−typedef int (*of_irq_init_cb_t)(struct device_node *, struct device_node *);
11+typedef int const (*of_irq_init_cb_t)(struct device_node *, struct device_node *);
1212
1313 /*
1414 * Workarounds only applied to 32bit powermac machines
scripts/Makefile.lib+13−1
@@ -280,9 +280,21 @@ DTC ?= $(objtree)/scripts/dtc/dtc · 279 unmodified lines
280280
281281 # Disable noisy checks by default
282282 ifeq ($(KBUILD_ENABLE_EXTRA_GCC_CHECKS),)
283−DTC_FLAGS += -Wno-unit_address_vs_reg
283+DTC_FLAGS += -Wno-unit_address_vs_reg \
284+ -Wno-simple_bus_reg \
285+ -Wno-unit_address_format \
286+ -Wno-pci_bridge \
287+ -Wno-pci_device_bus_num \
288+ -Wno-pci_device_reg
284289 endif
285290
291+ifeq ($(KBUILD_ENABLE_EXTRA_GCC_CHECKS),2)
292+DTC_FLAGS += -Wnode_name_chars_strict \
293+ -Wproperty_name_chars_strict
294+endif
295+
296+DTC_FLAGS += $(DTC_FLAGS_$(basetarget))
297+
286298 # Generate an assembly file to wrap the output of the device tree compiler
287299 quiet_cmd_dt_S_dtb= DTB $@
288300 cmd_dt_S_dtb= \
scripts/dtc/checks.c+319−42
@@ -72,17 +72,16 @@ struct check { · 71 unmodified lines
7272 #define CHECK(_nm, _fn, _d, ...) \
7373 CHECK_ENTRY(_nm, _fn, _d, false, false, __VA_ARGS__)
7474
75−#ifdef __GNUC__
76−static inline void check_msg(struct check *c, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
77−#endif
78−static inline void check_msg(struct check *c, const char *fmt, ...)
75+static inline void PRINTF(3, 4) check_msg(struct check *c, struct dt_info *dti,
76+ const char *fmt, ...)
7977 {
8078 va_list ap;
8179 va_start(ap, fmt);
8280
8381 if ((c->warn && (quiet < 1))
8482 || (c->error && (quiet < 2))) {
85− fprintf(stderr, "%s (%s): ",
83+ fprintf(stderr, "%s: %s (%s): ",
84+ strcmp(dti->outname, "-") ? dti->outname : "<stdout>",
8685 (c->error) ? "ERROR" : "Warning", c->name);
8786 vfprintf(stderr, fmt, ap);
8887 fprintf(stderr, "\n");
@@ -90,11 +89,11 @@ static inline void check_msg(struct check *c, const char *fmt, ...) · 1 unmodified line
9089 va_end(ap);
9190 }
9291
93−#define FAIL(c, ...) \
94− do { \
95− TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \
96− (c)->status = FAILED; \
97− check_msg((c), __VA_ARGS__); \
92+#define FAIL(c, dti, ...) \
93+ do { \
94+ TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \
95+ (c)->status = FAILED; \
96+ check_msg((c), dti, __VA_ARGS__); \
9897 } while (0)
9998
10099 static void check_nodes_props(struct check *c, struct dt_info *dti, struct node *node)
@@ -127,7 +126,7 @@ static bool run_check(struct check *c, struct dt_info *dti) · 26 unmodified lines
127126 error = error || run_check(prq, dti);
128127 if (prq->status != PASSED) {
129128 c->status = PREREQ;
130− check_msg(c, "Failed prerequisite '%s'",
129+ check_msg(c, dti, "Failed prerequisite '%s'",
131130 c->prereq[i]->name);
132131 }
133132 }
@@ -157,7 +156,7 @@ out: · 23 unmodified lines
157156 static inline void check_always_fail(struct check *c, struct dt_info *dti,
158157 struct node *node)
159158 {
160− FAIL(c, "always_fail check");
159+ FAIL(c, dti, "always_fail check");
161160 }
162161 CHECK(always_fail, check_always_fail, NULL);
163162
@@ -172,7 +171,7 @@ static void check_is_string(struct check *c, struct dt_info *dti, · 8 unmodified lines
172171 return; /* Not present, assumed ok */
173172
174173 if (!data_is_one_string(prop->val))
175− FAIL(c, "\"%s\" property in %s is not a string",
174+ FAIL(c, dti, "\"%s\" property in %s is not a string",
176175 propname, node->fullpath);
177176 }
178177 #define WARNING_IF_NOT_STRING(nm, propname) \
@@ -191,7 +190,7 @@ static void check_is_cell(struct check *c, struct dt_info *dti, · 12 unmodified lines
191190 return; /* Not present, assumed ok */
192191
193192 if (prop->val.len != sizeof(cell_t))
194− FAIL(c, "\"%s\" property in %s is not a single cell",
193+ FAIL(c, dti, "\"%s\" property in %s is not a single cell",
195194 propname, node->fullpath);
196195 }
197196 #define WARNING_IF_NOT_CELL(nm, propname) \
@@ -213,7 +212,7 @@ static void check_duplicate_node_names(struct check *c, struct dt_info *dti, · 15 unmodified lines
213212 child2;
214213 child2 = child2->next_sibling)
215214 if (streq(child->name, child2->name))
216− FAIL(c, "Duplicate node name %s",
215+ FAIL(c, dti, "Duplicate node name %s",
217216 child->fullpath);
218217 }
219218 ERROR(duplicate_node_names, check_duplicate_node_names, NULL);
@@ -228,7 +227,7 @@ static void check_duplicate_property_names(struct check *c, struct dt_info *dti, · 8 unmodified lines
228227 if (prop2->deleted)
229228 continue;
230229 if (streq(prop->name, prop2->name))
231− FAIL(c, "Duplicate property name %s in %s",
230+ FAIL(c, dti, "Duplicate property name %s in %s",
232231 prop->name, node->fullpath);
233232 }
234233 }
@@ -239,6 +238,7 @@ ERROR(duplicate_property_names, check_duplicate_property_names, NULL); · 4 unmodified lines
239238 #define UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
240239 #define DIGITS "0123456789"
241240 #define PROPNODECHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-"
241+#define PROPNODECHARSSTRICT LOWERCASE UPPERCASE DIGITS ",-"
242242
243243 static void check_node_name_chars(struct check *c, struct dt_info *dti,
244244 struct node *node)
@@ -246,16 +246,27 @@ static void check_node_name_chars(struct check *c, struct dt_info *dti, · 1 unmodified line
246246 int n = strspn(node->name, c->data);
247247
248248 if (n < strlen(node->name))
249− FAIL(c, "Bad character '%c' in node %s",
249+ FAIL(c, dti, "Bad character '%c' in node %s",
250250 node->name[n], node->fullpath);
251251 }
252252 ERROR(node_name_chars, check_node_name_chars, PROPNODECHARS "@");
253253
254+static void check_node_name_chars_strict(struct check *c, struct dt_info *dti,
255+ struct node *node)
256+{
257+ int n = strspn(node->name, c->data);
258+
259+ if (n < node->basenamelen)
260+ FAIL(c, dti, "Character '%c' not recommended in node %s",
261+ node->name[n], node->fullpath);
262+}
263+CHECK(node_name_chars_strict, check_node_name_chars_strict, PROPNODECHARSSTRICT);
264+
254265 static void check_node_name_format(struct check *c, struct dt_info *dti,
255266 struct node *node)
256267 {
257268 if (strchr(get_unitname(node), '@'))
258− FAIL(c, "Node %s has multiple '@' characters in name",
269+ FAIL(c, dti, "Node %s has multiple '@' characters in name",
259270 node->fullpath);
260271 }
261272 ERROR(node_name_format, check_node_name_format, NULL, &node_name_chars);
@@ -274,11 +285,11 @@ static void check_unit_address_vs_reg(struct check *c, struct dt_info *dti, · 12 unmodified lines
274285
275286 if (prop) {
276287 if (!unitname[0])
277− FAIL(c, "Node %s has a reg or ranges property, but no unit name",
288+ FAIL(c, dti, "Node %s has a reg or ranges property, but no unit name",
278289 node->fullpath);
279290 } else {
280291 if (unitname[0])
281− FAIL(c, "Node %s has a unit name, but no reg property",
292+ FAIL(c, dti, "Node %s has a unit name, but no reg property",
282293 node->fullpath);
283294 }
284295 }
@@ -293,12 +304,44 @@ static void check_property_name_chars(struct check *c, struct dt_info *dti, · 8 unmodified lines
293304 int n = strspn(prop->name, c->data);
294305
295306 if (n < strlen(prop->name))
296− FAIL(c, "Bad character '%c' in property name \"%s\", node %s",
307+ FAIL(c, dti, "Bad character '%c' in property name \"%s\", node %s",
297308 prop->name[n], prop->name, node->fullpath);
298309 }
299310 }
300311 ERROR(property_name_chars, check_property_name_chars, PROPNODECHARS);
301312
313+static void check_property_name_chars_strict(struct check *c,
314+ struct dt_info *dti,
315+ struct node *node)
316+{
317+ struct property *prop;
318+
319+ for_each_property(node, prop) {
320+ const char *name = prop->name;
321+ int n = strspn(name, c->data);
322+
323+ if (n == strlen(prop->name))
324+ continue;
325+
326+ /* Certain names are whitelisted */
327+ if (streq(name, "device_type"))
328+ continue;
329+
330+ /*
331+ * # is only allowed at the beginning of property names not counting
332+ * the vendor prefix.
333+ */
334+ if (name[n] == '#' && ((n == 0) || (name[n-1] == ','))) {
335+ name += n + 1;
336+ n = strspn(name, c->data);
337+ }
338+ if (n < strlen(name))
339+ FAIL(c, dti, "Character '%c' not recommended in property name \"%s\", node %s",
340+ name[n], prop->name, node->fullpath);
341+ }
342+}
343+CHECK(property_name_chars_strict, check_property_name_chars_strict, PROPNODECHARSSTRICT);
344+
302345 #define DESCLABEL_FMT "%s%s%s%s%s"
303346 #define DESCLABEL_ARGS(node,prop,mark) \
304347 ((mark) ? "value of " : ""), \
@@ -327,7 +370,7 @@ static void check_duplicate_label(struct check *c, struct dt_info *dti, · 22 unmodified lines
327370 return;
328371
329372 if ((othernode != node) || (otherprop != prop) || (othermark != mark))
330− FAIL(c, "Duplicate label '%s' on " DESCLABEL_FMT
373+ FAIL(c, dti, "Duplicate label '%s' on " DESCLABEL_FMT
331374 " and " DESCLABEL_FMT,
332375 label, DESCLABEL_ARGS(node, prop, mark),
333376 DESCLABEL_ARGS(othernode, otherprop, othermark));
@@ -367,7 +410,7 @@ static cell_t check_phandle_prop(struct check *c, struct dt_info *dti, · 33 unmodified lines
367410 return 0;
368411
369412 if (prop->val.len != sizeof(cell_t)) {
370− FAIL(c, "%s has bad length (%d) %s property",
413+ FAIL(c, dti, "%s has bad length (%d) %s property",
371414 node->fullpath, prop->val.len, prop->name);
372415 return 0;
373416 }
@@ -379,7 +422,7 @@ static cell_t check_phandle_prop(struct check *c, struct dt_info *dti, · 5 unmodified lines
379422 /* "Set this node's phandle equal to some
380423 * other node's phandle". That's nonsensical
381424 * by construction. */ {
382− FAIL(c, "%s in %s is a reference to another node",
425+ FAIL(c, dti, "%s in %s is a reference to another node",
383426 prop->name, node->fullpath);
384427 }
385428 /* But setting this node's phandle equal to its own
@@ -393,7 +436,7 @@ static cell_t check_phandle_prop(struct check *c, struct dt_info *dti, · 7 unmodified lines
393436 phandle = propval_cell(prop);
394437
395438 if ((phandle == 0) || (phandle == -1)) {
396− FAIL(c, "%s has bad value (0x%x) in %s property",
439+ FAIL(c, dti, "%s has bad value (0x%x) in %s property",
397440 node->fullpath, phandle, prop->name);
398441 return 0;
399442 }
@@ -420,7 +463,7 @@ static void check_explicit_phandles(struct check *c, struct dt_info *dti, · 20 unmodified lines
420463 return;
421464
422465 if (linux_phandle && phandle && (phandle != linux_phandle))
423− FAIL(c, "%s has mismatching 'phandle' and 'linux,phandle'"
466+ FAIL(c, dti, "%s has mismatching 'phandle' and 'linux,phandle'"
424467 " properties", node->fullpath);
425468
426469 if (linux_phandle && !phandle)
@@ -428,7 +471,7 @@ static void check_explicit_phandles(struct check *c, struct dt_info *dti, · 1 unmodified line
428471
429472 other = get_node_by_phandle(root, phandle);
430473 if (other && (other != node)) {
431− FAIL(c, "%s has duplicated phandle 0x%x (seen before at %s)",
474+ FAIL(c, dti, "%s has duplicated phandle 0x%x (seen before at %s)",
432475 node->fullpath, phandle, other->fullpath);
433476 return;
434477 }
@@ -453,7 +496,7 @@ static void check_name_properties(struct check *c, struct dt_info *dti, · 18 unmodified lines
453496
454497 if ((prop->val.len != node->basenamelen+1)
455498 || (memcmp(prop->val.val, node->name, node->basenamelen) != 0)) {
456− FAIL(c, "\"name\" property in %s is incorrect (\"%s\" instead"
499+ FAIL(c, dti, "\"name\" property in %s is incorrect (\"%s\" instead"
457500 " of base node name)", node->fullpath, prop->val.val);
458501 } else {
459502 /* The name property is correct, and therefore redundant.
@@ -488,16 +531,16 @@ static void fixup_phandle_references(struct check *c, struct dt_info *dti, · 28 unmodified lines
488531 refnode = get_node_by_ref(dt, m->ref);
489532 if (! refnode) {
490533 if (!(dti->dtsflags & DTSF_PLUGIN))
491− FAIL(c, "Reference to non-existent node or "
534+ FAIL(c, dti, "Reference to non-existent node or "
492535 "label \"%s\"\n", m->ref);
493536 else /* mark the entry as unresolved */
494− *((cell_t *)(prop->val.val + m->offset)) =
537+ *((fdt32_t *)(prop->val.val + m->offset)) =
495538 cpu_to_fdt32(0xffffffff);
496539 continue;
497540 }
498541
499542 phandle = get_node_phandle(dt, refnode);
500− *((cell_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
543+ *((fdt32_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
501544 }
502545 }
503546 }
@@ -520,7 +563,7 @@ static void fixup_path_references(struct check *c, struct dt_info *dti, · 16 unmodified lines
520563
521564 refnode = get_node_by_ref(dt, m->ref);
522565 if (!refnode) {
523− FAIL(c, "Reference to non-existent node or label \"%s\"\n",
566+ FAIL(c, dti, "Reference to non-existent node or label \"%s\"\n",
524567 m->ref);
525568 continue;
526569 }
@@ -579,19 +622,19 @@ static void check_reg_format(struct check *c, struct dt_info *dti, · 52 unmodified lines
579622 return; /* No "reg", that's fine */
580623
581624 if (!node->parent) {
582− FAIL(c, "Root node has a \"reg\" property");
625+ FAIL(c, dti, "Root node has a \"reg\" property");
583626 return;
584627 }
585628
586629 if (prop->val.len == 0)
587− FAIL(c, "\"reg\" property in %s is empty", node->fullpath);
630+ FAIL(c, dti, "\"reg\" property in %s is empty", node->fullpath);
588631
589632 addr_cells = node_addr_cells(node->parent);
590633 size_cells = node_size_cells(node->parent);
591634 entrylen = (addr_cells + size_cells) * sizeof(cell_t);
592635
593636 if (!entrylen || (prop->val.len % entrylen) != 0)
594− FAIL(c, "\"reg\" property in %s has invalid length (%d bytes) "
637+ FAIL(c, dti, "\"reg\" property in %s has invalid length (%d bytes) "
595638 "(#address-cells == %d, #size-cells == %d)",
596639 node->fullpath, prop->val.len, addr_cells, size_cells);
597640 }
@@ -608,7 +651,7 @@ static void check_ranges_format(struct check *c, struct dt_info *dti, · 10 unmodified lines
608651 return;
609652
610653 if (!node->parent) {
611− FAIL(c, "Root node has a \"ranges\" property");
654+ FAIL(c, dti, "Root node has a \"ranges\" property");
612655 return;
613656 }
614657
@@ -620,17 +663,17 @@ static void check_ranges_format(struct check *c, struct dt_info *dti, · 5 unmodified lines
620663
621664 if (prop->val.len == 0) {
622665 if (p_addr_cells != c_addr_cells)
623− FAIL(c, "%s has empty \"ranges\" property but its "
666+ FAIL(c, dti, "%s has empty \"ranges\" property but its "
624667 "#address-cells (%d) differs from %s (%d)",
625668 node->fullpath, c_addr_cells, node->parent->fullpath,
626669 p_addr_cells);
627670 if (p_size_cells != c_size_cells)
628− FAIL(c, "%s has empty \"ranges\" property but its "
671+ FAIL(c, dti, "%s has empty \"ranges\" property but its "
629672 "#size-cells (%d) differs from %s (%d)",
630673 node->fullpath, c_size_cells, node->parent->fullpath,
631674 p_size_cells);
632675 } else if ((prop->val.len % entrylen) != 0) {
633− FAIL(c, "\"ranges\" property in %s has invalid length (%d bytes) "
676+ FAIL(c, dti, "\"ranges\" property in %s has invalid length (%d bytes) "
634677 "(parent #address-cells == %d, child #address-cells == %d, "
635678 "#size-cells == %d)", node->fullpath, prop->val.len,
636679 p_addr_cells, c_addr_cells, c_size_cells);
@@ -638,6 +681,229 @@ static void check_ranges_format(struct check *c, struct dt_info *dti, · 1 unmodified line
638681 }
639682 WARNING(ranges_format, check_ranges_format, NULL, &addr_size_cells);
640683
684+static const struct bus_type pci_bus = {
685+ .name = "PCI",
686+};
687+
688+static void check_pci_bridge(struct check *c, struct dt_info *dti, struct node *node)
689+{
690+ struct property *prop;
691+ cell_t *cells;
692+
693+ prop = get_property(node, "device_type");
694+ if (!prop || !streq(prop->val.val, "pci"))
695+ return;
696+
697+ node->bus = &pci_bus;
698+
699+ if (!strneq(node->name, "pci", node->basenamelen) &&
700+ !strneq(node->name, "pcie", node->basenamelen))
701+ FAIL(c, dti, "Node %s node name is not \"pci\" or \"pcie\"",
702+ node->fullpath);
703+
704+ prop = get_property(node, "ranges");
705+ if (!prop)
706+ FAIL(c, dti, "Node %s missing ranges for PCI bridge (or not a bridge)",
707+ node->fullpath);
708+
709+ if (node_addr_cells(node) != 3)
710+ FAIL(c, dti, "Node %s incorrect #address-cells for PCI bridge",
711+ node->fullpath);
712+ if (node_size_cells(node) != 2)
713+ FAIL(c, dti, "Node %s incorrect #size-cells for PCI bridge",
714+ node->fullpath);
715+
716+ prop = get_property(node, "bus-range");
717+ if (!prop) {
718+ FAIL(c, dti, "Node %s missing bus-range for PCI bridge",
719+ node->fullpath);
720+ return;
721+ }
722+ if (prop->val.len != (sizeof(cell_t) * 2)) {
723+ FAIL(c, dti, "Node %s bus-range must be 2 cells",
724+ node->fullpath);
725+ return;
726+ }
727+ cells = (cell_t *)prop->val.val;
728+ if (fdt32_to_cpu(cells[0]) > fdt32_to_cpu(cells[1]))
729+ FAIL(c, dti, "Node %s bus-range 1st cell must be less than or equal to 2nd cell",
730+ node->fullpath);
731+ if (fdt32_to_cpu(cells[1]) > 0xff)
732+ FAIL(c, dti, "Node %s bus-range maximum bus number must be less than 256",
733+ node->fullpath);
734+}
735+WARNING(pci_bridge, check_pci_bridge, NULL,
736+ &device_type_is_string, &addr_size_cells);
737+
738+static void check_pci_device_bus_num(struct check *c, struct dt_info *dti, struct node *node)
739+{
740+ struct property *prop;
741+ unsigned int bus_num, min_bus, max_bus;
742+ cell_t *cells;
743+
744+ if (!node->parent || (node->parent->bus != &pci_bus))
745+ return;
746+
747+ prop = get_property(node, "reg");
748+ if (!prop)
749+ return;
750+
751+ cells = (cell_t *)prop->val.val;
752+ bus_num = (fdt32_to_cpu(cells[0]) & 0x00ff0000) >> 16;
753+
754+ prop = get_property(node->parent, "bus-range");
755+ if (!prop) {
756+ min_bus = max_bus = 0;
757+ } else {
758+ cells = (cell_t *)prop->val.val;
759+ min_bus = fdt32_to_cpu(cells[0]);
760+ max_bus = fdt32_to_cpu(cells[0]);
761+ }
762+ if ((bus_num < min_bus) || (bus_num > max_bus))
763+ FAIL(c, dti, "Node %s PCI bus number %d out of range, expected (%d - %d)",
764+ node->fullpath, bus_num, min_bus, max_bus);
765+}
766+WARNING(pci_device_bus_num, check_pci_device_bus_num, NULL, &reg_format, &pci_bridge);
767+
768+static void check_pci_device_reg(struct check *c, struct dt_info *dti, struct node *node)
769+{
770+ struct property *prop;
771+ const char *unitname = get_unitname(node);
772+ char unit_addr[5];
773+ unsigned int dev, func, reg;
774+ cell_t *cells;
775+
776+ if (!node->parent || (node->parent->bus != &pci_bus))
777+ return;
778+
779+ prop = get_property(node, "reg");
780+ if (!prop) {
781+ FAIL(c, dti, "Node %s missing PCI reg property", node->fullpath);
782+ return;
783+ }
784+
785+ cells = (cell_t *)prop->val.val;
786+ if (cells[1] || cells[2])
787+ FAIL(c, dti, "Node %s PCI reg config space address cells 2 and 3 must be 0",
788+ node->fullpath);
789+
790+ reg = fdt32_to_cpu(cells[0]);
791+ dev = (reg & 0xf800) >> 11;
792+ func = (reg & 0x700) >> 8;
793+
794+ if (reg & 0xff000000)
795+ FAIL(c, dti, "Node %s PCI reg address is not configuration space",
796+ node->fullpath);
797+ if (reg & 0x000000ff)
798+ FAIL(c, dti, "Node %s PCI reg config space address register number must be 0",
799+ node->fullpath);
800+
801+ if (func == 0) {
802+ snprintf(unit_addr, sizeof(unit_addr), "%x", dev);
803+ if (streq(unitname, unit_addr))
804+ return;
805+ }
806+
807+ snprintf(unit_addr, sizeof(unit_addr), "%x,%x", dev, func);
808+ if (streq(unitname, unit_addr))
809+ return;
810+
811+ FAIL(c, dti, "Node %s PCI unit address format error, expected \"%s\"",
812+ node->fullpath, unit_addr);
813+}
814+WARNING(pci_device_reg, check_pci_device_reg, NULL, &reg_format, &pci_bridge);
815+
816+static const struct bus_type simple_bus = {
817+ .name = "simple-bus",
818+};
819+
820+static bool node_is_compatible(struct node *node, const char *compat)
821+{
822+ struct property *prop;
823+ const char *str, *end;
824+
825+ prop = get_property(node, "compatible");
826+ if (!prop)
827+ return false;
828+
829+ for (str = prop->val.val, end = str + prop->val.len; str < end;
830+ str += strnlen(str, end - str) + 1) {
831+ if (strneq(str, compat, end - str))
832+ return true;
833+ }
834+ return false;
835+}
836+
837+static void check_simple_bus_bridge(struct check *c, struct dt_info *dti, struct node *node)
838+{
839+ if (node_is_compatible(node, "simple-bus"))
840+ node->bus = &simple_bus;
841+}
842+WARNING(simple_bus_bridge, check_simple_bus_bridge, NULL, &addr_size_cells);
843+
844+static void check_simple_bus_reg(struct check *c, struct dt_info *dti, struct node *node)
845+{
846+ struct property *prop;
847+ const char *unitname = get_unitname(node);
848+ char unit_addr[17];
849+ unsigned int size;
850+ uint64_t reg = 0;
851+ cell_t *cells = NULL;
852+
853+ if (!node->parent || (node->parent->bus != &simple_bus))
854+ return;
855+
856+ prop = get_property(node, "reg");
857+ if (prop)
858+ cells = (cell_t *)prop->val.val;
859+ else {
860+ prop = get_property(node, "ranges");
861+ if (prop && prop->val.len)
862+ /* skip of child address */
863+ cells = ((cell_t *)prop->val.val) + node_addr_cells(node);
864+ }
865+
866+ if (!cells) {
867+ if (node->parent->parent && !(node->bus == &simple_bus))
868+ FAIL(c, dti, "Node %s missing or empty reg/ranges property", node->fullpath);
869+ return;
870+ }
871+
872+ size = node_addr_cells(node->parent);
873+ while (size--)
874+ reg = (reg << 32) | fdt32_to_cpu(*(cells++));
875+
876+ snprintf(unit_addr, sizeof(unit_addr), "%lx", reg);
877+ if (!streq(unitname, unit_addr))
878+ FAIL(c, dti, "Node %s simple-bus unit address format error, expected \"%s\"",
879+ node->fullpath, unit_addr);
880+}
881+WARNING(simple_bus_reg, check_simple_bus_reg, NULL, &reg_format, &simple_bus_bridge);
882+
883+static void check_unit_address_format(struct check *c, struct dt_info *dti,
884+ struct node *node)
885+{
886+ const char *unitname = get_unitname(node);
887+
888+ if (node->parent && node->parent->bus)
889+ return;
890+
891+ if (!unitname[0])
892+ return;
893+
894+ if (!strncmp(unitname, "0x", 2)) {
895+ FAIL(c, dti, "Node %s unit name should not have leading \"0x\"",
896+ node->fullpath);
897+ /* skip over 0x for next test */
898+ unitname += 2;
899+ }
900+ if (unitname[0] == '0' && isxdigit(unitname[1]))
901+ FAIL(c, dti, "Node %s unit name should not have leading 0s",
902+ node->fullpath);
903+}
904+WARNING(unit_address_format, check_unit_address_format, NULL,
905+ &node_name_format, &pci_bridge, &simple_bus_bridge);
906+
641907 /*
642908 * Style checks
643909 */
@@ -656,11 +922,11 @@ static void check_avoid_default_addr_size(struct check *c, struct dt_info *dti, · 12 unmodified lines
656922 return;
657923
658924 if (node->parent->addr_cells == -1)
659− FAIL(c, "Relying on default #address-cells value for %s",
925+ FAIL(c, dti, "Relying on default #address-cells value for %s",
660926 node->fullpath);
661927
662928 if (node->parent->size_cells == -1)
663− FAIL(c, "Relying on default #size-cells value for %s",
929+ FAIL(c, dti, "Relying on default #size-cells value for %s",
664930 node->fullpath);
665931 }
666932 WARNING(avoid_default_addr_size, check_avoid_default_addr_size, NULL,
@@ -684,7 +950,7 @@ static void check_obsolete_chosen_interrupt_controller(struct check *c, · 17 unmodified lines
684950
685951 prop = get_property(chosen, "interrupt-controller");
686952 if (prop)
687− FAIL(c, "/chosen has obsolete \"interrupt-controller\" "
953+ FAIL(c, dti, "/chosen has obsolete \"interrupt-controller\" "
688954 "property");
689955 }
690956 WARNING(obsolete_chosen_interrupt_controller,
@@ -703,9 +969,20 @@ static struct check *check_table[] = { · 12 unmodified lines
703969 &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell,
704970 &device_type_is_string, &model_is_string, &status_is_string,
705971
972+ &property_name_chars_strict,
973+ &node_name_chars_strict,
974+
706975 &addr_size_cells, &reg_format, &ranges_format,
707976
708977 &unit_address_vs_reg,
978+ &unit_address_format,
979+
980+ &pci_bridge,
981+ &pci_device_reg,
982+ &pci_device_bus_num,
983+
984+ &simple_bus_bridge,
985+ &simple_bus_reg,
709986
710987 &avoid_default_addr_size,
711988 &obsolete_chosen_interrupt_controller,
scripts/dtc/data.c+8−8
@@ -171,9 +171,9 @@ struct data data_merge(struct data d1, struct data d2) · 170 unmodified lines
171171 struct data data_append_integer(struct data d, uint64_t value, int bits)
172172 {
173173 uint8_t value_8;
174− uint16_t value_16;
175− uint32_t value_32;
176− uint64_t value_64;
174+ fdt16_t value_16;
175+ fdt32_t value_32;
176+ fdt64_t value_64;
177177
178178 switch (bits) {
179179 case 8:
@@ -197,14 +197,14 @@ struct data data_append_integer(struct data d, uint64_t value, int bits) · 17 unmodified lines
197197 }
198198 }
199199
200−struct data data_append_re(struct data d, const struct fdt_reserve_entry *re)
200+struct data data_append_re(struct data d, uint64_t address, uint64_t size)
201201 {
202− struct fdt_reserve_entry bere;
202+ struct fdt_reserve_entry re;
203203
204− bere.address = cpu_to_fdt64(re->address);
205− bere.size = cpu_to_fdt64(re->size);
204+ re.address = cpu_to_fdt64(address);
205+ re.size = cpu_to_fdt64(size);
206206
207− return data_append_data(d, &bere, sizeof(bere));
207+ return data_append_data(d, &re, sizeof(re));
208208 }
209209
210210 struct data data_append_cell(struct data d, cell_t word)
scripts/dtc/dtc-lexer.l+2−1
@@ -62,7 +62,8 @@ static int dts_version = 1; · 61 unmodified lines
6262
6363 static void push_input_file(const char *filename);
6464 static bool pop_input_file(void);
65−static void lexical_error(const char *fmt, ...);
65+static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
66+
6667 %}
6768
6869 %%
scripts/dtc/dtc-lexer.lex.c_shipped+39−38
@@ -655,8 +655,9 @@ static int dts_version = 1; · 654 unmodified lines
655655
656656 static void push_input_file(const char *filename);
657657 static bool pop_input_file(void);
658−static void lexical_error(const char *fmt, ...);
659−#line 660 "dtc-lexer.lex.c"
658+static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
659+
660+#line 661 "dtc-lexer.lex.c"
660661
661662 #define INITIAL 0
662663 #define BYTESTRING 1
@@ -878,9 +879,9 @@ YY_DECL · 215 unmodified lines
878879 }
879880
880881 {
881−#line 68 "dtc-lexer.l"
882+#line 69 "dtc-lexer.l"
882883
883−#line 884 "dtc-lexer.lex.c"
884+#line 885 "dtc-lexer.lex.c"
884885
885886 while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
886887 {
@@ -937,7 +938,7 @@ do_action: /* This label is used only to access EOF actions. */ · 50 unmodified lines
937938 case 1:
938939 /* rule 1 can match eol */
939940 YY_RULE_SETUP
940−#line 69 "dtc-lexer.l"
941+#line 70 "dtc-lexer.l"
941942 {
942943 char *name = strchr(yytext, '\"') + 1;
943944 yytext[yyleng-1] = '\0';
@@ -947,7 +948,7 @@ YY_RULE_SETUP · 3 unmodified lines
947948 case 2:
948949 /* rule 2 can match eol */
949950 YY_RULE_SETUP
950−#line 75 "dtc-lexer.l"
951+#line 76 "dtc-lexer.l"
951952 {
952953 char *line, *fnstart, *fnend;
953954 struct data fn;
@@ -981,7 +982,7 @@ case YY_STATE_EOF(INITIAL): · 27 unmodified lines
981982 case YY_STATE_EOF(BYTESTRING):
982983 case YY_STATE_EOF(PROPNODENAME):
983984 case YY_STATE_EOF(V1):
984−#line 104 "dtc-lexer.l"
985+#line 105 "dtc-lexer.l"
985986 {
986987 if (!pop_input_file()) {
987988 yyterminate();
@@ -991,7 +992,7 @@ case YY_STATE_EOF(V1): · 3 unmodified lines
991992 case 3:
992993 /* rule 3 can match eol */
993994 YY_RULE_SETUP
994−#line 110 "dtc-lexer.l"
995+#line 111 "dtc-lexer.l"
995996 {
996997 DPRINT("String: %s\n", yytext);
997998 yylval.data = data_copy_escape_string(yytext+1,
@@ -1001,7 +1002,7 @@ YY_RULE_SETUP · 3 unmodified lines
10011002 YY_BREAK
10021003 case 4:
10031004 YY_RULE_SETUP
1004−#line 117 "dtc-lexer.l"
1005+#line 118 "dtc-lexer.l"
10051006 {
10061007 DPRINT("Keyword: /dts-v1/\n");
10071008 dts_version = 1;
@@ -1011,7 +1012,7 @@ YY_RULE_SETUP · 3 unmodified lines
10111012 YY_BREAK
10121013 case 5:
10131014 YY_RULE_SETUP
1014−#line 124 "dtc-lexer.l"
1015+#line 125 "dtc-lexer.l"
10151016 {
10161017 DPRINT("Keyword: /plugin/\n");
10171018 return DT_PLUGIN;
@@ -1019,7 +1020,7 @@ YY_RULE_SETUP · 1 unmodified line
10191020 YY_BREAK
10201021 case 6:
10211022 YY_RULE_SETUP
1022−#line 129 "dtc-lexer.l"
1023+#line 130 "dtc-lexer.l"
10231024 {
10241025 DPRINT("Keyword: /memreserve/\n");
10251026 BEGIN_DEFAULT();
@@ -1028,7 +1029,7 @@ YY_RULE_SETUP · 2 unmodified lines
10281029 YY_BREAK
10291030 case 7:
10301031 YY_RULE_SETUP
1031−#line 135 "dtc-lexer.l"
1032+#line 136 "dtc-lexer.l"
10321033 {
10331034 DPRINT("Keyword: /bits/\n");
10341035 BEGIN_DEFAULT();
@@ -1037,7 +1038,7 @@ YY_RULE_SETUP · 2 unmodified lines
10371038 YY_BREAK
10381039 case 8:
10391040 YY_RULE_SETUP
1040−#line 141 "dtc-lexer.l"
1041+#line 142 "dtc-lexer.l"
10411042 {
10421043 DPRINT("Keyword: /delete-property/\n");
10431044 DPRINT("<PROPNODENAME>\n");
@@ -1047,7 +1048,7 @@ YY_RULE_SETUP · 3 unmodified lines
10471048 YY_BREAK
10481049 case 9:
10491050 YY_RULE_SETUP
1050−#line 148 "dtc-lexer.l"
1051+#line 149 "dtc-lexer.l"
10511052 {
10521053 DPRINT("Keyword: /delete-node/\n");
10531054 DPRINT("<PROPNODENAME>\n");
@@ -1057,7 +1058,7 @@ YY_RULE_SETUP · 3 unmodified lines
10571058 YY_BREAK
10581059 case 10:
10591060 YY_RULE_SETUP
1060−#line 155 "dtc-lexer.l"
1061+#line 156 "dtc-lexer.l"
10611062 {
10621063 DPRINT("Label: %s\n", yytext);
10631064 yylval.labelref = xstrdup(yytext);
@@ -1067,7 +1068,7 @@ YY_RULE_SETUP · 3 unmodified lines
10671068 YY_BREAK
10681069 case 11:
10691070 YY_RULE_SETUP
1070−#line 162 "dtc-lexer.l"
1071+#line 163 "dtc-lexer.l"
10711072 {
10721073 char *e;
10731074 DPRINT("Integer Literal: '%s'\n", yytext);
@@ -1093,7 +1094,7 @@ YY_RULE_SETUP · 19 unmodified lines
10931094 case 12:
10941095 /* rule 12 can match eol */
10951096 YY_RULE_SETUP
1096−#line 184 "dtc-lexer.l"
1097+#line 185 "dtc-lexer.l"
10971098 {
10981099 struct data d;
10991100 DPRINT("Character literal: %s\n", yytext);
@@ -1117,7 +1118,7 @@ YY_RULE_SETUP · 17 unmodified lines
11171118 YY_BREAK
11181119 case 13:
11191120 YY_RULE_SETUP
1120−#line 205 "dtc-lexer.l"
1121+#line 206 "dtc-lexer.l"
11211122 { /* label reference */
11221123 DPRINT("Ref: %s\n", yytext+1);
11231124 yylval.labelref = xstrdup(yytext+1);
@@ -1126,7 +1127,7 @@ YY_RULE_SETUP · 2 unmodified lines
11261127 YY_BREAK
11271128 case 14:
11281129 YY_RULE_SETUP
1129−#line 211 "dtc-lexer.l"
1130+#line 212 "dtc-lexer.l"
11301131 { /* new-style path reference */
11311132 yytext[yyleng-1] = '\0';
11321133 DPRINT("Ref: %s\n", yytext+2);
@@ -1136,7 +1137,7 @@ YY_RULE_SETUP · 3 unmodified lines
11361137 YY_BREAK
11371138 case 15:
11381139 YY_RULE_SETUP
1139−#line 218 "dtc-lexer.l"
1140+#line 219 "dtc-lexer.l"
11401141 {
11411142 yylval.byte = strtol(yytext, NULL, 16);
11421143 DPRINT("Byte: %02x\n", (int)yylval.byte);
@@ -1145,7 +1146,7 @@ YY_RULE_SETUP · 2 unmodified lines
11451146 YY_BREAK
11461147 case 16:
11471148 YY_RULE_SETUP
1148−#line 224 "dtc-lexer.l"
1149+#line 225 "dtc-lexer.l"
11491150 {
11501151 DPRINT("/BYTESTRING\n");
11511152 BEGIN_DEFAULT();
@@ -1154,7 +1155,7 @@ YY_RULE_SETUP · 2 unmodified lines
11541155 YY_BREAK
11551156 case 17:
11561157 YY_RULE_SETUP
1157−#line 230 "dtc-lexer.l"
1158+#line 231 "dtc-lexer.l"
11581159 {
11591160 DPRINT("PropNodeName: %s\n", yytext);
11601161 yylval.propnodename = xstrdup((yytext[0] == '\\') ?
@@ -1165,7 +1166,7 @@ YY_RULE_SETUP · 4 unmodified lines
11651166 YY_BREAK
11661167 case 18:
11671168 YY_RULE_SETUP
1168−#line 238 "dtc-lexer.l"
1169+#line 239 "dtc-lexer.l"
11691170 {
11701171 DPRINT("Binary Include\n");
11711172 return DT_INCBIN;
@@ -1174,64 +1175,64 @@ YY_RULE_SETUP · 2 unmodified lines
11741175 case 19:
11751176 /* rule 19 can match eol */
11761177 YY_RULE_SETUP
1177−#line 243 "dtc-lexer.l"
1178+#line 244 "dtc-lexer.l"
11781179 /* eat whitespace */
11791180 YY_BREAK
11801181 case 20:
11811182 /* rule 20 can match eol */
11821183 YY_RULE_SETUP
1183−#line 244 "dtc-lexer.l"
1184+#line 245 "dtc-lexer.l"
11841185 /* eat C-style comments */
11851186 YY_BREAK
11861187 case 21:
11871188 /* rule 21 can match eol */
11881189 YY_RULE_SETUP
1189−#line 245 "dtc-lexer.l"
1190+#line 246 "dtc-lexer.l"
11901191 /* eat C++-style comments */
11911192 YY_BREAK
11921193 case 22:
11931194 YY_RULE_SETUP
1194−#line 247 "dtc-lexer.l"
1195+#line 248 "dtc-lexer.l"
11951196 { return DT_LSHIFT; };
11961197 YY_BREAK
11971198 case 23:
11981199 YY_RULE_SETUP
1199−#line 248 "dtc-lexer.l"
1200+#line 249 "dtc-lexer.l"
12001201 { return DT_RSHIFT; };
12011202 YY_BREAK
12021203 case 24:
12031204 YY_RULE_SETUP
1204−#line 249 "dtc-lexer.l"
1205+#line 250 "dtc-lexer.l"
12051206 { return DT_LE; };
12061207 YY_BREAK
12071208 case 25:
12081209 YY_RULE_SETUP
1209−#line 250 "dtc-lexer.l"
1210+#line 251 "dtc-lexer.l"
12101211 { return DT_GE; };
12111212 YY_BREAK
12121213 case 26:
12131214 YY_RULE_SETUP
1214−#line 251 "dtc-lexer.l"
1215+#line 252 "dtc-lexer.l"
12151216 { return DT_EQ; };
12161217 YY_BREAK
12171218 case 27:
12181219 YY_RULE_SETUP
1219−#line 252 "dtc-lexer.l"
1220+#line 253 "dtc-lexer.l"
12201221 { return DT_NE; };
12211222 YY_BREAK
12221223 case 28:
12231224 YY_RULE_SETUP
1224−#line 253 "dtc-lexer.l"
1225+#line 254 "dtc-lexer.l"
12251226 { return DT_AND; };
12261227 YY_BREAK
12271228 case 29:
12281229 YY_RULE_SETUP
1229−#line 254 "dtc-lexer.l"
1230+#line 255 "dtc-lexer.l"
12301231 { return DT_OR; };
12311232 YY_BREAK
12321233 case 30:
12331234 YY_RULE_SETUP
1234−#line 256 "dtc-lexer.l"
1235+#line 257 "dtc-lexer.l"
12351236 {
12361237 DPRINT("Char: %c (\\x%02x)\n", yytext[0],
12371238 (unsigned)yytext[0]);
@@ -1249,10 +1250,10 @@ YY_RULE_SETUP · 11 unmodified lines
12491250 YY_BREAK
12501251 case 31:
12511252 YY_RULE_SETUP
1252−#line 271 "dtc-lexer.l"
1253+#line 272 "dtc-lexer.l"
12531254 ECHO;
12541255 YY_BREAK
1255−#line 1256 "dtc-lexer.lex.c"
1256+#line 1257 "dtc-lexer.lex.c"
12561257
12571258 case YY_END_OF_BUFFER:
12581259 {
@@ -2218,7 +2219,7 @@ void yyfree (void * ptr ) · 959 unmodified lines
22182219
22192220 #define YYTABLES_NAME "yytables"
22202221
2221−#line 271 "dtc-lexer.l"
2222+#line 272 "dtc-lexer.l"
22222223
22232224
22242225
scripts/dtc/dtc-parser.tab.c_shipped+3−3
@@ -1557,10 +1557,10 @@ yyreduce: · 1556 unmodified lines
15571557 {
15581558 struct node *target = get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].labelref));
15591559
1560− add_label(&target->labels, (yyvsp[-2].labelref));
1561− if (target)
1560+ if (target) {
1561+ add_label(&target->labels, (yyvsp[-2].labelref));
15621562 merge_nodes(target, (yyvsp[0].node));
1563− else
1563+ } else
15641564 ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref));
15651565 (yyval.node) = (yyvsp[-3].node);
15661566 }
scripts/dtc/dtc-parser.y+3−3
@@ -171,10 +171,10 @@ devicetree: · 170 unmodified lines
171171 {
172172 struct node *target = get_node_by_ref($1, $3);
173173
174− add_label(&target->labels, $2);
175− if (target)
174+ if (target) {
175+ add_label(&target->labels, $2);
176176 merge_nodes(target, $4);
177− else
177+ } else
178178 ERROR(&@3, "Label or path %s not found", $3);
179179 $$ = $1;
180180 }
scripts/dtc/dtc.c+5−4
@@ -138,7 +138,7 @@ static const char *guess_type_by_name(const char *fname, const char *fallback) · 137 unmodified lines
138138 static const char *guess_input_format(const char *fname, const char *fallback)
139139 {
140140 struct stat statbuf;
141− uint32_t magic;
141+ fdt32_t magic;
142142 FILE *f;
143143
144144 if (stat(fname, &statbuf) != 0)
@@ -159,8 +159,7 @@ static const char *guess_input_format(const char *fname, const char *fallback) · 14 unmodified lines
159159 }
160160 fclose(f);
161161
162− magic = fdt32_to_cpu(magic);
163− if (magic == FDT_MAGIC)
162+ if (fdt32_to_cpu(magic) == FDT_MAGIC)
164163 return "dtb";
165164
166165 return guess_type_by_name(fname, fallback);
@@ -216,7 +215,7 @@ int main(int argc, char *argv[]) · 49 unmodified lines
216215 alignsize = strtol(optarg, NULL, 0);
217216 if (!is_power_of_2(alignsize))
218217 die("Invalid argument \"%d\" to -a option\n",
219− optarg);
218+ alignsize);
220219 break;
221220 case 'f':
222221 force = true;
@@ -309,6 +308,8 @@ int main(int argc, char *argv[]) · 86 unmodified lines
309308 else
310309 die("Unknown input format \"%s\"\n", inform);
311310
311+ dti->outname = outname;
312+
312313 if (depfile) {
313314 fputc('\n', depfile);
314315 fclose(depfile);
scripts/dtc/dtc.h+8−3
@@ -43,7 +43,6 @@ · 42 unmodified lines
4343 #define debug(...)
4444 #endif
4545
46−
4746 #define DEFAULT_FDT_VERSION 17
4847
4948 /*
@@ -114,7 +113,7 @@ struct data data_insert_at_marker(struct data d, struct marker *m, · 64 unmodified lines
114113 struct data data_merge(struct data d1, struct data d2);
115114 struct data data_append_cell(struct data d, cell_t word);
116115 struct data data_append_integer(struct data d, uint64_t word, int bits);
117−struct data data_append_re(struct data d, const struct fdt_reserve_entry *re);
116+struct data data_append_re(struct data d, uint64_t address, uint64_t size);
118117 struct data data_append_addr(struct data d, uint64_t addr);
119118 struct data data_append_byte(struct data d, uint8_t byte);
120119 struct data data_append_zeroes(struct data d, int len);
@@ -136,6 +135,10 @@ struct label { · 15 unmodified lines
136135 struct label *next;
137136 };
138137
138+struct bus_type {
139+ const char *name;
140+};
141+
139142 struct property {
140143 bool deleted;
141144 char *name;
@@ -162,6 +165,7 @@ struct node { · 20 unmodified lines
162165 int addr_cells, size_cells;
163166
164167 struct label *labels;
168+ const struct bus_type *bus;
165169 };
166170
167171 #define for_each_label_withdel(l0, l) \
@@ -227,7 +231,7 @@ uint32_t guess_boot_cpuid(struct node *tree); · 59 unmodified lines
227231 /* Boot info (tree plus memreserve information */
228232
229233 struct reserve_info {
230− struct fdt_reserve_entry re;
234+ uint64_t address, size;
231235
232236 struct reserve_info *next;
233237
@@ -246,6 +250,7 @@ struct dt_info { · 12 unmodified lines
246250 struct reserve_info *reservelist;
247251 uint32_t boot_cpuid_phys;
248252 struct node *dt; /* the device tree */
253+ const char *outname; /* filename being written to, "-" for stdout */
249254 };
250255
251256 /* DTS version flags definitions */
scripts/dtc/flattree.c+26−32
@@ -49,7 +49,7 @@ static struct version_info { · 48 unmodified lines
4949
5050 struct emitter {
5151 void (*cell)(void *, cell_t);
52− void (*string)(void *, char *, int);
52+ void (*string)(void *, const char *, int);
5353 void (*align)(void *, int);
5454 void (*data)(void *, struct data);
5555 void (*beginnode)(void *, struct label *labels);
@@ -64,7 +64,7 @@ static void bin_emit_cell(void *e, cell_t val) · 8 unmodified lines
6464 *dtbuf = data_append_cell(*dtbuf, val);
6565 }
6666
67−static void bin_emit_string(void *e, char *str, int len)
67+static void bin_emit_string(void *e, const char *str, int len)
6868 {
6969 struct data *dtbuf = e;
7070
@@ -144,22 +144,14 @@ static void asm_emit_cell(void *e, cell_t val) · 73 unmodified lines
144144 (val >> 8) & 0xff, val & 0xff);
145145 }
146146
147−static void asm_emit_string(void *e, char *str, int len)
147+static void asm_emit_string(void *e, const char *str, int len)
148148 {
149149 FILE *f = e;
150− char c = 0;
151150
152− if (len != 0) {
153− /* XXX: ewww */
154− c = str[len];
155− str[len] = '\0';
156− }
157−
158− fprintf(f, "\t.string\t\"%s\"\n", str);
159−
160− if (len != 0) {
161− str[len] = c;
162− }
151+ if (len != 0)
152+ fprintf(f, "\t.string\t\"%.*s\"\n", len, str);
153+ else
154+ fprintf(f, "\t.string\t\"%s\"\n", str);
163155 }
164156
165157 static void asm_emit_align(void *e, int a)
@@ -179,7 +171,7 @@ static void asm_emit_data(void *e, struct data d) · 13 unmodified lines
179171 emit_offset_label(f, m->ref, m->offset);
180172
181173 while ((d.len - off) >= sizeof(uint32_t)) {
182− asm_emit_cell(e, fdt32_to_cpu(*((uint32_t *)(d.val+off))));
174+ asm_emit_cell(e, fdt32_to_cpu(*((fdt32_t *)(d.val+off))));
183175 off += sizeof(uint32_t);
184176 }
185177
@@ -318,17 +310,16 @@ static struct data flatten_reserve_list(struct reserve_info *reservelist, · 132 unmodified lines
318310 {
319311 struct reserve_info *re;
320312 struct data d = empty_data;
321− static struct fdt_reserve_entry null_re = {0,0};
322313 int j;
323314
324315 for (re = reservelist; re; re = re->next) {
325− d = data_append_re(d, &re->re);
316+ d = data_append_re(d, re->address, re->size);
326317 }
327318 /*
328319 * Add additional reserved slots if the user asked for them.
329320 */
330321 for (j = 0; j < reservenum; j++) {
331− d = data_append_re(d, &null_re);
322+ d = data_append_re(d, 0, 0);
332323 }
333324
334325 return d;
@@ -544,11 +535,11 @@ void dt_to_asm(FILE *f, struct dt_info *dti, int version) · 209 unmodified lines
544535 fprintf(f, "\t.globl\t%s\n", l->label);
545536 fprintf(f, "%s:\n", l->label);
546537 }
547− ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.address >> 32));
538+ ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->address >> 32));
548539 ASM_EMIT_BELONG(f, "0x%08x",
549− (unsigned int)(re->re.address & 0xffffffff));
550− ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size >> 32));
551− ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size & 0xffffffff));
540+ (unsigned int)(re->address & 0xffffffff));
541+ ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size >> 32));
542+ ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size & 0xffffffff));
552543 }
553544 for (i = 0; i < reservenum; i++) {
554545 fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
@@ -609,7 +600,7 @@ static void flat_read_chunk(struct inbuf *inb, void *p, int len) · 54 unmodified lines
609600
610601 static uint32_t flat_read_word(struct inbuf *inb)
611602 {
612− uint32_t val;
603+ fdt32_t val;
613604
614605 assert(((inb->ptr - inb->base) % sizeof(val)) == 0);
615606
@@ -718,13 +709,15 @@ static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb) · 102 unmodified lines
718709 * First pass, count entries.
719710 */
720711 while (1) {
712+ uint64_t address, size;
713+
721714 flat_read_chunk(inb, &re, sizeof(re));
722− re.address = fdt64_to_cpu(re.address);
723− re.size = fdt64_to_cpu(re.size);
724− if (re.size == 0)
715+ address = fdt64_to_cpu(re.address);
716+ size = fdt64_to_cpu(re.size);
717+ if (size == 0)
725718 break;
726719
727− new = build_reserve_entry(re.address, re.size);
720+ new = build_reserve_entry(address, size);
728721 reservelist = add_reserve_entry(reservelist, new);
729722 }
730723
@@ -817,6 +810,7 @@ static struct node *unflatten_tree(struct inbuf *dtbuf, · 86 unmodified lines
817810 struct dt_info *dt_from_blob(const char *fname)
818811 {
819812 FILE *f;
813+ fdt32_t magic_buf, totalsize_buf;
820814 uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys;
821815 uint32_t off_dt, off_str, off_mem_rsvmap;
822816 int rc;
@@ -833,7 +827,7 @@ struct dt_info *dt_from_blob(const char *fname) · 10 unmodified lines
833827
834828 f = srcfile_relative_open(fname, NULL);
835829
836− rc = fread(&magic, sizeof(magic), 1, f);
830+ rc = fread(&magic_buf, sizeof(magic_buf), 1, f);
837831 if (ferror(f))
838832 die("Error reading DT blob magic number: %s\n",
839833 strerror(errno));
@@ -844,11 +838,11 @@ struct dt_info *dt_from_blob(const char *fname) · 4 unmodified lines
844838 die("Mysterious short read reading magic number\n");
845839 }
846840
847− magic = fdt32_to_cpu(magic);
841+ magic = fdt32_to_cpu(magic_buf);
848842 if (magic != FDT_MAGIC)
849843 die("Blob has incorrect magic number\n");
850844
851− rc = fread(&totalsize, sizeof(totalsize), 1, f);
845+ rc = fread(&totalsize_buf, sizeof(totalsize_buf), 1, f);
852846 if (ferror(f))
853847 die("Error reading DT blob size: %s\n", strerror(errno));
854848 if (rc < 1) {
@@ -858,7 +852,7 @@ struct dt_info *dt_from_blob(const char *fname) · 3 unmodified lines
858852 die("Mysterious short read reading blob size\n");
859853 }
860854
861− totalsize = fdt32_to_cpu(totalsize);
855+ totalsize = fdt32_to_cpu(totalsize_buf);
862856 if (totalsize < FDT_V1_SIZE)
863857 die("DT blob size (%d) is too small\n", totalsize);
864858
scripts/dtc/libfdt/fdt_rw.c+2−1
@@ -283,7 +283,8 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name, · 282 unmodified lines
283283 if (err)
284284 return err;
285285
286− memcpy(prop->data, val, len);
286+ if (len)
287+ memcpy(prop->data, val, len);
287288 return 0;
288289 }
289290
scripts/dtc/libfdt/libfdt.h+50−1
@@ -143,7 +143,9 @@ · 142 unmodified lines
143143 /* Low-level functions (you probably don't need these) */
144144 /**********************************************************************/
145145
146+#ifndef SWIG /* This function is not useful in Python */
146147 const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen);
148+#endif
147149 static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
148150 {
149151 return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen);
@@ -210,7 +212,6 @@ int fdt_next_subnode(const void *fdt, int offset); · 60 unmodified lines
210212 /**********************************************************************/
211213 /* General functions */
212214 /**********************************************************************/
213−
214215 #define fdt_get_header(fdt, field) \
215216 (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field))
216217 #define fdt_magic(fdt) (fdt_get_header(fdt, magic))
@@ -354,8 +355,10 @@ int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size); · 137 unmodified lines
354355 * useful for finding subnodes based on a portion of a larger string,
355356 * such as a full path.
356357 */
358+#ifndef SWIG /* Not available in Python */
357359 int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
358360 const char *name, int namelen);
361+#endif
359362 /**
360363 * fdt_subnode_offset - find a subnode of a given node
361364 * @fdt: pointer to the device tree blob
@@ -391,7 +394,9 @@ int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name); · 29 unmodified lines
391394 * Identical to fdt_path_offset(), but only consider the first namelen
392395 * characters of path as the path name.
393396 */
397+#ifndef SWIG /* Not available in Python */
394398 int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen);
399+#endif
395400
396401 /**
397402 * fdt_path_offset - find a tree node by its full path
@@ -550,10 +555,12 @@ const struct fdt_property *fdt_get_property_by_offset(const void *fdt, · 152 unmodified lines
550555 * Identical to fdt_get_property(), but only examine the first namelen
551556 * characters of name for matching the property name.
552557 */
558+#ifndef SWIG /* Not available in Python */
553559 const struct fdt_property *fdt_get_property_namelen(const void *fdt,
554560 int nodeoffset,
555561 const char *name,
556562 int namelen, int *lenp);
563+#endif
557564
558565 /**
559566 * fdt_get_property - find a given property in a given node
@@ -624,8 +631,10 @@ static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset, · 64 unmodified lines
624631 * -FDT_ERR_BADSTRUCTURE,
625632 * -FDT_ERR_TRUNCATED, standard meanings
626633 */
634+#ifndef SWIG /* This function is not useful in Python */
627635 const void *fdt_getprop_by_offset(const void *fdt, int offset,
628636 const char **namep, int *lenp);
637+#endif
629638
630639 /**
631640 * fdt_getprop_namelen - get property value based on substring
@@ -638,6 +647,7 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset, · 6 unmodified lines
638647 * Identical to fdt_getprop(), but only examine the first namelen
639648 * characters of name for matching the property name.
640649 */
650+#ifndef SWIG /* Not available in Python */
641651 const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
642652 const char *name, int namelen, int *lenp);
643653 static inline void *fdt_getprop_namelen_w(void *fdt, int nodeoffset,
@@ -647,6 +657,7 @@ static inline void *fdt_getprop_namelen_w(void *fdt, int nodeoffset, · 3 unmodified lines
647657 return (void *)(uintptr_t)fdt_getprop_namelen(fdt, nodeoffset, name,
648658 namelen, lenp);
649659 }
660+#endif
650661
651662 /**
652663 * fdt_getprop - retrieve the value of a given property
@@ -707,8 +718,10 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset); · 54 unmodified lines
707718 * Identical to fdt_get_alias(), but only examine the first namelen
708719 * characters of name for matching the alias name.
709720 */
721+#ifndef SWIG /* Not available in Python */
710722 const char *fdt_get_alias_namelen(const void *fdt,
711723 const char *name, int namelen);
724+#endif
712725
713726 /**
714727 * fdt_get_alias - retrieve the path referenced by a given alias
@@ -1106,10 +1119,12 @@ int fdt_size_cells(const void *fdt, int nodeoffset); · 391 unmodified lines
11061119 * of the name. It is useful when you want to manipulate only one value of
11071120 * an array and you have a string that doesn't end with \0.
11081121 */
1122+#ifndef SWIG /* Not available in Python */
11091123 int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
11101124 const char *name, int namelen,
11111125 uint32_t idx, const void *val,
11121126 int len);
1127+#endif
11131128
11141129 /**
11151130 * fdt_setprop_inplace - change a property's value, but not its size
@@ -1139,8 +1154,10 @@ int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset, · 23 unmodified lines
11391154 * -FDT_ERR_BADSTRUCTURE,
11401155 * -FDT_ERR_TRUNCATED, standard meanings
11411156 */
1157+#ifndef SWIG /* Not available in Python */
11421158 int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
11431159 const void *val, int len);
1160+#endif
11441161
11451162 /**
11461163 * fdt_setprop_inplace_u32 - change the value of a 32-bit integer property
@@ -1527,6 +1544,36 @@ static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name, · 380 unmodified lines
15271544 #define fdt_setprop_string(fdt, nodeoffset, name, str) \
15281545 fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
15291546
1547+
1548+/**
1549+ * fdt_setprop_empty - set a property to an empty value
1550+ * @fdt: pointer to the device tree blob
1551+ * @nodeoffset: offset of the node whose property to change
1552+ * @name: name of the property to change
1553+ *
1554+ * fdt_setprop_empty() sets the value of the named property in the
1555+ * given node to an empty (zero length) value, or creates a new empty
1556+ * property if it does not already exist.
1557+ *
1558+ * This function may insert or delete data from the blob, and will
1559+ * therefore change the offsets of some existing nodes.
1560+ *
1561+ * returns:
1562+ * 0, on success
1563+ * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
1564+ * contain the new property value
1565+ * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
1566+ * -FDT_ERR_BADLAYOUT,
1567+ * -FDT_ERR_BADMAGIC,
1568+ * -FDT_ERR_BADVERSION,
1569+ * -FDT_ERR_BADSTATE,
1570+ * -FDT_ERR_BADSTRUCTURE,
1571+ * -FDT_ERR_BADLAYOUT,
1572+ * -FDT_ERR_TRUNCATED, standard meanings
1573+ */
1574+#define fdt_setprop_empty(fdt, nodeoffset, name) \
1575+ fdt_setprop((fdt), (nodeoffset), (name), NULL, 0)
1576+
15301577 /**
15311578 * fdt_appendprop - append to or create a property
15321579 * @fdt: pointer to the device tree blob
@@ -1704,8 +1751,10 @@ int fdt_delprop(void *fdt, int nodeoffset, const char *name); · 171 unmodified lines
17041751 * creating subnodes based on a portion of a larger string, such as a
17051752 * full path.
17061753 */
1754+#ifndef SWIG /* Not available in Python */
17071755 int fdt_add_subnode_namelen(void *fdt, int parentoffset,
17081756 const char *name, int namelen);
1757+#endif
17091758
17101759 /**
17111760 * fdt_add_subnode - creates a new node
scripts/dtc/libfdt/libfdt_env.h+13−13
@@ -58,16 +58,16 @@ · 57 unmodified lines
5858 #include <string.h>
5959
6060 #ifdef __CHECKER__
61−#define __force __attribute__((force))
62−#define __bitwise __attribute__((bitwise))
61+#define FDT_FORCE __attribute__((force))
62+#define FDT_BITWISE __attribute__((bitwise))
6363 #else
64−#define __force
65−#define __bitwise
64+#define FDT_FORCE
65+#define FDT_BITWISE
6666 #endif
6767
68−typedef uint16_t __bitwise fdt16_t;
69−typedef uint32_t __bitwise fdt32_t;
70−typedef uint64_t __bitwise fdt64_t;
68+typedef uint16_t FDT_BITWISE fdt16_t;
69+typedef uint32_t FDT_BITWISE fdt32_t;
70+typedef uint64_t FDT_BITWISE fdt64_t;
7171
7272 #define EXTRACT_BYTE(x, n) ((unsigned long long)((uint8_t *)&x)[n])
7373 #define CPU_TO_FDT16(x) ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
@@ -80,29 +80,29 @@ typedef uint64_t __bitwise fdt64_t; · 6 unmodified lines
8080
8181 static inline uint16_t fdt16_to_cpu(fdt16_t x)
8282 {
83− return (__force uint16_t)CPU_TO_FDT16(x);
83+ return (FDT_FORCE uint16_t)CPU_TO_FDT16(x);
8484 }
8585 static inline fdt16_t cpu_to_fdt16(uint16_t x)
8686 {
87− return (__force fdt16_t)CPU_TO_FDT16(x);
87+ return (FDT_FORCE fdt16_t)CPU_TO_FDT16(x);
8888 }
8989
9090 static inline uint32_t fdt32_to_cpu(fdt32_t x)
9191 {
92− return (__force uint32_t)CPU_TO_FDT32(x);
92+ return (FDT_FORCE uint32_t)CPU_TO_FDT32(x);
9393 }
9494 static inline fdt32_t cpu_to_fdt32(uint32_t x)
9595 {
96− return (__force fdt32_t)CPU_TO_FDT32(x);
96+ return (FDT_FORCE fdt32_t)CPU_TO_FDT32(x);
9797 }
9898
9999 static inline uint64_t fdt64_to_cpu(fdt64_t x)
100100 {
101− return (__force uint64_t)CPU_TO_FDT64(x);
101+ return (FDT_FORCE uint64_t)CPU_TO_FDT64(x);
102102 }
103103 static inline fdt64_t cpu_to_fdt64(uint64_t x)
104104 {
105− return (__force fdt64_t)CPU_TO_FDT64(x);
105+ return (FDT_FORCE fdt64_t)CPU_TO_FDT64(x);
106106 }
107107 #undef CPU_TO_FDT64
108108 #undef CPU_TO_FDT32
scripts/dtc/livetree.c+12−10
@@ -242,7 +242,7 @@ void delete_property_by_name(struct node *node, char *name) · 241 unmodified lines
242242 struct property *prop = node->proplist;
243243
244244 while (prop) {
245− if (!strcmp(prop->name, name)) {
245+ if (streq(prop->name, name)) {
246246 delete_property(prop);
247247 return;
248248 }
@@ -275,7 +275,7 @@ void delete_node_by_name(struct node *parent, char *name) · 26 unmodified lines
275275 struct node *node = parent->children;
276276
277277 while (node) {
278− if (!strcmp(node->name, name)) {
278+ if (streq(node->name, name)) {
279279 delete_node(node);
280280 return;
281281 }
@@ -319,8 +319,8 @@ struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size) · 37 unmodified lines
319319
320320 memset(new, 0, sizeof(*new));
321321
322− new->re.address = address;
323− new->re.size = size;
322+ new->address = address;
323+ new->size = size;
324324
325325 return new;
326326 }
@@ -393,7 +393,7 @@ struct property *get_property(struct node *node, const char *propname) · 66 unmodified lines
393393 cell_t propval_cell(struct property *prop)
394394 {
395395 assert(prop->val.len == sizeof(cell_t));
396− return fdt32_to_cpu(*((cell_t *)prop->val.val));
396+ return fdt32_to_cpu(*((fdt32_t *)prop->val.val));
397397 }
398398
399399 struct property *get_property_by_label(struct node *tree, const char *label,
@@ -599,13 +599,13 @@ static int cmp_reserve_info(const void *ax, const void *bx) · 199 unmodified lines
599599 a = *((const struct reserve_info * const *)ax);
600600 b = *((const struct reserve_info * const *)bx);
601601
602− if (a->re.address < b->re.address)
602+ if (a->address < b->address)
603603 return -1;
604− else if (a->re.address > b->re.address)
604+ else if (a->address > b->address)
605605 return 1;
606− else if (a->re.size < b->re.size)
606+ else if (a->size < b->size)
607607 return -1;
608− else if (a->re.size > b->re.size)
608+ else if (a->size > b->size)
609609 return 1;
610610 else
611611 return 0;
@@ -847,6 +847,8 @@ static void add_fixup_entry(struct dt_info *dti, struct node *fn, · 235 unmodified lines
847847 xasprintf(&entry, "%s:%s:%u",
848848 node->fullpath, prop->name, m->offset);
849849 append_to_property(fn, m->ref, entry, strlen(entry) + 1);
850+
851+ free(entry);
850852 }
851853
852854 static void generate_fixups_tree_internal(struct dt_info *dti,
@@ -900,7 +902,7 @@ static void add_local_fixup_entry(struct dt_info *dti, · 47 unmodified lines
900902 struct node *refnode)
901903 {
902904 struct node *wn, *nwn; /* local fixup node, walk node, new */
903− uint32_t value_32;
905+ fdt32_t value_32;
904906 char **compp;
905907 int i, depth;
906908
scripts/dtc/srcpos.c+1−1
@@ -252,7 +252,7 @@ srcpos_string(struct srcpos *pos) · 251 unmodified lines
252252 const char *fname = "<no-file>";
253253 char *pos_str;
254254
255− if (pos)
255+ if (pos->file && pos->file->name)
256256 fname = pos->file->name;
257257
258258
scripts/dtc/srcpos.h+5−6
@@ -22,6 +22,7 @@ · 21 unmodified lines
2222
2323 #include <stdio.h>
2424 #include <stdbool.h>
25+#include "util.h"
2526
2627 struct srcfile_state {
2728 FILE *f;
@@ -106,12 +107,10 @@ extern void srcpos_update(struct srcpos *pos, const char *text, int len); · 78 unmodified lines
106107 extern struct srcpos *srcpos_copy(struct srcpos *pos);
107108 extern char *srcpos_string(struct srcpos *pos);
108109
109−extern void srcpos_verror(struct srcpos *pos, const char *prefix,
110− const char *fmt, va_list va)
111− __attribute__((format(printf, 3, 0)));
112−extern void srcpos_error(struct srcpos *pos, const char *prefix,
113− const char *fmt, ...)
114− __attribute__((format(printf, 3, 4)));
110+extern void PRINTF(3, 0) srcpos_verror(struct srcpos *pos, const char *prefix,
111+ const char *fmt, va_list va);
112+extern void PRINTF(3, 4) srcpos_error(struct srcpos *pos, const char *prefix,
113+ const char *fmt, ...);
115114
116115 extern void srcpos_set_line(char *f, int l);
117116
scripts/dtc/treesource.c+3−3
@@ -137,7 +137,7 @@ static void write_propval_string(FILE *f, struct data val) · 136 unmodified lines
137137 static void write_propval_cells(FILE *f, struct data val)
138138 {
139139 void *propend = val.val + val.len;
140− cell_t *cp = (cell_t *)val.val;
140+ fdt32_t *cp = (fdt32_t *)val.val;
141141 struct marker *m = val.markers;
142142
143143 fprintf(f, "<");
@@ -275,8 +275,8 @@ void dt_to_source(FILE *f, struct dt_info *dti) · 131 unmodified lines
275275 for_each_label(re->labels, l)
276276 fprintf(f, "%s: ", l->label);
277277 fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n",
278− (unsigned long long)re->re.address,
279− (unsigned long long)re->re.size);
278+ (unsigned long long)re->address,
279+ (unsigned long long)re->size);
280280 }
281281
282282 write_tree_source_node(f, dti->dt, 0);
scripts/dtc/update-dtc-source.sh+19−1
@@ -36,10 +36,19 @@ DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c · 35 unmodified lines
3636 DTC_GENERATED="dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h"
3737 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"
3838
39+get_last_dtc_version() {
40+ git log --oneline scripts/dtc/ | grep 'upstream' | head -1 | sed -e 's/^.* \(.*\)/\1/'
41+}
42+
43+last_dtc_ver=$(get_last_dtc_version)
44+
3945 # Build DTC
4046 cd $DTC_UPSTREAM_PATH
4147 make clean
4248 make check
49+dtc_version=$(git describe HEAD)
50+dtc_log=$(git log --oneline ${last_dtc_ver}..)
51+
4352
4453 # Copy the files into the Linux tree
4554 cd $DTC_LINUX_PATH
@@ -60,4 +69,13 @@ sed -i -- 's/#include <libfdt_env.h>/#include "libfdt_env.h"/g' ./libfdt/libfdt. · 14 unmodified lines
6069 sed -i -- 's/#include <fdt.h>/#include "fdt.h"/g' ./libfdt/libfdt.h
6170 git add ./libfdt/libfdt.h
6271
63−git commit -e -v -m "scripts/dtc: Update to upstream version [CHANGEME]"
72+commit_msg=$(cat << EOF
73+scripts/dtc: Update to upstream version ${dtc_version}
74+
75+This adds the following commits from upstream:
76+
77+${dtc_log}
78+EOF
79+)
80+
81+git commit -e -v -s -m "${commit_msg}"
scripts/dtc/util.c+6−5
@@ -396,7 +396,7 @@ void utilfdt_print_data(const char *data, int len) · 395 unmodified lines
396396 } while (s < data + len);
397397
398398 } else if ((len % 4) == 0) {
399− const uint32_t *cell = (const uint32_t *)data;
399+ const fdt32_t *cell = (const fdt32_t *)data;
400400
401401 printf(" = <");
402402 for (i = 0, len /= 4; i < len; i++)
@@ -412,15 +412,16 @@ void utilfdt_print_data(const char *data, int len) · 9 unmodified lines
412412 }
413413 }
414414
415−void util_version(void)
415+void NORETURN util_version(void)
416416 {
417417 printf("Version: %s\n", DTC_VERSION);
418418 exit(0);
419419 }
420420
421−void util_usage(const char *errmsg, const char *synopsis,
422− const char *short_opts, struct option const long_opts[],
423− const char * const opts_help[])
421+void NORETURN util_usage(const char *errmsg, const char *synopsis,
422+ const char *short_opts,
423+ struct option const long_opts[],
424+ const char * const opts_help[])
424425 {
425426 FILE *fp = errmsg ? stderr : stdout;
426427 const char a_arg[] = "<arg>";
scripts/dtc/util.h+17−7
@@ -25,9 +25,17 @@ · 24 unmodified lines
2525 * USA
2626 */
2727
28+#ifdef __GNUC__
29+#define PRINTF(i, j) __attribute__((format (printf, i, j)))
30+#define NORETURN __attribute__((noreturn))
31+#else
32+#define PRINTF(i, j)
33+#define NORETURN
34+#endif
35+
2836 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
2937
30−static inline void __attribute__((noreturn)) die(const char *str, ...)
38+static inline void NORETURN PRINTF(1, 2) die(const char *str, ...)
3139 {
3240 va_list ap;
3341
@@ -53,13 +61,14 @@ static inline void *xrealloc(void *p, size_t len) · 19 unmodified lines
5361 void *new = realloc(p, len);
5462
5563 if (!new)
56− die("realloc() failed (len=%d)\n", len);
64+ die("realloc() failed (len=%zd)\n", len);
5765
5866 return new;
5967 }
6068
6169 extern char *xstrdup(const char *s);
62−extern int xasprintf(char **strp, const char *fmt, ...);
70+
71+extern int PRINTF(2, 3) xasprintf(char **strp, const char *fmt, ...);
6372 extern char *join_path(const char *path, const char *name);
6473
6574 /**
@@ -188,7 +197,7 @@ void utilfdt_print_data(const char *data, int len); · 122 unmodified lines
188197 /**
189198 * Show source version and exit
190199 */
191−void util_version(void) __attribute__((noreturn));
200+void NORETURN util_version(void);
192201
193202 /**
194203 * Show usage and exit
@@ -202,9 +211,10 @@ void util_version(void) __attribute__((noreturn)); · 7 unmodified lines
202211 * @param long_opts The structure of long options
203212 * @param opts_help An array of help strings (should align with long_opts)
204213 */
205−void util_usage(const char *errmsg, const char *synopsis,
206− const char *short_opts, struct option const long_opts[],
207− const char * const opts_help[]) __attribute__((noreturn));
214+void NORETURN util_usage(const char *errmsg, const char *synopsis,
215+ const char *short_opts,
216+ struct option const long_opts[],
217+ const char * const opts_help[]);
208218
209219 /**
210220 * Show usage and exit
scripts/dtc/version_gen.h+1−1
@@ -1 +1 @@
1−#define DTC_VERSION "DTC 1.4.2-g0931cea3"
1+#define DTC_VERSION "DTC 1.4.4-g756ffc4f"