Subject: [PATCH RFC RFT 0/2] ARM: Kirkwood: Synology DT files

From: [email-masked] (Ben Peddell)
Date: Sat, 11 Jan 2014 01:48:21 +1000

On 11/01/14 00:58, Russell King - ARM Linux wrote:
> On Fri, Jan 10, 2014 at 03:25:48PM +0100, Andrew Lunn wrote:
>> On Sat, Jan 11, 2014 at 12:09:11AM +1000, Ben Peddell wrote:
>>> Bytes transferred = 1954736 (1dd3b0 hex)
>>> Marvell>> setenv bootargs console=ttyS0,115200 ip=off initrd=0x00800040,0x0013FFC0 root=/dev/md0 rw syno_hw_version=DS211j ihd_num=2 netif_num=1 earlyprintk
>>
>> I don't see you loading the initrd into RAM at 0x0080 0000.
> 
> However, the kernel _is_ being told that the initrd is at 0x00800040.
> 
>>> Uncompressing Linux... done, booting the kernel.
>>> [    0.000000] Booting Linux on physical CPU 0x0
>>> [    0.000000] Linux version 3.13.0-rc7-ds211j+ (root at lurch) (gcc version 4.8.2 (Gentoo 4.8.2 p1.3, pie-0.5.8) ) #2 Thu Jan 9 08:52:24 EST 2014
>>> [    0.000000] CPU: Feroceon 88FR131 [56251311] revision 1 (ARMv5TE), cr=00053977
>>> [    0.000000] CPU: VIVT data cache, VIVT instruction cache
>>> [    0.000000] Machine model: Synology DS210 v10, v20, v30, DS211j
>>> [    0.000000] bootconsole [earlycon0] enabled
>>> [    0.000000] INITRD: 0xf8280040+0x000f993c is not a memory region - disabling initrd
>>
>> The kernel is correct. There is no RAM here. That is in the IOMEM
>> space.
> 
> But here the kernel has ignored the command line parameter and instead
> used the one passed via DT.  That is not correct - command line parameters
> must always override ATAGs or DT.
> 
> (That's irrespective of whether what's actually being asked of the kernel
> is correct or not - the principle here applies that command line parameters
> override, and in this case they aren't.)

Uncompressing Linux... done, booting the kernel.
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 3.13.0-rc7-ds211j+ (klightspeed at lurch) (gcc version 4.8.2 (Gentoo 4.8.2 p1.3, pie-0.5.8) ) #4 Sat Jan 11 01:20:05 EST 2014
[    0.000000] CPU: Feroceon 88FR131 [56251311] revision 1 (ARMv5TE), cr=00053977
[    0.000000] CPU: VIVT data cache, VIVT instruction cache
[    0.000000] FDT initrd_start=0xf8280040  initrd_end=0xf83c0000
[    0.000000] Machine model: Synology DS210 v10, v20, v30, DS211j
[    0.000000] bootconsole [earlycon0] enabled
[    0.000000] Kernel Parameter initrd=0x00800040,0x0013ffc0
[    0.000000] INITRD: 0xf8280040+0x0013ffc0 is not a memory region - disabling initrd
...
[    1.316624] Trying to unpack rootfs image as initramfs...
[    1.322097] Unable to handle kernel paging request at virtual address b8280040

First, FDT fills in initrd_start and initrd_end:

--- start drivers/of/fdt.c line 704 early_init_dt_check_for_initrd() ---
        initrd_start = (unsigned long)__va(start);
        initrd_end = (unsigned long)__va(end);
        initrd_below_start_ok = 1;
--- end ---

Then the initrd parameter is parsed into phys_initrd_start and phys_initrd_size:

--- start arch/arm/mm/init.c line 52 early_initrd() ---
                phys_initrd_start = start;
                phys_initrd_size = size;
--- end ---

phys_initrd_start and phys_initrd_size is then overwritten from initrd_start and initrd_end:

--- start arch/arm/mm/init.c line 351 arm_memblock_init() ---
        /* FDT scan will populate initrd_start */
        if (initrd_start) {
                phys_initrd_start = __virt_to_phys(initrd_start);
                phys_initrd_size = initrd_end - initrd_start;
        }
--- end ---

initrd_start and initrd_end are still set, and so unpack_to_rootfs() tries to access it.