Hi,

On 4/22/25 00:28, Heinrich Schuchardt wrote:
> Am 22. April 2025 08:45:26 MESZ schrieb E Shattow <e...@freeshell.de>:
>> Remove board detection logic from main payload that is duplicated from SPL
>> and do not set convenience data into $fdtfile environment variable. U-Boot
>> "starfive visionfive2" board target(s) now boot on recent upstream Linux
>> Kernel releases without this manipulation since the JH7110 OF_UPSTREAM
>> migration. Changes to $fdtfile by users (i.e. following newer or older Linux
>> Kernel releases) should follow the advice in general U-Boot documentation.
> 

> We cannot expect that users have a U-Boot installed in SPI flash that matches 
> the Linux they intend to boot.

Yes, but we must. We cannot expect that EFI System Partition will
contain the correct single dtb compatible for many on-disk versions of
Linux Kernel that we have no possible way to know which one will be
booted. This is not any better... we're chasing a problem that is not in
our domain.

>From the downstream userland there's limits to U-Boot EFI variable
writing (yes, still today? or has this changed) that prevent U-Boot from
being informed by Linux distro-managed installation about the correct
device-tree pairings for Linux Kernel boot entries that should be loaded.

If that (EFI variable writing) were usable then we don't have to do
anything in U-Boot since it's a userland issue of parsing the model and
figuring this out when updating EFI variables.

In case of non-EFI then we're still doing it wrong and also not
consistently over U-Boot boards that are OF_UPSTREAM;  there would be a
mess of `fdt print` parsing to try and implement it as a U-Boot
script... and I don't know of any userland boot menu updating tools that
try to parse out the dtb path from Fdt as of yet, at least not for the
jh7110 targets I am familiar with.

The strategy I like to think of here is to make this generic and
maintainable. Current approach to copy-paste detection logic duplicated
from each U-Boot board target SPL to main payload init logic... it
served some immediate needs to get riscv64 over the starting line with
Linux distros but it smells weird and should get cleaned out.

> 
> Linux is known to break device-tree compatibility between versions.

U-Boot releases from before JH7110 OF_UPSTREAM migration would just do
wrong things because its internal Fdt was not consistent with any
release version of Linux Kernel. Now since OF_UPSTREAM it is consistent
with some known release version of upstream Linux Kernel. You can say
now with certainty that U-Boot release 'x' will work with Linux Kernel
version 'y' and intermediary boot loader versions (i.e. GRUB).

> 
> Without U-Boot providing a value of $fdtfile that matches the board, U-Boot 
> will not pick up the device-tree on the ESP of Ubuntu's installer image which 
> matches the kernel version.

Meanwhile, require a certain release version of U-Boot for a given
release of the (distro) installer, and then (distro) fixes userspace to
do something more robust. If making EFI variable setting outside of
U-Boot work properly is not feasible, and you must keep fdtfile var
setting, then on to your next point that it should be *consistent* and
general, applying to all OF_UPSTREAM board targets across U-Boot.

> 
> Please, keep U-Boot providing a value of $fdtfile that matches the actual 
> board.
> 
> It would be preferable if that name could be based on the choice of the 
> configuration by SPL instead of duplicating the logic. But I am not aware of 
> logic that provides the configuration name to main U-Boot. Maybe we should 
> simply match the model or conpatible string.
> 

Yes, Heinrich. For Simon, do you have any thoughts on this? The question
is broadly: we have this callback at SPL phase that selects for dtb from
multi fit and how can we bring some information of that outcome (namely
the dtb pathname) forward to the U-Boot main payload?

Is this to be a new (or existing? fdt print?) scripting command that
emits such info? An immutable env variable (such that i.e. `env set
fdtfile ${ofmake}/${ofmodel}.dtb` is valid for pre-boot) ?

-E

> Best regards
> 
> Heinrich 
> 
>>
>> Signed-off-by: E Shattow <e...@freeshell.de>
>> ---
>> .../visionfive2/starfive_visionfive2.c        | 61 -------------------
>> 1 file changed, 61 deletions(-)
>>
>> diff --git a/board/starfive/visionfive2/starfive_visionfive2.c 
>> b/board/starfive/visionfive2/starfive_visionfive2.c
>> index b8cd509bc89..039a32f1874 100644
>> --- a/board/starfive/visionfive2/starfive_visionfive2.c
>> +++ b/board/starfive/visionfive2/starfive_visionfive2.c
>> @@ -17,14 +17,6 @@
>> DECLARE_GLOBAL_DATA_PTR;
>> #define JH7110_L2_PREFETCHER_BASE_ADDR               0x2030000
>> #define JH7110_L2_PREFETCHER_HART_OFFSET     0x2000
>> -#define FDTFILE_MILK_V_MARS \
>> -    "starfive/jh7110-milkv-mars.dtb"
>> -#define FDTFILE_VISIONFIVE2_1_2A \
>> -    "starfive/jh7110-starfive-visionfive-2-v1.2a.dtb"
>> -#define FDTFILE_VISIONFIVE2_1_3B \
>> -    "starfive/jh7110-starfive-visionfive-2-v1.3b.dtb"
>> -#define FDTFILE_PINE64_STAR64 \
>> -    "starfive/jh7110-pine64-star64.dtb"
>>
>> /* enable U74-mc hart1~hart4 prefetcher */
>> static void enable_prefetcher(void)
>> @@ -45,51 +37,6 @@ static void enable_prefetcher(void)
>>      }
>> }
>>
>> -/**
>> - * set_fdtfile() - set the $fdtfile variable based on the board revision
>> - */
>> -static void set_fdtfile(void)
>> -{
>> -    u8 version;
>> -    const char *fdtfile;
>> -    const char *product_id;
>> -
>> -    fdtfile = env_get("fdtfile");
>> -    if (fdtfile)
>> -            return;
>> -
>> -    product_id = get_product_id_from_eeprom();
>> -    if (!product_id) {
>> -            log_err("Can't read EEPROM\n");
>> -            return;
>> -    }
>> -    if (!strncmp(product_id, "MARS", 4)) {
>> -            fdtfile = FDTFILE_MILK_V_MARS;
>> -    } else if (!strncmp(product_id, "VF7110", 6)) {
>> -            version = get_pcb_revision_from_eeprom();
>> -
>> -            switch (version) {
>> -            case 'a':
>> -            case 'A':
>> -                    fdtfile = FDTFILE_VISIONFIVE2_1_2A;
>> -                    break;
>> -
>> -            case 'b':
>> -            case 'B':
>> -            default:
>> -                    fdtfile = FDTFILE_VISIONFIVE2_1_3B;
>> -                    break;
>> -            }
>> -    } else if (!strncmp(product_id, "STAR64", 6)) {
>> -            fdtfile = FDTFILE_PINE64_STAR64;
>> -    } else {
>> -            log_err("Unknown product\n");
>> -            return;
>> -    }
>> -
>> -    env_set("fdtfile", fdtfile);
>> -}
>> -
>> int board_init(void)
>> {
>>      enable_caches();
>> @@ -98,14 +45,6 @@ int board_init(void)
>>      return 0;
>> }
>>
>> -int board_late_init(void)
>> -{
>> -    if (CONFIG_IS_ENABLED(ID_EEPROM))
>> -            set_fdtfile();
>> -
>> -    return 0;
>> -}
>> -
>> int board_fdt_blob_setup(void **fdtp)
>> {
>>      if (gd->arch.firmware_fdt_addr) {
> 

Reply via email to