[U-Boot] FDT retrived raspberry pi bootargs length > 350 characters cause setenv errors, sequemce fdt get/ set/ get truncates at the first blank in the string.

dh at synoia.com dh at synoia.com
Thu Nov 24 22:24:31 CET 2016



From: Anatolij Gustschin <agust at denx.de>
 To: dh at synoia.com 
Cc: Tom Rini <trini at konsulko.com>; u-boot <u-boot at lists.denx.de>
 Sent: Thursday, November 24, 2016 1:12 AM
 Subject: Re: [U-Boot] FDT retrived raspberry pi bootargs length > 350 characters cause setenv errors, sequemce fdt get/ set/ get truncates at the first blank in the string.
   
On Wed, 23 Nov 2016 20:46:22 +0000 (UTC)
dh at synoia.com dh at synoia.com wrote:

>On Wed, 23 Nov 2016 01:26:22 +0000 (UTC)
>dh at synoia.com dh at synoia.com wrote:
>...
>> 8250.nr_uarts=0 dma.dmachans=0x7f35 bcm2708_fb.fbwidth=3840 bcm2708_fb.fbheight=2160 bcm2709.boardrev=0xa02082 bcm2709.serial=0x998f552d smsc95xx.macaddr=B8:27:EB:8F:55:2D bcm2708_fb.fbswap=1 bcm2709.uart_clock=48000000 vc_mem.mem_base=0x3dc00000 vc_mem.mem_size=0x3f000000? dwc_otg.lpm_enable=0 console=ttyS0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
>> 1 ) Note: bootargs is over 480 characters long
>>
>> setenv abc $bootargs fails...when bootargs is over 350 (approx) characters long.?
>> fdt set bootargs /chosen bootargs
>> fdt get value bootargs /chosen bootargsbootargs=8250.nr_uarts=0Bootargs is truncated
>> The PI firmware generated bootargs parameters have blanks in the bootargs line.?
>> nvalue.c implements setenv in the _do_env_set()? routine, but I cannot find a length limit in that routine.
>> I'm willing to make the changes and test them.  
>
>please check CONFIG_SYS_MAXARGS and CONFIG_SYS_BARGSIZE and increase
>them in your board config file (include/configs/rpi.h ?). See README
>for description of these macros.
>If CONFIG_SYS_BARGSIZE is not defined, the default value 512 is used.
>Define a bigger value and test if it works.
>
>Also if you set long environment strings manually with console
>commands, the console input buffer might be to small. In that
>case check CONFIG_SYS_CBSIZE in your board config file.
>
>
>Set:
>CONFIG_SYS_MAXARGS     32
>CONFIG_SYS_BARGSIZE     1024
>
>Success! This works.
>
>Console is not a problem, I cannot type that many characters without
>an error or two.

okay, I just wanted to mention CONFIG_SYS_CBSIZE for the sake
of completeness.

>Issue possibly remaining:
>sequence fdt get/ set/ get truncates bootargs at the first blank
>in the string of bootargs.
>This is only a problem if bootargs is passed to the kernel through
>the fdt, and not as separate character string. I do not know which
>is the mechanism used.
>Further testing on this remains.

In your description above I see the command:

 fdt set bootargs /chosen bootargs

This is wrong and could not work. You probably used:

 fdt set /chosen bootargs $bootargs

It will insert multiple tokens separated by comma, e.g.:

=> setenv bootargs 'arg1 arg2 arg3'
=> fdt set /chosen bootargs $bootargs
=> fdt pri /chosen                  
chosen {
    bootargs = "arg1", "arg2", "arg3";
};
=> fdt get value bootargs /chosen bootargs
=> pri bootargs
bootargs=arg1

This is the behaviour you observe.

To avoid tokenizing the bootargs property in the blob you have
to use an intermediate step, e.g.:

=> seten args "\"$bootargs\""
=> pri args
args="arg1 arg2 arg3"

=> fdt set /chosen bootargs $args
=> fdt pri /chosen
chosen {
    bootargs = "arg1 arg2 arg3";
};

=> fdt get value bootargs /chosen bootargs
=> pri bootargs
bootargs=arg1 arg2 arg3

--
Anatolij
That works well. Thank you for you help.
Duncan Hare


   


More information about the U-Boot mailing list