From: Ben Wolsieffer <benwolsieffer@gmail.com>
To: Quentin Schulz <quentin.schulz@theobroma-systems.com>
Cc: u-boot@lists.denx.de,
"Matwey V. Kornilov" <matwey.kornilov@gmail.com>,
Tom Rini <trini@konsulko.com>, Simon Glass <sjg@chromium.org>,
Philipp Tomsich <philipp.tomsich@vrull.eu>,
Klaus Goger <klaus.goger@theobroma-systems.com>,
Kever Yang <kever.yang@rock-chips.com>,
Lin Huang <hl@rock-chips.com>,
Michael Trimarchi <michael@amarulasolutions.com>
Subject: Re: [PATCH] rockchip: load env from boot MMC device
Date: Thu, 7 Mar 2024 21:50:13 -0500 [thread overview]
Message-ID: <Zep85SM2zjiJaOGF@Dell-Inspiron-15> (raw)
In-Reply-To: <22deb119-2e55-4612-bcaa-c4f2acecd13d@theobroma-systems.com>
Hi Quentin,
On Mon, Feb 26, 2024 at 12:26:59PM +0100, Quentin Schulz wrote:
> Hi Ben,
>
> On 2/26/24 02:14, Ben Wolsieffer wrote:
> > [Some people who received this message don't often get email from benwolsieffer@gmail.com. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ]
> >
> > Currently, if the environment is stored on an MMC device, the device
> > number is hardcoded by CONFIG_SYS_MMC_ENV_DEV. This is problematic
> > because many boards can choose between booting from an SD card or a
> > removable eMMC. For example, the Rock64 defconfig sets
> > CONFIG_SYS_MMC_ENV_DEV=1, which corresponds to the SD card. If an eMMC
> > is used as the boot device and no SD card is installed, it is impossible
> > to save the environment.
> >
> > To avoid this problem, we can choose the environment MMC device based on
> > the boot device. The theobroma-systems boards already contain code to do
> > this, so this commit simply moves it to the common Rockchip board file,
> > with some refactoring. I also removed another implementation of
> > mmc_get_env_dev() from tinker_rk3288 that performed MMC boot device
> > detection by reading a bootrom register.
> >
> > This has been tested on a Rock64v2.
> >
> > Signed-off-by: Ben Wolsieffer <benwolsieffer@gmail.com>
> > ---
> > arch/arm/mach-rockchip/board.c | 28 ++++++++++++++++++
> > board/rockchip/tinker_rk3288/tinker-rk3288.c | 12 --------
> > board/theobroma-systems/common/common.c | 30 --------------------
> > 3 files changed, 28 insertions(+), 42 deletions(-)
> >
> > diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c
> > index 2620530e03..04db809e97 100644
> > --- a/arch/arm/mach-rockchip/board.c
> > +++ b/arch/arm/mach-rockchip/board.c
> > @@ -6,6 +6,7 @@
> > #include <clk.h>
> > #include <cpu_func.h>
> > #include <dm.h>
> > +#include <dm/uclass-internal.h>
> > #include <efi_loader.h>
> > #include <fastboot.h>
> > #include <init.h>
> > @@ -349,3 +350,30 @@ __weak int board_rng_seed(struct abuf *buf)
> > return 0;
> > }
> > #endif
> > +
> > +int mmc_get_env_dev(void)
> > +{
> > + int devnum;
> > + const char *boot_device;
> > + struct udevice *dev;
> > +
> > + if (IS_ENABLED(CONFIG_SYS_MMC_ENV_DEV))
> > + devnum = CONFIG_SYS_MMC_ENV_DEV;
>
> This sadly will not compile if CONFIG_SYS_MMC_ENV_DEV is not defined, so you
> need to use the #ifdef the same way we did in
> board/theobroma-systems/common/common.c
>
Sorry, I just blindly applied the checkpatch recommendation without
thinking about it.
> > + else
> > + devnum = 0;
> > +
> > + boot_device = ofnode_read_chosen_string("u-boot,spl-boot-device");
> > + if (!boot_device) {
> > + debug("%s: /chosen/u-boot,spl-boot-device not set\n", __func__);
> > + return devnum;
> > + }
>
> Note that this would mean that mmc_get_env_dev called in any context before
> U-Boot proper is executed would result in this check failing. So this would
> return devnum in SPL for example. We don't have environment support in SPL
> for our Theobroma boards, so that was something I explicitly didn't have to
> handle.
Not sure what to do about this. I assume the environment is loaded
before SPL makes a decision about the boot device, so it is impossible
to guarantee that SPL loads the env from the same device as U-Boot
proper with this patch.
>
> > +
> > + debug("%s: booted from %s\n", __func__, boot_device);
> > +
> > + if (uclass_find_device_by_ofnode(UCLASS_MMC, ofnode_path(boot_device), &dev))
>
> I know I didn't add it in board/theobroma-systems/common/common.c but I
> think it'd make sense to have a debug message here?
>
> I think this may not work if mmc_get_env_dev is called before U-Boot proper
> is relocated on e.g. RK3588 and RK356x (the former will be fixed after https://lore.kernel.org/u-boot/20240221-jaguar-v3-15-1f256a82201b@theobroma-systems.com/
> is merged). So giving some hint at where this fails could be nice too.
>
> Something like:
> """
> debug("%s: no U-Boot device found for %s\n", __func__, boot_device);
> """
>
> for example?
Ok, I'll add this in v2.
>
> > + return devnum;
> > +
> > + devnum = dev->seq_;
> > + debug("%s: get MMC env from mmc%d\n", __func__, devnum);
> > + return devnum;
> > +}
> > diff --git a/board/rockchip/tinker_rk3288/tinker-rk3288.c b/board/rockchip/tinker_rk3288/tinker-rk3288.c
> > index f85209c649..eff3a00c30 100644
> > --- a/board/rockchip/tinker_rk3288/tinker-rk3288.c
> > +++ b/board/rockchip/tinker_rk3288/tinker-rk3288.c
> > @@ -11,8 +11,6 @@
> > #include <init.h>
> > #include <net.h>
> > #include <netdev.h>
> > -#include <asm/arch-rockchip/bootrom.h>
> > -#include <asm/io.h>
> >
> > static int get_ethaddr_from_eeprom(u8 *addr)
> > {
> > @@ -38,13 +36,3 @@ int rk3288_board_late_init(void)
> >
> > return 0;
> > }
> > -
> > -int mmc_get_env_dev(void)
> > -{
> > - u32 bootdevice_brom_id = readl(BROM_BOOTSOURCE_ID_ADDR);
> > -
> > - if (bootdevice_brom_id == BROM_BOOTSOURCE_EMMC)
> > - return 0;
> > -
> > - return 1;
> > -}
>
> This could be an issue. Indeed, /chosen/u-boot,spl-boot-device doesn't
> report the storage medium used to load TPL+SPL (as does BROM_BOOTSOURCE_ as
> far as I know?), but rather U-Boot proper, which may be loaded from a
> different storage medium than what was used for loading TPL+SPL. So this
> would be a change in behavior (which could be fine, it depends on what
> maintainers of the RK3288 TInker board would like to have). E.g. for
> u-boot,spl-boot-order = "same-as-spl", <sd>, <emmc>; if TPL+SPL is loaded
> from eMMC but U-Boot proper isn't found on the eMMC, it'll try to load it
> from SD card next. In that scenario /chosen/u-boot,spl-boot-device would be
> <sd> while the current implementation for mmc_get_env_dev would select eMMC
> instead.
If this behavior change is problematic, we could introduce a weak
board_mmc_get_env_dev() function like some other vendors have to allow
specific boards to implement custom behavior.
>
> Cheers,
> Quentin
Thanks, Ben
prev parent reply other threads:[~2024-03-08 2:50 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-26 1:14 [PATCH] rockchip: load env from boot MMC device Ben Wolsieffer
2024-02-26 11:26 ` Quentin Schulz
2024-03-08 2:50 ` Ben Wolsieffer [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Zep85SM2zjiJaOGF@Dell-Inspiron-15 \
--to=benwolsieffer@gmail.com \
--cc=hl@rock-chips.com \
--cc=kever.yang@rock-chips.com \
--cc=klaus.goger@theobroma-systems.com \
--cc=matwey.kornilov@gmail.com \
--cc=michael@amarulasolutions.com \
--cc=philipp.tomsich@vrull.eu \
--cc=quentin.schulz@theobroma-systems.com \
--cc=sjg@chromium.org \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox