diff mbox series

[edk2,edk2-platforms,v1,03/14] Hisilicon D03/D05: Optimize the feature of BMC set boot option

Message ID 1516287703-35516-4-git-send-email-huangming23@huawei.com
State New
Headers show
Series Improve D0x platforms and bug fix | expand

Commit Message

gary guo Jan. 18, 2018, 3:01 p.m. UTC
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 <huangming23@huawei.com>

Signed-off-by: Heyi Guo <heyi.guo@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(-)

-- 
1.9.1

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

Comments

Ard Biesheuvel Jan. 20, 2018, 10:41 a.m. UTC | #1
On 18 January 2018 at 15:01, Ming Huang <heyi.guo@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 <huangming23@huawei.com>

> Signed-off-by: Heyi Guo <heyi.guo@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

> +  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

>

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Huangming (Mark) Jan. 23, 2018, 8:28 a.m. UTC | #2
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.guo@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 <huangming23@huawei.com>

>> Signed-off-by: Heyi Guo <heyi.guo@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
Leif Lindholm Jan. 23, 2018, 10:28 a.m. UTC | #3
I don't agree with this subject line - there is no optimization going
on here.

"Break BMC SetBoot option out into separate library" would be a more
accurate subject line.

For the record, I think this is good cleanup even without the dual-BDS
support.

On Thu, Jan 18, 2018 at 11:01:32PM +0800, Ming Huang wrote:
> 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


0x0001001a

> +  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


MdeM before MdeP

/
    Leif

> +  Silicon/Hisilicon/HisiPkg.dec

> +

> +[LibraryClasses]

> +  BaseLib

> +  BaseMemoryLib

> +  DebugLib

> +  DevicePathLib

> +  IpmiCmdLib

> +  PcdLib

> +  PrintLib

> +  UefiBootManagerLib

> +

> +[BuildOptions]

> +

> +[Pcd]

> +

> +[Guids]

> +  gEfiEventReadyToBootGuid

> +

> +[Protocols]

> +  gEfiDevicePathToTextProtocolGuid              ## CONSUMES

> +  gEfiSimpleFileSystemProtocolGuid              ## CONSUMES

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Huangming (Mark) Jan. 23, 2018, 10:51 a.m. UTC | #4
OK, I will modify the subject line and drop the change about PlatformIntelBdsLib.
Also other comments will be handled.

On 2018/1/23 18:28, Leif Lindholm wrote:
> I don't agree with this subject line - there is no optimization going

> on here.

> 

> "Break BMC SetBoot option out into separate library" would be a more

> accurate subject line.

> 

> For the record, I think this is good cleanup even without the dual-BDS

> support.

> 

> On Thu, Jan 18, 2018 at 11:01:32PM +0800, Ming Huang wrote:

>> 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

> 

> 0x0001001a

> 

>> +  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

> 

> MdeM before MdeP

> 

> /

>     Leif

> 

>> +  Silicon/Hisilicon/HisiPkg.dec

>> +

>> +[LibraryClasses]

>> +  BaseLib

>> +  BaseMemoryLib

>> +  DebugLib

>> +  DevicePathLib

>> +  IpmiCmdLib

>> +  PcdLib

>> +  PrintLib

>> +  UefiBootManagerLib

>> +

>> +[BuildOptions]

>> +

>> +[Pcd]

>> +

>> +[Guids]

>> +  gEfiEventReadyToBootGuid

>> +

>> +[Protocols]

>> +  gEfiDevicePathToTextProtocolGuid              ## CONSUMES

>> +  gEfiSimpleFileSystemProtocolGuid              ## CONSUMES

> 

> .

> 


-- 
Best Regards,

Ming

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

Patch

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} };
+
+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;
+}
+
+VOID
+RestoreBootOrder (
+  VOID
+  )
+{
+  EFI_STATUS                Status;
+  UINT16                    *BootOrder;
+  UINTN                     BootOrderSize;
+
+  GetVariable2 (L"BootOrderBackup", &gOemBootVariableGuid, (VOID **) &BootOrder, &BootOrderSize);
+  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,
+                  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;
+}
+
+
+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",
+                  &gOemBootVariableGuid,
+                  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
+  )
+{
+  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 ;
+}
+
+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
+  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]
+
+[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