[PATCH v5] of/promtree: allow DT device matching by fixing 'name' brokenness
Grant Likely
grant.likely at secretlab.ca
Fri Feb 25 17:06:06 EST 2011
On Thu, Feb 24, 2011 at 1:01 PM, Andres Salomon <dilinger at queued.net> wrote:
> On Thu, 24 Feb 2011 12:42:34 -0700
> Grant Likely <grant.likely at secretlab.ca> wrote:
>> 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 at 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.
More information about the devicetree-discuss
mailing list