configs: mt8183: android: add A/B slot select support
This adds the u-boot environment support for Android A/B [1], such as:
- slot selection on early startup (from /misc)
- skip_initramfs commandline depending on boot mode
All A/B related code is guarded around CONFIG_CMD_AB_SELECT, and is not
activated.
Note: the android_ab_slot env variable will always be defined, but is
unused in the case of legacy ota support.
[1]
https://source.android.com/devices/tech/ota/ab/ab_implement
Bug: https://baylibre.atlassian.net/browse/RITA-53
Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
diff --git a/include/configs/mt8183.h b/include/configs/mt8183.h
index 7c8bcac..4d97d8e 100644
--- a/include/configs/mt8183.h
+++ b/include/configs/mt8183.h
@@ -46,6 +46,39 @@
"dtimg select ${loadaddr} ${dtb_index};" \
"dtimg merge ${loadaddr} ${dtbo_index};"
+#ifdef CONFIG_CMD_AB_SELECT
+
+#define MMC_LOAD_PART_AB(_partname, _slot) \
+ "part start mmc ${mmcdev} " _partname "_" _slot " " _partname "_part_start;" \
+ "part size mmc ${mmcdev} " _partname "_" _slot " " _partname "_part_size;" \
+ "mmc read ${loadaddr} ${" _partname "_part_start} ${" _partname "_part_size};"
+
+#define MMC_LOAD_BOOT MMC_LOAD_PART_AB("boot", "${android_ab_slot}")
+
+/*
+ * In the case of Android A/B, the recovery RAM disk
+ * is contained in the boot.img
+ * https://source.android.com/devices/tech/ota/ab/ab_implement#recovery
+ */
+#define ANDROID_BOOT_RECOVERY \
+ MMC_LOAD_DTB \
+ MMC_LOAD_BOOT \
+ "bootm ${loadaddr};"
+
+#define ANDROID_BOOT_SYSTEM \
+ MMC_LOAD_DTB \
+ MMC_LOAD_BOOT \
+ "part number-format dec;" \
+ "part number mmc ${mmcdev} system_${android_ab_slot} rootfs_partition;" \
+ "setenv bootargs \"${bootargs} root=/dev/mmcblk${mmcdev}p${rootfs_partition}\";" \
+ "setenv bootargs \"${bootargs} skip_initramfs\";" \
+ "bootm ${loadaddr};"
+
+#define ANDROID_AB_GET_SLOT \
+ "ab_select android_ab_slot mmc ${mmcdev}#misc;" \
+ "setenv bootargs \"${bootargs} androidboot.slot_suffix=_${android_ab_slot}\";"
+
+#else
#define MMC_LOAD_RECOVERY MMC_LOAD_PART("recovery")
#define MMC_LOAD_BOOT MMC_LOAD_PART("boot")
@@ -63,6 +96,10 @@
"setenv bootargs \"${bootargs} androidboot.android_dt_dir=/proc/device-tree/odm/firmware/android/\";" \
"bootm ${loadaddr};"
+#define ANDROID_AB_GET_SLOT ""
+
+#endif // ifdef CONFIG_CMD_AB_SELECT
+
/*
* checks if we should boot into android recovery mode
*
@@ -100,7 +137,9 @@
"dtbo_index=1\0" \
"loadaddr=0x50000000\0" \
"androidboot_recovery=0\0" \
+ "android_ab_slot=\0" \
"mmcboot=" \
+ ANDROID_AB_GET_SLOT \
ANDROID_TEST_RECOVERY \
"if test \"${androidboot_recovery}\" -eq 1; then " \
"echo Android: booting into recovery;" \