diff options
author | Tabassum Tabassum <ttabassu@codeaurora.org> | 2021-04-01 10:49:53 +0530 |
---|---|---|
committer | Tabassum Tabassum <ttabassu@codeaurora.org> | 2021-05-27 10:31:18 +0530 |
commit | 5284f9b2e31c1a807f8d8035de593f52597e7ea7 (patch) | |
tree | 2af1701b8601e42409ad2472e68ccbfbd48130af /1.1 | |
parent | 6cb2be4a02805ed2acf5695369ca4d355abb5a48 (diff) |
Bootctrl: Supporting bootctrl on HQX.
1. Updating get_number_slots API, to return 2 on HQX
2. Updating set_active_boot_slot API, write current, target slot,
status of target slot info into la_misc partition, which will
read by PVM during slot switching and OTA update.
Change-Id: If171ac32e30fcaf17b079e1c9f3465ff236dc7c8
Diffstat (limited to '1.1')
-rw-r--r-- | 1.1/libboot_control_qti/libboot_control_qti.cpp | 73 | ||||
-rw-r--r-- | 1.1/libboot_control_qti/libboot_control_qti.h | 2 |
2 files changed, 69 insertions, 6 deletions
diff --git a/1.1/libboot_control_qti/libboot_control_qti.cpp b/1.1/libboot_control_qti/libboot_control_qti.cpp index d6f5d8b..258e5fd 100644 --- a/1.1/libboot_control_qti/libboot_control_qti.cpp +++ b/1.1/libboot_control_qti/libboot_control_qti.cpp @@ -27,6 +27,7 @@ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +//#define LOG_NDEBUG 0 #define LOG_TAG "bootcontrolhal" #include <libboot_control_qti.h> @@ -47,6 +48,7 @@ #include <limits.h> #include <cutils/properties.h> #include <gpt-utils.h> +#include <bootloader_message/bootloader_message.h> #include <libboot_control/libboot_control.h> #define BOOTDEV_DIR "/dev/block/bootdevice/by-name" @@ -425,13 +427,13 @@ bool bootcontrol_init() char platform[256]; property_get(BOARD_PLATFORM_PROP , platform, ""); if (!strncmp(platform, GVMQ_PLATFORM, strlen(GVMQ_PLATFORM))) - mPlatform = true; + mGvmqPlatform = true; return InitMiscVirtualAbMessageIfNeeded(); } unsigned get_number_slots() { - if(mPlatform) + if (mGvmqPlatform) return 2; struct dirent *de = NULL; @@ -490,8 +492,35 @@ error: return 0; } -int mark_boot_successful() -{ +int mark_boot_successful(){ + if (mGvmqPlatform) { + std::string err; + std::string misc_blk_device = get_bootloader_message_blk_device(&err); + if (misc_blk_device.empty()) { + ALOGE("Could not find bootloader message block device: %s", err.c_str()); + return -1; + } + bootloader_message boot; + if (!read_bootloader_message_from(&boot, misc_blk_device, &err)) { + ALOGE(" Failed to read from %s due to %s ", misc_blk_device.c_str(), err.c_str()); + return -1; + } + ALOGV(" bootloader_message is : boot.reserved[0] = %c, boot.reserved[1] = %c", + boot.reserved[0], boot.reserved[1]); + boot.reserved[2] = 'y'; + if (!write_bootloader_message_to(boot, misc_blk_device, &err)) { + ALOGE("Failed to write to %s because : %s", misc_blk_device.c_str(), err.c_str()); + return -1; + } + bootloader_message boot_verify; + if (!read_bootloader_message_from(&boot_verify, misc_blk_device, &err)) { + ALOGE("Failed to read from %s due to %s ", misc_blk_device.c_str(), err.c_str()); + return -1; + } + ALOGV(" bootloader_message : boot_verify.reserved[0] = %c, boot_verify.reserved[1] = %c,boot_verify.reserved[2] = %c", + boot_verify.reserved[0],boot_verify.reserved[1], boot_verify.reserved[2]); + } + unsigned cur_slot = 0; cur_slot = get_current_slot(); if (update_slot_attribute(slot_suffix_arr[cur_slot], @@ -506,6 +535,41 @@ error: int set_active_boot_slot(unsigned slot) { + if (mGvmqPlatform) { + std::string err; + std::string misc_blk_device = get_bootloader_message_blk_device(&err); + if (misc_blk_device.empty()) { + ALOGE("Could not find bootloader message block device: %s", err.c_str()); + return -1; + } + unsigned current_slot = get_current_slot(); + uint32_t num_slots = get_number_slots(); + if ((num_slots < 1) || (current_slot > num_slots - 1)) { + ALOGE("Invalid slot number"); + return -1; + } + bootloader_message boot; + if(current_slot == 0) + boot.reserved[0] = 'a'; + else + boot.reserved[0] = 'b'; + if(slot == 0) + boot.reserved[1] = 'a'; + else + boot.reserved[1] = 'b'; + boot.reserved[2] = '\0'; + if (!write_bootloader_message_to(boot, misc_blk_device, &err)) { + ALOGE("Failed to write to %s because : %s", misc_blk_device.c_str(), err.c_str()); + return -1; + } + bootloader_message boot_verify; + if (!read_bootloader_message_from(&boot_verify, misc_blk_device, &err)) { + ALOGE("Failed to read from %s due to %s ", misc_blk_device.c_str(), err.c_str()); + return -1; + } + ALOGV("bootloader_message is : boot_verify.reserved[0] = %c, boot_verify.reserved[1] = %c,boot_verify.reserved[2] = %c", + boot_verify.reserved[0],boot_verify.reserved[1], boot_verify.reserved[2]); + } map<string, vector<string>> ptn_map; vector<string> ptn_vec; const char ptn_list[][MAX_GPT_NAME_SIZE] = { AB_PTN_LIST }; @@ -599,7 +663,6 @@ error: ALOGE("%s: Failed to mark slot unbootable", __func__); return -1; } - int is_slot_bootable(unsigned slot) { int attr = 0; diff --git a/1.1/libboot_control_qti/libboot_control_qti.h b/1.1/libboot_control_qti/libboot_control_qti.h index 2b1d18d..c669a0e 100644 --- a/1.1/libboot_control_qti/libboot_control_qti.h +++ b/1.1/libboot_control_qti/libboot_control_qti.h @@ -49,4 +49,4 @@ const char* get_suffix(unsigned slot); bool set_snapshot_merge_status(MergeStatus status); MergeStatus get_snapshot_merge_status(); -bool mPlatform = false; +bool mGvmqPlatform = false; |