rockchip: load env from boot MMC device

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>
Reviewed-by: Quentin Schulz <quentin.schulz@theobroma-systems.com>
This commit is contained in:
Ben Wolsieffer
2024-03-07 22:00:51 -05:00
committed by Kever Yang
parent 41a60d0e5c
commit 3b95c03d57
3 changed files with 31 additions and 42 deletions

View File

@@ -13,6 +13,7 @@
#include <cpu_func.h>
#include <env.h>
#include <dm.h>
#include <dm/uclass-internal.h>
#include <efi_loader.h>
#include <fastboot.h>
#include <hash.h>
@@ -503,3 +504,33 @@ __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;
#ifdef CONFIG_SYS_MMC_ENV_DEV
devnum = CONFIG_SYS_MMC_ENV_DEV;
#else
devnum = 0;
#endif
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;
}
debug("%s: booted from %s\n", __func__, boot_device);
if (uclass_find_device_by_ofnode(UCLASS_MMC, ofnode_path(boot_device), &dev)) {
debug("%s: no U-Boot device found for %s\n", __func__, boot_device);
return devnum;
}
devnum = dev->seq_;
debug("%s: get MMC env from mmc%d\n", __func__, devnum);
return devnum;
}

View File

@@ -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;
}

View File

@@ -89,36 +89,6 @@ int setup_boottargets(void)
return 0;
}
int mmc_get_env_dev(void)
{
const char *boot_device =
ofnode_read_chosen_string("u-boot,spl-boot-device");
struct udevice *devp;
if (!boot_device) {
debug("%s: /chosen/u-boot,spl-boot-device not set\n",
__func__);
#ifdef CONFIG_SYS_MMC_ENV_DEV
return CONFIG_SYS_MMC_ENV_DEV;
#else
return 0;
#endif
}
debug("%s: booted from %s\n", __func__, boot_device);
if (uclass_find_device_by_ofnode(UCLASS_MMC, ofnode_path(boot_device), &devp))
#ifdef CONFIG_SYS_MMC_ENV_DEV
return CONFIG_SYS_MMC_ENV_DEV;
#else
return 0;
#endif
debug("%s: get MMC ENV from mmc%d\n", __func__, devp->seq_);
return devp->seq_;
}
enum env_location arch_env_get_location(enum env_operation op, int prio)
{
const char *boot_device =