From 9f4c2cb88bbe6b3220893e7409c2f66da660183a Mon Sep 17 00:00:00 2001 From: xerxes <64154433+mhtygt211227@users.noreply.github.com> Date: Sun, 7 Mar 2021 16:35:51 +0300 Subject: [PATCH] Revert "Add Button support in uefi for all devices" This reverts commit 554d6cd39317136ba34b721c63c9c6a1cad2641d. --- .../PlatformBootManagerLib/PlatformBm.c | 600 +++++++----------- 1 file changed, 243 insertions(+), 357 deletions(-) diff --git a/sdm845Pkg/Library/PlatformBootManagerLib/PlatformBm.c b/sdm845Pkg/Library/PlatformBootManagerLib/PlatformBm.c index 0854c91..a31360f 100644 --- a/sdm845Pkg/Library/PlatformBootManagerLib/PlatformBm.c +++ b/sdm845Pkg/Library/PlatformBootManagerLib/PlatformBm.c @@ -2,15 +2,21 @@ Implementation for PlatformBootManagerLib library class interfaces. Copyright (C) 2015-2016, Red Hat, Inc. - Copyright (c) 2014 - 2019, ARM Ltd. All rights reserved.
- Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
- Copyright (c) 2016, Linaro Ltd. All rights reserved.
+ Copyright (c) 2014, ARM Ltd. All rights reserved. + Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved. + Copyright (c) 2016, Linaro Ltd. All rights reserved. + Copyright (c), 2017, Andrei Warkentin - SPDX-License-Identifier: BSD-2-Clause-Patent + 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 @@ -18,17 +24,14 @@ #include #include #include -#include +#include #include #include #include #include -#include -#include -#include #include #include -#include +#include #include "PlatformBm.h" @@ -43,13 +46,64 @@ typedef struct { } PLATFORM_SERIAL_CONSOLE; #pragma pack () +typedef struct { + VENDOR_DEVICE_PATH Custom; + USB_DEVICE_PATH Hub; + USB_DEVICE_PATH Dev; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; +} PLATFORM_USB_DEV; + +#define DW_USB_DXE_FILE_GUID { \ + 0x4bf1704c, 0x03f4, 0x46d5, \ + { 0xbc, 0xa6, 0x82, 0xfa, 0x58, 0x0b, 0xad, 0xfd } \ + } + +STATIC PLATFORM_USB_DEV mUsbHubPort = { + // + // VENDOR_DEVICE_PATH DwUsbHostDxe + // + { + { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, DP_NODE_LEN (VENDOR_DEVICE_PATH) }, + DW_USB_DXE_FILE_GUID + }, + + // + // USB_DEVICE_PATH Hub + // + { + { MESSAGING_DEVICE_PATH, MSG_USB_DP, DP_NODE_LEN (USB_DEVICE_PATH) }, + 0, 0 + }, + + // + // USB_DEVICE_PATH Dev + // + { + { MESSAGING_DEVICE_PATH, MSG_USB_DP, DP_NODE_LEN (USB_DEVICE_PATH) }, + 1, 0 + }, + + // + // EFI_DEVICE_PATH_PROTOCOL End + // + { + END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, + DP_NODE_LEN (EFI_DEVICE_PATH_PROTOCOL) + } +}; + +#define SERIAL_DXE_FILE_GUID { \ + 0xD3987D4B, 0x971A, 0x435F, \ + { 0x8C, 0xAF, 0x49, 0x67, 0xEB, 0x62, 0x72, 0x41 } \ + } + STATIC PLATFORM_SERIAL_CONSOLE mSerialConsole = { // // VENDOR_DEVICE_PATH SerialDxe // { { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, DP_NODE_LEN (VENDOR_DEVICE_PATH) }, - EDKII_SERIAL_PORT_LIB_VENDOR_GUID + SERIAL_DXE_FILE_GUID }, // @@ -218,75 +272,50 @@ FilterAndProcess ( gBS->FreePool (Handles); } - /** - This FILTER_FUNCTION checks if a handle corresponds to a PCI display device. + This CALLBACK_FUNCTION retrieves the EFI_DEVICE_PATH_PROTOCOL from the + handle, and adds it to ConOut and ErrOut. **/ STATIC -BOOLEAN +VOID EFIAPI -IsPciDisplay ( +AddOutput ( IN EFI_HANDLE Handle, IN CONST CHAR16 *ReportText ) { - EFI_STATUS Status; - EFI_PCI_IO_PROTOCOL *PciIo; - PCI_TYPE00 Pci; + EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; - Status = gBS->HandleProtocol (Handle, &gEfiPciIoProtocolGuid, - (VOID**)&PciIo); - if (EFI_ERROR (Status)) { - // - // This is not an error worth reporting. - // - return FALSE; + DevicePath = DevicePathFromHandle (Handle); + if (DevicePath == NULL) { + DEBUG ((EFI_D_ERROR, "%a: %s: handle %p: device path not found\n", + __FUNCTION__, ReportText, Handle)); + return; } - Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0 /* Offset */, - sizeof Pci / sizeof (UINT32), &Pci); + Status = EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL); if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "%a: %s: %r\n", __FUNCTION__, ReportText, Status)); - return FALSE; + DEBUG ((EFI_D_ERROR, "%a: %s: adding to ConOut: %r\n", __FUNCTION__, + ReportText, Status)); + return; } - return IS_PCI_DISPLAY (&Pci); -} - - -/** - This CALLBACK_FUNCTION attempts to connect a handle non-recursively, asking - the matching driver to produce all first-level child handles. -**/ -STATIC -VOID -EFIAPI -Connect ( - IN EFI_HANDLE Handle, - IN CONST CHAR16 *ReportText - ) -{ - EFI_STATUS Status; + Status = EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "%a: %s: adding to ErrOut: %r\n", __FUNCTION__, + ReportText, Status)); + return; + } - Status = gBS->ConnectController ( - Handle, // ControllerHandle - NULL, // DriverImageHandle - NULL, // RemainingDevicePath -- produce all children - FALSE // Recursive - ); - DEBUG ((EFI_ERROR (Status) ? EFI_D_ERROR : EFI_D_VERBOSE, "%a: %s: %r\n", - __FUNCTION__, ReportText, Status)); + DEBUG ((EFI_D_VERBOSE, "%a: %s: added to ConOut and ErrOut\n", __FUNCTION__, + ReportText)); } - -/** - This CALLBACK_FUNCTION retrieves the EFI_DEVICE_PATH_PROTOCOL from the - handle, and adds it to ConOut and ErrOut. -**/ STATIC VOID EFIAPI -AddOutput ( +AddInput ( IN EFI_HANDLE Handle, IN CONST CHAR16 *ReportText ) @@ -301,16 +330,9 @@ AddOutput ( return; } - Status = EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "%a: %s: adding to ConOut: %r\n", __FUNCTION__, - ReportText, Status)); - return; - } - - Status = EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL); + Status = EfiBootManagerUpdateConsoleVariable (ConIn, DevicePath, NULL); if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "%a: %s: adding to ErrOut: %r\n", __FUNCTION__, + DEBUG ((EFI_D_ERROR, "%a: %s: adding to ConIn: %r\n", __FUNCTION__, ReportText, Status)); return; } @@ -320,11 +342,11 @@ AddOutput ( } STATIC -VOID -PlatformRegisterFvBootOption ( - CONST EFI_GUID *FileGuid, - CHAR16 *Description, - UINT32 Attributes +INTN +PlatformRegisterBootOption ( + EFI_DEVICE_PATH_PROTOCOL *DevicePath, + CHAR16 *Description, + UINT32 Attributes ) { EFI_STATUS Status; @@ -332,25 +354,6 @@ PlatformRegisterFvBootOption ( EFI_BOOT_MANAGER_LOAD_OPTION NewOption; EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; UINTN BootOptionCount; - MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode; - EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - - Status = gBS->HandleProtocol ( - gImageHandle, - &gEfiLoadedImageProtocolGuid, - (VOID **) &LoadedImage - ); - ASSERT_EFI_ERROR (Status); - - EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid); - DevicePath = DevicePathFromHandle (LoadedImage->DeviceHandle); - ASSERT (DevicePath != NULL); - DevicePath = AppendDevicePathNode ( - DevicePath, - (EFI_DEVICE_PATH_PROTOCOL *) &FileNode - ); - ASSERT (DevicePath != NULL); Status = EfiBootManagerInitializeLoadOption ( &NewOption, @@ -363,7 +366,6 @@ PlatformRegisterFvBootOption ( 0 ); ASSERT_EFI_ERROR (Status); - FreePool (DevicePath); BootOptions = EfiBootManagerGetLoadOptions ( &BootOptionCount, LoadOptionTypeBoot @@ -376,153 +378,93 @@ PlatformRegisterFvBootOption ( if (OptionIndex == -1) { Status = EfiBootManagerAddLoadOptionVariable (&NewOption, MAX_UINTN); ASSERT_EFI_ERROR (Status); + OptionIndex = BootOptionCount; } + EfiBootManagerFreeLoadOption (&NewOption); EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); -} + return OptionIndex; +} STATIC -VOID -GetPlatformOptions ( - VOID +INTN +PlatformRegisterFvBootOption ( + CONST EFI_GUID *FileGuid, + CHAR16 *Description, + UINT32 Attributes ) { - EFI_STATUS Status; - EFI_BOOT_MANAGER_LOAD_OPTION *CurrentBootOptions; - EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; - EFI_INPUT_KEY *BootKeys; - PLATFORM_BOOT_MANAGER_PROTOCOL *PlatformBootManager; - UINTN CurrentBootOptionCount; - UINTN Index; - UINTN BootCount; - - Status = gBS->LocateProtocol (&gPlatformBootManagerProtocolGuid, NULL, - (VOID **)&PlatformBootManager); - if (EFI_ERROR (Status)) { - return; - } - Status = PlatformBootManager->GetPlatformBootOptionsAndKeys ( - &BootCount, - &BootOptions, - &BootKeys - ); - if (EFI_ERROR (Status)) { - return; - } - // - // Fetch the existent boot options. If there are none, CurrentBootCount - // will be zeroed. - // - CurrentBootOptions = EfiBootManagerGetLoadOptions ( - &CurrentBootOptionCount, - LoadOptionTypeBoot - ); - // - // Process the platform boot options. - // - for (Index = 0; Index < BootCount; Index++) { - INTN Match; - UINTN BootOptionNumber; + EFI_STATUS Status; + MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode; + EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + INTN OptionIndex; - // - // If there are any preexistent boot options, and the subject platform boot - // option is already among them, then don't try to add it. Just get its - // assigned boot option number so we can associate a hotkey with it. Note - // that EfiBootManagerFindLoadOption() deals fine with (CurrentBootOptions - // == NULL) if (CurrentBootCount == 0). - // - Match = EfiBootManagerFindLoadOption ( - &BootOptions[Index], - CurrentBootOptions, - CurrentBootOptionCount - ); - if (Match >= 0) { - BootOptionNumber = CurrentBootOptions[Match].OptionNumber; - } else { - // - // Add the platform boot options as a new one, at the end of the boot - // order. Note that if the platform provided this boot option with an - // unassigned option number, then the below function call will assign a - // number. - // - Status = EfiBootManagerAddLoadOptionVariable ( - &BootOptions[Index], - MAX_UINTN + Status = gBS->HandleProtocol ( + gImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID **) &LoadedImage + ); + ASSERT_EFI_ERROR (Status); + + EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid); + DevicePath = DevicePathFromHandle (LoadedImage->DeviceHandle); + ASSERT (DevicePath != NULL); + DevicePath = AppendDevicePathNode ( + DevicePath, + (EFI_DEVICE_PATH_PROTOCOL *) &FileNode ); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "%a: failed to register \"%s\": %r\n", - __FUNCTION__, BootOptions[Index].Description, Status)); - continue; - } - BootOptionNumber = BootOptions[Index].OptionNumber; - } + ASSERT (DevicePath != NULL); - // - // Register a hotkey with the boot option, if requested. - // - if (BootKeys[Index].UnicodeChar == L'\0') { - continue; - } + OptionIndex = PlatformRegisterBootOption (DevicePath, + Description, + Attributes); + FreePool (DevicePath); - Status = EfiBootManagerAddKeyOptionVariable ( - NULL, - BootOptionNumber, - 0, - &BootKeys[Index], - NULL - ); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "%a: failed to register hotkey for \"%s\": %r\n", - __FUNCTION__, BootOptions[Index].Description, Status)); - } - } - EfiBootManagerFreeLoadOptions (CurrentBootOptions, CurrentBootOptionCount); - EfiBootManagerFreeLoadOptions (BootOptions, BootCount); - FreePool (BootKeys); + return OptionIndex; } - - STATIC VOID PlatformRegisterOptionsAndKeys ( VOID ) { - EFI_STATUS Status; - EFI_INPUT_KEY Enter; - EFI_INPUT_KEY UP; - EFI_INPUT_KEY Esc; - EFI_BOOT_MANAGER_LOAD_OPTION BootOption; + INTN ShellOption; - GetPlatformOptions (); + ShellOption = PlatformRegisterFvBootOption( + &gUefiShellFileGuid, + L"UEFI Shell", + LOAD_OPTION_ACTIVE + ); +} - // - // Register ENTER as CONTINUE key - // - Enter.ScanCode = SCAN_NULL; - Enter.UnicodeChar = CHAR_CARRIAGE_RETURN; - Status = EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL); - ASSERT_EFI_ERROR (Status); +STATIC +VOID +PlatformRegisterSetupKey( + VOID +) +{ + EFI_STATUS Status; + EFI_INPUT_KEY PowerBtn; + EFI_BOOT_MANAGER_LOAD_OPTION BootOption; // - // Map F2 and ESC to Boot Manager Menu + // Map Power to Boot Manager Menu // - UP.ScanCode = SCAN_UP; - UP.UnicodeChar = CHAR_NULL; - Esc.ScanCode = SCAN_ESC; - Esc.UnicodeChar = CHAR_NULL; - Status = EfiBootManagerGetBootManagerMenu (&BootOption); - ASSERT_EFI_ERROR (Status); - Status = EfiBootManagerAddKeyOptionVariable ( - NULL, (UINT16) BootOption.OptionNumber, 0, &UP, NULL - ); - ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED); - Status = EfiBootManagerAddKeyOptionVariable ( - NULL, (UINT16) BootOption.OptionNumber, 0, &Esc, NULL - ); + PowerBtn.ScanCode = SCAN_NULL; + PowerBtn.UnicodeChar = CHAR_CARRIAGE_RETURN; + Status = EfiBootManagerGetBootManagerMenu(&BootOption); + ASSERT_EFI_ERROR(Status); + Status = EfiBootManagerAddKeyOptionVariable( + NULL, + (UINT16) BootOption.OptionNumber, + 0, + &PowerBtn, + NULL + ); ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED); } @@ -547,29 +489,20 @@ PlatformBootManagerBeforeConsole ( VOID ) { - // - // Signal EndOfDxe PI Event - // - EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid); - - // - // Dispatch deferred images after EndOfDxe event. - // - EfiBootManagerDispatchDeferredImages (); - - // - // Locate the PCI root bridges and make the PCI bus driver connect each, - // non-recursively. This will produce a number of child handles with PciIo on - // them. - // - FilterAndProcess (&gEfiPciRootBridgeIoProtocolGuid, NULL, Connect); - - // - // Find all display class PCI devices (using the handles from the previous - // step), and connect them non-recursively. This should produce a number of - // child handles with GOPs on them. - // - FilterAndProcess (&gEfiPciIoProtocolGuid, IsPciDisplay, Connect); + EFI_STATUS Status; + ESRT_MANAGEMENT_PROTOCOL *EsrtManagement; + + if (GetBootModeHob() == BOOT_ON_FLASH_UPDATE) { + DEBUG ((DEBUG_INFO, "ProcessCapsules Before EndOfDxe ......\n")); + Status = ProcessCapsules (); + DEBUG ((DEBUG_INFO, "ProcessCapsules returned %r\n", Status)); + } else { + Status = gBS->LocateProtocol (&gEsrtManagementProtocolGuid, NULL, + (VOID **)&EsrtManagement); + if (!EFI_ERROR (Status)) { + EsrtManagement->SyncEsrtFmp (); + } + } // // Now add the device path of all handles with GOP on them to ConOut and @@ -582,23 +515,14 @@ PlatformBootManagerBeforeConsole ( // EfiBootManagerUpdateConsoleVariable (ConIn, (EFI_DEVICE_PATH_PROTOCOL *)&mUsbKeyboard, NULL); - - EFI_HANDLE *handles; - UINTN NoHandles; - EFI_DEVICE_PATH_PROTOCOL *devicehandle; - /*CHAR16 *devicepathtxt;*/ - //EfiBootManagerUpdateConsoleVariable(ConIn, - // (EFI_DEVICE_PATH_PROTOCOL*)&gQcomKeypadDeviceGuid, NULL); - gBS->LocateHandleBuffer(ByProtocol,&gEfiSimpleTextInputExProtocolGuid,NULL, &NoHandles,&handles); - devicehandle = DevicePathFromHandle(handles[1]); - EfiBootManagerUpdateConsoleVariable (ConIn, - devicehandle, NULL);/* - devicepathtxt = ConvertDevicePathToText(devicehandle,TRUE,TRUE); - DEBUG((DEBUG_ERROR,"There are %s handles\n",devicepathtxt)); - ASSERT(0);*/ - - + // + // Now add the device path of all handles with QcomKeypadDeviceProtocolGuid + // on them to ConIn. + // + FilterAndProcess (&gEFIDroidKeypadDeviceProtocolGuid, NULL, AddInput); + // Register setup key then + PlatformRegisterSetupKey(); // // Add the hardcoded serial console device path to ConIn, ConOut, ErrOut. @@ -614,72 +538,25 @@ PlatformBootManagerBeforeConsole ( (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, NULL); // - // Register platform-specific boot options and keyboard shortcuts. + // Signal EndOfDxe PI Event // - PlatformRegisterOptionsAndKeys (); -} - -STATIC -VOID -HandleCapsules ( - VOID - ) -{ - ESRT_MANAGEMENT_PROTOCOL *EsrtManagement; - EFI_PEI_HOB_POINTERS HobPointer; - EFI_CAPSULE_HEADER *CapsuleHeader; - BOOLEAN NeedReset; - EFI_STATUS Status; - - DEBUG ((DEBUG_INFO, "%a: processing capsules ...\n", __FUNCTION__)); - - Status = gBS->LocateProtocol (&gEsrtManagementProtocolGuid, NULL, - (VOID **)&EsrtManagement); - if (!EFI_ERROR (Status)) { - EsrtManagement->SyncEsrtFmp (); - } + EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid); // - // Find all capsule images from hob + // Dispatch deferred images after EndOfDxe event and ReadyToLock installation. // - HobPointer.Raw = GetHobList (); - NeedReset = FALSE; - while ((HobPointer.Raw = GetNextHob (EFI_HOB_TYPE_UEFI_CAPSULE, - HobPointer.Raw)) != NULL) { - CapsuleHeader = (VOID *)(UINTN)HobPointer.Capsule->BaseAddress; - - Status = ProcessCapsuleImage (CapsuleHeader); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "%a: failed to process capsule %p - %r\n", - __FUNCTION__, CapsuleHeader, Status)); - return; - } - - NeedReset = TRUE; - HobPointer.Raw = GET_NEXT_HOB (HobPointer); - } - - if (NeedReset) { - DEBUG ((DEBUG_WARN, "%a: capsule update successful, resetting ...\n", - __FUNCTION__)); - - gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); - CpuDeadLoop(); - } + EfiBootManagerDispatchDeferredImages (); } - -#define VERSION_STRING_PREFIX L"Tianocore/EDK2 firmware version " - /** Do the platform specific action after the console is ready Possible things that can be done in PlatformBootManagerAfterConsole: > Console post action: - > Dynamically switch output mode from 100x31 to 80x25 for certain scenario + > Dynamically switch output mode from 100x31 to 80x25 for certain senarino > Signal console ready platform customized event > Run diagnostics like memory testing > Connect certain devices - > Dispatch additional option roms + > Dispatch aditional option roms > Special boot: e.g.: USB boot, enter UI **/ VOID @@ -688,69 +565,34 @@ PlatformBootManagerAfterConsole ( VOID ) { + ESRT_MANAGEMENT_PROTOCOL *EsrtManagement; EFI_STATUS Status; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - UINTN FirmwareVerLength; - UINTN PosX; - UINTN PosY; - - FirmwareVerLength = StrLen (PcdGetPtr (PcdFirmwareVersionString)); // // Show the splash screen. // Status = BootLogoEnableLogo (); - if (EFI_ERROR (Status)) { - if (FirmwareVerLength > 0) { - Print (VERSION_STRING_PREFIX L"%s\n", - PcdGetPtr (PcdFirmwareVersionString)); - } - Print (L"Press ESCAPE for boot options "); - } else if (FirmwareVerLength > 0) { - Status = gBS->HandleProtocol (gST->ConsoleOutHandle, - &gEfiGraphicsOutputProtocolGuid, (VOID **)&GraphicsOutput); - if (!EFI_ERROR (Status)) { - PosX = (GraphicsOutput->Mode->Info->HorizontalResolution - - (StrLen (VERSION_STRING_PREFIX) + FirmwareVerLength) * - EFI_GLYPH_WIDTH) / 2; - PosY = 0; - - PrintXY (PosX, PosY, NULL, NULL, VERSION_STRING_PREFIX L"%s", - PcdGetPtr (PcdFirmwareVersionString)); - } - } // // Connect the rest of the devices. // EfiBootManagerConnectAll (); - // - // On ARM, there is currently no reason to use the phased capsule - // update approach where some capsules are dispatched before EndOfDxe - // and some are dispatched after. So just handle all capsules here, - // when the console is up and we can actually give the user some - // feedback about what is going on. - // - HandleCapsules (); + Status = gBS->LocateProtocol (&gEsrtManagementProtocolGuid, NULL, + (VOID **)&EsrtManagement); + if (!EFI_ERROR (Status)) { + EsrtManagement->SyncEsrtFmp (); + } - // - // Enumerate all possible boot options. - // - EfiBootManagerRefreshAllBootOption (); + if (GetBootModeHob() == BOOT_ON_FLASH_UPDATE) { + DEBUG((DEBUG_INFO, "ProcessCapsules After EndOfDxe ......\n")); + Status = ProcessCapsules (); + DEBUG((DEBUG_INFO, "ProcessCapsules returned %r\n", Status)); + } - // - // Register UEFI Shell - // - - - /*PlatformRegisterFvBootOption ( - &gEfiAblFvNameGuid, L"Android Fastboot App", LOAD_OPTION_ACTIVE - );*/ - PlatformRegisterFvBootOption ( - &gUefiShellFileGuid, L"UEFI Shell", LOAD_OPTION_ACTIVE - ); + EfiBootManagerRefreshAllBootOption (); + PlatformRegisterOptionsAndKeys (); } /** @@ -778,7 +620,7 @@ PlatformBootManagerWaitCallback ( Status = BootLogoUpdateProgress ( White.Pixel, Black.Pixel, - L"Press ESCAPE for boot options", + L"Press Power Button for Setup Utility\n", White.Pixel, (Timeout - TimeoutRemain) * 100 / Timeout, 0 @@ -801,5 +643,49 @@ PlatformBootManagerUnableToBoot ( VOID ) { - return; + EFI_STATUS Status; + EFI_INPUT_KEY Key; + EFI_BOOT_MANAGER_LOAD_OPTION BootManagerMenu; + UINTN Index; + + // + // BootManagerMenu doesn't contain the correct information when return status + // is EFI_NOT_FOUND. + // + Status = EfiBootManagerGetBootManagerMenu (&BootManagerMenu); + if (EFI_ERROR (Status)) { + return; + } + // + // Normally BdsDxe does not print anything to the system console, but this is + // a last resort -- the end-user will likely not see any DEBUG messages + // logged in this situation. + // + // AsciiPrint() will NULL-check gST->ConOut internally. We check gST->ConIn + // here to see if it makes sense to request and wait for a keypress. + // + if (gST->ConIn != NULL) { + AsciiPrint ( + "%a: No bootable option or device was found.\n" + "%a: Press any key to enter the Boot Manager Menu.\n", + gEfiCallerBaseName, + gEfiCallerBaseName + ); + Status = gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &Index); + ASSERT_EFI_ERROR (Status); + ASSERT (Index == 0); + + // + // Drain any queued keys. + // + while (!EFI_ERROR (gST->ConIn->ReadKeyStroke (gST->ConIn, &Key))) { + // + // just throw away Key + // + } + } + + for (;;) { + EfiBootManagerBoot (&BootManagerMenu); + } } -- 2.45.2