From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
To: Ming Huang <heyi.guo@linaro.org>
Cc: Leif Lindholm <leif.lindholm@linaro.org>,
linaro-uefi <linaro-uefi@lists.linaro.org>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
Graeme Gregory <graeme.gregory@linaro.org>,
guoheyi@huawei.com, wanghuiqiang <wanghuiqiang@huawei.com>,
huangming <huangming23@huawei.com>,
Jason Zhang <zhangjinsong2@huawei.com>,
Mengfanrong <mengfanrong@huawei.com>,
waip23@126.com
Subject: Re: [PATCH edk2-platforms v1 03/14] Hisilicon D03/D05: Optimize the feature of BMC set boot option
Date: Sat, 20 Jan 2018 10:41:01 +0000 [thread overview]
Message-ID: <CAKv+Gu90jW9M7rYv-3GwxxN8A9mMeF04oY4EBEEyeJOSdDQSbg@mail.gmail.com> (raw)
In-Reply-To: <1516287703-35516-4-git-send-email-huangming23@huawei.com>
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
>
next prev parent reply other threads:[~2018-01-20 10:35 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-18 15:01 [PATCH edk2-platforms v1 00/14] Improve D0x platforms and bug fix Ming Huang
2018-01-18 15:01 ` [PATCH edk2-platforms v1 01/14] Hisilicon/D05: Add PPTT support Ming Huang
2018-01-20 10:16 ` Ard Biesheuvel
2018-01-22 9:16 ` Huangming (Mark)
2018-01-23 6:00 ` Huangming (Mark)
2018-01-22 13:53 ` Leif Lindholm
2018-01-22 14:15 ` Leif Lindholm
2018-01-24 13:49 ` graeme.gregory
2018-01-23 21:29 ` Jeremy Linton
2018-01-24 7:57 ` Huangming (Mark)
2018-01-25 5:56 ` Huangming (Mark)
2018-01-25 15:27 ` Jeremy Linton
2018-01-18 15:01 ` [PATCH edk2-platforms v1 02/14] Hisilicon D03/D05:Switch to Generic BDS driver Ming Huang
2018-01-20 10:27 ` Ard Biesheuvel
2018-01-22 18:38 ` Leif Lindholm
2018-01-23 6:03 ` Huangming (Mark)
2018-01-18 15:01 ` [PATCH edk2-platforms v1 03/14] Hisilicon D03/D05: Optimize the feature of BMC set boot option Ming Huang
2018-01-20 10:41 ` Ard Biesheuvel [this message]
2018-01-23 8:28 ` Huangming (Mark)
2018-01-23 10:28 ` Leif Lindholm
2018-01-23 10:51 ` Huangming (Mark)
2018-01-18 15:01 ` [PATCH edk2-platforms v1 04/14] Hisilicon D03/D05: Add capsule upgrade support Ming Huang
2018-01-20 10:50 ` Ard Biesheuvel
2018-01-23 8:53 ` Huangming (Mark)
2018-01-23 9:33 ` Ard Biesheuvel
2018-01-24 11:10 ` Huangming (Mark)
2018-01-24 11:21 ` Ard Biesheuvel
2018-01-25 0:53 ` Huangming (Mark)
2018-01-23 14:06 ` Leif Lindholm
2018-01-18 15:01 ` [PATCH edk2-platforms v1 05/14] Hisilicon D03/D05: Open SasPlatform source code Ming Huang
2018-01-20 10:57 ` Ard Biesheuvel
2018-01-23 11:01 ` Huangming (Mark)
2018-01-23 14:04 ` Leif Lindholm
2018-01-18 15:01 ` [PATCH edk2-platforms v1 06/14] Hisilicon D03/D05: Open SnpPlatform " Ming Huang
2018-01-20 11:00 ` Ard Biesheuvel
2018-01-23 11:01 ` Huangming (Mark)
2018-01-23 14:07 ` Leif Lindholm
2018-01-24 12:31 ` Huangming (Mark)
2018-01-24 13:47 ` Leif Lindholm
2018-01-18 15:01 ` [PATCH edk2-platforms v1 07/14] Hisilicon/Smbios: modify type 4 Ming Huang
2018-01-20 11:01 ` Ard Biesheuvel
2018-01-23 14:15 ` Leif Lindholm
2018-01-18 15:01 ` [PATCH edk2-platforms v1 08/14] Hisilicon/PCIe: Disable PCIe ASPM Ming Huang
2018-01-20 11:04 ` Ard Biesheuvel
2018-01-18 15:01 ` [PATCH edk2-platforms v1 09/14] Hisilicon/D05: Replace SP805Watchdog by WatchdogTimer driver Ming Huang
2018-01-20 11:05 ` Ard Biesheuvel
2018-01-23 14:21 ` Leif Lindholm
2018-01-18 15:01 ` [PATCH edk2-platforms v1 10/14] Hisilicon/D03: " Ming Huang
2018-01-20 11:05 ` Ard Biesheuvel
2018-01-23 14:21 ` Leif Lindholm
2018-01-18 15:01 ` [PATCH edk2-platforms v1 11/14] Hisilicon/D05/ACPI: Add ITS PXM Ming Huang
2018-01-20 11:06 ` Ard Biesheuvel
2018-01-18 15:01 ` [PATCH edk2-platforms v1 12/14] Hisilicon/D05/ACPI: Add Pcie, HNS and SAS PXM Ming Huang
2018-01-20 11:08 ` Ard Biesheuvel
2018-01-18 15:01 ` [PATCH edk2-platforms v1 13/14] Hisilicon/Library: Add OsBootLib Ming Huang
2018-01-20 11:11 ` Ard Biesheuvel
2018-01-23 10:23 ` Leif Lindholm
2018-01-27 1:47 ` Huangming (Mark)
2018-01-27 10:37 ` Ard Biesheuvel
2018-01-29 8:55 ` Huangming (Mark)
2018-01-29 10:19 ` Ard Biesheuvel
2018-01-29 11:16 ` Leif Lindholm
2018-02-07 21:16 ` Peter Jones
2018-02-11 6:03 ` Huangming (Mark)
2018-02-26 1:12 ` Guo Heyi
2018-01-18 15:01 ` [PATCH edk2-platforms v1 14/14] Hisilicon D03/D05: Update firmware version to 18.02 Ming Huang
2018-01-20 11:11 ` Ard Biesheuvel
2018-01-23 10:18 ` Leif Lindholm
2018-01-24 1:17 ` Huangming (Mark)
2018-01-24 7:54 ` Leif Lindholm
2018-01-22 13:26 ` [PATCH edk2-platforms v1 00/14] Improve D0x platforms and bug fix Leif Lindholm
2018-01-23 14:24 ` Leif Lindholm
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAKv+Gu90jW9M7rYv-3GwxxN8A9mMeF04oY4EBEEyeJOSdDQSbg@mail.gmail.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox