dtc updates for 4.12
Subsystems (2)
Rob Herring
maintainercover dtc updates for 4.12
This series syncs dtc with current mainline. The primary motivation is to pull in the new checks I've worked on. This gives lots of new warnings which are turned off by default.
Arm-soc folks, I've left the PCI checks enabled as they are pretty much all real errors and there aren't that many (about 1200, but that's lots of duplicates). I have a patch for some of them.
Rob
Rob Herring (3):
scripts/dtc: automate getting dtc version and log in update script scripts/dtc: Update to upstream version v1.4.4-8-g756ffc4f52f6
dtc: update warning settings for new bus and node/property name checks
scripts/Makefile.lib | 9 +- scripts/dtc/checks.c | 361 +++++++++++++++++++++++++++++++---- scripts/dtc/data.c | 16 +- scripts/dtc/dtc-lexer.l | 3 +- scripts/dtc/dtc-lexer.lex.c_shipped | 77 ++++---- scripts/dtc/dtc-parser.tab.c_shipped | 6 +- scripts/dtc/dtc-parser.y | 6 +- scripts/dtc/dtc.c | 9 +- scripts/dtc/dtc.h | 11 +- scripts/dtc/flattree.c | 58 +++--- scripts/dtc/libfdt/fdt_rw.c | 3 +- scripts/dtc/libfdt/libfdt.h | 51 ++++- scripts/dtc/libfdt/libfdt_env.h | 26 +-- scripts/dtc/livetree.c | 22 ++- scripts/dtc/srcpos.c | 2 +- scripts/dtc/srcpos.h | 11 +- scripts/dtc/treesource.c | 6 +- scripts/dtc/update-dtc-source.sh | 20 +- scripts/dtc/util.c | 11 +- scripts/dtc/util.h | 24 ++- scripts/dtc/version_gen.h | 2 +- 21 files changed, 550 insertions(+), 184 deletions(-)
Signature · 1 line
2.10.1
Rob Herring
maintainerPATCH 1/3 scripts/dtc: automate getting dtc version and log in update script
Further automate the dtc update script to fill in the dtc version and commit log.
--- scripts/dtc/update-dtc-source.sh | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)
scripts/dtc/update-dtc-source.sh +18 -1
@@ -36,10 +36,19 @@ DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c DTC_GENERATED="dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h" LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_empty_tree.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h" +get_last_dtc_version() { + git log --oneline scripts/dtc/ | grep 'upstream' | head -1 | sed -e 's/^.* \(.*\)/\1/' +} + +last_dtc_ver=$(get_last_dtc_version) + # Build DTC cd $DTC_UPSTREAM_PATH make clean make check +dtc_version=$(git describe HEAD) +dtc_log=$(git log --oneline ${last_dtc_ver}..) + # Copy the files into the Linux tree cd $DTC_LINUX_PATH
@@ -60,4 +69,12 @@ sed -i -- 's/#include <libfdt_env.h>/#include "libfdt_env.h"/g' ./libfdt/libfdt. sed -i -- 's/#include <fdt.h>/#include "fdt.h"/g' ./libfdt/libfdt.h git add ./libfdt/libfdt.h -git commit -e -v -m "scripts/dtc: Update to upstream version [CHANGEME]" +commit_msg=$(cat << EOF +scripts/dtc: Update to upstream version ${dtc_version} + +This adds the following commits from upstream: + +${dtc_log} +EOF +) +git commit -e -v -s -m "${commit_msg}"
Signature · 1 line
2.10.1
Rob Herring
maintainerPATCH 2/3 scripts/dtc: Update to upstream version v1.4.4-8-g756ffc4f52f6
In reply to Rob HerringThis adds the following commits from upstream:
756ffc4f52f6 Build pylibfdt as part of the normal build process 8cb3896358e9 Adjust libfdt.h to work with swigb40aa8359aff Mention pylibfdt in the documentation12cfb740cc76 Add tests for pylibfdt50f250701631 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 buses558cd81bdd43 dtc: Bump version to v1.4.4c17a811c62eb 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 warnings672ac09ea04d Clean up gcc attributes49300f2ade6a dtc: Don't abuse struct fdt_reserve_entry fa8bc7f928ac dtc: Bump version to v1.4.334a9886a177f Add printf format attributesf72508e2b6ca 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 leak3b9c97093d6e dtc: Fix NULL pointer use in dtlabel + dtref case 43eb551426ea manual: Fix typo it -> in4baf15f7f13f Makefile: Add tags rule
---
Note: Only review that upstream was copied in correctly, not the actual diff here.
scripts/dtc/checks.c | 361 +++++++++++++++++++++++++++++++---- scripts/dtc/data.c | 16 +- scripts/dtc/dtc-lexer.l | 3 +- scripts/dtc/dtc-lexer.lex.c_shipped | 77 ++++---- scripts/dtc/dtc-parser.tab.c_shipped | 6 +- scripts/dtc/dtc-parser.y | 6 +- scripts/dtc/dtc.c | 9 +- scripts/dtc/dtc.h | 11 +- scripts/dtc/flattree.c | 58 +++--- scripts/dtc/libfdt/fdt_rw.c | 3 +- scripts/dtc/libfdt/libfdt.h | 51 ++++- scripts/dtc/libfdt/libfdt_env.h | 26 +-- scripts/dtc/livetree.c | 22 ++- scripts/dtc/srcpos.c | 2 +- scripts/dtc/srcpos.h | 11 +- scripts/dtc/treesource.c | 6 +- scripts/dtc/util.c | 11 +- scripts/dtc/util.h | 24 ++- scripts/dtc/version_gen.h | 2 +- 19 files changed, 523 insertions(+), 182 deletions(-)
scripts/dtc/checks.c +319 -42
@@ -72,17 +72,16 @@ struct check {#define CHECK (_nm, _fn, _d, ...) \ CHECK_ENTRY(_nm, _fn, _d, false, false, __VA_ARGS__) -#ifdef __GNUC__ -static inline void check_msg (struct check *c,const char *fmt, ...) __attribute__((format (printf,2 ,3 ))); -#endif -static inline void check_msg (struct check *c,const char *fmt, ...) +static inline void PRINTF(3, 4) check_msg(struct check *c, struct dt_info *dti, + const char *fmt, ...) { va_list ap; va_start(ap, fmt); if ((c->warn && (quiet < 1)) || (c->error && (quiet < 2))) { -fprintf (stderr,"%s (%s): " , +fprintf (stderr,"%s: %s (%s): " , +strcmp (dti->outname,"-" ) ? dti->outname :"<stdout>" , (c->error) ?"ERROR" :"Warning" , c->name);vfprintf (stderr, fmt, ap);fprintf (stderr,"\n" );
@@ -90,11 +89,11 @@ static inline void check_msg(struct check *c, const char *fmt, ...)va_end (ap); } -#define FAIL (c, ...) \ - do { \ - TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \ - (c)->status = FAILED; \ - check_msg((c), __VA_ARGS__); \ +#define FAIL (c, dti, ...) \ + do { \ + TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \ + (c)->status = FAILED; \ + check_msg((c), dti, __VA_ARGS__); \ } while (0)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) error = error ||run_check (prq, dti);if (prq->status !=PASSED ) { c->status =PREREQ ; -check_msg (c,"Failed prerequisite '%s'" , +check_msg (c, dti,"Failed prerequisite '%s'" , c->prereq[i]->name); } }
@@ -157,7 +156,7 @@ static bool run_check(struct check *c, struct dt_info *dti)static inline void check_always_fail (struct check *c,struct dt_info *dti,struct node *node) { -FAIL (c,"always_fail check" ); +FAIL (c, dti,"always_fail check" ); }CHECK (always_fail, check_always_fail,NULL );
@@ -172,7 +171,7 @@ static void check_is_string(struct check *c, struct dt_info *dti,return ;/* Not present, assumed ok */ if (!data_is_one_string (prop->val)) -FAIL (c,"\"%s\" property in %s is not a string" , +FAIL (c, dti,"\"%s\" property in %s is not a string" , propname, node->fullpath); }#define WARNING_IF_NOT_STRING (nm, propname) \
@@ -191,7 +190,7 @@ static void check_is_cell(struct check *c, struct dt_info *dti,return ;/* Not present, assumed ok */ if (prop->val.len !=sizeof (cell_t)) -FAIL (c,"\"%s\" property in %s is not a single cell" , +FAIL (c, dti,"\"%s\" property in %s is not a single cell" , propname, node->fullpath); }#define WARNING_IF_NOT_CELL (nm, propname) \
@@ -213,7 +212,7 @@ static void check_duplicate_node_names(struct check *c, struct dt_info *dti,child2 ; child2 = child2->next_sibling)if (streq (child->name, child2->name)) -FAIL (c,"Duplicate node name %s" , +FAIL (c, dti,"Duplicate node name %s" , child->fullpath); }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,if (prop2->deleted)continue ;if (streq (prop->name, prop2->name)) -FAIL (c,"Duplicate property name %s in %s" , +FAIL (c, dti,"Duplicate property name %s in %s" , prop->name, node->fullpath); } }
@@ -239,6 +238,7 @@ ERROR(duplicate_property_names, check_duplicate_property_names, NULL);#define UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ"#define DIGITS "0123456789"#define PROPNODECHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-" +#define PROPNODECHARSSTRICT LOWERCASE UPPERCASE DIGITS ",-"static void check_node_name_chars (struct check *c,struct dt_info *dti,struct node *node)
@@ -246,16 +246,27 @@ static void check_node_name_chars(struct check *c, struct dt_info *dti,int n =strspn (node->name, c->data);if (n <strlen (node->name)) -FAIL (c,"Bad character '%c' in node %s" , +FAIL (c, dti,"Bad character '%c' in node %s" , node->name[n], node->fullpath); }ERROR (node_name_chars, check_node_name_chars,PROPNODECHARS "@" ); +static void check_node_name_chars_strict (struct check *c,struct dt_info *dti, +struct node *node) +{ +int n =strspn (node->name, c->data); + +if (n < node->basenamelen) +FAIL (c, dti,"Character '%c' not recommended in node %s" , + node->name[n], node->fullpath); +} +CHECK (node_name_chars_strict, check_node_name_chars_strict,PROPNODECHARSSTRICT ); +static void check_node_name_format (struct check *c,struct dt_info *dti,struct node *node) {if (strchr (get_unitname (node),'@' )) -FAIL (c,"Node %s has multiple '@' characters in name" , +FAIL (c, dti,"Node %s has multiple '@' characters in name" , node->fullpath); }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,if (prop) {if (!unitname[0 ]) -FAIL (c,"Node %s has a reg or ranges property, but no unit name" , +FAIL (c, dti,"Node %s has a reg or ranges property, but no unit name" , node->fullpath); }else {if (unitname[0 ]) -FAIL (c,"Node %s has a unit name, but no reg property" , +FAIL (c, dti,"Node %s has a unit name, but no reg property" , node->fullpath); } }
@@ -293,12 +304,44 @@ static void check_property_name_chars(struct check *c, struct dt_info *dti,int n =strspn (prop->name, c->data);if (n <strlen (prop->name)) -FAIL (c,"Bad character '%c' in property name \"%s\", node %s" , +FAIL (c, dti,"Bad character '%c' in property name \"%s\", node %s" , prop->name[n], prop->name, node->fullpath); } }ERROR (property_name_chars, check_property_name_chars,PROPNODECHARS ); +static void check_property_name_chars_strict (struct check *c, +struct dt_info *dti, +struct node *node) +{ +struct property *prop; + +for_each_property (node, prop) { +const char *name = prop->name; +int n =strspn (name, c->data); + +if (n ==strlen (prop->name)) +continue ; + +/* Certain names are whitelisted */ +if (streq (name,"device_type" )) +continue ; + +/* +* # is only allowed at the beginning of property names not counting +* the vendor prefix. +*/ +if (name[n] =='#' && ((n ==0 ) || (name[n-1 ] ==',' ))) { + name += n +1 ; + n =strspn (name, c->data); + } +if (n <strlen (name)) +FAIL (c, dti,"Character '%c' not recommended in property name \"%s\", node %s" , + name[n], prop->name, node->fullpath); + } +} +CHECK (property_name_chars_strict, check_property_name_chars_strict,PROPNODECHARSSTRICT ); +#define DESCLABEL_FMT "%s%s%s%s%s"#define DESCLABEL_ARGS (node,prop,mark) \ ((mark) ? "value of " : ""), \
@@ -327,7 +370,7 @@ static void check_duplicate_label(struct check *c, struct dt_info *dti,return ;if ((othernode != node) || (otherprop != prop) || (othermark != mark)) -FAIL (c,"Duplicate label '%s' on " DESCLABEL_FMT +FAIL (c, dti,"Duplicate label '%s' on " DESCLABEL_FMT " and " DESCLABEL_FMT , label,DESCLABEL_ARGS (node, prop, mark),DESCLABEL_ARGS (othernode, otherprop, othermark));
@@ -367,7 +410,7 @@ static cell_t check_phandle_prop(struct check *c, struct dt_info *dti,return 0 ;if (prop->val.len !=sizeof (cell_t)) { -FAIL (c,"%s has bad length (%d) %s property" , +FAIL (c, dti,"%s has bad length (%d) %s property" , node->fullpath, prop->val.len, prop->name);return 0 ; }
@@ -379,7 +422,7 @@ static cell_t check_phandle_prop(struct check *c, struct dt_info *dti,/* "Set this node's phandle equal to some * other node's phandle". That's nonsensical * by construction. */ { -FAIL (c,"%s in %s is a reference to another node" , +FAIL (c, dti,"%s in %s is a reference to another node" , prop->name, node->fullpath); }/* 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, phandle =propval_cell (prop);if ((phandle ==0 ) || (phandle ==-1 )) { -FAIL (c,"%s has bad value (0x%x) in %s property" , +FAIL (c, dti,"%s has bad value (0x%x) in %s property" , node->fullpath, phandle, prop->name);return 0 ; }
@@ -420,7 +463,7 @@ static void check_explicit_phandles(struct check *c, struct dt_info *dti,return ;if (linux_phandle && phandle && (phandle != linux_phandle)) -FAIL (c,"%s has mismatching 'phandle' and 'linux,phandle'" +FAIL (c, dti,"%s has mismatching 'phandle' and 'linux,phandle'" " properties" , node->fullpath);if (linux_phandle && !phandle)
@@ -428,7 +471,7 @@ static void check_explicit_phandles(struct check *c, struct dt_info *dti, other =get_node_by_phandle (root, phandle);if (other && (other != node)) { -FAIL (c,"%s has duplicated phandle 0x%x (seen before at %s)" , +FAIL (c, dti,"%s has duplicated phandle 0x%x (seen before at %s)" , node->fullpath, phandle, other->fullpath);return ; }
@@ -453,7 +496,7 @@ static void check_name_properties(struct check *c, struct dt_info *dti,if ((prop->val.len != node->basenamelen+1 ) || (memcmp (prop->val.val, node->name, node->basenamelen) !=0 )) { -FAIL (c,"\"name\" property in %s is incorrect (\"%s\" instead" +FAIL (c, dti,"\"name\" property in %s is incorrect (\"%s\" instead" " of base node name)" , node->fullpath, prop->val.val); }else {/* The name property is correct, and therefore redundant.
@@ -488,16 +531,16 @@ static void fixup_phandle_references(struct check *c, struct dt_info *dti, refnode =get_node_by_ref (dt, m->ref);if (! refnode) {if (!(dti->dtsflags &DTSF_PLUGIN )) -FAIL (c,"Reference to non-existent node or " +FAIL (c, dti,"Reference to non-existent node or " "label \"%s\"\n" , m->ref);else /* mark the entry as unresolved */ - *((cell_t *)(prop->val.val + m->offset)) = + *((fdt32_t *)(prop->val.val + m->offset)) =cpu_to_fdt32 (0xffffffff );continue ; } phandle =get_node_phandle (dt, refnode); - *((cell_t *)(prop->val.val + m->offset)) =cpu_to_fdt32 (phandle); + *((fdt32_t *)(prop->val.val + m->offset)) =cpu_to_fdt32 (phandle); } } }
@@ -520,7 +563,7 @@ static void fixup_path_references(struct check *c, struct dt_info *dti, refnode =get_node_by_ref (dt, m->ref);if (!refnode) { -FAIL (c,"Reference to non-existent node or label \"%s\"\n" , +FAIL (c, dti,"Reference to non-existent node or label \"%s\"\n" , m->ref);continue ; }
@@ -579,19 +622,19 @@ static void check_reg_format(struct check *c, struct dt_info *dti,return ;/* No "reg", that's fine */ if (!node->parent) { -FAIL (c,"Root node has a \"reg\" property" ); +FAIL (c, dti,"Root node has a \"reg\" property" );return ; }if (prop->val.len ==0 ) -FAIL (c,"\"reg\" property in %s is empty" , node->fullpath); +FAIL (c, dti,"\"reg\" property in %s is empty" , node->fullpath); addr_cells =node_addr_cells (node->parent); size_cells =node_size_cells (node->parent); entrylen = (addr_cells + size_cells) *sizeof (cell_t);if (!entrylen || (prop->val.len % entrylen) !=0 ) -FAIL (c,"\"reg\" property in %s has invalid length (%d bytes) " +FAIL (c, dti,"\"reg\" property in %s has invalid length (%d bytes) " "(#address-cells == %d, #size-cells == %d)" , node->fullpath, prop->val.len, addr_cells, size_cells); }
@@ -608,7 +651,7 @@ static void check_ranges_format(struct check *c, struct dt_info *dti,return ;if (!node->parent) { -FAIL (c,"Root node has a \"ranges\" property" ); +FAIL (c, dti,"Root node has a \"ranges\" property" );return ; }
@@ -620,17 +663,17 @@ static void check_ranges_format(struct check *c, struct dt_info *dti,if (prop->val.len ==0 ) {if (p_addr_cells != c_addr_cells) -FAIL (c,"%s has empty \"ranges\" property but its " +FAIL (c, dti,"%s has empty \"ranges\" property but its " "#address-cells (%d) differs from %s (%d)" , node->fullpath, c_addr_cells, node->parent->fullpath, p_addr_cells);if (p_size_cells != c_size_cells) -FAIL (c,"%s has empty \"ranges\" property but its " +FAIL (c, dti,"%s has empty \"ranges\" property but its " "#size-cells (%d) differs from %s (%d)" , node->fullpath, c_size_cells, node->parent->fullpath, p_size_cells); }else if ((prop->val.len % entrylen) !=0 ) { -FAIL (c,"\"ranges\" property in %s has invalid length (%d bytes) " +FAIL (c, dti,"\"ranges\" property in %s has invalid length (%d bytes) " "(parent #address-cells == %d, child #address-cells == %d, " "#size-cells == %d)" , node->fullpath, prop->val.len, p_addr_cells, c_addr_cells, c_size_cells);
@@ -638,6 +681,229 @@ static void check_ranges_format(struct check *c, struct dt_info *dti, }WARNING (ranges_format, check_ranges_format,NULL , &addr_size_cells); +static const struct bus_type pci_bus = { + .name ="PCI" , +}; + +static void check_pci_bridge (struct check *c,struct dt_info *dti,struct node *node) +{ +struct property *prop; +cell_t *cells; + + prop =get_property (node,"device_type" ); +if (!prop || !streq (prop->val.val,"pci" )) +return ; + + node->bus = &pci_bus; + +if (!strneq (node->name,"pci" , node->basenamelen) && + !strneq (node->name,"pcie" , node->basenamelen)) +FAIL (c, dti,"Node %s node name is not \"pci\" or \"pcie\"" , + node->fullpath); + + prop =get_property (node,"ranges" ); +if (!prop) +FAIL (c, dti,"Node %s missing ranges for PCI bridge (or not a bridge)" , + node->fullpath); + +if (node_addr_cells (node) !=3 ) +FAIL (c, dti,"Node %s incorrect #address-cells for PCI bridge" , + node->fullpath); +if (node_size_cells (node) !=2 ) +FAIL (c, dti,"Node %s incorrect #size-cells for PCI bridge" , + node->fullpath); + + prop =get_property (node,"bus-range" ); +if (!prop) { +FAIL (c, dti,"Node %s missing bus-range for PCI bridge" , + node->fullpath); +return ; + } +if (prop->val.len != (sizeof (cell_t) *2 )) { +FAIL (c, dti,"Node %s bus-range must be 2 cells" , + node->fullpath); +return ; + } + cells = (cell_t *)prop->val.val; +if (fdt32_to_cpu (cells[0 ]) >fdt32_to_cpu (cells[1 ])) +FAIL (c, dti,"Node %s bus-range 1st cell must be less than or equal to 2nd cell" , + node->fullpath); +if (fdt32_to_cpu (cells[1 ]) >0xff ) +FAIL (c, dti,"Node %s bus-range maximum bus number must be less than 256" , + node->fullpath); +} +WARNING (pci_bridge, check_pci_bridge,NULL , + &device_type_is_string, &addr_size_cells); + +static void check_pci_device_bus_num (struct check *c,struct dt_info *dti,struct node *node) +{ +struct property *prop; +unsigned int bus_num, min_bus, max_bus; +cell_t *cells; + +if (!node->parent || (node->parent->bus != &pci_bus)) +return ; + + prop =get_property (node,"reg" ); +if (!prop) +return ; + + cells = (cell_t *)prop->val.val; + bus_num = (fdt32_to_cpu (cells[0 ]) &0x00ff0000 ) >>16 ; + + prop =get_property (node->parent,"bus-range" ); +if (!prop) { + min_bus = max_bus =0 ; + }else { + cells = (cell_t *)prop->val.val; + min_bus =fdt32_to_cpu (cells[0 ]); + max_bus =fdt32_to_cpu (cells[0 ]); + } +if ((bus_num < min_bus) || (bus_num > max_bus)) +FAIL (c, dti,"Node %s PCI bus number %d out of range, expected (%d - %d)" , + node->fullpath, bus_num, min_bus, max_bus); +} +WARNING (pci_device_bus_num, check_pci_device_bus_num,NULL , ®_format, &pci_bridge); + +static void check_pci_device_reg (struct check *c,struct dt_info *dti,struct node *node) +{ +struct property *prop; +const char *unitname =get_unitname (node); +char unit_addr[5 ]; +unsigned int dev, func, reg; +cell_t *cells; + +if (!node->parent || (node->parent->bus != &pci_bus)) +return ; + + prop =get_property (node,"reg" ); +if (!prop) { +FAIL (c, dti,"Node %s missing PCI reg property" , node->fullpath); +return ; + } + + cells = (cell_t *)prop->val.val; +if (cells[1 ] || cells[2 ]) +FAIL (c, dti,"Node %s PCI reg config space address cells 2 and 3 must be 0" , + node->fullpath); + + reg =fdt32_to_cpu (cells[0 ]); + dev = (reg &0xf800 ) >>11 ; + func = (reg &0x700 ) >>8 ; + +if (reg &0xff000000 ) +FAIL (c, dti,"Node %s PCI reg address is not configuration space" , + node->fullpath); +if (reg &0x000000ff ) +FAIL (c, dti,"Node %s PCI reg config space address register number must be 0" , + node->fullpath); + +if (func ==0 ) { +snprintf (unit_addr,sizeof (unit_addr),"%x" , dev); +if (streq (unitname, unit_addr)) +return ; + } + +snprintf (unit_addr,sizeof (unit_addr),"%x,%x" , dev, func); +if (streq (unitname, unit_addr)) +return ; + +FAIL (c, dti,"Node %s PCI unit address format error, expected \"%s\"" , + node->fullpath, unit_addr); +} +WARNING (pci_device_reg, check_pci_device_reg,NULL , ®_format, &pci_bridge); + +static const struct bus_type simple_bus = { + .name ="simple-bus" , +}; + +static bool node_is_compatible (struct node *node,const char *compat) +{ +struct property *prop; +const char *str, *end; + + prop =get_property (node,"compatible" ); +if (!prop) +return false; + +for (str = prop->val.val, end = str + prop->val.len; str < end; + str +=strnlen (str, end - str) +1 ) { +if (strneq (str, compat, end - str)) +return true; + } +return false; +} + +static void check_simple_bus_bridge (struct check *c,struct dt_info *dti,struct node *node) +{ +if (node_is_compatible (node,"simple-bus" )) + node->bus = &simple_bus; +} +WARNING (simple_bus_bridge, check_simple_bus_bridge,NULL , &addr_size_cells); + +static void check_simple_bus_reg (struct check *c,struct dt_info *dti,struct node *node) +{ +struct property *prop; +const char *unitname =get_unitname (node); +char unit_addr[17 ]; +unsigned int size; +uint64_t reg =0 ; +cell_t *cells =NULL ; + +if (!node->parent || (node->parent->bus != &simple_bus)) +return ; + + prop =get_property (node,"reg" ); +if (prop) + cells = (cell_t *)prop->val.val; +else { + prop =get_property (node,"ranges" ); +if (prop && prop->val.len) +/* skip of child address */ + cells = ((cell_t *)prop->val.val) +node_addr_cells (node); + } + +if (!cells) { +if (node->parent->parent && !(node->bus == &simple_bus)) +FAIL (c, dti,"Node %s missing or empty reg/ranges property" , node->fullpath); +return ; + } + + size =node_addr_cells (node->parent); +while (size--) + reg = (reg <<32 ) |fdt32_to_cpu (*(cells++)); + +snprintf (unit_addr,sizeof (unit_addr),"%lx" , reg); +if (!streq (unitname, unit_addr)) +FAIL (c, dti,"Node %s simple-bus unit address format error, expected \"%s\"" , + node->fullpath, unit_addr); +} +WARNING (simple_bus_reg, check_simple_bus_reg,NULL , ®_format, &simple_bus_bridge); + +static void check_unit_address_format (struct check *c,struct dt_info *dti, +struct node *node) +{ +const char *unitname =get_unitname (node); + +if (node->parent && node->parent->bus) +return ; + +if (!unitname[0 ]) +return ; + +if (!strncmp (unitname,"0x" ,2 )) { +FAIL (c, dti,"Node %s unit name should not have leading \"0x\"" , + node->fullpath); +/* skip over 0x for next test */ + unitname +=2 ; + } +if (unitname[0 ] =='0' &&isxdigit (unitname[1 ])) +FAIL (c, dti,"Node %s unit name should not have leading 0s" , + node->fullpath); +} +WARNING (unit_address_format, check_unit_address_format,NULL , + &node_name_format, &pci_bridge, &simple_bus_bridge); +/* * Style checks */
@@ -656,11 +922,11 @@ static void check_avoid_default_addr_size(struct check *c, struct dt_info *dti,return ;if (node->parent->addr_cells ==-1 ) -FAIL (c,"Relying on default #address-cells value for %s" , +FAIL (c, dti,"Relying on default #address-cells value for %s" , node->fullpath);if (node->parent->size_cells ==-1 ) -FAIL (c,"Relying on default #size-cells value for %s" , +FAIL (c, dti,"Relying on default #size-cells value for %s" , node->fullpath); } 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, prop =get_property (chosen,"interrupt-controller" );if (prop) -FAIL (c,"/chosen has obsolete \"interrupt-controller\" " +FAIL (c, dti,"/chosen has obsolete \"interrupt-controller\" " "property" ); } WARNING(obsolete_chosen_interrupt_controller,
@@ -703,9 +969,20 @@ static struct check *check_table[] = { &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell, &device_type_is_string, &model_is_string, &status_is_string, + &property_name_chars_strict, + &node_name_chars_strict, + &addr_size_cells, ®_format, &ranges_format, &unit_address_vs_reg, + &unit_address_format, + + &pci_bridge, + &pci_device_reg, + &pci_device_bus_num, + + &simple_bus_bridge, + &simple_bus_reg, &avoid_default_addr_size, &obsolete_chosen_interrupt_controller,
scripts/dtc/data.c +8 -8
@@ -171,9 +171,9 @@ struct data data_merge(struct data d1, struct data d2)struct data data_append_integer (struct data d,uint64_t value,int bits) {uint8_t value_8; -uint16_t value_16; -uint32_t value_32; -uint64_t value_64; +fdt16_t value_16; +fdt32_t value_32; +fdt64_t value_64;switch (bits) {case 8 :
@@ -197,14 +197,14 @@ struct data data_append_integer(struct data d, uint64_t value, int bits) } } -struct data data_append_re (struct data d,const struct fdt_reserve_entry *re) +struct data data_append_re (struct data d,uint64_t address,uint64_t size) { -struct fdt_reserve_entry bere; +struct fdt_reserve_entry re; - bere.address =cpu_to_fdt64 (re->address); - bere.size =cpu_to_fdt64 (re->size); + re.address =cpu_to_fdt64 (address); + re.size =cpu_to_fdt64 (size); -return data_append_data (d, &bere,sizeof (bere)); +return data_append_data (d, &re,sizeof (re)); }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; static void push_input_file(const char *filename); static bool pop_input_file(void); -static void lexical_error(const char *fmt, ...); +static void PRINTF(1, 2) lexical_error(const char *fmt, ...); + %} %%
scripts/dtc/dtc-lexer.lex.c_shipped +39 -38
270 lines not on this page · raw message
scripts/dtc/dtc-parser.tab.c_shipped +3 -3
@@ -1557,10 +1557,10 @@ yyreduce: { struct node *target = get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].labelref)); - add_label(&target->labels, (yyvsp[-2].labelref)); - if (target) + if (target) { + add_label(&target->labels, (yyvsp[-2].labelref)); merge_nodes(target, (yyvsp[0].node)); - else + } else ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref)); (yyval.node) = (yyvsp[-3].node); }
scripts/dtc/dtc-parser.y +3 -3
@@ -171,10 +171,10 @@ devicetree: { struct node *target = get_node_by_ref($1, $3); - add_label(&target->labels, $2); - if (target) + if (target) { + add_label(&target->labels, $2); merge_nodes(target, $4); - else + } else ERROR(&@3, "Label or path %s not found", $3); $$ = $1; }
scripts/dtc/dtc.c +5 -4
@@ -138,7 +138,7 @@ static const char *guess_type_by_name(const char *fname, const char *fallback)static const char *guess_input_format (const char *fname,const char *fallback) {struct stat statbuf; -uint32_t magic; +fdt32_t magic;FILE *f;if (stat (fname, &statbuf) !=0 )
@@ -159,8 +159,7 @@ static const char *guess_input_format(const char *fname, const char *fallback) }fclose (f); - magic =fdt32_to_cpu (magic); -if (magic ==FDT_MAGIC ) +if (fdt32_to_cpu (magic) ==FDT_MAGIC )return "dtb" ;return guess_type_by_name (fname, fallback);
@@ -216,7 +215,7 @@ int main(int argc, char *argv[]) alignsize =strtol (optarg,NULL ,0 );if (!is_power_of_2 (alignsize))die ("Invalid argument \"%d\" to -a option\n" , - optarg); + alignsize);break ;case 'f' : force = true;
@@ -309,6 +308,8 @@ int main(int argc, char *argv[])else die ("Unknown input format \"%s\"\n" , inform); + dti->outname = outname; +if (depfile) {fputc ('\n' , depfile);fclose (depfile);
scripts/dtc/dtc.h +8 -3
@@ -43,7 +43,6 @@#define debug (...)#endif -#define DEFAULT_FDT_VERSION 17/*
@@ -114,7 +113,7 @@ struct data data_insert_at_marker(struct data d, struct marker *m,struct data data_merge (struct data d1,struct data d2);struct data data_append_cell (struct data d,cell_t word);struct data data_append_integer (struct data d,uint64_t word,int bits); -struct data data_append_re (struct data d,const struct fdt_reserve_entry *re); +struct data data_append_re (struct data d,uint64_t address,uint64_t size);struct data data_append_addr (struct data d,uint64_t addr);struct data data_append_byte (struct data d,uint8_t byte);struct data data_append_zeroes (struct data d,int len);
@@ -136,6 +135,10 @@ struct label {struct label *next; }; +struct bus_type { +const char *name; +}; +struct property {bool deleted;char *name;
@@ -162,6 +165,7 @@ struct node {int addr_cells, size_cells;struct label *labels; +const struct bus_type *bus; };#define for_each_label_withdel (l0, l) \
@@ -227,7 +231,7 @@ uint32_t guess_boot_cpuid(struct node *tree);/* Boot info (tree plus memreserve information */ struct reserve_info { -struct fdt_reserve_entry re; +uint64_t address, size;struct reserve_info *next;
@@ -246,6 +250,7 @@ struct dt_info {struct reserve_info *reservelist;uint32_t boot_cpuid_phys;struct node *dt;/* the device tree */ +const char *outname;/* filename being written to, "-" for stdout */ };/* DTS version flags definitions */
scripts/dtc/flattree.c +26 -32
148 lines not on this page · raw message
scripts/dtc/libfdt/fdt_rw.c +2 -1
@@ -283,7 +283,8 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name,if (err)return err; -memcpy (prop->data, val, len); +if (len) +memcpy (prop->data, val, len);return 0 ; }
scripts/dtc/libfdt/libfdt.h +50 -1
149 lines not on this page · raw message
scripts/dtc/libfdt/libfdt_env.h +13 -13
@@ -58,16 +58,16 @@#include <string.h> #ifdef __CHECKER__ -#define __force __attribute__((force)) -#define __bitwise __attribute__((bitwise)) +#define FDT_FORCE __attribute__((force)) +#define FDT_BITWISE __attribute__((bitwise))#else -#define __force -#define __bitwise +#define FDT_FORCE +#define FDT_BITWISE #endif -typedef uint16_t __bitwise fdt16_t ; -typedef uint32_t __bitwise fdt32_t ; -typedef uint64_t __bitwise fdt64_t ; +typedef uint16_t FDT_BITWISE fdt16_t; +typedef uint32_t FDT_BITWISE fdt32_t; +typedef uint64_t FDT_BITWISE fdt64_t;#define EXTRACT_BYTE (x, n) ((unsigned long long)((uint8_t *)&x)[n])#define CPU_TO_FDT16 (x) ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
@@ -80,29 +80,29 @@ typedef uint64_t __bitwise fdt64_t;static inline uint16_t fdt16_to_cpu (fdt16_t x) { -return (__force uint16_t )CPU_TO_FDT16 (x); + return (FDT_FORCE uint16_t)CPU_TO_FDT16(x); }static inline fdt16_t cpu_to_fdt16 (uint16_t x) { -return (__force fdt16_t )CPU_TO_FDT16 (x); + return (FDT_FORCE fdt16_t)CPU_TO_FDT16(x); }static inline uint32_t fdt32_to_cpu (fdt32_t x) { -return (__force uint32_t )CPU_TO_FDT32 (x); + return (FDT_FORCE uint32_t)CPU_TO_FDT32(x); }static inline fdt32_t cpu_to_fdt32 (uint32_t x) { -return (__force fdt32_t )CPU_TO_FDT32 (x); + return (FDT_FORCE fdt32_t)CPU_TO_FDT32(x); }static inline uint64_t fdt64_to_cpu (fdt64_t x) { -return (__force uint64_t )CPU_TO_FDT64 (x); + return (FDT_FORCE uint64_t)CPU_TO_FDT64(x); }static inline fdt64_t cpu_to_fdt64 (uint64_t x) { -return (__force fdt64_t )CPU_TO_FDT64 (x); + return (FDT_FORCE fdt64_t)CPU_TO_FDT64(x); }#undef CPU_TO_FDT64#undef CPU_TO_FDT32
scripts/dtc/livetree.c +12 -10
@@ -242,7 +242,7 @@ void delete_property_by_name(struct node *node, char *name)struct property *prop = node->proplist;while (prop) { -if (!strcmp (prop->name, name)) { +if (streq (prop->name, name)) {delete_property (prop);return ; }
@@ -275,7 +275,7 @@ void delete_node_by_name(struct node *parent, char *name)struct node *node = parent->children;while (node) { -if (!strcmp (node->name, name)) { +if (streq (node->name, name)) {delete_node (node);return ; }
@@ -319,8 +319,8 @@ struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size)memset (new,0 ,sizeof (*new)); - new->re.address = address; - new->re.size = size; + new->address = address; + new->size = size;return new; }
@@ -393,7 +393,7 @@ struct property *get_property(struct node *node, const char *propname)cell_t propval_cell (struct property *prop) {assert (prop->val.len ==sizeof (cell_t)); -return fdt32_to_cpu (*((cell_t *)prop->val.val)); +return fdt32_to_cpu (*((fdt32_t *)prop->val.val)); } 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) a = *((const struct reserve_info *const *)ax); b = *((const struct reserve_info *const *)bx); -if (a->re.address < b->re.address) +if (a->address < b->address)return -1 ; -else if (a->re.address > b->re.address) +else if (a->address > b->address)return 1 ; -else if (a->re.size < b->re.size) +else if (a->size < b->size)return -1 ; -else if (a->re.size > b->re.size) +else if (a->size > b->size)return 1 ;else return 0 ;
@@ -847,6 +847,8 @@ static void add_fixup_entry(struct dt_info *dti, struct node *fn,xasprintf (&entry,"%s:%s:%u" , node->fullpath, prop->name, m->offset);append_to_property (fn, m->ref, entry,strlen (entry) +1 ); + +free (entry); } static void generate_fixups_tree_internal(struct dt_info *dti,
@@ -900,7 +902,7 @@ static void add_local_fixup_entry(struct dt_info *dti, struct node *refnode) {struct node *wn, *nwn;/* local fixup node, walk node, new */ -uint32_t value_32; +fdt32_t value_32;char **compp;int i, depth;
scripts/dtc/srcpos.c +1 -1
@@ -252,7 +252,7 @@ srcpos_string(struct srcpos *pos)const char *fname ="<no-file>" ;char *pos_str; -if (pos) +if (pos->file && pos->file->name) fname = pos->file->name;
scripts/dtc/srcpos.h +5 -6
@@ -22,6 +22,7 @@#include <stdio.h> #include <stdbool.h> +#include "util.h" struct srcfile_state {FILE *f;
@@ -106,12 +107,10 @@ extern void srcpos_update(struct srcpos *pos, const char *text, int len);extern struct srcpos *srcpos_copy (struct srcpos *pos);extern char *srcpos_string (struct srcpos *pos); -extern void srcpos_verror (struct srcpos *pos,const char *prefix, -const char *fmt,va_list va) - __attribute__((format (printf,3 ,0 ))); -extern void srcpos_error (struct srcpos *pos,const char *prefix, -const char *fmt, ...) - __attribute__((format (printf,3 ,4 ))); +extern void PRINTF(3, 0) srcpos_verror(struct srcpos *pos, const char *prefix, + const char *fmt, va_list va); +extern void PRINTF(3, 4) srcpos_error(struct srcpos *pos, const char *prefix, + const char *fmt, ...); extern void srcpos_set_line(char *f, int l);
scripts/dtc/treesource.c +3 -3
@@ -137,7 +137,7 @@ static void write_propval_string(FILE *f, struct data val)static void write_propval_cells (FILE *f,struct data val) {void *propend = val.val + val.len; -cell_t *cp = (cell_t *)val.val; +fdt32_t *cp = (fdt32_t *)val.val;struct marker *m = val.markers;fprintf (f,"<" );
@@ -275,8 +275,8 @@ void dt_to_source(FILE *f, struct dt_info *dti)for_each_label (re->labels, l)fprintf (f,"%s: " , l->label);fprintf (f,"/memreserve/\t0x%016llx 0x%016llx;\n" , - (unsigned long long )re->re.address, - (unsigned long long )re->re.size); + (unsigned long long )re->address, + (unsigned long long )re->size); }write_tree_source_node (f, dti->dt,0 );
scripts/dtc/util.c +6 -5
@@ -396,7 +396,7 @@ void utilfdt_print_data(const char *data, int len) }while (s < data + len); }else if ((len %4 ) ==0 ) { -const uint32_t *cell = (const uint32_t *)data; +const fdt32_t *cell = (const fdt32_t *)data;printf (" = <" );for (i =0 , len /=4 ; i < len; i++)
@@ -412,15 +412,16 @@ void utilfdt_print_data(const char *data, int len) } } -void util_version (void ) +void NORETURN util_version(void) {printf ("Version: %s\n" ,DTC_VERSION );exit (0 ); } -void util_usage (const char *errmsg,const char *synopsis, -const char *short_opts,struct option const long_opts[], -const char *const opts_help[]) +void NORETURN util_usage(const char *errmsg, const char *synopsis, +const char *short_opts, +struct option const long_opts[], +const char *const opts_help[]) {FILE *fp = errmsg ? stderr : stdout;const char a_arg[] ="<arg>" ;
scripts/dtc/util.h +17 -7
@@ -25,9 +25,17 @@* USA */ +#ifdef __GNUC__ +#define PRINTF (i, j) __attribute__((format (printf, i, j))) +#define NORETURN __attribute__((noreturn)) +#else +#define PRINTF (i, j) +#define NORETURN +#endif +#define ARRAY_SIZE (x) (sizeof(x) / sizeof((x)[0])) -static inline void __attribute__((noreturn))die (const char *str, ...) +static inline void NORETURN PRINTF(1, 2) die(const char *str, ...) {va_list ap;
@@ -53,13 +61,14 @@ static inline void *xrealloc(void *p, size_t len)void *new =realloc (p, len);if (!new) -die ("realloc() failed (len=%d)\n" , len); +die ("realloc() failed (len=%zd)\n" , len);return new; }extern char *xstrdup (const char *s); -extern int xasprintf (char **strp,const char *fmt, ...); + +extern int PRINTF(2, 3) xasprintf(char **strp, const char *fmt, ...); extern char *join_path(const char *path, const char *name);/**
@@ -188,7 +197,7 @@ void utilfdt_print_data(const char *data, int len);/** * Show source version and exit */ -void util_version (void ) __attribute__((noreturn)); +void NORETURN util_version(void);/** * Show usage and exit
@@ -202,9 +211,10 @@ void util_version(void) __attribute__((noreturn));* @param long_opts The structure of long options * @param opts_help An array of help strings (should align with long_opts) */ -void util_usage (const char *errmsg,const char *synopsis, -const char *short_opts,struct option const long_opts[], -const char *const opts_help[]) __attribute__((noreturn)); +void NORETURN util_usage(const char *errmsg, const char *synopsis, +const char *short_opts, +struct option const long_opts[], +const char *const opts_help[]);/** * Show usage and exit
scripts/dtc/version_gen.h +1 -1
@@ -1 +1 @@ -#define DTC_VERSION "DTC 1.4.2-g0931cea3" +#define DTC_VERSION "DTC 1.4.4-g756ffc4f"
Signature · 1 line
2.10.1
Rob Herring
maintainerPATCH 3/3 dtc: update warning settings for new bus and node/property name checks
In reply to Rob Herringdtc gained new warnings checking PCI and simple buses, unit address formatting, and stricter node and property name checking. Disable the new dtc warnings by default as there are 1000s. As before warnings are enabled with W=1 or W=2. The strict node and property name checks are a bit subjective, so they are only enabled for W=2.
--- scripts/Makefile.lib | 9 ++++++++- scripts/dtc/update-dtc-source.sh | 1 + 2 files changed, 9 insertions(+), 1 deletion(-)
scripts/Makefile.lib +8 -1
@@ -280,7 +280,14 @@ DTC ?= $(objtree)/scripts/dtc/dtc # Disable noisy checks by default ifeq ($(KBUILD_ENABLE_EXTRA_GCC_CHECKS),) -DTC_FLAGS += -Wno-unit_address_vs_reg +DTC_FLAGS += -Wno-unit_address_vs_reg \ + -Wno-simple_bus_reg \ + -Wno-unit_address_format +endif + +ifeq ($(KBUILD_ENABLE_EXTRA_GCC_CHECKS),2) +DTC_FLAGS += -Wnode_name_chars_strict \ + -Wproperty_name_chars_strict endif # Generate an assembly file to wrap the output of the device tree compiler
Signature · 1 line
2.10.1
Quoted 7 lines · Rob Herring
This series syncs dtc with current mainline. The primary motivation is to pull in the new checks I've worked on. This gives lots of new warnings which are turned off by default.
Arm-soc folks, I've left the PCI checks enabled as they are pretty much all real errors and there aren't that many (about 1200, but that's lots of duplicates). I have a patch for some of them.
Out of curiosity, should we think about making dtc a git submodule and have some magic in scripts/update-dtc-source.sh to sync it to a desired commit?
Quoted 31 lines
Rob
Rob Herring (3):
scripts/dtc: automate getting dtc version and log in update scriptscripts/dtc: Update to upstream version v1.4.4-8-g756ffc4f52f6
dtc: update warning settings for new bus and node/property name checksscripts/Makefile.lib | 9 +- scripts/dtc/checks.c | 361 +++++++++++++++++++++++++++++++---- scripts/dtc/data.c | 16 +- scripts/dtc/dtc-lexer.l | 3 +- scripts/dtc/dtc-lexer.lex.c_shipped | 77 ++++---- scripts/dtc/dtc-parser.tab.c_shipped | 6 +- scripts/dtc/dtc-parser.y | 6 +- scripts/dtc/dtc.c | 9 +- scripts/dtc/dtc.h | 11 +- scripts/dtc/flattree.c | 58 +++--- scripts/dtc/libfdt/fdt_rw.c | 3 +- scripts/dtc/libfdt/libfdt.h | 51 ++++- scripts/dtc/libfdt/libfdt_env.h | 26 +-- scripts/dtc/livetree.c | 22 ++- scripts/dtc/srcpos.c | 2 +- scripts/dtc/srcpos.h | 11 +- scripts/dtc/treesource.c | 6 +- scripts/dtc/update-dtc-source.sh | 20 +- scripts/dtc/util.c | 11 +- scripts/dtc/util.h | 24 ++- scripts/dtc/version_gen.h | 2 +- 21 files changed, 550 insertions(+), 184 deletions(-)
Signature · 1 line
Florian
Rob Herring
maintainerQuoted 5 lines · Florian Fainelli
Quoted 4 lines · Rob Herring
This series syncs dtc with current mainline. The primary motivation is to pull in the new checks I've worked on. This gives lots of new warnings which are turned off by default.
Quoted 7 lines
Quoted 3 lines
Arm-soc folks, I've left the PCI checks enabled as they are pretty much all real errors and there aren't that many (about 1200, but that's lots of duplicates). I have a patch for some of them.
Out of curiosity, should we think about making dtc a git submodule and have some magic in
scripts/update-dtc-source.shto sync it to a desired commit?
I'd be fine with that though all of dtc is not imported and I don't really want to be the first to try to add a git submodule to the kernel. Not everyone is a fan I think.
Rob
Quoted 7 lines · Rob Herring
This series syncs dtc with current mainline. The primary motivation is to pull in the new checks I've worked on. This gives lots of new warnings which are turned off by default.
Arm-soc folks, I've left the PCI checks enabled as they are pretty much all real errors and there aren't that many (about 1200, but that's lots of duplicates). I have a patch for some of them.
Yay for better warnings!
But as with all changes of this kind, when new warnings are introduced please give people some time to remove them without turning them on by default. We had a cycle like that already.
Main reason is that it becomes too hard to spot new warnings when they come in if the logs are flooded with 1200 existing warnings.
How many of them do you have patches for, per chance? If we can see them show up quickly the answer to the above might be a bit different.
-Olof
Rob Herring
maintainerQuoted 9 lines · Olof Johansson
Quoted 7 lines · Rob Herring
This series syncs dtc with current mainline. The primary motivation is to pull in the new checks I've worked on. This gives lots of new warnings which are turned off by default.
Arm-soc folks, I've left the PCI checks enabled as they are pretty much all real errors and there aren't that many (about 1200, but that's lots of duplicates). I have a patch for some of them.
Quoted 5 lines
Yay for better warnings!
But as with all changes of this kind, when new warnings are introduced please give people some time to remove them without turning them on by default. We had a cycle like that already.
Which I quickly fixed and learned my lesson. That's why I tried getting this out earlier as well.
Quoted 2 lines
Main reason is that it becomes too hard to spot new warnings when they come in if the logs are flooded with 1200 existing warnings.
Yeah. Since almost everything is an include, the warnings really multiply.
Quoted 2 lines
How many of them do you have patches for, per chance? If we can see them show up quickly the answer to the above might be a bit different.
Okay, I lied or lost them... It looks like it is 79 unique warnings for arm. I'll take a stab at fixing them.
Rob
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Rob Herring
maintainerQuoted 22 lines · Rob Herring
Quoted 9 lines · Olof Johansson
Quoted 7 lines · Rob Herring
This series syncs dtc with current mainline. The primary motivation is to pull in the new checks I've worked on. This gives lots of new warnings which are turned off by default.
Arm-soc folks, I've left the PCI checks enabled as they are pretty much all real errors and there aren't that many (about 1200, but that's lots of duplicates). I have a patch for some of them.
Quoted 5 lines
Yay for better warnings!
But as with all changes of this kind, when new warnings are introduced please give people some time to remove them without turning them on by default. We had a cycle like that already.
Which I quickly fixed and learned my lesson. That's why I tried getting this out earlier as well.
Quoted 2 lines
Main reason is that it becomes too hard to spot new warnings when they come in if the logs are flooded with 1200 existing warnings.
Quoted 7 lines
Yeah. Since almost everything is an include, the warnings really multiply.
Quoted 2 lines
How many of them do you have patches for, per chance? If we can see them show up quickly the answer to the above might be a bit different.
Okay, I lied or lost them... It looks like it is 79 unique warnings for arm. I'll take a stab at fixing them.
Well, after all the fixes, there's still some false positives, so I'm going to turn off the warnings by default anyway.
Rob