Re: [PATCH] [ARM] Use AT() in the linker script to create correctprogram headers

From: Jason Gunthorpe
Date: Thu Oct 04 2012 - 13:59:04 EST


On Thu, Oct 04, 2012 at 12:36:37PM +0100, Dave Martin wrote:

> OK, so it is supported, but not for ARM, yet. I'm not sure that
> such a patch would be rejected, since building in a DTB is not
> really that different from building in a command-line.

Maybe I will be able to look at this in a few months..

> The other solution to this problem is to distribute the dtb
> alongside the kernel as a supplementary image (similar to
> initramfs), with the bootloader doing the bare minimum of
> modifications to it.

Yes, but we still need rely on complex code like I2C/MTD to create a
correct DTB, which again puts us back to patching the kernel for that
functionality.

> Naturally, if zero modifications are needed then the bootloader does not
> need libfdt (or equivalent code) at all.

If only :)

> One other option open to you would be to provide an ELF image loadable
> by your bootloader via a simple wrapper. This would probably be a more
> robust approach than carrying patches against head.S, since it removes
> any intimate dependency on the kernel code itself.

This is what I ment by having a 2nd stage loader, but this example is
not complete because at this point you also have to patch into the DTB
the initrd address (passed in r0/r1), and the various MAC addresses
(getting them is the hard part..).

The nice thing about the head.S patch is that it lives right after
_entry, so there actually are no dependencies on the kernel code, it
executes in the same environment as the example you presented.

Anyhow, exploring a CONFIG_ARM_BUILT_IN_DTB.. I think I'd add
something like this to head.S:

#ifdef CONFIG_ARM_BUILT_IN_DTB
adr r3,bootloader_r0
stmia r3,{r0,r1,r2}
mov r2, #0
mov r1, #0
mov r0, #0
#else
bl __vet_atags
#endif

And something like this to early_dt_fixup:

#ifdef CONFIG_ARM_BUILT_IN_DTB
for_each_dt_provider(dtp) {
devtree = dtp->get_dtb();
if (devtree)
break;
}
#else
devtree = phys_to_virt(dt_phys);
#endif

Where the 'dev tree provider' would use the stored bootloader
registers and any other information to return the proper DTB.

Jason
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/