The sources will be modified following below comments.

On 2018/1/20 18:41, Ard Biesheuvel wrote:
> On 18 January 2018 at 15:01, Ming Huang <heyi....@linaro.org> wrote:
>> Modify the feature of BMC set boot option as switching generic
>> BDS. Move main functions to BmcConfigBootLib.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Ming Huang <huangmin...@huawei.com>
>> Signed-off-by: Heyi Guo <heyi....@linaro.org>
>> ---
>>  Platform/Hisilicon/D03/D03.dsc                                              
>> |   1 +
>>  Platform/Hisilicon/D05/D05.dsc                                              
>> |   1 +
>>  Silicon/Hisilicon/Include/Library/BmcConfigBootLib.h                        
>> |  31 ++
>>  Silicon/Hisilicon/Library/BmcConfigBootLib/BmcConfigBootLib.c               
>> | 454 ++++++++++++++++++++
>>  Silicon/Hisilicon/Library/BmcConfigBootLib/BmcConfigBootLib.inf             
>> |  51 +++
>>  Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c               
>> |   7 +
>>  Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf 
>> |   1 +
>>  Silicon/Hisilicon/Library/PlatformIntelBdsLib/IntelBdsPlatform.c            
>> | 434 +------------------
>>  Silicon/Hisilicon/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf       
>> |   4 +-
>>  9 files changed, 548 insertions(+), 436 deletions(-)
>>
>> diff --git a/Platform/Hisilicon/D03/D03.dsc b/Platform/Hisilicon/D03/D03.dsc
>> index f7efff5..b2eae7d 100644
>> --- a/Platform/Hisilicon/D03/D03.dsc
>> +++ b/Platform/Hisilicon/D03/D03.dsc
>> @@ -70,6 +70,7 @@
>>    
>> GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
>>    
>> PlatformBdsLib|Silicon/Hisilicon/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
>>  !if $(GENERIC_BDS) == TRUE
>> +  
>> BmcConfigBootLib|Silicon/Hisilicon/Library/BmcConfigBootLib/BmcConfigBootLib.inf
>>    
>> UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
>>    SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
>>    
>> ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
>> diff --git a/Platform/Hisilicon/D05/D05.dsc b/Platform/Hisilicon/D05/D05.dsc
>> index 57370dc..b89cea3 100644
>> --- a/Platform/Hisilicon/D05/D05.dsc
>> +++ b/Platform/Hisilicon/D05/D05.dsc
>> @@ -85,6 +85,7 @@
>>    
>> GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
>>    
>> PlatformBdsLib|Silicon/Hisilicon/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
>>  !if $(GENERIC_BDS) == TRUE
>> +  
>> BmcConfigBootLib|Silicon/Hisilicon/Library/BmcConfigBootLib/BmcConfigBootLib.inf
>>    
>> UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
>>    SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
>>    
>> ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
>> diff --git a/Silicon/Hisilicon/Include/Library/BmcConfigBootLib.h 
>> b/Silicon/Hisilicon/Include/Library/BmcConfigBootLib.h
>> new file mode 100644
>> index 0000000..d937234
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Include/Library/BmcConfigBootLib.h
>> @@ -0,0 +1,31 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2017, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2017, Linaro Limited. 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
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
>> IMPLIED.
>> +*
>> +**/
>> +
>> +#ifndef _BMC_CONFIG_BOOT_LIB_H_
>> +#define _BMC_CONFIG_BOOT_LIB_H_
>> +
>> +VOID
>> +EFIAPI
>> +RestoreBootOrder (
>> +  VOID
>> +  );
>> +
>> +VOID
>> +EFIAPI
>> +HandleBmcBootType (
>> +  VOID
>> +  );
>> +
>> +#endif
>> diff --git a/Silicon/Hisilicon/Library/BmcConfigBootLib/BmcConfigBootLib.c 
>> b/Silicon/Hisilicon/Library/BmcConfigBootLib/BmcConfigBootLib.c
>> new file mode 100644
>> index 0000000..c446f93
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Library/BmcConfigBootLib/BmcConfigBootLib.c
>> @@ -0,0 +1,454 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2017, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2017, Linaro Limited. 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
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
>> IMPLIED.
>> +*
>> +**/
>> +#include <Uefi.h>
>> +#include <Library/BaseLib.h>
>> +#include <Library/BaseMemoryLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/DevicePathLib.h>
>> +#include <Library/IpmiCmdLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +#include <Library/PrintLib.h>
>> +#include <Library/UefiBootManagerLib.h>
>> +#include <Library/UefiBootServicesTableLib.h>
>> +#include <Library/UefiLib.h>
>> +#include <Library/UefiRuntimeServicesTableLib.h>
>> +#include <Guid/GlobalVariable.h>
>> +#include <Protocol/DevicePathToText.h>
>> +
>> +GUID gOemBootVariableGuid = {0xb7784577, 0x5aaf, 0x4557, {0xa1, 0x99,
>> +  0xd4, 0xa4, 0x2f, 0x45, 0x06, 0xf8} };
>> +
> 
> I know you are just moving this around, but this should be defined in
> HisiPkg.dec not here
> 
>> +STATIC
>> +UINT16
>> +GetBBSTypeFromFileSysPath (
>> +  IN CHAR16                   *UsbPathTxt,
>> +  IN CHAR16                   *FileSysPathTxt,
>> +  IN EFI_DEVICE_PATH_PROTOCOL *FileSysPath
>> +  )
>> +{
>> +  EFI_DEVICE_PATH_PROTOCOL *Node;
>> +
>> +  if (StrnCmp (UsbPathTxt, FileSysPathTxt, StrLen (UsbPathTxt)) == 0) {
>> +    Node = FileSysPath;
>> +    while (!IsDevicePathEnd (Node)) {
>> +      if ((DevicePathType (Node) == MEDIA_DEVICE_PATH) &&
>> +          (DevicePathSubType (Node) == MEDIA_CDROM_DP)) {
>> +        return BBS_TYPE_CDROM;
>> +      }
>> +      Node = NextDevicePathNode (Node);
>> +    }
>> +  }
>> +
>> +  return BBS_TYPE_UNKNOWN;
>> +}
>> +
>> +STATIC
>> +UINT16
>> +GetBBSTypeFromUsbPath (
>> +  IN CONST EFI_DEVICE_PATH_PROTOCOL *UsbPath
>> +  )
>> +{
>> +  EFI_STATUS                        Status;
>> +  EFI_HANDLE                        *FileSystemHandles;
>> +  UINTN                             NumberFileSystemHandles;
>> +  UINTN                             Index;
>> +  EFI_DEVICE_PATH_PROTOCOL          *FileSysPath;
>> +  EFI_DEVICE_PATH_TO_TEXT_PROTOCOL  *DevPathToText;
>> +  CHAR16                            *UsbPathTxt;
>> +  CHAR16                            *FileSysPathTxt;
>> +  UINT16                            Result;
>> +
>> +  Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, 
>> (VOID **) &DevPathToText);
> 
> line length
> 
> Also, if it is an error for gEfiDevicePathToTextProtocolGuid to be
> unavailable, you can add it to your DEPEX instead and just use
> ASSERT_EFI_ERROR() here
> 

