scripts/dtc: add fdt_overlay.c and fdt_addresses.c to sync script
Rob Herring
maintainerPATCH 1/2 scripts/dtc: add fdt_overlay.c and fdt_addresses.c to sync script
libfdt has gained some new files. We need to include them in the kernel's copy.
--- scripts/dtc/update-dtc-source.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
scripts/dtc/update-dtc-source.sh +3 -1
@@ -34,7 +34,9 @@ DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c srcpos.h treesource.c util.c util.h version_gen.h Makefile.dtc \ dtc-lexer.l dtc-parser.y" DTC_GENERATED="dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h" -LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_empty_tree.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h" +LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c \ + fdt_overlay.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/'
Signature · 6 lines
2.11.0 -- 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
maintainerPATCH 2/2 scripts/dtc: Update to upstream version v1.4.5-3-gb1a60033c110
This adds the following commits from upstream:
b1a60033c110 tests: Add a test for overlays syntactic sugar 737b2df39cc8 overlay: Add syntactic sugar version of overlays 497432fd2131 checks: Use proper format modifier for size_t 22a65c5331c2 dtc: Bump version to v1.4.5c575d8059fff Add fdtoverlay to .gitignoreb6a6f9490d19 fdtoverlay: Sanity check blob size8c1eb1526d2d pylibfdt: Use Python2 explicitlyee3d26f6960b checks: add interrupts property checkc1e7738988f5 checks: add gpio binding properties checkb3bbac02d5e3 checks: add phandle with arg property checks fe50bd1ecc1d fdtget: Split out cell list display into a new function 62d812308d11 README: Add a note about test_tree1.dts5bed86aee9e8 pylibfdt: Add support for fdt_subnode_offset() 46f31b65b3b3 pylibfdt: Add support for fdt_node_offset_by_phandle() a3ae43723687 pylibfdt: Add support for fdt_parent_offset() a198af80344c pylibfdt: Add support for fdt_get_phandle()b9eba92ea50f tests: Return a failure code when any tests fail 155faf6cc209 pylibfdt: Use local pylibfdt module50e5cd07f325 pylibfdt: Add a test for use of uint32_tab78860f09f5 pylibfdt: Add stdint include to fix uint32_t 36f511fb1113 tests: Add stacked overlay tests on fdtoverlay 1bb00655d3e5 fdt: Allow stacked overlays phandle references a33c2247ac8d Introduce fdt_setprop_placeholder() method0016f8c2aa32 dtc: change default phandles to ePAPR style instead of both e3b9a9588a35 tests: fdtoverlay unit test42409146f2db fdtoverlay: A tool that applies overlaysaae22722fc8d manual: Document missing options13ce6e1c2fc4 dtc: fix sprintf() format string error, again d990b8013889 Makefile: Fix build on MSYS2 and Cygwin51f56dedf8ea Clean up shared library compile/link options 21a2bc896e3d Suppress expected error message in fdtdump test 2a42b14d0d03 dtc: check.c fix compile errora10cb3c818d3 Fix get_node_by_path string equality check548aea2c436a fdtdump: Discourage use of fdtdumpc2258841a785 fdtdump: Fix over-zealous version check9067ee4be0e6 Fix a few whitespace and style nitse56f2b07be38 pylibfdt: Use setup.py to build the swig file 896f1c133265 pylibfdt: Use Makefile constructs to implement NO_PYTHON 90db6d9989ca pylibfdt: Allow setup.py to operate stand-alone e20d9658cd8f Add Coverity Scan supportb04a2cf08862 pylibfdt: Fix code style in setup.py1c5170d3a466 pylibfdt: Rename libfdt.swig to libfdt.i580a9f6c2880 Add a libfdt function to write a property placeholder ab15256d8d02 pylibfdt: Use the call function to simplify the Makefile 9f2e3a3a1f19 pylibfdt: Use the correct libfdt version in the module e91c652af215 pylibfdt: Enable installation of Python module 8a892fd85d94 pylibfdt: Allow building to be disabled741cdff85d3e .travis.yml: Add builds with and without Python library prerequisites 14c4171f4f9a pylibfdt: Use package_dir to set the package directory 89a5062ab231 pylibfdt: Use environment to pass C flags and files 4e0e0d049757 pylibfdt: Allow pkg-config to be supplied in the environment 6afd7d9688f5 Correct typo: s/pylibgfdt/pylibfdt/
---
scripts/dtc/checks.c | 282 +++++++++++- scripts/dtc/dtc-lexer.lex.c_shipped | 10 +- scripts/dtc/dtc-parser.tab.c_shipped | 430 ++++++++--------- scripts/dtc/dtc-parser.y | 20 +- scripts/dtc/dtc.c | 2 +- scripts/dtc/dtc.h | 3 + scripts/dtc/libfdt/fdt_addresses.c | 96 ++++ scripts/dtc/libfdt/fdt_empty_tree.c | 1 - scripts/dtc/libfdt/fdt_overlay.c | 861 +++++++++++++++++++++++++++++++++++ scripts/dtc/libfdt/fdt_ro.c | 4 +- scripts/dtc/libfdt/fdt_rw.c | 24 +- scripts/dtc/libfdt/fdt_sw.c | 16 +- scripts/dtc/libfdt/fdt_wip.c | 4 +- scripts/dtc/libfdt/libfdt.h | 47 ++ scripts/dtc/livetree.c | 31 +- scripts/dtc/version_gen.h | 2 +- 16 files changed, 1603 insertions(+), 230 deletions(-) create mode 100644 scripts/dtc/libfdt/fdt_addresses.c create mode 100644 scripts/dtc/libfdt/fdt_overlay.c
scripts/dtc/checks.c +281 -1
@@ -873,7 +873,7 @@ static void check_simple_bus_reg(struct check *c, struct dt_info *dti, struct nowhile (size--) reg = (reg <<32 ) |fdt32_to_cpu (*(cells++)); -snprintf (unit_addr,sizeof (unit_addr),"%llx" , (unsigned long long )reg); +snprintf (unit_addr,sizeof (unit_addr),"%" PRIx64, reg);if (!streq (unitname, unit_addr))FAIL (c, dti,"Node %s simple-bus unit address format error, expected \"%s\"" , node->fullpath, unit_addr);
@@ -956,6 +956,265 @@ static void check_obsolete_chosen_interrupt_controller(struct check *c,WARNING (obsolete_chosen_interrupt_controller, check_obsolete_chosen_interrupt_controller,NULL ); +struct provider { +const char *prop_name; +const char *cell_name; +bool optional; +}; + +static void check_property_phandle_args (struct check *c, +struct dt_info *dti, +struct node *node, +struct property *prop, +const struct provider *provider) +{ +struct node *root = dti->dt; +int cell, cellsize =0 ; + +if (prop->val.len %sizeof (cell_t)) { +FAIL (c, dti,"property '%s' size (%d) is invalid, expected multiple of %zu in node %s" , + prop->name, prop->val.len,sizeof (cell_t), node->fullpath); +return ; + } + +for (cell =0 ; cell < prop->val.len /sizeof (cell_t); cell += cellsize +1 ) { +struct node *provider_node; +struct property *cellprop; +int phandle; + + phandle =propval_cell_n (prop, cell); +/* +* Some bindings use a cell value 0 or -1 to skip over optional +* entries when each index position has a specific definition. +*/ +if (phandle ==0 || phandle ==-1 ) { + cellsize =0 ; +continue ; + } + +/* If we have markers, verify the current cell is a phandle */ +if (prop->val.markers) { +struct marker *m = prop->val.markers; +for_each_marker_of_type (m,REF_PHANDLE ) { +if (m->offset == (cell *sizeof (cell_t))) +break ; + } +if (!m) +FAIL (c, dti,"Property '%s', cell %d is not a phandle reference in %s" , + prop->name, cell, node->fullpath); + } + + provider_node =get_node_by_phandle (root, phandle); +if (!provider_node) { +FAIL (c, dti,"Could not get phandle node for %s:%s(cell %d)" , + node->fullpath, prop->name, cell); +break ; + } + + cellprop =get_property (provider_node, provider->cell_name); +if (cellprop) { + cellsize =propval_cell (cellprop); + }else if (provider->optional) { + cellsize =0 ; + }else { +FAIL (c, dti,"Missing property '%s' in node %s or bad phandle (referred from %s:%s[%d])" , + provider->cell_name, + provider_node->fullpath, + node->fullpath, prop->name, cell); +break ; + } + +if (prop->val.len < ((cell + cellsize +1 ) *sizeof (cell_t))) { +FAIL (c, dti,"%s property size (%d) too small for cell size %d in %s" , + prop->name, prop->val.len, cellsize, node->fullpath); + } + } +} + +static void check_provider_cells_property (struct check *c, +struct dt_info *dti, +struct node *node) +{ +struct provider *provider = c->data; +struct property *prop; + + prop =get_property (node, provider->prop_name); +if (!prop) +return ; + +check_property_phandle_args (c, dti, node, prop, provider); +} +#define WARNING_PROPERTY_PHANDLE_CELLS (nm, propname, cells_name, ...) \ + static struct provider nm##_provider = { (propname), (cells_name), __VA_ARGS__ }; \ + WARNING(nm##_property, check_provider_cells_property, &nm##_provider, &phandle_references); + +WARNING_PROPERTY_PHANDLE_CELLS (clocks,"clocks" ,"#clock-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (cooling_device,"cooling-device" ,"#cooling-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (dmas,"dmas" ,"#dma-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (hwlocks,"hwlocks" ,"#hwlock-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (interrupts_extended,"interrupts-extended" ,"#interrupt-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (io_channels,"io-channels" ,"#io-channel-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (iommus,"iommus" ,"#iommu-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (mboxes,"mboxes" ,"#mbox-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (msi_parent,"msi-parent" ,"#msi-cells" , true); +WARNING_PROPERTY_PHANDLE_CELLS (mux_controls,"mux-controls" ,"#mux-control-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (phys,"phys" ,"#phy-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (power_domains,"power-domains" ,"#power-domain-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (pwms,"pwms" ,"#pwm-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (resets,"resets" ,"#reset-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (sound_dais,"sound-dais" ,"#sound-dai-cells" ); +WARNING_PROPERTY_PHANDLE_CELLS (thermal_sensors,"thermal-sensors" ,"#thermal-sensor-cells" ); + +static bool prop_is_gpio (struct property *prop) +{ +char *str; + +/* +* *-gpios and *-gpio can appear in property names, +* so skip over any false matches (only one known ATM) +*/ +if (strstr (prop->name,"nr-gpio" )) +return false; + + str =strrchr (prop->name,'-' ); +if (str) + str++; +else + str = prop->name; +if (!(streq (str,"gpios" ) ||streq (str,"gpio" ))) +return false; + +return true; +} + +static void check_gpios_property (struct check *c, +struct dt_info *dti, +struct node *node) +{ +struct property *prop; + +/* Skip GPIO hog nodes which have 'gpios' property */ +if (get_property (node,"gpio-hog" )) +return ; + +for_each_property (node, prop) { +struct provider provider; + +if (!prop_is_gpio (prop)) +continue ; + + provider.prop_name = prop->name; + provider.cell_name ="#gpio-cells" ; + provider.optional = false; +check_property_phandle_args (c, dti, node, prop, &provider); + } + +} +WARNING (gpios_property, check_gpios_property,NULL , &phandle_references); + +static void check_deprecated_gpio_property (struct check *c, +struct dt_info *dti, +struct node *node) +{ +struct property *prop; + +for_each_property (node, prop) { +char *str; + +if (!prop_is_gpio (prop)) +continue ; + + str =strstr (prop->name,"gpio" ); +if (!streq (str,"gpio" )) +continue ; + +FAIL (c, dti,"'[*-]gpio' is deprecated, use '[*-]gpios' instead for %s:%s" , + node->fullpath, prop->name); + } + +} +CHECK (deprecated_gpio_property, check_deprecated_gpio_property,NULL ); + +static bool node_is_interrupt_provider (struct node *node) +{ +struct property *prop; + + prop =get_property (node,"interrupt-controller" ); +if (prop) +return true; + + prop =get_property (node,"interrupt-map" ); +if (prop) +return true; + +return false; +} +static void check_interrupts_property (struct check *c, +struct dt_info *dti, +struct node *node) +{ +struct node *root = dti->dt; +struct node *irq_node =NULL , *parent = node; +struct property *irq_prop, *prop =NULL ; +int irq_cells, phandle; + + irq_prop =get_property (node,"interrupts" ); +if (!irq_prop) +return ; + +if (irq_prop->val.len %sizeof (cell_t)) +FAIL (c, dti,"property '%s' size (%d) is invalid, expected multiple of %zu in node %s" , + irq_prop->name, irq_prop->val.len,sizeof (cell_t), + node->fullpath); + +while (parent && !prop) { +if (parent != node &&node_is_interrupt_provider (parent)) { + irq_node = parent; +break ; + } + + prop =get_property (parent,"interrupt-parent" ); +if (prop) { + phandle =propval_cell (prop); + irq_node =get_node_by_phandle (root, phandle); +if (!irq_node) { +FAIL (c, dti,"Bad interrupt-parent phandle for %s" , + node->fullpath); +return ; + } +if (!node_is_interrupt_provider (irq_node)) +FAIL (c, dti, +"Missing interrupt-controller or interrupt-map property in %s" , + irq_node->fullpath); + +break ; + } + + parent = parent->parent; + } + +if (!irq_node) { +FAIL (c, dti,"Missing interrupt-parent for %s" , node->fullpath); +return ; + } + + prop =get_property (irq_node,"#interrupt-cells" ); +if (!prop) { +FAIL (c, dti,"Missing #interrupt-cells in interrupt-parent %s" , + irq_node->fullpath); +return ; + } + + irq_cells =propval_cell (prop); +if (irq_prop->val.len % (irq_cells *sizeof (cell_t))) { +FAIL (c, dti, +"interrupts size is (%d), expected multiple of %d in %s" , + irq_prop->val.len, (int )(irq_cells *sizeof (cell_t)), + node->fullpath); + } +} +WARNING (interrupts_property, check_interrupts_property, &phandle_references); +static struct check *check_table[] = { &duplicate_node_names, &duplicate_property_names, &node_name_chars, &node_name_format, &property_name_chars,
@@ -987,6 +1246,27 @@ static struct check *check_table[] = { &avoid_default_addr_size, &obsolete_chosen_interrupt_controller, + &clocks_property, + &cooling_device_property, + &dmas_property, + &hwlocks_property, + &interrupts_extended_property, + &io_channels_property, + &iommus_property, + &mboxes_property, + &msi_parent_property, + &mux_controls_property, + &phys_property, + &power_domains_property, + &pwms_property, + &resets_property, + &sound_dais_property, + &thermal_sensors_property, + + &deprecated_gpio_property, + &gpios_property, + &interrupts_property, + &always_fail, };
scripts/dtc/dtc-lexer.lex.c_shipped +5 -5
@@ -1397,7 +1397,7 @@ static int yy_get_next_buffer (void) { char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = (yytext_ptr); - yy_size_t number_to_move, i; + int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
@@ -1426,7 +1426,7 @@ static int yy_get_next_buffer (void) /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1; + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++);
@@ -1508,7 +1508,7 @@ static int yy_get_next_buffer (void) else ret_val = EOB_ACT_CONTINUE_SCAN; - if ((int) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
@@ -1987,10 +1987,10 @@ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) YY_BUFFER_STATE b; char *buf; yy_size_t n; - yy_size_t i; + int i; /* Get memory for full buffer, including space for trailing EOB's. */ - n = (yy_size_t) _yybytes_len + 2; + n = (yy_size_t) (_yybytes_len + 2); buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
scripts/dtc/dtc-parser.tab.c_shipped +224 -206
745 lines not on this page · raw message
scripts/dtc/dtc-parser.y +17 -3
@@ -182,10 +182,19 @@ devicetree: { struct node *target = get_node_by_ref($1, $2); - if (target) + if (target) { merge_nodes(target, $3); - else - ERROR(&@2, "Label or path %s not found", $2); + } else { + /* + * We rely on the rule being always: + * versioninfo plugindecl memreserves devicetree + * so $-1 is what we want (plugindecl) + */ + if ($<flags>-1 & DTSF_PLUGIN) + add_orphan_node($1, $3, $2); + else + ERROR(&@2, "Label or path %s not found", $2); + } $$ = $1; } | devicetree DT_DEL_NODE DT_REF ';'
@@ -200,6 +209,11 @@ devicetree: $$ = $1; } + | /* empty */ + { + /* build empty node */ + $$ = name_node(build_node(NULL, NULL), ""); + } ; nodedef:
scripts/dtc/dtc.c +1 -1
@@ -31,7 +31,7 @@ int reservenum; /* Number of memory reservation slots */int minsize;/* Minimum blob size */ int padsize;/* Additional padding to blob */ int alignsize;/* Additional padding to blob accroding to the alignsize */ -int phandle_format =PHANDLE_BOTH ;/* Use linux,phandle or phandle properties */ +int phandle_format =PHANDLE_EPAPR ;/* Use linux,phandle or phandle properties */ int generate_symbols;/* enable symbols & fixup support */ int generate_fixups;/* suppress generation of fixups on symbol support */ int auto_label_aliases;/* auto generate labels -> aliases */
scripts/dtc/dtc.h +3 -0
@@ -31,6 +31,7 @@#include <ctype.h> #include <errno.h> #include <unistd.h> +#include <inttypes.h> #include <libfdt_env.h> #include <fdt.h>
@@ -202,6 +203,7 @@ struct node *build_node_delete(void);struct node *name_node (struct node *node,char *name);struct node *chain_node (struct node *first,struct node *list);struct node *merge_nodes (struct node *old_node,struct node *new_node); +void add_orphan_node (struct node *old_node,struct node *new_node,char *ref);void add_property (struct node *node,struct property *prop);void delete_property_by_name (struct node *node,char *name);
@@ -215,6 +217,7 @@ void append_to_property(struct node *node,const char *get_unitname (struct node *node);struct property *get_property (struct node *node,const char *propname);cell_t propval_cell (struct property *prop); +cell_t propval_cell_n (struct property *prop,int n);struct property *get_property_by_label (struct node *tree,const char *label,struct node **node); struct marker *get_marker_label(struct node *tree, const char *label,
scripts/dtc/libfdt/fdt_addresses.c new file +96 -0
96 lines not on this page · raw message
scripts/dtc/libfdt/fdt_empty_tree.c +0 -1
@@ -81,4 +81,3 @@ int fdt_create_empty_tree(void *buf, int bufsize)return fdt_open_into (buf, buf, bufsize); } -
scripts/dtc/libfdt/fdt_overlay.c new file +861 -0
861 lines not on this page · raw message
scripts/dtc/libfdt/fdt_ro.c +2 -2
@@ -60,7 +60,7 @@ static int _fdt_nodename_eq(const void *fdt, int offset, {const char *p =fdt_offset_ptr (fdt, offset +FDT_TAGSIZE , len+1 ); -if (! p) +if (!p)/* short match */ return 0 ;
@@ -327,7 +327,7 @@ const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,const struct fdt_property *prop; prop =fdt_get_property_namelen (fdt, nodeoffset, name, namelen, lenp); -if (! prop) +if (!prop)return NULL ;return prop->data;
scripts/dtc/libfdt/fdt_rw.c +19 -5
@@ -207,7 +207,7 @@ static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name,int err; *prop =fdt_get_property_w (fdt, nodeoffset, name, &oldlen); -if (! (*prop)) +if (!*prop)return oldlen; if ((err = _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen),
@@ -269,8 +269,8 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name)return 0 ; } -int fdt_setprop (void *fdt,int nodeoffset,const char *name, -const void *val,int len) +int fdt_setprop_placeholder (void *fdt,int nodeoffset,const char *name, +int len,void **prop_data) {struct fdt_property *prop;int err;
@@ -283,8 +283,22 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name,if (err)return err; + *prop_data = prop->data; +return 0 ; +} + +int fdt_setprop (void *fdt,int nodeoffset,const char *name, +const void *val,int len) +{ +void *prop_data; +int err; + + err =fdt_setprop_placeholder (fdt, nodeoffset, name, len, &prop_data); +if (err) +return err; +if (len) -memcpy (prop->data, val, len); +memcpy (prop_data, val, len);return 0 ; }
@@ -323,7 +337,7 @@ int fdt_delprop(void *fdt, int nodeoffset, const char *name)FDT_RW_CHECK_HEADER (fdt); prop =fdt_get_property_w (fdt, nodeoffset, name, &len); -if (! prop) +if (!prop)return len; proplen =sizeof (*prop) +FDT_TAGALIGN (len);
scripts/dtc/libfdt/fdt_sw.c +14 -2
@@ -220,7 +220,7 @@ static int _fdt_find_add_string(void *fdt, const char *s)return offset; } -int fdt_property (void *fdt,const char *name,const void *val,int len) +int fdt_property_placeholder (void *fdt,const char *name,int len,void **valp) {struct fdt_property *prop;int nameoff;
@@ -238,7 +238,19 @@ int fdt_property(void *fdt, const char *name, const void *val, int len) prop->tag =cpu_to_fdt32 (FDT_PROP ); prop->nameoff =cpu_to_fdt32 (nameoff); prop->len =cpu_to_fdt32 (len); -memcpy (prop->data, val, len); + *valp = prop->data; +return 0 ; +} + +int fdt_property (void *fdt,const char *name,const void *val,int len) +{ +void *ptr; +int ret; + + ret =fdt_property_placeholder (fdt, name, len, &ptr); +if (ret) +return ret; +memcpy (ptr, val, len);return 0 ; }
scripts/dtc/libfdt/fdt_wip.c +2 -2
@@ -82,7 +82,7 @@ int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,int proplen; propval =fdt_getprop (fdt, nodeoffset, name, &proplen); -if (! propval) +if (!propval)return proplen;if (proplen != len)
@@ -107,7 +107,7 @@ int fdt_nop_property(void *fdt, int nodeoffset, const char *name)int len; prop =fdt_get_property_w (fdt, nodeoffset, name, &len); -if (! prop) +if (!prop)return len;_fdt_nop_region (prop, len +sizeof (*prop));
scripts/dtc/libfdt/libfdt.h +47 -0
59 lines not on this page · raw message
scripts/dtc/livetree.c +30 -1
@@ -216,6 +216,28 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)return old_node; } +void add_orphan_node (struct node *dt,struct node *new_node,char *ref) +{ +static unsigned int next_orphan_fragment =0 ; +struct node *node; +struct property *p; +struct data d = empty_data; +char *name; + + d =data_add_marker (d,REF_PHANDLE , ref); + d =data_append_integer (d,0xffffffff ,32 ); + + p =build_property ("target" , d); + +xasprintf (&name,"fragment@%u" , + next_orphan_fragment++); +name_node (new_node,"__overlay__" ); + node =build_node (p, new_node); +name_node (node, name); + +add_child (dt, node); +} +struct node *chain_node (struct node *first,struct node *list) {assert (first->next_sibling ==NULL );
@@ -396,6 +418,12 @@ cell_t propval_cell(struct property *prop)return fdt32_to_cpu (*((fdt32_t *)prop->val.val)); } +cell_t propval_cell_n (struct property *prop,int n) +{ +assert (prop->val.len /sizeof (cell_t) >= n); +return fdt32_to_cpu (*((fdt32_t *)prop->val.val + n)); +} +struct property *get_property_by_label (struct node *tree,const char *label,struct node **node) {
@@ -478,7 +506,8 @@ struct node *get_node_by_path(struct node *tree, const char *path) p =strchr (path,'/' );for_each_child (tree, child) { -if (p &&strneq (path, child->name, p-path)) +if (p && (strlen (child->name) == p-path) && +strneq (path, child->name, p-path))return get_node_by_path (child, p+1 );else if (!p &&streq (path, child->name))return child;
scripts/dtc/version_gen.h +1 -1
@@ -1 +1 @@ -#define DTC_VERSION "DTC 1.4.4-g756ffc4f" +#define DTC_VERSION "DTC 1.4.5-gb1a60033"
Signature · 1 line
2.11.0
Quoted 14 lines · Rob Herring
libfdt has gained some new files. We need to include them in the kernel's copy.
Reported-by Kyle Yan <[email protected]>Signed-off-by Rob Herring <[email protected]>--- scripts/dtc/update-dtc-source.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)scripts/dtc/update-dtc-source.sh +0
-0
scripts/dtc/update-dtc-source.sh DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c · line 39
Quoted 7 lines
scripts/dtc/update-dtc-source.sh +3
-1@@ -34,7 +34,9 @@ DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c srcpos.h treesource.c util.c util.h version_gen.h Makefile.dtc \ dtc-lexer.l dtc-parser.y" DTC_GENERATED="dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h" -LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_empty_tree.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h" +LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c \ + fdt_overlay.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c \ + fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h"
Should there be a patch #3 to update the kernel libfdt to include these new files that we're copying in too? That seems to be the main user in-tree of the libfdt C files, aside from the 'libfdt' targets under arch/{arm,powerpc}/boot/ Thanks!
Signature · 1 line
Tom
Rob Herring
maintainerQuoted 20 lines · Tom Rini
Quoted 18 lines · Rob Herring
libfdt has gained some new files. We need to include them in the kernel's copy.
Reported-by Kyle Yan <[email protected]>Signed-off-by Rob Herring <[email protected]>--- scripts/dtc/update-dtc-source.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)scripts/dtc/update-dtc-source.sh +0
-1@@ -34,7 +34,9 @@ DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c srcpos.h treesource.c util.c util.h version_gen.h Makefile.dtc \ dtc-lexer.l dtc-parser.y" DTC_GENERATED="dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h" -LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_empty_tree.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h"
Quoted 8 lines
scripts/dtc/update-dtc-source.sh DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c · line 39
Quoted 3 lines
scripts/dtc/update-dtc-source.sh +3
-0+LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c \ + fdt_overlay.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c \ + fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h"Should there be a patch #3 to update the kernel libfdt to include these new files that we're copying in too? That seems to be the main user in-tree of the libfdt C files, aside from the 'libfdt' targets under
arch/{arm,powerpc}/boot/Thanks!
Yes, good point. But we can add them when someone wants to use them. Adding them to the build will bloat the kernel because libfdt doesn't get built as a static lib (another problem to solve).
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
Quoted 30 lines · Rob Herring
Quoted 20 lines · Tom Rini
Quoted 18 lines · Rob Herring
libfdt has gained some new files. We need to include them in the kernel's copy.
Reported-by Kyle Yan <[email protected]>Signed-off-by Rob Herring <[email protected]>--- scripts/dtc/update-dtc-source.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)scripts/dtc/update-dtc-source.sh +0
-1@@ -34,7 +34,9 @@ DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c srcpos.h treesource.c util.c util.h version_gen.h Makefile.dtc \ dtc-lexer.l dtc-parser.y" DTC_GENERATED="dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h" -LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_empty_tree.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h"Quoted 8 lines
scripts/dtc/update-dtc-source.sh DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c · line 39
Quoted 3 lines
scripts/dtc/update-dtc-source.sh +3
-0+LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c \ + fdt_overlay.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c \ + fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h"Should there be a patch #3 to update the kernel libfdt to include these new files that we're copying in too? That seems to be the main user in-tree of the libfdt C files, aside from the 'libfdt' targets under
arch/{arm,powerpc}/boot/Thanks!
Quoted 3 lines
Yes, good point. But we can add them when someone wants to use them. Adding them to the build will bloat the kernel because libfdt doesn't get built as a static lib (another problem to solve).
Well, isn't the kernel starting to more widely use -ffunction-sections/-fdata-sections/--gc-unused-sections ?
Signature · 1 line
Tom
Rob Herring
maintainerQuoted 31 lines · Tom Rini
Quoted 30 lines · Rob Herring
Quoted 28 lines · Tom Rini
Quoted 14 lines · Rob Herring
libfdt has gained some new files. We need to include them in the kernel's copy.
Reported-by Kyle Yan <[email protected]>Signed-off-by Rob Herring <[email protected]>--- scripts/dtc/update-dtc-source.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)scripts/dtc/update-dtc-source.sh +0
-0scripts/dtc/update-dtc-source.sh DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c · line 39
Quoted 7 lines
scripts/dtc/update-dtc-source.sh +3
-1@@ -34,7 +34,9 @@ DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c srcpos.h treesource.c util.c util.h version_gen.h Makefile.dtc \ dtc-lexer.l dtc-parser.y" DTC_GENERATED="dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h" -LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_empty_tree.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h" +LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c \ + fdt_overlay.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c \ + fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h"Should there be a patch #3 to update the kernel libfdt to include these new files that we're copying in too? That seems to be the main user in-tree of the libfdt C files, aside from the 'libfdt' targets under
arch/{arm,powerpc}/boot/Thanks!
Quoted 6 lines
Quoted 3 lines
Yes, good point. But we can add them when someone wants to use them. Adding them to the build will bloat the kernel because libfdt doesn't get built as a static lib (another problem to solve).
Well, isn't the kernel starting to more widely use -ffunction-sections/-fdata-sections/--gc-unused-sections ?
Unfortunately, no. Nico Pitre did some work there, and I think it helps some but is incomplete because of how some of the kernel's assembly code works.
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
Quoted 36 lines · Rob Herring
Quoted 35 lines · Tom Rini
Quoted 33 lines · Rob Herring
Quoted 20 lines · Tom Rini
Quoted 18 lines · Rob Herring
libfdt has gained some new files. We need to include them in the kernel's copy.
Reported-by Kyle Yan <[email protected]>Signed-off-by Rob Herring <[email protected]>--- scripts/dtc/update-dtc-source.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)scripts/dtc/update-dtc-source.sh +0
-1@@ -34,7 +34,9 @@ DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c srcpos.h treesource.c util.c util.h version_gen.h Makefile.dtc \ dtc-lexer.l dtc-parser.y" DTC_GENERATED="dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h" -LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_empty_tree.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h"Quoted 8 lines
scripts/dtc/update-dtc-source.sh DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c · line 39
Quoted 3 lines
scripts/dtc/update-dtc-source.sh +3
-0+LIBFDT_SOURCE="Makefile.libfdt fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c \ + fdt_overlay.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c \ + fdt_wip.c libfdt.h libfdt_env.h libfdt_internal.h"Should there be a patch #3 to update the kernel libfdt to include these new files that we're copying in too? That seems to be the main user in-tree of the libfdt C files, aside from the 'libfdt' targets under
arch/{arm,powerpc}/boot/Thanks!Yes, good point. But we can add them when someone wants to use them. Adding them to the build will bloat the kernel because libfdt doesn't get built as a static lib (another problem to solve).
Quoted 6 lines
Quoted 2 lines
Well, isn't the kernel starting to more widely use -ffunction-sections/-fdata-sections/--gc-unused-sections ?
Unfortunately, no. Nico Pitre did some work there, and I think it helps some but is incomplete because of how some of the kernel's assembly code works.
Yes, dealing with all assembly is difficult in that case, over in U-Boot we have 'most' covered with manual labeling but ENTRY/ENDPROC got too complex. Oh well, I guess it's less of a concern in the kernel.
Signature · 1 line
Tom