From: Mitch Bradley <wmb-D5eQfiDGL7eakBO8gow8eQ@public.gmane.org>
To: Andres Salomon <dilinger-pFFUokh25LWsTnJN9+BGXg@public.gmane.org>
Cc: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A@public.gmane.org
Subject: Re: olpc ofw question
Date: Wed, 11 Aug 2010 15:53:44 -1000 [thread overview]
Message-ID: <4C635428.9010009@firmworks.com> (raw)
In-Reply-To: <20100811172045.77cda7a0-ztAUm9HJea/EueBKFXcDjA@public.gmane.org>
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
>
>
next prev parent reply other threads:[~2010-08-12 1:53 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
[not found] ` <4C635428.9010009-D5eQfiDGL7eakBO8gow8eQ@public.gmane.org>
2010-08-15 0:35 ` Andres Salomon
2010-08-15 1:52 ` Mitch Bradley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C635428.9010009@firmworks.com \
--to=wmb-d5eqfidgl7eakbo8gow8eq@public.gmane.org \
--cc=devicetree-discuss-mnsaURCQ41sdnm+yROfE0A@public.gmane.org \
--cc=dilinger-pFFUokh25LWsTnJN9+BGXg@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox