Implementation for PlatformBootManagerLib library class interfaces.\r
\r
Copyright (C) 2015-2016, Red Hat, Inc.\r
- Copyright (c) 2014 - 2019, ARM Ltd. All rights reserved.<BR>\r
+ Copyright (c) 2014 - 2021, ARM Ltd. All rights reserved.<BR>\r
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>\r
+ Copyright (c) 2021, Semihalf All rights reserved.<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
#include <Library/UefiBootManagerLib.h>\r
#include <Library/UefiLib.h>\r
#include <Library/UefiRuntimeServicesTableLib.h>\r
+#include <Protocol/BootManagerPolicy.h>\r
#include <Protocol/DevicePath.h>\r
#include <Protocol/EsrtManagement.h>\r
#include <Protocol/GraphicsOutput.h>\r
#include <Protocol/PciIo.h>\r
#include <Protocol/PciRootBridgeIo.h>\r
#include <Protocol/PlatformBootManager.h>\r
+#include <Guid/BootDiscoveryPolicy.h>\r
#include <Guid/EventGroup.h>\r
#include <Guid/NonDiscoverableDevice.h>\r
#include <Guid/TtyTerm.h>\r
\r
#include "PlatformBm.h"\r
\r
-#define DP_NODE_LEN(Type) { (UINT8)sizeof (Type), (UINT8)(sizeof (Type) >> 8) }\r
+#define DP_NODE_LEN(Type) { (UINT8)sizeof (Type), (UINT8)(sizeof (Type) >> 8) }\r
\r
#pragma pack (1)\r
typedef struct {\r
- VENDOR_DEVICE_PATH SerialDxe;\r
- UART_DEVICE_PATH Uart;\r
- VENDOR_DEFINED_DEVICE_PATH TermType;\r
- EFI_DEVICE_PATH_PROTOCOL End;\r
+ VENDOR_DEVICE_PATH SerialDxe;\r
+ UART_DEVICE_PATH Uart;\r
+ VENDOR_DEFINED_DEVICE_PATH TermType;\r
+ EFI_DEVICE_PATH_PROTOCOL End;\r
} PLATFORM_SERIAL_CONSOLE;\r
#pragma pack ()\r
\r
-STATIC PLATFORM_SERIAL_CONSOLE mSerialConsole = {\r
+STATIC PLATFORM_SERIAL_CONSOLE mSerialConsole = {\r
//\r
// VENDOR_DEVICE_PATH SerialDxe\r
//\r
{\r
- { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, DP_NODE_LEN (VENDOR_DEVICE_PATH) },\r
+ { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, DP_NODE_LEN (VENDOR_DEVICE_PATH) },\r
EDKII_SERIAL_PORT_LIB_VENDOR_GUID\r
},\r
\r
// UART_DEVICE_PATH Uart\r
//\r
{\r
- { MESSAGING_DEVICE_PATH, MSG_UART_DP, DP_NODE_LEN (UART_DEVICE_PATH) },\r
+ { MESSAGING_DEVICE_PATH, MSG_UART_DP, DP_NODE_LEN (UART_DEVICE_PATH) },\r
0, // Reserved\r
FixedPcdGet64 (PcdUartDefaultBaudRate), // BaudRate\r
FixedPcdGet8 (PcdUartDefaultDataBits), // DataBits\r
}\r
};\r
\r
-\r
#pragma pack (1)\r
typedef struct {\r
- USB_CLASS_DEVICE_PATH Keyboard;\r
- EFI_DEVICE_PATH_PROTOCOL End;\r
+ USB_CLASS_DEVICE_PATH Keyboard;\r
+ EFI_DEVICE_PATH_PROTOCOL End;\r
} PLATFORM_USB_KEYBOARD;\r
#pragma pack ()\r
\r
-STATIC PLATFORM_USB_KEYBOARD mUsbKeyboard = {\r
+STATIC PLATFORM_USB_KEYBOARD mUsbKeyboard = {\r
//\r
// USB_CLASS_DEVICE_PATH Keyboard\r
//\r
}\r
};\r
\r
-\r
/**\r
Check if the handle satisfies a particular condition.\r
\r
**/\r
typedef\r
BOOLEAN\r
-(EFIAPI *FILTER_FUNCTION) (\r
+(EFIAPI *FILTER_FUNCTION)(\r
IN EFI_HANDLE Handle,\r
IN CONST CHAR16 *ReportText\r
);\r
\r
-\r
/**\r
Process a handle.\r
\r
**/\r
typedef\r
VOID\r
-(EFIAPI *CALLBACK_FUNCTION) (\r
+(EFIAPI *CALLBACK_FUNCTION)(\r
IN EFI_HANDLE Handle,\r
IN CONST CHAR16 *ReportText\r
);\r
STATIC\r
VOID\r
FilterAndProcess (\r
- IN EFI_GUID *ProtocolGuid,\r
- IN FILTER_FUNCTION Filter OPTIONAL,\r
- IN CALLBACK_FUNCTION Process\r
+ IN EFI_GUID *ProtocolGuid,\r
+ IN FILTER_FUNCTION Filter OPTIONAL,\r
+ IN CALLBACK_FUNCTION Process\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_HANDLE *Handles;\r
- UINTN NoHandles;\r
- UINTN Idx;\r
-\r
- Status = gBS->LocateHandleBuffer (ByProtocol, ProtocolGuid,\r
- NULL /* SearchKey */, &NoHandles, &Handles);\r
+ EFI_STATUS Status;\r
+ EFI_HANDLE *Handles;\r
+ UINTN NoHandles;\r
+ UINTN Idx;\r
+\r
+ Status = gBS->LocateHandleBuffer (\r
+ ByProtocol,\r
+ ProtocolGuid,\r
+ NULL /* SearchKey */,\r
+ &NoHandles,\r
+ &Handles\r
+ );\r
if (EFI_ERROR (Status)) {\r
//\r
// This is not an error, just an informative condition.\r
//\r
- DEBUG ((EFI_D_VERBOSE, "%a: %g: %r\n", __FUNCTION__, ProtocolGuid,\r
- Status));\r
+ DEBUG ((\r
+ DEBUG_VERBOSE,\r
+ "%a: %g: %r\n",\r
+ __FUNCTION__,\r
+ ProtocolGuid,\r
+ Status\r
+ ));\r
return;\r
}\r
\r
ASSERT (NoHandles > 0);\r
for (Idx = 0; Idx < NoHandles; ++Idx) {\r
- CHAR16 *DevicePathText;\r
- STATIC CHAR16 Fallback[] = L"<device path unavailable>";\r
+ CHAR16 *DevicePathText;\r
+ STATIC CHAR16 Fallback[] = L"<device path unavailable>";\r
\r
//\r
// The ConvertDevicePathToText() function handles NULL input transparently.\r
DevicePathText = Fallback;\r
}\r
\r
- if (Filter == NULL || Filter (Handles[Idx], DevicePathText)) {\r
+ if ((Filter == NULL) || Filter (Handles[Idx], DevicePathText)) {\r
Process (Handles[Idx], DevicePathText);\r
}\r
\r
FreePool (DevicePathText);\r
}\r
}\r
+\r
gBS->FreePool (Handles);\r
}\r
\r
-\r
/**\r
This FILTER_FUNCTION checks if a handle corresponds to a PCI display device.\r
**/\r
BOOLEAN\r
EFIAPI\r
IsPciDisplay (\r
- IN EFI_HANDLE Handle,\r
- IN CONST CHAR16 *ReportText\r
+ IN EFI_HANDLE Handle,\r
+ IN CONST CHAR16 *ReportText\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- PCI_TYPE00 Pci;\r
+ EFI_STATUS Status;\r
+ EFI_PCI_IO_PROTOCOL *PciIo;\r
+ PCI_TYPE00 Pci;\r
\r
- Status = gBS->HandleProtocol (Handle, &gEfiPciIoProtocolGuid,\r
- (VOID**)&PciIo);\r
+ Status = gBS->HandleProtocol (\r
+ Handle,\r
+ &gEfiPciIoProtocolGuid,\r
+ (VOID **)&PciIo\r
+ );\r
if (EFI_ERROR (Status)) {\r
//\r
// This is not an error worth reporting.\r
return FALSE;\r
}\r
\r
- Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0 /* Offset */,\r
- sizeof Pci / sizeof (UINT32), &Pci);\r
+ Status = PciIo->Pci.Read (\r
+ PciIo,\r
+ EfiPciIoWidthUint32,\r
+ 0 /* Offset */,\r
+ sizeof Pci / sizeof (UINT32),\r
+ &Pci\r
+ );\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "%a: %s: %r\n", __FUNCTION__, ReportText, Status));\r
+ DEBUG ((DEBUG_ERROR, "%a: %s: %r\n", __FUNCTION__, ReportText, Status));\r
return FALSE;\r
}\r
\r
return IS_PCI_DISPLAY (&Pci);\r
}\r
\r
-\r
/**\r
This FILTER_FUNCTION checks if a handle corresponds to a non-discoverable\r
USB host controller.\r
BOOLEAN\r
EFIAPI\r
IsUsbHost (\r
- IN EFI_HANDLE Handle,\r
- IN CONST CHAR16 *ReportText\r
+ IN EFI_HANDLE Handle,\r
+ IN CONST CHAR16 *ReportText\r
)\r
{\r
- NON_DISCOVERABLE_DEVICE *Device;\r
- EFI_STATUS Status;\r
+ NON_DISCOVERABLE_DEVICE *Device;\r
+ EFI_STATUS Status;\r
\r
- Status = gBS->HandleProtocol (Handle,\r
+ Status = gBS->HandleProtocol (\r
+ Handle,\r
&gEdkiiNonDiscoverableDeviceProtocolGuid,\r
- (VOID **)&Device);\r
+ (VOID **)&Device\r
+ );\r
if (EFI_ERROR (Status)) {\r
return FALSE;\r
}\r
\r
if (CompareGuid (Device->Type, &gEdkiiNonDiscoverableUhciDeviceGuid) ||\r
CompareGuid (Device->Type, &gEdkiiNonDiscoverableEhciDeviceGuid) ||\r
- CompareGuid (Device->Type, &gEdkiiNonDiscoverableXhciDeviceGuid)) {\r
+ CompareGuid (Device->Type, &gEdkiiNonDiscoverableXhciDeviceGuid))\r
+ {\r
return TRUE;\r
}\r
+\r
return FALSE;\r
}\r
\r
-\r
/**\r
This CALLBACK_FUNCTION attempts to connect a handle non-recursively, asking\r
the matching driver to produce all first-level child handles.\r
VOID\r
EFIAPI\r
Connect (\r
- IN EFI_HANDLE Handle,\r
- IN CONST CHAR16 *ReportText\r
+ IN EFI_HANDLE Handle,\r
+ IN CONST CHAR16 *ReportText\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
Status = gBS->ConnectController (\r
Handle, // ControllerHandle\r
NULL, // RemainingDevicePath -- produce all children\r
FALSE // Recursive\r
);\r
- DEBUG ((EFI_ERROR (Status) ? EFI_D_ERROR : EFI_D_VERBOSE, "%a: %s: %r\n",\r
- __FUNCTION__, ReportText, Status));\r
+ DEBUG ((\r
+ EFI_ERROR (Status) ? DEBUG_ERROR : DEBUG_VERBOSE,\r
+ "%a: %s: %r\n",\r
+ __FUNCTION__,\r
+ ReportText,\r
+ Status\r
+ ));\r
}\r
\r
-\r
/**\r
This CALLBACK_FUNCTION retrieves the EFI_DEVICE_PATH_PROTOCOL from the\r
handle, and adds it to ConOut and ErrOut.\r
VOID\r
EFIAPI\r
AddOutput (\r
- IN EFI_HANDLE Handle,\r
- IN CONST CHAR16 *ReportText\r
+ IN EFI_HANDLE Handle,\r
+ IN CONST CHAR16 *ReportText\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_STATUS Status;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
\r
DevicePath = DevicePathFromHandle (Handle);\r
if (DevicePath == NULL) {\r
- DEBUG ((EFI_D_ERROR, "%a: %s: handle %p: device path not found\n",\r
- __FUNCTION__, ReportText, Handle));\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "%a: %s: handle %p: device path not found\n",\r
+ __FUNCTION__,\r
+ ReportText,\r
+ Handle\r
+ ));\r
return;\r
}\r
\r
Status = EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "%a: %s: adding to ConOut: %r\n", __FUNCTION__,\r
- ReportText, Status));\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "%a: %s: adding to ConOut: %r\n",\r
+ __FUNCTION__,\r
+ ReportText,\r
+ Status\r
+ ));\r
return;\r
}\r
\r
Status = EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "%a: %s: adding to ErrOut: %r\n", __FUNCTION__,\r
- ReportText, Status));\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "%a: %s: adding to ErrOut: %r\n",\r
+ __FUNCTION__,\r
+ ReportText,\r
+ Status\r
+ ));\r
return;\r
}\r
\r
- DEBUG ((EFI_D_VERBOSE, "%a: %s: added to ConOut and ErrOut\n", __FUNCTION__,\r
- ReportText));\r
+ DEBUG ((\r
+ DEBUG_VERBOSE,\r
+ "%a: %s: added to ConOut and ErrOut\n",\r
+ __FUNCTION__,\r
+ ReportText\r
+ ));\r
}\r
\r
STATIC\r
VOID\r
PlatformRegisterFvBootOption (\r
- CONST EFI_GUID *FileGuid,\r
- CHAR16 *Description,\r
- UINT32 Attributes,\r
- EFI_INPUT_KEY *Key\r
+ CONST EFI_GUID *FileGuid,\r
+ CHAR16 *Description,\r
+ UINT32 Attributes,\r
+ EFI_INPUT_KEY *Key\r
)\r
{\r
- EFI_STATUS Status;\r
- INTN OptionIndex;\r
- EFI_BOOT_MANAGER_LOAD_OPTION NewOption;\r
- EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;\r
- UINTN BootOptionCount;\r
- MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode;\r
- EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_STATUS Status;\r
+ INTN OptionIndex;\r
+ EFI_BOOT_MANAGER_LOAD_OPTION NewOption;\r
+ EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;\r
+ UINTN BootOptionCount;\r
+ MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode;\r
+ EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
\r
Status = gBS->HandleProtocol (\r
gImageHandle,\r
&gEfiLoadedImageProtocolGuid,\r
- (VOID **) &LoadedImage\r
+ (VOID **)&LoadedImage\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
ASSERT (DevicePath != NULL);\r
DevicePath = AppendDevicePathNode (\r
DevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &FileNode\r
+ (EFI_DEVICE_PATH_PROTOCOL *)&FileNode\r
);\r
ASSERT (DevicePath != NULL);\r
\r
FreePool (DevicePath);\r
\r
BootOptions = EfiBootManagerGetLoadOptions (\r
- &BootOptionCount, LoadOptionTypeBoot\r
+ &BootOptionCount,\r
+ LoadOptionTypeBoot\r
);\r
\r
OptionIndex = EfiBootManagerFindLoadOption (\r
- &NewOption, BootOptions, BootOptionCount\r
+ &NewOption,\r
+ BootOptions,\r
+ BootOptionCount\r
);\r
\r
if (OptionIndex == -1) {\r
Status = EfiBootManagerAddLoadOptionVariable (&NewOption, MAX_UINTN);\r
ASSERT_EFI_ERROR (Status);\r
- Status = EfiBootManagerAddKeyOptionVariable (NULL,\r
- (UINT16)NewOption.OptionNumber, 0, Key, NULL);\r
+ Status = EfiBootManagerAddKeyOptionVariable (\r
+ NULL,\r
+ (UINT16)NewOption.OptionNumber,\r
+ 0,\r
+ Key,\r
+ NULL\r
+ );\r
ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);\r
}\r
+\r
EfiBootManagerFreeLoadOption (&NewOption);\r
EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);\r
}\r
\r
-\r
STATIC\r
VOID\r
GetPlatformOptions (\r
UINTN Index;\r
UINTN BootCount;\r
\r
- Status = gBS->LocateProtocol (&gPlatformBootManagerProtocolGuid, NULL,\r
- (VOID **)&PlatformBootManager);\r
+ Status = gBS->LocateProtocol (\r
+ &gPlatformBootManagerProtocolGuid,\r
+ NULL,\r
+ (VOID **)&PlatformBootManager\r
+ );\r
if (EFI_ERROR (Status)) {\r
return;\r
}\r
+\r
Status = PlatformBootManager->GetPlatformBootOptionsAndKeys (\r
&BootCount,\r
&BootOptions,\r
if (EFI_ERROR (Status)) {\r
return;\r
}\r
+\r
//\r
// Fetch the existent boot options. If there are none, CurrentBootCount\r
// will be zeroed.\r
// Process the platform boot options.\r
//\r
for (Index = 0; Index < BootCount; Index++) {\r
- INTN Match;\r
- UINTN BootOptionNumber;\r
+ INTN Match;\r
+ UINTN BootOptionNumber;\r
\r
//\r
// If there are any preexistent boot options, and the subject platform boot\r
MAX_UINTN\r
);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "%a: failed to register \"%s\": %r\n",\r
- __FUNCTION__, BootOptions[Index].Description, Status));\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "%a: failed to register \"%s\": %r\n",\r
+ __FUNCTION__,\r
+ BootOptions[Index].Description,\r
+ Status\r
+ ));\r
continue;\r
}\r
+\r
BootOptionNumber = BootOptions[Index].OptionNumber;\r
}\r
\r
NULL\r
);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "%a: failed to register hotkey for \"%s\": %r\n",\r
- __FUNCTION__, BootOptions[Index].Description, Status));\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "%a: failed to register hotkey for \"%s\": %r\n",\r
+ __FUNCTION__,\r
+ BootOptions[Index].Description,\r
+ Status\r
+ ));\r
}\r
}\r
+\r
EfiBootManagerFreeLoadOptions (CurrentBootOptions, CurrentBootOptionCount);\r
EfiBootManagerFreeLoadOptions (BootOptions, BootCount);\r
FreePool (BootKeys);\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_INPUT_KEY Enter;\r
- EFI_INPUT_KEY F2;\r
- EFI_INPUT_KEY Esc;\r
- EFI_BOOT_MANAGER_LOAD_OPTION BootOption;\r
+ EFI_STATUS Status;\r
+ EFI_INPUT_KEY Enter;\r
+ EFI_INPUT_KEY F2;\r
+ EFI_INPUT_KEY Esc;\r
+ EFI_BOOT_MANAGER_LOAD_OPTION BootOption;\r
\r
GetPlatformOptions ();\r
\r
//\r
Enter.ScanCode = SCAN_NULL;\r
Enter.UnicodeChar = CHAR_CARRIAGE_RETURN;\r
- Status = EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL);\r
+ Status = EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL);\r
ASSERT_EFI_ERROR (Status);\r
\r
//\r
F2.UnicodeChar = CHAR_NULL;\r
Esc.ScanCode = SCAN_ESC;\r
Esc.UnicodeChar = CHAR_NULL;\r
- Status = EfiBootManagerGetBootManagerMenu (&BootOption);\r
+ Status = EfiBootManagerGetBootManagerMenu (&BootOption);\r
ASSERT_EFI_ERROR (Status);\r
Status = EfiBootManagerAddKeyOptionVariable (\r
- NULL, (UINT16) BootOption.OptionNumber, 0, &F2, NULL\r
+ NULL,\r
+ (UINT16)BootOption.OptionNumber,\r
+ 0,\r
+ &F2,\r
+ NULL\r
);\r
ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);\r
Status = EfiBootManagerAddKeyOptionVariable (\r
- NULL, (UINT16) BootOption.OptionNumber, 0, &Esc, NULL\r
+ NULL,\r
+ (UINT16)BootOption.OptionNumber,\r
+ 0,\r
+ &Esc,\r
+ NULL\r
);\r
ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);\r
}\r
\r
-\r
//\r
// BDS Platform Functions\r
//\r
+\r
/**\r
Do the platform init, can be customized by OEM/IBV\r
Possible things that can be done in PlatformBootManagerBeforeConsole:\r
//\r
// Add the hardcoded short-form USB keyboard device path to ConIn.\r
//\r
- EfiBootManagerUpdateConsoleVariable (ConIn,\r
- (EFI_DEVICE_PATH_PROTOCOL *)&mUsbKeyboard, NULL);\r
+ EfiBootManagerUpdateConsoleVariable (\r
+ ConIn,\r
+ (EFI_DEVICE_PATH_PROTOCOL *)&mUsbKeyboard,\r
+ NULL\r
+ );\r
\r
//\r
// Add the hardcoded serial console device path to ConIn, ConOut, ErrOut.\r
//\r
- STATIC_ASSERT (FixedPcdGet8 (PcdDefaultTerminalType) == 4,\r
- "PcdDefaultTerminalType must be TTYTERM");\r
- STATIC_ASSERT (FixedPcdGet8 (PcdUartDefaultParity) != 0,\r
- "PcdUartDefaultParity must be set to an actual value, not 'default'");\r
- STATIC_ASSERT (FixedPcdGet8 (PcdUartDefaultStopBits) != 0,\r
- "PcdUartDefaultStopBits must be set to an actual value, not 'default'");\r
+ STATIC_ASSERT (\r
+ FixedPcdGet8 (PcdDefaultTerminalType) == 4,\r
+ "PcdDefaultTerminalType must be TTYTERM"\r
+ );\r
+ STATIC_ASSERT (\r
+ FixedPcdGet8 (PcdUartDefaultParity) != 0,\r
+ "PcdUartDefaultParity must be set to an actual value, not 'default'"\r
+ );\r
+ STATIC_ASSERT (\r
+ FixedPcdGet8 (PcdUartDefaultStopBits) != 0,\r
+ "PcdUartDefaultStopBits must be set to an actual value, not 'default'"\r
+ );\r
\r
CopyGuid (&mSerialConsole.TermType.Guid, &gEfiTtyTermGuid);\r
\r
- EfiBootManagerUpdateConsoleVariable (ConIn,\r
- (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, NULL);\r
- EfiBootManagerUpdateConsoleVariable (ConOut,\r
- (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, NULL);\r
- EfiBootManagerUpdateConsoleVariable (ErrOut,\r
- (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, NULL);\r
+ EfiBootManagerUpdateConsoleVariable (\r
+ ConIn,\r
+ (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole,\r
+ NULL\r
+ );\r
+ EfiBootManagerUpdateConsoleVariable (\r
+ ConOut,\r
+ (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole,\r
+ NULL\r
+ );\r
+ EfiBootManagerUpdateConsoleVariable (\r
+ ErrOut,\r
+ (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole,\r
+ NULL\r
+ );\r
\r
//\r
// Register platform-specific boot options and keyboard shortcuts.\r
VOID\r
)\r
{\r
- ESRT_MANAGEMENT_PROTOCOL *EsrtManagement;\r
- EFI_PEI_HOB_POINTERS HobPointer;\r
- EFI_CAPSULE_HEADER *CapsuleHeader;\r
- BOOLEAN NeedReset;\r
- EFI_STATUS Status;\r
+ ESRT_MANAGEMENT_PROTOCOL *EsrtManagement;\r
+ EFI_PEI_HOB_POINTERS HobPointer;\r
+ EFI_CAPSULE_HEADER *CapsuleHeader;\r
+ BOOLEAN NeedReset;\r
+ EFI_STATUS Status;\r
\r
DEBUG ((DEBUG_INFO, "%a: processing capsules ...\n", __FUNCTION__));\r
\r
- Status = gBS->LocateProtocol (&gEsrtManagementProtocolGuid, NULL,\r
- (VOID **)&EsrtManagement);\r
+ Status = gBS->LocateProtocol (\r
+ &gEsrtManagementProtocolGuid,\r
+ NULL,\r
+ (VOID **)&EsrtManagement\r
+ );\r
if (!EFI_ERROR (Status)) {\r
EsrtManagement->SyncEsrtFmp ();\r
}\r
// Find all capsule images from hob\r
//\r
HobPointer.Raw = GetHobList ();\r
- NeedReset = FALSE;\r
- while ((HobPointer.Raw = GetNextHob (EFI_HOB_TYPE_UEFI_CAPSULE,\r
- HobPointer.Raw)) != NULL) {\r
+ NeedReset = FALSE;\r
+ while ((HobPointer.Raw = GetNextHob (\r
+ EFI_HOB_TYPE_UEFI_CAPSULE,\r
+ HobPointer.Raw\r
+ )) != NULL)\r
+ {\r
CapsuleHeader = (VOID *)(UINTN)HobPointer.Capsule->BaseAddress;\r
\r
Status = ProcessCapsuleImage (CapsuleHeader);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "%a: failed to process capsule %p - %r\n",\r
- __FUNCTION__, CapsuleHeader, Status));\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "%a: failed to process capsule %p - %r\n",\r
+ __FUNCTION__,\r
+ CapsuleHeader,\r
+ Status\r
+ ));\r
return;\r
}\r
\r
- NeedReset = TRUE;\r
+ NeedReset = TRUE;\r
HobPointer.Raw = GET_NEXT_HOB (HobPointer);\r
}\r
\r
if (NeedReset) {\r
- DEBUG ((DEBUG_WARN, "%a: capsule update successful, resetting ...\n",\r
- __FUNCTION__));\r
-\r
- gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
- CpuDeadLoop();\r
+ DEBUG ((\r
+ DEBUG_WARN,\r
+ "%a: capsule update successful, resetting ...\n",\r
+ __FUNCTION__\r
+ ));\r
+\r
+ gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
+ CpuDeadLoop ();\r
}\r
}\r
\r
+#define VERSION_STRING_PREFIX L"Tianocore/EDK2 firmware version "\r
\r
-#define VERSION_STRING_PREFIX L"Tianocore/EDK2 firmware version "\r
+/**\r
+ This functions checks the value of BootDiscoverPolicy variable and\r
+ connect devices of class specified by that variable. Then it refreshes\r
+ Boot order for newly discovered boot device.\r
+\r
+ @retval EFI_SUCCESS Devices connected successfully or connection\r
+ not required.\r
+ @retval others Return values from GetVariable(), LocateProtocol()\r
+ and ConnectDeviceClass().\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+BootDiscoveryPolicyHandler (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINT32 DiscoveryPolicy;\r
+ UINT32 DiscoveryPolicyOld;\r
+ UINTN Size;\r
+ EFI_BOOT_MANAGER_POLICY_PROTOCOL *BMPolicy;\r
+ EFI_GUID *Class;\r
+\r
+ Size = sizeof (DiscoveryPolicy);\r
+ Status = gRT->GetVariable (\r
+ BOOT_DISCOVERY_POLICY_VAR,\r
+ &gBootDiscoveryPolicyMgrFormsetGuid,\r
+ NULL,\r
+ &Size,\r
+ &DiscoveryPolicy\r
+ );\r
+ if (Status == EFI_NOT_FOUND) {\r
+ DiscoveryPolicy = PcdGet32 (PcdBootDiscoveryPolicy);\r
+ Status = PcdSet32S (PcdBootDiscoveryPolicy, DiscoveryPolicy);\r
+ if (Status == EFI_NOT_FOUND) {\r
+ return EFI_SUCCESS;\r
+ } else if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ } else if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ if (DiscoveryPolicy == BDP_CONNECT_MINIMAL) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ switch (DiscoveryPolicy) {\r
+ case BDP_CONNECT_NET:\r
+ Class = &gEfiBootManagerPolicyNetworkGuid;\r
+ break;\r
+ case BDP_CONNECT_ALL:\r
+ Class = &gEfiBootManagerPolicyConnectAllGuid;\r
+ break;\r
+ default:\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "%a - Unexpected DiscoveryPolicy (0x%x). Run Minimal Discovery Policy\n",\r
+ __FUNCTION__,\r
+ DiscoveryPolicy\r
+ ));\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiBootManagerPolicyProtocolGuid,\r
+ NULL,\r
+ (VOID **)&BMPolicy\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "%a - Failed to locate gEfiBootManagerPolicyProtocolGuid."\r
+ "Driver connect will be skipped.\n",\r
+ __FUNCTION__\r
+ ));\r
+ return Status;\r
+ }\r
+\r
+ Status = BMPolicy->ConnectDeviceClass (BMPolicy, Class);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "%a - ConnectDeviceClass returns - %r\n", __FUNCTION__, Status));\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Refresh Boot Options if Boot Discovery Policy has been changed\r
+ //\r
+ Size = sizeof (DiscoveryPolicyOld);\r
+ Status = gRT->GetVariable (\r
+ BOOT_DISCOVERY_POLICY_OLD_VAR,\r
+ &gBootDiscoveryPolicyMgrFormsetGuid,\r
+ NULL,\r
+ &Size,\r
+ &DiscoveryPolicyOld\r
+ );\r
+ if ((Status == EFI_NOT_FOUND) || (DiscoveryPolicyOld != DiscoveryPolicy)) {\r
+ EfiBootManagerRefreshAllBootOption ();\r
+\r
+ Status = gRT->SetVariable (\r
+ BOOT_DISCOVERY_POLICY_OLD_VAR,\r
+ &gBootDiscoveryPolicyMgrFormsetGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ sizeof (DiscoveryPolicyOld),\r
+ &DiscoveryPolicy\r
+ );\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
\r
/**\r
Do the platform specific action after the console is ready\r
Status = BootLogoEnableLogo ();\r
if (EFI_ERROR (Status)) {\r
if (FirmwareVerLength > 0) {\r
- Print (VERSION_STRING_PREFIX L"%s\n",\r
- PcdGetPtr (PcdFirmwareVersionString));\r
+ Print (\r
+ VERSION_STRING_PREFIX L"%s\n",\r
+ PcdGetPtr (PcdFirmwareVersionString)\r
+ );\r
}\r
+\r
Print (L"Press ESCAPE for boot options ");\r
} else if (FirmwareVerLength > 0) {\r
- Status = gBS->HandleProtocol (gST->ConsoleOutHandle,\r
- &gEfiGraphicsOutputProtocolGuid, (VOID **)&GraphicsOutput);\r
+ Status = gBS->HandleProtocol (\r
+ gST->ConsoleOutHandle,\r
+ &gEfiGraphicsOutputProtocolGuid,\r
+ (VOID **)&GraphicsOutput\r
+ );\r
if (!EFI_ERROR (Status)) {\r
PosX = (GraphicsOutput->Mode->Info->HorizontalResolution -\r
(StrLen (VERSION_STRING_PREFIX) + FirmwareVerLength) *\r
EFI_GLYPH_WIDTH) / 2;\r
PosY = 0;\r
\r
- PrintXY (PosX, PosY, NULL, NULL, VERSION_STRING_PREFIX L"%s",\r
- PcdGetPtr (PcdFirmwareVersionString));\r
+ PrintXY (\r
+ PosX,\r
+ PosY,\r
+ NULL,\r
+ NULL,\r
+ VERSION_STRING_PREFIX L"%s",\r
+ PcdGetPtr (PcdFirmwareVersionString)\r
+ );\r
}\r
}\r
\r
//\r
- // Connect the rest of the devices.\r
+ // Connect device specified by BootDiscoverPolicy variable and\r
+ // refresh Boot order for newly discovered boot devices\r
//\r
- EfiBootManagerConnectAll ();\r
+ BootDiscoveryPolicyHandler ();\r
\r
//\r
// On ARM, there is currently no reason to use the phased capsule\r
//\r
HandleCapsules ();\r
\r
- //\r
- // Enumerate all possible boot options.\r
- //\r
- EfiBootManagerRefreshAllBootOption ();\r
-\r
//\r
// Register UEFI Shell\r
//\r
- Key.ScanCode = SCAN_NULL;\r
- Key.UnicodeChar = L's';\r
- PlatformRegisterFvBootOption (\r
- &gUefiShellFileGuid, L"UEFI Shell", LOAD_OPTION_ACTIVE, &Key\r
- );\r
+ Key.ScanCode = SCAN_NULL;\r
+ Key.UnicodeChar = L's';\r
+ PlatformRegisterFvBootOption (&gUefiShellFileGuid, L"UEFI Shell", 0, &Key);\r
}\r
\r
/**\r
VOID\r
EFIAPI\r
PlatformBootManagerWaitCallback (\r
- UINT16 TimeoutRemain\r
+ UINT16 TimeoutRemain\r
)\r
{\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Black;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION White;\r
- UINT16 Timeout;\r
- EFI_STATUS Status;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Black;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION White;\r
+ UINT16 Timeout;\r
+ EFI_STATUS Status;\r
\r
Timeout = PcdGet16 (PcdPlatformBootTimeOut);\r
\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_BOOT_MANAGER_LOAD_OPTION BootManagerMenu;\r
+ EFI_STATUS Status;\r
+ EFI_BOOT_MANAGER_LOAD_OPTION BootManagerMenu;\r
+ EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;\r
+ UINTN OldBootOptionCount;\r
+ UINTN NewBootOptionCount;\r
+\r
+ //\r
+ // Record the total number of boot configured boot options\r
+ //\r
+ BootOptions = EfiBootManagerGetLoadOptions (\r
+ &OldBootOptionCount,\r
+ LoadOptionTypeBoot\r
+ );\r
+ EfiBootManagerFreeLoadOptions (BootOptions, OldBootOptionCount);\r
+\r
+ //\r
+ // Connect all devices, and regenerate all boot options\r
+ //\r
+ EfiBootManagerConnectAll ();\r
+ EfiBootManagerRefreshAllBootOption ();\r
+\r
+ //\r
+ // Record the updated number of boot configured boot options\r
+ //\r
+ BootOptions = EfiBootManagerGetLoadOptions (\r
+ &NewBootOptionCount,\r
+ LoadOptionTypeBoot\r
+ );\r
+ EfiBootManagerFreeLoadOptions (BootOptions, NewBootOptionCount);\r
+\r
+ //\r
+ // If the number of configured boot options has changed, reboot\r
+ // the system so the new boot options will be taken into account\r
+ // while executing the ordinary BDS bootflow sequence.\r
+ // *Unless* persistent varstore is being emulated, since we would\r
+ // then end up in an endless reboot loop.\r
+ //\r
+ if (!PcdGetBool (PcdEmuVariableNvModeEnable)) {\r
+ if (NewBootOptionCount != OldBootOptionCount) {\r
+ DEBUG ((\r
+ DEBUG_WARN,\r
+ "%a: rebooting after refreshing all boot options\n",\r
+ __FUNCTION__\r
+ ));\r
+ gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
+ }\r
+ }\r
\r
Status = EfiBootManagerGetBootManagerMenu (&BootManagerMenu);\r
if (EFI_ERROR (Status)) {\r
return;\r
}\r
\r
- for (;;) {\r
+ for ( ; ;) {\r
EfiBootManagerBoot (&BootManagerMenu);\r
}\r
}\r