Thread (8 messages) 8 messages, 2 authors, 2011-02-26

Re: [PATCH v5] of/promtree: allow DT device matching by fixing 'name' brokenness

flat view

From: Grant Likely <hidden>
Date: 2011-02-25 06:06:28
Also in: lkml, sparclinux
Subsystem: open firmware and flattened device tree, the rest · Maintainers: Rob Herring, Saravana Kannan, Linus Torvalds

On Thu, Feb 24, 2011 at 1:01 PM, Andres Salomon [off-list ref] wrote:
On Thu, 24 Feb 2011 12:42:34 -0700
Grant Likely [off-list ref] wrote:
quoted
If firmware is buggy, then pkg2path must deal with it.  It is not okay
for it to return NULL.  (I know that pkg2path is an OFW command, but
in this context it really means the linux wrapper to pkg2path which
has the semantics, "give me the unique, full and accurate path for
this node").  If OFW pkg2path doesn't work, then the platform code
must work around it.  I'm pushing back on this because I do not want
to see platform workarounds in the common code.
I'm fine with that, I just don't want to see BUG() happening that
early.  I think a workaround should be handled in common code.  I agree
that heroic workarounds for firmware bugs should be handled in
arch-specific pkg2path hooks, but a simple workaround in common code
is better than just crashing early in boot (imo).
Alright, you've swayed me a bit.  I've made this change and pushed it
out to devicetree/experimental.  I've also picked up your other patch.
 Let me know if it works for you.
diff --git a/drivers/of/pdt.c b/drivers/of/pdt.c
index 5ab3bd5..4d87b5d 100644
--- a/drivers/of/pdt.c
+++ b/drivers/of/pdt.c
@@ -65,17 +65,25 @@ static inline void irq_trans_init(struct device_node *dp) {

 static char * __init of_pdt_build_full_name(struct device_node *dp)
 {
+       static int failsafe_id = 0; /* for generating unique names on failure */
        char *buf;
        int len;

        if (of_pdt_prom_ops->pkg2path(dp->phandle, NULL, 0, &len))
-               BUG();
+               goto failsafe;

        buf = prom_early_alloc(len + 1);
-       if (!buf)
-               BUG();
        if (of_pdt_prom_ops->pkg2path(dp->phandle, buf, len, &len))
-               BUG();
+               goto failsafe;
+       return buf;
+
+ failsafe:
+       buf = prom_early_alloc(strlen(dp->parent->full_name) +
+                              strlen(dp->name) + 16);
+       sprintf(buf, "%s/%s@unknown%i",
+               of_node_is_root(dp->parent) ? "" : dp->parent->full_name,
+               dp->name, failsafe_id++);
+       pr_err("%s: pkg2path failed; assigning %s\n", __func__, buf);
        return buf;
 }
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