All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [help] how does u-boot passing ``fdt'' to linux kernel & where is cmd_line?
@ 2009-07-13 12:44 Baojun Wang
  2009-07-13 14:27 ` Kumar Gala
  0 siblings, 1 reply; 7+ messages in thread
From: Baojun Wang @ 2009-07-13 12:44 UTC (permalink / raw)
  To: u-boot

hi, list:

  I've read Documentation/powerpc/booting-without-of.txt & some
documents about fdt/dtb, as booting-without-of.txt said, the
bootloader like u-boot should passing fdt as $r3, the kernel entry
(physical) address as $r4;

                r3 : physical pointer to the device-tree block
                (defined in chapter II) in RAM

                r4 : physical pointer to the kernel itself. This is
                used by the assembly code to properly disable the MMU
                in case you are entering the kernel with MMU enabled
                and a non-1:1 mapping.

                r5 : NULL (as to differentiate with method a)

I see fdt is something like:

struct fdt_header {
        uint32_t magic;                  /* magic word FDT_MAGIC */
        uint32_t totalsize;              /* total size of DT block */
        uint32_t off_dt_struct;          /* offset to structure */
        uint32_t off_dt_strings;         /* offset to strings */
        uint32_t off_mem_rsvmap;         /* offset to memory reserve map */
        uint32_t version;                /* format version */
        uint32_t last_comp_version;      /* last compatible version */

        /* version 2 fields below */
        uint32_t boot_cpuid_phys;        /* Which physical CPU id we're
                                            booting on */
        /* version 3 fields below */
        uint32_t size_dt_strings;        /* size of the strings block */

        /* version 17 fields below */
        uint32_t size_dt_struct;         /* size of the structure block */
};

My question is how does the kernel cmd line being passed? I know it's
possible for u-boot to patching the target uImage (assume we're using
kernel image cuImage.bamboo)'s dtb by overwrite the dtb ``chosen''
section, but I didn't find any code in u-boot trying to do this.

Even more, after the kernel is bootstraping, (assume we're using a
bamboo board), we'll run into:

static bd_t bd;

...
void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
		unsigned long r6, unsigned long r7)
{
	CUBOOT_INIT();
	bamboo_init(&bd.bi_enetaddr, &bd.bi_enet1addr);
}

...

void bamboo_init(void *mac0, void *mac1)
{
	platform_ops.fixups = bamboo_fixups;
	platform_ops.exit = ibm44x_dbcr_reset;
	bamboo_mac0 = mac0;
	bamboo_mac1 = mac1;
	fdt_init(_dtb_start);
	serial_console_init();
}
...

this code will assume $r3 is passed as a ``bd_t'' structure, but $r3
passed in I think it's the dtb address (not bd_t), and bamboo_init
will set the NIC wrong MAC addresses. I'm quite sure I misunderstand
something between u-boot & linux kernel, could some help me to figure
it out? Thanks in advance!

  Best Regards,
Wang Baojun

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [help] how does u-boot passing ``fdt'' to linux kernel & where is cmd_line?
  2009-07-13 12:44 [U-Boot] [help] how does u-boot passing ``fdt'' to linux kernel & where is cmd_line? Baojun Wang
@ 2009-07-13 14:27 ` Kumar Gala
  2009-07-13 14:39   ` Baojun Wang
  0 siblings, 1 reply; 7+ messages in thread
From: Kumar Gala @ 2009-07-13 14:27 UTC (permalink / raw)
  To: u-boot

> My question is how does the kernel cmd line being passed? I know it's
> possible for u-boot to patching the target uImage (assume we're using
> kernel image cuImage.bamboo)'s dtb by overwrite the dtb ``chosen''
> section, but I didn't find any code in u-boot trying to do this.

Did you look at common/fdt_support.c and fdt_chosen()

The command lines is passed in there as "bootargs"

> Even more, after the kernel is bootstraping, (assume we're using a
> bamboo board), we'll run into:
>
> static bd_t bd;
>
> ...
> void platform_init(unsigned long r3, unsigned long r4, unsigned long  
> r5,
> 		unsigned long r6, unsigned long r7)
> {
> 	CUBOOT_INIT();
> 	bamboo_init(&bd.bi_enetaddr, &bd.bi_enet1addr);
> }
>
> ...
>
> void bamboo_init(void *mac0, void *mac1)
> {
> 	platform_ops.fixups = bamboo_fixups;
> 	platform_ops.exit = ibm44x_dbcr_reset;
> 	bamboo_mac0 = mac0;
> 	bamboo_mac1 = mac1;
> 	fdt_init(_dtb_start);
> 	serial_console_init();
> }
> ...
>
> this code will assume $r3 is passed as a ``bd_t'' structure, but $r3
> passed in I think it's the dtb address (not bd_t), and bamboo_init
> will set the NIC wrong MAC addresses. I'm quite sure I misunderstand
> something between u-boot & linux kernel, could some help me to figure
> it out? Thanks in advance!

Where is the code you are referencing above?  This is the "old" bd_t  
style of booting.  Only the boot wrapper code or and old kernel would  
still be using this.

- k

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [help] how does u-boot passing ``fdt'' to linux kernel & where is cmd_line?
  2009-07-13 14:27 ` Kumar Gala
@ 2009-07-13 14:39   ` Baojun Wang
  2009-07-13 14:53     ` Kumar Gala
  0 siblings, 1 reply; 7+ messages in thread
From: Baojun Wang @ 2009-07-13 14:39 UTC (permalink / raw)
  To: u-boot

On Mon, Jul 13, 2009 at 10:27 PM, Kumar Gala<galak@kernel.crashing.org> wrote:
>> My question is how does the kernel cmd line being passed? I know it's
>> possible for u-boot to patching the target uImage (assume we're using
>> kernel image cuImage.bamboo)'s dtb by overwrite the dtb ``chosen''
>> section, but I didn't find any code in u-boot trying to do this.
>
> Did you look at common/fdt_support.c and fdt_chosen()
>
> The command lines is passed in there as "bootargs"

That's all I need ;-)

>> Even more, after the kernel is bootstraping, (assume we're using a
>> bamboo board), we'll run into:
>>
>> static bd_t bd;
>>
>> ...
>> void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
>> ? ? ? ? ? ? ? ?unsigned long r6, unsigned long r7)
>> {
>> ? ? ? ?CUBOOT_INIT();
>> ? ? ? ?bamboo_init(&bd.bi_enetaddr, &bd.bi_enet1addr);
>> }
>>
>> ...
>>
>> void bamboo_init(void *mac0, void *mac1)
>> {
>> ? ? ? ?platform_ops.fixups = bamboo_fixups;
>> ? ? ? ?platform_ops.exit = ibm44x_dbcr_reset;
>> ? ? ? ?bamboo_mac0 = mac0;
>> ? ? ? ?bamboo_mac1 = mac1;
>> ? ? ? ?fdt_init(_dtb_start);
>> ? ? ? ?serial_console_init();
>> }
>> ...
>>
>> this code will assume $r3 is passed as a ``bd_t'' structure, but $r3
>> passed in I think it's the dtb address (not bd_t), and bamboo_init
>> will set the NIC wrong MAC addresses. I'm quite sure I misunderstand
>> something between u-boot & linux kernel, could some help me to figure
>> it out? Thanks in advance!
>
> Where is the code you are referencing above? ?This is the "old" bd_t style
> of booting. ?Only the boot wrapper code or and old kernel would still be
> using this.
>
> - k
>

the code is from arch/powerpc/boot/cuboot-bamboo.c, and the kernel is
2.6.30.1, the boot image I'm using is something like cuImage.bamboo, I
checked zImage.ld.S, and found that when we're running cuImage.bamboo,
we actually fall into arch/powerpc/boot/crt0.S:_zimage_start(), which
will call platform_init() and then bamboo_init() finally. but sounds
like if we passing r3 as fdt, then the code (platform_init, etc.., and
even arch/powerpc/kernel/head_xxx.S start() function, only comments,
though) is actually wrong, isn't it? Thank you very much for help.

  Best Regards,
Wang

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [help] how does u-boot passing ``fdt'' to linux kernel & where is cmd_line?
  2009-07-13 14:39   ` Baojun Wang
@ 2009-07-13 14:53     ` Kumar Gala
  2009-07-13 15:14       ` Baojun Wang
  0 siblings, 1 reply; 7+ messages in thread
From: Kumar Gala @ 2009-07-13 14:53 UTC (permalink / raw)
  To: u-boot


On Jul 13, 2009, at 9:39 AM, Baojun Wang wrote:

>>
>> Where is the code you are referencing above?  This is the "old"  
>> bd_t style
>> of booting.  Only the boot wrapper code or and old kernel would  
>> still be
>> using this.
>>
>> - k
>>
>
> the code is from arch/powerpc/boot/cuboot-bamboo.c, and the kernel is
> 2.6.30.1, the boot image I'm using is something like cuImage.bamboo, I
> checked zImage.ld.S, and found that when we're running cuImage.bamboo,
> we actually fall into arch/powerpc/boot/crt0.S:_zimage_start(), which
> will call platform_init() and then bamboo_init() finally. but sounds
> like if we passing r3 as fdt, then the code (platform_init, etc.., and
> even arch/powerpc/kernel/head_xxx.S start() function, only comments,
> though) is actually wrong, isn't it? Thank you very much for help.

This is the boot wrapper code only used if you are trying to boot a  
new kernel w/an old u-boot.  If you are using a current u-boot you  
should just be using a plain old uImage as produced by the kernel build.

- k

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [help] how does u-boot passing ``fdt'' to linux kernel & where is cmd_line?
  2009-07-13 14:53     ` Kumar Gala
