[Feature][API-794]when a/b slot broken, rollback and repair it.-1.boot partition rollback

Change-Id: Id59abfdfb79c740363c47da7c0f8bf603e958ddb
diff --git a/src/bsp/lk/app/blxboot/avb.c b/src/bsp/lk/app/blxboot/avb.c
index 0ff1873..09b3a9e 100644
--- a/src/bsp/lk/app/blxboot/avb.c
+++ b/src/bsp/lk/app/blxboot/avb.c
@@ -26,6 +26,11 @@
 #include <libavb/libavb.h>
 #include <libavb_ab/libavb_ab.h>
 
+
+//xf.li@2023410 add for ab rooback start
+#include <lib/bootctrl.h>
+#include <platform.h>
+//xf.li@2023410 add for ab rooback end
 #include <platform/mmc_rpmb.h>
 #include <sys/types.h>
 #include <string.h>
@@ -408,9 +413,19 @@
     AvbSlotVerifyResult verify_result;
     const char *requested_partitions[] = { part_name, NULL };
     const char *ab_suffix = get_suffix() ? : "";
+    int current_slot = -1;
 
     verify_result = avb_slot_verify(&avbops,requested_partitions,ab_suffix,is_device_unlocked(),AVB_HASHTREE_ERROR_MODE_RESTART,verifyData);
     dprintf(CRITICAL, "avb boot verification result is %s\n",avb_slot_verify_result_to_string(verify_result));
+//xf.li@20230313 modify for ab_rollback start
+    if(verify_result == AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION && avb_strcmp(part_name,"boot") == 0)
+    {
+        dprintf(ALWAYS, "BOOTCTRL: hash verification is error\n");
+        current_slot = get_current_slot();
+        dprintf(ALWAYS, "BOOTCTRL: current_slot: %d. reboot\n" ,current_slot);
+        mark_slot_unsuccessful(current_slot);
+    }
+//xf.li@20230313 modify for ab_rollback end
     if (verify_result == AVB_SLOT_VERIFY_RESULT_OK) {
         verify_result = avb_update_rollback_indexes(&avbops,*verifyData);
         dprintf(CRITICAL, "avb boot rollback indexes result is %s\n",avb_slot_verify_result_to_string(verify_result));
diff --git a/src/bsp/lk/lib/bootctrl/bootctrl_api.c b/src/bsp/lk/lib/bootctrl/bootctrl_api.c
index 92f8bc3..598b368 100644
--- a/src/bsp/lk/lib/bootctrl/bootctrl_api.c
+++ b/src/bsp/lk/lib/bootctrl/bootctrl_api.c
@@ -254,6 +254,7 @@
     }
 
     slotp = &metadata.slots[slot];
+    dprintf(ALWAYS, "BOOTCTRL: tries_remaining = %u\n", slotp->tries_remaining);
     return slotp->tries_remaining;
 }
 
@@ -300,7 +301,7 @@
         ab_metadata_init(0);
         return 0;
     }
-
+    dprintf(ALWAYS, "BOOTCTRL: metadata.slots[0].priority = %u, metadata.slots[1].priority = %u.\n",metadata.slots[0].priority, metadata.slots[1].priority);
     if ((metadata.slots[0].priority > 0) || (metadata.slots[1].priority > 0))
         return 0;
 
@@ -425,7 +426,33 @@
 
     return slotp->bl_ver;
 }
+//xf.li@20230313 modify for ab_rollback start
+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;
+}
+//xf.li@20230313 modify for ab_rollback end
 int check_ab_boot(void)
 {
     int ret, slot,next_slot;
@@ -434,12 +461,12 @@
         ab_metadata_init(0);
         plat_ab_set_active_bootdev(0);
     }
-
     slot = get_current_slot();
     if (get_bootup_status(slot) == 1) {
+        dprintf(ALWAYS, "BOOTCTRL: this slot is successful\n");
         return 0;
     }
-
+    dprintf(ALWAYS, "BOOTCTRL: this slot is unsuccessful\n");
     if (get_retry_count(slot) > 0) {
         reduce_retry_count(slot);
         return 0;
@@ -448,10 +475,13 @@
     mark_slot_invalid(slot);
 
     if (check_valid_slot() == -1)
+    {
         return -EIO;
+    }
+        
     next_slot = (slot == 0) ? 1 : 0;
     ret = plat_ab_set_active_bootdev(next_slot);
-
+    dprintf(ALWAYS, "BOOTCTRL: rollback slot\n");
     /* report the bad slot error code when set new active bootdev ok */
     if (ret == 0)
         return -EBADSLT;
diff --git a/src/bsp/lk/lib/bootctrl/include/lib/bootctrl.h b/src/bsp/lk/lib/bootctrl/include/lib/bootctrl.h
index ff82784..ad91bfb 100644
--- a/src/bsp/lk/lib/bootctrl/include/lib/bootctrl.h
+++ b/src/bsp/lk/lib/bootctrl/include/lib/bootctrl.h
@@ -135,6 +135,14 @@
 */
 int get_bl_ver_data(int slot);
 
+//xf.li@20230313 modify for ab_rollback start
+/**
+* mark_slot_unsuccessful() mark the slot unsuccessful.
+* Returns mark success or fail.
+*/
+int mark_slot_unsuccessful(int slot);
+//xf.li@20230313 modify for ab_rollback start
+
 /**
  * check_ab_boot() - check ab boot status
  *