Message ID | 20220722160655.3904213-8-foss+uboot@0leil.net |
---|---|
State | Superseded |
Delegated to: | Kever Yang |
Headers | show |
Series | Puma RK3399 migration to TPL and numerous fixes | expand |
Hi Quentin, On 2022/7/23 00:06, Quentin Schulz wrote: > From: Quentin Schulz <quentin.schulz@theobroma-systems.com> > > Chances are when one boots U-Boot proper from a given storage medium, > they want the same medium to be used to load and store the environment. > > This basically allows to have completely separate U-Boot (TPL/SPL/U-Boot > proper/environment) per storage medium which is convenient when working > with recovery from SD-Card as one would just need to insert a properly > configured SD-Card into the device to have access to their whole debug > setup. > > No fallback mechanism is provided as to not dirty other storage medium > environment by mistake. However, since arch_env_get_location() is called > by env_init() which is part of the pre-relocation process, a valid, > non-ENVL_UNKNOWN, value shall be returned otherwise the relocation fails > with the following message: > initcall sequence 00000000002866c0 failed at call 0000000000256b34 (err=-19) > > This valid, non-ENVL_UNKNOWN, value is ENVL_NOWHERE which requires to > always select CONFIG_ENV_IS_NOWHERE otherwise this work-around does not > work. > > Cc: Quentin Schulz <foss+uboot@0leil.net> > Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com> > --- > > Depends on > https://lore.kernel.org/u-boot/20220715151552.953654-1-foss+uboot@0leil.net/ > https://lore.kernel.org/u-boot/20220715151552.953654-2-foss+uboot@0leil.net/ > > .../puma_rk3399/puma-rk3399.c | 37 +++++++++++++++++++ > configs/puma-rk3399_defconfig | 1 + > 2 files changed, 38 insertions(+) > > diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c b/board/theobroma-systems/puma_rk3399/puma-rk3399.c > index 5e5e58c88e..7ef4bac24b 100644 > --- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c > +++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c > @@ -6,6 +6,7 @@ > #include <common.h> > #include <dm.h> > #include <env.h> > +#include <env_internal.h> > #include <init.h> > #include <log.h> > #include <misc.h> > @@ -135,6 +136,42 @@ int mmc_get_env_dev(void) > return CONFIG_SYS_MMC_ENV_DEV; > } > > +#if !IS_ENABLED(CONFIG_ENV_IS_NOWHERE) > +#error Please enable CONFIG_ENV_IS_NOWHERE > +#endif > + > +enum env_location arch_env_get_location(enum env_operation op, int prio) > +{ > + const char *boot_device = > + ofnode_read_chosen_string("u-boot,spl-boot-device"); > + > + if (prio > 0) > + return ENVL_UNKNOWN; > + > + if (!boot_device) { > + debug("%s: /chosen/u-boot,spl-boot-device not set\n", > + __func__); > + return ENVL_NOWHERE; > + } > + > + debug("%s: booted from %s\n", __func__, boot_device); > + > + if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH) && > + !strcmp(boot_device, "/spi@ff1d0000/flash@0")) > + return ENVL_SPI_FLASH; > + > + if (IS_ENABLED(CONFIG_ENV_IS_IN_MMC) && > + (!strcmp(boot_device, "/mmc@fe320000") || > + !strcmp(boot_device, "/mmc@fe330000"))) > + return ENVL_MMC; > + > + printf("%s: No environment available: booted from %s but U-Boot " > + "config does not allow loading environment from it.", > + __func__, boot_device); > + > + return ENVL_NOWHERE; > +} > + > int misc_init_r(void) > { > const u32 cpuid_offset = 0x7; > diff --git a/configs/puma-rk3399_defconfig b/configs/puma-rk3399_defconfig > index 87d7e4f57c..e218532d70 100644 > --- a/configs/puma-rk3399_defconfig > +++ b/configs/puma-rk3399_defconfig > @@ -44,6 +44,7 @@ CONFIG_SPL_OF_CONTROL=y > CONFIG_OF_LIVE=y > CONFIG_OF_SPL_REMOVE_PROPS="interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" > CONFIG_ENV_OVERWRITE=y > +CONFIG_ENV_IS_NOWHERE=y This option is conflict with CONFIG_ENV_IS_IN_MMC, please check again where should be this board get the env. Thanks, - Kever > CONFIG_ENV_IS_IN_MMC=y > CONFIG_ENV_IS_IN_SPI_FLASH=y > CONFIG_ENV_SPI_MAX_HZ=50000000
Hi Kever On 9/1/22 15:03, Kever Yang wrote: > Hi Quentin, > > On 2022/7/23 00:06, Quentin Schulz wrote: >> From: Quentin Schulz <quentin.schulz@theobroma-systems.com> >> >> Chances are when one boots U-Boot proper from a given storage medium, >> they want the same medium to be used to load and store the environment. >> >> This basically allows to have completely separate U-Boot (TPL/SPL/U-Boot >> proper/environment) per storage medium which is convenient when working >> with recovery from SD-Card as one would just need to insert a properly >> configured SD-Card into the device to have access to their whole debug >> setup. >> >> No fallback mechanism is provided as to not dirty other storage medium >> environment by mistake. However, since arch_env_get_location() is called >> by env_init() which is part of the pre-relocation process, a valid, >> non-ENVL_UNKNOWN, value shall be returned otherwise the relocation fails >> with the following message: >> initcall sequence 00000000002866c0 failed at call 0000000000256b34 >> (err=-19) >> >> This valid, non-ENVL_UNKNOWN, value is ENVL_NOWHERE which requires to >> always select CONFIG_ENV_IS_NOWHERE otherwise this work-around does not >> work. >> >> Cc: Quentin Schulz <foss+uboot@0leil.net> >> Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com> >> --- >> >> Depends on >> https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.org_u-2Dboot_20220715151552.953654-2D1-2Dfoss-2Buboot-400leil.net_&d=DwIDaQ&c=_sEr5x9kUWhuk4_nFwjJtA&r=LYjLexDn7rXIzVmkNPvw5ymA1XTSqHGq8yBP6m6qZZ4njZguQhZhkI_-172IIy1t&m=TZndtGz1ePTd2Il6YcEjqzo9oXv73RCWHIRVSiFVsnp2OzyCJEDzZ2KPz56AcWdn&s=wgEMbr3EjeCtvcWU_UoXqNOwQulaVN-0Qb2yL2ysaOs&e= https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.org_u-2Dboot_20220715151552.953654-2D2-2Dfoss-2Buboot-400leil.net_&d=DwIDaQ&c=_sEr5x9kUWhuk4_nFwjJtA&r=LYjLexDn7rXIzVmkNPvw5ymA1XTSqHGq8yBP6m6qZZ4njZguQhZhkI_-172IIy1t&m=TZndtGz1ePTd2Il6YcEjqzo9oXv73RCWHIRVSiFVsnp2OzyCJEDzZ2KPz56AcWdn&s=PKwYBMB7r8ekIPV1ZG7xkj7vF60YNFlYXQRrvaVgJR8&e= >> .../puma_rk3399/puma-rk3399.c | 37 +++++++++++++++++++ >> configs/puma-rk3399_defconfig | 1 + >> 2 files changed, 38 insertions(+) >> >> diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c >> b/board/theobroma-systems/puma_rk3399/puma-rk3399.c >> index 5e5e58c88e..7ef4bac24b 100644 >> --- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c >> +++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c >> @@ -6,6 +6,7 @@ >> #include <common.h> >> #include <dm.h> >> #include <env.h> >> +#include <env_internal.h> >> #include <init.h> >> #include <log.h> >> #include <misc.h> >> @@ -135,6 +136,42 @@ int mmc_get_env_dev(void) >> return CONFIG_SYS_MMC_ENV_DEV; >> } >> +#if !IS_ENABLED(CONFIG_ENV_IS_NOWHERE) >> +#error Please enable CONFIG_ENV_IS_NOWHERE >> +#endif >> + >> +enum env_location arch_env_get_location(enum env_operation op, int prio) >> +{ >> + const char *boot_device = >> + ofnode_read_chosen_string("u-boot,spl-boot-device"); >> + >> + if (prio > 0) >> + return ENVL_UNKNOWN; >> + >> + if (!boot_device) { >> + debug("%s: /chosen/u-boot,spl-boot-device not set\n", >> + __func__); >> + return ENVL_NOWHERE; >> + } >> + >> + debug("%s: booted from %s\n", __func__, boot_device); >> + >> + if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH) && >> + !strcmp(boot_device, "/spi@ff1d0000/flash@0")) >> + return ENVL_SPI_FLASH; >> + >> + if (IS_ENABLED(CONFIG_ENV_IS_IN_MMC) && >> + (!strcmp(boot_device, "/mmc@fe320000") || >> + !strcmp(boot_device, "/mmc@fe330000"))) >> + return ENVL_MMC; >> + >> + printf("%s: No environment available: booted from %s but U-Boot " >> + "config does not allow loading environment from it.", >> + __func__, boot_device); >> + >> + return ENVL_NOWHERE; >> +} >> + >> int misc_init_r(void) >> { >> const u32 cpuid_offset = 0x7; >> diff --git a/configs/puma-rk3399_defconfig >> b/configs/puma-rk3399_defconfig >> index 87d7e4f57c..e218532d70 100644 >> --- a/configs/puma-rk3399_defconfig >> +++ b/configs/puma-rk3399_defconfig >> @@ -44,6 +44,7 @@ CONFIG_SPL_OF_CONTROL=y >> CONFIG_OF_LIVE=y >> CONFIG_OF_SPL_REMOVE_PROPS="interrupt-parent assigned-clocks >> assigned-clock-rates assigned-clock-parents" >> CONFIG_ENV_OVERWRITE=y >> +CONFIG_ENV_IS_NOWHERE=y > > This option is conflict with CONFIG_ENV_IS_IN_MMC, please check again > where should be this board get the env. > I created the defconfig with make savedefconfig, so if you're talking about KConfig conflict, that is incorrect, there is no conflict. If you're talking about something else, please clarify because I don't see the issue right now. Cheers, Quentin
Hi Quentin, The Kconfig from env/Kconfig config ENV_IS_NOWHERE bool "Environment is not stored" default y if !ENV_IS_IN_EEPROM && !ENV_IS_IN_EXT4 && \ !ENV_IS_IN_FAT && !ENV_IS_IN_FLASH && \ !ENV_IS_IN_MMC && !ENV_IS_IN_NAND && \ !ENV_IS_IN_NVRAM && !ENV_IS_IN_ONENAND && \ !ENV_IS_IN_REMOTE && !ENV_IS_IN_SPI_FLASH && \ !ENV_IS_IN_UBI I think the logic is the env parameter is stored on some kind of storage, or NOWHERE. And what you want to do is to load from the same medium as SPL boot device(location of U-Boot proper), this could not be NOWHERE. Thanks, - Kever On 2022/9/1 21:13, Quentin Schulz wrote: > Hi Kever > > On 9/1/22 15:03, Kever Yang wrote: >> Hi Quentin, >> >> On 2022/7/23 00:06, Quentin Schulz wrote: >>> From: Quentin Schulz <quentin.schulz@theobroma-systems.com> >>> >>> Chances are when one boots U-Boot proper from a given storage medium, >>> they want the same medium to be used to load and store the environment. >>> >>> This basically allows to have completely separate U-Boot >>> (TPL/SPL/U-Boot >>> proper/environment) per storage medium which is convenient when working >>> with recovery from SD-Card as one would just need to insert a properly >>> configured SD-Card into the device to have access to their whole debug >>> setup. >>> >>> No fallback mechanism is provided as to not dirty other storage medium >>> environment by mistake. However, since arch_env_get_location() is >>> called >>> by env_init() which is part of the pre-relocation process, a valid, >>> non-ENVL_UNKNOWN, value shall be returned otherwise the relocation >>> fails >>> with the following message: >>> initcall sequence 00000000002866c0 failed at call 0000000000256b34 >>> (err=-19) >>> >>> This valid, non-ENVL_UNKNOWN, value is ENVL_NOWHERE which requires to >>> always select CONFIG_ENV_IS_NOWHERE otherwise this work-around does not >>> work. >>> >>> Cc: Quentin Schulz <foss+uboot@0leil.net> >>> Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com> >>> --- >>> >>> Depends on >>> https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.org_u-2Dboot_20220715151552.953654-2D1-2Dfoss-2Buboot-400leil.net_&d=DwIDaQ&c=_sEr5x9kUWhuk4_nFwjJtA&r=LYjLexDn7rXIzVmkNPvw5ymA1XTSqHGq8yBP6m6qZZ4njZguQhZhkI_-172IIy1t&m=TZndtGz1ePTd2Il6YcEjqzo9oXv73RCWHIRVSiFVsnp2OzyCJEDzZ2KPz56AcWdn&s=wgEMbr3EjeCtvcWU_UoXqNOwQulaVN-0Qb2yL2ysaOs&e= >>> https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.org_u-2Dboot_20220715151552.953654-2D2-2Dfoss-2Buboot-400leil.net_&d=DwIDaQ&c=_sEr5x9kUWhuk4_nFwjJtA&r=LYjLexDn7rXIzVmkNPvw5ymA1XTSqHGq8yBP6m6qZZ4njZguQhZhkI_-172IIy1t&m=TZndtGz1ePTd2Il6YcEjqzo9oXv73RCWHIRVSiFVsnp2OzyCJEDzZ2KPz56AcWdn&s=PKwYBMB7r8ekIPV1ZG7xkj7vF60YNFlYXQRrvaVgJR8&e= >>> >>> .../puma_rk3399/puma-rk3399.c | 37 >>> +++++++++++++++++++ >>> configs/puma-rk3399_defconfig | 1 + >>> 2 files changed, 38 insertions(+) >>> >>> diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>> b/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>> index 5e5e58c88e..7ef4bac24b 100644 >>> --- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>> +++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>> @@ -6,6 +6,7 @@ >>> #include <common.h> >>> #include <dm.h> >>> #include <env.h> >>> +#include <env_internal.h> >>> #include <init.h> >>> #include <log.h> >>> #include <misc.h> >>> @@ -135,6 +136,42 @@ int mmc_get_env_dev(void) >>> return CONFIG_SYS_MMC_ENV_DEV; >>> } >>> +#if !IS_ENABLED(CONFIG_ENV_IS_NOWHERE) >>> +#error Please enable CONFIG_ENV_IS_NOWHERE >>> +#endif >>> + >>> +enum env_location arch_env_get_location(enum env_operation op, int >>> prio) >>> +{ >>> + const char *boot_device = >>> + ofnode_read_chosen_string("u-boot,spl-boot-device"); >>> + >>> + if (prio > 0) >>> + return ENVL_UNKNOWN; >>> + >>> + if (!boot_device) { >>> + debug("%s: /chosen/u-boot,spl-boot-device not set\n", >>> + __func__); >>> + return ENVL_NOWHERE; >>> + } >>> + >>> + debug("%s: booted from %s\n", __func__, boot_device); >>> + >>> + if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH) && >>> + !strcmp(boot_device, "/spi@ff1d0000/flash@0")) >>> + return ENVL_SPI_FLASH; >>> + >>> + if (IS_ENABLED(CONFIG_ENV_IS_IN_MMC) && >>> + (!strcmp(boot_device, "/mmc@fe320000") || >>> + !strcmp(boot_device, "/mmc@fe330000"))) >>> + return ENVL_MMC; >>> + >>> + printf("%s: No environment available: booted from %s but U-Boot " >>> + "config does not allow loading environment from it.", >>> + __func__, boot_device); >>> + >>> + return ENVL_NOWHERE; >>> +} >>> + >>> int misc_init_r(void) >>> { >>> const u32 cpuid_offset = 0x7; >>> diff --git a/configs/puma-rk3399_defconfig >>> b/configs/puma-rk3399_defconfig >>> index 87d7e4f57c..e218532d70 100644 >>> --- a/configs/puma-rk3399_defconfig >>> +++ b/configs/puma-rk3399_defconfig >>> @@ -44,6 +44,7 @@ CONFIG_SPL_OF_CONTROL=y >>> CONFIG_OF_LIVE=y >>> CONFIG_OF_SPL_REMOVE_PROPS="interrupt-parent assigned-clocks >>> assigned-clock-rates assigned-clock-parents" >>> CONFIG_ENV_OVERWRITE=y >>> +CONFIG_ENV_IS_NOWHERE=y >> >> This option is conflict with CONFIG_ENV_IS_IN_MMC, please check >> again where should be this board get the env. >> > > I created the defconfig with make savedefconfig, so if you're talking > about KConfig conflict, that is incorrect, there is no conflict. > > If you're talking about something else, please clarify because I don't > see the issue right now. > > Cheers, > Quentin
Hi Kever, On 9/4/22 13:49, Kever Yang wrote: > Hi Quentin, > > The Kconfig from env/Kconfig > > config ENV_IS_NOWHERE > bool "Environment is not stored" > default y if !ENV_IS_IN_EEPROM && !ENV_IS_IN_EXT4 && \ > !ENV_IS_IN_FAT && !ENV_IS_IN_FLASH && \ > !ENV_IS_IN_MMC && !ENV_IS_IN_NAND && \ > !ENV_IS_IN_NVRAM && !ENV_IS_IN_ONENAND && \ > !ENV_IS_IN_REMOTE && !ENV_IS_IN_SPI_FLASH && \ > !ENV_IS_IN_UBI > > I think the logic is the env parameter is stored on some kind of > storage, or NOWHERE. > It's *default* to yes if none is defined. It's not a requirement. > And what you want to do is to load from the same medium as SPL boot > device(location of U-Boot proper), > > this could not be NOWHERE. > This can be nowhere in case the proper config option is not selected. E.g. we're booting from SPI-NOR but the ENV_IS_IN_SPI_FLASH is not set. How does one handle this scenario? Since we don't want fallbacks, it needs to be "nowhere". What you're suggesting is to let the user run a broken build and have it cryptically crash with the following error: initcall sequence 00000000002866c0 failed at call 0000000000256b34 (err=-19) Instead, I suggest to more gracefully error out at runtime by letting the user know that the option is not compiled in but U-Boot is still usable. If you have another way to forbid fallbacks but not crash U-Boot in case the option is not selected, let me know. Cheers, Quentin > > Thanks, > > - Kever > > On 2022/9/1 21:13, Quentin Schulz wrote: >> Hi Kever >> >> On 9/1/22 15:03, Kever Yang wrote: >>> Hi Quentin, >>> >>> On 2022/7/23 00:06, Quentin Schulz wrote: >>>> From: Quentin Schulz <quentin.schulz@theobroma-systems.com> >>>> >>>> Chances are when one boots U-Boot proper from a given storage medium, >>>> they want the same medium to be used to load and store the environment. >>>> >>>> This basically allows to have completely separate U-Boot >>>> (TPL/SPL/U-Boot >>>> proper/environment) per storage medium which is convenient when working >>>> with recovery from SD-Card as one would just need to insert a properly >>>> configured SD-Card into the device to have access to their whole debug >>>> setup. >>>> >>>> No fallback mechanism is provided as to not dirty other storage medium >>>> environment by mistake. However, since arch_env_get_location() is >>>> called >>>> by env_init() which is part of the pre-relocation process, a valid, >>>> non-ENVL_UNKNOWN, value shall be returned otherwise the relocation >>>> fails >>>> with the following message: >>>> initcall sequence 00000000002866c0 failed at call 0000000000256b34 >>>> (err=-19) >>>> >>>> This valid, non-ENVL_UNKNOWN, value is ENVL_NOWHERE which requires to >>>> always select CONFIG_ENV_IS_NOWHERE otherwise this work-around does not >>>> work. >>>> >>>> Cc: Quentin Schulz <foss+uboot@0leil.net> >>>> Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com> >>>> --- >>>> >>>> Depends on >>>> https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.org_u-2Dboot_20220715151552.953654-2D1-2Dfoss-2Buboot-400leil.net_&d=DwIDaQ&c=_sEr5x9kUWhuk4_nFwjJtA&r=LYjLexDn7rXIzVmkNPvw5ymA1XTSqHGq8yBP6m6qZZ4njZguQhZhkI_-172IIy1t&m=TZndtGz1ePTd2Il6YcEjqzo9oXv73RCWHIRVSiFVsnp2OzyCJEDzZ2KPz56AcWdn&s=wgEMbr3EjeCtvcWU_UoXqNOwQulaVN-0Qb2yL2ysaOs&e= https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.org_u-2Dboot_20220715151552.953654-2D2-2Dfoss-2Buboot-400leil.net_&d=DwIDaQ&c=_sEr5x9kUWhuk4_nFwjJtA&r=LYjLexDn7rXIzVmkNPvw5ymA1XTSqHGq8yBP6m6qZZ4njZguQhZhkI_-172IIy1t&m=TZndtGz1ePTd2Il6YcEjqzo9oXv73RCWHIRVSiFVsnp2OzyCJEDzZ2KPz56AcWdn&s=PKwYBMB7r8ekIPV1ZG7xkj7vF60YNFlYXQRrvaVgJR8&e= >>>> .../puma_rk3399/puma-rk3399.c | 37 >>>> +++++++++++++++++++ >>>> configs/puma-rk3399_defconfig | 1 + >>>> 2 files changed, 38 insertions(+) >>>> >>>> diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>>> b/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>>> index 5e5e58c88e..7ef4bac24b 100644 >>>> --- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>>> +++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>>> @@ -6,6 +6,7 @@ >>>> #include <common.h> >>>> #include <dm.h> >>>> #include <env.h> >>>> +#include <env_internal.h> >>>> #include <init.h> >>>> #include <log.h> >>>> #include <misc.h> >>>> @@ -135,6 +136,42 @@ int mmc_get_env_dev(void) >>>> return CONFIG_SYS_MMC_ENV_DEV; >>>> } >>>> +#if !IS_ENABLED(CONFIG_ENV_IS_NOWHERE) >>>> +#error Please enable CONFIG_ENV_IS_NOWHERE >>>> +#endif >>>> + >>>> +enum env_location arch_env_get_location(enum env_operation op, int >>>> prio) >>>> +{ >>>> + const char *boot_device = >>>> + ofnode_read_chosen_string("u-boot,spl-boot-device"); >>>> + >>>> + if (prio > 0) >>>> + return ENVL_UNKNOWN; >>>> + >>>> + if (!boot_device) { >>>> + debug("%s: /chosen/u-boot,spl-boot-device not set\n", >>>> + __func__); >>>> + return ENVL_NOWHERE; >>>> + } >>>> + >>>> + debug("%s: booted from %s\n", __func__, boot_device); >>>> + >>>> + if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH) && >>>> + !strcmp(boot_device, "/spi@ff1d0000/flash@0")) >>>> + return ENVL_SPI_FLASH; >>>> + >>>> + if (IS_ENABLED(CONFIG_ENV_IS_IN_MMC) && >>>> + (!strcmp(boot_device, "/mmc@fe320000") || >>>> + !strcmp(boot_device, "/mmc@fe330000"))) >>>> + return ENVL_MMC; >>>> + >>>> + printf("%s: No environment available: booted from %s but U-Boot " >>>> + "config does not allow loading environment from it.", >>>> + __func__, boot_device); >>>> + >>>> + return ENVL_NOWHERE; >>>> +} >>>> + >>>> int misc_init_r(void) >>>> { >>>> const u32 cpuid_offset = 0x7; >>>> diff --git a/configs/puma-rk3399_defconfig >>>> b/configs/puma-rk3399_defconfig >>>> index 87d7e4f57c..e218532d70 100644 >>>> --- a/configs/puma-rk3399_defconfig >>>> +++ b/configs/puma-rk3399_defconfig >>>> @@ -44,6 +44,7 @@ CONFIG_SPL_OF_CONTROL=y >>>> CONFIG_OF_LIVE=y >>>> CONFIG_OF_SPL_REMOVE_PROPS="interrupt-parent assigned-clocks >>>> assigned-clock-rates assigned-clock-parents" >>>> CONFIG_ENV_OVERWRITE=y >>>> +CONFIG_ENV_IS_NOWHERE=y >>> >>> This option is conflict with CONFIG_ENV_IS_IN_MMC, please check >>> again where should be this board get the env. >>> >> >> I created the defconfig with make savedefconfig, so if you're talking >> about KConfig conflict, that is incorrect, there is no conflict. >> >> If you're talking about something else, please clarify because I don't >> see the issue right now. >> >> Cheers, >> Quentin
Hi, ST Restricted > -----Original Message----- > From: U-Boot <u-boot-bounces@lists.denx.de> On Behalf Of Quentin Schulz > Sent: mardi 6 septembre 2022 11:23 > To: Kever Yang <kever.yang@rock-chips.com>; Quentin Schulz > <foss+uboot@0leil.net> > Cc: sjg@chromium.org; philipp.tomsich@vrull.eu; klaus.goger@theobroma- > systems.com; knaerzche@gmail.com; u-boot@lists.denx.de > Subject: Re: [PATCH 07/12] rockchip: puma-rk3399: load environment from same > medium as one used to load U-Boot proper > > Hi Kever, > > On 9/4/22 13:49, Kever Yang wrote: > > Hi Quentin, > > > > The Kconfig from env/Kconfig > > > > config ENV_IS_NOWHERE > > bool "Environment is not stored" > > default y if !ENV_IS_IN_EEPROM && !ENV_IS_IN_EXT4 && \ > > !ENV_IS_IN_FAT && !ENV_IS_IN_FLASH && \ > > !ENV_IS_IN_MMC && !ENV_IS_IN_NAND && \ > > !ENV_IS_IN_NVRAM && !ENV_IS_IN_ONENAND && \ > > !ENV_IS_IN_REMOTE && !ENV_IS_IN_SPI_FLASH && \ > > !ENV_IS_IN_UBI > > > > I think the logic is the env parameter is stored on some kind of > > storage, or NOWHERE. > > > > It's *default* to yes if none is defined. It's not a requirement. > > > And what you want to do is to load from the same medium as SPL boot > > device(location of U-Boot proper), > > > > this could not be NOWHERE. > > > > This can be nowhere in case the proper config option is not selected. > E.g. we're booting from SPI-NOR but the ENV_IS_IN_SPI_FLASH is not set. > How does one handle this scenario? Since we don't want fallbacks, it needs to be > "nowhere". What you're suggesting is to let the user run a broken build and have it > cryptically crash with the following error: > > initcall sequence 00000000002866c0 failed at call 0000000000256b34 (err=-19) > > Instead, I suggest to more gracefully error out at runtime by letting the user know > that the option is not compiled in but U-Boot is still usable. > > If you have another way to forbid fallbacks but not crash U-Boot in case the option > is not selected, let me know. > For information : It is exactly that I do to stm32mp15 platform See board/st/stm32mp1/stm32mp1.c::env_get_location() ENV_IS_NOWHERE = use the default environment, embedded in U-Boot and env It is the fallback if environment not activated ENV_IS_IN_* for the boot device, even it is not the case by default in stm32mp15_defconfig. And it is why , I change Kconfig to allow activation of any ENV_IS_IN_* and ENV_IS_NOWHERE Patrick > Cheers, > Quentin > > > > Thanks, > > > > - Kever > > > > On 2022/9/1 21:13, Quentin Schulz wrote: > >> Hi Kever > >> > >> On 9/1/22 15:03, Kever Yang wrote: > >>> Hi Quentin, > >>> > >>> On 2022/7/23 00:06, Quentin Schulz wrote: > >>>> From: Quentin Schulz <quentin.schulz@theobroma-systems.com> > >>>> > >>>> Chances are when one boots U-Boot proper from a given storage > >>>> medium, they want the same medium to be used to load and store the > environment. > >>>> > >>>> This basically allows to have completely separate U-Boot > >>>> (TPL/SPL/U-Boot > >>>> proper/environment) per storage medium which is convenient when > >>>> working with recovery from SD-Card as one would just need to insert > >>>> a properly configured SD-Card into the device to have access to > >>>> their whole debug setup. > >>>> > >>>> No fallback mechanism is provided as to not dirty other storage > >>>> medium environment by mistake. However, since > >>>> arch_env_get_location() is called by env_init() which is part of > >>>> the pre-relocation process, a valid, non-ENVL_UNKNOWN, value shall > >>>> be returned otherwise the relocation fails with the following > >>>> message: > >>>> initcall sequence 00000000002866c0 failed at call 0000000000256b34 > >>>> (err=-19) > >>>> > >>>> This valid, non-ENVL_UNKNOWN, value is ENVL_NOWHERE which > requires > >>>> to always select CONFIG_ENV_IS_NOWHERE otherwise this work-around > >>>> does not work. > >>>> > >>>> Cc: Quentin Schulz <foss+uboot@0leil.net> > >>>> Signed-off-by: Quentin Schulz > >>>> <quentin.schulz@theobroma-systems.com> > >>>> --- > >>>> > >>>> Depends on > >>>> https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.or > >>>> g_u-2Dboot_20220715151552.953654-2D1-2Dfoss-2Buboot-400leil.net_&d= > >>>> > DwIDaQ&c=_sEr5x9kUWhuk4_nFwjJtA&r=LYjLexDn7rXIzVmkNPvw5ymA1XTSq > HGq8 > >>>> yBP6m6qZZ4njZguQhZhkI_- > 172IIy1t&m=TZndtGz1ePTd2Il6YcEjqzo9oXv73RCWH > >>>> > IRVSiFVsnp2OzyCJEDzZ2KPz56AcWdn&s=wgEMbr3EjeCtvcWU_UoXqNOwQula > VN-0Q > >>>> b2yL2ysaOs&e= > >>>> https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.or > >>>> g_u-2Dboot_20220715151552.953654-2D2-2Dfoss-2Buboot-400leil.net_&d= > >>>> > DwIDaQ&c=_sEr5x9kUWhuk4_nFwjJtA&r=LYjLexDn7rXIzVmkNPvw5ymA1XTSq > HGq8 > >>>> yBP6m6qZZ4njZguQhZhkI_- > 172IIy1t&m=TZndtGz1ePTd2Il6YcEjqzo9oXv73RCWH > >>>> > IRVSiFVsnp2OzyCJEDzZ2KPz56AcWdn&s=PKwYBMB7r8ekIPV1ZG7xkj7vF60YN > FlYX > >>>> QRrvaVgJR8&e= > >>>> .../puma_rk3399/puma-rk3399.c | 37 > >>>> +++++++++++++++++++ > >>>> configs/puma-rk3399_defconfig | 1 + > >>>> 2 files changed, 38 insertions(+) > >>>> > >>>> diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c > >>>> b/board/theobroma-systems/puma_rk3399/puma-rk3399.c > >>>> index 5e5e58c88e..7ef4bac24b 100644 > >>>> --- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c > >>>> +++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c > >>>> @@ -6,6 +6,7 @@ > >>>> #include <common.h> > >>>> #include <dm.h> > >>>> #include <env.h> > >>>> +#include <env_internal.h> > >>>> #include <init.h> > >>>> #include <log.h> > >>>> #include <misc.h> > >>>> @@ -135,6 +136,42 @@ int mmc_get_env_dev(void) > >>>> return CONFIG_SYS_MMC_ENV_DEV; > >>>> } > >>>> +#if !IS_ENABLED(CONFIG_ENV_IS_NOWHERE) > >>>> +#error Please enable CONFIG_ENV_IS_NOWHERE #endif > >>>> + > >>>> +enum env_location arch_env_get_location(enum env_operation op, int > >>>> prio) > >>>> +{ > >>>> + const char *boot_device = > >>>> + ofnode_read_chosen_string("u-boot,spl-boot-device"); > >>>> + > >>>> + if (prio > 0) > >>>> + return ENVL_UNKNOWN; > >>>> + > >>>> + if (!boot_device) { > >>>> + debug("%s: /chosen/u-boot,spl-boot-device not set\n", > >>>> + __func__); > >>>> + return ENVL_NOWHERE; > >>>> + } > >>>> + > >>>> + debug("%s: booted from %s\n", __func__, boot_device); > >>>> + > >>>> + if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH) && > >>>> + !strcmp(boot_device, "/spi@ff1d0000/flash@0")) > >>>> + return ENVL_SPI_FLASH; > >>>> + > >>>> + if (IS_ENABLED(CONFIG_ENV_IS_IN_MMC) && > >>>> + (!strcmp(boot_device, "/mmc@fe320000") || > >>>> + !strcmp(boot_device, "/mmc@fe330000"))) > >>>> + return ENVL_MMC; > >>>> + > >>>> + printf("%s: No environment available: booted from %s but U-Boot " > >>>> + "config does not allow loading environment from it.", > >>>> + __func__, boot_device); > >>>> + > >>>> + return ENVL_NOWHERE; > >>>> +} > >>>> + > >>>> int misc_init_r(void) > >>>> { > >>>> const u32 cpuid_offset = 0x7; diff --git > >>>> a/configs/puma-rk3399_defconfig b/configs/puma-rk3399_defconfig > >>>> index 87d7e4f57c..e218532d70 100644 > >>>> --- a/configs/puma-rk3399_defconfig > >>>> +++ b/configs/puma-rk3399_defconfig > >>>> @@ -44,6 +44,7 @@ CONFIG_SPL_OF_CONTROL=y > >>>> CONFIG_OF_LIVE=y > >>>> CONFIG_OF_SPL_REMOVE_PROPS="interrupt-parent assigned-clocks > >>>> assigned-clock-rates assigned-clock-parents" > >>>> CONFIG_ENV_OVERWRITE=y > >>>> +CONFIG_ENV_IS_NOWHERE=y > >>> > >>> This option is conflict with CONFIG_ENV_IS_IN_MMC, please check > >>> again where should be this board get the env. > >>> > >> > >> I created the defconfig with make savedefconfig, so if you're talking > >> about KConfig conflict, that is incorrect, there is no conflict. > >> > >> If you're talking about something else, please clarify because I > >> don't see the issue right now. > >> > >> Cheers, > >> Quentin
Hi Patrick, Quentin, Here is the definition about the ENV_IS_NOWHERE: config ENV_IS_NOWHERE bool "Environment is not stored" help Define this if you don't want to or can't have an environment stored on a storage medium. In this case the environemnt will still exist while U-Boot is running, but once U-Boot exits it will not be stored. U-Boot will therefore always start up with a default environment. Which means ENV_IS_NOWHERE is ALWAYS use default environment, but not stored on a storage medium. I think what you want is a new ENV_IS_ANYWHERE which not able to decide when the firmware is build but must be some where when the boot device is decided. Thanks, - Kever On 2022/9/14 17:17, patrick.delaunay@foss.st.com wrote: > Hi, > > > ST Restricted > >> -----Original Message----- >> From: U-Boot <u-boot-bounces@lists.denx.de> On Behalf Of Quentin Schulz >> Sent: mardi 6 septembre 2022 11:23 >> To: Kever Yang <kever.yang@rock-chips.com>; Quentin Schulz >> <foss+uboot@0leil.net> >> Cc: sjg@chromium.org; philipp.tomsich@vrull.eu; klaus.goger@theobroma- >> systems.com; knaerzche@gmail.com; u-boot@lists.denx.de >> Subject: Re: [PATCH 07/12] rockchip: puma-rk3399: load environment from same >> medium as one used to load U-Boot proper >> >> Hi Kever, >> >> On 9/4/22 13:49, Kever Yang wrote: >>> Hi Quentin, >>> >>> The Kconfig from env/Kconfig >>> >>> config ENV_IS_NOWHERE >>> bool "Environment is not stored" >>> default y if !ENV_IS_IN_EEPROM && !ENV_IS_IN_EXT4 && \ >>> !ENV_IS_IN_FAT && !ENV_IS_IN_FLASH && \ >>> !ENV_IS_IN_MMC && !ENV_IS_IN_NAND && \ >>> !ENV_IS_IN_NVRAM && !ENV_IS_IN_ONENAND && \ >>> !ENV_IS_IN_REMOTE && !ENV_IS_IN_SPI_FLASH && \ >>> !ENV_IS_IN_UBI >>> >>> I think the logic is the env parameter is stored on some kind of >>> storage, or NOWHERE. >>> >> It's *default* to yes if none is defined. It's not a requirement. >> >>> And what you want to do is to load from the same medium as SPL boot >>> device(location of U-Boot proper), >>> >>> this could not be NOWHERE. >>> >> This can be nowhere in case the proper config option is not selected. >> E.g. we're booting from SPI-NOR but the ENV_IS_IN_SPI_FLASH is not set. >> How does one handle this scenario? Since we don't want fallbacks, it needs to be >> "nowhere". What you're suggesting is to let the user run a broken build and have it >> cryptically crash with the following error: >> >> initcall sequence 00000000002866c0 failed at call 0000000000256b34 (err=-19) >> >> Instead, I suggest to more gracefully error out at runtime by letting the user know >> that the option is not compiled in but U-Boot is still usable. >> >> If you have another way to forbid fallbacks but not crash U-Boot in case the option >> is not selected, let me know. >> > For information : It is exactly that I do to stm32mp15 platform > > See board/st/stm32mp1/stm32mp1.c::env_get_location() > > ENV_IS_NOWHERE = use the default environment, embedded in U-Boot and env > > It is the fallback if environment not activated ENV_IS_IN_* for the boot device, even it is not the case by default in stm32mp15_defconfig. > > And it is why , I change Kconfig to allow activation of any ENV_IS_IN_* and ENV_IS_NOWHERE > > Patrick > >> Cheers, >> Quentin >>> Thanks, >>> >>> - Kever >>> >>> On 2022/9/1 21:13, Quentin Schulz wrote: >>>> Hi Kever >>>> >>>> On 9/1/22 15:03, Kever Yang wrote: >>>>> Hi Quentin, >>>>> >>>>> On 2022/7/23 00:06, Quentin Schulz wrote: >>>>>> From: Quentin Schulz <quentin.schulz@theobroma-systems.com> >>>>>> >>>>>> Chances are when one boots U-Boot proper from a given storage >>>>>> medium, they want the same medium to be used to load and store the >> environment. >>>>>> This basically allows to have completely separate U-Boot >>>>>> (TPL/SPL/U-Boot >>>>>> proper/environment) per storage medium which is convenient when >>>>>> working with recovery from SD-Card as one would just need to insert >>>>>> a properly configured SD-Card into the device to have access to >>>>>> their whole debug setup. >>>>>> >>>>>> No fallback mechanism is provided as to not dirty other storage >>>>>> medium environment by mistake. However, since >>>>>> arch_env_get_location() is called by env_init() which is part of >>>>>> the pre-relocation process, a valid, non-ENVL_UNKNOWN, value shall >>>>>> be returned otherwise the relocation fails with the following >>>>>> message: >>>>>> initcall sequence 00000000002866c0 failed at call 0000000000256b34 >>>>>> (err=-19) >>>>>> >>>>>> This valid, non-ENVL_UNKNOWN, value is ENVL_NOWHERE which >> requires >>>>>> to always select CONFIG_ENV_IS_NOWHERE otherwise this work-around >>>>>> does not work. >>>>>> >>>>>> Cc: Quentin Schulz <foss+uboot@0leil.net> >>>>>> Signed-off-by: Quentin Schulz >>>>>> <quentin.schulz@theobroma-systems.com> >>>>>> --- >>>>>> >>>>>> Depends on >>>>>> https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.or >>>>>> g_u-2Dboot_20220715151552.953654-2D1-2Dfoss-2Buboot-400leil.net_&d= >>>>>> >> DwIDaQ&c=_sEr5x9kUWhuk4_nFwjJtA&r=LYjLexDn7rXIzVmkNPvw5ymA1XTSq >> HGq8 >>>>>> yBP6m6qZZ4njZguQhZhkI_- >> 172IIy1t&m=TZndtGz1ePTd2Il6YcEjqzo9oXv73RCWH >> IRVSiFVsnp2OzyCJEDzZ2KPz56AcWdn&s=wgEMbr3EjeCtvcWU_UoXqNOwQula >> VN-0Q >>>>>> b2yL2ysaOs&e= >>>>>> https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.or >>>>>> g_u-2Dboot_20220715151552.953654-2D2-2Dfoss-2Buboot-400leil.net_&d= >>>>>> >> DwIDaQ&c=_sEr5x9kUWhuk4_nFwjJtA&r=LYjLexDn7rXIzVmkNPvw5ymA1XTSq >> HGq8 >>>>>> yBP6m6qZZ4njZguQhZhkI_- >> 172IIy1t&m=TZndtGz1ePTd2Il6YcEjqzo9oXv73RCWH >> IRVSiFVsnp2OzyCJEDzZ2KPz56AcWdn&s=PKwYBMB7r8ekIPV1ZG7xkj7vF60YN >> FlYX >>>>>> QRrvaVgJR8&e= >>>>>> .../puma_rk3399/puma-rk3399.c | 37 >>>>>> +++++++++++++++++++ >>>>>> configs/puma-rk3399_defconfig | 1 + >>>>>> 2 files changed, 38 insertions(+) >>>>>> >>>>>> diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>>>>> b/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>>>>> index 5e5e58c88e..7ef4bac24b 100644 >>>>>> --- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>>>>> +++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c >>>>>> @@ -6,6 +6,7 @@ >>>>>> #include <common.h> >>>>>> #include <dm.h> >>>>>> #include <env.h> >>>>>> +#include <env_internal.h> >>>>>> #include <init.h> >>>>>> #include <log.h> >>>>>> #include <misc.h> >>>>>> @@ -135,6 +136,42 @@ int mmc_get_env_dev(void) >>>>>> return CONFIG_SYS_MMC_ENV_DEV; >>>>>> } >>>>>> +#if !IS_ENABLED(CONFIG_ENV_IS_NOWHERE) >>>>>> +#error Please enable CONFIG_ENV_IS_NOWHERE #endif >>>>>> + >>>>>> +enum env_location arch_env_get_location(enum env_operation op, int >>>>>> prio) >>>>>> +{ >>>>>> + const char *boot_device = >>>>>> + ofnode_read_chosen_string("u-boot,spl-boot-device"); >>>>>> + >>>>>> + if (prio > 0) >>>>>> + return ENVL_UNKNOWN; >>>>>> + >>>>>> + if (!boot_device) { >>>>>> + debug("%s: /chosen/u-boot,spl-boot-device not set\n", >>>>>> + __func__); >>>>>> + return ENVL_NOWHERE; >>>>>> + } >>>>>> + >>>>>> + debug("%s: booted from %s\n", __func__, boot_device); >>>>>> + >>>>>> + if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH) && >>>>>> + !strcmp(boot_device, "/spi@ff1d0000/flash@0")) >>>>>> + return ENVL_SPI_FLASH; >>>>>> + >>>>>> + if (IS_ENABLED(CONFIG_ENV_IS_IN_MMC) && >>>>>> + (!strcmp(boot_device, "/mmc@fe320000") || >>>>>> + !strcmp(boot_device, "/mmc@fe330000"))) >>>>>> + return ENVL_MMC; >>>>>> + >>>>>> + printf("%s: No environment available: booted from %s but U-Boot " >>>>>> + "config does not allow loading environment from it.", >>>>>> + __func__, boot_device); >>>>>> + >>>>>> + return ENVL_NOWHERE; >>>>>> +} >>>>>> + >>>>>> int misc_init_r(void) >>>>>> { >>>>>> const u32 cpuid_offset = 0x7; diff --git >>>>>> a/configs/puma-rk3399_defconfig b/configs/puma-rk3399_defconfig >>>>>> index 87d7e4f57c..e218532d70 100644 >>>>>> --- a/configs/puma-rk3399_defconfig >>>>>> +++ b/configs/puma-rk3399_defconfig >>>>>> @@ -44,6 +44,7 @@ CONFIG_SPL_OF_CONTROL=y >>>>>> CONFIG_OF_LIVE=y >>>>>> CONFIG_OF_SPL_REMOVE_PROPS="interrupt-parent assigned-clocks >>>>>> assigned-clock-rates assigned-clock-parents" >>>>>> CONFIG_ENV_OVERWRITE=y >>>>>> +CONFIG_ENV_IS_NOWHERE=y >>>>> This option is conflict with CONFIG_ENV_IS_IN_MMC, please check >>>>> again where should be this board get the env. >>>>> >>>> I created the defconfig with make savedefconfig, so if you're talking >>>> about KConfig conflict, that is incorrect, there is no conflict. >>>> >>>> If you're talking about something else, please clarify because I >>>> don't see the issue right now. >>>> >>>> Cheers, >>>> Quentin
Hi Kever, On 9/20/22 14:28, Kever Yang wrote: > Hi Patrick, Quentin, > > > Here is the definition about the ENV_IS_NOWHERE: > > config ENV_IS_NOWHERE > bool "Environment is not stored" > help > Define this if you don't want to or can't have an environment > stored > on a storage medium. In this case the environemnt will still > exist > while U-Boot is running, but once U-Boot exits it will not be > stored. U-Boot will therefore always start up with a default > environment. > > > Which means ENV_IS_NOWHERE is ALWAYS use default environment, > > but not stored on a storage medium. > > I think what you want is a new ENV_IS_ANYWHERE which not able to > > decide when the firmware is build but must be some where when the boot > > device is decided. > I do not share the same understanding. For me, ENV_IS_NOWHERE means the environment is stored in RAM, once you exit U-Boot or reset the board, it's gone. That's my understanding of the code, I can concede that the help message of the Kconfig option is confusing. It's just another "kind" of environment to me. If the point was to ALWAYS use the default environment, one wouldn't be able to enable the option while other ENV_IS_IN_* are enabled. It is however possible. ENV_IS_ANYWHERE is not a correct name for what I want, because I specifically do NOT want to load from anywhere. I want to load from a specific medium, and if not possible have a fallback to avoid U-Boot cryptically crashing. Maybe we should rename ENV_IS_NOWHERE to ENV_IS_IN_RAM, maybe we could also stop crashing if there's no medium to load the environment from that is available, maybe we could rephrase the help text of the Kconfig option, but this is unrelated to this patch series. Finally, STM32, some i.MX and a couple of Xilinx based boards actually have ENV_IS_NOWHERE enabled at the same time as other ENV_IS_IN_* options, so I'm clearly not the first one to use it this way. Also, see arch/arm/mach-imx/imx8m/soc.c for an implementation of arch_env_get_location that requires ENV_IS_NOWHERE to work and has almost the same logic as I'm trying to implement. I'm trying to fix a non-booting board. This patch series is also only impacting the board I'm maintaining and nothing else. If merging the v2 of this patch series is really asking you something unimaginable, just drop this patch from the series, merge the rest and we'll continue arguing on a resend. Quentin
diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c b/board/theobroma-systems/puma_rk3399/puma-rk3399.c index 5e5e58c88e..7ef4bac24b 100644 --- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c +++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c @@ -6,6 +6,7 @@ #include <common.h> #include <dm.h> #include <env.h> +#include <env_internal.h> #include <init.h> #include <log.h> #include <misc.h> @@ -135,6 +136,42 @@ int mmc_get_env_dev(void) return CONFIG_SYS_MMC_ENV_DEV; } +#if !IS_ENABLED(CONFIG_ENV_IS_NOWHERE) +#error Please enable CONFIG_ENV_IS_NOWHERE +#endif + +enum env_location arch_env_get_location(enum env_operation op, int prio) +{ + const char *boot_device = + ofnode_read_chosen_string("u-boot,spl-boot-device"); + + if (prio > 0) + return ENVL_UNKNOWN; + + if (!boot_device) { + debug("%s: /chosen/u-boot,spl-boot-device not set\n", + __func__); + return ENVL_NOWHERE; + } + + debug("%s: booted from %s\n", __func__, boot_device); + + if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH) && + !strcmp(boot_device, "/spi@ff1d0000/flash@0")) + return ENVL_SPI_FLASH; + + if (IS_ENABLED(CONFIG_ENV_IS_IN_MMC) && + (!strcmp(boot_device, "/mmc@fe320000") || + !strcmp(boot_device, "/mmc@fe330000"))) + return ENVL_MMC; + + printf("%s: No environment available: booted from %s but U-Boot " + "config does not allow loading environment from it.", + __func__, boot_device); + + return ENVL_NOWHERE; +} + int misc_init_r(void) { const u32 cpuid_offset = 0x7; diff --git a/configs/puma-rk3399_defconfig b/configs/puma-rk3399_defconfig index 87d7e4f57c..e218532d70 100644 --- a/configs/puma-rk3399_defconfig +++ b/configs/puma-rk3399_defconfig @@ -44,6 +44,7 @@ CONFIG_SPL_OF_CONTROL=y CONFIG_OF_LIVE=y CONFIG_OF_SPL_REMOVE_PROPS="interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" CONFIG_ENV_OVERWRITE=y +CONFIG_ENV_IS_NOWHERE=y CONFIG_ENV_IS_IN_MMC=y CONFIG_ENV_IS_IN_SPI_FLASH=y CONFIG_ENV_SPI_MAX_HZ=50000000