I will modify as your suggestion.
It is good for reducing the conditional statement.

>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((DEBUG_ERROR, "Locate DevicePathToTextPro %r\n", Status));
>> +    return BBS_TYPE_UNKNOWN;
>> +  }
>> +
>> +  Result = BBS_TYPE_UNKNOWN;
>> +  UsbPathTxt = DevPathToText->ConvertDevicePathToText (UsbPath, TRUE, TRUE);
>> +  if (UsbPathTxt == NULL) {
>> +    return Result;
>> +  }
>> +
>> +  Status = gBS->LocateHandleBuffer (
>> +                  ByProtocol,
>> +                  &gEfiSimpleFileSystemProtocolGuid,
>> +                  NULL,
>> +                  &NumberFileSystemHandles,
>> +                  &FileSystemHandles
>> +                  );
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((DEBUG_ERROR, "Locate SimpleFileSystemProtocol error(%r)\n", 
>> Status));
>> +    FreePool (UsbPathTxt);
>> +    return BBS_TYPE_UNKNOWN;
>> +  }
>> +
>> +  for (Index = 0; Index < NumberFileSystemHandles; Index++) {
>> +    FileSysPath = DevicePathFromHandle (FileSystemHandles[Index]);
>> +    FileSysPathTxt = DevPathToText->ConvertDevicePathToText (FileSysPath, 
>> TRUE, TRUE);
>> +
>> +    if (FileSysPathTxt == NULL) {
>> +      continue;
>> +    }
>> +
>> +    Result = GetBBSTypeFromFileSysPath (UsbPathTxt, FileSysPathTxt, 
>> FileSysPath);
>> +    FreePool (FileSysPathTxt);
>> +
>> +    if (Result != BBS_TYPE_UNKNOWN) {
>> +      break;
>> +    }
>> +  }
>> +
>> +  if (NumberFileSystemHandles != 0) {
>> +    FreePool (FileSystemHandles);
>> +  }
>> +
>> +  FreePool (UsbPathTxt);
>> +
>> +  return Result;
>> +}
>> +
>> +STATIC
>> +UINT16
>> +GetBBSTypeFromMessagingDevicePath (
>> +  IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
>> +  IN EFI_DEVICE_PATH_PROTOCOL *Node
>> +  )
>> +{
>> +  VENDOR_DEVICE_PATH       *Vendor;
>> +  UINT16                   Result;
>> +
>> +  Result = BBS_TYPE_UNKNOWN;
>> +
>> +  switch (DevicePathSubType (Node)) {
>> +  case MSG_MAC_ADDR_DP:
>> +    Result = BBS_TYPE_EMBEDDED_NETWORK;
>> +    break;
>> +
>> +  case MSG_USB_DP:
>> +    Result = GetBBSTypeFromUsbPath (DevicePath);
>> +    if (Result == BBS_TYPE_UNKNOWN) {
>> +      Result =  BBS_TYPE_USB;
> 
> Just one space after =
> 
>> +    }
>> +    break;
>> +
>> +  case MSG_SATA_DP:
>> +    Result = BBS_TYPE_HARDDRIVE;
>> +    break;
>> +
>> +  case MSG_VENDOR_DP:
>> +    Vendor = (VENDOR_DEVICE_PATH *) (Node);
>> +    if ((&Vendor->Guid) != NULL) {
> 
> Remove redundant ()
> 
>> +      if (CompareGuid (&Vendor->Guid, &((EFI_GUID) 
>> DEVICE_PATH_MESSAGING_SAS))) {
>> +        Result = BBS_TYPE_HARDDRIVE;
>> +      }
>> +    }
>> +    break;
>> +
>> +  default:
>> +    Result = BBS_TYPE_UNKNOWN;
>> +    break;
>> +  }
>> +
>> +  return Result;
>> +}
>> +
>> +STATIC
>> +UINT16
>> +GetBBSTypeByDevicePath (
>> +  IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
>> +  )
>> +{
>> +  EFI_DEVICE_PATH_PROTOCOL *Node;
>> +  UINT16                   Result;
>> +
>> +  Result = BBS_TYPE_UNKNOWN;
>> +  if (DevicePath == NULL) {
>> +    return Result;
>> +  }
>> +
>> +  Node = DevicePath;
>> +  while (!IsDevicePathEnd (Node)) {
>> +    switch (DevicePathType (Node)) {
>> +    case MEDIA_DEVICE_PATH:
>> +      if (DevicePathSubType (Node) == MEDIA_CDROM_DP) {
>> +        Result = BBS_TYPE_CDROM;
>> +      }
>> +      break;
>> +
>> +    case MESSAGING_DEVICE_PATH:
>> +      Result = GetBBSTypeFromMessagingDevicePath (DevicePath, Node);
>> +      break;
>> +
>> +    default:
>> +      Result = BBS_TYPE_UNKNOWN;
>> +      break;
>> +    }
>> +
>> +    if (Result != BBS_TYPE_UNKNOWN) {
>> +      break;
>> +    }
>> +
>> +    Node = NextDevicePathNode (Node);
>> +  }
>> +
>> +  return Result;
>> +}
>> +
>> +STATIC
>> +EFI_STATUS
>> +GetBmcBootOptionsSetting (
>> +  OUT IPMI_GET_BOOT_OPTION *BmcBootOpt
>> +  )
>> +{
>> +  EFI_STATUS   Status;
>> +
>> +  Status = IpmiCmdGetSysBootOptions (BmcBootOpt);
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((DEBUG_ERROR, "Get iBMC BootOpts %r!\n", Status));
>> +    return Status;
>> +  }
>> +
>> +  if (BmcBootOpt->BootFlagsValid != BOOT_OPTION_BOOT_FLAG_VALID) {
>> +    return EFI_NOT_FOUND;
>> +  }
>> +
>> +  if (BmcBootOpt->Persistent) {
>> +    BmcBootOpt->BootFlagsValid = BOOT_OPTION_BOOT_FLAG_VALID;
>> +  } else {
>> +    BmcBootOpt->BootFlagsValid = BOOT_OPTION_BOOT_FLAG_INVALID;
>> +  }
>> +
>> +  Status = IpmiCmdSetSysBootOptions (BmcBootOpt);
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((DEBUG_ERROR, "Set iBMC BootOpts %r!\n", Status));
>> +  }
>> +
>> +  return Status;
>> +}
>> +
>> +VOID
>> +RestoreBootOrder (
>> +  VOID
>> +  )
>> +{
>> +  EFI_STATUS                Status;
>> +  UINT16                    *BootOrder;
>> +  UINTN                     BootOrderSize;
>> +
>> +  GetVariable2 (L"BootOrderBackup", &gOemBootVariableGuid, (VOID **) 
>> &BootOrder, &BootOrderSize);
> 
> line length
> 
>> +  if (BootOrder == NULL) {
>> +    return ;
>> +  }
>> +
>> +  Print (L"\nRestore BootOrder(%d).\n", BootOrderSize / sizeof (UINT16));
>> +
>> +  Status = gRT->SetVariable (
>> +                  L"BootOrder",
>> +                  &gEfiGlobalVariableGuid,
>> +                  EFI_VARIABLE_BOOTSERVICE_ACCESS | 
>> EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
> 
> line length
> 
>> +                  BootOrderSize,
>> +                  BootOrder
>> +                  );
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((DEBUG_ERROR, "SetVariable BootOrder %r!\n", Status));
>> +  }
>> +
>> +  Status = gRT->SetVariable (
>> +                  L"BootOrderBackup",
>> +                  &gOemBootVariableGuid,
>> +                  EFI_VARIABLE_BOOTSERVICE_ACCESS | 
>> EFI_VARIABLE_NON_VOLATILE,
>> +                  0,
>> +                  NULL
>> +                  );
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((DEBUG_ERROR, "SetVariable BootOrderBackup %r!\n", Status));
>> +  }
>> +
>> +  FreePool (BootOrder);
>> +
>> +  return;
> 
> Remove this return
> 
>> +}
>> +
>> +
> 
> STATIC
> 
>> +VOID
> 
> EFIAPI
> 
>> +RestoreBootOrderOnReadyToBoot (
>> +  IN EFI_EVENT        Event,
>> +  IN VOID             *Context
>> +  )
>> +{
>> +  // restore BootOrder variable in normal condition.
>> +  RestoreBootOrder ();
>> +}
>> +
>> +STATIC
>> +VOID
>> +UpdateBootOrder (
>> +  IN UINT16  *NewOrder,
>> +  IN UINT16  *BootOrder,
>> +  IN UINTN   BootOrderSize
>> +  )
>> +{
>> +  EFI_STATUS  Status;
>> +  EFI_EVENT   Event;
>> +
>> +  Status = gRT->SetVariable (
>> +                  L"BootOrderBackup",
>> +                  &gOemBootVariableGuid,
>> +                  EFI_VARIABLE_BOOTSERVICE_ACCESS | 
>> EFI_VARIABLE_NON_VOLATILE,
>> +                  BootOrderSize,
>> +                  BootOrder
>> +                  );
>> +  if (EFI_ERROR (Status)) {
> 
> no DEBUG()?
> 
>> +    return;
>> +  }
>> +
>> +  Status = gRT->SetVariable (
>> +                  L"BootOrder",
>> +                  &gEfiGlobalVariableGuid,
>> +                  EFI_VARIABLE_BOOTSERVICE_ACCESS | 
>> EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
> 
> line length
> 
>> +                  BootOrderSize,
>> +                  NewOrder
>> +                  );
>> +  if (EFI_ERROR (Status)) {
> 
> no DEBUG()?
> 
>> +    return;
>> +  }
>> +
>> +  // Register notify function to restore BootOrder variable on ReadyToBoot 
>> Event.
>> +  Status = gBS->CreateEventEx (
>> +                  EVT_NOTIFY_SIGNAL,
>> +                  TPL_CALLBACK,
>> +                  RestoreBootOrderOnReadyToBoot,
>> +                  NULL,
>> +                  &gEfiEventReadyToBootGuid,
>> +                  &Event
>> +                  );
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((DEBUG_ERROR, "Create ready to boot event %r!\n", Status));
>> +  }
>> +
>> +  return;
> 
> Remove this
> 
>> +}
>> +
>> +STATIC
>> +VOID
>> +SetBootOrder (
>> +  IN UINT16 BootType
>> +  )
>> +{
>> +  EFI_STATUS                   Status;
>> +  UINT16                       *NewOrder;
>> +  UINT16                       *RemainBoots;
>> +  UINT16                       *BootOrder;
>> +  UINTN                        BootOrderSize;
>> +  EFI_BOOT_MANAGER_LOAD_OPTION Option;
>> +  CHAR16                       OptionName[sizeof ("Boot####")];
>> +  UINTN                        Index;
>> +  UINTN                        SelectCnt;
>> +  UINTN                        RemainCnt;
>> +
>> +  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrder, 
>> &BootOrderSize);
>> +  if (BootOrder == NULL) {
>> +    return ;
>> +  }
>> +
>> +  NewOrder = AllocatePool (BootOrderSize);
>> +  RemainBoots = AllocatePool (BootOrderSize);
>> +  if ((NewOrder == NULL) || (RemainBoots == NULL)) {
>> +    DEBUG ((DEBUG_ERROR, "Out of resources."));
>> +    goto Exit;
>> +  }
>> +
>> +  SelectCnt = 0;
>> +  RemainCnt = 0;
>> +
>> +  for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {
>> +    UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", 
>> BootOrder[Index]);
>> +    Status = EfiBootManagerVariableToLoadOption (OptionName, &Option);
>> +    if (EFI_ERROR (Status)) {
>> +      DEBUG ((DEBUG_ERROR, "Boot%04x is invalid option!\n", 
>> BootOrder[Index]));
>> +      continue;
>> +    }
>> +
>> +    if (GetBBSTypeByDevicePath (Option.FilePath) == BootType) {
>> +      NewOrder[SelectCnt++] = BootOrder[Index];
>> +    } else {
>> +      RemainBoots[RemainCnt++] = BootOrder[Index];
>> +    }
>> +  }
>> +
>> +  if (SelectCnt != 0) {
>> +    // append RemainBoots to NewOrder
>> +    for (Index = 0; Index < RemainCnt; Index++) {
>> +      NewOrder[SelectCnt + Index] = RemainBoots[Index];
>> +    }
>> +
>> +    if (CompareMem (NewOrder, BootOrder, BootOrderSize) != 0) {
>> +      UpdateBootOrder (NewOrder, BootOrder, BootOrderSize);
>> +    }
>> +  }
>> +
>> +Exit:
>> +  FreePool (BootOrder);
>> +  if (NewOrder != NULL) {
>> +    FreePool (NewOrder);
>> +  }
>> +  if (RemainBoots != NULL) {
>> +    FreePool (RemainBoots);
>> +  }
>> +
>> +  return ;
> 
> Remove this
> 
>> +}
>> +
>> +VOID
>> +HandleBmcBootType (
>> +  VOID
>> +  )
>> +{
>> +  EFI_STATUS                Status;
>> +  IPMI_GET_BOOT_OPTION      BmcBootOpt;
>> +  UINT16                    BootType;
>> +
>> +  Status = GetBmcBootOptionsSetting (&BmcBootOpt);
>> +  if (EFI_ERROR (Status)) {
>> +    return;
>> +  }
>> +
>> +  Print (L"Boot Type from BMC is %x\n", BmcBootOpt.BootDeviceSelector);
>> +
>> +  switch (BmcBootOpt.BootDeviceSelector) {
>> +  case ForcePxe:
>> +    BootType = BBS_TYPE_EMBEDDED_NETWORK;
>> +    break;
>> +
>> +  case ForcePrimaryRemovableMedia:
>> +    BootType = BBS_TYPE_USB;
>> +    break;
>> +
>> +  case ForceDefaultHardDisk:
>> +    BootType = BBS_TYPE_HARDDRIVE;
>> +    break;
>> +
>> +  case ForceDefaultCD:
>> +    BootType = BBS_TYPE_CDROM;
>> +    break;
>> +
>> +  default:
>> +    return;
>> +  }
>> +
>> +  SetBootOrder (BootType);
>> +}
>> +
>> diff --git a/Silicon/Hisilicon/Library/BmcConfigBootLib/BmcConfigBootLib.inf 
>> b/Silicon/Hisilicon/Library/BmcConfigBootLib/BmcConfigBootLib.inf
>> new file mode 100644
>> index 0000000..7e407b4
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Library/BmcConfigBootLib/BmcConfigBootLib.inf
>> @@ -0,0 +1,51 @@
>> +#/** @file
>> +#
>> +#    Copyright (c) 2015, Hisilicon Limited. All rights reserved.
>> +#    Copyright (c) 2015, Linaro Limited. 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
>> +#    http://opensource.org/licenses/bsd-license.php
>> +#
>> +#    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +#    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
>> IMPLIED.
>> +#
>> +#**/
>> +
>> +[Defines]
>> +  INF_VERSION                    = 0x00010005
> 
> 0x0000001A
> 
>> +  BASE_NAME                      = BmcConfigBootLib
>> +  FILE_GUID                      = f174d192-7208-46c1-b9d1-65b2db06ad3b
>> +  MODULE_TYPE                    = BASE
>> +  VERSION_STRING                 = 1.0
>> +  LIBRARY_CLASS                  = BmcConfigBootLib
>> +
>> +[Sources.common]
>> +  BmcConfigBootLib.c
>> +
>> +[Packages]
>> +  MdePkg/MdePkg.dec
>> +  MdeModulePkg/MdeModulePkg.dec
>> +  Silicon/Hisilicon/HisiPkg.dec
>> +
>> +[LibraryClasses]
>> +  BaseLib
>> +  BaseMemoryLib
>> +  DebugLib
>> +  DevicePathLib
>> +  IpmiCmdLib
>> +  PcdLib
>> +  PrintLib
>> +  UefiBootManagerLib
>> +
>> +[BuildOptions]
>> +
> 
> Remove empty sections please
> 
>> +[Pcd]
>> +
>> +[Guids]
>> +  gEfiEventReadyToBootGuid
>> +
>> +[Protocols]
>> +  gEfiDevicePathToTextProtocolGuid              ## CONSUMES
>> +  gEfiSimpleFileSystemProtocolGuid              ## CONSUMES
>> diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c 
>> b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
>> index 5d8d58e..845519f 100644
>> --- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
>> +++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
>> @@ -16,6 +16,7 @@
>>  **/
>>
>>  #include <IndustryStandard/Pci22.h>
>> +#include <Library/BmcConfigBootLib.h>
>>  #include <Library/DevicePathLib.h>
>>  #include <Library/PcdLib.h>
>>  #include <Library/UefiBootManagerLib.h>
>> @@ -474,6 +475,10 @@ PlatformBootManagerBeforeConsole (
>>    //
>>    EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid);
>>
>> +  // restore BootOrder variable if previous BMC boot override attempt
>> +  // left it in a modified state
>> +  RestoreBootOrder ();
>> +
>>    UpdateMemory ();
>>
>>    //
>> @@ -570,6 +575,8 @@ PlatformBootManagerAfterConsole (
>>    PlatformRegisterFvBootOption (
>>      PcdGetPtr (PcdShellFile), L"UEFI Shell", LOAD_OPTION_ACTIVE
>>      );
>> +
>> +  HandleBmcBootType ();
>>  }
>>
>>  /**
>> diff --git 
>> a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
>>  
>> b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
>> index ae274f3..7b151a9 100644
>> --- 
>> a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
>> +++ 
>> b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
>> @@ -44,6 +44,7 @@
>>  [LibraryClasses]
>>    BaseLib
>>    BaseMemoryLib
>> +  BmcConfigBootLib
>>    DebugLib
>>    DevicePathLib
>>    DxeServicesLib
>> diff --git 
>> a/Silicon/Hisilicon/Library/PlatformIntelBdsLib/IntelBdsPlatform.c 
>> b/Silicon/Hisilicon/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
>> index dc23e46..20015da 100644
>> --- a/Silicon/Hisilicon/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
>> +++ b/Silicon/Hisilicon/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
>> @@ -20,25 +20,19 @@
>>  **/
>>
>>  #include <IndustryStandard/Pci22.h>
>> +#include <Library/BmcConfigBootLib.h>
>>  #include <Library/DevicePathLib.h>
>> -#include <Library/GenericBdsLib.h>
>> -#include <Library/IpmiCmdLib.h>
>>  #include <Library/PcdLib.h>
>>  #include <Library/PlatformBdsLib.h>
>>  #include <Library/PrintLib.h>
>>  #include <Library/UefiLib.h>
>>  #include <Protocol/DevicePath.h>
>> -#include <Protocol/DevicePathToText.h>
>>  #include <Protocol/GraphicsOutput.h>
>>  #include <Protocol/PciIo.h>
>>  #include <Protocol/PciRootBridgeIo.h>
>> -#include <Guid/GlobalVariable.h>
>>
>>  #include "IntelBdsPlatform.h"
>>
>> -GUID gOemBootVaraibleGuid = {0xb7784577, 0x5aaf, 0x4557, {0xa1, 0x99,
>> -  0xd4, 0xa4, 0x2f, 0x45, 0x06, 0xf8} };
>> -
>>  //3CEF354A-3B7A-4519-AD70-72A134698311
>>  GUID gEblFileGuid = {0x3CEF354A, 0x3B7A, 0x4519, {0xAD, 0x70,
>>    0x72, 0xA1, 0x34, 0x69, 0x83, 0x11} };
>> @@ -149,432 +143,6 @@ STATIC PLATFORM_USB_KEYBOARD mUsbKeyboard = {
>>    }
>>  };
>>
>> -STATIC
>> -UINT16
>> -GetBBSTypeFromFileSysPath (
>> -  IN CHAR16                   *UsbPathTxt,
>> -  IN CHAR16                   *FileSysPathTxt,
>> -  IN EFI_DEVICE_PATH_PROTOCOL *FileSysPath
>> -  )
>> -{
>> -  EFI_DEVICE_PATH_PROTOCOL *Node;
>> -
>> -  if (StrnCmp (UsbPathTxt, FileSysPathTxt, StrLen (UsbPathTxt)) == 0) {
>> -    Node = FileSysPath;
>> -    while (!IsDevicePathEnd (Node)) {
>> -      if ((DevicePathType (Node) == MEDIA_DEVICE_PATH) &&
>> -          (DevicePathSubType (Node) == MEDIA_CDROM_DP)) {
>> -        return BBS_TYPE_CDROM;
>> -      }
>> -      Node = NextDevicePathNode (Node);
>> -    }
>> -  }
>> -
>> -  return BBS_TYPE_UNKNOWN;
>> -}
>> -
>> -STATIC
>> -UINT16
>> -GetBBSTypeFromUsbPath (
>> -  IN CONST EFI_DEVICE_PATH_PROTOCOL *UsbPath
>> -  )
>> -{
>> -  EFI_STATUS                        Status;
>> -  EFI_HANDLE                        *FileSystemHandles;
>> -  UINTN                             NumberFileSystemHandles;
>> -  UINTN                             Index;
>> -  EFI_DEVICE_PATH_PROTOCOL          *FileSysPath;
>> -  EFI_DEVICE_PATH_TO_TEXT_PROTOCOL  *DevPathToText;
>> -  CHAR16                            *UsbPathTxt;
>> -  CHAR16                            *FileSysPathTxt;
>> -  UINT16                            Result;
>> -
>> -  Status = gBS->LocateProtocol (&gEfiDevicePathToTextProtocolGuid, NULL, 
>> (VOID **) &DevPathToText);
>> -  if (EFI_ERROR (Status)) {
>> -    DEBUG ((DEBUG_ERROR, "Locate DevicePathToTextPro %r\n", Status));
>> -    return BBS_TYPE_UNKNOWN;
>> -  }
>> -
>> -  Result = BBS_TYPE_UNKNOWN;
>> -  UsbPathTxt = DevPathToText->ConvertDevicePathToText (UsbPath, TRUE, TRUE);
>> -  if (UsbPathTxt == NULL) {
>> -    return Result;
>> -  }
>> -
>> -  Status = gBS->LocateHandleBuffer (
>> -                  ByProtocol,
>> -                  &gEfiSimpleFileSystemProtocolGuid,
>> -                  NULL,
>> -                  &NumberFileSystemHandles,
>> -                  &FileSystemHandles
>> -                  );
>> -  if (EFI_ERROR (Status)) {
>> -    DEBUG ((DEBUG_ERROR, "Locate SimpleFileSystemProtocol error(%r)\n", 
>> Status));
>> -    FreePool (UsbPathTxt);
>> -    return BBS_TYPE_UNKNOWN;
>> -  }
>> -
>> -  for (Index = 0; Index < NumberFileSystemHandles; Index++) {
>> -    FileSysPath = DevicePathFromHandle (FileSystemHandles[Index]);
>> -    FileSysPathTxt = DevPathToText->ConvertDevicePathToText (FileSysPath, 
>> TRUE, TRUE);
>> -
>> -    if (FileSysPathTxt == NULL) {
>> -      continue;
>> -    }
>> -
>> -    Result = GetBBSTypeFromFileSysPath (UsbPathTxt, FileSysPathTxt, 
>> FileSysPath);
>> -    FreePool (FileSysPathTxt);
>> -
>> -    if (Result != BBS_TYPE_UNKNOWN) {
>> -      break;
>> -    }
>> -  }
>> -
>> -  if (NumberFileSystemHandles != 0) {
>> -    FreePool (FileSystemHandles);
>> -  }
>> -
>> -  FreePool (UsbPathTxt);
>> -
>> -  return Result;
>> -}
>> -
>> -STATIC
>> -UINT16
>> -GetBBSTypeFromMessagingDevicePath (
>> -  IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
>> -  IN EFI_DEVICE_PATH_PROTOCOL *Node
>> -  )
>> -{
>> -  VENDOR_DEVICE_PATH       *Vendor;
>> -  UINT16                   Result;
>> -
>> -  Result = BBS_TYPE_UNKNOWN;
>> -
>> -  switch (DevicePathSubType (Node)) {
>> -  case MSG_MAC_ADDR_DP:
>> -    Result = BBS_TYPE_EMBEDDED_NETWORK;
>> -    break;
>> -
>> -  case MSG_USB_DP:
>> -    Result = GetBBSTypeFromUsbPath (DevicePath);
>> -    if (Result == BBS_TYPE_UNKNOWN) {
>> -      Result =  BBS_TYPE_USB;
>> -    }
>> -    break;
>> -
>> -  case MSG_SATA_DP:
>> -    Result = BBS_TYPE_HARDDRIVE;
>> -    break;
>> -
>> -  case MSG_VENDOR_DP:
>> -    Vendor = (VENDOR_DEVICE_PATH *) (Node);
>> -    if ((&Vendor->Guid) != NULL) {
>> -      if (CompareGuid (&Vendor->Guid, &((EFI_GUID) 
>> DEVICE_PATH_MESSAGING_SAS))) {
>> -        Result = BBS_TYPE_HARDDRIVE;
>> -      }
>> -    }
>> -    break;
>> -
>> -  default:
>> -    Result = BBS_TYPE_UNKNOWN;
>> -    break;
>> -  }
>> -
>> -  return Result;
>> -}
>> -
>> -STATIC
>> -UINT16
>> -GetBBSTypeByDevicePath (
>> -  IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
>> -  )
>> -{
>> -  EFI_DEVICE_PATH_PROTOCOL *Node;
>> -  UINT16                   Result;
>> -
>> -  Result = BBS_TYPE_UNKNOWN;
>> -  if (DevicePath == NULL) {
>> -    return Result;
>> -  }
>> -
>> -  Node = DevicePath;
>> -  while (!IsDevicePathEnd (Node)) {
>> -    switch (DevicePathType (Node)) {
>> -    case MEDIA_DEVICE_PATH:
>> -      if (DevicePathSubType (Node) == MEDIA_CDROM_DP) {
>> -        Result = BBS_TYPE_CDROM;
>> -      }
>> -      break;
>> -
>> -    case MESSAGING_DEVICE_PATH:
>> -      Result = GetBBSTypeFromMessagingDevicePath (DevicePath, Node);
>> -      break;
>> -
>> -    default:
>> -      Result = BBS_TYPE_UNKNOWN;
>> -      break;
>> -    }
>> -
>> -    if (Result != BBS_TYPE_UNKNOWN) {
>> -      break;
>> -    }
>> -
>> -    Node = NextDevicePathNode (Node);
>> -  }
>> -
>> -  return Result;
>> -}
>> -
>> -STATIC
>> -EFI_STATUS
>> -GetBmcBootOptionsSetting (
>> -  OUT IPMI_GET_BOOT_OPTION *BmcBootOpt
>> -  )
>> -{
>> -  EFI_STATUS   Status;
>> -
>> -  Status = IpmiCmdGetSysBootOptions (BmcBootOpt);
>> -  if (EFI_ERROR (Status)) {
>> -    DEBUG ((DEBUG_ERROR, "Get iBMC BootOpts %r!\n", Status));
>> -    return Status;
>> -  }
>> -
>> -  if (BmcBootOpt->BootFlagsValid != BOOT_OPTION_BOOT_FLAG_VALID) {
>> -    return EFI_NOT_FOUND;
>> -  }
>> -
>> -  if (BmcBootOpt->Persistent) {
>> -    BmcBootOpt->BootFlagsValid = BOOT_OPTION_BOOT_FLAG_VALID;
>> -  } else {
>> -    BmcBootOpt->BootFlagsValid = BOOT_OPTION_BOOT_FLAG_INVALID;
>> -  }
>> -
>> -  Status = IpmiCmdSetSysBootOptions (BmcBootOpt);
>> -  if (EFI_ERROR (Status)) {
>> -    DEBUG ((DEBUG_ERROR, "Set iBMC BootOpts %r!\n", Status));
>> -  }
>> -
>> -  return Status;
>> -}
>> -
>> -STATIC
>> -VOID
>> -RestoreBootOrder (
>> -  VOID
>> -  )
>> -{
>> -  EFI_STATUS                Status;
>> -  UINT16                    *BootOrder;
>> -  UINTN                     BootOrderSize;
>> -
>> -  GetVariable2 (L"BootOrderBackup", &gOemBootVaraibleGuid, (VOID **) 
>> &BootOrder, &BootOrderSize);
>> -  if (BootOrder == NULL) {
>> -    return ;
>> -  }
>> -
>> -  Print (L"Restore BootOrder(%d).\n", BootOrderSize / sizeof (UINT16));
>> -
>> -  Status = gRT->SetVariable (
>> -                  L"BootOrder",
>> -                  &gEfiGlobalVariableGuid,
>> -                  EFI_VARIABLE_BOOTSERVICE_ACCESS | 
>> EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
>> -                  BootOrderSize,
>> -                  BootOrder
>> -                  );
>> -  if (EFI_ERROR (Status)) {
>> -    DEBUG ((DEBUG_ERROR, "SetVariable BootOrder %r!\n", Status));
>> -  }
>> -
>> -  Status = gRT->SetVariable (
>> -                  L"BootOrderBackup",
>> -                  &gOemBootVaraibleGuid,
>> -                  EFI_VARIABLE_BOOTSERVICE_ACCESS | 
>> EFI_VARIABLE_NON_VOLATILE,
>> -                  0,
>> -                  NULL
>> -                  );
>> -  if (EFI_ERROR (Status)) {
>> -    DEBUG ((DEBUG_ERROR, "SetVariable BootOrderBackup %r!\n", Status));
>> -  }
>> -
>> -  FreePool (BootOrder);
>> -
>> -  return;
>> -}
>> -
>> -
>> -VOID
>> -RestoreBootOrderOnReadyToBoot (
>> -  IN EFI_EVENT        Event,
>> -  IN VOID             *Context
>> -  )
>> -{
>> -  // restore BootOrder variable in normal condition.
>> -  RestoreBootOrder ();
>> -}
>> -
>> -STATIC
>> -VOID
>> -UpdateBootOrder (
>> -  IN UINT16  *NewOrder,
>> -  IN UINT16  *BootOrder,
>> -  IN UINTN   BootOrderSize
>> -  )
>> -{
>> -  EFI_STATUS  Status;
>> -  EFI_EVENT   Event;
>> -
>> -  Status = gRT->SetVariable (
>> -                  L"BootOrderBackup",
>> -                  &gOemBootVaraibleGuid,
>> -                  EFI_VARIABLE_BOOTSERVICE_ACCESS | 
>> EFI_VARIABLE_NON_VOLATILE,
>> -                  BootOrderSize,
>> -                  BootOrder
>> -                  );
>> -  if (EFI_ERROR (Status)) {
>> -    return;
>> -  }
>> -
>> -  Status = gRT->SetVariable (
>> -                  L"BootOrder",
>> -                  &gEfiGlobalVariableGuid,
>> -                  EFI_VARIABLE_BOOTSERVICE_ACCESS | 
>> EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
>> -                  BootOrderSize,
>> -                  NewOrder
>> -                  );
>> -  if (EFI_ERROR (Status)) {
>> -    return;
>> -  }
>> -
>> -  // Register notify function to restore BootOrder variable on ReadyToBoot 
>> Event.
>> -  Status = gBS->CreateEventEx (
>> -                  EVT_NOTIFY_SIGNAL,
>> -                  TPL_CALLBACK,
>> -                  RestoreBootOrderOnReadyToBoot,
>> -                  NULL,
>> -                  &gEfiEventReadyToBootGuid,
>> -                  &Event
>> -                  );
>> -  if (EFI_ERROR (Status)) {
>> -    DEBUG ((DEBUG_ERROR, "Create ready to boot event %r!\n", Status));
>> -  }
>> -
>> -  return;
>> -}
>> -
>> -STATIC
>> -VOID
>> -SetBootOrder (
>> -  IN UINT16 BootType
>> -  )
>> -{
>> -  UINT16                       *NewOrder;
>> -  UINT16                       *RemainBoots;
>> -  UINT16                       *BootOrder;
>> -  UINTN                        BootOrderSize;
>> -  CHAR16                       OptionName[sizeof ("Boot####")];
>> -  UINTN                        Index;
>> -  LIST_ENTRY                   BootOptionList;
>> -  BDS_COMMON_OPTION            *Option;
>> -  UINTN                        SelectCnt;
>> -  UINTN                        RemainCnt;
>> -
>> -  InitializeListHead (&BootOptionList);
>> -
>> -  GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrder, 
>> &BootOrderSize);
>> -  if (BootOrder == NULL) {
>> -    return ;
>> -  }
>> -
>> -  NewOrder = AllocatePool (BootOrderSize);
>> -  RemainBoots = AllocatePool (BootOrderSize);
>> -  if ((NewOrder == NULL) || (RemainBoots == NULL)) {
>> -    DEBUG ((DEBUG_ERROR, "Out of resources."));
>> -    goto Exit;
>> -  }
>> -
>> -  SelectCnt = 0;
>> -  RemainCnt = 0;
>> -
>> -  for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {
>> -    UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", 
>> BootOrder[Index]);
>> -    Option = BdsLibVariableToOption (&BootOptionList, OptionName);
>> -    if (Option == NULL) {
>> -      DEBUG ((DEBUG_ERROR, "Boot%04x is invalid option!\n", 
>> BootOrder[Index]));
>> -      continue;
>> -    }
>> -
>> -    if (GetBBSTypeByDevicePath (Option->DevicePath) == BootType) {
>> -      NewOrder[SelectCnt++] = BootOrder[Index];
>> -    } else {
>> -      RemainBoots[RemainCnt++] = BootOrder[Index];
>> -    }
>> -  }
>> -
>> -  if (SelectCnt != 0) {
>> -    // append RemainBoots to NewOrder
>> -    for (Index = 0; Index < RemainCnt; Index++) {
>> -      NewOrder[SelectCnt + Index] = RemainBoots[Index];
>> -    }
>> -
>> -    if (CompareMem (NewOrder, BootOrder, BootOrderSize) != 0) {
>> -      UpdateBootOrder (NewOrder, BootOrder, BootOrderSize);
>> -    }
>> -  }
>> -
>> -Exit:
>> -  FreePool (BootOrder);
>> -  if (NewOrder != NULL) {
>> -    FreePool (NewOrder);
>> -  }
>> -  if (RemainBoots != NULL) {
>> -    FreePool (RemainBoots);
>> -  }
>> -
>> -  return ;
>> -}
>> -
>> -STATIC
>> -VOID
>> -HandleBmcBootType (
>> -  VOID
>> -  )
>> -{
>> -  EFI_STATUS                Status;
>> -  IPMI_GET_BOOT_OPTION      BmcBootOpt;
>> -  UINT16                    BootType;
>> -
>> -  Status = GetBmcBootOptionsSetting (&BmcBootOpt);
>> -  if (EFI_ERROR (Status)) {
>> -    return;
>> -  }
>> -
>> -  Print (L"Boot Type from BMC is %x\n", BmcBootOpt.BootDeviceSelector);
>> -
>> -  switch (BmcBootOpt.BootDeviceSelector) {
>> -  case ForcePxe:
>> -    BootType = BBS_TYPE_EMBEDDED_NETWORK;
>> -    break;
>> -
>> -  case ForcePrimaryRemovableMedia:
>> -    BootType = BBS_TYPE_USB;
>> -    break;
>> -
>> -  case ForceDefaultHardDisk:
>> -    BootType = BBS_TYPE_HARDDRIVE;
>> -    break;
>> -
>> -  case ForceDefaultCD:
>> -    BootType = BBS_TYPE_CDROM;
>> -    break;
>> -
>> -  default:
>> -    return;
>> -  }
>> -
>> -  SetBootOrder (BootType);
>> -}
>> -
>>  //
>>  // BDS Platform Functions
>>  //
>> diff --git 
>> a/Silicon/Hisilicon/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf 
>> b/Silicon/Hisilicon/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
>> index 0feec06..793c7dc 100644
>> --- a/Silicon/Hisilicon/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
>> +++ b/Silicon/Hisilicon/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
>> @@ -47,10 +47,10 @@
>>  [LibraryClasses]
>>    BaseLib
>>    BaseMemoryLib
>> +  BmcConfigBootLib
>>    DebugLib
>>    DevicePathLib
>>    GenericBdsLib
>> -  IpmiCmdLib
>>    MemoryAllocationLib
>>    PcdLib
>>    PrintLib
>> @@ -70,14 +70,12 @@
>>
>>  [Guids]
>>    gEfiEndOfDxeEventGroupGuid
>> -  gEfiEventReadyToBootGuid
>>    gEfiFileInfoGuid
>>    gEfiFileSystemInfoGuid
>>    gEfiFileSystemVolumeLabelInfoIdGuid
>>
>>  [Protocols]
>>    gEfiDevicePathProtocolGuid
>> -  gEfiDevicePathToTextProtocolGuid
>>    gEfiGraphicsOutputProtocolGuid
>>    gEfiLoadedImageProtocolGuid
>>    gEfiPciRootBridgeIoProtocolGuid
>> --
>> 1.9.1
>>
> 
> .
> 

-- 
Best Regards,

Ming

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to