@ 2009-07-13 15:14       ` Baojun Wang
  2009-07-14 11:24         ` Detlev Zundel
  0 siblings, 1 reply; 7+ messages in thread
From: Baojun Wang @ 2009-07-13 15:14 UTC (permalink / raw)
  To: u-boot

On Mon, Jul 13, 2009 at 10:53 PM, Kumar Gala<galak@kernel.crashing.org> wrote:
>
> On Jul 13, 2009, at 9:39 AM, Baojun Wang wrote:
>
>>>
>>> Where is the code you are referencing above? ?This is the "old" bd_t
>>> style
>>> of booting. ?Only the boot wrapper code or and old kernel would still be
>>> using this.
>>>
>>> - k
>>>
>>
>> the code is from arch/powerpc/boot/cuboot-bamboo.c, and the kernel is
>> 2.6.30.1, the boot image I'm using is something like cuImage.bamboo, I
>> checked zImage.ld.S, and found that when we're running cuImage.bamboo,
>> we actually fall into arch/powerpc/boot/crt0.S:_zimage_start(), which
>> will call platform_init() and then bamboo_init() finally. but sounds
>> like if we passing r3 as fdt, then the code (platform_init, etc.., and
>> even arch/powerpc/kernel/head_xxx.S start() function, only comments,
>> though) is actually wrong, isn't it? Thank you very much for help.
>
> This is the boot wrapper code only used if you are trying to boot a new
> kernel w/an old u-boot. ?If you are using a current u-boot you should just
> be using a plain old uImage as produced by the kernel build.

do you mean the default ``uImage'' file? I'm using u-boot-2009.06, and
I can boot successfully with cuImage.mpc8548cds (I'm actually working
on a mpc8548 cds board), but unable to boot ``uImage'', I'm sure the
``vmlinux'' is the same.


tftp 1000000 uImage
bootm 1000000


Bytes transferred = 1619661 (18b6cd hex)
=> bootm 1000000
## Booting kernel from Legacy Image at 01000000 ...
   Image Name:   Linux-2.6.31-rc2
   Image Type:   PowerPC Linux Kernel Image (gzip compressed)
   Data Size:    1619597 Bytes =  1.5 MB
   Load Address: 00000000
   Entry Point:  00000000
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK

acording the arch/powerpc/boot/Makefile:

