Vlv2TbltDevicePkg/PlatformBootManager: Add capsule/recovery handling.

Add capsule and recovery boot path handling in platform BDS.

Cc: David Wei <david.wei@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Chao Zhang <chao.b.zhang@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
Yao, Jiewen 2016-09-21 14:45:23 +08:00 committed by david wei
parent 19d29d358f
commit 04d8d8835e
2 changed files with 55 additions and 54 deletions

View File

@ -45,6 +45,9 @@ Abstract:
#include <Library/GenericBdsLib/String.h> #include <Library/GenericBdsLib/String.h>
#include <Library/NetLib.h> #include <Library/NetLib.h>
#include <Library/CapsuleLib.h>
#include <Protocol/EsrtManagement.h>
EFI_GUID *ConnectDriverTable[] = { EFI_GUID *ConnectDriverTable[] = {
&gEfiMmioDeviceProtocolGuid, &gEfiMmioDeviceProtocolGuid,
&gEfiI2cMasterProtocolGuid, &gEfiI2cMasterProtocolGuid,
@ -1585,7 +1588,7 @@ EFIAPI
PlatformBdsPolicyBehavior ( PlatformBdsPolicyBehavior (
IN OUT LIST_ENTRY *DriverOptionList, IN OUT LIST_ENTRY *DriverOptionList,
IN OUT LIST_ENTRY *BootOptionList, IN OUT LIST_ENTRY *BootOptionList,
IN PROCESS_CAPSULES ProcessCapsules, IN PROCESS_CAPSULES BdsProcessCapsules,
IN BASEM_MEMORY_TEST BaseMemoryTest IN BASEM_MEMORY_TEST BaseMemoryTest
) )
{ {
@ -1594,11 +1597,8 @@ PlatformBdsPolicyBehavior (
EFI_BOOT_MODE BootMode; EFI_BOOT_MODE BootMode;
BOOLEAN DeferredImageExist; BOOLEAN DeferredImageExist;
UINTN Index; UINTN Index;
CHAR16 CapsuleVarName[36];
CHAR16 *TempVarName;
SYSTEM_CONFIGURATION SystemConfiguration; SYSTEM_CONFIGURATION SystemConfiguration;
UINTN VarSize; UINTN VarSize;
BOOLEAN SetVariableFlag;
PLATFORM_PCI_DEVICE_PATH *EmmcBootDevPath; PLATFORM_PCI_DEVICE_PATH *EmmcBootDevPath;
EFI_GLOBAL_NVS_AREA_PROTOCOL *GlobalNvsArea; EFI_GLOBAL_NVS_AREA_PROTOCOL *GlobalNvsArea;
EFI_HANDLE FvProtocolHandle; EFI_HANDLE FvProtocolHandle;
@ -1612,6 +1612,7 @@ PlatformBdsPolicyBehavior (
BOOLEAN IsFirstBoot; BOOLEAN IsFirstBoot;
UINT16 *BootOrder; UINT16 *BootOrder;
UINTN BootOrderSize; UINTN BootOrderSize;
ESRT_MANAGEMENT_PROTOCOL *EsrtManagement;
Timeout = PcdGet16 (PcdPlatformBootTimeOut); Timeout = PcdGet16 (PcdPlatformBootTimeOut);
if (Timeout > 10 ) { if (Timeout > 10 ) {
@ -1651,37 +1652,6 @@ PlatformBdsPolicyBehavior (
// //
BootMode = GetBootModeHob(); BootMode = GetBootModeHob();
//
// Clear all the capsule variables CapsuleUpdateData, CapsuleUpdateData1, CapsuleUpdateData2...
// as early as possible which will avoid the next time boot after the capsule update
// will still into the capsule loop
//
StrCpy (CapsuleVarName, EFI_CAPSULE_VARIABLE_NAME);
TempVarName = CapsuleVarName + StrLen (CapsuleVarName);
Index = 0;
SetVariableFlag = TRUE;
while (SetVariableFlag) {
if (Index > 0) {
UnicodeValueToString (TempVarName, 0, Index, 0);
}
Status = gRT->SetVariable (
CapsuleVarName,
&gEfiCapsuleVendorGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS |
EFI_VARIABLE_BOOTSERVICE_ACCESS,
0,
(VOID *)NULL
);
if (EFI_ERROR (Status)) {
//
// There is no capsule variables, quit
//
SetVariableFlag = FALSE;
continue;
}
Index++;
}
// //
// No deferred images exist by default // No deferred images exist by default
// //
@ -1733,6 +1703,11 @@ PlatformBdsPolicyBehavior (
} }
} }
Status = gBS->LocateProtocol(&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtManagement);
if (EFI_ERROR(Status)) {
EsrtManagement = NULL;
}
switch (BootMode) { switch (BootMode) {
case BOOT_WITH_MINIMAL_CONFIGURATION: case BOOT_WITH_MINIMAL_CONFIGURATION:
@ -1822,6 +1797,11 @@ PlatformBdsPolicyBehavior (
#ifdef FTPM_ENABLE #ifdef FTPM_ENABLE
TrEEPhysicalPresenceLibProcessRequest(NULL); TrEEPhysicalPresenceLibProcessRequest(NULL);
#endif #endif
if (EsrtManagement != NULL) {
EsrtManagement->LockEsrtRepository();
}
// //
// Close boot script and install ready to lock // Close boot script and install ready to lock
// //
@ -1863,6 +1843,10 @@ PlatformBdsPolicyBehavior (
} }
} }
if (EsrtManagement != NULL) {
EsrtManagement->LockEsrtRepository();
}
// //
// Close boot script and install ready to lock // Close boot script and install ready to lock
// //
@ -1887,6 +1871,16 @@ PlatformBdsPolicyBehavior (
// //
PlatformBdsConnectConsole (gPlatformConsole); PlatformBdsConnectConsole (gPlatformConsole);
PlatformBdsDiagnostics (EXTENSIVE, FALSE, BaseMemoryTest); PlatformBdsDiagnostics (EXTENSIVE, FALSE, BaseMemoryTest);
DEBUG((EFI_D_INFO, "ProcessCapsules Before EndOfDxe......\n"));
ProcessCapsules ();
DEBUG((EFI_D_INFO, "ProcessCapsules Done\n"));
//
// Close boot script and install ready to lock
//
InstallReadyToLock ();
BdsLibConnectAll (); BdsLibConnectAll ();
// //
@ -1903,12 +1897,13 @@ PlatformBdsPolicyBehavior (
} }
} }
// if (EsrtManagement != NULL) {
// Close boot script and install ready to lock EsrtManagement->SyncEsrtFmp();
// }
InstallReadyToLock ();
ProcessCapsules (BOOT_ON_FLASH_UPDATE); DEBUG((EFI_D_INFO, "ProcessCapsules After ConnectAll......\n"));
ProcessCapsules();
DEBUG((EFI_D_INFO, "ProcessCapsules Done\n"));
break; break;
case BOOT_IN_RECOVERY_MODE: case BOOT_IN_RECOVERY_MODE:
@ -2012,6 +2007,10 @@ FULL_CONFIGURATION:
#ifdef FTPM_ENABLE #ifdef FTPM_ENABLE
TrEEPhysicalPresenceLibProcessRequest(NULL); TrEEPhysicalPresenceLibProcessRequest(NULL);
#endif #endif
if (EsrtManagement != NULL) {
EsrtManagement->SyncEsrtFmp();
}
// //
// Close boot script and install ready to lock // Close boot script and install ready to lock
// //

View File

@ -72,6 +72,7 @@
FileHandleLib FileHandleLib
S3BootScriptLib S3BootScriptLib
SerialPortLib SerialPortLib
CapsuleLib
[Protocols] [Protocols]
gEfiFirmwareVolume2ProtocolGuid gEfiFirmwareVolume2ProtocolGuid
@ -90,6 +91,7 @@
gEfiMmioDeviceProtocolGuid gEfiMmioDeviceProtocolGuid
gEfiI2cMasterProtocolGuid gEfiI2cMasterProtocolGuid
gEfiI2cHostProtocolGuid gEfiI2cHostProtocolGuid
gEsrtManagementProtocolGuid
[Guids] [Guids]
gEfiMemoryTypeInformationGuid gEfiMemoryTypeInformationGuid