All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] of: remove *phandle properties from expanded device tree
@ 2017-04-15  3:55 ` frowand.list-Re5JQEeQqe8AvxtiuMwx3w
  0 siblings, 0 replies; 18+ messages in thread
From: frowand.list @ 2017-04-15  3:55 UTC (permalink / raw)
  To: Rob Herring; +Cc: devicetree, linux-kernel

From: Frank Rowand <frank.rowand@sony.com>

Remove "phandle" and "linux,phandle" properties from the internal
device tree.  The phandle will still be in the struct device_node
phandle field.

This is to resolve the issue found by Stephen Boyd [1] when he changed
the type of struct property.value from void * to const void *.  As
a result of the type change, the overlay code had compile errors
where the resolver updates phandle values.

  [1] http://lkml.iu.edu/hypermail/linux/kernel/1702.1/04160.html

Patch 1 is the phandle related changes.

Patches 2 - 4 are minor fixups for issues that became visible
while implementing patch 1.

Frank Rowand (4):
  of: remove *phandle properties from expanded device tree
  of: make __of_attach_node() static
  of: be consistent in form of file mode
  of: detect invalid phandle in overlay

 drivers/of/base.c       | 53 +++++++++++++++++++++++++++++++++++++++++++++----
 drivers/of/dynamic.c    | 31 ++++++++++++++++-------------
 drivers/of/fdt.c        | 40 ++++++++++++++++++++++---------------
 drivers/of/of_private.h |  1 -
 drivers/of/overlay.c    |  8 +++++---
 drivers/of/resolver.c   | 23 +--------------------
 include/linux/of.h      |  1 +
 7 files changed, 97 insertions(+), 60 deletions(-)

-- 
Frank Rowand <frank.rowand@sony.com>

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH 0/4] of: remove *phandle properties from expanded device tree
@ 2017-04-15  3:55 ` frowand.list-Re5JQEeQqe8AvxtiuMwx3w
  0 siblings, 0 replies; 18+ messages in thread
From: frowand.list-Re5JQEeQqe8AvxtiuMwx3w @ 2017-04-15  3:55 UTC (permalink / raw)
  To: Rob Herring
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA

From: Frank Rowand <frank.rowand-7U/KSKJipcs@public.gmane.org>

Remove "phandle" and "linux,phandle" properties from the internal
device tree.  The phandle will still be in the struct device_node
phandle field.

This is to resolve the issue found by Stephen Boyd [1] when he changed
the type of struct property.value from void * to const void *.  As
a result of the type change, the overlay code had compile errors
where the resolver updates phandle values.

  [1] http://lkml.iu.edu/hypermail/linux/kernel/1702.1/04160.html

Patch 1 is the phandle related changes.

Patches 2 - 4 are minor fixups for issues that became visible
while implementing patch 1.

Frank Rowand (4):
  of: remove *phandle properties from expanded device tree
  of: make __of_attach_node() static
  of: be consistent in form of file mode
  of: detect invalid phandle in overlay

 drivers/of/base.c       | 53 +++++++++++++++++++++++++++++++++++++++++++++----
 drivers/of/dynamic.c    | 31 ++++++++++++++++-------------
 drivers/of/fdt.c        | 40 ++++++++++++++++++++++---------------
 drivers/of/of_private.h |  1 -
 drivers/of/overlay.c    |  8 +++++---
 drivers/of/resolver.c   | 23 +--------------------
 include/linux/of.h      |  1 +
 7 files changed, 97 insertions(+), 60 deletions(-)

-- 
Frank Rowand <frank.rowand-7U/KSKJipcs@public.gmane.org>

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH 1/4] of: remove *phandle properties from expanded device tree
@ 2017-04-15  3:55   ` frowand.list-Re5JQEeQqe8AvxtiuMwx3w
  0 siblings, 0 replies; 18+ messages in thread
From: frowand.list @ 2017-04-15  3:55 UTC (permalink / raw)
  To: Rob Herring; +Cc: devicetree, linux-kernel

From: Frank Rowand <frank.rowand@sony.com>

Remove "phandle" and "linux,phandle" properties from the internal
device tree.  The phandle will still be in the struct device_node
phandle field.

This is to resolve the issue found by Stephen Boyd [1] when he changed
the type of struct property.value from void * to const void *.  As
a result of the type change, the overlay code had compile errors
where the resolver updates phandle values.

  [1] http://lkml.iu.edu/hypermail/linux/kernel/1702.1/04160.html

- Add sysfs infrastructure to report np->phandle, as if it was a property.
- Do not create "phandle" "ibm,phandle", and "linux,phandle" properties
  in the expanded device tree.
- Remove no longer needed checks to exclude "phandle" and "linux,phandle"
  properties in several locations.
- A side effect of these changes is that the obsolete "linux,phandle"
  properties will no longer appear in /proc/device-tree

Signed-off-by: Frank Rowand <frank.rowand@sony.com>
---
 drivers/of/base.c     | 51 ++++++++++++++++++++++++++++++++++++++++++++++++---
 drivers/of/dynamic.c  | 29 ++++++++++++++++-------------
 drivers/of/fdt.c      | 40 ++++++++++++++++++++++++----------------
 drivers/of/overlay.c  |  4 +---
 drivers/of/resolver.c | 23 +----------------------
 include/linux/of.h    |  1 +
 6 files changed, 91 insertions(+), 57 deletions(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index d7c4629a3a2d..197946615503 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -116,6 +116,19 @@ static ssize_t of_node_property_read(struct file *filp, struct kobject *kobj,
 	return memory_read_from_buffer(buf, count, &offset, pp->value, pp->length);
 }
 
+static ssize_t of_node_phandle_read(struct file *filp, struct kobject *kobj,
+				struct bin_attribute *bin_attr, char *buf,
+				loff_t offset, size_t count)
+{
+	phandle phandle;
+	struct device_node *np;
+
+	np = container_of(bin_attr, struct device_node, attr_phandle);
+	phandle = cpu_to_be32(np->phandle);
+	return memory_read_from_buffer(buf, count, &offset, &phandle,
+				       sizeof(phandle));
+}
+
 /* always return newly allocated name, caller must free after use */
 static const char *safe_name(struct kobject *kobj, const char *orig_name)
 {
@@ -164,6 +177,38 @@ int __of_add_property_sysfs(struct device_node *np, struct property *pp)
 	return rc;
 }
 
+/*
+ * In the imported device tree (fdt), phandle is a property.  In the
+ * internal data structure it is instead stored in the struct device_node.
+ * Make phandle visible in sysfs as if it was a property.
+ */
+static int __of_add_phandle_sysfs(struct device_node *np)
+{
+	int rc;
+
+	if (IS_ENABLED(CONFIG_PPC_PSERIES))
+		return 0;
+
+	if (!IS_ENABLED(CONFIG_SYSFS))
+		return 0;
+
+	if (!of_kset || !of_node_is_attached(np))
+		return 0;
+
+	if (!np->phandle || np->phandle == 0xffffffff)
+		return 0;
+
+	sysfs_bin_attr_init(&pp->attr);
+	np->attr_phandle.attr.name = "phandle";
+	np->attr_phandle.attr.mode = 0444;
+	np->attr_phandle.size = sizeof(np->phandle);
+	np->attr_phandle.read = of_node_phandle_read;
+
+	rc = sysfs_create_bin_file(&np->kobj, &np->attr_phandle);
+	WARN(rc, "error adding attribute phandle to node %s\n", np->full_name);
+	return rc;
+}
+
 int __of_attach_node_sysfs(struct device_node *np)
 {
 	const char *name;
@@ -193,6 +238,8 @@ int __of_attach_node_sysfs(struct device_node *np)
 	if (rc)
 		return rc;
 
+	__of_add_phandle_sysfs(np);
+
 	for_each_property_of_node(np, pp)
 		__of_add_property_sysfs(np, pp);
 
@@ -2097,9 +2144,7 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
 		int id, len;
 
 		/* Skip those we do not want to proceed */
-		if (!strcmp(pp->name, "name") ||
-		    !strcmp(pp->name, "phandle") ||
-		    !strcmp(pp->name, "linux,phandle"))
+		if (!strcmp(pp->name, "name"))
 			continue;
 
 		np = of_find_node_by_path(pp->value);
diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
index 888fdbc09992..c6fd3f32bfcb 100644
--- a/drivers/of/dynamic.c
+++ b/drivers/of/dynamic.c
@@ -218,19 +218,6 @@ int of_property_notify(int action, struct device_node *np,
 
 void __of_attach_node(struct device_node *np)
 {
-	const __be32 *phandle;
-	int sz;
-
-	np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
-	np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
-
-	phandle = __of_get_property(np, "phandle", &sz);
-	if (!phandle)
-		phandle = __of_get_property(np, "linux,phandle", &sz);
-	if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
-		phandle = __of_get_property(np, "ibm,phandle", &sz);
-	np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0;
-
 	np->child = NULL;
 	np->sibling = np->parent->child;
 	np->parent->child = np;
@@ -244,10 +231,22 @@ int of_attach_node(struct device_node *np)
 {
 	struct of_reconfig_data rd;
 	unsigned long flags;
+	const __be32 *phandle;
+	int sz;
 
 	memset(&rd, 0, sizeof(rd));
 	rd.dn = np;
 
+	np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
+	np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
+
+	phandle = __of_get_property(np, "phandle", &sz);
+	if (!phandle)
+		phandle = __of_get_property(np, "linux,phandle", &sz);
+	if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
+		phandle = __of_get_property(np, "ibm,phandle", &sz);
+	np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0;
+
 	mutex_lock(&of_mutex);
 	raw_spin_lock_irqsave(&devtree_lock, flags);
 	__of_attach_node(np);
@@ -441,6 +440,10 @@ struct device_node *__of_node_dup(const struct device_node *np, const char *fmt,
 			}
 		}
 	}
+
+	node->name = __of_get_property(node, "name", NULL) ? : "<NULL>";
+	node->type = __of_get_property(node, "device_type", NULL) ? : "<NULL>";
+
 	return node;
 
  err_prop:
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index e5ce4b59e162..270f31b0c259 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -181,6 +181,8 @@ static void populate_properties(const void *blob,
 		const __be32 *val;
 		const char *pname;
 		u32 sz;
+		int prop_is_phandle = 0;
+		int prop_is_ibm_phandle = 0;
 
 		val = fdt_getprop_by_offset(blob, cur, &pname, &sz);
 		if (!val) {
@@ -196,11 +198,6 @@ static void populate_properties(const void *blob,
 		if (!strcmp(pname, "name"))
 			has_name = true;
 
-		pp = unflatten_dt_alloc(mem, sizeof(struct property),
-					__alignof__(struct property));
-		if (dryrun)
-			continue;
-
 		/* We accept flattened tree phandles either in
 		 * ePAPR-style "phandle" properties, or the
 		 * legacy "linux,phandle" properties.  If both
@@ -208,23 +205,34 @@ static void populate_properties(const void *blob,
 		 * will get weird. Don't do that.
 		 */
 		if (!strcmp(pname, "phandle") ||
-		    !strcmp(pname, "linux,phandle")) {
-			if (!np->phandle)
-				np->phandle = be32_to_cpup(val);
-		}
+		    !strcmp(pname, "linux,phandle"))
+			prop_is_phandle = 1;
 
 		/* And we process the "ibm,phandle" property
 		 * used in pSeries dynamic device tree
 		 * stuff
 		 */
-		if (!strcmp(pname, "ibm,phandle"))
-			np->phandle = be32_to_cpup(val);
+		if (!strcmp(pname, "ibm,phandle")) {
+			prop_is_phandle = 1;
+			prop_is_ibm_phandle = 1;
+		}
+
+		if (!prop_is_phandle)
+			pp = unflatten_dt_alloc(mem, sizeof(struct property),
+						__alignof__(struct property));
 
-		pp->name   = (char *)pname;
-		pp->length = sz;
-		pp->value  = (__be32 *)val;
-		*pprev     = pp;
-		pprev      = &pp->next;
+		if (dryrun)
+			continue;
+
+		if (!prop_is_phandle) {
+			pp->name   = (char *)pname;
+			pp->length = sz;
+			pp->value  = (__be32 *)val;
+			*pprev     = pp;
+			pprev      = &pp->next;
+		} else if (prop_is_ibm_phandle || !np->phandle) {
+			np->phandle = be32_to_cpup(val);
+		}
 	}
 
 	/* With version 0x10 we may not have the name property,
diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
index 7827786718d8..ca0b85f5deb1 100644
--- a/drivers/of/overlay.c
+++ b/drivers/of/overlay.c
@@ -101,9 +101,7 @@ static int of_overlay_apply_single_property(struct of_overlay *ov,
 	tprop = of_find_property(target, prop->name, NULL);
 
 	/* special properties are not meant to be updated (silent NOP) */
-	if (of_prop_cmp(prop->name, "name") == 0 ||
-	    of_prop_cmp(prop->name, "phandle") == 0 ||
-	    of_prop_cmp(prop->name, "linux,phandle") == 0)
+	if (!of_prop_cmp(prop->name, "name"))
 		return 0;
 
 	propn = __of_prop_dup(prop, GFP_KERNEL);
diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c
index 7ae9863cb0a4..624cbaeae0a4 100644
--- a/drivers/of/resolver.c
+++ b/drivers/of/resolver.c
@@ -71,30 +71,11 @@ static void adjust_overlay_phandles(struct device_node *overlay,
 		int phandle_delta)
 {
 	struct device_node *child;
-	struct property *prop;
-	phandle phandle;
 
 	/* adjust node's phandle in node */
 	if (overlay->phandle != 0 && overlay->phandle != OF_PHANDLE_ILLEGAL)
 		overlay->phandle += phandle_delta;
 
-	/* copy adjusted phandle into *phandle properties */
-	for_each_property_of_node(overlay, prop) {
-
-		if (of_prop_cmp(prop->name, "phandle") &&
-		    of_prop_cmp(prop->name, "linux,phandle"))
-			continue;
-
-		if (prop->length < 4)
-			continue;
-
-		phandle = be32_to_cpup(prop->value);
-		if (phandle == OF_PHANDLE_ILLEGAL)
-			continue;
-
-		*(uint32_t *)prop->value = cpu_to_be32(overlay->phandle);
-	}
-
 	for_each_child_of_node(overlay, child)
 		adjust_overlay_phandles(child, phandle_delta);
 }
@@ -197,9 +178,7 @@ static int adjust_local_phandle_references(struct device_node *local_fixups,
 	for_each_property_of_node(local_fixups, prop_fix) {
 
 		/* skip properties added automatically */
-		if (!of_prop_cmp(prop_fix->name, "name") ||
-		    !of_prop_cmp(prop_fix->name, "phandle") ||
-		    !of_prop_cmp(prop_fix->name, "linux,phandle"))
+		if (!of_prop_cmp(prop_fix->name, "name"))
 			continue;
 
 		if ((prop_fix->length % 4) != 0 || prop_fix->length == 0)
diff --git a/include/linux/of.h b/include/linux/of.h
index 21e6323de0f3..4e86e05853f3 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -61,6 +61,7 @@ struct device_node {
 	struct	kobject kobj;
 	unsigned long _flags;
 	void	*data;
+	struct bin_attribute attr_phandle;
 #if defined(CONFIG_SPARC)
 	const char *path_component_name;
 	unsigned int unique_id;
-- 
Frank Rowand <frank.rowand@sony.com>

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 1/4] of: remove *phandle properties from expanded device tree
@ 2017-04-15  3:55   ` frowand.list-Re5JQEeQqe8AvxtiuMwx3w
  0 siblings, 0 replies; 18+ messages in thread
From: frowand.list-Re5JQEeQqe8AvxtiuMwx3w @ 2017-04-15  3:55 UTC (permalink / raw)
  To: Rob Herring
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA

From: Frank Rowand <frank.rowand-7U/KSKJipcs@public.gmane.org>

Remove "phandle" and "linux,phandle" properties from the internal
device tree.  The phandle will still be in the struct device_node
phandle field.

This is to resolve the issue found by Stephen Boyd [1] when he changed
the type of struct property.value from void * to const void *.  As
a result of the type change, the overlay code had compile errors
where the resolver updates phandle values.

  [1] http://lkml.iu.edu/hypermail/linux/kernel/1702.1/04160.html

- Add sysfs infrastructure to report np->phandle, as if it was a property.
- Do not create "phandle" "ibm,phandle", and "linux,phandle" properties
  in the expanded device tree.
- Remove no longer needed checks to exclude "phandle" and "linux,phandle"
  properties in several locations.
- A side effect of these changes is that the obsolete "linux,phandle"
  properties will no longer appear in /proc/device-tree