# dtbImage% - a dtbImage is a zImage with an embedded device tree blob
$(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(obj)/%.dtb
        $(call if_changed,wrap,$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)

$(obj)/dtbImage.%: vmlinux $(wrapperbits) $(obj)/%.dtb
        $(call if_changed,wrap,$*,,$(obj)/$*.dtb)

# This cannot be in the root of $(src) as the zImage rule always adds a $(obj)
# prefix
$(obj)/vmlinux.strip: vmlinux
        $(STRIP) -s -R .comment $< -o $@

# The iseries hypervisor won't take an ET_DYN executable, so this
# changes the type (byte 17) in the file to ET_EXEC (2).
$(obj)/zImage.iseries: vmlinux
        $(STRIP) -s -R .comment $< -o $@
        printf "\x02" | dd of=$@ conv=notrunc bs=1 seek=17

$(obj)/uImage: vmlinux $(wrapperbits)
        $(call if_changed,wrap,uboot)


It seems the right image should be dtbImage.XXXX because it embedes
with dtb while uImage does not, however, mpc8548_cds (mpc85xx) doesn't
produce the dtbImage..

I'm sorry I can't quite follow you, get confused again -_-

  Regards & Thanks
Wang

> - k
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [help] how does u-boot passing ``fdt'' to linux kernel & where is cmd_line?
  2009-07-13 15:14       ` Baojun Wang
@ 2009-07-14 11:24         ` Detlev Zundel
  2009-07-14 11:44           ` Baojun Wang
  0 siblings, 1 reply; 7+ messages in thread
From: Detlev Zundel @ 2009-07-14 11:24 UTC (permalink / raw)
  To: u-boot

Hi Wang,

>>> the code is from arch/powerpc/boot/cuboot-bamboo.c, and the kernel is
>>> 2.6.30.1, the boot image I'm using is something like cuImage.bamboo, I
>>> checked zImage.ld.S, and found that when we're running cuImage.bamboo,
>>> we actually fall into arch/powerpc/boot/crt0.S:_zimage_start(), which
>>> will call platform_init() and then bamboo_init() finally. but sounds
>>> like if we passing r3 as fdt, then the code (platform_init, etc.., and
>>> even arch/powerpc/kernel/head_xxx.S start() function, only comments,
>>> though) is actually wrong, isn't it? Thank you very much for help.
>>
>> This is the boot wrapper code only used if you are trying to boot a new
>> kernel w/an old u-boot. ?If you are using a current u-boot you should just
>> be using a plain old uImage as produced by the kernel build.
>
> do you mean the default ``uImage'' file? I'm using u-boot-2009.06, and
> I can boot successfully with cuImage.mpc8548cds (I'm actually working
> on a mpc8548 cds board), but unable to boot ``uImage'', I'm sure the
> ``vmlinux'' is the same.

Booting such a new kernel, you'll need to pass an adress of an fdt too:

=> help bootm
bootm [addr [arg ...]]
    - boot application image stored in memory
    passing arguments 'arg ...'; when booting a Linux kernel,
    'arg' can be the address of an initrd image
    When booting a Linux kernel which requires a flat device-tree
    a third argument is required which is the address of the
    device-tree blob. To boot that kernel without an initrd image,
    use a '-' for the second argument. If you do not pass a third
    a bd_info struct will be passed instead

So try "bootm <kernel> - <fdt>"

Cheers
  Detlev

-- 
"The number you have dialed is imaginary. Please rotate your phone 90
degrees and try again."
--
DENX Software Engineering GmbH,      MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich,  Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-40 Fax: (+49)-8142-66989-80 Email: dzu at denx.de

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [help] how does u-boot passing ``fdt'' to linux kernel & where is cmd_line?
  2009-07-14 11:24         ` Detlev Zundel
@ 2009-07-14 11:44           ` Baojun Wang
  0 siblings, 0 replies; 7+ messages in thread
From: Baojun Wang @ 2009-07-14 11:44 UTC (permalink / raw)
  To: u-boot

Thank you very much, also found the method is documented the new u-boot wiki.

  Best Regards,
Wang


On Tue, Jul 14, 2009 at 7:24 PM, Detlev Zundel<dzu@denx.de> wrote:
> Hi Wang,
>
>>>> the code is from arch/powerpc/boot/cuboot-bamboo.c, and the kernel is
>>>> 2.6.30.1, the boot image I'm using is something like cuImage.bamboo, I
>>>> checked zImage.ld.S, and found that when we're running cuImage.bamboo,
>>>> we actually fall into arch/powerpc/boot/crt0.S:_zimage_start(), which
>>>> will call platform_init() and then bamboo_init() finally. but sounds
>>>> like if we passing r3 as fdt, then the code (platform_init, etc.., and
>>>> even arch/powerpc/kernel/head_xxx.S start() function, only comments,
>>>> though) is actually wrong, isn't it? Thank you very much for help.
>>>
>>> This is the boot wrapper code only used if you are trying to boot a new
>>> kernel w/an old u-boot. ?If you are using a current u-boot you should just
>>> be using a plain old uImage as produced by the kernel build.
>>
>> do you mean the default ``uImage'' file? I'm using u-boot-2009.06, and
>> I can boot successfully with cuImage.mpc8548cds (I'm actually working
>> on a mpc8548 cds board), but unable to boot ``uImage'', I'm sure the
>> ``vmlinux'' is the same.
>
> Booting such a new kernel, you'll need to pass an adress of an fdt too:
>
> => help bootm
> bootm [addr [arg ...]]
> ? ?- boot application image stored in memory
> ? ?passing arguments 'arg ...'; when booting a Linux kernel,
> ? ?'arg' can be the address of an initrd image
> ? ?When booting a Linux kernel which requires a flat device-tree
> ? ?a third argument is required which is the address of the
> ? ?device-tree blob. To boot that kernel without an initrd image,
> ? ?use a '-' for the second argument. If you do not pass a third
> ? ?a bd_info struct will be passed instead
>
> So try "bootm <kernel> - <fdt>"
>
> Cheers
> ?Detlev
>
> --
> "The number you have dialed is imaginary. Please rotate your phone 90
> degrees and try again."
> --
> DENX Software Engineering GmbH, ? ? ?MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, ?Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-40 Fax: (+49)-8142-66989-80 Email: dzu at denx.de
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2009-07-14 11:44 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-07-13 12:44 [U-Boot] [help] how does u-boot passing ``fdt'' to linux kernel & where is cmd_line? Baojun Wang
2009-07-13 14:27 ` Kumar Gala
2009-07-13 14:39   ` Baojun Wang
2009-07-13 14:53     ` Kumar Gala
2009-07-13 15:14       ` Baojun Wang
2009-07-14 11:24         ` Detlev Zundel
2009-07-14 11:44           ` Baojun Wang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.