Thread (32 messages) 32 messages, 6 authors, 2011-02-25

Re: [RFC PATCH 06/10] MIPS: Octeon: Initialize and fixup device tree.

flat view

From: Grant Likely <hidden>
Date: 2011-02-23 18:51:39
Also in: linux-mips, lkml

On Wed, Feb 23, 2011 at 10:40:32AM -0800, David Daney wrote:
On 02/23/2011 09:41 AM, Grant Likely wrote:
quoted
On Tue, Feb 22, 2011 at 12:57:50PM -0800, David Daney wrote:
quoted
Signed-off-by: David Daney<redacted>
---
 arch/mips/Kconfig                         |    2 +
 arch/mips/cavium-octeon/octeon-platform.c |  280 +++++++++++++++++++++++++++++
 arch/mips/cavium-octeon/setup.c           |   17 ++
 3 files changed, 299 insertions(+), 0 deletions(-)
I've got an odd feeling of foreboding about this patch.  It makes me
nervous, but I can't articulate why yet.  Gut-wise I'd rather see the
device tree pruned/fixed up before it gets unflattened,
I chose to work on the unflattened form because there were already
functions to do it.  I didn't see anything that would make
manipulating the flattened form easy.

I agree that working on the unflattened form would be best.  At a
minium the /proc/device-tree structure would better reflect reality.

What do you think about adding some helper functions to
drivers/of/fdt.c for the manipulation of the flattened form?
It would probably be easier/safer to link libfdt into the kernel
proper.  It's already used in the powerpc bootwrapper, and there has
been talk about replacing some of fdt.c with libfdt.  See
scripts/dtc/libfdt
quoted
or for the
kernel to have a separate .dtb linked in for each legacy platform.
I think there are too many variants to make this viable.
Out of curiosity, how many variants?

btw, did you know about the dtc '/include/' functionality?  It is
possible to set up .dts include files that represent a SoC and can be
modified by the .dts files that include them.  See
arch/powerpc/boot/dts/*5200*.dts
quoted
I
need to think about this some more....

I've made some comments below anyway.
And I will respond.  Although if I end up modifying the flattened
form, it will all change.
quoted
[...]
quoted
quoted
+
+static int __init set_phy_addr_prop(struct device_node *n, int phy)
+{
+	u32 *vp;
+	struct property *old_p;
+	struct property *p = kzalloc(sizeof(struct device_node) + sizeof(u32), GFP_KERNEL);
+	if (!p)
+		return -ENOMEM;
+	/* The value will immediatly follow the node in memory. */
+	vp = (u32 *)(&p[1]);
This is unsafe (I was on the losing end of an argument when I tried to
do exactly the same thing).  If you want to allocate 2 things with one
appended to the other, then you need to define a structure
with the two element in it and allocate the size of that structure.
Weird.  alloc_netdev() does this, so it is not unheard of.
Not unheard of, but still bad practise.
quoted
quoted
+	old_p = of_find_property(n, "reg", NULL);
+	if (old_p)
+		prom_remove_property(n, old_p);
+	return prom_add_property(n, p);
Would it not be more efficient to change the value in the existing reg
property instead of doing this allocation song-and-dance?
I think I did it this way to try to get /proc/device-tree to reflect
the new value.
Sounds like a bug in /proc/device-tree.  :-)  /proc/device-tree should
be pointing directly at the device tree property itself.  I'd be
surprised if modifying the data of 'reg' didn't show up there.
quoted
quoted
+}
+arch_initcall(octeon_fix_device_tree);
Calling this from an initcall really makes me nervous.  I'm worried
about ordering issues.  Why can this code not be part of the prune
routine above?
Again, done to try to make /proc/device-tree reflect reality.
yeah, /proc/device-tree should not be driving design decisions.  Let's
try to fix it instead.

g.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help