[PATCH 6/8] sunxi: board: Set fdtfile to match the DT chosen by SPL

Samuel Holland samuel at sholland.org
Tue Sep 22 03:33:52 CEST 2020


On 9/21/20 7:43 PM, André Przywara wrote:
> On 03/09/2020 06:07, Samuel Holland wrote:
> 
> Hi,
> 
>> Previously, fdtfile was always the value in CONFIG_DEFAULT_DEVICE_TREE.
>> This meant that, regardless of the DT chosen by SPL (either by changing
>> the header in the image or by the selection code at runtime), Linux
>> always used the default DT.
>>
>> By using the name from the SPL header (which, because of the previous
>> commit, always matches the DT used by U-Boot proper), Linux also sees
>> the same board as U-Boot/SPL, even if the boot script later loads a DT
>> from disk.
> 
> I strongly frown upon proliferating the broken way of explicitly loading
> a DT from somewhere, when the DT embedded in U-Boot should be all we
> will ever need.

The embedded DT is only "all you ever need" if 1) your DT is 100% complete and
accurate (ha, ha, ha) or 2) you re-flash U-Boot every time the device tree
changes, which is risky and an unnecessary waste of flash memory write cycles.

Having a built-in DT that's always available and mostly works is quite useful,
but complaining that distros and users want to update their DTs without
patching, recompiling, and re-flashing U-Boot is frankly ridiculous. Especially
considering that the U-Boot DTs are usually out of date, and users might not
want to update the U-Boot code for various reasons.

> But making the selected DT available to U-Boot scripts doesn't really
> hurt or prevent us from doing it properly, so:
> 
>> Signed-off-by: Samuel Holland <samuel at sholland.org>
> 
> One nit below, with that:
> Reviewed-by: Andre Przywara <andre.przywara at arm.com>
> 
> Cheers,
> Andre
> 
>> ---
>>  board/sunxi/board.c | 11 +++++++++++
>>  1 file changed, 11 insertions(+)
>>
>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>> index eaa40a1ea96..5457b28e135 100644
>> --- a/board/sunxi/board.c
>> +++ b/board/sunxi/board.c
>> @@ -870,6 +870,7 @@ static void setup_environment(const void *fdt)
>>  
>>  int misc_init_r(void)
>>  {
>> +	const char *spl_dt_name;
>>  	uint boot;
>>  
>>  	env_set("fel_booted", NULL);
>> @@ -888,6 +889,16 @@ int misc_init_r(void)
>>  		env_set("mmc_bootdev", "1");
>>  	}
>>  
>> +	/* Set fdtfile to match the FIT configuration chosen in SPL. */
>> +	spl_dt_name = get_spl_dt_name();
>> +	if (spl_dt_name) {
>> +		char *prefix = IS_ENABLED(CONFIG_ARM64) ? "allwinner/" : "";
>> +		char str[64];
> 
> The longest name (including the directory name) is 49 characters so far,
> so let's hope that people don't go crazy with their DT names. Shall we
> check the return value of snprintf() and at least complain? In contrast
> to strncpy(), snprintf() is safe, but might still truncate the name.

What kind of complaint were you thinking of? Trying to actually use a truncated
$fdtfile would produce a "file not found" error. Maybe that would be obvious enough?

Cheers,
Samuel

> Cheers,
> Andre.
> 
>> +
>> +		snprintf(str, sizeof(str), "%s%s.dtb", prefix, spl_dt_name);
>> +		env_set("fdtfile", str);
>> +	}
>> +
>>  	setup_environment(gd->fdt_blob);
>>  
>>  #ifdef CONFIG_USB_ETHER
>>
> 



More information about the U-Boot mailing list