mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-21 22:51:37 +00:00
env: am57xx: Implement A/B boot process
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@linaro.org> Signed-off-by: Igor Opaniuk <igor.opaniuk@gmail.com> Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org> Reviewed-by: Alistair Strachan <astrachan@google.com> Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
ae954baf3b
commit
edd31084f2
1 changed files with 52 additions and 6 deletions
|
@ -23,6 +23,18 @@
|
|||
#define VBMETA_PART ""
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CMD_AB_SELECT)
|
||||
#define COMMON_PARTS \
|
||||
"name=boot_a,size=20M,uuid=${uuid_gpt_boot_a};" \
|
||||
"name=boot_b,size=20M,uuid=${uuid_gpt_boot_b};" \
|
||||
"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=20M,uuid=${uuid_gpt_boot};" \
|
||||
"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=10M,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; " \
|
||||
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};\0 "
|
||||
"bootm ${loadaddr}#${fdtfile}; " \
|
||||
"else " \
|
||||
"echo boot${slot_suffix} partition not found; " \
|
||||
"fi;\0"
|
||||
|
||||
#ifdef CONFIG_OMAP54XX
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue