stm32mp1: select boot device and partition
Bootrom loads SPL from SDCARD or eMMC according BootPin selection. Then SPL loads U-Boot on the same mmc device with the following predefined GPT partitioning: on SDCARD: gpt partitioning 1: SPL 2: SPL#2 3: U-Boot 4: bootable partition on eMMC: The 2 boot partitions are used for SPL (2 copy) boot1: SPL boot2: SPL#2 The user partition use gpt partitioning 1: U-Boot 2: bootable partition This patch select the correct SPL partition (3 for SDCARD on mmc0 and 1 for eMMC on mmc1) according the BootRom information saved in TAMP register and based on configuration flasg: - CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION => for BOOT_DEVICE_MMC1 or mmc 0 in U-Boot - CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_MMC2 (new) => for BOOT_DEVICE_MMC2 or mmc 1 in U-Boot And the correct boot_targets is selected according the environment variables boot_device and boot_instance, with preboot command, to search the bootable partition with kernel on this device (generic distro support). Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
This commit is contained in:
parent
08772f6e79
commit
11dfd1a331
@ -38,6 +38,14 @@ config SYS_TEXT_BASE
|
||||
when DDR driver is used:
|
||||
DDR + 1MB (0xC0100000)
|
||||
|
||||
config SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_MMC2
|
||||
hex "Partition on MMC2 to use to load U-Boot from"
|
||||
depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
|
||||
default 1
|
||||
help
|
||||
Partition on the second MMC to load U-Boot from when the MMC is being
|
||||
used in raw mode
|
||||
|
||||
source "board/st/stm32mp1/Kconfig"
|
||||
|
||||
endif
|
||||
|
@ -7,9 +7,27 @@
|
||||
#include <common.h>
|
||||
#include <dm.h>
|
||||
#include <spl.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
u32 spl_boot_device(void)
|
||||
{
|
||||
u32 boot_mode;
|
||||
|
||||
boot_mode = (readl(TAMP_BOOT_CONTEXT) & TAMP_BOOT_MODE_MASK) >>
|
||||
TAMP_BOOT_MODE_SHIFT;
|
||||
clrsetbits_le32(TAMP_BOOT_CONTEXT,
|
||||
TAMP_BOOT_MODE_MASK,
|
||||
boot_mode << TAMP_BOOT_MODE_SHIFT);
|
||||
|
||||
switch (boot_mode) {
|
||||
case BOOT_FLASH_SD_1:
|
||||
case BOOT_FLASH_EMMC_1:
|
||||
return BOOT_DEVICE_MMC1;
|
||||
case BOOT_FLASH_SD_2:
|
||||
case BOOT_FLASH_EMMC_2:
|
||||
return BOOT_DEVICE_MMC2;
|
||||
}
|
||||
|
||||
return BOOT_DEVICE_MMC1;
|
||||
}
|
||||
|
||||
@ -18,6 +36,18 @@ u32 spl_boot_mode(const u32 boot_device)
|
||||
return MMCSD_MODE_RAW;
|
||||
}
|
||||
|
||||
int spl_boot_partition(const u32 boot_device)
|
||||
{
|
||||
switch (boot_device) {
|
||||
case BOOT_DEVICE_MMC1:
|
||||
return CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION;
|
||||
case BOOT_DEVICE_MMC2:
|
||||
return CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_MMC2;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
void board_init_f(ulong dummy)
|
||||
{
|
||||
struct udevice *dev;
|
||||
|
@ -82,6 +82,12 @@
|
||||
|
||||
#include <config_distro_bootcmd.h>
|
||||
|
||||
#define STM32MP_PREBOOT \
|
||||
"echo \"Boot over ${boot_device}${boot_instance}!\"; " \
|
||||
"if test \"${boot_device}\" = \"mmc\"; then " \
|
||||
"env set boot_targets \"mmc${boot_instance}\"; "\
|
||||
"fi;"
|
||||
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
"scriptaddr=0xC0000000\0" \
|
||||
"pxefile_addr_r=0xC0000000\0" \
|
||||
@ -90,6 +96,7 @@
|
||||
"ramdisk_addr_r=0xC4100000\0" \
|
||||
"fdt_high=0xffffffff\0" \
|
||||
"initrd_high=0xffffffff\0" \
|
||||
"preboot=" STM32MP_PREBOOT "\0" \
|
||||
BOOTENV
|
||||
|
||||
#endif /* ifndef CONFIG_SPL_BUILD */
|
||||
|
Loading…
Reference in New Issue
Block a user