* olpc ofw question
@ 2010-08-11 0:40 Andres Salomon
[not found] ` <20100810204010.134618fb-ztAUm9HJea/EueBKFXcDjA@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: Andres Salomon @ 2010-08-11 0:40 UTC (permalink / raw)
To: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A
Hi,
I've run a comparison between OLPC's old OFW code (which mounts the
device-tree at /ofw, and makes use of the sparc code) versus the code
which I'm planning to send upstream (which mounts the device-tree
at /proc/device-tree, and makes use of PROC_DEVTREE). The results are
here:
http://dev.queued.net/~dilinger/dt.diff
That's from running:
find /proc/device-tree -type f | sort | while read f; do echo $f | sed 's#/proc/device-tree##'; sudo od -c $f; done > ~/dt-proc
find /ofw -type f | sort | while read f; do echo $f | sed 's#/ofw##'; sudo od -c $f; done > ~/dt-ofw
diff -u dt-ofw dt-proc > dt.diff
Note that this was run on two different OLPC XO-1 machines, hence the
difference in serial numbers, mfg-data, and other such things.
There are two things I'm concerned about; the first is that device names
are mangled. For some things (ie, "/battery@0/name" => "/battery/name"),
I don't particularly care; for others ("/pci/audio@f,3/device-id"
=> "/pci/audio/device-id"), it's kind of annoying to lose that extra
bit of information. What's the purpose being the mangling that
happens w/ /proc/device-tree? I the following comment in proc_devtree.c:
* For a node with a name like "gc@10", we make symlinks called "gc"
* and "@10" to it.
However, I'm not seeing *any* symlinks at all in /proc/device-tree.
My second concern is the renaming of /pci/usb@f,4 (the ohci device)
to /pci/usb. I'm not sure if that's due to a bug in the devtree code,
OFW, or my patch. Note that the kernel spits out the following messages
while populating /proc/device-tree:
[ 0.130869] device-tree: Duplicate name in /pci, renamed to "usb#1"
[ 0.131589] device-tree: Duplicate name in /, renamed to "dropin-fs#1"
I'm assuming that the code first renamed the ohci device from
/pci/usb@f,4 to /pci/usb, attempted to then rename the
wireless chip from /pci/usb@f,5 to /pci/usb, and spit out
that error. That seems.. odd.
Any insight into the reasoning for this mangling?
^ permalink raw reply [flat|nested] 6+ messages in thread[parent not found: <20100810204010.134618fb-ztAUm9HJea/EueBKFXcDjA@public.gmane.org>]
* Re: olpc ofw question [not found] ` <20100810204010.134618fb-ztAUm9HJea/EueBKFXcDjA@public.gmane.org> @ 2010-08-11 20:48 ` Segher Boessenkool [not found] ` <55307.84.105.60.153.1281559723.squirrel-JorI+TVEvZrY24RiXHRV3ti2O/JbrIOy@public.gmane.org> 0 siblings, 1 reply; 6+ messages in thread From: Segher Boessenkool @ 2010-08-11 20:48 UTC (permalink / raw) To: Andres Salomon; +Cc: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A > I've run a comparison between OLPC's old OFW code (which mounts the > device-tree at /ofw, and makes use of the sparc code) versus the code > which I'm planning to send upstream (which mounts the device-tree > at /proc/device-tree, and makes use of PROC_DEVTREE). The results are > here: [unit addresses are missing] > Any insight into the reasoning for this mangling? It sounds to me like you're not putting the (textual representation of the) unit address in the device_node->full_name field. How do you fill that field? Segher ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <55307.84.105.60.153.1281559723.squirrel-JorI+TVEvZrY24RiXHRV3ti2O/JbrIOy@public.gmane.org>]
* Re: olpc ofw question [not found] ` <55307.84.105.60.153.1281559723.squirrel-JorI+TVEvZrY24RiXHRV3ti2O/JbrIOy@public.gmane.org> @ 2010-08-11 21:20 ` Andres Salomon [not found] ` <20100811172045.77cda7a0-ztAUm9HJea/EueBKFXcDjA@public.gmane.org> 0 siblings, 1 reply; 6+ messages in thread From: Andres Salomon @ 2010-08-11 21:20 UTC (permalink / raw) To: Segher Boessenkool; +Cc: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A On Wed, 11 Aug 2010 22:48:43 +0200 (CEST) "Segher Boessenkool" <segher-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org> wrote: > > I've run a comparison between OLPC's old OFW code (which mounts the > > device-tree at /ofw, and makes use of the sparc code) versus the > > code which I'm planning to send upstream (which mounts the > > device-tree at /proc/device-tree, and makes use of PROC_DEVTREE). > > The results are here: > > [unit addresses are missing] > > > Any insight into the reasoning for this mangling? > > It sounds to me like you're not putting the (textual representation > of the) unit address in the device_node->full_name field. How do > you fill that field? Ah, that could very well be it. Note that the *old* OLPC code used the 'path_component_name' of device_node. The new code uses just 'name' in pdt_build_full_name(), as path_component_name is #ifdef'd out for !SPARC. I guess I'm not entirely sure why sparc used path_component_name in the first place.. The code that fills in full_name: dp->full_name = pdt_build_full_name(dp); static char * __init pdt_build_full_name(struct device_node *dp) { int len, ourlen, plen; char *n; plen = strlen(dp->parent->full_name); ourlen = strlen(fetch_node_name(dp)); len = ourlen + plen + 2; n = prom_early_alloc(len); strcpy(n, dp->parent->full_name); if (!of_is_root_node(dp->parent)) { strcpy(n + plen, "/"); plen++; } strcpy(n + plen, fetch_node_name(dp)); return n; } #if defined(CONFIG_SPARC) static inline const char *fetch_node_name(struct device_node *dp) { return dp->path_component_name; } #else static inline const char *fetch_node_name(struct device_node *dp) { return dp->name; } #endif ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <20100811172045.77cda7a0-ztAUm9HJea/EueBKFXcDjA@public.gmane.org>]
* Re: olpc ofw question [not found] ` <20100811172045.77cda7a0-ztAUm9HJea/EueBKFXcDjA@public.gmane.org> @ 2010-08-12 1:53 ` Mitch Bradley [not found] ` <4C635428.9010009-D5eQfiDGL7eakBO8gow8eQ@public.gmane.org> 0 siblings, 1 reply; 6+ messages in thread From: Mitch Bradley @ 2010-08-12 1:53 UTC (permalink / raw) To: Andres Salomon; +Cc: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A Andres Salomon wrote: > On Wed, 11 Aug 2010 22:48:43 +0200 (CEST) > "Segher Boessenkool" <segher-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org> wrote: > > >>> I've run a comparison between OLPC's old OFW code (which mounts the >>> device-tree at /ofw, and makes use of the sparc code) versus the >>> code which I'm planning to send upstream (which mounts the >>> device-tree at /proc/device-tree, and makes use of PROC_DEVTREE). >>> The results are here: >>> >> [unit addresses are missing] >> >> >>> Any insight into the reasoning for this mangling? >>> >> It sounds to me like you're not putting the (textual representation >> of the) unit address in the device_node->full_name field. How do >> you fill that field? >> > > Ah, that could very well be it. Note that the *old* OLPC code used the > 'path_component_name' of device_node. The new code uses just 'name' in > pdt_build_full_name(), as path_component_name is #ifdef'd out > for !SPARC. I guess I'm not entirely sure why sparc used > path_component_name in the first place.. > I think I understand the situation. The guess that I articulated on IRC is essentially correct. The (human-readable) text representation of the unit address - i.e. the stuff after "@" - is parent-bus-specific. The numerical representation of a unit address is easily determined - it is the first "#address-cells" cells of the "reg" property. But the rendering of that into ASCII is not as obvious. A live OF environment gets the text representation by calling the parent bus's "decode-unit" method with the numerical representation as an argument. (In the other direction, the "encode-unit" method goes from text to numerical.) There's an easy way to get that effect via the client interface - just call "package-to-path" on the phandle, and OF will return the full pathname in canonical form. If you look in arch/sparc/kernel/prom.c:sparc32_path_component() you'll see what is going on. That routine derives a "name@address" string using a heuristic described in this comment: /* The following routines deal with the black magic of fully naming a * node. * * Certain well known named nodes are just the simple name string. * * Actual devices have an address specifier appended to the base name * string, like this "foo@addr". The "addr" can be in any number of * formats, and the platform plus the type of the node determine the * format and how it is constructed. * * For children of the ROOT node, the naming convention is fixed and * determined by whether this is a sun4u or sun4v system. * * For children of other nodes, it is bus type specific. So * we walk up the tree until we discover a "device_type" property * we recognize and we go from there. */ As I described above, it's not really black magic; extract the numerical form of the unit address and pass it to the parent's encode-unit method . Either someone didn't know about that, or perhaps they had some reason for not using it. It's certainly do-able during the phase while OF is still alive. In the non-SPARC case, I think the code was dealing with a flattened device tree, where the node name had already been pre-digested to include the @addr suffix. In that case, decoding the unit address into the text representation was somebody else's problem, so there was no (non-SPARC) Linux code to handle it. The "proc_of.c" code that I wrote in Dec 2006 uses the package-to-path method mentioned above, getting the "name@addr" representation (package-to-path returns the full path, but you can easily extract just the tail component with strrchr(path, '/')) > > The code that fills in full_name: > > dp->full_name = pdt_build_full_name(dp); > > > static char * __init pdt_build_full_name(struct device_node *dp) > { > int len, ourlen, plen; > char *n; > > plen = strlen(dp->parent->full_name); > ourlen = strlen(fetch_node_name(dp)); > len = ourlen + plen + 2; > > n = prom_early_alloc(len); > strcpy(n, dp->parent->full_name); > if (!of_is_root_node(dp->parent)) { > strcpy(n + plen, "/"); > plen++; > } > strcpy(n + plen, fetch_node_name(dp)); > > return n; > } > > #if defined(CONFIG_SPARC) > static inline const char *fetch_node_name(struct device_node *dp) > { > return dp->path_component_name; > } > #else > static inline const char *fetch_node_name(struct device_node *dp) > { > return dp->name; > } > #endif > > _______________________________________________ > devicetree-discuss mailing list > devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org > https://lists.ozlabs.org/listinfo/devicetree-discuss > > ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <4C635428.9010009-D5eQfiDGL7eakBO8gow8eQ@public.gmane.org>]
* Re: olpc ofw question [not found] ` <4C635428.9010009-D5eQfiDGL7eakBO8gow8eQ@public.gmane.org> @ 2010-08-15 0:35 ` Andres Salomon 2010-08-15 1:52 ` Mitch Bradley 0 siblings, 1 reply; 6+ messages in thread From: Andres Salomon @ 2010-08-15 0:35 UTC (permalink / raw) To: Mitch Bradley; +Cc: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A On Wed, 11 Aug 2010 15:53:44 -1000 Mitch Bradley <wmb-D5eQfiDGL7eakBO8gow8eQ@public.gmane.org> wrote: [...] > > The "proc_of.c" code that I wrote in Dec 2006 uses the > package-to-path method mentioned above, getting the "name@addr" > representation (package-to-path returns the full path, but you can > easily extract just the tail component with strrchr(path, '/')) Thanks for the tip. I changed the code: - dp->name = pdt_get_one_property(node, "name"); +// dp->name = pdt_get_one_property(node, "name"); + dp->name = pdt_get_fullname(node); Where pdt_get_fullname() runs package-to-path and returns strrchr(buf, '/')+1; /proc/device-tree looks much better. Here's the diff now between /ofw and /proc/device-tree: http://dev.queued.net/~dilinger/dt2.diff Now I'm wondering a few things; 1) I'm setting node->name to the full node name now (including the "@" suffix). Is there any reason why this might be incorrect (ie, that I should only be using the @ suffix in node->full_name)? It looks fine to me, but it's worth asking... 2) At a later point, it's probably worth looking into changing the sparc code to use this as well. Is there a reason why the sparc code doesn't shouldn't use this (ie, old firmware bugs)? 3) I get the following during proc population: [ 0.126687] device-tree: Duplicate name in /, renamed to "dropin-fs#1" Looking at the diff, I see -/dropin-fs/.node -0000000 ` 222 206 377 -0000004 -/dropin-fs/.node -0000000 ` 222 206 377 Is this a bug in my version of OFW? ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: olpc ofw question 2010-08-15 0:35 ` Andres Salomon @ 2010-08-15 1:52 ` Mitch Bradley 0 siblings, 0 replies; 6+ messages in thread From: Mitch Bradley @ 2010-08-15 1:52 UTC (permalink / raw) To: Andres Salomon; +Cc: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A Andres Salomon wrote: > On Wed, 11 Aug 2010 15:53:44 -1000 > Mitch Bradley <wmb-D5eQfiDGL7eakBO8gow8eQ@public.gmane.org> wrote: > > [...] > >> The "proc_of.c" code that I wrote in Dec 2006 uses the >> package-to-path method mentioned above, getting the "name@addr" >> representation (package-to-path returns the full path, but you can >> easily extract just the tail component with strrchr(path, '/')) >> > > > Thanks for the tip. I changed the code: > > - dp->name = pdt_get_one_property(node, "name"); > +// dp->name = pdt_get_one_property(node, "name"); > + dp->name = pdt_get_fullname(node); > > Where pdt_get_fullname() runs package-to-path and returns > strrchr(buf, '/')+1; /proc/device-tree looks much better. > Here's the diff now between /ofw and /proc/device-tree: > > http://dev.queued.net/~dilinger/dt2.diff > > Now I'm wondering a few things; > > 1) I'm setting node->name to the full node name now (including > the "@" suffix). Is there any reason why this might be incorrect > (ie, that I should only be using the @ suffix in node->full_name)? > It looks fine to me, but it's worth asking... > > 2) At a later point, it's probably worth looking into changing > the sparc code to use this as well. Is there a reason why the > sparc code doesn't shouldn't use this (ie, old firmware bugs)? > package-to-path first appeared in OBP 3, i.e. the major version that conformed to the IEEE 1275 standard. OBP 1.x and OBP 2.x had a different (less portable and somewhat less functional) client interface ABI called "romvec". If I remember correctly, OBP 3 first appeared on Sun 5 - UltraSPARC - systems. OBP 1 and 2 were on Sun 4c and related machines. I think it has been about 15 years since the last OBP 2.x system was released. There may still be a few working machines from that generation, but if so, they are of more historic interest than economic value. I ditched my last one something like 10 years ago. > 3) I get the following during proc population: > > [ 0.126687] device-tree: Duplicate name in /, renamed to "dropin-fs#1" > > Looking at the diff, I see > > -/dropin-fs/.node > -0000000 ` 222 206 377 > -0000004 > -/dropin-fs/.node > -0000000 ` 222 206 377 > > Is this a bug in my version of OFW? > Yes. I just fixed it. Thanks for noticing it. Fortunately, it is innocuous. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-08-15 1:52 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-08-11 0:40 olpc ofw question Andres Salomon
[not found] ` <20100810204010.134618fb-ztAUm9HJea/EueBKFXcDjA@public.gmane.org>
2010-08-11 20:48 ` Segher Boessenkool
[not found] ` <55307.84.105.60.153.1281559723.squirrel-JorI+TVEvZrY24RiXHRV3ti2O/JbrIOy@public.gmane.org>
2010-08-11 21:20 ` Andres Salomon
[not found] ` <20100811172045.77cda7a0-ztAUm9HJea/EueBKFXcDjA@public.gmane.org>
2010-08-12 1:53 ` Mitch Bradley
[not found] ` <4C635428.9010009-D5eQfiDGL7eakBO8gow8eQ@public.gmane.org>
2010-08-15 0:35 ` Andres Salomon
2010-08-15 1:52 ` Mitch Bradley
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.