From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=45.249.212.190; helo=huawei.com; envelope-from=huangming23@huawei.com; receiver=edk2-devel@lists.01.org Received: from huawei.com (szxga04-in.huawei.com [45.249.212.190]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id B0B3B22333797 for ; Tue, 23 Jan 2018 00:23:02 -0800 (PST) Received: from DGGEMS405-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id D48B3733ED7EF; Tue, 23 Jan 2018 16:28:14 +0800 (CST) Received: from [127.0.0.1] (10.61.17.224) by DGGEMS405-HUB.china.huawei.com (10.3.19.205) with Microsoft SMTP Server id 14.3.361.1; Tue, 23 Jan 2018 16:28:06 +0800 To: Ard Biesheuvel , Ming Huang References: <1516287703-35516-1-git-send-email-huangming23@huawei.com> <1516287703-35516-4-git-send-email-huangming23@huawei.com> CC: Leif Lindholm , linaro-uefi , "edk2-devel@lists.01.org" , Graeme Gregory , , wanghuiqiang , Jason Zhang , Mengfanrong , From: "Huangming (Mark)" Message-ID: Date: Tue, 23 Jan 2018 16:28:05 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: X-Originating-IP: [10.61.17.224] X-CFilter-Loop: Reflected Subject: Re: [PATCH edk2-platforms v1 03/14] Hisilicon D03/D05: Optimize the feature of BMC set boot option X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Jan 2018 08:23:03 -0000 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit 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 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 >> Signed-off-by: Heyi Guo >> --- >> 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 >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +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 >> +#include >> #include >> #include >> #include >> @@ -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 >> +#include >> #include >> -#include >> -#include >> #include >> #include >> #include >> #include >> #include >> -#include >> #include >> #include >> #include >> -#include >> >> #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