summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Herring <robh@kernel.org>2017-03-21 10:01:08 -0400
committerRob Herring <robh@kernel.org>2017-03-22 15:56:14 -0400
commit89d123106a97bf412a4c10482044c822f4b069f7 (patch)
tree35603f528aedddff67a643b957f2803601a03f95
parent86cef6144d273404d8cb5c0b215ada8d23e5dbeb (diff)
scripts/dtc: Update to upstream version v1.4.4-8-g756ffc4f52f6
This adds the following commits from upstream: 756ffc4f52f6 Build pylibfdt as part of the normal build process 8cb3896358e9 Adjust libfdt.h to work with swig b40aa8359aff Mention pylibfdt in the documentation 12cfb740cc76 Add tests for pylibfdt 50f250701631 Add an initial Python library for libfdt cdbb2b6c7a3a checks: Warn on node name unit-addresses with '0x' or leading 0s 4c15d5da17cc checks: Add bus checks for simple-bus buses 33c3985226d3 checks: Add bus checks for PCI buses 558cd81bdd43 dtc: Bump version to v1.4.4 c17a811c62eb fdtput: Remove star from value_len documentation 194d5caaefcb fdtget: Use @return to document the return value d922ecdd017b tests: Make realloc_fdt() really allocate *fdt 921cc17fec29 libfdt: overlay: Check the value of the right variable 9ffdf60bf463 dtc: Simplify asm_emit_string() implementation 881012e44386 libfdt: Change names of sparse helper macros bad5b28049e5 Fix assorted sparse warnings 672ac09ea04d Clean up gcc attributes 49300f2ade6a dtc: Don't abuse struct fdt_reserve_entry fa8bc7f928ac dtc: Bump version to v1.4.3 34a9886a177f Add printf format attributes f72508e2b6ca Correct some broken printf() like format mismatches 397d5ef0203c libfdt: Add fdt_setprop_empty() 69a1bd6ad3f9 libfdt: Remove undefined behaviour setting empty properties acd1b534a592 Print output filename as part of warning messages 120775eb1cf3 dtc: Use streq() in preference to strcmp() 852e9ecbe197 checks: Add Warning for stricter node name character checking ef0e8f061534 checks: Add Warning for stricter property name character checking 00d7bb1f4b0e dtc: pos parameter to srcpos_string() can't be NULL 95d57726bca4 livetree.c: Fix memory leak 3b9c97093d6e dtc: Fix NULL pointer use in dtlabel + dtref case 43eb551426ea manual: Fix typo it -> in 4baf15f7f13f Makefile: Add tags rule Signed-off-by: Rob Herring <robh@kernel.org>
-rw-r--r--scripts/dtc/checks.c361
-rw-r--r--scripts/dtc/data.c16
-rw-r--r--scripts/dtc/dtc-lexer.l3
-rw-r--r--scripts/dtc/dtc-lexer.lex.c_shipped77
-rw-r--r--scripts/dtc/dtc-parser.tab.c_shipped6
-rw-r--r--scripts/dtc/dtc-parser.y6
-rw-r--r--scripts/dtc/dtc.c9
-rw-r--r--scripts/dtc/dtc.h11
-rw-r--r--scripts/dtc/flattree.c58
-rw-r--r--scripts/dtc/libfdt/fdt_rw.c3
-rw-r--r--scripts/dtc/libfdt/libfdt.h51
-rw-r--r--scripts/dtc/libfdt/libfdt_env.h26
-rw-r--r--scripts/dtc/livetree.c22
-rw-r--r--scripts/dtc/srcpos.c2
-rw-r--r--scripts/dtc/srcpos.h11
-rw-r--r--scripts/dtc/treesource.c6
-rw-r--r--scripts/dtc/util.c11
-rw-r--r--scripts/dtc/util.h24
-rw-r--r--scripts/dtc/version_gen.h2
19 files changed, 523 insertions, 182 deletions
diff --git a/scripts/dtc/checks.c b/scripts/dtc/checks.c
index 3d18e45374c8..5adfc8f52b4f 100644
--- a/scripts/dtc/checks.c
+++ b/scripts/dtc/checks.c
@@ -72,17 +72,16 @@ struct check {
72#define CHECK(_nm, _fn, _d, ...) \ 72#define CHECK(_nm, _fn, _d, ...) \
73 CHECK_ENTRY(_nm, _fn, _d, false, false, __VA_ARGS__) 73 CHECK_ENTRY(_nm, _fn, _d, false, false, __VA_ARGS__)
74 74
75#ifdef __GNUC__ 75static inline void PRINTF(3, 4) check_msg(struct check *c, struct dt_info *dti,
76static inline void check_msg(struct check *c, const char *fmt, ...) __attribute__((format (printf, 2, 3))); 76 const char *fmt, ...)
77#endif
78static inline void check_msg(struct check *c, const char *fmt, ...)
79{ 77{
80 va_list ap; 78 va_list ap;
81 va_start(ap, fmt); 79 va_start(ap, fmt);
82 80
83 if ((c->warn && (quiet < 1)) 81 if ((c->warn && (quiet < 1))
84 || (c->error && (quiet < 2))) { 82 || (c->error && (quiet < 2))) {
85 fprintf(stderr, "%s (%s): ", 83 fprintf(stderr, "%s: %s (%s): ",
84 strcmp(dti->outname, "-") ? dti->outname : "<stdout>",
86 (c->error) ? "ERROR" : "Warning", c->name); 85 (c->error) ? "ERROR" : "Warning", c->name);
87 vfprintf(stderr, fmt, ap); 86 vfprintf(stderr, fmt, ap);
88 fprintf(stderr, "\n"); 87 fprintf(stderr, "\n");
@@ -90,11 +89,11 @@ static inline void check_msg(struct check *c, const char *fmt, ...)
90 va_end(ap); 89 va_end(ap);
91} 90}
92 91
93#define FAIL(c, ...) \ 92#define FAIL(c, dti, ...) \
94 do { \ 93 do { \
95 TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \ 94 TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \
96 (c)->status = FAILED; \ 95 (c)->status = FAILED; \
97 check_msg((c), __VA_ARGS__); \ 96 check_msg((c), dti, __VA_ARGS__); \
98 } while (0) 97 } while (0)
99 98
100static void check_nodes_props(struct check *c, struct dt_info *dti, struct node *node) 99static 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)
127 error = error || run_check(prq, dti); 126 error = error || run_check(prq, dti);
128 if (prq->status != PASSED) { 127 if (prq->status != PASSED) {
129 c->status = PREREQ; 128 c->status = PREREQ;
130 check_msg(c, "Failed prerequisite '%s'", 129 check_msg(c, dti, "Failed prerequisite '%s'",
131 c->prereq[i]->name); 130 c->prereq[i]->name);
132 } 131 }
133 } 132 }
@@ -157,7 +156,7 @@ out:
157static inline void check_always_fail(struct check *c, struct dt_info *dti, 156static inline void check_always_fail(struct check *c, struct dt_info *dti,
158 struct node *node) 157 struct node *node)
159{ 158{
160 FAIL(c, "always_fail check"); 159 FAIL(c, dti, "always_fail check");
161} 160}
162CHECK(always_fail, check_always_fail, NULL); 161CHECK(always_fail, check_always_fail, NULL);
163 162
@@ -172,7 +171,7 @@ static void check_is_string(struct check *c, struct dt_info *dti,
172 return; /* Not present, assumed ok */ 171 return; /* Not present, assumed ok */
173 172
174 if (!data_is_one_string(prop->val)) 173 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",
176 propname, node->fullpath); 175 propname, node->fullpath);
177} 176}
178#define WARNING_IF_NOT_STRING(nm, propname) \ 177#define WARNING_IF_NOT_STRING(nm, propname) \
@@ -191,7 +190,7 @@ static void check_is_cell(struct check *c, struct dt_info *dti,
191 return; /* Not present, assumed ok */ 190 return; /* Not present, assumed ok */
192 191
193 if (prop->val.len != sizeof(cell_t)) 192 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",
195 propname, node->fullpath); 194 propname, node->fullpath);
196} 195}
197#define WARNING_IF_NOT_CELL(nm, propname) \ 196#define WARNING_IF_NOT_CELL(nm, propname) \
@@ -213,7 +212,7 @@ static void check_duplicate_node_names(struct check *c, struct dt_info *dti,
213 child2; 212 child2;
214 child2 = child2->next_sibling) 213 child2 = child2->next_sibling)
215 if (streq(child->name, child2->name)) 214 if (streq(child->name, child2->name))
216 FAIL(c, "Duplicate node name %s", 215 FAIL(c, dti, "Duplicate node name %s",
217 child->fullpath); 216 child->fullpath);
218} 217}
219ERROR(duplicate_node_names, check_duplicate_node_names, NULL); 218ERROR(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,
228 if (prop2->deleted) 227 if (prop2->deleted)
229 continue; 228 continue;
230 if (streq(prop->name, prop2->name)) 229 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",
232 prop->name, node->fullpath); 231 prop->name, node->fullpath);
233 } 232 }
234 } 233 }
@@ -239,6 +238,7 @@ ERROR(duplicate_property_names, check_duplicate_property_names, NULL);
239#define UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 238#define UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
240#define DIGITS "0123456789" 239#define DIGITS "0123456789"
241#define PROPNODECHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-" 240#define PROPNODECHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-"
241#define PROPNODECHARSSTRICT LOWERCASE UPPERCASE DIGITS ",-"
242 242
243static void check_node_name_chars(struct check *c, struct dt_info *dti, 243static void check_node_name_chars(struct check *c, struct dt_info *dti,
244 struct node *node) 244 struct node *node)
@@ -246,16 +246,27 @@ static void check_node_name_chars(struct check *c, struct dt_info *dti,
246 int n = strspn(node->name, c->data); 246 int n = strspn(node->name, c->data);
247 247
248 if (n < strlen(node->name)) 248 if (n < strlen(node->name))
249 FAIL(c, "Bad character '%c' in node %s", 249 FAIL(c, dti, "Bad character '%c' in node %s",
250 node->name[n], node->fullpath); 250 node->name[n], node->fullpath);
251} 251}
252ERROR(node_name_chars, check_node_name_chars, PROPNODECHARS "@"); 252ERROR(node_name_chars, check_node_name_chars, PROPNODECHARS "@");
253 253
254static 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}
263CHECK(node_name_chars_strict, check_node_name_chars_strict, PROPNODECHARSSTRICT);
264
254static void check_node_name_format(struct check *c, struct dt_info *dti, 265static void check_node_name_format(struct check *c, struct dt_info *dti,
255 struct node *node) 266 struct node *node)
256{ 267{
257 if (strchr(get_unitname(node), '@')) 268 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",
259 node->fullpath); 270 node->fullpath);
260} 271}
261ERROR(node_name_format, check_node_name_format, NULL, &node_name_chars); 272ERROR(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,
274 285
275 if (prop) { 286 if (prop) {
276 if (!unitname[0]) 287 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",
278 node->fullpath); 289 node->fullpath);
279 } else { 290 } else {
280 if (unitname[0]) 291 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",
282 node->fullpath); 293 node->fullpath);
283 } 294 }
284} 295}
@@ -293,12 +304,44 @@ static void check_property_name_chars(struct check *c, struct dt_info *dti,
293 int n = strspn(prop->name, c->data); 304 int n = strspn(prop->name, c->data);
294 305
295 if (n < strlen(prop->name)) 306 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",
297 prop->name[n], prop->name, node->fullpath); 308 prop->name[n], prop->name, node->fullpath);
298 } 309 }
299} 310}
300ERROR(property_name_chars, check_property_name_chars, PROPNODECHARS); 311ERROR(property_name_chars, check_property_name_chars, PROPNODECHARS);
301 312
313static 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}
343CHECK(property_name_chars_strict, check_property_name_chars_strict, PROPNODECHARSSTRICT);
344
302#define DESCLABEL_FMT "%s%s%s%s%s" 345#define DESCLABEL_FMT "%s%s%s%s%s"
303#define DESCLABEL_ARGS(node,prop,mark) \ 346#define DESCLABEL_ARGS(node,prop,mark) \
304 ((mark) ? "value of " : ""), \ 347 ((mark) ? "value of " : ""), \
@@ -327,7 +370,7 @@ static void check_duplicate_label(struct check *c, struct dt_info *dti,
327 return; 370 return;
328 371
329 if ((othernode != node) || (otherprop != prop) || (othermark != mark)) 372 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
331 " and " DESCLABEL_FMT, 374 " and " DESCLABEL_FMT,
332 label, DESCLABEL_ARGS(node, prop, mark), 375 label, DESCLABEL_ARGS(node, prop, mark),
333 DESCLABEL_ARGS(othernode, otherprop, othermark)); 376 DESCLABEL_ARGS(othernode, otherprop, othermark));
@@ -367,7 +410,7 @@ static cell_t check_phandle_prop(struct check *c, struct dt_info *dti,
367 return 0; 410 return 0;
368 411
369 if (prop->val.len != sizeof(cell_t)) { 412 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",
371 node->fullpath, prop->val.len, prop->name); 414 node->fullpath, prop->val.len, prop->name);
372 return 0; 415 return 0;
373 } 416 }
@@ -379,7 +422,7 @@ static cell_t check_phandle_prop(struct check *c, struct dt_info *dti,
379 /* "Set this node's phandle equal to some 422 /* "Set this node's phandle equal to some
380 * other node's phandle". That's nonsensical 423 * other node's phandle". That's nonsensical
381 * by construction. */ { 424 * 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",
383 prop->name, node->fullpath); 426 prop->name, node->fullpath);
384 } 427 }
385 /* But setting this node's phandle equal to its own 428 /* 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,
393 phandle = propval_cell(prop); 436 phandle = propval_cell(prop);
394 437
395 if ((phandle == 0) || (phandle == -1)) { 438 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",
397 node->fullpath, phandle, prop->name); 440 node->fullpath, phandle, prop->name);
398 return 0; 441 return 0;
399 } 442 }
@@ -420,7 +463,7 @@ static void check_explicit_phandles(struct check *c, struct dt_info *dti,
420 return; 463 return;
421 464
422 if (linux_phandle && phandle && (phandle != linux_phandle)) 465 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'"
424 " properties", node->fullpath); 467 " properties", node->fullpath);
425 468
426 if (linux_phandle && !phandle) 469 if (linux_phandle && !phandle)
@@ -428,7 +471,7 @@ static void check_explicit_phandles(struct check *c, struct dt_info *dti,
428 471
429 other = get_node_by_phandle(root, phandle); 472 other = get_node_by_phandle(root, phandle);
430 if (other && (other != node)) { 473 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)",
432 node->fullpath, phandle, other->fullpath); 475 node->fullpath, phandle, other->fullpath);
433 return; 476 return;
434 } 477 }
@@ -453,7 +496,7 @@ static void check_name_properties(struct check *c, struct dt_info *dti,
453 496
454 if ((prop->val.len != node->basenamelen+1) 497 if ((prop->val.len != node->basenamelen+1)
455 || (memcmp(prop->val.val, node->name, node->basenamelen) != 0)) { 498 || (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"
457 " of base node name)", node->fullpath, prop->val.val); 500 " of base node name)", node->fullpath, prop->val.val);
458 } else { 501 } else {
459 /* The name property is correct, and therefore redundant. 502 /* The name property is correct, and therefore redundant.
@@ -488,16 +531,16 @@ static void fixup_phandle_references(struct check *c, struct dt_info *dti,
488 refnode = get_node_by_ref(dt, m->ref); 531 refnode = get_node_by_ref(dt, m->ref);
489 if (! refnode) { 532 if (! refnode) {
490 if (!(dti->dtsflags & DTSF_PLUGIN)) 533 if (!(dti->dtsflags & DTSF_PLUGIN))
491 FAIL(c, "Reference to non-existent node or " 534 FAIL(c, dti, "Reference to non-existent node or "
492 "label \"%s\"\n", m->ref); 535 "label \"%s\"\n", m->ref);
493 else /* mark the entry as unresolved */ 536 else /* mark the entry as unresolved */
494 *((cell_t *)(prop->val.val + m->offset)) = 537 *((fdt32_t *)(prop->val.val + m->offset)) =
495 cpu_to_fdt32(0xffffffff); 538 cpu_to_fdt32(0xffffffff);
496 continue; 539 continue;
497 } 540 }
498 541
499 phandle = get_node_phandle(dt, refnode); 542 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);
501 } 544 }
502 } 545 }
503} 546}
@@ -520,7 +563,7 @@ static void fixup_path_references(struct check *c, struct dt_info *dti,
520 563
521 refnode = get_node_by_ref(dt, m->ref); 564 refnode = get_node_by_ref(dt, m->ref);
522 if (!refnode) { 565 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",
524 m->ref); 567 m->ref);
525 continue; 568 continue;
526 } 569 }
@@ -579,19 +622,19 @@ static void check_reg_format(struct check *c, struct dt_info *dti,
579 return; /* No "reg", that's fine */ 622 return; /* No "reg", that's fine */
580 623
581 if (!node->parent) { 624 if (!node->parent) {
582 FAIL(c, "Root node has a \"reg\" property"); 625 FAIL(c, dti, "Root node has a \"reg\" property");
583 return; 626 return;
584 } 627 }
585 628
586 if (prop->val.len == 0) 629 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);
588 631
589 addr_cells = node_addr_cells(node->parent); 632 addr_cells = node_addr_cells(node->parent);
590 size_cells = node_size_cells(node->parent); 633 size_cells = node_size_cells(node->parent);
591 entrylen = (addr_cells + size_cells) * sizeof(cell_t); 634 entrylen = (addr_cells + size_cells) * sizeof(cell_t);
592 635
593 if (!entrylen || (prop->val.len % entrylen) != 0) 636 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) "
595 "(#address-cells == %d, #size-cells == %d)", 638 "(#address-cells == %d, #size-cells == %d)",
596 node->fullpath, prop->val.len, addr_cells, size_cells); 639 node->fullpath, prop->val.len, addr_cells, size_cells);
597} 640}
@@ -608,7 +651,7 @@ static void check_ranges_format(struct check *c, struct dt_info *dti,
608 return; 651 return;
609 652
610 if (!node->parent) { 653 if (!node->parent) {
611 FAIL(c, "Root node has a \"ranges\" property"); 654 FAIL(c, dti, "Root node has a \"ranges\" property");
612 return; 655 return;
613 } 656 }
614 657
@@ -620,17 +663,17 @@ static void check_ranges_format(struct check *c, struct dt_info *dti,
620 663
621 if (prop->val.len == 0) { 664 if (prop->val.len == 0) {
622 if (p_addr_cells != c_addr_cells) 665 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 "
624 "#address-cells (%d) differs from %s (%d)", 667 "#address-cells (%d) differs from %s (%d)",
625 node->fullpath, c_addr_cells, node->parent->fullpath, 668 node->fullpath, c_addr_cells, node->parent->fullpath,
626 p_addr_cells); 669 p_addr_cells);
627 if (p_size_cells != c_size_cells) 670 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 "
629 "#size-cells (%d) differs from %s (%d)", 672 "#size-cells (%d) differs from %s (%d)",
630 node->fullpath, c_size_cells, node->parent->fullpath, 673 node->fullpath, c_size_cells, node->parent->fullpath,
631 p_size_cells); 674 p_size_cells);
632 } else if ((prop->val.len % entrylen) != 0) { 675 } 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) "
634 "(parent #address-cells == %d, child #address-cells == %d, " 677 "(parent #address-cells == %d, child #address-cells == %d, "
635 "#size-cells == %d)", node->fullpath, prop->val.len, 678 "#size-cells == %d)", node->fullpath, prop->val.len,
636 p_addr_cells, c_addr_cells, c_size_cells); 679 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,
638} 681}
639WARNING(ranges_format, check_ranges_format, NULL, &addr_size_cells); 682WARNING(ranges_format, check_ranges_format, NULL, &addr_size_cells);
640 683
684static const struct bus_type pci_bus = {
685 .name = "PCI",
686};
687
688static 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}
735WARNING(pci_bridge, check_pci_bridge, NULL,
736 &device_type_is_string, &addr_size_cells);
737
738static 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}
766WARNING(pci_device_bus_num, check_pci_device_bus_num, NULL, &reg_format, &pci_bridge);
767
768static 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}
814WARNING(pci_device_reg, check_pci_device_reg, NULL, &reg_format, &pci_bridge);
815
816static const struct bus_type simple_bus = {
817 .name = "simple-bus",
818};
819
820static 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
837static 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}
842WARNING(simple_bus_bridge, check_simple_bus_bridge, NULL, &addr_size_cells);
843
844static 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}
881WARNING(simple_bus_reg, check_simple_bus_reg, NULL, &reg_format, &simple_bus_bridge);
882
883static 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}
904WARNING(unit_address_format, check_unit_address_format, NULL,
905 &node_name_format, &pci_bridge, &simple_bus_bridge);
906
641/* 907/*
642 * Style checks 908 * Style checks
643 */ 909 */
@@ -656,11 +922,11 @@ static void check_avoid_default_addr_size(struct check *c, struct dt_info *dti,
656 return; 922 return;
657 923
658 if (node->parent->addr_cells == -1) 924 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",
660 node->fullpath); 926 node->fullpath);
661 927
662 if (node->parent->size_cells == -1) 928 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",
664 node->fullpath); 930 node->fullpath);
665} 931}
666WARNING(avoid_default_addr_size, check_avoid_default_addr_size, NULL, 932WARNING(avoid_default_addr_size, check_avoid_default_addr_size, NULL,
@@ -684,7 +950,7 @@ static void check_obsolete_chosen_interrupt_controller(struct check *c,
684 950
685 prop = get_property(chosen, "interrupt-controller"); 951 prop = get_property(chosen, "interrupt-controller");
686 if (prop) 952 if (prop)
687 FAIL(c, "/chosen has obsolete \"interrupt-controller\" " 953 FAIL(c, dti, "/chosen has obsolete \"interrupt-controller\" "
688 "property"); 954 "property");
689} 955}
690WARNING(obsolete_chosen_interrupt_controller, 956WARNING(obsolete_chosen_interrupt_controller,
@@ -703,9 +969,20 @@ static struct check *check_table[] = {
703 &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell, 969 &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell,
704 &device_type_is_string, &model_is_string, &status_is_string, 970 &device_type_is_string, &model_is_string, &status_is_string,
705 971
972 &property_name_chars_strict,
973 &node_name_chars_strict,
974
706 &addr_size_cells, &reg_format, &ranges_format, 975 &addr_size_cells, &reg_format, &ranges_format,
707 976
708 &unit_address_vs_reg, 977 &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,
709 986
710 &avoid_default_addr_size, 987 &avoid_default_addr_size,
711 &obsolete_chosen_interrupt_controller, 988 &obsolete_chosen_interrupt_controller,
diff --git a/scripts/dtc/data.c b/scripts/dtc/data.c
index 8cae23746882..aa37a16c8891 100644
--- a/scripts/dtc/data.c
+++ b/scripts/dtc/data.c
@@ -171,9 +171,9 @@ struct data data_merge(struct data d1, struct data d2)
171struct data data_append_integer(struct data d, uint64_t value, int bits) 171struct data data_append_integer(struct data d, uint64_t value, int bits)
172{ 172{
173 uint8_t value_8; 173 uint8_t value_8;
174 uint16_t value_16; 174 fdt16_t value_16;
175 uint32_t value_32; 175 fdt32_t value_32;
176 uint64_t value_64; 176 fdt64_t value_64;
177 177
178 switch (bits) { 178 switch (bits) {
179 case 8: 179 case 8:
@@ -197,14 +197,14 @@ struct data data_append_integer(struct data d, uint64_t value, int bits)
197 } 197 }
198} 198}
199 199
200struct data data_append_re(struct data d, const struct fdt_reserve_entry *re) 200struct data data_append_re(struct data d, uint64_t address, uint64_t size)
201{ 201{
202 struct fdt_reserve_entry bere; 202 struct fdt_reserve_entry re;
203 203
204 bere.address = cpu_to_fdt64(re->address); 204 re.address = cpu_to_fdt64(address);
205 bere.size = cpu_to_fdt64(re->size); 205 re.size = cpu_to_fdt64(size);
206 206
207 return data_append_data(d, &bere, sizeof(bere)); 207 return data_append_data(d, &re, sizeof(re));
208} 208}
209 209
210struct data data_append_cell(struct data d, cell_t word) 210struct data data_append_cell(struct data d, cell_t word)
diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l
index c600603044f3..fd825ebba69c 100644
--- a/scripts/dtc/dtc-lexer.l
+++ b/scripts/dtc/dtc-lexer.l
@@ -62,7 +62,8 @@ static int dts_version = 1;
62 62
63static void push_input_file(const char *filename); 63static void push_input_file(const char *filename);
64static bool pop_input_file(void); 64static bool pop_input_file(void);
65static void lexical_error(const char *fmt, ...); 65static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
66
66%} 67%}
67 68
68%% 69%%
diff --git a/scripts/dtc/dtc-lexer.lex.c_shipped b/scripts/dtc/dtc-lexer.lex.c_shipped
index 2c862bc86ad0..64c243772398 100644
--- a/scripts/dtc/dtc-lexer.lex.c_shipped
+++ b/scripts/dtc/dtc-lexer.lex.c_shipped
@@ -655,8 +655,9 @@ static int dts_version = 1;
655 655
656static void push_input_file(const char *filename); 656static void push_input_file(const char *filename);
657static bool pop_input_file(void); 657static bool pop_input_file(void);
658static void lexical_error(const char *fmt, ...); 658static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
659#line 660 "dtc-lexer.lex.c" 659
660#line 661 "dtc-lexer.lex.c"
660 661
661#define INITIAL 0 662#define INITIAL 0
662#define BYTESTRING 1 663#define BYTESTRING 1
@@ -878,9 +879,9 @@ YY_DECL
878 } 879 }
879 880
880 { 881 {
881#line 68 "dtc-lexer.l" 882#line 69 "dtc-lexer.l"
882 883
883#line 884 "dtc-lexer.lex.c" 884#line 885 "dtc-lexer.lex.c"
884 885
885 while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ 886 while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
886 { 887 {
@@ -937,7 +938,7 @@ do_action: /* This label is used only to access EOF actions. */
937case 1: 938case 1:
938/* rule 1 can match eol */ 939/* rule 1 can match eol */
939YY_RULE_SETUP 940YY_RULE_SETUP
940#line 69 "dtc-lexer.l" 941#line 70 "dtc-lexer.l"
941{ 942{
942 char *name = strchr(yytext, '\"') + 1; 943 char *name = strchr(yytext, '\"') + 1;
943 yytext[yyleng-1] = '\0'; 944 yytext[yyleng-1] = '\0';
@@ -947,7 +948,7 @@ YY_RULE_SETUP
947case 2: 948case 2:
948/* rule 2 can match eol */ 949/* rule 2 can match eol */
949YY_RULE_SETUP 950YY_RULE_SETUP
950#line 75 "dtc-lexer.l" 951#line 76 "dtc-lexer.l"
951{ 952{
952 char *line, *fnstart, *fnend; 953 char *line, *fnstart, *fnend;
953 struct data fn; 954 struct data fn;
@@ -981,7 +982,7 @@ case YY_STATE_EOF(INITIAL):
981case YY_STATE_EOF(BYTESTRING): 982case YY_STATE_EOF(BYTESTRING):
982case YY_STATE_EOF(PROPNODENAME): 983case YY_STATE_EOF(PROPNODENAME):
983case YY_STATE_EOF(V1): 984case YY_STATE_EOF(V1):
984#line 104 "dtc-lexer.l" 985#line 105 "dtc-lexer.l"
985{ 986{
986 if (!pop_input_file()) { 987 if (!pop_input_file()) {
987 yyterminate(); 988 yyterminate();
@@ -991,7 +992,7 @@ case YY_STATE_EOF(V1):
991case 3: 992case 3:
992/* rule 3 can match eol */ 993/* rule 3 can match eol */
993YY_RULE_SETUP 994YY_RULE_SETUP
994#line 110 "dtc-lexer.l" 995#line 111 "dtc-lexer.l"
995{ 996{
996 DPRINT("String: %s\n", yytext); 997 DPRINT("String: %s\n", yytext);
997 yylval.data = data_copy_escape_string(yytext+1, 998 yylval.data = data_copy_escape_string(yytext+1,
@@ -1001,7 +1002,7 @@ YY_RULE_SETUP
1001 YY_BREAK 1002 YY_BREAK
1002case 4: 1003case 4:
1003YY_RULE_SETUP 1004YY_RULE_SETUP
1004#line 117 "dtc-lexer.l" 1005#line 118 "dtc-lexer.l"
1005{ 1006{
1006 DPRINT("Keyword: /dts-v1/\n"); 1007 DPRINT("Keyword: /dts-v1/\n");
1007 dts_version = 1; 1008 dts_version = 1;
@@ -1011,7 +1012,7 @@ YY_RULE_SETUP
1011 YY_BREAK 1012 YY_BREAK
1012case 5: 1013case 5:
1013YY_RULE_SETUP 1014YY_RULE_SETUP
1014#line 124 "dtc-lexer.l" 1015#line 125 "dtc-lexer.l"
1015{ 1016{
1016 DPRINT("Keyword: /plugin/\n"); 1017 DPRINT("Keyword: /plugin/\n");
1017 return DT_PLUGIN; 1018 return DT_PLUGIN;
@@ -1019,7 +1020,7 @@ YY_RULE_SETUP
1019 YY_BREAK 1020 YY_BREAK
1020case 6: 1021case 6:
1021YY_RULE_SETUP 1022YY_RULE_SETUP
1022#line 129 "dtc-lexer.l" 1023#line 130 "dtc-lexer.l"
1023{ 1024{
1024 DPRINT("Keyword: /memreserve/\n"); 1025 DPRINT("Keyword: /memreserve/\n");
1025 BEGIN_DEFAULT(); 1026 BEGIN_DEFAULT();
@@ -1028,7 +1029,7 @@ YY_RULE_SETUP
1028 YY_BREAK 1029 YY_BREAK
1029case 7: 1030case 7:
1030YY_RULE_SETUP 1031YY_RULE_SETUP
1031#line 135 "dtc-lexer.l" 1032#line 136 "dtc-lexer.l"
1032{ 1033{
1033 DPRINT("Keyword: /bits/\n"); 1034 DPRINT("Keyword: /bits/\n");
1034 BEGIN_DEFAULT(); 1035 BEGIN_DEFAULT();
@@ -1037,7 +1038,7 @@ YY_RULE_SETUP
1037 YY_BREAK 1038 YY_BREAK
1038case 8: 1039case 8:
1039YY_RULE_SETUP 1040YY_RULE_SETUP
1040#line 141 "dtc-lexer.l" 1041#line 142 "dtc-lexer.l"
1041{ 1042{
1042 DPRINT("Keyword: /delete-property/\n"); 1043 DPRINT("Keyword: /delete-property/\n");
1043 DPRINT("<PROPNODENAME>\n"); 1044 DPRINT("<PROPNODENAME>\n");
@@ -1047,7 +1048,7 @@ YY_RULE_SETUP
1047 YY_BREAK 1048 YY_BREAK
1048case 9: 1049case 9:
1049YY_RULE_SETUP 1050YY_RULE_SETUP
1050#line 148 "dtc-lexer.l" 1051#line 149 "dtc-lexer.l"
1051{ 1052{
1052 DPRINT("Keyword: /delete-node/\n"); 1053 DPRINT("Keyword: /delete-node/\n");
1053 DPRINT("<PROPNODENAME>\n"); 1054 DPRINT("<PROPNODENAME>\n");
@@ -1057,7 +1058,7 @@ YY_RULE_SETUP
1057 YY_BREAK 1058 YY_BREAK
1058case 10: 1059case 10:
1059YY_RULE_SETUP 1060YY_RULE_SETUP
1060#line 155 "dtc-lexer.l" 1061#line 156 "dtc-lexer.l"
1061{ 1062{
1062 DPRINT("Label: %s\n", yytext); 1063 DPRINT("Label: %s\n", yytext);
1063 yylval.labelref = xstrdup(yytext); 1064 yylval.labelref = xstrdup(yytext);
@@ -1067,7 +1068,7 @@ YY_RULE_SETUP
1067 YY_BREAK 1068 YY_BREAK
1068case 11: 1069case 11:
1069YY_RULE_SETUP 1070YY_RULE_SETUP
1070#line 162 "dtc-lexer.l" 1071#line 163 "dtc-lexer.l"
1071{ 1072{
1072 char *e; 1073 char *e;
1073 DPRINT("Integer Literal: '%s'\n", yytext); 1074 DPRINT("Integer Literal: '%s'\n", yytext);
@@ -1093,7 +1094,7 @@ YY_RULE_SETUP
1093case 12: 1094case 12:
1094/* rule 12 can match eol */ 1095/* rule 12 can match eol */
1095YY_RULE_SETUP 1096YY_RULE_SETUP
1096#line 184 "dtc-lexer.l" 1097#line 185 "dtc-lexer.l"
1097{ 1098{
1098 struct data d; 1099 struct data d;
1099 DPRINT("Character literal: %s\n", yytext); 1100 DPRINT("Character literal: %s\n", yytext);
@@ -1117,7 +1118,7 @@ YY_RULE_SETUP
1117 YY_BREAK 1118 YY_BREAK
1118case 13: 1119case 13:
1119YY_RULE_SETUP 1120YY_RULE_SETUP
1120#line 205 "dtc-lexer.l" 1121#line 206 "dtc-lexer.l"
1121{ /* label reference */ 1122{ /* label reference */
1122 DPRINT("Ref: %s\n", yytext+1); 1123 DPRINT("Ref: %s\n", yytext+1);
1123 yylval.labelref = xstrdup(yytext+1); 1124 yylval.labelref = xstrdup(yytext+1);
@@ -1126,7 +1127,7 @@ YY_RULE_SETUP
1126 YY_BREAK 1127 YY_BREAK
1127case 14: 1128case 14:
1128YY_RULE_SETUP 1129YY_RULE_SETUP
1129#line 211 "dtc-lexer.l" 1130#line 212 "dtc-lexer.l"
1130{ /* new-style path reference */ 1131{ /* new-style path reference */
1131 yytext[yyleng-1] = '\0'; 1132 yytext[yyleng-1] = '\0';
1132 DPRINT("Ref: %s\n", yytext+2); 1133 DPRINT("Ref: %s\n", yytext+2);
@@ -1136,7 +1137,7 @@ YY_RULE_SETUP
1136 YY_BREAK 1137 YY_BREAK
1137case 15: 1138case 15:
1138YY_RULE_SETUP 1139YY_RULE_SETUP
1139#line 218 "dtc-lexer.l" 1140#line 219 "dtc-lexer.l"
1140{ 1141{
1141 yylval.byte = strtol(yytext, NULL, 16); 1142 yylval.byte = strtol(yytext, NULL, 16);
1142 DPRINT("Byte: %02x\n", (int)yylval.byte); 1143 DPRINT("Byte: %02x\n", (int)yylval.byte);
@@ -1145,7 +1146,7 @@ YY_RULE_SETUP
1145 YY_BREAK 1146 YY_BREAK
1146case 16: 1147case 16:
1147YY_RULE_SETUP 1148YY_RULE_SETUP
1148#line 224 "dtc-lexer.l" 1149#line 225 "dtc-lexer.l"
1149{ 1150{
1150 DPRINT("/BYTESTRING\n"); 1151 DPRINT("/BYTESTRING\n");
1151 BEGIN_DEFAULT(); 1152 BEGIN_DEFAULT();
@@ -1154,7 +1155,7 @@ YY_RULE_SETUP
1154 YY_BREAK 1155 YY_BREAK
1155case 17: 1156case 17:
1156YY_RULE_SETUP 1157YY_RULE_SETUP
1157#line 230 "dtc-lexer.l" 1158#line 231 "dtc-lexer.l"
1158{ 1159{
1159 DPRINT("PropNodeName: %s\n", yytext); 1160 DPRINT("PropNodeName: %s\n", yytext);
1160 yylval.propnodename = xstrdup((yytext[0] == '\\') ? 1161 yylval.propnodename = xstrdup((yytext[0] == '\\') ?
@@ -1165,7 +1166,7 @@ YY_RULE_SETUP
1165 YY_BREAK 1166 YY_BREAK
1166case 18: 1167case 18:
1167YY_RULE_SETUP 1168YY_RULE_SETUP
1168#line 238 "dtc-lexer.l" 1169#line 239 "dtc-lexer.l"
1169{ 1170{
1170 DPRINT("Binary Include\n"); 1171 DPRINT("Binary Include\n");
1171 return DT_INCBIN; 1172 return DT_INCBIN;
@@ -1174,64 +1175,64 @@ YY_RULE_SETUP
1174case 19: 1175case 19:
1175/* rule 19 can match eol */ 1176/* rule 19 can match eol */
1176YY_RULE_SETUP 1177YY_RULE_SETUP
1177#line 243 "dtc-lexer.l" 1178#line 244 "dtc-lexer.l"
1178/* eat whitespace */ 1179/* eat whitespace */
1179 YY_BREAK 1180 YY_BREAK
1180case 20: 1181case 20:
1181/* rule 20 can match eol */ 1182/* rule 20 can match eol */
1182YY_RULE_SETUP 1183YY_RULE_SETUP
1183#line 244 "dtc-lexer.l" 1184#line 245 "dtc-lexer.l"
1184/* eat C-style comments */ 1185/* eat C-style comments */
1185 YY_BREAK 1186 YY_BREAK
1186case 21: 1187case 21:
1187/* rule 21 can match eol */ 1188/* rule 21 can match eol */
1188YY_RULE_SETUP 1189YY_RULE_SETUP
1189#line 245 "dtc-lexer.l" 1190#line 246 "dtc-lexer.l"
1190/* eat C++-style comments */ 1191/* eat C++-style comments */
1191 YY_BREAK 1192 YY_BREAK
1192case 22: 1193case 22:
1193YY_RULE_SETUP 1194YY_RULE_SETUP
1194#line 247 "dtc-lexer.l" 1195#line 248 "dtc-lexer.l"
1195{ return DT_LSHIFT; }; 1196{ return DT_LSHIFT; };
1196 YY_BREAK 1197 YY_BREAK
1197case 23: 1198case 23:
1198YY_RULE_SETUP 1199YY_RULE_SETUP
1199#line 248 "dtc-lexer.l" 1200#line 249 "dtc-lexer.l"
1200{ return DT_RSHIFT; }; 1201{ return DT_RSHIFT; };
1201 YY_BREAK 1202 YY_BREAK
1202case 24: 1203case 24:
1203YY_RULE_SETUP 1204YY_RULE_SETUP
1204#line 249 "dtc-lexer.l" 1205#line 250 "dtc-lexer.l"
1205{ return DT_LE; }; 1206{ return DT_LE; };
1206 YY_BREAK 1207 YY_BREAK
1207case 25: 1208case 25:
1208YY_RULE_SETUP 1209YY_RULE_SETUP
1209#line 250 "dtc-lexer.l" 1210#line 251 "dtc-lexer.l"
1210{ return DT_GE; }; 1211{ return DT_GE; };
1211 YY_BREAK 1212 YY_BREAK
1212case 26: 1213case 26:
1213YY_RULE_SETUP 1214YY_RULE_SETUP
1214#line 251 "dtc-lexer.l" 1215#line 252 "dtc-lexer.l"
1215{ return DT_EQ; }; 1216{ return DT_EQ; };
1216 YY_BREAK 1217 YY_BREAK
1217case 27: 1218case 27:
1218YY_RULE_SETUP 1219YY_RULE_SETUP
1219#line 252 "dtc-lexer.l" 1220#line 253 "dtc-lexer.l"
1220{ return DT_NE; }; 1221{ return DT_NE; };
1221 YY_BREAK 1222 YY_BREAK
1222case 28: 1223case 28:
1223YY_RULE_SETUP 1224YY_RULE_SETUP
1224#line 253 "dtc-lexer.l" 1225#line 254 "dtc-lexer.l"
1225{ return DT_AND; }; 1226{ return DT_AND; };
1226 YY_BREAK 1227 YY_BREAK
1227case 29: 1228case 29:
1228YY_RULE_SETUP 1229YY_RULE_SETUP
1229#line 254 "dtc-lexer.l" 1230#line 255 "dtc-lexer.l"
1230{ return DT_OR; }; 1231{ return DT_OR; };
1231 YY_BREAK 1232 YY_BREAK
1232case 30: 1233case 30:
1233YY_RULE_SETUP 1234YY_RULE_SETUP
1234#line 256 "dtc-lexer.l" 1235#line 257 "dtc-lexer.l"
1235{ 1236{
1236 DPRINT("Char: %c (\\x%02x)\n", yytext[0], 1237 DPRINT("Char: %c (\\x%02x)\n", yytext[0],
1237 (unsigned)yytext[0]); 1238 (unsigned)yytext[0]);
@@ -1249,10 +1250,10 @@ YY_RULE_SETUP
1249 YY_BREAK 1250 YY_BREAK
1250case 31: 1251case 31:
1251YY_RULE_SETUP 1252YY_RULE_SETUP
1252#line 271 "dtc-lexer.l" 1253#line 272 "dtc-lexer.l"
1253ECHO; 1254ECHO;
1254 YY_BREAK 1255 YY_BREAK
1255#line 1256 "dtc-lexer.lex.c" 1256#line 1257 "dtc-lexer.lex.c"
1256 1257
1257 case YY_END_OF_BUFFER: 1258 case YY_END_OF_BUFFER:
1258 { 1259 {
@@ -2218,7 +2219,7 @@ void yyfree (void * ptr )
2218 2219
2219#define YYTABLES_NAME "yytables" 2220#define YYTABLES_NAME "yytables"
2220 2221
2221#line 271 "dtc-lexer.l" 2222#line 272 "dtc-lexer.l"
2222 2223
2223 2224
2224 2225
diff --git a/scripts/dtc/dtc-parser.tab.c_shipped b/scripts/dtc/dtc-parser.tab.c_shipped
index 2965227a1b4a..0a7a5ed86f04 100644
--- a/scripts/dtc/dtc-parser.tab.c_shipped
+++ b/scripts/dtc/dtc-parser.tab.c_shipped
@@ -1557,10 +1557,10 @@ yyreduce:
1557 { 1557 {
1558 struct node *target = get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].labelref)); 1558 struct node *target = get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].labelref));
1559 1559
1560 add_label(&target->labels, (yyvsp[-2].labelref)); 1560 if (target) {
1561 if (target) 1561 add_label(&target->labels, (yyvsp[-2].labelref));
1562 merge_nodes(target, (yyvsp[0].node)); 1562 merge_nodes(target, (yyvsp[0].node));
1563 else 1563 } else
1564 ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref)); 1564 ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref));
1565 (yyval.node) = (yyvsp[-3].node); 1565 (yyval.node) = (yyvsp[-3].node);
1566 } 1566 }
diff --git a/scripts/dtc/dtc-parser.y b/scripts/dtc/dtc-parser.y
index b2fd4d155839..ca3f5003427c 100644
--- a/scripts/dtc/dtc-parser.y
+++ b/scripts/dtc/dtc-parser.y
@@ -171,10 +171,10 @@ devicetree:
171 { 171 {
172 struct node *target = get_node_by_ref($1, $3); 172 struct node *target = get_node_by_ref($1, $3);
173 173
174 add_label(&target->labels, $2); 174 if (target) {
175 if (target) 175 add_label(&target->labels, $2);
176 merge_nodes(target, $4); 176 merge_nodes(target, $4);
177 else 177 } else
178 ERROR(&@3, "Label or path %s not found", $3); 178 ERROR(&@3, "Label or path %s not found", $3);
179 $$ = $1; 179 $$ = $1;
180 } 180 }
diff --git a/scripts/dtc/dtc.c b/scripts/dtc/dtc.c
index a4edf4c7aebf..f5eed9d72c02 100644
--- a/scripts/dtc/dtc.c
+++ b/scripts/dtc/dtc.c
@@ -138,7 +138,7 @@ static const char *guess_type_by_name(const char *fname, const char *fallback)
138static const char *guess_input_format(const char *fname, const char *fallback) 138static const char *guess_input_format(const char *fname, const char *fallback)
139{ 139{
140 struct stat statbuf; 140 struct stat statbuf;
141 uint32_t magic; 141 fdt32_t magic;
142 FILE *f; 142 FILE *f;
143 143
144 if (stat(fname, &statbuf) != 0) 144 if (stat(fname, &statbuf) != 0)
@@ -159,8 +159,7 @@ static const char *guess_input_format(const char *fname, const char *fallback)
159 } 159 }
160 fclose(f); 160 fclose(f);
161 161
162 magic = fdt32_to_cpu(magic); 162 if (fdt32_to_cpu(magic) == FDT_MAGIC)
163 if (magic == FDT_MAGIC)
164 return "dtb"; 163 return "dtb";
165 164
166 return guess_type_by_name(fname, fallback); 165 return guess_type_by_name(fname, fallback);
@@ -216,7 +215,7 @@ int main(int argc, char *argv[])
216 alignsize = strtol(optarg, NULL, 0); 215 alignsize = strtol(optarg, NULL, 0);
217 if (!is_power_of_2(alignsize)) 216 if (!is_power_of_2(alignsize))
218 die("Invalid argument \"%d\" to -a option\n", 217 die("Invalid argument \"%d\" to -a option\n",
219 optarg); 218 alignsize);
220 break; 219 break;
221 case 'f': 220 case 'f':
222 force = true; 221 force = true;
@@ -309,6 +308,8 @@ int main(int argc, char *argv[])
309 else 308 else
310 die("Unknown input format \"%s\"\n", inform); 309 die("Unknown input format \"%s\"\n", inform);
311 310
311 dti->outname = outname;
312
312 if (depfile) { 313 if (depfile) {
313 fputc('\n', depfile); 314 fputc('\n', depfile);
314 fclose(depfile); 315 fclose(depfile);
diff --git a/scripts/dtc/dtc.h b/scripts/dtc/dtc.h
index c6f125c68ba8..fc24e17510fd 100644
--- a/scripts/dtc/dtc.h
+++ b/scripts/dtc/dtc.h
@@ -43,7 +43,6 @@
43#define debug(...) 43#define debug(...)
44#endif 44#endif
45 45
46
47#define DEFAULT_FDT_VERSION 17 46#define DEFAULT_FDT_VERSION 17
48 47
49/* 48/*
@@ -114,7 +113,7 @@ struct data data_insert_at_marker(struct data d, struct marker *m,
114struct data data_merge(struct data d1, struct data d2); 113struct data data_merge(struct data d1, struct data d2);
115struct data data_append_cell(struct data d, cell_t word); 114struct data data_append_cell(struct data d, cell_t word);
116struct data data_append_integer(struct data d, uint64_t word, int bits); 115struct data data_append_integer(struct data d, uint64_t word, int bits);
117struct data data_append_re(struct data d, const struct fdt_reserve_entry *re); 116struct data data_append_re(struct data d, uint64_t address, uint64_t size);
118struct data data_append_addr(struct data d, uint64_t addr); 117struct data data_append_addr(struct data d, uint64_t addr);
119struct data data_append_byte(struct data d, uint8_t byte); 118struct data data_append_byte(struct data d, uint8_t byte);
120struct data data_append_zeroes(struct data d, int len); 119struct data data_append_zeroes(struct data d, int len);
@@ -136,6 +135,10 @@ struct label {
136 struct label *next; 135 struct label *next;
137}; 136};
138 137
138struct bus_type {
139 const char *name;
140};
141
139struct property { 142struct property {
140 bool deleted; 143 bool deleted;
141 char *name; 144 char *name;
@@ -162,6 +165,7 @@ struct node {
162 int addr_cells, size_cells; 165 int addr_cells, size_cells;
163 166
164 struct label *labels; 167 struct label *labels;
168 const struct bus_type *bus;
165}; 169};
166 170
167#define for_each_label_withdel(l0, l) \ 171#define for_each_label_withdel(l0, l) \
@@ -227,7 +231,7 @@ uint32_t guess_boot_cpuid(struct node *tree);
227/* Boot info (tree plus memreserve information */ 231/* Boot info (tree plus memreserve information */
228 232
229struct reserve_info { 233struct reserve_info {
230 struct fdt_reserve_entry re; 234 uint64_t address, size;
231 235
232 struct reserve_info *next; 236 struct reserve_info *next;
233 237
@@ -246,6 +250,7 @@ struct dt_info {
246 struct reserve_info *reservelist; 250 struct reserve_info *reservelist;
247 uint32_t boot_cpuid_phys; 251 uint32_t boot_cpuid_phys;
248 struct node *dt; /* the device tree */ 252 struct node *dt; /* the device tree */
253 const char *outname; /* filename being written to, "-" for stdout */
249}; 254};
250 255
251/* DTS version flags definitions */ 256/* DTS version flags definitions */
diff --git a/scripts/dtc/flattree.c b/scripts/dtc/flattree.c
index ebac548b3fa8..fcf71541d8a7 100644
--- a/scripts/dtc/flattree.c
+++ b/scripts/dtc/flattree.c
@@ -49,7 +49,7 @@ static struct version_info {
49 49
50struct emitter { 50struct emitter {
51 void (*cell)(void *, cell_t); 51 void (*cell)(void *, cell_t);
52 void (*string)(void *, char *, int); 52 void (*string)(void *, const char *, int);
53 void (*align)(void *, int); 53 void (*align)(void *, int);
54 void (*data)(void *, struct data); 54 void (*data)(void *, struct data);
55 void (*beginnode)(void *, struct label *labels); 55 void (*beginnode)(void *, struct label *labels);
@@ -64,7 +64,7 @@ static void bin_emit_cell(void *e, cell_t val)
64 *dtbuf = data_append_cell(*dtbuf, val); 64 *dtbuf = data_append_cell(*dtbuf, val);
65} 65}
66 66
67static void bin_emit_string(void *e, char *str, int len) 67static void bin_emit_string(void *e, const char *str, int len)
68{ 68{
69 struct data *dtbuf = e; 69 struct data *dtbuf = e;
70 70
@@ -144,22 +144,14 @@ static void asm_emit_cell(void *e, cell_t val)
144 (val >> 8) & 0xff, val & 0xff); 144 (val >> 8) & 0xff, val & 0xff);
145} 145}
146 146
147static void asm_emit_string(void *e, char *str, int len) 147static void asm_emit_string(void *e, const char *str, int len)
148{ 148{
149 FILE *f = e; 149 FILE *f = e;
150 char c = 0;
151 150
152 if (len != 0) { 151 if (len != 0)
153 /* XXX: ewww */ 152 fprintf(f, "\t.string\t\"%.*s\"\n", len, str);
154 c = str[len]; 153 else
155 str[len] = '\0'; 154 fprintf(f, "\t.string\t\"%s\"\n", str);
156 }
157
158 fprintf(f, "\t.string\t\"%s\"\n", str);
159
160 if (len != 0) {
161 str[len] = c;
162 }
163} 155}
164 156
165static void asm_emit_align(void *e, int a) 157static void asm_emit_align(void *e, int a)
@@ -179,7 +171,7 @@ static void asm_emit_data(void *e, struct data d)
179 emit_offset_label(f, m->ref, m->offset); 171 emit_offset_label(f, m->ref, m->offset);
180 172
181 while ((d.len - off) >= sizeof(uint32_t)) { 173 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))));
183 off += sizeof(uint32_t); 175 off += sizeof(uint32_t);
184 } 176 }
185 177
@@ -318,17 +310,16 @@ static struct data flatten_reserve_list(struct reserve_info *reservelist,
318{ 310{
319 struct reserve_info *re; 311 struct reserve_info *re;
320 struct data d = empty_data; 312 struct data d = empty_data;
321 static struct fdt_reserve_entry null_re = {0,0};
322 int j; 313 int j;
323 314
324 for (re = reservelist; re; re = re->next) { 315 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);
326 } 317 }
327 /* 318 /*
328 * Add additional reserved slots if the user asked for them. 319 * Add additional reserved slots if the user asked for them.
329 */ 320 */
330 for (j = 0; j < reservenum; j++) { 321 for (j = 0; j < reservenum; j++) {
331 d = data_append_re(d, &null_re); 322 d = data_append_re(d, 0, 0);
332 } 323 }
333 324
334 return d; 325 return d;
@@ -544,11 +535,11 @@ void dt_to_asm(FILE *f, struct dt_info *dti, int version)
544 fprintf(f, "\t.globl\t%s\n", l->label); 535 fprintf(f, "\t.globl\t%s\n", l->label);
545 fprintf(f, "%s:\n", l->label); 536 fprintf(f, "%s:\n", l->label);
546 } 537 }
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));
548 ASM_EMIT_BELONG(f, "0x%08x", 539 ASM_EMIT_BELONG(f, "0x%08x",
549 (unsigned int)(re->re.address & 0xffffffff)); 540 (unsigned int)(re->address & 0xffffffff));
550 ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size >> 32)); 541 ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size >> 32));
551 ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size & 0xffffffff)); 542 ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size & 0xffffffff));
552 } 543 }
553 for (i = 0; i < reservenum; i++) { 544 for (i = 0; i < reservenum; i++) {
554 fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n"); 545 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)
609 600
610static uint32_t flat_read_word(struct inbuf *inb) 601static uint32_t flat_read_word(struct inbuf *inb)
611{ 602{
612 uint32_t val; 603 fdt32_t val;
613 604
614 assert(((inb->ptr - inb->base) % sizeof(val)) == 0); 605 assert(((inb->ptr - inb->base) % sizeof(val)) == 0);
615 606
@@ -718,13 +709,15 @@ static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb)
718 * First pass, count entries. 709 * First pass, count entries.
719 */ 710 */
720 while (1) { 711 while (1) {
712 uint64_t address, size;
713
721 flat_read_chunk(inb, &re, sizeof(re)); 714 flat_read_chunk(inb, &re, sizeof(re));
722 re.address = fdt64_to_cpu(re.address); 715 address = fdt64_to_cpu(re.address);
723 re.size = fdt64_to_cpu(re.size); 716 size = fdt64_to_cpu(re.size);
724 if (re.size == 0) 717 if (size == 0)
725 break; 718 break;
726 719
727 new = build_reserve_entry(re.address, re.size); 720 new = build_reserve_entry(address, size);
728 reservelist = add_reserve_entry(reservelist, new); 721 reservelist = add_reserve_entry(reservelist, new);
729 } 722 }
730 723
@@ -817,6 +810,7 @@ static struct node *unflatten_tree(struct inbuf *dtbuf,
817struct dt_info *dt_from_blob(const char *fname) 810struct dt_info *dt_from_blob(const char *fname)
818{ 811{
819 FILE *f; 812 FILE *f;
813 fdt32_t magic_buf, totalsize_buf;
820 uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys; 814 uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys;
821 uint32_t off_dt, off_str, off_mem_rsvmap; 815 uint32_t off_dt, off_str, off_mem_rsvmap;
822 int rc; 816 int rc;
@@ -833,7 +827,7 @@ struct dt_info *dt_from_blob(const char *fname)
833 827
834 f = srcfile_relative_open(fname, NULL); 828 f = srcfile_relative_open(fname, NULL);
835 829
836 rc = fread(&magic, sizeof(magic), 1, f); 830 rc = fread(&magic_buf, sizeof(magic_buf), 1, f);
837 if (ferror(f)) 831 if (ferror(f))
838 die("Error reading DT blob magic number: %s\n", 832 die("Error reading DT blob magic number: %s\n",
839 strerror(errno)); 833 strerror(errno));
@@ -844,11 +838,11 @@ struct dt_info *dt_from_blob(const char *fname)
844 die("Mysterious short read reading magic number\n"); 838 die("Mysterious short read reading magic number\n");
845 } 839 }
846 840
847 magic = fdt32_to_cpu(magic); 841 magic = fdt32_to_cpu(magic_buf);
848 if (magic != FDT_MAGIC) 842 if (magic != FDT_MAGIC)
849 die("Blob has incorrect magic number\n"); 843 die("Blob has incorrect magic number\n");
850 844
851 rc = fread(&totalsize, sizeof(totalsize), 1, f); 845 rc = fread(&totalsize_buf, sizeof(totalsize_buf), 1, f);
852 if (ferror(f)) 846 if (ferror(f))
853 die("Error reading DT blob size: %s\n", strerror(errno)); 847 die("Error reading DT blob size: %s\n", strerror(errno));
854 if (rc < 1) { 848 if (rc < 1) {
@@ -858,7 +852,7 @@ struct dt_info *dt_from_blob(const char *fname)
858 die("Mysterious short read reading blob size\n"); 852 die("Mysterious short read reading blob size\n");
859 } 853 }
860 854
861 totalsize = fdt32_to_cpu(totalsize); 855 totalsize = fdt32_to_cpu(totalsize_buf);
862 if (totalsize < FDT_V1_SIZE) 856 if (totalsize < FDT_V1_SIZE)
863 die("DT blob size (%d) is too small\n", totalsize); 857 die("DT blob size (%d) is too small\n", totalsize);
864 858
diff --git a/scripts/dtc/libfdt/fdt_rw.c b/scripts/dtc/libfdt/fdt_rw.c
index 2eed4f58387c..3fd5847377c9 100644
--- a/scripts/dtc/libfdt/fdt_rw.c
+++ b/scripts/dtc/libfdt/fdt_rw.c
@@ -283,7 +283,8 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name,
283 if (err) 283 if (err)
284 return err; 284 return err;
285 285
286 memcpy(prop->data, val, len); 286 if (len)
287 memcpy(prop->data, val, len);
287 return 0; 288 return 0;
288} 289}
289 290
diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h
index b842b156fa17..ba86caa73d01 100644
--- a/scripts/dtc/libfdt/libfdt.h
+++ b/scripts/dtc/libfdt/libfdt.h
@@ -143,7 +143,9 @@
143/* Low-level functions (you probably don't need these) */ 143/* Low-level functions (you probably don't need these) */
144/**********************************************************************/ 144/**********************************************************************/
145 145
146#ifndef SWIG /* This function is not useful in Python */
146const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen); 147const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen);
148#endif
147static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen) 149static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
148{ 150{
149 return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen); 151 return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen);
@@ -210,7 +212,6 @@ int fdt_next_subnode(const void *fdt, int offset);
210/**********************************************************************/ 212/**********************************************************************/
211/* General functions */ 213/* General functions */
212/**********************************************************************/ 214/**********************************************************************/
213
214#define fdt_get_header(fdt, field) \ 215#define fdt_get_header(fdt, field) \
215 (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field)) 216 (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field))
216#define fdt_magic(fdt) (fdt_get_header(fdt, magic)) 217#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);
354 * useful for finding subnodes based on a portion of a larger string, 355 * useful for finding subnodes based on a portion of a larger string,
355 * such as a full path. 356 * such as a full path.
356 */ 357 */
358#ifndef SWIG /* Not available in Python */
357int fdt_subnode_offset_namelen(const void *fdt, int parentoffset, 359int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
358 const char *name, int namelen); 360 const char *name, int namelen);
361#endif
359/** 362/**
360 * fdt_subnode_offset - find a subnode of a given node 363 * fdt_subnode_offset - find a subnode of a given node
361 * @fdt: pointer to the device tree blob 364 * @fdt: pointer to the device tree blob
@@ -391,7 +394,9 @@ int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
391 * Identical to fdt_path_offset(), but only consider the first namelen 394 * Identical to fdt_path_offset(), but only consider the first namelen
392 * characters of path as the path name. 395 * characters of path as the path name.
393 */ 396 */
397#ifndef SWIG /* Not available in Python */
394int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen); 398int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen);
399#endif
395 400
396/** 401/**
397 * fdt_path_offset - find a tree node by its full path 402 * 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,
550 * Identical to fdt_get_property(), but only examine the first namelen 555 * Identical to fdt_get_property(), but only examine the first namelen
551 * characters of name for matching the property name. 556 * characters of name for matching the property name.
552 */ 557 */
558#ifndef SWIG /* Not available in Python */
553const struct fdt_property *fdt_get_property_namelen(const void *fdt, 559const struct fdt_property *fdt_get_property_namelen(const void *fdt,
554 int nodeoffset, 560 int nodeoffset,
555 const char *name, 561 const char *name,
556 int namelen, int *lenp); 562 int namelen, int *lenp);
563#endif
557 564
558/** 565/**
559 * fdt_get_property - find a given property in a given node 566 * 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,
624 * -FDT_ERR_BADSTRUCTURE, 631 * -FDT_ERR_BADSTRUCTURE,
625 * -FDT_ERR_TRUNCATED, standard meanings 632 * -FDT_ERR_TRUNCATED, standard meanings
626 */ 633 */
634#ifndef SWIG /* This function is not useful in Python */
627const void *fdt_getprop_by_offset(const void *fdt, int offset, 635const void *fdt_getprop_by_offset(const void *fdt, int offset,
628 const char **namep, int *lenp); 636 const char **namep, int *lenp);
637#endif
629 638
630/** 639/**
631 * fdt_getprop_namelen - get property value based on substring 640 * fdt_getprop_namelen - get property value based on substring
@@ -638,6 +647,7 @@ const void *fdt_getprop_by_offset(const void *fdt, int offset,
638 * Identical to fdt_getprop(), but only examine the first namelen 647 * Identical to fdt_getprop(), but only examine the first namelen
639 * characters of name for matching the property name. 648 * characters of name for matching the property name.
640 */ 649 */
650#ifndef SWIG /* Not available in Python */
641const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, 651const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
642 const char *name, int namelen, int *lenp); 652 const char *name, int namelen, int *lenp);
643static inline void *fdt_getprop_namelen_w(void *fdt, int nodeoffset, 653static 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,
647 return (void *)(uintptr_t)fdt_getprop_namelen(fdt, nodeoffset, name, 657 return (void *)(uintptr_t)fdt_getprop_namelen(fdt, nodeoffset, name,
648 namelen, lenp); 658 namelen, lenp);
649} 659}
660#endif
650 661
651/** 662/**
652 * fdt_getprop - retrieve the value of a given property 663 * fdt_getprop - retrieve the value of a given property
@@ -707,8 +718,10 @@ uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
707 * Identical to fdt_get_alias(), but only examine the first namelen 718 * Identical to fdt_get_alias(), but only examine the first namelen
708 * characters of name for matching the alias name. 719 * characters of name for matching the alias name.
709 */ 720 */
721#ifndef SWIG /* Not available in Python */
710const char *fdt_get_alias_namelen(const void *fdt, 722const char *fdt_get_alias_namelen(const void *fdt,
711 const char *name, int namelen); 723 const char *name, int namelen);
724#endif
712 725
713/** 726/**
714 * fdt_get_alias - retrieve the path referenced by a given alias 727 * fdt_get_alias - retrieve the path referenced by a given alias
@@ -1106,10 +1119,12 @@ int fdt_size_cells(const void *fdt, int nodeoffset);
1106 * of the name. It is useful when you want to manipulate only one value of 1119 * of the name. It is useful when you want to manipulate only one value of
1107 * an array and you have a string that doesn't end with \0. 1120 * an array and you have a string that doesn't end with \0.
1108 */ 1121 */
1122#ifndef SWIG /* Not available in Python */
1109int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset, 1123int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
1110 const char *name, int namelen, 1124 const char *name, int namelen,
1111 uint32_t idx, const void *val, 1125 uint32_t idx, const void *val,
1112 int len); 1126 int len);
1127#endif
1113 1128
1114/** 1129/**
1115 * fdt_setprop_inplace - change a property's value, but not its size 1130 * 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,
1139 * -FDT_ERR_BADSTRUCTURE, 1154 * -FDT_ERR_BADSTRUCTURE,
1140 * -FDT_ERR_TRUNCATED, standard meanings 1155 * -FDT_ERR_TRUNCATED, standard meanings
1141 */ 1156 */
1157#ifndef SWIG /* Not available in Python */
1142int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, 1158int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
1143 const void *val, int len); 1159 const void *val, int len);
1160#endif
1144 1161
1145/** 1162/**
1146 * fdt_setprop_inplace_u32 - change the value of a 32-bit integer property 1163 * 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,
1527#define fdt_setprop_string(fdt, nodeoffset, name, str) \ 1544#define fdt_setprop_string(fdt, nodeoffset, name, str) \
1528 fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1) 1545 fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
1529 1546
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
1530/** 1577/**
1531 * fdt_appendprop - append to or create a property 1578 * fdt_appendprop - append to or create a property
1532 * @fdt: pointer to the device tree blob 1579 * @fdt: pointer to the device tree blob
@@ -1704,8 +1751,10 @@ int fdt_delprop(void *fdt, int nodeoffset, const char *name);
1704 * creating subnodes based on a portion of a larger string, such as a 1751 * creating subnodes based on a portion of a larger string, such as a
1705 * full path. 1752 * full path.
1706 */ 1753 */
1754#ifndef SWIG /* Not available in Python */
1707int fdt_add_subnode_namelen(void *fdt, int parentoffset, 1755int fdt_add_subnode_namelen(void *fdt, int parentoffset,
1708 const char *name, int namelen); 1756 const char *name, int namelen);
1757#endif
1709 1758
1710/** 1759/**
1711 * fdt_add_subnode - creates a new node 1760 * fdt_add_subnode - creates a new node
diff --git a/scripts/dtc/libfdt/libfdt_env.h b/scripts/dtc/libfdt/libfdt_env.h
index 99f936dacc60..952056cddf09 100644
--- a/scripts/dtc/libfdt/libfdt_env.h
+++ b/scripts/dtc/libfdt/libfdt_env.h
@@ -58,16 +58,16 @@
58#include <string.h> 58#include <string.h>
59 59
60#ifdef __CHECKER__ 60#ifdef __CHECKER__
61#define __force __attribute__((force)) 61#define FDT_FORCE __attribute__((force))
62#define __bitwise __attribute__((bitwise)) 62#define FDT_BITWISE __attribute__((bitwise))
63#else 63#else
64#define __force 64#define FDT_FORCE
65#define __bitwise 65#define FDT_BITWISE
66#endif 66#endif
67 67
68typedef uint16_t __bitwise fdt16_t; 68typedef uint16_t FDT_BITWISE fdt16_t;
69typedef uint32_t __bitwise fdt32_t; 69typedef uint32_t FDT_BITWISE fdt32_t;
70typedef uint64_t __bitwise fdt64_t; 70typedef uint64_t FDT_BITWISE fdt64_t;
71 71
72#define EXTRACT_BYTE(x, n) ((unsigned long long)((uint8_t *)&x)[n]) 72#define EXTRACT_BYTE(x, n) ((unsigned long long)((uint8_t *)&x)[n])
73#define CPU_TO_FDT16(x) ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1)) 73#define CPU_TO_FDT16(x) ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
@@ -80,29 +80,29 @@ typedef uint64_t __bitwise fdt64_t;
80 80
81static inline uint16_t fdt16_to_cpu(fdt16_t x) 81static inline uint16_t fdt16_to_cpu(fdt16_t x)
82{ 82{
83 return (__force uint16_t)CPU_TO_FDT16(x); 83 return (FDT_FORCE uint16_t)CPU_TO_FDT16(x);
84} 84}
85static inline fdt16_t cpu_to_fdt16(uint16_t x) 85static inline fdt16_t cpu_to_fdt16(uint16_t x)
86{ 86{
87 return (__force fdt16_t)CPU_TO_FDT16(x); 87 return (FDT_FORCE fdt16_t)CPU_TO_FDT16(x);
88} 88}
89 89
90static inline uint32_t fdt32_to_cpu(fdt32_t x) 90static inline uint32_t fdt32_to_cpu(fdt32_t x)
91{ 91{
92 return (__force uint32_t)CPU_TO_FDT32(x); 92 return (FDT_FORCE uint32_t)CPU_TO_FDT32(x);
93} 93}
94static inline fdt32_t cpu_to_fdt32(uint32_t x) 94static inline fdt32_t cpu_to_fdt32(uint32_t x)
95{ 95{
96 return (__force fdt32_t)CPU_TO_FDT32(x); 96 return (FDT_FORCE fdt32_t)CPU_TO_FDT32(x);
97} 97}
98 98
99static inline uint64_t fdt64_to_cpu(fdt64_t x) 99static inline uint64_t fdt64_to_cpu(fdt64_t x)
100{ 100{
101 return (__force uint64_t)CPU_TO_FDT64(x); 101 return (FDT_FORCE uint64_t)CPU_TO_FDT64(x);
102} 102}
103static inline fdt64_t cpu_to_fdt64(uint64_t x) 103static inline fdt64_t cpu_to_fdt64(uint64_t x)
104{ 104{
105 return (__force fdt64_t)CPU_TO_FDT64(x); 105 return (FDT_FORCE fdt64_t)CPU_TO_FDT64(x);
106} 106}
107#undef CPU_TO_FDT64 107#undef CPU_TO_FDT64
108#undef CPU_TO_FDT32 108#undef CPU_TO_FDT32
diff --git a/scripts/dtc/livetree.c b/scripts/dtc/livetree.c
index afa2f67b142a..3673de07e4e5 100644
--- a/scripts/dtc/livetree.c
+++ b/scripts/dtc/livetree.c
@@ -242,7 +242,7 @@ void delete_property_by_name(struct node *node, char *name)
242 struct property *prop = node->proplist; 242 struct property *prop = node->proplist;
243 243
244 while (prop) { 244 while (prop) {
245 if (!strcmp(prop->name, name)) { 245 if (streq(prop->name, name)) {
246 delete_property(prop); 246 delete_property(prop);
247 return; 247 return;
248 } 248 }
@@ -275,7 +275,7 @@ void delete_node_by_name(struct node *parent, char *name)
275 struct node *node = parent->children; 275 struct node *node = parent->children;
276 276
277 while (node) { 277 while (node) {
278 if (!strcmp(node->name, name)) { 278 if (streq(node->name, name)) {
279 delete_node(node); 279 delete_node(node);
280 return; 280 return;
281 } 281 }
@@ -319,8 +319,8 @@ struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size)
319 319
320 memset(new, 0, sizeof(*new)); 320 memset(new, 0, sizeof(*new));
321 321
322 new->re.address = address; 322 new->address = address;
323 new->re.size = size; 323 new->size = size;
324 324
325 return new; 325 return new;
326} 326}
@@ -393,7 +393,7 @@ struct property *get_property(struct node *node, const char *propname)
393cell_t propval_cell(struct property *prop) 393cell_t propval_cell(struct property *prop)
394{ 394{
395 assert(prop->val.len == sizeof(cell_t)); 395 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));
397} 397}
398 398
399struct property *get_property_by_label(struct node *tree, const char *label, 399struct 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)
599 a = *((const struct reserve_info * const *)ax); 599 a = *((const struct reserve_info * const *)ax);
600 b = *((const struct reserve_info * const *)bx); 600 b = *((const struct reserve_info * const *)bx);
601 601
602 if (a->re.address < b->re.address) 602 if (a->address < b->address)
603 return -1; 603 return -1;
604 else if (a->re.address > b->re.address) 604 else if (a->address > b->address)
605 return 1; 605 return 1;
606 else if (a->re.size < b->re.size) 606 else if (a->size < b->size)
607 return -1; 607 return -1;
608 else if (a->re.size > b->re.size) 608 else if (a->size > b->size)
609 return 1; 609 return 1;
610 else 610 else
611 return 0; 611 return 0;
@@ -847,6 +847,8 @@ static void add_fixup_entry(struct dt_info *dti, struct node *fn,
847 xasprintf(&entry, "%s:%s:%u", 847 xasprintf(&entry, "%s:%s:%u",
848 node->fullpath, prop->name, m->offset); 848 node->fullpath, prop->name, m->offset);
849 append_to_property(fn, m->ref, entry, strlen(entry) + 1); 849 append_to_property(fn, m->ref, entry, strlen(entry) + 1);
850
851 free(entry);
850} 852}
851 853
852static void generate_fixups_tree_internal(struct dt_info *dti, 854static void generate_fixups_tree_internal(struct dt_info *dti,
@@ -900,7 +902,7 @@ static void add_local_fixup_entry(struct dt_info *dti,
900 struct node *refnode) 902 struct node *refnode)
901{ 903{
902 struct node *wn, *nwn; /* local fixup node, walk node, new */ 904 struct node *wn, *nwn; /* local fixup node, walk node, new */
903 uint32_t value_32; 905 fdt32_t value_32;
904 char **compp; 906 char **compp;
905 int i, depth; 907 int i, depth;
906 908
diff --git a/scripts/dtc/srcpos.c b/scripts/dtc/srcpos.c
index aa3aad04cec4..9d38459902f3 100644
--- a/scripts/dtc/srcpos.c
+++ b/scripts/dtc/srcpos.c
@@ -252,7 +252,7 @@ srcpos_string(struct srcpos *pos)
252 const char *fname = "<no-file>"; 252 const char *fname = "<no-file>";
253 char *pos_str; 253 char *pos_str;
254 254
255 if (pos) 255 if (pos->file && pos->file->name)
256 fname = pos->file->name; 256 fname = pos->file->name;
257 257
258 258
diff --git a/scripts/dtc/srcpos.h b/scripts/dtc/srcpos.h
index 2cdfcd82e95e..7caca8257c6d 100644
--- a/scripts/dtc/srcpos.h
+++ b/scripts/dtc/srcpos.h
@@ -22,6 +22,7 @@
22 22
23#include <stdio.h> 23#include <stdio.h>
24#include <stdbool.h> 24#include <stdbool.h>
25#include "util.h"
25 26
26struct srcfile_state { 27struct srcfile_state {
27 FILE *f; 28 FILE *f;
@@ -106,12 +107,10 @@ extern void srcpos_update(struct srcpos *pos, const char *text, int len);
106extern struct srcpos *srcpos_copy(struct srcpos *pos); 107extern struct srcpos *srcpos_copy(struct srcpos *pos);
107extern char *srcpos_string(struct srcpos *pos); 108extern char *srcpos_string(struct srcpos *pos);
108 109
109extern void srcpos_verror(struct srcpos *pos, const char *prefix, 110extern void PRINTF(3, 0) srcpos_verror(struct srcpos *pos, const char *prefix,
110 const char *fmt, va_list va) 111 const char *fmt, va_list va);
111 __attribute__((format(printf, 3, 0))); 112extern void PRINTF(3, 4) srcpos_error(struct srcpos *pos, const char *prefix,
112extern void srcpos_error(struct srcpos *pos, const char *prefix, 113 const char *fmt, ...);
113 const char *fmt, ...)
114 __attribute__((format(printf, 3, 4)));
115 114
116extern void srcpos_set_line(char *f, int l); 115extern void srcpos_set_line(char *f, int l);
117 116
diff --git a/scripts/dtc/treesource.c b/scripts/dtc/treesource.c
index c9d8967969f9..2461a3d068a0 100644
--- a/scripts/dtc/treesource.c
+++ b/scripts/dtc/treesource.c
@@ -137,7 +137,7 @@ static void write_propval_string(FILE *f, struct data val)
137static void write_propval_cells(FILE *f, struct data val) 137static void write_propval_cells(FILE *f, struct data val)
138{ 138{
139 void *propend = val.val + val.len; 139 void *propend = val.val + val.len;
140 cell_t *cp = (cell_t *)val.val; 140 fdt32_t *cp = (fdt32_t *)val.val;
141 struct marker *m = val.markers; 141 struct marker *m = val.markers;
142 142
143 fprintf(f, "<"); 143 fprintf(f, "<");
@@ -275,8 +275,8 @@ void dt_to_source(FILE *f, struct dt_info *dti)
275 for_each_label(re->labels, l) 275 for_each_label(re->labels, l)
276 fprintf(f, "%s: ", l->label); 276 fprintf(f, "%s: ", l->label);
277 fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n", 277 fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n",
278 (unsigned long long)re->re.address, 278 (unsigned long long)re->address,
279 (unsigned long long)re->re.size); 279 (unsigned long long)re->size);
280 } 280 }
281 281
282 write_tree_source_node(f, dti->dt, 0); 282 write_tree_source_node(f, dti->dt, 0);
diff --git a/scripts/dtc/util.c b/scripts/dtc/util.c
index 3550f86bd6df..9953c32a0244 100644
--- a/scripts/dtc/util.c
+++ b/scripts/dtc/util.c
@@ -396,7 +396,7 @@ void utilfdt_print_data(const char *data, int len)
396 } while (s < data + len); 396 } while (s < data + len);
397 397
398 } else if ((len % 4) == 0) { 398 } else if ((len % 4) == 0) {
399 const uint32_t *cell = (const uint32_t *)data; 399 const fdt32_t *cell = (const fdt32_t *)data;
400 400
401 printf(" = <"); 401 printf(" = <");
402 for (i = 0, len /= 4; i < len; i++) 402 for (i = 0, len /= 4; i < len; i++)
@@ -412,15 +412,16 @@ void utilfdt_print_data(const char *data, int len)
412 } 412 }
413} 413}
414 414
415void util_version(void) 415void NORETURN util_version(void)
416{ 416{
417 printf("Version: %s\n", DTC_VERSION); 417 printf("Version: %s\n", DTC_VERSION);
418 exit(0); 418 exit(0);
419} 419}
420 420
421void util_usage(const char *errmsg, const char *synopsis, 421void NORETURN util_usage(const char *errmsg, const char *synopsis,
422 const char *short_opts, struct option const long_opts[], 422 const char *short_opts,
423 const char * const opts_help[]) 423 struct option const long_opts[],
424 const char * const opts_help[])
424{ 425{
425 FILE *fp = errmsg ? stderr : stdout; 426 FILE *fp = errmsg ? stderr : stdout;
426 const char a_arg[] = "<arg>"; 427 const char a_arg[] = "<arg>";
diff --git a/scripts/dtc/util.h b/scripts/dtc/util.h
index f5c4f1b50d30..ad5f41199edb 100644
--- a/scripts/dtc/util.h
+++ b/scripts/dtc/util.h
@@ -25,9 +25,17 @@
25 * USA 25 * USA
26 */ 26 */
27 27
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
28#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 36#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
29 37
30static inline void __attribute__((noreturn)) die(const char *str, ...) 38static inline void NORETURN PRINTF(1, 2) die(const char *str, ...)
31{ 39{
32 va_list ap; 40 va_list ap;
33 41
@@ -53,13 +61,14 @@ static inline void *xrealloc(void *p, size_t len)
53 void *new = realloc(p, len); 61 void *new = realloc(p, len);
54 62
55 if (!new) 63 if (!new)
56 die("realloc() failed (len=%d)\n", len); 64 die("realloc() failed (len=%zd)\n", len);
57 65
58 return new; 66 return new;
59} 67}
60 68
61extern char *xstrdup(const char *s); 69extern char *xstrdup(const char *s);
62extern int xasprintf(char **strp, const char *fmt, ...); 70
71extern int PRINTF(2, 3) xasprintf(char **strp, const char *fmt, ...);
63extern char *join_path(const char *path, const char *name); 72extern char *join_path(const char *path, const char *name);
64 73
65/** 74/**
@@ -188,7 +197,7 @@ void utilfdt_print_data(const char *data, int len);
188/** 197/**
189 * Show source version and exit 198 * Show source version and exit
190 */ 199 */
191void util_version(void) __attribute__((noreturn)); 200void NORETURN util_version(void);
192 201
193/** 202/**
194 * Show usage and exit 203 * Show usage and exit
@@ -202,9 +211,10 @@ void util_version(void) __attribute__((noreturn));
202 * @param long_opts The structure of long options 211 * @param long_opts The structure of long options
203 * @param opts_help An array of help strings (should align with long_opts) 212 * @param opts_help An array of help strings (should align with long_opts)
204 */ 213 */
205void util_usage(const char *errmsg, const char *synopsis, 214void NORETURN util_usage(const char *errmsg, const char *synopsis,
206 const char *short_opts, struct option const long_opts[], 215 const char *short_opts,
207 const char * const opts_help[]) __attribute__((noreturn)); 216 struct option const long_opts[],
217 const char * const opts_help[]);
208 218
209/** 219/**
210 * Show usage and exit 220 * Show usage and exit
diff --git a/scripts/dtc/version_gen.h b/scripts/dtc/version_gen.h
index 16c2e53a85e3..1229e07b4912 100644
--- a/scripts/dtc/version_gen.h
+++ b/scripts/dtc/version_gen.h
@@ -1 +1 @@
#define DTC_VERSION "DTC 1.4.2-g0931cea3" #define DTC_VERSION "DTC 1.4.4-g756ffc4f"