Regression on Integrator after commit 07e461cd7
Grant Likely
grant.likely at linaro.org
Tue Jun 24 02:16:25 PDT 2014
On Mon, 23 Jun 2014 19:17:03 +0200, Linus Walleij <linus.walleij at linaro.org> wrote:
> Hi Grant,
>
> The Integrators are not booting after commit
> 07e461cd7e73a84f0e3757932b93cc80976fd749
> "of: Ensure unique names without sacrificing determinism"
>
> i.e. these device trees:
> arch/arm/boot/dts/integratorap.dts
> arch/arm/boot/dts/integratorcp.dts
>
> It hangs very early boot at one time with the message:
> Error: unrecognized/unsupported processor variant (0x41069262).
Hmmm, how early in boot? Can you get the log buffer out? It may be failing
on a call to of_device_make_bus_id, but I suspect that something is
failing to match against the new device name. The error message is very
odd though. It is coming out from the DEBUG_LL block in __error_p
(head-common.S), but the device naming code should be anywhere near
early initalization code. I would expect to find at least something in the
log buffer.
I doubt there is anything wrong with the .dts files. Smells like a
kernel bug.
g.
>
> Reverting that patch (manually) makes the platform boot again,
> so it's definately caused by that.
>
> Can you see what is wrong with these device trees, like if it's
> something obvious that the code is not expecting? It's like
> it cannot build the tree or something.
>
> My revert does not look very nice but looks like this:
>
> commit be15147f12a72b7bc63a8e18a2edd74123bcb5f0
> Author: Linus Walleij <linus.walleij at linaro.org>
> Date: Mon Jun 23 18:59:58 2014 +0200
>
> Revert "of: Ensure unique names without sacrificing determinism"
>
> This reverts commit 07e461cd7e73a84f0e3757932b93cc80976fd749.
>
> Conflicts:
> drivers/of/platform.c
>
> diff --git a/drivers/of/platform.c b/drivers/of/platform.c
> index 6c48d73a7fd7..71581921c1f3 100644
> --- a/drivers/of/platform.c
> +++ b/drivers/of/platform.c
> @@ -64,35 +64,37 @@ EXPORT_SYMBOL(of_find_device_by_node);
> * of_device_make_bus_id - Use the device node data to assign a unique name
> * @dev: pointer to device structure that is linked to a device tree node
> *
> - * This routine will first try using the translated bus address to
> - * derive a unique name. If it cannot, then it will prepend names from
> - * parent nodes until a unique name can be derived.
> + * This routine will first try using either the dcr-reg or the reg property
> + * value to derive a unique name. As a last resort it will use the node
> + * name followed by a unique number.
> */
> void of_device_make_bus_id(struct device *dev)
> {
> + static atomic_t bus_no_reg_magic;
> struct device_node *node = dev->of_node;
> const __be32 *reg;
> u64 addr;
> + int magic;
>
> - /* Construct the name, using parent nodes if necessary to
> ensure uniqueness */
> - while (node->parent) {
> - /*
> - * If the address can be translated, then that is as much
> - * uniqueness as we need. Make it the first component and return
> - */
> - reg = of_get_property(node, "reg", NULL);
> - if (reg && (addr = of_translate_address(node, reg)) !=
> OF_BAD_ADDR) {
> - dev_set_name(dev, dev_name(dev) ? "%llx.%s:%s"
> : "%llx.%s",
> - (unsigned long long)addr, node->name,
> - dev_name(dev));
> + /*
> + * For MMIO, get the physical address
> + */
> + reg = of_get_property(node, "reg", NULL);
> + if (reg) {
> + addr = of_translate_address(node, reg);
> + if (addr != OF_BAD_ADDR) {
> + dev_set_name(dev, "%llx.%s",
> + (unsigned long long)addr, node->name);
> return;
> }
> -
> - /* format arguments only used if dev_name() resolves to NULL */
> - dev_set_name(dev, dev_name(dev) ? "%s:%s" : "%s",
> - strrchr(node->full_name, '/') + 1, dev_name(dev));
> - node = node->parent;
> }
> +
> + /*
> + * No BusID, use the node name and add a globally incremented
> + * counter (and pray...)
> + */
> + magic = atomic_add_return(1, &bus_no_reg_magic);
> + dev_set_name(dev, "%s.%d", node->name, magic - 1);
> }
>
> /**
>
>
> I have no real idea of how the OF core works so I'm a bit in the blue
> here :-/
>
> Any help appreciated!
>
> Yours,
> Linus Walleij
More information about the linux-arm-kernel
mailing list