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.