Merge "platform: msm8952: Add QCM2150 support to msm8952"
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
old mode 100755
new mode 100644
index f84d9db..a2662c7
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -1691,8 +1691,9 @@
 			BOOT_IMAGE_HEADER_V2_OFFSET);
 		unsigned int recovery_dtbo_actual = 0;
 
-		imagesize_actual += ROUND_TO_PAGE(hdr1->recovery_dtbo_size,
-					page_mask);
+		recovery_dtbo_actual =
+			ROUND_TO_PAGE(hdr1->recovery_dtbo_size, page_mask);
+		imagesize_actual += recovery_dtbo_actual;
 
 		imagesize_actual += ROUND_TO_PAGE(hdr2->dtb_size, page_mask);
 
diff --git a/dev/gcdb/display/include/panel_truly_rm69090_qvga_cmd.h b/dev/gcdb/display/include/panel_truly_rm69090_qvga_cmd.h
old mode 100644
new mode 100755
index 9c073b6..5ee4cc6
--- a/dev/gcdb/display/include/panel_truly_rm69090_qvga_cmd.h
+++ b/dev/gcdb/display/include/panel_truly_rm69090_qvga_cmd.h
@@ -59,34 +59,46 @@
 /* Panel on/off command information                                          */
 /*---------------------------------------------------------------------------*/
 static char truly_rm69090_qvga_cmd_on_cmd0[] = {
-	0xFE, 0x00, 0x15, 0x80
+	0xFE, 0x01, 0x15, 0x80
 };
 
 static char truly_rm69090_qvga_cmd_on_cmd1[] = {
-	0x35, 0x00, 0x15, 0x80
+	0x6A, 0x03, 0x15, 0x80
 };
 
 static char truly_rm69090_qvga_cmd_on_cmd2[] = {
-	0x51, 0x80, 0x15, 0x80
+	0xFE, 0x00, 0x15, 0x80
 };
 
 static char truly_rm69090_qvga_cmd_on_cmd3[] = {
+	0x35, 0x00, 0x15, 0x80
+};
+
+static char truly_rm69090_qvga_cmd_on_cmd4[] = {
+	0x53, 0x20, 0x15, 0x80
+};
+
+static char truly_rm69090_qvga_cmd_on_cmd5[] = {
+	0x51, 0x80, 0x15, 0x80
+};
+
+static char truly_rm69090_qvga_cmd_on_cmd6[] = {
 	0x05, 0x00, 0x39, 0xC0,
 	0x2A, 0x00, 0x10, 0x01,
 	0x7F, 0xFF, 0xFF, 0xFF,
 };
 