Signed-off-by: Frank Rowand <frank.rowand-7U/KSKJipcs@public.gmane.org>
---
 drivers/of/base.c     | 51 ++++++++++++++++++++++++++++++++++++++++++++++++---
 drivers/of/dynamic.c  | 29 ++++++++++++++++-------------
 drivers/of/fdt.c      | 40 ++++++++++++++++++++++++----------------
 drivers/of/overlay.c  |  4 +---
 drivers/of/resolver.c | 23 +----------------------
 include/linux/of.h    |  1 +
 6 files changed, 91 insertions(+), 57 deletions(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index d7c4629a3a2d..197946615503 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -116,6 +116,19 @@ static ssize_t of_node_property_read(struct file *filp, struct kobject *kobj,
 	return memory_read_from_buffer(buf, count, &offset, pp->value, pp->length);
 }
 
+static ssize_t of_node_phandle_read(struct file *filp, struct kobject *kobj,
+				struct bin_attribute *bin_attr, char *buf,
+				loff_t offset, size_t count)
+{
+	phandle phandle;
+	struct device_node *np;
+
+	np = container_of(bin_attr, struct device_node, attr_phandle);
+	phandle = cpu_to_be32(np->phandle);
+	return memory_read_from_buffer(buf, count, &offset, &phandle,
+				       sizeof(phandle));
+}
+
 /* always return newly allocated name, caller must free after use */
 static const char *safe_name(struct kobject *kobj, const char *orig_name)
 {
@@ -164,6 +177,38 @@ int __of_add_property_sysfs(struct device_node *np, struct property *pp)
 	return rc;
 }
 
+/*
+ * In the imported device tree (fdt), phandle is a property.  In the
+ * internal data structure it is instead stored in the struct device_node.
+ * Make phandle visible in sysfs as if it was a property.
+ */
+static int __of_add_phandle_sysfs(struct device_node *np)
+{
+	int rc;
+
+	if (IS_ENABLED(CONFIG_PPC_PSERIES))
+		return 0;
+
+	if (!IS_ENABLED(CONFIG_SYSFS))
+		return 0;
+
+	if (!of_kset || !of_node_is_attached(np))
+		return 0;
+
+	if (!np->phandle || np->phandle == 0xffffffff)
+		return 0;
+
+	sysfs_bin_attr_init(&pp->attr);
+	np->attr_phandle.attr.name = "phandle";
+	np->attr_phandle.attr.mode = 0444;
+	np->attr_phandle.size = sizeof(np->phandle);
+	np->attr_phandle.read = of_node_phandle_read;
+
+	rc = sysfs_create_bin_file(&np->kobj, &np->attr_phandle);
+	WARN(rc, "error adding attribute phandle to node %s\n", np->full_name);
+	return rc;
+}
+
 int __of_attach_node_sysfs(struct device_node *np)
 {
 	const char *name;
@@ -193,6 +238,8 @@ int __of_attach_node_sysfs(struct device_node *np)
 	if (rc)
 		return rc;
 
+	__of_add_phandle_sysfs(np);
+
 	for_each_property_of_node(np, pp)
 		__of_add_property_sysfs(np, pp);
 
@@ -2097,9 +2144,7 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
 		int id, len;
 
 		/* Skip those we do not want to proceed */
-		if (!strcmp(pp->name, "name") ||
-		    !strcmp(pp->name, "phandle") ||
-		    !strcmp(pp->name, "linux,phandle"))
+		if (!strcmp(pp->name, "name"))
 			continue;
 
 		np = of_find_node_by_path(pp->value);
diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
index 888fdbc09992..c6fd3f32bfcb 100644
--- a/drivers/of/dynamic.c
+++ b/drivers/of/dynamic.c
@@ -218,19 +218,6 @@ int of_property_notify(int action, struct device_node *np,
 
 void __of_attach_node(struct device_node *np)
 {
-	const __be32 *phandle;
-	int sz;
-
-	np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
-	np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
-
-	phandle = __of_get_property(np, "phandle", &sz);
-	if (!phandle)
-		phandle = __of_get_property(np, "linux,phandle", &sz);
-	if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
-		phandle = __of_get_property(np, "ibm,phandle", &sz);
-	np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0;
-
 	np->child = NULL;
 	np->sibling = np->parent->child;
 	np->parent->child = np;
@@ -244,10 +231,22 @@ int of_attach_node(struct device_node *np)
 {
 	struct of_reconfig_data rd;
 	unsigned long flags;
+	const __be32 *phandle;
+	int sz;
 
 	memset(&rd, 0, sizeof(rd));
 	rd.dn = np;
 
+	np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
+	np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
+
+	phandle = __of_get_property(np, "phandle", &sz);
+	if (!phandle)
+		phandle = __of_get_property(np, "linux,phandle", &sz);
+	if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
+		phandle = __of_get_property(np, "ibm,phandle", &sz);
+	np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0;
+
 	mutex_lock(&of_mutex);
 	raw_spin_lock_irqsave(&devtree_lock, flags);
 	__of_attach_node(np);
@@ -441,6 +440,10 @@ struct device_node *__of_node_dup(const struct device_node *np, const char *fmt,
 			}
 		}
 	}
+
+	node->name = __of_get_property(node, "name", NULL) ? : "<NULL>";
+	node->type = __of_get_property(node, "device_type", NULL) ? : "<NULL>";
+
 	return node;
 
  err_prop:
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index e5ce4b59e162..270f31b0c259 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -181,6 +181,8 @@ static void populate_properties(const void *blob,
 		const __be32 *val;
 		const char *pname;
 		u32 sz;
+		int prop_is_phandle = 0;
+		int prop_is_ibm_phandle = 0;
 
 		val = fdt_getprop_by_offset(blob, cur, &pname, &sz);
 		if (!val) {
@@ -196,11 +198,6 @@ static void populate_properties(const void *blob,
 		if (!strcmp(pname, "name"))
 			has_name = true;
 
-		pp = unflatten_dt_alloc(mem, sizeof(struct property),
-					__alignof__(struct property));
-		if (dryrun)
-			continue;
-
 		/* We accept flattened tree phandles either in
 		 * ePAPR-style "phandle" properties, or the
 		 * legacy "linux,phandle" properties.  If both
@@ -208,23 +205,34 @@ static void populate_properties(const void *blob,
 		 * will get weird. Don't do that.
 		 */
 		if (!strcmp(pname, "phandle") ||
-		    !strcmp(pname, "linux,phandle")) {
-			if (!np->phandle)
-				np->phandle = be32_to_cpup(val);
-		}
+		    !strcmp(pname, "linux,phandle"))
+			prop_is_phandle = 1;
 
 		/* And we process the "ibm,phandle" property
 		 * used in pSeries dynamic device tree
 		 * stuff
 		 */
-		if (!strcmp(pname, "ibm,phandle"))
-			np->phandle = be32_to_cpup(val);
+		if (!strcmp(pname, "ibm,phandle")) {
+			prop_is_phandle = 1;
+			prop_is_ibm_phandle = 1;
+		}
+
+		if (!prop_is_phandle)
+			pp = unflatten_dt_alloc(mem, sizeof(struct property),
+						__alignof__(struct property));
 
-		pp->name   = (char *)pname;
-		pp->length = sz;
-		pp->value  = (__be32 *)val;
-		*pprev     = pp;
-		pprev      = &pp->next;
+		if (dryrun)
+			continue;
+
+		if (!prop_is_phandle) {
+			pp->name   = (char *)pname;
+			pp->length = sz;
+			pp->value  = (__be32 *)val;
+			*pprev     = pp;
+			pprev      = &pp->next;
+		} else if (prop_is_ibm_phandle || !np->phandle) {
+			np->phandle = be32_to_cpup(val);
+		}
 	}
 
 	/* With version 0x10 we may not have the name property,
diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
index 7827786718d8..ca0b85f5deb1 100644
--- a/drivers/of/overlay.c
+++ b/drivers/of/overlay.c
@@ -101,9 +101,7 @@ static int of_overlay_apply_single_property(struct of_overlay *ov,
 	tprop = of_find_property(target, prop->name, NULL);
 
 	/* special properties are not meant to be updated (silent NOP) */
-	if (of_prop_cmp(prop->name, "name") == 0 ||
-	    of_prop_cmp(prop->name, "phandle") == 0 ||
-	    of_prop_cmp(prop->name, "linux,phandle") == 0)
+	if (!of_prop_cmp(prop->name, "name"))
 		return 0;
 
 	propn = __of_prop_dup(prop, GFP_KERNEL);
diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c
index 7ae9863cb0a4..624cbaeae0a4 100644
--- a/drivers/of/resolver.c
+++ b/drivers/of/resolver.c
@@ -71,30 +71,11 @@ static void adjust_overlay_phandles(struct device_node *overlay,
 		int phandle_delta)
 {
 	struct device_node *child;
-	struct property *prop;
-	phandle phandle;
 
 	/* adjust node's phandle in node */
 	if (overlay->phandle != 0 && overlay->phandle != OF_PHANDLE_ILLEGAL)
 		overlay->phandle += phandle_delta;
 
-	/* copy adjusted phandle into *phandle properties */
-	for_each_property_of_node(overlay, prop) {
-
-		if (of_prop_cmp(prop->name, "phandle") &&
-		    of_prop_cmp(prop->name, "linux,phandle"))
-			continue;
-
-		if (prop->length < 4)
-			continue;
-
-		phandle = be32_to_cpup(prop->value);
-		if (phandle == OF_PHANDLE_ILLEGAL)
-			continue;
-
-		*(uint32_t *)prop->value = cpu_to_be32(overlay->phandle);
-	}
-
 	for_each_child_of_node(overlay, child)
 		adjust_overlay_phandles(child, phandle_delta);
 }
@@ -197,9 +178,7 @@ static int adjust_local_phandle_references(struct device_node *local_fixups,
 	for_each_property_of_node(local_fixups, prop_fix) {
 
 		/* skip properties added automatically */
-		if (!of_prop_cmp(prop_fix->name, "name") ||
-		    !of_prop_cmp(prop_fix->name, "phandle") ||
-		    !of_prop_cmp(prop_fix->name, "linux,phandle"))
+		if (!of_prop_cmp(prop_fix->name, "name"))
 			continue;
 
 		if ((prop_fix->length % 4) != 0 || prop_fix->length == 0)
diff --git a/include/linux/of.h b/include/linux/of.h
index 21e6323de0f3..4e86e05853f3 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -61,6 +61,7 @@ struct device_node {
 	struct	kobject kobj;
 	unsigned long _flags;
 	void	*data;
+	struct bin_attribute attr_phandle;
 #if defined(CONFIG_SPARC)
 	const char *path_component_name;
 	unsigned int unique_id;
-- 
Frank Rowand <frank.rowand-7U/KSKJipcs@public.gmane.org>

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 2/4] of: make __of_attach_node() static
  2017-04-15  3:55 ` frowand.list-Re5JQEeQqe8AvxtiuMwx3w
  (?)
  (?)
@ 2017-04-15  3:55 ` frowand.list
  2017-04-15  3:59   ` Frank Rowand
  -1 siblings, 1 reply; 18+ messages in thread
From: frowand.list @ 2017-04-15  3:55 UTC (permalink / raw)
  To: Rob Herring; +Cc: devicetree, linux-kernel

From: Frank Rowand <frank.rowand@sony.com>

__of_attach_node() is not used outside of drivers/of/dynamic.c.  Make
it static and remove it from drivers/of/of_private.h.

Signed-off-by: Frank Rowand <frank.rowand@sony.com>
---
 drivers/of/dynamic.c    | 2 +-
 drivers/of/of_private.h | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
index c6fd3f32bfcb..74aafe594ad5 100644
--- a/drivers/of/dynamic.c
+++ b/drivers/of/dynamic.c
@@ -216,7 +216,7 @@ int of_property_notify(int action, struct device_node *np,
 	return of_reconfig_notify(action, &pr);
 }
 
-void __of_attach_node(struct device_node *np)
+static void __of_attach_node(struct device_node *np)
 {
 	np->child = NULL;
 	np->sibling = np->parent->child;
diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
index 18bbb4517e25..efcedcff7dba 100644
--- a/drivers/of/of_private.h
+++ b/drivers/of/of_private.h
@@ -78,7 +78,6 @@ extern int __of_update_property(struct device_node *np,
 extern void __of_update_property_sysfs(struct device_node *np,
 		struct property *newprop, struct property *oldprop);
 
-extern void __of_attach_node(struct device_node *np);
 extern int __of_attach_node_sysfs(struct device_node *np);
 extern void __of_detach_node(struct device_node *np);
 extern void __of_detach_node_sysfs(struct device_node *np);
-- 
Frank Rowand <frank.rowand@sony.com>

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 3/4] of: be consistent in form of file mode
  2017-04-15  3:55 ` frowand.list-Re5JQEeQqe8AvxtiuMwx3w
                   ` (2 preceding siblings ...)
  (?)
@ 2017-04-15  3:55 ` frowand.list
  2017-04-15  3:59   ` Frank Rowand
  -1 siblings, 1 reply; 18+ messages in thread
From: frowand.list @ 2017-04-15  3:55 UTC (permalink / raw)
  To: Rob Herring; +Cc: devicetree, linux-kernel

From: Frank Rowand <frank.rowand@sony.com>

checkpatch whined about using S_IRUGO instead of octal equivalent
when adding phandle sysfs code, so used octal in that patch.
Change other instances of the S_* constants in the same file to
the octal form.

Signed-off-by: Frank Rowand <frank.rowand@sony.com>
---
 drivers/of/base.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 197946615503..4a8bd9623140 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -168,7 +168,7 @@ int __of_add_property_sysfs(struct device_node *np, struct property *pp)
 
 	sysfs_bin_attr_init(&pp->attr);
 	pp->attr.attr.name = safe_name(&np->kobj, pp->name);
-	pp->attr.attr.mode = secure ? S_IRUSR : S_IRUGO;
+	pp->attr.attr.mode = secure ? 0400 : 0444;
 	pp->attr.size = secure ? 0 : pp->length;
 	pp->attr.read = of_node_property_read;
 
-- 
Frank Rowand <frank.rowand@sony.com>

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 4/4] of: detect invalid phandle in overlay
  2017-04-15  3:55 ` frowand.list-Re5JQEeQqe8AvxtiuMwx3w
                   ` (3 preceding siblings ...)
  (?)
@ 2017-04-15  3:55 ` frowand.list
  2017-04-15  3:59   ` Frank Rowand
  -1 siblings, 1 reply; 18+ messages in thread
From: frowand.list @ 2017-04-15  3:55 UTC (permalink / raw)
  To: Rob Herring; +Cc: devicetree, linux-kernel

From: Frank Rowand <frank.rowand@sony.com>

Overlays are not allowed to modify phandle values of previously existing
nodes because there is no information available to allow fixup up
properties that use the previously existing phandle.

Signed-off-by: Frank Rowand <frank.rowand@sony.com>
---
 drivers/of/overlay.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
index ca0b85f5deb1..20ab49d2f7a4 100644
--- a/drivers/of/overlay.c
+++ b/drivers/of/overlay.c
@@ -130,6 +130,10 @@ static int of_overlay_apply_single_device_node(struct of_overlay *ov,
 	/* NOTE: Multiple mods of created nodes not supported */
 	tchild = of_get_child_by_name(target, cname);
 	if (tchild != NULL) {
+		/* new overlay phandle value conflicts with existing value */
+		if (child->phandle)
+			return -EINVAL;
+
 		/* apply overlay recursively */
 		ret = of_overlay_apply_one(ov, tchild, child);
 		of_node_put(tchild);
-- 
Frank Rowand <frank.rowand@sony.com>

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH 0/4] of: remove *phandle properties from expanded device tree
@ 2017-04-15  3:58   ` Frank Rowand
  0 siblings, 0 replies; 18+ messages in thread
From: Frank Rowand @ 2017-04-15  3:58 UTC (permalink / raw)
  To: Rob Herring, Stephen Boyd; +Cc: devicetree, linux-kernel

Hi Stephen,

I left you off the distribution list, sorry...

On 04/14/17 20:55, frowand.list@gmail.com wrote:
> From: Frank Rowand <frank.rowand@sony.com>
> 
> Remove "phandle" and "linux,phandle" properties from the internal
> device tree.  The phandle will still be in the struct device_node
> phandle field.
> 
> This is to resolve the issue found by Stephen Boyd [1] when he changed
> the type of struct property.value from void * to const void *.  As
> a result of the type change, the overlay code had compile errors
> where the resolver updates phandle values.
> 
>   [1] http://lkml.iu.edu/hypermail/linux/kernel/1702.1/04160.html
> 
> Patch 1 is the phandle related changes.
> 
> Patches 2 - 4 are minor fixups for issues that became visible
> while implementing patch 1.
> 
> Frank Rowand (4):
>   of: remove *phandle properties from expanded device tree
>   of: make __of_attach_node() static
>   of: be consistent in form of file mode
>   of: detect invalid phandle in overlay
> 
>  drivers/of/base.c       | 53 +++++++++++++++++++++++++++++++++++++++++++++----
>  drivers/of/dynamic.c    | 31 ++++++++++++++++-------------
>  drivers/of/fdt.c        | 40 ++++++++++++++++++++++---------------
>  drivers/of/of_private.h |  1 -
>  drivers/of/overlay.c    |  8 +++++---
>  drivers/of/resolver.c   | 23 +--------------------
>  include/linux/of.h      |  1 +
>  7 files changed, 97 insertions(+), 60 deletions(-)
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 0/4] of: remove *phandle properties from expanded device tree
@ 2017-04-15  3:58   ` Frank Rowand
  0 siblings, 0 replies; 18+ messages in thread
From: Frank Rowand @ 2017-04-15  3:58 UTC (permalink / raw)
  To: Rob Herring, Stephen Boyd
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA

Hi Stephen,

I left you off the distribution list, sorry...

On 04/14/17 20:55, frowand.list-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org wrote:
> From: Frank Rowand <frank.rowand-7U/KSKJipcs@public.gmane.org>
> 
> Remove "phandle" and "linux,phandle" properties from the internal
> device tree.  The phandle will still be in the struct device_node
> phandle field.
> 
> This is to resolve the issue found by Stephen Boyd [1] when he changed
> the type of struct property.value from void * to const void *.  As
> a result of the type change, the overlay code had compile errors
> where the resolver updates phandle values.
> 
>   [1] http://lkml.iu.edu/hypermail/linux/kernel/1702.1/04160.html
> 
> Patch 1 is the phandle related changes.
> 
> Patches 2 - 4 are minor fixups for issues that became visible
> while implementing patch 1.
> 
> Frank Rowand (4):
>   of: remove *phandle properties from expanded device tree
>   of: make __of_attach_node() static
>   of: be consistent in form of file mode
>   of: detect invalid phandle in overlay
> 
>  drivers/of/base.c       | 53 +++++++++++++++++++++++++++++++++++++++++++++----
>  drivers/of/dynamic.c    | 31 ++++++++++++++++-------------
>  drivers/of/fdt.c        | 40 ++++++++++++++++++++++---------------
>  drivers/of/of_private.h |  1 -
>  drivers/of/overlay.c    |  8 +++++---
>  drivers/of/resolver.c   | 23 +--------------------
>  include/linux/of.h      |  1 +
>  7 files changed, 97 insertions(+), 60 deletions(-)
> 

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/4] of: remove *phandle properties from expanded device tree
@ 2017-04-15  3:59     ` Frank Rowand
  0 siblings, 0 replies; 18+ messages in thread
From: Frank Rowand @ 2017-04-15  3:59 UTC (permalink / raw)
  To: Rob Herring, Stephen Boyd; +Cc: devicetree, linux-kernel

Adding Stephen.

On 04/14/17 20:55, frowand.list@gmail.com wrote:
> From: Frank Rowand <frank.rowand@sony.com>
> 
> Remove "phandle" and "linux,phandle" properties from the internal
> device tree.  The phandle will still be in the struct device_node
> phandle field.
> 
> This is to resolve the issue found by Stephen Boyd [1] when he changed
> the type of struct property.value from void * to const void *.  As
> a result of the type change, the overlay code had compile errors
> where the resolver updates phandle values.
> 
>   [1] http://lkml.iu.edu/hypermail/linux/kernel/1702.1/04160.html
> 
> - Add sysfs infrastructure to report np->phandle, as if it was a property.
> - Do not create "phandle" "ibm,phandle", and "linux,phandle" properties
>   in the expanded device tree.
> - Remove no longer needed checks to exclude "phandle" and "linux,phandle"
>   properties in several locations.
> - A side effect of these changes is that the obsolete "linux,phandle"
>   properties will no longer appear in /proc/device-tree
> 
> Signed-off-by: Frank Rowand <frank.rowand@sony.com>
> ---
>  drivers/of/base.c     | 51 ++++++++++++++++++++++++++++++++++++++++++++++++---
>  drivers/of/dynamic.c  | 29 ++++++++++++++++-------------
>  drivers/of/fdt.c      | 40 ++++++++++++++++++++++++----------------
>  drivers/of/overlay.c  |  4 +---
>  drivers/of/resolver.c | 23 +----------------------
>  include/linux/of.h    |  1 +
>  6 files changed, 91 insertions(+), 57 deletions(-)
> 
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index d7c4629a3a2d..197946615503 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -116,6 +116,19 @@ static ssize_t of_node_property_read(struct file *filp, struct kobject *kobj,
>  	return memory_read_from_buffer(buf, count, &offset, pp->value, pp->length);
>  }
>  
> +static ssize_t of_node_phandle_read(struct file *filp, struct kobject *kobj,
> +				struct bin_attribute *bin_attr, char *buf,
> +				loff_t offset, size_t count)
> +{
> +	phandle phandle;
> +	struct device_node *np;
> +
> +	np = container_of(bin_attr, struct device_node, attr_phandle);
> +	phandle = cpu_to_be32(np->phandle);
> +	return memory_read_from_buffer(buf, count, &offset, &phandle,
> +				       sizeof(phandle));
> +}
> +
>  /* always return newly allocated name, caller must free after use */
>  static const char *safe_name(struct kobject *kobj, const char *orig_name)
>  {
> @@ -164,6 +177,38 @@ int __of_add_property_sysfs(struct device_node *np, struct property *pp)
>  	return rc;
>  }
>  
> +/*
> + * In the imported device tree (fdt), phandle is a property.  In the
> + * internal data structure it is instead stored in the struct device_node.
> + * Make phandle visible in sysfs as if it was a property.
> + */
> +static int __of_add_phandle_sysfs(struct device_node *np)
> +{
> +	int rc;
> +
> +	if (IS_ENABLED(CONFIG_PPC_PSERIES))
> +		return 0;
> +
> +	if (!IS_ENABLED(CONFIG_SYSFS))
> +		return 0;
> +
> +	if (!of_kset || !of_node_is_attached(np))
> +		return 0;
> +
> +	if (!np->phandle || np->phandle == 0xffffffff)
> +		return 0;
> +
> +	sysfs_bin_attr_init(&pp->attr);
> +	np->attr_phandle.attr.name = "phandle";
> +	np->attr_phandle.attr.mode = 0444;
> +	np->attr_phandle.size = sizeof(np->phandle);
> +	np->attr_phandle.read = of_node_phandle_read;
> +
> +	rc = sysfs_create_bin_file(&np->kobj, &np->attr_phandle);
> +	WARN(rc, "error adding attribute phandle to node %s\n", np->full_name);
> +	return rc;
> +}
> +
>  int __of_attach_node_sysfs(struct device_node *np)
>  {
>  	const char *name;
> @@ -193,6 +238,8 @@ int __of_attach_node_sysfs(struct device_node *np)
>  	if (rc)
>  		return rc;
>  
> +	__of_add_phandle_sysfs(np);
> +
>  	for_each_property_of_node(np, pp)
>  		__of_add_property_sysfs(np, pp);
>  
> @@ -2097,9 +2144,7 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
>  		int id, len;
>  
>  		/* Skip those we do not want to proceed */
> -		if (!strcmp(pp->name, "name") ||
> -		    !strcmp(pp->name, "phandle") ||
> -		    !strcmp(pp->name, "linux,phandle"))
> +		if (!strcmp(pp->name, "name"))
>  			continue;
>  
>  		np = of_find_node_by_path(pp->value);
> diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
> index 888fdbc09992..c6fd3f32bfcb 100644
> --- a/drivers/of/dynamic.c
> +++ b/drivers/of/dynamic.c
> @@ -218,19 +218,6 @@ int of_property_notify(int action, struct device_node *np,
>  
>  void __of_attach_node(struct device_node *np)
>  {
> -	const __be32 *phandle;
> -	int sz;
> -
> -	np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
> -	np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
> -
> -	phandle = __of_get_property(np, "phandle", &sz);
> -	if (!phandle)
> -		phandle = __of_get_property(np, "linux,phandle", &sz);
> -	if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
> -		phandle = __of_get_property(np, "ibm,phandle", &sz);
> -	np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0;
> -
>  	np->child = NULL;
>  	np->sibling = np->parent->child;
>  	np->parent->child = np;
> @@ -244,10 +231,22 @@ int of_attach_node(struct device_node *np)
>  {
>  	struct of_reconfig_data rd;
>  	unsigned long flags;
> +	const __be32 *phandle;
> +	int sz;
>  
>  	memset(&rd, 0, sizeof(rd));
>  	rd.dn = np;
>  
> +	np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
> +	np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
> +
> +	phandle = __of_get_property(np, "phandle", &sz);
> +	if (!phandle)
> +		phandle = __of_get_property(np, "linux,phandle", &sz);
> +	if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
> +		phandle = __of_get_property(np, "ibm,phandle", &sz);
> +	np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0;
> +
>  	mutex_lock(&of_mutex);
>  	raw_spin_lock_irqsave(&devtree_lock, flags);
>  	__of_attach_node(np);
> @@ -441,6 +440,10 @@ struct device_node *__of_node_dup(const struct device_node *np, const char *fmt,
>  			}
>  		}
>  	}
> +
> +	node->name = __of_get_property(node, "name", NULL) ? : "<NULL>";
> +	node->type = __of_get_property(node, "device_type", NULL) ? : "<NULL>";
> +
>  	return node;
>  
>   err_prop:
> diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
> index e5ce4b59e162..270f31b0c259 100644
> --- a/drivers/of/fdt.c
> +++ b/drivers/of/fdt.c
> @@ -181,6 +181,8 @@ static void populate_properties(const void *blob,
>  		const __be32 *val;
>  		const char *pname;
>  		u32 sz;
> +		int prop_is_phandle = 0;
> +		int prop_is_ibm_phandle = 0;
>  
>  		val = fdt_getprop_by_offset(blob, cur, &pname, &sz);
>  		if (!val) {
> @@ -196,11 +198,6 @@ static void populate_properties(const void *blob,
>  		if (!strcmp(pname, "name"))
>  			has_name = true;
>  
> -		pp = unflatten_dt_alloc(mem, sizeof(struct property),
> -					__alignof__(struct property));
> -		if (dryrun)
> -			continue;
> -
>  		/* We accept flattened tree phandles either in
>  		 * ePAPR-style "phandle" properties, or the
>  		 * legacy "linux,phandle" properties.  If both
> @@ -208,23 +205,34 @@ static void populate_properties(const void *blob,
>  		 * will get weird. Don't do that.
>  		 */
>  		if (!strcmp(pname, "phandle") ||
> -		    !strcmp(pname, "linux,phandle")) {
> -			if (!np->phandle)
> -				np->phandle = be32_to_cpup(val);
> -		}
> +		    !strcmp(pname, "linux,phandle"))
> +			prop_is_phandle = 1;
>  
>  		/* And we process the "ibm,phandle" property
>  		 * used in pSeries dynamic device tree
>  		 * stuff
>  		 */
> -		if (!strcmp(pname, "ibm,phandle"))
> -			np->phandle = be32_to_cpup(val);
> +		if (!strcmp(pname, "ibm,phandle")) {
> +			prop_is_phandle = 1;
> +			prop_is_ibm_phandle = 1;
> +		}
> +
> +		if (!prop_is_phandle)
> +			pp = unflatten_dt_alloc(mem, sizeof(struct property),
> +						__alignof__(struct property));
>  
> -		pp->name   = (char *)pname;
> -		pp->length = sz;
> -		pp->value  = (__be32 *)val;
> -		*pprev     = pp;
> -		pprev      = &pp->next;
> +		if (dryrun)
> +			continue;
> +
> +		if (!prop_is_phandle) {
> +			pp->name   = (char *)pname;
> +			pp->length = sz;
> +			pp->value  = (__be32 *)val;
> +			*pprev     = pp;
> +			pprev      = &pp->next;
> +		} else if (prop_is_ibm_phandle || !np->phandle) {
> +			np->phandle = be32_to_cpup(val);
> +		}
>  	}
>  
>  	/* With version 0x10 we may not have the name property,
> diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
> index 7827786718d8..ca0b85f5deb1 100644
> --- a/drivers/of/overlay.c
> +++ b/drivers/of/overlay.c
> @@ -101,9 +101,7 @@ static int of_overlay_apply_single_property(struct of_overlay *ov,
>  	tprop = of_find_property(target, prop->name, NULL);
>  
>  	/* special properties are not meant to be updated (silent NOP) */
> -	if (of_prop_cmp(prop->name, "name") == 0 ||
> -	    of_prop_cmp(prop->name, "phandle") == 0 ||
> -	    of_prop_cmp(prop->name, "linux,phandle") == 0)
> +	if (!of_prop_cmp(prop->name, "name"))
>  		return 0;
>  
>  	propn = __of_prop_dup(prop, GFP_KERNEL);
> diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c
> index 7ae9863cb0a4..624cbaeae0a4 100644
> --- a/drivers/of/resolver.c
> +++ b/drivers/of/resolver.c
> @@ -71,30 +71,11 @@ static void adjust_overlay_phandles(struct device_node *overlay,
>  		int phandle_delta)
>  {
>  	struct device_node *child;
> -	struct property *prop;
> -	phandle phandle;
>  
>  	/* adjust node's phandle in node */
>  	if (overlay->phandle != 0 && overlay->phandle != OF_PHANDLE_ILLEGAL)
>  		overlay->phandle += phandle_delta;
>  
> -	/* copy adjusted phandle into *phandle properties */
> -	for_each_property_of_node(overlay, prop) {
> -
> -		if (of_prop_cmp(prop->name, "phandle") &&
> -		    of_prop_cmp(prop->name, "linux,phandle"))
> -			continue;
> -
> -		if (prop->length < 4)
> -			continue;
> -
> -		phandle = be32_to_cpup(prop->value);
> -		if (phandle == OF_PHANDLE_ILLEGAL)
> -			continue;
> -
> -		*(uint32_t *)prop->value = cpu_to_be32(overlay->phandle);
> -	}
> -
>  	for_each_child_of_node(overlay, child)
>  		adjust_overlay_phandles(child, phandle_delta);
>  }
> @@ -197,9 +178,7 @@ static int adjust_local_phandle_references(struct device_node *local_fixups,
>  	for_each_property_of_node(local_fixups, prop_fix) {
>  
>  		/* skip properties added automatically */
> -		if (!of_prop_cmp(prop_fix->name, "name") ||
> -		    !of_prop_cmp(prop_fix->name, "phandle") ||
> -		    !of_prop_cmp(prop_fix->name, "linux,phandle"))
> +		if (!of_prop_cmp(prop_fix->name, "name"))
>  			continue;
>  
>  		if ((prop_fix->length % 4) != 0 || prop_fix->length == 0)
> diff --git a/include/linux/of.h b/include/linux/of.h
> index 21e6323de0f3..4e86e05853f3 100644
> --- a/include/linux/of.h
> +++ b/include/linux/of.h
> @@ -61,6 +61,7 @@ struct device_node {
>  	struct	kobject kobj;
>  	unsigned long _flags;
>  	void	*data;
> +	struct bin_attribute attr_phandle;
>  #if defined(CONFIG_SPARC)
>  	const char *path_component_name;
>  	unsigned int unique_id;
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/4] of: remove *phandle properties from expanded device tree
@ 2017-04-15  3:59     ` Frank Rowand
  0 siblings, 0 replies; 18+ messages in thread
From: Frank Rowand @ 2017-04-15  3:59 UTC (permalink / raw)
  To: Rob Herring, Stephen Boyd
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA

Adding Stephen.

On 04/14/17 20:55, frowand.list-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org wrote:
> From: Frank Rowand <frank.rowand-7U/KSKJipcs@public.gmane.org>
> 
> Remove "phandle" and "linux,phandle" properties from the internal
> device tree.  The phandle will still be in the struct device_node
> phandle field.
> 
> This is to resolve the issue found by Stephen Boyd [1] when he changed
> the type of struct property.value from void * to const void *.  As
> a result of the type change, the overlay code had compile errors
> where the resolver updates phandle values.
> 
>   [1] http://lkml.iu.edu/hypermail/linux/kernel/1702.1/04160.html
> 
> - Add sysfs infrastructure to report np->phandle, as if it was a property.
> - Do not create "phandle" "ibm,phandle", and "linux,phandle" properties
>   in the expanded device tree.
> - Remove no longer needed checks to exclude "phandle" and "linux,phandle"
>   properties in several locations.
> - A side effect of these changes is that the obsolete "linux,phandle"
>   properties will no longer appear in /proc/device-tree
> 
> Signed-off-by: Frank Rowand <frank.rowand-7U/KSKJipcs@public.gmane.org>
> ---
>  drivers/of/base.c     | 51 ++++++++++++++++++++++++++++++++++++++++++++++++---
>  drivers/of/dynamic.c  | 29 ++++++++++++++++-------------
>  drivers/of/fdt.c      | 40 ++++++++++++++++++++++++----------------
>  drivers/of/overlay.c  |  4 +---
>  drivers/of/resolver.c | 23 +----------------------
>  include/linux/of.h    |  1 +
>  6 files changed, 91 insertions(+), 57 deletions(-)
> 
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index d7c4629a3a2d..197946615503 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -116,6 +116,19 @@ static ssize_t of_node_property_read(struct file *filp, struct kobject *kobj,
>  	return memory_read_from_buffer(buf, count, &offset, pp->value, pp->length);
>  }
>  
> +static ssize_t of_node_phandle_read(struct file *filp, struct kobject *kobj,
> +				struct bin_attribute *bin_attr, char *buf,
> +				loff_t offset, size_t count)
> +{
> +	phandle phandle;
> +	struct device_node *np;
> +
> +	np = container_of(bin_attr, struct device_node, attr_phandle);
> +	phandle = cpu_to_be32(np->phandle);
> +	return memory_read_from_buffer(buf, count, &offset, &phandle,
> +				       sizeof(phandle));
> +}
> +
>  /* always return newly allocated name, caller must free after use */
>  static const char *safe_name(struct kobject *kobj, const char *orig_name)
>  {
> @@ -164,6 +177,38 @@ int __of_add_property_sysfs(struct device_node *np, struct property *pp)
>  	return rc;
>  }
>  
> +/*
> + * In the imported device tree (fdt), phandle is a property.  In the
> + * internal data structure it is instead stored in the struct device_node.
> + * Make phandle visible in sysfs as if it was a property.
> + */
> +static int __of_add_phandle_sysfs(struct device_node *np)
> +{
> +	int rc;
> +
> +	if (IS_ENABLED(CONFIG_PPC_PSERIES))
> +		return 0;
> +
> +	if (!IS_ENABLED(CONFIG_SYSFS))
> +		return 0;
> +
> +	if (!of_kset || !of_node_is_attached(np))
> +		return 0;
> +
> +	if (!np->phandle || np->phandle == 0xffffffff)
> +		return 0;
> +
> +	sysfs_bin_attr_init(&pp->attr);
> +	np->attr_phandle.attr.name = "phandle";
> +	np->attr_phandle.attr.mode = 0444;
> +	np->attr_phandle.size = sizeof(np->phandle);
> +	np->attr_phandle.read = of_node_phandle_read;
> +
> +	rc = sysfs_create_bin_file(&np->kobj, &np->attr_phandle);
> +	WARN(rc, "error adding attribute phandle to node %s\n", np->full_name);
> +	return rc;
> +}
> +
>  int __of_attach_node_sysfs(struct device_node *np)
>  {
>  	const char *name;
> @@ -193,6 +238,8 @@ int __of_attach_node_sysfs(struct device_node *np)
>  	if (rc)
>  		return rc;
>  
> +	__of_add_phandle_sysfs(np);
> +
>  	for_each_property_of_node(np, pp)
>  		__of_add_property_sysfs(np, pp);
>  
> @@ -2097,9 +2144,7 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
>  		int id, len;
>  
>  		/* Skip those we do not want to proceed */
> -		if (!strcmp(pp->name, "name") ||
> -		    !strcmp(pp->name, "phandle") ||
> -		    !strcmp(pp->name, "linux,phandle"))
> +		if (!strcmp(pp->name, "name"))
>  			continue;
>  
>  		np = of_find_node_by_path(pp->value);
> diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
> index 888fdbc09992..c6fd3f32bfcb 100644
> --- a/drivers/of/dynamic.c
> +++ b/drivers/of/dynamic.c
> @@ -218,19 +218,6 @@ int of_property_notify(int action, struct device_node *np,
>  
>  void __of_attach_node(struct device_node *np)
>  {
> -	const __be32 *phandle;
> -	int sz;
> -
> -	np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
> -	np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
> -
> -	phandle = __of_get_property(np, "phandle", &sz);
> -	if (!phandle)
> -		phandle = __of_get_property(np, "linux,phandle", &sz);
> -	if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
> -		phandle = __of_get_property(np, "ibm,phandle", &sz);
> -	np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0;
> -
>  	np->child = NULL;
>  	np->sibling = np->parent->child;
>  	np->parent->child = np;
> @@ -244,10 +231,22 @@ int of_attach_node(struct device_node *np)
>  {
>  	struct of_reconfig_data rd;
>  	unsigned long flags;
> +	const __be32 *phandle;
> +	int sz;
>  
>  	memset(&rd, 0, sizeof(rd));
>  	rd.dn = np;
>  
> +	np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
> +	np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
> +
> +	phandle = __of_get_property(np, "phandle", &sz);
> +	if (!phandle)
> +		phandle = __of_get_property(np, "linux,phandle", &sz);
> +	if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
> +		phandle = __of_get_property(np, "ibm,phandle", &sz);
> +	np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0;
> +
>  	mutex_lock(&of_mutex);
>  	raw_spin_lock_irqsave(&devtree_lock, flags);
>  	__of_attach_node(np);
> @@ -441,6 +440,10 @@ struct device_node *__of_node_dup(const struct device_node *np, const char *fmt,
>  			}
>  		}
>  	}
> +
> +	node->name = __of_get_property(node, "name", NULL) ? : "<NULL>";
> +	node->type = __of_get_property(node, "device_type", NULL) ? : "<NULL>";
> +
>  	return node;
>  
>   err_prop:
> diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
> index e5ce4b59e162..270f31b0c259 100644
> --- a/drivers/of/fdt.c
> +++ b/drivers/of/fdt.c
> @@ -181,6 +181,8 @@ static void populate_properties(const void *blob,
>  		const __be32 *val;
>  		const char *pname;
>  		u32 sz;
> +		int prop_is_phandle = 0;
> +		int prop_is_ibm_phandle = 0;
>  
>  		val = fdt_getprop_by_offset(blob, cur, &pname, &sz);
>  		if (!val) {
> @@ -196,11 +198,6 @@ static void populate_properties(const void *blob,
>  		if (!strcmp(pname, "name"))
>  			has_name = true;
>  
> -		pp = unflatten_dt_alloc(mem, sizeof(struct property),
> -					__alignof__(struct property));
> -		if (dryrun)
> -			continue;
> -
>  		/* We accept flattened tree phandles either in
>  		 * ePAPR-style "phandle" properties, or the
>  		 * legacy "linux,phandle" properties.  If both
> @@ -208,23 +205,34 @@ static void populate_properties(const void *blob,
>  		 * will get weird. Don't do that.
>  		 */
>  		if (!strcmp(pname, "phandle") ||
> -		    !strcmp(pname, "linux,phandle")) {
> -			if (!np->phandle)
> -				np->phandle = be32_to_cpup(val);
> -		}
> +		    !strcmp(pname, "linux,phandle"))
> +			prop_is_phandle = 1;
>  
>  		/* And we process the "ibm,phandle" property
>  		 * used in pSeries dynamic device tree
>  		 * stuff
>  		 */
> -		if (!strcmp(pname, "ibm,phandle"))
> -			np->phandle = be32_to_cpup(val);
> +		if (!strcmp(pname, "ibm,phandle")) {
> +			prop_is_phandle = 1;
> +			prop_is_ibm_phandle = 1;
> +		}
> +
> +		if (!prop_is_phandle)
> +			pp = unflatten_dt_alloc(mem, sizeof(struct property),
> +						__alignof__(struct property));
>  
> -		pp->name   = (char *)pname;
> -		pp->length = sz;
> -		pp->value  = (__be32 *)val;
> -		*pprev     = pp;
> -		pprev      = &pp->next;
> +		if (dryrun)
> +			continue;
> +
> +		if (!prop_is_phandle) {
> +			pp->name   = (char *)pname;
> +			pp->length = sz;
> +			pp->value  = (__be32 *)val;
> +			*pprev     = pp;
> +			pprev      = &pp->next;
> +		} else if (prop_is_ibm_phandle || !np->phandle) {
> +			np->phandle = be32_to_cpup(val);
> +		}
>  	}
>  
>  	/* With version 0x10 we may not have the name property,
> diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
> index 7827786718d8..ca0b85f5deb1 100644
> --- a/drivers/of/overlay.c
> +++ b/drivers/of/overlay.c
> @@ -101,9 +101,7 @@ static int of_overlay_apply_single_property(struct of_overlay *ov,
>  	tprop = of_find_property(target, prop->name, NULL);
>  
>  	/* special properties are not meant to be updated (silent NOP) */
> -	if (of_prop_cmp(prop->name, "name") == 0 ||
> -	    of_prop_cmp(prop->name, "phandle") == 0 ||
> -	    of_prop_cmp(prop->name, "linux,phandle") == 0)
> +	if (!of_prop_cmp(prop->name, "name"))
>  		return 0;
>  
>  	propn = __of_prop_dup(prop, GFP_KERNEL);
> diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c
> index 7ae9863cb0a4..624cbaeae0a4 100644
> --- a/drivers/of/resolver.c
> +++ b/drivers/of/resolver.c
> @@ -71,30 +71,11 @@ static void adjust_overlay_phandles(struct device_node *overlay,
>  		int phandle_delta)
>  {
>  	struct device_node *child;
> -	struct property *prop;
> -	phandle phandle;
>  
>  	/* adjust node's phandle in node */
>  	if (overlay->phandle != 0 && overlay->phandle != OF_PHANDLE_ILLEGAL)
>  		overlay->phandle += phandle_delta;
>  
> -	/* copy adjusted phandle into *phandle properties */
> -	for_each_property_of_node(overlay, prop) {
> -
> -		if (of_prop_cmp(prop->name, "phandle") &&
> -		    of_prop_cmp(prop->name, "linux,phandle"))
> -			continue;
> -
> -		if (prop->length < 4)
> -			continue;
> -
> -		phandle = be32_to_cpup(prop->value);
> -		if (phandle == OF_PHANDLE_ILLEGAL)
> -			continue;
> -
> -		*(uint32_t *)prop->value = cpu_to_be32(overlay->phandle);
> -	}
> -
>  	for_each_child_of_node(overlay, child)
>  		adjust_overlay_phandles(child, phandle_delta);
>  }
> @@ -197,9 +178,7 @@ static int adjust_local_phandle_references(struct device_node *local_fixups,
>  	for_each_property_of_node(local_fixups, prop_fix) {
>  
>  		/* skip properties added automatically */
> -		if (!of_prop_cmp(prop_fix->name, "name") ||
> -		    !of_prop_cmp(prop_fix->name, "phandle") ||
> -		    !of_prop_cmp(prop_fix->name, "linux,phandle"))
> +		if (!of_prop_cmp(prop_fix->name, "name"))
>  			continue;
>  
>  		if ((prop_fix->length % 4) != 0 || prop_fix->length == 0)
> diff --git a/include/linux/of.h b/include/linux/of.h
> index 21e6323de0f3..4e86e05853f3 100644
> --- a/include/linux/of.h
> +++ b/include/linux/of.h
> @@ -61,6 +61,7 @@ struct device_node {
>  	struct	kobject kobj;
>  	unsigned long _flags;
>  	void	*data;
> +	struct bin_attribute attr_phandle;
>  #if defined(CONFIG_SPARC)
>  	const char *path_component_name;
>  	unsigned int unique_id;
> 

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/4] of: make __of_attach_node() static
  2017-04-15  3:55 ` [PATCH 2/4] of: make __of_attach_node() static frowand.list
@ 2017-04-15  3:59   ` Frank Rowand
  0 siblings, 0 replies; 18+ messages in thread
From: Frank Rowand @ 2017-04-15  3:59 UTC (permalink / raw)
  To: Rob Herring, Stephen Boyd; +Cc: devicetree, linux-kernel

Adding Stephen.

On 04/14/17 20:55, frowand.list@gmail.com wrote:
> From: Frank Rowand <frank.rowand@sony.com>
> 
> __of_attach_node() is not used outside of drivers/of/dynamic.c.  Make
> it static and remove it from drivers/of/of_private.h.
> 
> Signed-off-by: Frank Rowand <frank.rowand@sony.com>
> ---
>  drivers/of/dynamic.c    | 2 +-
>  drivers/of/of_private.h | 1 -
>  2 files changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
> index c6fd3f32bfcb..74aafe594ad5 100644
> --- a/drivers/of/dynamic.c
> +++ b/drivers/of/dynamic.c
> @@ -216,7 +216,7 @@ int of_property_notify(int action, struct device_node *np,
>  	return of_reconfig_notify(action, &pr);
>  }
>  
> -void __of_attach_node(struct device_node *np)
> +static void __of_attach_node(struct device_node *np)
>  {
>  	np->child = NULL;
>  	np->sibling = np->parent->child;
> diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
> index 18bbb4517e25..efcedcff7dba 100644
> --- a/drivers/of/of_private.h
> +++ b/drivers/of/of_private.h
> @@ -78,7 +78,6 @@ extern int __of_update_property(struct device_node *np,
>  extern void __of_update_property_sysfs(struct device_node *np,
>  		struct property *newprop, struct property *oldprop);
>  
> -extern void __of_attach_node(struct device_node *np);
>  extern int __of_attach_node_sysfs(struct device_node *np);
>  extern void __of_detach_node(struct device_node *np);
>  extern void __of_detach_node_sysfs(struct device_node *np);
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 3/4] of: be consistent in form of file mode
  2017-04-15  3:55 ` [PATCH 3/4] of: be consistent in form of file mode frowand.list
@ 2017-04-15  3:59   ` Frank Rowand
  0 siblings, 0 replies; 18+ messages in thread
From: Frank Rowand @ 2017-04-15  3:59 UTC (permalink / raw)
  To: Rob Herring, Stephen Boyd; +Cc: devicetree, linux-kernel

Adding Stephen.

On 04/14/17 20:55, frowand.list@gmail.com wrote:
> From: Frank Rowand <frank.rowand@sony.com>
> 
> checkpatch whined about using S_IRUGO instead of octal equivalent
> when adding phandle sysfs code, so used octal in that patch.
> Change other instances of the S_* constants in the same file to
> the octal form.
> 
> Signed-off-by: Frank Rowand <frank.rowand@sony.com>
> ---
>  drivers/of/base.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index 197946615503..4a8bd9623140 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -168,7 +168,7 @@ int __of_add_property_sysfs(struct device_node *np, struct property *pp)
>  
>  	sysfs_bin_attr_init(&pp->attr);
>  	pp->attr.attr.name = safe_name(&np->kobj, pp->name);
> -	pp->attr.attr.mode = secure ? S_IRUSR : S_IRUGO;
> +	pp->attr.attr.mode = secure ? 0400 : 0444;
>  	pp->attr.size = secure ? 0 : pp->length;
>  	pp->attr.read = of_node_property_read;
>  
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 4/4] of: detect invalid phandle in overlay
  2017-04-15  3:55 ` [PATCH 4/4] of: detect invalid phandle in overlay frowand.list
@ 2017-04-15  3:59   ` Frank Rowand
  0 siblings, 0 replies; 18+ messages in thread
From: Frank Rowand @ 2017-04-15  3:59 UTC (permalink / raw)
  To: Rob Herring, Stephen Boyd; +Cc: devicetree, linux-kernel

Adding Stephen.

On 04/14/17 20:55, frowand.list@gmail.com wrote:
> From: Frank Rowand <frank.rowand@sony.com>
> 
> Overlays are not allowed to modify phandle values of previously existing
> nodes because there is no information available to allow fixup up
> properties that use the previously existing phandle.
> 
> Signed-off-by: Frank Rowand <frank.rowand@sony.com>
> ---
>  drivers/of/overlay.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
> index ca0b85f5deb1..20ab49d2f7a4 100644
> --- a/drivers/of/overlay.c
> +++ b/drivers/of/overlay.c
> @@ -130,6 +130,10 @@ static int of_overlay_apply_single_device_node(struct of_overlay *ov,
>  	/* NOTE: Multiple mods of created nodes not supported */
>  	tchild = of_get_child_by_name(target, cname);
>  	if (tchild != NULL) {
> +		/* new overlay phandle value conflicts with existing value */
> +		if (child->phandle)
> +			return -EINVAL;
> +
>  		/* apply overlay recursively */
>  		ret = of_overlay_apply_one(ov, tchild, child);
>  		of_node_put(tchild);
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 0/4] of: remove *phandle properties from expanded device tree
@ 2017-04-18 21:08     ` Frank Rowand
  0 siblings, 0 replies; 18+ messages in thread
From: Frank Rowand @ 2017-04-18 21:08 UTC (permalink / raw)
  To: Rob Herring, Stephen Boyd; +Cc: devicetree, linux-kernel

Hi Rob,

Please do not apply this patch series.

The more context I look at, the less this approach seems good.

I hope to have a simpler version completed quickly.

Thanks,

- Frank


On 04/14/17 20:58, Frank Rowand wrote:
> Hi Stephen,
> 
> I left you off the distribution list, sorry...
> 
> On 04/14/17 20:55, frowand.list@gmail.com wrote:
>> From: Frank Rowand <frank.rowand@sony.com>
>>
>> Remove "phandle" and "linux,phandle" properties from the internal
>> device tree.  The phandle will still be in the struct device_node
>> phandle field.
>>
>> This is to resolve the issue found by Stephen Boyd [1] when he changed
>> the type of struct property.value from void * to const void *.  As
>> a result of the type change, the overlay code had compile errors
>> where the resolver updates phandle values.
>>
>>   [1] http://lkml.iu.edu/hypermail/linux/kernel/1702.1/04160.html
>>
>> Patch 1 is the phandle related changes.
>>
>> Patches 2 - 4 are minor fixups for issues that became visible
>> while implementing patch 1.
>>
>> Frank Rowand (4):
>>   of: remove *phandle properties from expanded device tree
>>   of: make __of_attach_node() static
>>   of: be consistent in form of file mode
>>   of: detect invalid phandle in overlay
>>
>>  drivers/of/base.c       | 53 +++++++++++++++++++++++++++++++++++++++++++++----
>>  drivers/of/dynamic.c    | 31 ++++++++++++++++-------------
>>  drivers/of/fdt.c        | 40 ++++++++++++++++++++++---------------
>>  drivers/of/of_private.h |  1 -
>>  drivers/of/overlay.c    |  8 +++++---
>>  drivers/of/resolver.c   | 23 +--------------------
>>  include/linux/of.h      |  1 +
>>  7 files changed, 97 insertions(+), 60 deletions(-)

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 0/4] of: remove *phandle properties from expanded device tree
@ 2017-04-18 21:08     ` Frank Rowand
  0 siblings, 0 replies; 18+ messages in thread
From: Frank Rowand @ 2017-04-18 21:08 UTC (permalink / raw)
  To: Rob Herring, Stephen Boyd
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA

Hi Rob,

Please do not apply this patch series.

The more context I look at, the less this approach seems good.

I hope to have a simpler version completed quickly.

Thanks,

- Frank


On 04/14/17 20:58, Frank Rowand wrote:
> Hi Stephen,
> 
> I left you off the distribution list, sorry...
> 
> On 04/14/17 20:55, frowand.list-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org wrote:
>> From: Frank Rowand <frank.rowand-7U/KSKJipcs@public.gmane.org>
>>
>> Remove "phandle" and "linux,phandle" properties from the internal
>> device tree.  The phandle will still be in the struct device_node
>> phandle field.
>>
>> This is to resolve the issue found by Stephen Boyd [1] when he changed
>> the type of struct property.value from void * to const void *.  As
>> a result of the type change, the overlay code had compile errors
>> where the resolver updates phandle values.
>>
>>   [1] http://lkml.iu.edu/hypermail/linux/kernel/1702.1/04160.html
>>
>> Patch 1 is the phandle related changes.
>>
>> Patches 2 - 4 are minor fixups for issues that became visible
>> while implementing patch 1.
>>
>> Frank Rowand (4):
>>   of: remove *phandle properties from expanded device tree
>>   of: make __of_attach_node() static
>>   of: be consistent in form of file mode
>>   of: detect invalid phandle in overlay
>>
>>  drivers/of/base.c       | 53 +++++++++++++++++++++++++++++++++++++++++++++----
>>  drivers/of/dynamic.c    | 31 ++++++++++++++++-------------
>>  drivers/of/fdt.c        | 40 ++++++++++++++++++++++---------------
>>  drivers/of/of_private.h |  1 -
>>  drivers/of/overlay.c    |  8 +++++---
>>  drivers/of/resolver.c   | 23 +--------------------
>>  include/linux/of.h      |  1 +
>>  7 files changed, 97 insertions(+), 60 deletions(-)

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 0/4] of: remove *phandle properties from expanded device tree
@ 2017-04-19 13:38       ` Rob Herring
  0 siblings, 0 replies; 18+ messages in thread
From: Rob Herring @ 2017-04-19 13:38 UTC (permalink / raw)
  To: Frank Rowand; +Cc: Stephen Boyd, devicetree, linux-kernel

On Tue, Apr 18, 2017 at 4:08 PM, Frank Rowand <frowand.list@gmail.com> wrote:
> Hi Rob,
>
> Please do not apply this patch series.

What about patches 2-4? Those seem unrelated. But #2 didn't apply for
me, so resend if I should apply.

Rob

>
> The more context I look at, the less this approach seems good.
>
> I hope to have a simpler version completed quickly.
>
> Thanks,
>
> - Frank

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 0/4] of: remove *phandle properties from expanded device tree
@ 2017-04-19 13:38       ` Rob Herring
  0 siblings, 0 replies; 18+ messages in thread
From: Rob Herring @ 2017-04-19 13:38 UTC (permalink / raw)
  To: Frank Rowand
  Cc: Stephen Boyd, devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA

On Tue, Apr 18, 2017 at 4:08 PM, Frank Rowand <frowand.list-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
> Hi Rob,
>
> Please do not apply this patch series.

What about patches 2-4? Those seem unrelated. But #2 didn't apply for
me, so resend if I should apply.

Rob

>
> The more context I look at, the less this approach seems good.
>
> I hope to have a simpler version completed quickly.
>
> Thanks,
>
> - Frank
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2017-04-19 13:39 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-15  3:55 [PATCH 0/4] of: remove *phandle properties from expanded device tree frowand.list
2017-04-15  3:55 ` frowand.list-Re5JQEeQqe8AvxtiuMwx3w
2017-04-15  3:55 ` [PATCH 1/4] " frowand.list
2017-04-15  3:55   ` frowand.list-Re5JQEeQqe8AvxtiuMwx3w
2017-04-15  3:59   ` Frank Rowand
2017-04-15  3:59     ` Frank Rowand
2017-04-15  3:55 ` [PATCH 2/4] of: make __of_attach_node() static frowand.list
2017-04-15  3:59   ` Frank Rowand
2017-04-15  3:55 ` [PATCH 3/4] of: be consistent in form of file mode frowand.list
2017-04-15  3:59   ` Frank Rowand
2017-04-15  3:55 ` [PATCH 4/4] of: detect invalid phandle in overlay frowand.list
2017-04-15  3:59   ` Frank Rowand
2017-04-15  3:58 ` [PATCH 0/4] of: remove *phandle properties from expanded device tree Frank Rowand
2017-04-15  3:58   ` Frank Rowand
2017-04-18 21:08   ` Frank Rowand
2017-04-18 21:08     ` Frank Rowand
2017-04-19 13:38     ` Rob Herring
2017-04-19 13:38       ` Rob Herring

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.