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@synoia.com dh@synoia.com wrote:
On Wed, 23 Nov 2016 01:26:22 +0000 (UTC) dh@synoia.com dh@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

From: Anatolij Gustschin agust@denx.de To: dh@synoia.com Cc: Tom Rini trini@konsulko.com; u-boot u-boot@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@synoia.com dh@synoia.com wrote:
On Wed, 23 Nov 2016 01:26:22 +0000 (UTC) dh@synoia.com dh@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
participants (2)
-
Anatolij Gustschin
-
dh@synoia.com