+EFIAPI\r
+AreCapsulesStaged(\r
+ OUT BOOLEAN *UpdateCapsules\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN Size;\r
+ EFI_PEI_READ_ONLY_VARIABLE2_PPI *PPIVariableServices;\r
+ EFI_PHYSICAL_ADDRESS CapsuleDataPtr64 = 0;\r
+\r
+ if (UpdateCapsules == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "%a Invalid parameters. Inputs can't be NULL\n", __FUNCTION__));\r
+ ASSERT (UpdateCapsules != NULL);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ *UpdateCapsules = FALSE;\r
+\r
+ Status = PeiServicesLocatePpi(\r
+ &gEfiPeiReadOnlyVariable2PpiGuid,\r
+ 0,\r
+ NULL,\r
+ (VOID **)&PPIVariableServices\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failed to find ReadOnlyVariable2PPI\n"));\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Check for Update capsule\r
+ //\r
+ Size = sizeof (CapsuleDataPtr64);\r
+ Status = PPIVariableServices->GetVariable (\r
+ PPIVariableServices,\r
+ EFI_CAPSULE_VARIABLE_NAME,\r
+ &gEfiCapsuleVendorGuid,\r
+ NULL,\r
+ &Size,\r
+ (VOID *)&CapsuleDataPtr64\r
+ );\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ *UpdateCapsules = TRUE;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+#define MAX_SG_LIST_HEADS (20)\r
+\r
+/**\r
+ Check all the variables for SG list heads and get the count and addresses.\r
+\r
+ @param ListLength A pointer would return the SG list length.\r
+ @param HeadList A ponter to the capsule SG list.\r
+\r
+ @retval EFI_SUCCESS a valid capsule is present\r
+ @retval EFI_NOT_FOUND if a valid capsule is not present\r
+ @retval EFI_INVALID_PARAMETER the input parameter is invalid\r
+ @retval EFI_OUT_OF_RESOURCES fail to allocate memory\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetScatterGatherHeadEntries(\r
+ OUT UINTN *ListLength,\r
+ OUT EFI_PHYSICAL_ADDRESS **HeadList\r