-static char truly_rm69090_qvga_cmd_on_cmd4[] = {
+static char truly_rm69090_qvga_cmd_on_cmd7[] = {
 	0x05, 0x00, 0x39, 0xC0,
 	0x2B, 0x00, 0x00, 0x01,
 	0xBF, 0xFF, 0xFF, 0xFF,
 };
 
-static char truly_rm69090_qvga_cmd_on_cmd5[] = {
+static char truly_rm69090_qvga_cmd_on_cmd8[] = {
 	0x11, 0x00, 0x05, 0x80
 };
 
-static char truly_rm69090_qvga_cmd_on_cmd6[] = {
+static char truly_rm69090_qvga_cmd_on_cmd9[] = {
 	0x29, 0x00, 0x05, 0x80
 };
 
@@ -94,13 +106,16 @@
 	{0x4, truly_rm69090_qvga_cmd_on_cmd0, 0x00},
 	{0x4, truly_rm69090_qvga_cmd_on_cmd1, 0x00},
 	{0x4, truly_rm69090_qvga_cmd_on_cmd2, 0x00},
-	{0xc, truly_rm69090_qvga_cmd_on_cmd3, 0x00},
-	{0xc, truly_rm69090_qvga_cmd_on_cmd4, 0x00},
-	{0x4, truly_rm69090_qvga_cmd_on_cmd5, 0x78},
-	{0x4, truly_rm69090_qvga_cmd_on_cmd6, 0x40}
+	{0x4, truly_rm69090_qvga_cmd_on_cmd3, 0x00},
+	{0x4, truly_rm69090_qvga_cmd_on_cmd4, 0x00},
+	{0x4, truly_rm69090_qvga_cmd_on_cmd5, 0x00},
+	{0xc, truly_rm69090_qvga_cmd_on_cmd6, 0x00},
+	{0xc, truly_rm69090_qvga_cmd_on_cmd7, 0x00},
+	{0x4, truly_rm69090_qvga_cmd_on_cmd8, 0x78},
+	{0x4, truly_rm69090_qvga_cmd_on_cmd9, 0x40}
 };
 
-#define TRULY_RM69090_QVGA_CMD_ON_COMMAND 7
+#define TRULY_RM69090_QVGA_CMD_ON_COMMAND 10
 
 
 static char truly_rm69090_qvga_cmdoff_cmd0[] = {
diff --git a/platform/msm_shared/avb/libavb/avb_slot_verify.c b/platform/msm_shared/avb/libavb/avb_slot_verify.c
index d70a147..f44a145 100644
--- a/platform/msm_shared/avb/libavb/avb_slot_verify.c
+++ b/platform/msm_shared/avb/libavb/avb_slot_verify.c
@@ -175,7 +175,8 @@
     goto out;
   }
 
-  if (avb_strcmp((const char*)hash_desc.hash_algorithm, "sha256") == 0) {
+  if (avb_strncmp((const char*)hash_desc.hash_algorithm, "sha256",
+                  avb_strlen ("sha256")) == 0) {
     uint32_t complete_len = hash_desc.salt_len + hash_desc.image_size;
     digest = avb_malloc(AVB_SHA256_DIGEST_SIZE);
     if(digest == NULL || hash_desc.salt_len > SALT_BUFF_OFFSET )
@@ -189,7 +190,8 @@
     hash_find(image_buf, complete_len, digest, CRYPTO_AUTH_ALG_SHA256);
     image_buf = SUB_SALT_BUFF_OFFSET(image_buf) +  hash_desc.salt_len;
     digest_len = AVB_SHA256_DIGEST_SIZE;
-  } else if (avb_strcmp((const char*)hash_desc.hash_algorithm, "sha512") == 0) {
+  } else if (avb_strncmp((const char*)hash_desc.hash_algorithm, "sha512",
+                  avb_strlen ("sha512")) == 0) {
     AvbSHA512Ctx sha512_ctx;
     uint8_t *dig;
     digest = avb_malloc(AVB_SHA512_DIGEST_SIZE);
@@ -365,7 +367,7 @@
   size_t num_descriptors;
   size_t n;
   bool is_main_vbmeta;
-  bool is_vbmeta_partition;
+  bool look_for_vbmeta_footer;
   AvbVBMetaData* vbmeta_image_data = NULL;
 
   ret = AVB_SLOT_VERIFY_RESULT_OK;
@@ -377,7 +379,14 @@
    * vbmeta struct.
    */
   is_main_vbmeta = (rollback_index_location == 0);
-  is_vbmeta_partition = (avb_strcmp(partition_name, "vbmeta") == 0);
+
+  /* Don't use footers for vbmeta partitions ('vbmeta' or
+   * 'vbmeta_<partition_name>').
+   */
+  look_for_vbmeta_footer = true;
+  if (avb_strncmp(partition_name, "vbmeta", avb_strlen("vbmeta")) == 0) {
+    look_for_vbmeta_footer = false;
+  }
 
   if (!avb_validate_utf8((const uint8_t*)partition_name, partition_name_len)) {
     avb_error("Partition name is not valid UTF-8.\n");
@@ -407,7 +416,7 @@
 
   vbmeta_offset = 0;
   vbmeta_size = VBMETA_MAX_SIZE;
-  if (is_vbmeta_partition) {
+  if (is_main_vbmeta) {
     io_ret = ops->read_from_partition(ops,
                                     partition_name,
                                     vbmeta_offset,
@@ -419,40 +428,40 @@
       goto out;
     }
   } else {
-    uint8_t footer_buf[AVB_FOOTER_SIZE];
-    size_t footer_num_read;
-    AvbFooter footer;
+    if (look_for_vbmeta_footer) {
+      uint8_t footer_buf[AVB_FOOTER_SIZE];
+      size_t footer_num_read;
+      AvbFooter footer;
+      io_ret = ops->read_from_partition(ops,
+                                        partition_name,
+                                        -AVB_FOOTER_SIZE,
+                                        AVB_FOOTER_SIZE,
+                                        footer_buf,
+                                        &footer_num_read);
+      if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
+        ret = AVB_SLOT_VERIFY_RESULT_ERROR_OOM;
+        goto out;
+      } else if (io_ret != AVB_IO_RESULT_OK) {
+        avb_errorv(full_partition_name, ": Error loading footer.\n", NULL);
+        ret = AVB_SLOT_VERIFY_RESULT_ERROR_IO;
+        goto out;
+      }
+      avb_assert(footer_num_read == AVB_FOOTER_SIZE);
 
-    io_ret = ops->read_from_partition(ops,
-                                      partition_name,
-                                      -AVB_FOOTER_SIZE,
-                                      AVB_FOOTER_SIZE,
-                                      footer_buf,
-                                      &footer_num_read);
-    if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
-      ret = AVB_SLOT_VERIFY_RESULT_ERROR_OOM;
-      goto out;
-    } else if (io_ret != AVB_IO_RESULT_OK) {
-      avb_errorv(full_partition_name, ": Error loading footer.\n", NULL);
-      ret = AVB_SLOT_VERIFY_RESULT_ERROR_IO;
-      goto out;
-    }
-    avb_assert(footer_num_read == AVB_FOOTER_SIZE);
-
-    if (!avb_footer_validate_and_byteswap((const AvbFooter*)footer_buf,
-                                          &footer)) {
-      avb_errorv(full_partition_name, ": No footer detected.\n", NULL);
-    } else {
-      /* Basic footer sanity check since the data is untrusted. */
-      if (footer.vbmeta_size > VBMETA_MAX_SIZE) {
-        avb_errorv(
-            full_partition_name, ": Invalid vbmeta size in footer.\n", NULL);
+      if (!avb_footer_validate_and_byteswap((const AvbFooter*)footer_buf,
+                                            &footer)) {
+        avb_errorv(full_partition_name, ": No footer detected.\n", NULL);
       } else {
-        vbmeta_offset = footer.vbmeta_offset;
-        vbmeta_size = footer.vbmeta_size;
+        /* Basic footer sanity check since the data is untrusted. */
+        if (footer.vbmeta_size > VBMETA_MAX_SIZE) {
+          avb_errorv(
+              full_partition_name, ": Invalid vbmeta size in footer.\n", NULL);
+        } else {
+          vbmeta_offset = footer.vbmeta_offset;
+          vbmeta_size = footer.vbmeta_size;
+        }
       }
     }
-
     vbmeta_buf = avb_malloc(vbmeta_size); // for chain partitions
     if (vbmeta_buf == NULL) {
         ret = AVB_SLOT_VERIFY_RESULT_ERROR_OOM;
@@ -474,7 +483,7 @@
      * go try to get it from the boot partition instead.
      */
     if (is_main_vbmeta && io_ret == AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION &&
-        is_vbmeta_partition) {
+        !look_for_vbmeta_footer) {
       avb_debugv(full_partition_name,
                  ": No such partition. Trying 'boot' instead.\n",
                  NULL);
diff --git a/platform/msm_shared/avb/libavb/avb_sysdeps.h b/platform/msm_shared/avb/libavb/avb_sysdeps.h
index 55e3e19..6ed7d4f 100644
--- a/platform/msm_shared/avb/libavb/avb_sysdeps.h
+++ b/platform/msm_shared/avb/libavb/avb_sysdeps.h
@@ -75,6 +75,14 @@
  */
 int avb_strcmp(const char* s1, const char* s2);
 
+/* Compare |n| bytes in two strings.
+ *
+ * Return an integer less than, equal to, or greater than zero if the
+ * first |n| bytes of |s1| is found, respectively, to be less than,
+ * to match, or be greater than the first |n| bytes of |s2|.
+ */
+int avb_strncmp(const char* s1, const char* s2, size_t n);
+
 /* Copy |n| bytes from |src| to |dest|. */
 void* avb_memcpy(void* dest, const void* src, size_t n);
 
diff --git a/platform/msm_shared/avb/libavb/avb_sysdeps_posix.c b/platform/msm_shared/avb/libavb/avb_sysdeps_posix.c
index dfbfc39..a155ac6 100644
--- a/platform/msm_shared/avb/libavb/avb_sysdeps_posix.c
+++ b/platform/msm_shared/avb/libavb/avb_sysdeps_posix.c
@@ -46,6 +46,10 @@
   return strcmp(s1, s2);
 }
 
+int avb_strncmp(const char* s1, const char* s2, size_t n) {
+  return strncmp(s1, s2, n);
+}
+
 size_t avb_strlen(const char* str) {
   return strlen(str);
 }
diff --git a/target/init.c b/target/init.c
index fa30f3e..bb40155 100644
--- a/target/init.c
+++ b/target/init.c
@@ -315,6 +315,7 @@
 		case SDA429:
 		case SDA439:
 		case QM215:
+		case QCM2150:
 		/* SDCC HC DDR CONFIG has shifted by 4 bytes for these platform */
 			ret += 4;
 			break;
@@ -405,6 +406,7 @@
 		case SDA429:
 		case SDA439:
 		case QM215:
+		case QCM2150:
 		case SDM429W:
 			config->vib_type = VIB_LRA_TYPE;
 			config->hap_rate_cfg1 = QPNP_HAP_RATE_CFG1_41;
diff --git a/target/msm8952/init.c b/target/msm8952/init.c
index c7f2da3..8446481 100755
--- a/target/msm8952/init.c
+++ b/target/msm8952/init.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -428,6 +428,7 @@
 	case SDM439:
 	case SDM429W:
 	case QM215:
+	case QCM2150:
 		board->baseband = BASEBAND_MSM;
 		break;
 	case APQ8052: