[U-Boot] [PATCH v4 6/6] env: am57xx: Implement A/B boot process
Sam Protsenko
semen.protsenko at linaro.org
Tue Jul 2 18:00:38 UTC 2019
Hi Igor,
On Tue, Jul 2, 2019 at 11:51 AM Igor Opaniuk <igor.opaniuk at gmail.com> wrote:
>
> From: Ruslan Trofymenko <ruslan.trofymenko at linaro.org>
>
> Add support for A/B boot process on AM57xx based boards:
>
> 1. Define 'slot_suffix' variable (using 'ab_select' command)
> 2. Extend 'emmc_android_boot' boot command (add commands for A/B boot
> process)
>
> 'ab_select' command is used to decide which slot should be used for
> booting up. A/B metadata resides in 'misc' partition.
>
> To activate the A/B boot process, the following config options must be
> set:
>
> CONFIG_ANDROID_AB=y
> CONFIG_CMD_AB_SELECT=y
>
> For successful A/B boot, the corresponding A/B infrastructure must be
> involved on Android side [1] (including mounting system as root), and
> disk must be partitioned accordingly.
>
> When A/B boot is enabled, there are some known limitations currently
> exist (not related to A/B patches, need to be implemented later):
>
> 1. The 'Verified Boot' sequence is not supported
> 2. dev path to system partition (system_a or system_b) is passed via
> 'bootargs' as 'root=' argument like 'root=/dev/mmcblk1p12', but
> further we'll need to rework it with respect to dm-verity
> requirements [2]
>
> In case when A/B partitions are not present in system (and A/B boot is
> enabled), boot up process will be terminated and next message will be
> shown:
>
> "boot_a(b) partition not found"
>
> [1] https://source.android.com/devices/tech/ota/ab
> [2] https://source.android.com/devices/tech/ota/ab/ab_implement#kernel
>
> Signed-off-by: Ruslan Trofymenko <ruslan.trofymenko at linaro.org>
> Signed-off-by: Igor Opaniuk <igor.opaniuk at gmail.com>
> Reviewed-by: Alistair Strachan <astrachan at google.com>
> Reviewed-by: Sam Protsenko <semen.protsenko at linaro.org>
> Reviewed-by: Simon Glass <sjg at chromium.org>
>
> ---
>
> Changes in v4: None
> Changes in v3: None
>
> Changes in v2:
> * Add changes related to command renaming (android_ab_select -> ab_select).
> * Slotted sections (e.g. system_a and system_b) are added to the
> default sections if CONFIG_CMD_AB_SELECT flag is defined
> * Rebased on top of master
> * system partitions sizes increased to 1024 MiB (to be consistent with
> recent changes to boot.h file)
>
> include/environment/ti/boot.h | 58 +++++++++++++++++++++++++++++++----
> 1 file changed, 52 insertions(+), 6 deletions(-)
>
> diff --git a/include/environment/ti/boot.h b/include/environment/ti/boot.h
> index 943adcad40..e340164245 100644
> --- a/include/environment/ti/boot.h
> +++ b/include/environment/ti/boot.h
> @@ -23,6 +23,18 @@
> #define VBMETA_PART ""
> #endif
>
> +#if defined(CONFIG_CMD_AB_SELECT)
> +#define COMMON_PARTS \
> + "name=boot_a,size=10M,uuid=${uuid_gpt_boot_a};" \
> + "name=boot_b,size=10M,uuid=${uuid_gpt_boot_b};" \
I guess this patch will be applied on top of this one:
https://patchwork.ozlabs.org/patch/1126434/
So can you please increase size= param for boot_a and boot_b from 10M to 20M?
> + "name=system_a,size=1024M,uuid=${uuid_gpt_system_a};" \
> + "name=system_b,size=1024M,uuid=${uuid_gpt_system_b};"
> +#else
> +#define COMMON_PARTS \
> + "name=boot,size=10M,uuid=${uuid_gpt_boot};" \
The same here, should be 20M.
> + "name=system,size=1024M,uuid=${uuid_gpt_system};"
> +#endif
> +
> #ifndef PARTS_DEFAULT
> /* Define the default GPT table for eMMC */
> #define PARTS_DEFAULT \
> @@ -38,8 +50,7 @@
> "name=uboot-env,start=2432K,size=256K,uuid=${uuid_gpt_reserved};" \
> "name=misc,size=128K,uuid=${uuid_gpt_misc};" \
> "name=recovery,size=40M,uuid=${uuid_gpt_recovery};" \
> - "name=boot,size=20M,uuid=${uuid_gpt_boot};" \
> - "name=system,size=1024M,uuid=${uuid_gpt_system};" \
> + COMMON_PARTS \
> "name=vendor,size=256M,uuid=${uuid_gpt_vendor};" \
> VBMETA_PART \
> "name=userdata,size=-,uuid=${uuid_gpt_userdata}"
> @@ -58,6 +69,35 @@
> #define AVB_VERIFY_CMD ""
> #endif
>
> +#define CONTROL_PARTITION "misc"
> +
> +#if defined(CONFIG_CMD_AB_SELECT)
> +#define AB_SELECT \
> + "if part number mmc 1 " CONTROL_PARTITION " control_part_number; " \
> + "then " \
> + "echo " CONTROL_PARTITION \
> + " partition number:${control_part_number};" \
> + "ab_select slot_name mmc ${mmcdev}:${control_part_number};" \
> + "else " \
> + "echo " CONTROL_PARTITION " partition not found;" \
> + "exit;" \
> + "fi;" \
> + "setenv slot_suffix _${slot_name};" \
> + "if part number mmc ${mmcdev} system${slot_suffix} " \
> + "system_part_number; then " \
> + "setenv bootargs_ab " \
> + "ro root=/dev/mmcblk${mmcdev}p${system_part_number} " \
> + "rootwait init=/init skip_initramfs " \
> + "androidboot.slot_suffix=${slot_suffix};" \
> + "echo A/B cmdline addition: ${bootargs_ab};" \
> + "setenv bootargs ${bootargs} ${bootargs_ab};" \
> + "else " \
> + "echo system${slot_suffix} partition not found;" \
> + "fi;"
> +#else
> +#define AB_SELECT ""
> +#endif
> +
> #define DEFAULT_COMMON_BOOT_TI_ARGS \
> "console=" CONSOLEDEV ",115200n8\0" \
> "fdtfile=undefined\0" \
> @@ -86,10 +126,16 @@
> "mmc dev $mmcdev; " \
> "mmc rescan; " \
> AVB_VERIFY_CHECK \
> - "part start mmc ${mmcdev} boot boot_start; " \
> - "part size mmc ${mmcdev} boot boot_size; " \
> - "mmc read ${loadaddr} ${boot_start} ${boot_size}; " \
> - "bootm ${loadaddr}#${fdtfile};\0 "
> + AB_SELECT \
> + "if part start mmc ${mmcdev} boot${slot_suffix} boot_start; " \
> + "then " \
> + "part size mmc ${mmcdev} boot${slot_suffix} " \
> + "boot_size; " \
> + "mmc read ${loadaddr} ${boot_start} ${boot_size}; " \
> + "bootm ${loadaddr}#${fdtfile}; " \
> + "else " \
> + "echo boot${slot_suffix} partition not found; " \
> + "fi;\0"
>
> #ifdef CONFIG_OMAP54XX
>
> --
> 2.17.1
>
More information about the U-Boot
mailing list