* [PATCH 0/6] libfdt: Sync to upstream
@ 2016-10-02 23:59 Simon Glass
[not found] ` <1475452771-16230-1-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
0 siblings, 1 reply; 9+ messages in thread
From: Simon Glass @ 2016-10-02 23:59 UTC (permalink / raw)
To: U-Boot Mailing List
Cc: Simon Glass, Beniamino Galvani, Thierry Reding, Marek Vasut,
Nikita Kiryanov, Michal Simek, York Sun, Andrej Rosano,
Devicetree Compiler, Heiko Schocher, Albert Aribaud,
Andreas Dannenberg, Minkyu Kang, Robert P. J. Day, Stephen Warren,
Jagan Teki, Alexander Graf, Przemyslaw Marczak, Thomas Abraham,
Tom Warren <twarr>
In a few cases the upstream versions of functions first written for U-Boot
have landed in a slightly different form.
This includes a few patches to fix these as well as various minor changes to
reduce the delta.
David Gibson (1):
libfdt: Fix undefined behaviour in fdt_offset_ptr()
Hannes Schmelzer (1):
cmd/fdt: add possibilty to have 'extrasize' on fdt resize
Simon Glass (4):
libfdt: Sync up with upstream
libfdt: Bring in upstream stringlist functions
libfdt: Sync fdt_for_each_subnode() with upstream
libfdt: Drop inlining of fdt_path_offset()
arch/arm/mach-tegra/xusb-padctl-common.c | 18 +--
arch/arm/mach-uniphier/board_late_init.c | 5 +-
arch/x86/cpu/irq.c | 5 +-
board/compulab/cm_fx6/cm_fx6.c | 2 +-
cmd/fdt.c | 9 +-
common/fdt_support.c | 3 +-
common/image-fdt.c | 2 +-
common/image-fit.c | 21 ++--
common/image-sig.c | 8 +-
common/image.c | 19 ++--
drivers/clk/clk-uclass.c | 6 +-
drivers/core/device.c | 2 +-
drivers/gpio/dwapb_gpio.c | 3 +-
drivers/i2c/mxc_i2c.c | 2 +-
drivers/mailbox/mailbox-uclass.c | 6 +-
drivers/net/cpsw.c | 2 +-
drivers/net/keystone_net.c | 4 +-
drivers/net/mvpp2.c | 2 +-
drivers/net/sun8i_emac.c | 5 +-
drivers/pci/pci_tegra.c | 2 +-
drivers/phy/marvell/comphy_core.c | 2 +-
drivers/pinctrl/exynos/pinctrl-exynos.c | 9 +-
drivers/pinctrl/meson/pinctrl-meson.c | 4 +-
drivers/pinctrl/pinctrl-generic.c | 10 +-
drivers/pinctrl/pinctrl-uclass.c | 2 +-
drivers/reset/reset-uclass.c | 6 +-
drivers/spi/fsl_qspi.c | 2 +-
drivers/video/sunxi_display.c | 2 +-
include/fdt_support.h | 10 +-
include/libfdt.h | 187 ++++++++++++++++++-------------
lib/fdtdec.c | 4 +-
lib/libfdt/fdt.c | 13 ++-
lib/libfdt/fdt_overlay.c | 8 +-
lib/libfdt/fdt_ro.c | 119 ++++++++++++--------
lib/libfdt/fdt_rw.c | 4 +-
lib/libfdt/fdt_wip.c | 6 +-
test/overlay/cmd_ut_overlay.c | 5 +-
37 files changed, 298 insertions(+), 221 deletions(-)
--
2.8.0.rc3.226.g39d4020
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/6] libfdt: Fix undefined behaviour in fdt_offset_ptr()
[not found] ` <1475452771-16230-1-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
@ 2016-10-02 23:59 ` Simon Glass
2016-10-02 23:59 ` [PATCH 3/6] libfdt: Sync up with upstream Simon Glass
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Simon Glass @ 2016-10-02 23:59 UTC (permalink / raw)
To: U-Boot Mailing List; +Cc: David Gibson, Simon Glass, Devicetree Compiler
From: David Gibson <david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>
Using pointer arithmetic to generate a pointer outside a known object is,
technically, undefined behaviour in C. Unfortunately, we were using that
in fdt_offset_ptr() to detect overflows.
To fix this we need to do our bounds / overflow checking on the offsets
before constructing pointers from them.
Reported-by: David Binderman <dcb314-PkbjNfxxIARBDgjK7y7TUQ@public.gmane.org>
Signed-off-by: David Gibson <david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>
Signed-off-by: Simon Glass <sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
---
lib/libfdt/fdt.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/lib/libfdt/fdt.c b/lib/libfdt/fdt.c
index 96017a1..2055734 100644
--- a/lib/libfdt/fdt.c
+++ b/lib/libfdt/fdt.c
@@ -35,18 +35,19 @@ int fdt_check_header(const void *fdt)
const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len)
{
- const char *p;
+ unsigned absoffset = offset + fdt_off_dt_struct(fdt);
+
+ if ((absoffset < offset)
+ || ((absoffset + len) < absoffset)
+ || (absoffset + len) > fdt_totalsize(fdt))
+ return NULL;
if (fdt_version(fdt) >= 0x11)
if (((offset + len) < offset)
|| ((offset + len) > fdt_size_dt_struct(fdt)))
return NULL;
- p = _fdt_offset_ptr(fdt, offset);
-
- if (p + len < p)
- return NULL;
- return p;
+ return _fdt_offset_ptr(fdt, offset);
}
uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)
--
2.8.0.rc3.226.g39d4020
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/6] libfdt: Sync up with upstream
[not found] ` <1475452771-16230-1-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2016-10-02 23:59 ` [PATCH 2/6] libfdt: Fix undefined behaviour in fdt_offset_ptr() Simon Glass
@ 2016-10-02 23:59 ` Simon Glass
2016-10-02 23:59 ` [PATCH 4/6] libfdt: Bring in upstream stringlist functions Simon Glass
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Simon Glass @ 2016-10-02 23:59 UTC (permalink / raw)
To: U-Boot Mailing List; +Cc: Simon Glass, Devicetree Compiler
This includes small changes to the following functions, from upstream
commit 6d1832c:
- fdt_get_max_phandle() (upstream commit 84e0e134)
- fdt_node_check_compatible (upstream commit 53bf130b)
- fdt_setprop_inplace_namelen_partial() to remove useless brackets and
use idx instead of index
- _fdt_resize_property() to use idx instead of index
- _fdt_splice() (upstream commit d4c7c25c)
It also includes various typo fixes in libfdt.h
Signed-off-by: Simon Glass <sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
---
include/libfdt.h | 77 ++++++++++++++++++++++++++++++----------------------
lib/libfdt/fdt_ro.c | 10 +++----
lib/libfdt/fdt_rw.c | 4 ++-
lib/libfdt/fdt_wip.c | 6 ++--
4 files changed, 55 insertions(+), 42 deletions(-)
diff --git a/include/libfdt.h b/include/libfdt.h
index b6a400a..3b1c788 100644
--- a/include/libfdt.h
+++ b/include/libfdt.h
@@ -61,7 +61,7 @@
#define FDT_ERR_NOTFOUND 1
/* FDT_ERR_NOTFOUND: The requested node or property does not exist */
#define FDT_ERR_EXISTS 2
- /* FDT_ERR_EXISTS: Attemped to create a node or property which
+ /* FDT_ERR_EXISTS: Attempted to create a node or property which
* already exists */
#define FDT_ERR_NOSPACE 3
/* FDT_ERR_NOSPACE: Operation needed to expand the device
@@ -213,7 +213,7 @@ int fdt_next_subnode(const void *fdt, int offset);
#define __fdt_set_hdr(name) \
static inline void fdt_set_##name(void *fdt, uint32_t val) \
{ \
- struct fdt_header *fdth = (struct fdt_header*)fdt; \
+ struct fdt_header *fdth = (struct fdt_header *)fdt; \
fdth->name = cpu_to_fdt32(val); \
}
__fdt_set_hdr(magic);
@@ -288,11 +288,13 @@ const char *fdt_string(const void *fdt, int stroffset);
* @fdt: pointer to the device tree blob
*
* fdt_get_max_phandle retrieves the highest phandle in the given
- * device tree
+ * device tree. This will ignore badly formatted phandles, or phandles
+ * with a value of 0 or -1.
*
* returns:
* the highest phandle on success
- * 0, if an error occurred
+ * 0, if no phandle was found in the device tree
+ * -1, if an error occurred
*/
uint32_t fdt_get_max_phandle(const void *fdt);
@@ -356,8 +358,9 @@ int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
* returns:
* structure block offset of the requested subnode (>=0), on success
* -FDT_ERR_NOTFOUND, if the requested subnode does not exist
- * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
- * -FDT_ERR_BADMAGIC,
+ * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE
+ * tag
+ * -FDT_ERR_BADMAGIC,
* -FDT_ERR_BADVERSION,
* -FDT_ERR_BADSTATE,
* -FDT_ERR_BADSTRUCTURE,
@@ -366,13 +369,13 @@ int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
/**
- * fdt_path_offset_namelen - find a tree node based on substring
+ * fdt_path_offset_namelen - find a tree node by its full path
* @fdt: pointer to the device tree blob
* @path: full path of the node to locate
- * @namelen: number of characters of name to consider
+ * @namelen: number of characters of path to consider
*
- * Identical to fdt_path_offset(), but only examine the first
- * namelen characters of path for matching the node path.
+ * Identical to fdt_path_offset(), but only consider the first namelen
+ * characters of path as the path name.
*/
int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen);
@@ -389,7 +392,8 @@ int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen);
* address).
*
* returns:
- * structure block offset of the node with the requested path (>=0), on success
+ * structure block offset of the node with the requested path (>=0), on
+ * success
* -FDT_ERR_BADPATH, given path does not begin with '/' or is invalid
* -FDT_ERR_NOTFOUND, if the requested node does not exist
* -FDT_ERR_BADMAGIC,
@@ -416,10 +420,12 @@ static inline int fdt_path_offset(const void *fdt, const char *path)
*
* returns:
* pointer to the node's name, on success
- * If lenp is non-NULL, *lenp contains the length of that name (>=0)
+ * If lenp is non-NULL, *lenp contains the length of that name
+ * (>=0)
* NULL, on error
* if lenp is non-NULL *lenp contains an error code (<0):
- * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE
+ * tag
* -FDT_ERR_BADMAGIC,
* -FDT_ERR_BADVERSION,
* -FDT_ERR_BADSTATE, standard meanings
@@ -468,23 +474,26 @@ int fdt_first_property_offset(const void *fdt, int nodeoffset);
int fdt_next_property_offset(const void *fdt, int offset);
/**
- * fdt_for_each_property - iterate over all properties of a node
- * @property_offset: property offset (int)
+ * fdt_for_each_property_offset - iterate over all properties of a node
+ *
+ * @property_offset: property offset (int, lvalue)
* @fdt: FDT blob (const void *)
* @node: node offset (int)
*
* This is actually a wrapper around a for loop and would be used like so:
*
- * fdt_for_each_property(fdt, node, property) {
- * ...
- * use property
+ * fdt_for_each_property_offset(property, fdt, node) {
+ * Use property
* ...
* }
*
+ * if ((property < 0) && (property != -FDT_ERR_NOT_FOUND)) {
+ * Error handling
+ * }
+ *
* Note that this is implemented as a macro and property is used as
- * iterator in the loop. It should therefore be a locally allocated
- * variable. The node variable on the other hand is never modified, so
- * it can be constant or even a literal.
+ * iterator in the loop. The node variable can be constant or even a
+ * literal.
*/
#define fdt_for_each_property_offset(property, fdt, node) \
for (property = fdt_first_property_offset(fdt, node); \
@@ -527,8 +536,8 @@ const struct fdt_property *fdt_get_property_by_offset(const void *fdt,
* @namelen: number of characters of name to consider
* @lenp: pointer to an integer variable (will be overwritten) or NULL
*
- * Identical to fdt_get_property_namelen(), but only examine the first
- * namelen characters of name for matching the property name.
+ * Identical to fdt_get_property(), but only examine the first namelen
+ * characters of name for matching the property name.
*/
const struct fdt_property *fdt_get_property_namelen(const void *fdt,
int nodeoffset,
@@ -555,7 +564,8 @@ const struct fdt_property *fdt_get_property_namelen(const void *fdt,
* NULL, on error
* if lenp is non-NULL, *lenp contains an error code (<0):
* -FDT_ERR_NOTFOUND, node does not have named property
- * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE
+ * tag
* -FDT_ERR_BADMAGIC,
* -FDT_ERR_BADVERSION,
* -FDT_ERR_BADSTATE,
@@ -647,7 +657,8 @@ static inline void *fdt_getprop_namelen_w(void *fdt, int nodeoffset,
* NULL, on error
* if lenp is non-NULL, *lenp contains an error code (<0):
* -FDT_ERR_NOTFOUND, node does not have named property
- * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE
+ * tag
* -FDT_ERR_BADMAGIC,
* -FDT_ERR_BADVERSION,
* -FDT_ERR_BADSTATE,
@@ -689,7 +700,7 @@ const char *fdt_get_alias_namelen(const void *fdt,
const char *name, int namelen);
/**
- * fdt_get_alias - retreive the path referenced by a given alias
+ * fdt_get_alias - retrieve the path referenced by a given alias
* @fdt: pointer to the device tree blob
* @name: name of the alias th look up
*
@@ -749,11 +760,11 @@ int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen);
* structure from the start to nodeoffset.
*
* returns:
-
* structure block offset of the node at node offset's ancestor
* of depth supernodedepth (>=0), on success
* -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
-* -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of nodeoffset
+ * -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of
+ * nodeoffset
* -FDT_ERR_BADMAGIC,
* -FDT_ERR_BADVERSION,
* -FDT_ERR_BADSTATE,
@@ -1060,7 +1071,7 @@ int fdt_size_cells(const void *fdt, int nodeoffset);
* @nodeoffset: offset of the node whose property to change
* @name: name of the property to change
* @namelen: number of characters of name to consider
- * @index: index of the property to change in the array
+ * @idx: index of the property to change in the array
* @val: pointer to data to replace the property value with
* @len: length of the property value
*
@@ -1071,7 +1082,7 @@ int fdt_size_cells(const void *fdt, int nodeoffset);
*/
int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
const char *name, int namelen,
- uint32_t index, const void *val,
+ uint32_t idx, const void *val,
int len);
/**
@@ -1700,9 +1711,11 @@ int fdt_add_subnode_namelen(void *fdt, int parentoffset,
* change the offsets of some existing nodes.
* returns:
- * structure block offset of the created nodeequested subnode (>=0), on success
+ * structure block offset of the created nodeequested subnode (>=0), on
+ * success
* -FDT_ERR_NOTFOUND, if the requested subnode does not exist
- * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
+ * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE
+ * tag
* -FDT_ERR_EXISTS, if the node at parentoffset already has a subnode of
* the given name
* -FDT_ERR_NOSPACE, if there is insufficient free space in the
diff --git a/lib/libfdt/fdt_ro.c b/lib/libfdt/fdt_ro.c
index 9cc98db..005f267 100644
--- a/lib/libfdt/fdt_ro.c
+++ b/lib/libfdt/fdt_ro.c
@@ -60,11 +60,11 @@ uint32_t fdt_get_max_phandle(const void *fdt)
return max_phandle;
if (offset < 0)
- return 0;
+ return (uint32_t)-1;
phandle = fdt_get_phandle(fdt, offset);
if (phandle == (uint32_t)-1)
- return 0;
+ continue;
if (phandle > max_phandle)
max_phandle = phandle;
@@ -623,10 +623,8 @@ int fdt_node_check_compatible(const void *fdt, int nodeoffset,
prop = fdt_getprop(fdt, nodeoffset, "compatible", &len);
if (!prop)
return len;
- if (fdt_stringlist_contains(prop, len, compatible))
- return 0;
- else
- return 1;
+
+ return !fdt_stringlist_contains(prop, len, compatible);
}
int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
diff --git a/lib/libfdt/fdt_rw.c b/lib/libfdt/fdt_rw.c
index 47447b2..87d4030 100644
--- a/lib/libfdt/fdt_rw.c
+++ b/lib/libfdt/fdt_rw.c
@@ -60,6 +60,8 @@ static int _fdt_splice(void *fdt, void *splicepoint, int oldlen, int newlen)
if (((p + oldlen) < p) || ((p + oldlen) > end))
return -FDT_ERR_BADOFFSET;
+ if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt))
+ return -FDT_ERR_BADOFFSET;
if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt)))
return -FDT_ERR_NOSPACE;
memmove(p + newlen, p + oldlen, end - p - oldlen);
@@ -164,7 +166,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),
diff --git a/lib/libfdt/fdt_wip.c b/lib/libfdt/fdt_wip.c
index 216c512..45fb964 100644
--- a/lib/libfdt/fdt_wip.c
+++ b/lib/libfdt/fdt_wip.c
@@ -16,7 +16,7 @@
int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
const char *name, int namelen,
- uint32_t index, const void *val,
+ uint32_t idx, const void *val,
int len)
{
void *propval;
@@ -27,10 +27,10 @@ int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
if (!propval)
return proplen;
- if (proplen < (len + index))
+ if (proplen < (len + idx))
return -FDT_ERR_NOSPACE;
- memcpy(propval + index, val, len);
+ memcpy((char *)propval + idx, val, len);
return 0;
}
--
2.8.0.rc3.226.g39d4020
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/6] libfdt: Bring in upstream stringlist functions
[not found] ` <1475452771-16230-1-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2016-10-02 23:59 ` [PATCH 2/6] libfdt: Fix undefined behaviour in fdt_offset_ptr() Simon Glass
2016-10-02 23:59 ` [PATCH 3/6] libfdt: Sync up with upstream Simon Glass
@ 2016-10-02 23:59 ` Simon Glass
2016-10-02 23:59 ` [PATCH 5/6] libfdt: Sync fdt_for_each_subnode() with upstream Simon Glass
` (2 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Simon Glass @ 2016-10-02 23:59 UTC (permalink / raw)
To: U-Boot Mailing List
Cc: Simon Glass, Michal Simek, York Sun, Devicetree Compiler,
Heiko Schocher, Andreas Dannenberg, Albert Aribaud, Minkyu Kang,
Stephen Warren, Thomas Abraham, Tom Warren,
mario.six-2c4SBQpdCik@public.gmane.org, Joe Hershberger,
Beniamino Galvani, Stefan Roese, Pantelis Antoniou, Paul Burton,
Masahiro Yamada, Bin Meng, An
These have now landed upstream. The naming is different and in one case the
function signature has changed. Update the code to match.
This applies the following upstream commits by
Thierry Reding <treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> :
604e61e fdt: Add functions to retrieve strings
8702bd1 fdt: Add a function to get the index of a string
2218387 fdt: Add a function to count strings
Signed-off-by: Simon Glass <sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
---
arch/arm/mach-tegra/xusb-padctl-common.c | 14 ++---
arch/arm/mach-uniphier/board_late_init.c | 5 +-
arch/x86/cpu/irq.c | 5 +-
common/image-fit.c | 19 +++---
common/image.c | 19 +++---
drivers/clk/clk-uclass.c | 6 +-
drivers/core/device.c | 2 +-
drivers/gpio/dwapb_gpio.c | 3 +-
drivers/i2c/mxc_i2c.c | 2 +-
drivers/mailbox/mailbox-uclass.c | 6 +-
drivers/net/sun8i_emac.c | 5 +-
drivers/pinctrl/exynos/pinctrl-exynos.c | 9 ++-
drivers/pinctrl/meson/pinctrl-meson.c | 2 +-
drivers/pinctrl/pinctrl-generic.c | 10 +--
drivers/pinctrl/pinctrl-uclass.c | 2 +-
drivers/reset/reset-uclass.c | 6 +-
drivers/video/sunxi_display.c | 2 +-
include/libfdt.h | 86 +++++++++++++++----------
lib/fdtdec.c | 2 +-
lib/libfdt/fdt_ro.c | 104 +++++++++++++++++++------------
test/overlay/cmd_ut_overlay.c | 5 +-
21 files changed, 179 insertions(+), 135 deletions(-)
diff --git a/arch/arm/mach-tegra/xusb-padctl-common.c b/arch/arm/mach-tegra/xusb-padctl-common.c
index 18ad7bf..6867065 100644
--- a/arch/arm/mach-tegra/xusb-padctl-common.c
+++ b/arch/arm/mach-tegra/xusb-padctl-common.c
@@ -78,11 +78,11 @@ tegra_xusb_padctl_group_parse_dt(struct tegra_xusb_padctl *padctl,
const void *fdt, int node)
{
unsigned int i;
- int len, err;
+ int len;
group->name = fdt_get_name(fdt, node, &len);
- len = fdt_count_strings(fdt, node, "nvidia,lanes");
+ len = fdt_stringlist_count(fdt, node, "nvidia,lanes");
if (len < 0) {
error("failed to parse \"nvidia,lanes\" property");
return -EINVAL;
@@ -91,9 +91,9 @@ tegra_xusb_padctl_group_parse_dt(struct tegra_xusb_padctl *padctl,
group->num_pins = len;
for (i = 0; i < group->num_pins; i++) {
- err = fdt_get_string_index(fdt, node, "nvidia,lanes", i,
- &group->pins[i]);
- if (err < 0) {
+ group->pins[i] = fdt_stringlist_get(fdt, node, "nvidia,lanes",
+ i, NULL);
+ if (!group->pins[i]) {
error("failed to read string from \"nvidia,lanes\" property");
return -EINVAL;
}
@@ -101,8 +101,8 @@ tegra_xusb_padctl_group_parse_dt(struct tegra_xusb_padctl *padctl,
group->num_pins = len;
- err = fdt_get_string(fdt, node, "nvidia,function", &group->func);
- if (err < 0) {
+ group->func = fdt_stringlist_get(fdt, node, "nvidia,function", 0, NULL);
+ if (!group->func) {
error("failed to parse \"nvidia,func\" property");
return -EINVAL;
}
diff --git a/arch/arm/mach-uniphier/board_late_init.c b/arch/arm/mach-uniphier/board_late_init.c
index a454126..f23295f 100644
--- a/arch/arm/mach-uniphier/board_late_init.c
+++ b/arch/arm/mach-uniphier/board_late_init.c
@@ -37,13 +37,12 @@ static int uniphier_set_fdt_file(void)
const char *compat;
char dtb_name[256];
int buf_len = 256;
- int ret;
if (getenv("fdt_file"))
return 0; /* do nothing if it is already set */
- ret = fdt_get_string(gd->fdt_blob, 0, "compatible", &compat);
- if (ret)
+ compat = fdt_stringlist_get(gd->fdt_blob, 0, "compatible", 0, NULL);
+ if (!compat)
return -EINVAL;
if (strncmp(compat, VENDOR_PREFIX, strlen(VENDOR_PREFIX)))
diff --git a/arch/x86/cpu/irq.c b/arch/x86/cpu/irq.c
index df3cd0a..9364410 100644
--- a/arch/x86/cpu/irq.c
+++ b/arch/x86/cpu/irq.c
@@ -103,11 +103,12 @@ static int create_pirq_routing_table(struct udevice *dev)
/* extract the bdf from fdt_pci_addr */
priv->bdf = dm_pci_get_bdf(dev->parent);
- ret = fdt_find_string(blob, node, "intel,pirq-config", "pci");
+ ret = fdt_stringlist_search(blob, node, "intel,pirq-config", "pci");
if (!ret) {
priv->config = PIRQ_VIA_PCI;
} else {
- ret = fdt_find_string(blob, node, "intel,pirq-config", "ibase");
+ ret = fdt_stringlist_search(blob, node, "intel,pirq-config",
+ "ibase");
if (!ret)
priv->config = PIRQ_VIA_IBASE;
else
diff --git a/common/image-fit.c b/common/image-fit.c
index 1b0234a..d67678a 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -1457,7 +1457,7 @@ int fit_conf_get_prop_node(const void *fit, int noffset,
void fit_conf_print(const void *fit, int noffset, const char *p)
{
char *desc;
- char *uname;
+ const char *uname;
int ret;
int loadables_index;
@@ -1469,7 +1469,7 @@ void fit_conf_print(const void *fit, int noffset, const char *p)
else
printf("%s\n", desc);
- uname = (char *)fdt_getprop(fit, noffset, FIT_KERNEL_PROP, NULL);
+ uname = fdt_getprop(fit, noffset, FIT_KERNEL_PROP, NULL);
printf("%s Kernel: ", p);
if (uname == NULL)
printf("unavailable\n");
@@ -1477,26 +1477,23 @@ void fit_conf_print(const void *fit, int noffset, const char *p)
printf("%s\n", uname);
/* Optional properties */
- uname = (char *)fdt_getprop(fit, noffset, FIT_RAMDISK_PROP, NULL);
+ uname = fdt_getprop(fit, noffset, FIT_RAMDISK_PROP, NULL);
if (uname)
printf("%s Init Ramdisk: %s\n", p, uname);
- uname = (char *)fdt_getprop(fit, noffset, FIT_FDT_PROP, NULL);
+ uname = fdt_getprop(fit, noffset, FIT_FDT_PROP, NULL);
if (uname)
printf("%s FDT: %s\n", p, uname);
- uname = (char *)fdt_getprop(fit, noffset, FIT_FPGA_PROP, NULL);
+ uname = fdt_getprop(fit, noffset, FIT_FPGA_PROP, NULL);
if (uname)
printf("%s FPGA: %s\n", p, uname);
/* Print out all of the specified loadables */
for (loadables_index = 0;
- fdt_get_string_index(fit, noffset,
- FIT_LOADABLE_PROP,
- loadables_index,
- (const char **)&uname) == 0;
- loadables_index++)
- {
+ uname = fdt_stringlist_get(fit, noffset, FIT_LOADABLE_PROP,
+ loadables_index, NULL), uname;
+ loadables_index++) {
if (loadables_index == 0) {
printf("%s Loadables: ", p);
} else {
diff --git a/common/image.c b/common/image.c
index a5d19ab..6d90781 100644
--- a/common/image.c
+++ b/common/image.c
@@ -1304,7 +1304,7 @@ int boot_get_fpga(int argc, char * const argv[], bootm_headers_t *images,
void *buf;
int conf_noffset;
int fit_img_result;
- char *uname, *name;
+ const char *uname, *name;
int err;
int devnum = 0; /* TODO support multi fpga platforms */
const fpga_desc * const desc = fpga_get_desc(devnum);
@@ -1331,9 +1331,9 @@ int boot_get_fpga(int argc, char * const argv[], bootm_headers_t *images,
case IMAGE_FORMAT_FIT:
conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg);
- err = fdt_get_string_index(buf, conf_noffset, FIT_FPGA_PROP, 0,
- (const char **)&uname);
- if (err < 0) {
+ uname = fdt_stringlist_get(buf, conf_noffset, FIT_FPGA_PROP, 0,
+ NULL);
+ if (!uname) {
debug("## FPGA image is not specified\n");
return 0;
}
@@ -1403,7 +1403,7 @@ int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
int loadables_index;
int conf_noffset;
int fit_img_result;
- char *uname;
+ const char *uname;
/* Check to see if the images struct has a FIT configuration */
if (!genimg_has_config(images)) {
@@ -1427,15 +1427,14 @@ int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg);
for (loadables_index = 0;
- fdt_get_string_index(buf, conf_noffset,
- FIT_LOADABLE_PROP,
- loadables_index,
- (const char **)&uname) == 0;
+ uname = fdt_stringlist_get(buf, conf_noffset,
+ FIT_LOADABLE_PROP, loadables_index,
+ NULL), uname;
loadables_index++)
{
fit_img_result = fit_image_load(images,
tmp_img_addr,
- (const char **)&uname,
+ &uname,
&(images->fit_uname_cfg), arch,
IH_TYPE_LOADABLE,
BOOTSTAGE_ID_FIT_LOADABLE_START,
diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c
index 4d78e3f..c42fff6 100644
--- a/drivers/clk/clk-uclass.c
+++ b/drivers/clk/clk-uclass.c
@@ -101,10 +101,10 @@ int clk_get_by_name(struct udevice *dev, const char *name, struct clk *clk)
debug("%s(dev=%p, name=%s, clk=%p)\n", __func__, dev, name, clk);
- index = fdt_find_string(gd->fdt_blob, dev->of_offset, "clock-names",
- name);
+ index = fdt_stringlist_search(gd->fdt_blob, dev->of_offset,
+ "clock-names", name);
if (index < 0) {
- debug("fdt_find_string() failed: %d\n", index);
+ debug("fdt_stringlist_search() failed: %d\n", index);
return index;
}
diff --git a/drivers/core/device.c b/drivers/core/device.c
index b737f1c..1935b8d 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -698,7 +698,7 @@ fdt_addr_t dev_get_addr_name(struct udevice *dev, const char *name)
#if CONFIG_IS_ENABLED(OF_CONTROL)
int index;
- index = fdt_find_string(gd->fdt_blob, dev->of_offset, "reg-names",
+ index = fdt_stringlist_search(gd->fdt_blob, dev->of_offset, "reg-names",
name);
if (index < 0)
return index;
diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c
index 72cec48..471e18a 100644
--- a/drivers/gpio/dwapb_gpio.c
+++ b/drivers/gpio/dwapb_gpio.c
@@ -132,7 +132,8 @@ static int gpio_dwapb_bind(struct udevice *dev)
plat->base = base;
plat->bank = bank;
plat->pins = fdtdec_get_int(blob, node, "snps,nr-gpios", 0);
- ret = fdt_get_string(blob, node, "bank-name", &plat->name);
+ plat->name = fdt_stringlist_get(blob, node, "bank-name", 0,
+ NULL);
if (ret)
goto err;
diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c
index a26f44e..6247d33 100644
--- a/drivers/i2c/mxc_i2c.c
+++ b/drivers/i2c/mxc_i2c.c
@@ -773,7 +773,7 @@ static int mxc_i2c_probe(struct udevice *bus)
* See Documentation/devicetree/bindings/i2c/i2c-imx.txt
* Use gpio to force bus idle when necessary.
*/
- ret = fdt_find_string(fdt, node, "pinctrl-names", "gpio");
+ ret = fdt_stringlist_search(fdt, node, "pinctrl-names", "gpio");
if (ret < 0) {
dev_info(dev, "i2c bus %d at %lu, no gpio pinctrl state.\n", bus->seq, i2c_bus->base);
} else {
diff --git a/drivers/mailbox/mailbox-uclass.c b/drivers/mailbox/mailbox-uclass.c
index 40f851d..a7fcde5 100644
--- a/drivers/mailbox/mailbox-uclass.c
+++ b/drivers/mailbox/mailbox-uclass.c
@@ -85,10 +85,10 @@ int mbox_get_by_name(struct udevice *dev, const char *name,
debug("%s(dev=%p, name=%s, chan=%p)\n", __func__, dev, name, chan);
- index = fdt_find_string(gd->fdt_blob, dev->of_offset, "mbox-names",
- name);
+ index = fdt_stringlist_search(gd->fdt_blob, dev->of_offset,
+ "mbox-names", name);
if (index < 0) {
- debug("fdt_find_string() failed: %d\n", index);
+ debug("fdt_stringlist_search() failed: %d\n", index);
return index;
}
diff --git a/drivers/net/sun8i_emac.c b/drivers/net/sun8i_emac.c
index 4c149e1..91570a2 100644
--- a/drivers/net/sun8i_emac.c
+++ b/drivers/net/sun8i_emac.c
@@ -456,8 +456,9 @@ static int parse_phy_pins(struct udevice *dev)
for (i = 0; ; i++) {
int pin;
- if (fdt_get_string_index(gd->fdt_blob, offset,
- "allwinner,pins", i, &pin_name))
+ pin_name = fdt_stringlist_get(gd->fdt_blob, offset,
+ "allwinner,pins", i, NULL);
+ if (!pin_name)
break;
if (pin_name[0] != 'P')
continue;
diff --git a/drivers/pinctrl/exynos/pinctrl-exynos.c b/drivers/pinctrl/exynos/pinctrl-exynos.c
index a28405f..c9c13e6 100644
--- a/drivers/pinctrl/exynos/pinctrl-exynos.c
+++ b/drivers/pinctrl/exynos/pinctrl-exynos.c
@@ -71,7 +71,7 @@ int exynos_pinctrl_set_state(struct udevice *dev, struct udevice *config)
{
const void *fdt = gd->fdt_blob;
int node = config->of_offset;
- unsigned int count, idx, pin_num, ret;
+ unsigned int count, idx, pin_num;
unsigned int pinfunc, pinpud, pindrv;
unsigned long reg, value;
const char *name;
@@ -80,7 +80,7 @@ int exynos_pinctrl_set_state(struct udevice *dev, struct udevice *config)
* refer to the following document for the pinctrl bindings
* linux/Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt
*/
- count = fdt_count_strings(fdt, node, "samsung,pins");
+ count = fdt_stringlist_count(fdt, node, "samsung,pins");
if (count <= 0)
return -EINVAL;
@@ -89,9 +89,8 @@ int exynos_pinctrl_set_state(struct udevice *dev, struct udevice *config)
pindrv = fdtdec_get_int(fdt, node, "samsung,pin-drv", -1);
for (idx = 0; idx < count; idx++) {
- ret = fdt_get_string_index(fdt, node, "samsung,pins",
- idx, &name);
- if (ret < 0)
+ name = fdt_stringlist_get(fdt, node, "samsung,pins", idx, NULL);
+ if (!name)
continue;
reg = pin_to_bank_base(dev, name, &pin_num);
diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
index d21a3dd..46470ea 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.c
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
@@ -122,7 +122,7 @@ static fdt_addr_t parse_address(int offset, const char *name, int na, int ns)
int index, len = 0;
const fdt32_t *reg;
- index = fdt_find_string(gd->fdt_blob, offset, "reg-names", name);
+ index = fdt_stringlist_search(gd->fdt_blob, offset, "reg-names", name);
if (index < 0)
return FDT_ADDR_T_NONE;
diff --git a/drivers/pinctrl/pinctrl-generic.c b/drivers/pinctrl/pinctrl-generic.c
index baff40f..482db29 100644
--- a/drivers/pinctrl/pinctrl-generic.c
+++ b/drivers/pinctrl/pinctrl-generic.c
@@ -306,11 +306,11 @@ static int pinctrl_generic_set_state_subnode(struct udevice *dev,
const char *name;
int strings_count, selector, i, ret;
- strings_count = fdt_count_strings(fdt, node, subnode_target_type);
+ strings_count = fdt_stringlist_count(fdt, node, subnode_target_type);
if (strings_count < 0) {
subnode_target_type = "groups";
is_group = true;
- strings_count = fdt_count_strings(fdt, node,
+ strings_count = fdt_stringlist_count(fdt, node,
subnode_target_type);
if (strings_count < 0) {
/* skip this node; may contain config child nodes */
@@ -319,9 +319,9 @@ static int pinctrl_generic_set_state_subnode(struct udevice *dev,
}
for (i = 0; i < strings_count; i++) {
- ret = fdt_get_string_index(fdt, node, subnode_target_type,
- i, &name);
- if (ret < 0)
+ name = fdt_stringlist_get(fdt, node, subnode_target_type, i,
+ NULL);
+ if (!name)
return -EINVAL;
if (is_group)
diff --git a/drivers/pinctrl/pinctrl-uclass.c b/drivers/pinctrl/pinctrl-uclass.c
index 7397de2..02ab9b4 100644
--- a/drivers/pinctrl/pinctrl-uclass.c
+++ b/drivers/pinctrl/pinctrl-uclass.c
@@ -72,7 +72,7 @@ static int pinctrl_select_state_full(struct udevice *dev, const char *statename)
struct udevice *config;
int state, size, i, ret;
- state = fdt_find_string(fdt, node, "pinctrl-names", statename);
+ state = fdt_stringlist_search(fdt, node, "pinctrl-names", statename);
if (state < 0) {
char *end;
/*
diff --git a/drivers/reset/reset-uclass.c b/drivers/reset/reset-uclass.c
index edaecfb..d3744ef 100644
--- a/drivers/reset/reset-uclass.c
+++ b/drivers/reset/reset-uclass.c
@@ -88,10 +88,10 @@ int reset_get_by_name(struct udevice *dev, const char *name,
debug("%s(dev=%p, name=%s, reset_ctl=%p)\n", __func__, dev, name,
reset_ctl);
- index = fdt_find_string(gd->fdt_blob, dev->of_offset, "reset-names",
- name);
+ index = fdt_stringlist_search(gd->fdt_blob, dev->of_offset,
+ "reset-names", name);
if (index < 0) {
- debug("fdt_find_string() failed: %d\n", index);
+ debug("fdt_stringlist_search() failed: %d\n", index);
return index;
}
diff --git a/drivers/video/sunxi_display.c b/drivers/video/sunxi_display.c
index 50b16a9..6cba1b9 100644
--- a/drivers/video/sunxi_display.c
+++ b/drivers/video/sunxi_display.c
@@ -1562,7 +1562,7 @@ int sunxi_simplefb_setup(void *blob)
offset = fdt_node_offset_by_compatible(blob, -1,
"allwinner,simple-framebuffer");
while (offset >= 0) {
- ret = fdt_find_string(blob, offset, "allwinner,pipeline",
+ ret = fdt_stringlist_search(blob, offset, "allwinner,pipeline",
pipeline);
if (ret == 0)
break;
diff --git a/include/libfdt.h b/include/libfdt.h
index 3b1c788..f3b61c9 100644
--- a/include/libfdt.h
+++ b/include/libfdt.h
@@ -121,12 +121,17 @@
/* FDT_ERR_BADNCELLS: Device tree has a #address-cells, #size-cells
* or similar property with a bad format or value */
-#define FDT_ERR_TOODEEP 15
+#define FDT_ERR_BADVALUE 15
+ /* FDT_ERR_BADVALUE: Device tree has a property with an unexpected
+ * value. For example: a property expected to contain a string list
+ * is not NUL-terminated within the length of its value. */
+
+#define FDT_ERR_TOODEEP 16
/* FDT_ERR_TOODEEP: The depth of a node has exceeded the internal
* libfdt limit. This can happen if you have more than
* FDT_MAX_DEPTH nested nodes. */
-#define FDT_ERR_MAX 15
+#define FDT_ERR_MAX 16
/**********************************************************************/
/* Low-level functions (you probably don't need these) */
@@ -957,51 +962,66 @@ int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
int fdt_stringlist_contains(const char *strlist, int listlen, const char *str);
/**
- * fdt_count_strings - count the number of strings in a string list
+ * fdt_stringlist_count - count the number of strings in a string list
* @fdt: pointer to the device tree blob
- * @node: offset of the node
+ * @nodeoffset: offset of a tree node
* @property: name of the property containing the string list
- * @return: the number of strings in the given property
+ * @return:
+ * the number of strings in the given property
+ * -FDT_ERR_BADVALUE if the property value is not NUL-terminated
+ * -FDT_ERR_NOTFOUND if the property does not exist
*/
-int fdt_count_strings(const void *fdt, int node, const char *property);
+int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property);
/**
- * fdt_find_string - find a string in a string list and return its index
+ * fdt_stringlist_search - find a string in a string list and return its index
* @fdt: pointer to the device tree blob
- * @node: offset of the node
+ * @nodeoffset: offset of a tree node
* @property: name of the property containing the string list
* @string: string to look up in the string list
- * @return: the index of the string or negative on error
+ *
+ * Note that it is possible for this function to succeed on property values
+ * that are not NUL-terminated. That's because the function will stop after
+ * finding the first occurrence of @string. This can for example happen with
+ * small-valued cell properties, such as #address-cells, when searching for
+ * the empty string.
+ *
+ * @return:
+ * the index of the string in the list of strings
+ * -FDT_ERR_BADVALUE if the property value is not NUL-terminated
+ * -FDT_ERR_NOTFOUND if the property does not exist or does not contain
+ * the given string
*/
-int fdt_find_string(const void *fdt, int node, const char *property,
- const char *string);
+int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property,
+ const char *string);
/**
- * fdt_get_string_index() - obtain the string at a given index in a string list
+ * fdt_stringlist_get() - obtain the string at a given index in a string list
* @fdt: pointer to the device tree blob
- * @node: offset of the node
+ * @nodeoffset: offset of a tree node
* @property: name of the property containing the string list
* @index: index of the string to return
- * @output: return location for the string
- * @return: 0 if the string was found or a negative error code otherwise
- */
-int fdt_get_string_index(const void *fdt, int node, const char *property,
- int index, const char **output);
-
-/**
- * fdt_get_string() - obtain the first string in a string list
- * @fdt: pointer to the device tree blob
- * @node: offset of the node
- * @property: name of the property containing the string list
- * @output: return location for the string
- * @return: 0 if the string was found or a negative error code otherwise
- *
- * This is a shortcut for:
- *
- * fdt_get_string_index(fdt, node, property, 0, output).
- */
-int fdt_get_string(const void *fdt, int node, const char *property,
- const char **output);
+ * @lenp: return location for the string length or an error code on failure
+ *
+ * Note that this will successfully extract strings from properties with
+ * non-NUL-terminated values. For example on small-valued cell properties
+ * this function will return the empty string.
+ *
+ * If non-NULL, the length of the string (on success) or a negative error-code
+ * (on failure) will be stored in the integer pointer to by lenp.
+ *
+ * @return:
+ * A pointer to the string at the given index in the string list or NULL on
+ * failure. On success the length of the string will be stored in the memory
+ * location pointed to by the lenp parameter, if non-NULL. On failure one of
+ * the following negative error codes will be returned in the lenp parameter
+ * (if non-NULL):
+ * -FDT_ERR_BADVALUE if the property value is not NUL-terminated
+ * -FDT_ERR_NOTFOUND if the property does not exist
+ */
+const char *fdt_stringlist_get(const void *fdt, int nodeoffset,
+ const char *property, int index,
+ int *lenp);
/**********************************************************************/
/* Read-only functions (addressing related) */
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index 4defb90..adc9975 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -1014,7 +1014,7 @@ int fdt_get_named_resource(const void *fdt, int node, const char *property,
{
int index;
- index = fdt_find_string(fdt, node, prop_names, name);
+ index = fdt_stringlist_search(fdt, node, prop_names, name);
if (index < 0)
return index;
diff --git a/lib/libfdt/fdt_ro.c b/lib/libfdt/fdt_ro.c
index 005f267..e38aaa4 100644
--- a/lib/libfdt/fdt_ro.c
+++ b/lib/libfdt/fdt_ro.c
@@ -538,80 +538,104 @@ int fdt_stringlist_contains(const char *strlist, int listlen, const char *str)
return 0;
}
-int fdt_count_strings(const void *fdt, int node, const char *property)
+int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *property)
{
- int length, i, count = 0;
- const char *list;
+ const char *list, *end;
+ int length, count = 0;
- list = fdt_getprop(fdt, node, property, &length);
+ list = fdt_getprop(fdt, nodeoffset, property, &length);
if (!list)
- return length;
+ return -length;
+
+ end = list + length;
+
+ while (list < end) {
+ length = strnlen(list, end - list) + 1;
- for (i = 0; i < length; i++) {
- int len = strlen(list);
+ /* Abort if the last string isn't properly NUL-terminated. */
+ if (list + length > end)
+ return -FDT_ERR_BADVALUE;
- list += len + 1;
- i += len;
+ list += length;
count++;
}
return count;
}
-int fdt_find_string(const void *fdt, int node, const char *property,
- const char *string)
+int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *property,
+ const char *string)
{
+ int length, len, idx = 0;
const char *list, *end;
- int len, index = 0;
- list = fdt_getprop(fdt, node, property, &len);
+ list = fdt_getprop(fdt, nodeoffset, property, &length);
if (!list)
- return len;
+ return -length;
- end = list + len;
- len = strlen(string);
+ len = strlen(string) + 1;
+ end = list + length;
while (list < end) {
- int l = strlen(list);
+ length = strnlen(list, end - list) + 1;
+
+ /* Abort if the last string isn't properly NUL-terminated. */
+ if (list + length > end)
+ return -FDT_ERR_BADVALUE;
- if (l == len && memcmp(list, string, len) == 0)
- return index;
+ if (length == len && memcmp(list, string, length) == 0)
+ return idx;
- list += l + 1;
- index++;
+ list += length;
+ idx++;
}
return -FDT_ERR_NOTFOUND;
}
-int fdt_get_string_index(const void *fdt, int node, const char *property,
- int index, const char **output)
+const char *fdt_stringlist_get(const void *fdt, int nodeoffset,
+ const char *property, int idx,
+ int *lenp)
{
- const char *list;
- int length, i;
+ const char *list, *end;
+ int length;
+
+ list = fdt_getprop(fdt, nodeoffset, property, &length);
+ if (!list) {
+ if (lenp)
+ *lenp = length;
- list = fdt_getprop(fdt, node, property, &length);
+ return NULL;
+ }
- for (i = 0; i < length; i++) {
- int len = strlen(list);
+ end = list + length;
- if (index == 0) {
- *output = list;
- return 0;
+ while (list < end) {
+ length = strnlen(list, end - list) + 1;
+
+ /* Abort if the last string isn't properly NUL-terminated. */
+ if (list + length > end) {
+ if (lenp)
+ *lenp = -FDT_ERR_BADVALUE;
+
+ return NULL;
+ }
+
+ if (idx == 0) {
+ if (lenp)
+ *lenp = length - 1;
+
+ return list;
}
- list += len + 1;
- i += len;
- index--;
+ list += length;
+ idx--;
}
- return -FDT_ERR_NOTFOUND;
-}
+ if (lenp)
+ *lenp = -FDT_ERR_NOTFOUND;
-int fdt_get_string(const void *fdt, int node, const char *property,
- const char **output)
-{
- return fdt_get_string_index(fdt, node, property, 0, output);
+ return NULL;
}
int fdt_node_check_compatible(const void *fdt, int nodeoffset,
diff --git a/test/overlay/cmd_ut_overlay.c b/test/overlay/cmd_ut_overlay.c
index 87dc932..cbef720 100644
--- a/test/overlay/cmd_ut_overlay.c
+++ b/test/overlay/cmd_ut_overlay.c
@@ -52,12 +52,15 @@ static int fdt_getprop_str(void *fdt, const char *path, const char *name,
const char **out)
{
int node_off;
+ int len;
node_off = fdt_path_offset(fdt, path);
if (node_off < 0)
return node_off;
- return fdt_get_string(fdt, node_off, name, out);
+ *out = fdt_stringlist_get(fdt, node_off, name, 0, &len);
+
+ return len < 0 ? len : 0;
}
static int fdt_overlay_change_int_property(struct unit_test_state *uts)
--
2.8.0.rc3.226.g39d4020
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/6] libfdt: Sync fdt_for_each_subnode() with upstream
[not found] ` <1475452771-16230-1-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
` (2 preceding siblings ...)
2016-10-02 23:59 ` [PATCH 4/6] libfdt: Bring in upstream stringlist functions Simon Glass
@ 2016-10-02 23:59 ` Simon Glass
2016-10-02 23:59 ` [PATCH 6/6] libfdt: Drop inlining of fdt_path_offset() Simon Glass
2016-10-06 13:53 ` [PATCH 0/6] libfdt: Sync to upstream Maxime Ripard
5 siblings, 0 replies; 9+ messages in thread
From: Simon Glass @ 2016-10-02 23:59 UTC (permalink / raw)
To: U-Boot Mailing List
Cc: Simon Glass, Jagan Teki, York Sun, Tom Warren, Andrej Rosano,
Devicetree Compiler, Andreas Dannenberg, Thierry Reding,
Michal Simek, Albert Aribaud, Beniamino Galvani, Stefan Roese,
Joe Hershberger, Stephen Warren
The signature for this macro has changed. Bring in the upstream version and
adjust U-Boot's usages to suit.
Signed-off-by: Simon Glass <sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
---
arch/arm/mach-tegra/xusb-padctl-common.c | 4 ++--
common/image-fit.c | 2 +-
common/image-sig.c | 8 ++++----
drivers/net/cpsw.c | 2 +-
drivers/net/keystone_net.c | 4 ++--
drivers/net/mvpp2.c | 2 +-
drivers/pci/pci_tegra.c | 2 +-
drivers/phy/marvell/comphy_core.c | 2 +-
drivers/pinctrl/meson/pinctrl-meson.c | 2 +-
drivers/spi/fsl_qspi.c | 2 +-
include/libfdt.h | 25 ++++++++++++++-----------
lib/fdtdec.c | 2 +-
lib/libfdt/fdt_overlay.c | 8 ++++----
13 files changed, 34 insertions(+), 31 deletions(-)
diff --git a/arch/arm/mach-tegra/xusb-padctl-common.c b/arch/arm/mach-tegra/xusb-padctl-common.c
index 6867065..dfbc8ef 100644
--- a/arch/arm/mach-tegra/xusb-padctl-common.c
+++ b/arch/arm/mach-tegra/xusb-padctl-common.c
@@ -223,7 +223,7 @@ tegra_xusb_padctl_config_parse_dt(struct tegra_xusb_padctl *padctl,
config->name = fdt_get_name(fdt, node, NULL);
- fdt_for_each_subnode(fdt, subnode, node) {
+ fdt_for_each_subnode(subnode, fdt, node) {
struct tegra_xusb_padctl_group *group;
int err;
@@ -253,7 +253,7 @@ static int tegra_xusb_padctl_parse_dt(struct tegra_xusb_padctl *padctl,
return err;
}
- fdt_for_each_subnode(fdt, subnode, node) {
+ fdt_for_each_subnode(subnode, fdt, node) {
struct tegra_xusb_padctl_config *config = &padctl->config;
err = tegra_xusb_padctl_config_parse_dt(padctl, config, fdt,
diff --git a/common/image-fit.c b/common/image-fit.c
index d67678a..77dc011 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -1026,7 +1026,7 @@ int fit_image_verify(const void *fit, int image_noffset)
}
/* Process all hash subnodes of the component image node */
- fdt_for_each_subnode(fit, noffset, image_noffset) {
+ fdt_for_each_subnode(noffset, fit, image_noffset) {
const char *name = fit_get_name(fit, noffset, NULL);
/*
diff --git a/common/image-sig.c b/common/image-sig.c
index eda5e13..28f7a20 100644
--- a/common/image-sig.c
+++ b/common/image-sig.c
@@ -212,7 +212,7 @@ static int fit_image_verify_sig(const void *fit, int image_noffset,
int ret;
/* Process all hash subnodes of the component image node */
- fdt_for_each_subnode(fit, noffset, image_noffset) {
+ fdt_for_each_subnode(noffset, fit, image_noffset) {
const char *name = fit_get_name(fit, noffset, NULL);
if (!strncmp(name, FIT_SIG_NODENAME,
@@ -260,7 +260,7 @@ int fit_image_verify_required_sigs(const void *fit, int image_noffset,
return 0;
}
- fdt_for_each_subnode(sig_blob, noffset, sig_node) {
+ fdt_for_each_subnode(noffset, sig_blob, sig_node) {
const char *required;
int ret;
@@ -393,7 +393,7 @@ static int fit_config_verify_sig(const void *fit, int conf_noffset,
int ret;
/* Process all hash subnodes of the component conf node */
- fdt_for_each_subnode(fit, noffset, conf_noffset) {
+ fdt_for_each_subnode(noffset, fit, conf_noffset) {
const char *name = fit_get_name(fit, noffset, NULL);
if (!strncmp(name, FIT_SIG_NODENAME,
@@ -438,7 +438,7 @@ int fit_config_verify_required_sigs(const void *fit, int conf_noffset,
return 0;
}
- fdt_for_each_subnode(sig_blob, noffset, sig_node) {
+ fdt_for_each_subnode(noffset, sig_blob, sig_node) {
const char *required;
int ret;
diff --git a/drivers/net/cpsw.c b/drivers/net/cpsw.c
index d17505e..c3018fb 100644
--- a/drivers/net/cpsw.c
+++ b/drivers/net/cpsw.c
@@ -1219,7 +1219,7 @@ static int cpsw_eth_ofdata_to_platdata(struct udevice *dev)
active_slave = fdtdec_get_int(fdt, node, "active_slave", 0);
priv->data.active_slave = active_slave;
- fdt_for_each_subnode(fdt, subnode, node) {
+ fdt_for_each_subnode(subnode, fdt, node) {
int len;
const char *name;
diff --git a/drivers/net/keystone_net.c b/drivers/net/keystone_net.c
index e41b7d1..f88d83e 100644
--- a/drivers/net/keystone_net.c
+++ b/drivers/net/keystone_net.c
@@ -990,7 +990,7 @@ static int ks2_eth_bind_slaves(struct udevice *dev, int gbe, int *gbe_0)
char *slave_name;
interfaces = fdt_subnode_offset(fdt, gbe, "interfaces");
- fdt_for_each_subnode(fdt, slave, interfaces) {
+ fdt_for_each_subnode(slave, fdt, interfaces) {
int slave_no;
slave_no = fdtdec_get_int(fdt, slave, "slave-port", -ENOENT);
@@ -1015,7 +1015,7 @@ static int ks2_eth_bind_slaves(struct udevice *dev, int gbe, int *gbe_0)
}
sec_slave = fdt_subnode_offset(fdt, gbe, "secondary-slave-ports");
- fdt_for_each_subnode(fdt, slave, sec_slave) {
+ fdt_for_each_subnode(slave, fdt, sec_slave) {
int slave_no;
slave_no = fdtdec_get_int(fdt, slave, "slave-port", -ENOENT);
diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
index 340b85a..405776a 100644
--- a/drivers/net/mvpp2.c
+++ b/drivers/net/mvpp2.c
@@ -4153,7 +4153,7 @@ static int mvpp2_base_bind(struct udevice *parent)
return -ENOENT;
}
- fdt_for_each_subnode(blob, subnode, node) {
+ fdt_for_each_subnode(subnode, blob, node) {
/* Skip disabled ports */
if (!fdtdec_get_is_enabled(blob, subnode))
continue;
diff --git a/drivers/pci/pci_tegra.c b/drivers/pci/pci_tegra.c
index ea8adb98..430270e 100644
--- a/drivers/pci/pci_tegra.c
+++ b/drivers/pci/pci_tegra.c
@@ -531,7 +531,7 @@ static int tegra_pcie_parse_dt(const void *fdt, int node, enum tegra_pci_id id,
}
#endif
- fdt_for_each_subnode(fdt, subnode, node) {
+ fdt_for_each_subnode(subnode, fdt, node) {
unsigned int index = 0, num_lanes = 0;
struct tegra_pcie_port *port;
diff --git a/drivers/phy/marvell/comphy_core.c b/drivers/phy/marvell/comphy_core.c
index 344df3b..651397d 100644
--- a/drivers/phy/marvell/comphy_core.c
+++ b/drivers/phy/marvell/comphy_core.c
@@ -152,7 +152,7 @@ static int comphy_probe(struct udevice *dev)
}
lane = 0;
- fdt_for_each_subnode(blob, subnode, node) {
+ fdt_for_each_subnode(subnode, blob, node) {
/* Skip disabled ports */
if (!fdtdec_get_is_enabled(blob, subnode))
continue;
diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
index 46470ea..30f7cfc 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.c
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
@@ -154,7 +154,7 @@ int meson_pinctrl_probe(struct udevice *dev)
return -EINVAL;
}
- fdt_for_each_subnode(gd->fdt_blob, node, dev->of_offset) {
+ fdt_for_each_subnode(node, gd->fdt_blob, dev->of_offset) {
if (fdt_getprop(gd->fdt_blob, node, "gpio-controller", &len)) {
gpio = node;
break;
diff --git a/drivers/spi/fsl_qspi.c b/drivers/spi/fsl_qspi.c
index 2144fca..4a146ba 100644
--- a/drivers/spi/fsl_qspi.c
+++ b/drivers/spi/fsl_qspi.c
@@ -1092,7 +1092,7 @@ static int fsl_qspi_ofdata_to_platdata(struct udevice *bus)
}
/* Count flash numbers */
- fdt_for_each_subnode(blob, subnode, node)
+ fdt_for_each_subnode(subnode, blob, node)
++flash_num;
if (flash_num == 0) {
diff --git a/include/libfdt.h b/include/libfdt.h
index f3b61c9..398748c 100644
--- a/include/libfdt.h
+++ b/include/libfdt.h
@@ -176,24 +176,27 @@ int fdt_next_subnode(const void *fdt, int offset);
/**
* fdt_for_each_subnode - iterate over all subnodes of a parent
*
+ * @node: child node (int, lvalue)
+ * @fdt: FDT blob (const void *)
+ * @parent: parent node (int)
+ *
* This is actually a wrapper around a for loop and would be used like so:
*
- * fdt_for_each_subnode(fdt, node, parent) {
- * ...
- * use node
+ * fdt_for_each_subnode(node, fdt, parent) {
+ * Use node
* ...
* }
*
- * Note that this is implemented as a macro and node is used as iterator in
- * the loop. It should therefore be a locally allocated variable. The parent
- * variable on the other hand is never modified, so it can be constant or
- * even a literal.
+ * if ((node < 0) && (node != -FDT_ERR_NOT_FOUND)) {
+ * Error handling
+ * }
+ *
+ * Note that this is implemented as a macro and @node is used as
+ * iterator in the loop. The parent variable be constant or even a
+ * literal.
*
- * @fdt: FDT blob (const void *)
- * @node: child node (int)
- * @parent: parent node (int)
*/
-#define fdt_for_each_subnode(fdt, node, parent) \
+#define fdt_for_each_subnode(node, fdt, parent) \
for (node = fdt_first_subnode(fdt, parent); \
node >= 0; \
node = fdt_next_subnode(fdt, node))
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index adc9975..4e619c4 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -836,7 +836,7 @@ int fdtdec_get_child_count(const void *blob, int node)
int subnode;
int num = 0;
- fdt_for_each_subnode(blob, subnode, node)
+ fdt_for_each_subnode(subnode, blob, node)
num++;
return num;
diff --git a/lib/libfdt/fdt_overlay.c b/lib/libfdt/fdt_overlay.c
index 40b6d27..d35ceac 100644
--- a/lib/libfdt/fdt_overlay.c
+++ b/lib/libfdt/fdt_overlay.c
@@ -146,7 +146,7 @@ static int overlay_adjust_node_phandles(void *fdto, int node,
if (!found && !ret)
return ret;
- fdt_for_each_subnode(fdto, child, node)
+ fdt_for_each_subnode(child, fdto, node)
overlay_adjust_node_phandles(fdto, child, delta);
return 0;
@@ -248,7 +248,7 @@ static int overlay_update_local_node_references(void *fdto,
}
}
- fdt_for_each_subnode(fdto, fixup_child, fixup_node) {
+ fdt_for_each_subnode(fixup_child, fdto, fixup_node) {
const char *fixup_child_name = fdt_get_name(fdto, fixup_child,
NULL);
int tree_child;
@@ -511,7 +511,7 @@ static int overlay_apply_node(void *fdt, int target,
return ret;
}
- fdt_for_each_subnode(fdto, node, fragment) {
+ fdt_for_each_subnode(node, fdto, fragment) {
const char *name = fdt_get_name(fdto, node, NULL);
int nnode;
int ret;
@@ -550,7 +550,7 @@ static int overlay_merge(void *dt, void *dto)
{
int fragment;
- fdt_for_each_subnode(dto, fragment, 0) {
+ fdt_for_each_subnode(fragment, dto, 0) {
int overlay;
int target;
int ret;
--
2.8.0.rc3.226.g39d4020
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 6/6] libfdt: Drop inlining of fdt_path_offset()
[not found] ` <1475452771-16230-1-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
` (3 preceding siblings ...)
2016-10-02 23:59 ` [PATCH 5/6] libfdt: Sync fdt_for_each_subnode() with upstream Simon Glass
@ 2016-10-02 23:59 ` Simon Glass
2016-10-06 13:53 ` [PATCH 0/6] libfdt: Sync to upstream Maxime Ripard
5 siblings, 0 replies; 9+ messages in thread
From: Simon Glass @ 2016-10-02 23:59 UTC (permalink / raw)
To: U-Boot Mailing List; +Cc: Simon Glass, Devicetree Compiler
The fdt_path_offset() function is not inlined in upstream libfdt. Adjust
U-Boot's version to match.
Signed-off-by: Simon Glass <sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
---
include/libfdt.h | 5 +----
lib/libfdt/fdt_ro.c | 5 +++++
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/include/libfdt.h b/include/libfdt.h
index 398748c..8746790 100644
--- a/include/libfdt.h
+++ b/include/libfdt.h
@@ -410,10 +410,7 @@ int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen);
* -FDT_ERR_BADSTRUCTURE,
* -FDT_ERR_TRUNCATED, standard meanings.
*/
-static inline int fdt_path_offset(const void *fdt, const char *path)
-{
- return fdt_path_offset_namelen(fdt, path, strlen(path));
-}
+int fdt_path_offset(const void *fdt, const char *path);
/**
* fdt_get_name - retrieve the name of a given node
diff --git a/lib/libfdt/fdt_ro.c b/lib/libfdt/fdt_ro.c
index e38aaa4..7e894b7 100644
--- a/lib/libfdt/fdt_ro.c
+++ b/lib/libfdt/fdt_ro.c
@@ -204,6 +204,11 @@ int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen)
return offset;
}
+int fdt_path_offset(const void *fdt, const char *path)
+{
+ return fdt_path_offset_namelen(fdt, path, strlen(path));
+}
+
const char *fdt_get_name(const void *fdt, int nodeoffset, int *len)
{
const struct fdt_node_header *nh = _fdt_offset_ptr(fdt, nodeoffset);
--
2.8.0.rc3.226.g39d4020
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 0/6] libfdt: Sync to upstream
[not found] ` <1475452771-16230-1-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
` (4 preceding siblings ...)
2016-10-02 23:59 ` [PATCH 6/6] libfdt: Drop inlining of fdt_path_offset() Simon Glass
@ 2016-10-06 13:53 ` Maxime Ripard
2016-10-06 14:36 ` Simon Glass
5 siblings, 1 reply; 9+ messages in thread
From: Maxime Ripard @ 2016-10-06 13:53 UTC (permalink / raw)
To: Simon Glass
Cc: U-Boot Mailing List, Beniamino Galvani, Thierry Reding,
Marek Vasut, Nikita Kiryanov, Michal Simek, York Sun,
Andrej Rosano, Devicetree Compiler, Heiko Schocher,
Albert Aribaud, Andreas Dannenberg, Minkyu Kang, Robert P. J. Day,
Stephen Warren, Jagan Teki, Alexander Graf, Przemyslaw Marczak,
Thomas Abraham, Tom
[-- Attachment #1: Type: text/plain, Size: 596 bytes --]
Hi Simon,
On Sun, Oct 02, 2016 at 05:59:24PM -0600, Simon Glass wrote:
> In a few cases the upstream versions of functions first written for U-Boot
> have landed in a slightly different form.
>
> This includes a few patches to fix these as well as various minor changes to
> reduce the delta.
Thanks a lot for working on this.
The overlay code just got merged, and it has a significant amount of
fixes, so it might be nice to do that sync with the latest dtc HEAD.
Maxime
--
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 0/6] libfdt: Sync to upstream
2016-10-06 13:53 ` [PATCH 0/6] libfdt: Sync to upstream Maxime Ripard
@ 2016-10-06 14:36 ` Simon Glass
[not found] ` <CAPnjgZ07Ab8fX2ZNUikjKxenzvswdkzdn1-8uiTDqNp3Um2sQw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
0 siblings, 1 reply; 9+ messages in thread
From: Simon Glass @ 2016-10-06 14:36 UTC (permalink / raw)
To: Maxime Ripard
Cc: U-Boot Mailing List, Beniamino Galvani, Thierry Reding,
Marek Vasut, Nikita Kiryanov, Michal Simek, York Sun,
Andrej Rosano, Devicetree Compiler, Heiko Schocher,
Albert Aribaud, Andreas Dannenberg, Minkyu Kang, Robert P. J. Day,
Stephen Warren, Jagan Teki, Alexander Graf, Przemyslaw Marczak,
Thomas Abraham, Tom
Hi Maxime,
On 6 October 2016 at 07:53, Maxime Ripard
<maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> wrote:
> Hi Simon,
>
> On Sun, Oct 02, 2016 at 05:59:24PM -0600, Simon Glass wrote:
>> In a few cases the upstream versions of functions first written for U-Boot
>> have landed in a slightly different form.
>>
>> This includes a few patches to fix these as well as various minor changes to
>> reduce the delta.
>
> Thanks a lot for working on this.
>
> The overlay code just got merged, and it has a significant amount of
> fixes, so it might be nice to do that sync with the latest dtc HEAD.
Nice work! I see you have sent some fix-up patches two, right? If so I
should probably wait until they land.
Regards,
Simon
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 0/6] libfdt: Sync to upstream
[not found] ` <CAPnjgZ07Ab8fX2ZNUikjKxenzvswdkzdn1-8uiTDqNp3Um2sQw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2016-10-06 21:06 ` Maxime Ripard
0 siblings, 0 replies; 9+ messages in thread
From: Maxime Ripard @ 2016-10-06 21:06 UTC (permalink / raw)
To: Simon Glass
Cc: U-Boot Mailing List, Beniamino Galvani, Thierry Reding,
Marek Vasut, Nikita Kiryanov, Michal Simek, York Sun,
Andrej Rosano, Devicetree Compiler, Heiko Schocher,
Albert Aribaud, Andreas Dannenberg, Minkyu Kang, Robert P. J. Day,
Stephen Warren, Jagan Teki, Alexander Graf, Przemyslaw Marczak,
Thomas Abraham, Tom
[-- Attachment #1: Type: text/plain, Size: 909 bytes --]
Hi Simon,
On Thu, Oct 06, 2016 at 08:36:36AM -0600, Simon Glass wrote:
> > On Sun, Oct 02, 2016 at 05:59:24PM -0600, Simon Glass wrote:
> >> In a few cases the upstream versions of functions first written for U-Boot
> >> have landed in a slightly different form.
> >>
> >> This includes a few patches to fix these as well as various minor changes to
> >> reduce the delta.
> >
> > Thanks a lot for working on this.
> >
> > The overlay code just got merged, and it has a significant amount of
> > fixes, so it might be nice to do that sync with the latest dtc HEAD.
>
> Nice work! I see you have sent some fix-up patches two, right? If so I
> should probably wait until they land.
Yep, indeed. It's not really a big deal though, so I don't expect it
to take too much time.
Maxime
--
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2016-10-06 21:06 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-02 23:59 [PATCH 0/6] libfdt: Sync to upstream Simon Glass
[not found] ` <1475452771-16230-1-git-send-email-sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2016-10-02 23:59 ` [PATCH 2/6] libfdt: Fix undefined behaviour in fdt_offset_ptr() Simon Glass
2016-10-02 23:59 ` [PATCH 3/6] libfdt: Sync up with upstream Simon Glass
2016-10-02 23:59 ` [PATCH 4/6] libfdt: Bring in upstream stringlist functions Simon Glass
2016-10-02 23:59 ` [PATCH 5/6] libfdt: Sync fdt_for_each_subnode() with upstream Simon Glass
2016-10-02 23:59 ` [PATCH 6/6] libfdt: Drop inlining of fdt_path_offset() Simon Glass
2016-10-06 13:53 ` [PATCH 0/6] libfdt: Sync to upstream Maxime Ripard
2016-10-06 14:36 ` Simon Glass
[not found] ` <CAPnjgZ07Ab8fX2ZNUikjKxenzvswdkzdn1-8uiTDqNp3Um2sQw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-10-06 21:06 ` Maxime Ripard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).