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} };
+
+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
--
1.9.1
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
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
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
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
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
© 2016 - 2026 Red Hat, Inc.