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;" \