[PATCH 5/5] arm: boot: store ATAGs structure into DT "/chosen/linux, atags" entry
From: arnd@arndb.de (Arnd Bergmann)
Date: 2015-12-15 11:05:30
Also in:
linux-devicetree, linux-omap, lkml
On Tuesday 15 December 2015 10:33:25 Pali Roh?r wrote:
On Monday 30 November 2015 11:09:42 Nicolas Pitre wrote:quoted
On Mon, 30 Nov 2015, Pali Roh?r wrote:quoted
On Monday 30 November 2015 07:23:53 Tony Lindgren wrote:quoted
* Pali Roh?r [off-list ref] [151129 16:16]:quoted
On Monday 30 November 2015 01:09:17 Nicolas Pitre wrote:quoted
On Sun, 29 Nov 2015, Russell King - ARM Linux wrote:In arch/arm/kernel/setup.c is function setup_arch() and it calls: mdesc = setup_machine_fdt(__atags_pointer); if (!mdesc) mdesc = setup_machine_tags(__atags_pointer, __machine_arch_type); So it looks like that on atags address is stored either atags structure or DT structure... so it is truth kernel uncompress code put DT blob to same offset where is expected atags structure?No. It doesn't put it anywhere. Those functions read DT/ATAGs from the passed address. But you know this address won't be the one you want for the legacy ATAGs. What you should do is to add a init_early hook to your mdesc structure and retrieve your ATAGs from there directly at PAGE_OFFSET + 0x100. Now I suspect paging_init() marks the point where the ATAGs will be overwritten. To prevent this, you might have to add an additional tweak in arm_mm_memblock_reserve() similar to the one already present for CONFIG_SA1111. Something like: memblock_reserve(PHYS_OFFSET, PAGE_SIZE); And later on you can return that page back to the system.So am I understand correctly that solution would be to hack arch/arm/mm/mmu.c to not overwrite page at PHYS_OFFSET?
I would think we can just copy the data from PAGE_OFFSET + 0x100 to a some other page from your init_early hook. IIRC you can't use kmalloc there, but memblock_alloc() should work. Arnd