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