Merge "QcomModulePkg: Log the kernel load start and end time"
diff --git a/QcomModulePkg/Library/BootLib/BootStats.c b/QcomModulePkg/Library/BootLib/BootStats.c
index 1b39339..48b3524 100644
--- a/QcomModulePkg/Library/BootLib/BootStats.c
+++ b/QcomModulePkg/Library/BootLib/BootStats.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2017, 2021 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
@@ -39,6 +39,14 @@
 STATIC UINT64 MpmTimerBase;
 STATIC UINT64 BsImemAddress;
 
+/*
+ * With GKI support, the kernel load time will be sum of
+ * GKI kernel load time + Vendor kernel load time.
+ * To account for this, capture the total number of partition
+ * loading that has to be accounted.
+ */
+STATIC UINT32 KernelLoadTime;
+
 void
 BootStatsSetTimeStamp (BS_ENTRY BootStatId)
 {
@@ -83,18 +91,23 @@
       KernelLoadStart = READL (MpmTimerBase);
       DEBUG ((EFI_D_VERBOSE, "BootStats: ID-%d: Kernel Load Start:%u\n",
               BootStatId, KernelLoadStart));
-      return;
     }
 
     if (BootStatId == BS_KERNEL_LOAD_DONE) {
-      BootStatImemAddress =
-          BsImemAddress + (sizeof (UINT32) * BS_KERNEL_LOAD_TIME);
       BootStatClockCount = READL (MpmTimerBase);
       if (BootStatClockCount) {
-        WRITEL (BootStatImemAddress, (BootStatClockCount - KernelLoadStart));
+        KernelLoadTime += BootStatClockCount - KernelLoadStart;
+      }
+      BootStatImemAddress =
+          BsImemAddress + (sizeof (UINT32) * BS_KERNEL_LOAD_TIME);
+      if (BootStatClockCount) {
+        WRITEL (BootStatImemAddress, KernelLoadTime);
+        BootStatImemAddress = BsImemAddress +
+                              (sizeof (UINT32) * BS_KERNEL_LOAD_DONE);
+        WRITEL (BootStatImemAddress, BootStatClockCount);
       }
       DEBUG ((EFI_D_VERBOSE, "BootStats: ID-%d: Kernel Load Done:%u\n",
-              BootStatId, BootStatClockCount));
+            BootStatId, BootStatClockCount));
     } else {
       BootStatImemAddress = BsImemAddress + (sizeof (UINT32) * BootStatId);
       BootStatClockCount = READL (MpmTimerBase);
diff --git a/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c b/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c
index 7967f00..2e70780 100644
--- a/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c
+++ b/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c
@@ -22,7 +22,7 @@
  * SOFTWARE.
  */
 
-/* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017-2021, 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
@@ -59,6 +59,7 @@
 #include "avb_util.h"
 #include "avb_vbmeta_image.h"
 #include "avb_version.h"
+#include "BootStats.h"
 
 /* Maximum allow length (in bytes) of a partition name, including
  * ab_suffix.
@@ -119,6 +120,8 @@
   size_t digest_len;
   const char* found;
   uint64_t image_size;
+  static bool bootImgLoaded = FALSE;
+  static bool vendorBootImgLoaded = FALSE;
 
   if (!avb_hash_descriptor_validate_and_byteswap(
           (const AvbHashDescriptor*)descriptor, &hash_desc)) {
@@ -187,6 +190,13 @@
     goto out;
   }
 
+  if ((Avb_StrnCmp ("boot", part_name, 4) == 0 &&
+      !bootImgLoaded) ||
+      (Avb_StrnCmp ("vendor_boot", part_name, 11) == 0 &&
+      !vendorBootImgLoaded)) {
+    BootStatsSetTimeStamp (BS_KERNEL_LOAD_START);
+  }
+
   io_ret = ops->read_from_partition(
       ops, part_name, 0 /* offset */, image_size, image_buf, &part_num_read);
   if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
@@ -203,6 +213,16 @@
     goto out;
   }
 
+  if (Avb_StrnCmp ("boot", part_name, 4) == 0 &&
+      !bootImgLoaded) {
+    bootImgLoaded = TRUE;
+    BootStatsSetTimeStamp (BS_KERNEL_LOAD_DONE);
+  } else if (Avb_StrnCmp ("vendor_boot", part_name, 11) == 0 &&
+            !vendorBootImgLoaded) {
+    vendorBootImgLoaded = TRUE;
+    BootStatsSetTimeStamp (BS_KERNEL_LOAD_DONE);
+  }
+
   if (Avb_StrnCmp ( (CONST CHAR8*)hash_desc.hash_algorithm, "sha256",
                  avb_strlen ("sha256")) == 0) {
     avb_sha256_init(&sha256_ctx);