From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id AF7161A1E56 for ; Tue, 20 Sep 2016 23:47:27 -0700 (PDT) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga102.jf.intel.com with ESMTP; 20 Sep 2016 23:47:27 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.30,372,1470726000"; d="scan'208";a="1059859423" Received: from jyao1-mobl.ccr.corp.intel.com ([10.239.192.109]) by fmsmga002.fm.intel.com with ESMTP; 20 Sep 2016 23:47:25 -0700 From: Jiewen Yao To: edk2-devel@lists.01.org Cc: Michael D Kinney , Kelly Steele , Feng Tian , Star Zeng , Liming Gao , Chao Zhang Date: Wed, 21 Sep 2016 14:45:16 +0800 Message-Id: <1474440326-9292-36-git-send-email-jiewen.yao@intel.com> X-Mailer: git-send-email 2.7.4.windows.1 In-Reply-To: <1474440326-9292-1-git-send-email-jiewen.yao@intel.com> References: <1474440326-9292-1-git-send-email-jiewen.yao@intel.com> Subject: [PATCH 35/45] QuarkPlatformPkg/PlatformBootManager: Add capsule/recovery handling. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Sep 2016 06:47:27 -0000 Add capsule and recovery boot path handling in platform BDS. Cc: Michael D Kinney Cc: Kelly Steele Cc: Feng Tian Cc: Star Zeng Cc: Liming Gao Cc: Chao Zhang Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jiewen Yao --- QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.c | 95 +++++++++++++++++++- QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.h | 8 +- QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf | 8 +- 3 files changed, 106 insertions(+), 5 deletions(-) diff --git a/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.c b/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.c index 19ff3d0..6a295ed 100644 --- a/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.c +++ b/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.c @@ -2,7 +2,7 @@ This file include all platform action which can be customized by IBV/OEM. -Copyright (c) 2015, Intel Corporation. All rights reserved.
+Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -205,6 +205,8 @@ PlatformBootManagerBeforeConsole ( EFI_INPUT_KEY Enter; EFI_INPUT_KEY F2; EFI_BOOT_MANAGER_LOAD_OPTION BootOption; + ESRT_MANAGEMENT_PROTOCOL *EsrtManagement; + EFI_BOOT_MODE BootMode; EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save; EFI_HANDLE Handle; EFI_EVENT EndOfDxeEvent; @@ -246,6 +248,40 @@ PlatformBootManagerBeforeConsole ( // PlatformRegisterFvBootOption (&mUefiShellFileGuid, L"UEFI Shell", LOAD_OPTION_ACTIVE); + Status = gBS->LocateProtocol(&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtManagement); + if (EFI_ERROR(Status)) { + EsrtManagement = NULL; + } + + BootMode = GetBootModeHob(); + switch (BootMode) { + case BOOT_ON_FLASH_UPDATE: + DEBUG((EFI_D_INFO, "ProcessCapsules Before EndOfDxe ......\n")); + Status = ProcessCapsules (); + DEBUG((EFI_D_INFO, "ProcessCapsules %r\n", Status)); + break; + case BOOT_IN_RECOVERY_MODE: + break; + case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES: + case BOOT_WITH_MINIMAL_CONFIGURATION: + case BOOT_ON_S4_RESUME: + if (EsrtManagement != NULL) { + // + // Lock ESRT cache repository before EndofDxe if ESRT sync is not needed + // + EsrtManagement->LockEsrtRepository(); + } + break; + default: + // + // Require to sync ESRT from FMP in a new boot + // + if (EsrtManagement != NULL) { + EsrtManagement->SyncEsrtFmp(); + } + break; + } + // // Prepare for S3 // @@ -303,7 +339,62 @@ PlatformBootManagerAfterConsole ( VOID ) { - EFI_STATUS Status; + EFI_STATUS Status; + EFI_BOOT_MODE BootMode; + ESRT_MANAGEMENT_PROTOCOL *EsrtManagement; + + Status = gBS->LocateProtocol(&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtManagement); + if (EFI_ERROR(Status)) { + EsrtManagement = NULL; + } + + BootMode = GetBootModeHob(); + switch (BootMode) { + case BOOT_ON_FLASH_UPDATE: + DEBUG((EFI_D_INFO, "Capsule Mode detected\n")); + if (FeaturePcdGet(PcdSupportUpdateCapsuleReset)) { + EfiBootManagerConnectAll (); + EfiBootManagerRefreshAllBootOption (); + + // + // Always sync ESRT Cache from FMP Instances after connect all and before capsule process + // + if (EsrtManagement != NULL) { + EsrtManagement->SyncEsrtFmp(); + } + + DEBUG((EFI_D_INFO, "ProcessCapsules After ConnectAll ......\n")); + Status = ProcessCapsules(); + DEBUG((EFI_D_INFO, "ProcessCapsules %r\n", Status)); + } + break; + + case BOOT_IN_RECOVERY_MODE: + DEBUG((EFI_D_INFO, "Recovery Mode detected\n")); + // Passthrough + + case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES: + case BOOT_WITH_MINIMAL_CONFIGURATION: + case BOOT_WITH_FULL_CONFIGURATION: + case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS: + case BOOT_WITH_DEFAULT_SETTINGS: + default: + EfiBootManagerConnectAll (); + EfiBootManagerRefreshAllBootOption (); + + // + // Sync ESRT Cache from FMP Instance on demand after Connect All + // + if ((BootMode != BOOT_ASSUMING_NO_CONFIGURATION_CHANGES) && + (BootMode != BOOT_WITH_MINIMAL_CONFIGURATION) && + (BootMode != BOOT_ON_S4_RESUME)) { + if (EsrtManagement != NULL) { + EsrtManagement->SyncEsrtFmp(); + } + } + + break; + } Print ( L"\n" diff --git a/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.h b/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.h index 7413883..683249b 100644 --- a/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.h +++ b/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.h @@ -1,7 +1,7 @@ /** @file Head file for BDS Platform specific code -Copyright (c) 2015, Intel Corporation. All rights reserved.
+Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -21,6 +21,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include +#include #include #include #include @@ -32,9 +33,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include +#include #include #include - +#include +#include +#include typedef struct { EFI_DEVICE_PATH_PROTOCOL *DevicePath; diff --git a/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf index d59f14a..5526562 100644 --- a/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf +++ b/QuarkPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf @@ -1,7 +1,7 @@ ## @file # Include all platform action which can be customized by IBV/OEM. # -# Copyright (c) 2012 - 2015, Intel Corporation. All rights reserved.
+# Copyright (c) 2012 - 2016, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -49,11 +49,15 @@ UefiBootServicesTableLib UefiLib UefiBootManagerLib + PrintLib + HobLib + CapsuleLib [Protocols] gEfiFirmwareVolume2ProtocolGuid gEfiAcpiS3SaveProtocolGuid gEfiDxeSmmReadyToLockProtocolGuid + gEsrtManagementProtocolGuid [Guids] gEfiPcAnsiGuid @@ -70,3 +74,5 @@ gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBootState + gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset + -- 2.7.4.windows.1