
From: Eduard Strehlau eduard@lionizers.com
GPT Partition labels are used for determining the right root filesystem to boot from.
The U-Boot environment is configured to reside in the eMMC hardware boot partition we are currently booted from.
This should enable a dual copy approach for upgrading the bootloader. One can overwrite the inactive hardware partition with new bootloader and environment and afterwards switch the eMMC boot partition for an atomic bootloader switch.
Signed-off-by: Eduard Strehlau eduard@lionizers.com Signed-off-by: Fabio Estevam festevam@denx.de --- board/storopack/smegw01/smegw01.c | 20 ++++++++++++++++++++ configs/smegw01_defconfig | 2 ++ include/configs/smegw01.h | 12 ++++++++---- 3 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/board/storopack/smegw01/smegw01.c b/board/storopack/smegw01/smegw01.c index e6bff80e55..9482f88773 100644 --- a/board/storopack/smegw01/smegw01.c +++ b/board/storopack/smegw01/smegw01.c @@ -17,6 +17,7 @@ #include <asm/arch/crm_regs.h> #include <asm/setup.h> #include <asm/bootm.h> +#include <mmc.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -93,3 +94,22 @@ int board_late_init(void)
return 0; } + +/* defined in JESD84-B50, PARTITION_CONFIG */ +#define BOOT_PARTITION_ENABLE_MASK (0x7) +#define BOOT_PARTITION_ENABLE_SHIFT (0x3) + +uint mmc_get_env_part(struct mmc *mmc) +{ + uint part = (mmc->part_config >> BOOT_PARTITION_ENABLE_SHIFT) & + BOOT_PARTITION_ENABLE_MASK; + /* Default to Boot Partition 1 if not explicitly set. */ + if (part != 1 && part != 2 && part != 7) + part = 1; + + /* 7 in BOOT_PARTITION_ENABLE is equivalent to 0 in PARTITION_ACCESS. */ + if (part == 7) + part = 0; + + return part; +} diff --git a/configs/smegw01_defconfig b/configs/smegw01_defconfig index b3580d5d6e..54cf1cfc1f 100644 --- a/configs/smegw01_defconfig +++ b/configs/smegw01_defconfig @@ -30,6 +30,7 @@ CONFIG_CMD_MEMTEST=y CONFIG_CMD_UNZIP=y CONFIG_CMD_DFU=y CONFIG_CMD_GPIO=y +CONFIG_CMD_GPT=y CONFIG_CMD_MMC=y CONFIG_CMD_PART=y CONFIG_CMD_DHCP=y @@ -44,6 +45,7 @@ CONFIG_OF_CONTROL=y CONFIG_ENV_OVERWRITE=y CONFIG_SYS_REDUNDAND_ENVIRONMENT=y CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_SYS_MMC_ENV_DEV=1 CONFIG_NET_RANDOM_ETHADDR=y CONFIG_BOUNCE_BUFFER=y CONFIG_BOOTCOUNT_LIMIT=y diff --git a/include/configs/smegw01.h b/include/configs/smegw01.h index 277c828d0e..71f2d9c8e8 100644 --- a/include/configs/smegw01.h +++ b/include/configs/smegw01.h @@ -32,17 +32,21 @@ "mmcpart=1\0" \ "mmcpart_committed=1\0" \ "mmcargs=setenv bootargs console=${console},${baudrate} " \ - "root=/dev/mmcblk0p${mmcpart_committed} rootwait rw " \ - __stringify(EXTRA_BOOTPARAMS) "\0" \ + "root=/dev/mmcblk${mmcdev}p${gpt_partition_entry} rootwait rw " \ + __stringify(EXTRA_BOOTPARAMS) " SM_ROOT_DEV=${mmcdev} SM_ROOT_PART=${gpt_partition_entry} SM_BOOT_PART=${boot_part}\0" \ "commit_mmc=if test "${ustate}" = 1 -a "${mmcpart}" != "${mmcpart_committed}"; then " \ "setenv mmcpart_committed ${mmcpart};" \ "saveenv;" \ "fi;\0" \ "bootlimit=3\0" \ - "loadimage=load mmc ${mmcdev}:${mmcpart_committed} ${loadaddr} boot/${image}\0" \ - "loadfdt=load mmc ${mmcdev}:${mmcpart_committed} ${fdt_addr} boot/${fdtfile}\0" \ + "loadimage=load mmc ${mmcdev}#rootfs-${mmcpart_committed} ${loadaddr} boot/${image}\0" \ + "loadfdt=load mmc ${mmcdev}#rootfs-${mmcpart_committed} ${fdt_addr} boot/${fdtfile}\0" \ + "loadpart=gpt setenv mmc ${mmcdev} rootfs-${mmcpart_committed}\0" \ + "loadbootpart=mmc partconf 1 boot_part\0" \ "mmcboot=echo Booting from mmc ...; " \ "run commit_mmc; " \ + "run loadpart; " \ + "run loadbootpart; " \ "run mmcargs; " \ "if run loadfdt; then " \ "if bootz ${loadaddr} - ${fdt_addr}; then " \