[Feature][T8TSK-288][FOTA]when bl2 bad change to another slot

Only Configure: No
Affected branch: GSW3.0-No-Connman
Affected module: fota
Is it addected on both ZXIC and MTK: only MTK
Self-test: Yes
Doc Update: No

Change-Id: I59dc660f829e62767df10bf43c750299b2dec08a
diff --git a/src/bsp/hsm/src/application/bootloader/mt2735/bootloader.c b/src/bsp/hsm/src/application/bootloader/mt2735/bootloader.c
index aaee340..da1ebbe 100644
--- a/src/bsp/hsm/src/application/bootloader/mt2735/bootloader.c
+++ b/src/bsp/hsm/src/application/bootloader/mt2735/bootloader.c
@@ -320,6 +320,8 @@
 	uint32_t i = 0;
 	int32_t bld_loaded = 0;
 	int32_t ret = BL_OK;
+	int slot = 0; //jb.qi modify for ab_rollback start on 20231117
+	int ret_mark; //jb.qi modify for ab_rollback start on 20231117
 	struct bdev *dev = NULL;
     uint8_t label[MAX_PART_NAME_LEN] = "bl2";
 
@@ -370,6 +372,12 @@
 				break;
 			} else {
 				LOGE("load img a fail\r\n");
+				/*jb.qi modify for ab_rollback start on 20231117*/
+				slot = get_current_slot();
+				LOGD("get_current_slot is %d\r\n", slot);
+				ret_mark = mark_slot_unsuccessful(slot);
+				LOGD("mark_slot_unsuccessful ret is %d\r\n", ret_mark);
+				/*jb.qi modify for ab_rollback end on 20231117*/
 				bl_flash_partition_deinit(boot_device_list[i], device_name);
 			}
 		}
diff --git a/src/bsp/hsm/src/middleware/bootloader/bootctrl/bootctrl_api.c b/src/bsp/hsm/src/middleware/bootloader/bootctrl/bootctrl_api.c
index 68d8dc6..c66daf7 100644
--- a/src/bsp/hsm/src/middleware/bootloader/bootctrl/bootctrl_api.c
+++ b/src/bsp/hsm/src/middleware/bootloader/bootctrl/bootctrl_api.c
@@ -403,6 +403,33 @@
     return slotp->bl_ver;
 }
 
+/*jb.qi modify for ab_rollback start on 20231117*/
+int mark_slot_unsuccessful(int slot)
+{
+    int ret = -1;
+    AvbABSlotData *slotp;
+    AvbABData metadata;
+
+    if (slot < 0 || slot >= SLOT_COUNT) {
+        return -1;
+    }
+
+    ret = read_write_partition_info(&metadata, READ_PARTITION);
+    if (ret < 0) {
+        return -1;
+    }
+
+    slotp = &metadata.slots[slot];
+    slotp->successful_boot = 0;
+
+    ret = read_write_partition_info(&metadata, WRITE_PARTITION);
+    if (ret < 0) {
+        return -1;
+    }
+
+    return 0;
+}
+/*jb.qi modify for ab_rollback end on 20231117*/
 int check_ab_boot(void) {
     int slot;
 
diff --git a/src/bsp/hsm/src/middleware/bootloader/include/bootctrl.h b/src/bsp/hsm/src/middleware/bootloader/include/bootctrl.h
index 7ee3f7e..c3b3814 100644
--- a/src/bsp/hsm/src/middleware/bootloader/include/bootctrl.h
+++ b/src/bsp/hsm/src/middleware/bootloader/include/bootctrl.h
@@ -183,6 +183,14 @@
 */
 int get_bl_ver_data(int slot);
 
+/*jb.qi modify for ab_rollback start on 20231117*/
+/**
+* mark_slot_unsuccessful() mark the slot unsuccessful.
+* Returns mark success or fail.
+*/
+int mark_slot_unsuccessful(int slot);
+/*jb.qi modify for ab_rollback end on 20231117*/
+
 /**
  * check_ab_boot() - check ab boot status
  *