X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=Vlv2TbltDevicePkg%2FLibrary%2FPlatformBdsLib%2FBdsPlatform.c;fp=Vlv2TbltDevicePkg%2FLibrary%2FPlatformBdsLib%2FBdsPlatform.c;h=0000000000000000000000000000000000000000;hb=5347c48016f27061475fdb053e867a06ce73492f;hp=4d5997d6e9613b25618577109b6b35037e05b069;hpb=96ef5a8e30a8da33eaab09f13cc8d752342717a5;p=mirror_edk2.git diff --git a/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c b/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c deleted file mode 100644 index 4d5997d6e9..0000000000 --- a/Vlv2TbltDevicePkg/Library/PlatformBdsLib/BdsPlatform.c +++ /dev/null @@ -1,3098 +0,0 @@ -/** @file - - Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - - - -Module Name: - - BdsPlatform.c - -Abstract: - - This file include all platform action which can be customized - by IBV/OEM. - ---*/ - -#include "BdsPlatform.h" -#include "SetupMode.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "PchAccess.h" -#include "PchRegs/PchRegsSata.h" -#include -#include - -#include -#include -#include - -#include -#include - -EFI_GUID *ConnectDriverTable[] = { - &gEfiMmioDeviceProtocolGuid, - &gEfiI2cMasterProtocolGuid, - &gEfiI2cHostProtocolGuid -}; - -#define SHELL_ENVIRONMENT_INTERFACE_PROTOCOL \ - { \ - 0x47c7b221, 0xc42a, 0x11d2, 0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b \ - } -VOID *mShellImageCallbackReg = NULL; - - - -EFI_USER_PROFILE_HANDLE mCurrentUser = NULL; -EFI_EVENT mHotKeyTimerEvent = NULL; -EFI_EVENT mHitHotkeyEvent = NULL; -EFI_EVENT mUsbKeyboardConnectEvent = NULL; -BOOLEAN mHotKeyPressed = FALSE; -VOID *mHitHotkeyRegistration; -#define KEYBOARD_TIMER_INTERVAL 20000 // 0.02s - -VOID -ConnectUSBController ( - VOID - ); - -EFI_STATUS -PlatformBdsConnectSimpleConsole ( - IN BDS_CONSOLE_CONNECT_ENTRY *PlatformConsole -); - -VOID -BootIntoFirmwareInterface( - VOID - ); - -VOID -EFIAPI -PlatformBdsInitHotKeyEvent ( - VOID - ); - -VOID -EFIAPI -DisableAhciCtlr ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - UINT32 PmcDisableAddress; - UINT8 SataStorageAmount; - UINT32 SataBase; - UINT16 SataPortStatus; - - - DEBUG ((EFI_D_INFO, "Disable AHCI event is signalled\n")); - SataStorageAmount = 0; - SataBase = *(UINT32*) Context; - - // - // BayTrail-M EDS chapter 16 ---- PCI IO Register Offset 92 (SATA Port Control and Status) - // - SataPortStatus = MmioRead16 (SataBase + R_PCH_SATA_PCS); - - // - // Bit 8 EN: Port 0 Present - // - if ((SataPortStatus & 0x100) == 0x100) { - SataStorageAmount++; - } - - // - // Bit 9 EN: Port 1 Present - // - if ((SataPortStatus & 0x200) == 0x200) { - SataStorageAmount++; - } - - // - // Disable SATA controller when it sets to AHCI mode without carrying any devices - // in order to prevent AHCI yellow bang under Win device manager. - // - if (SataStorageAmount == 0) { - PmcDisableAddress = (MmioRead32 ((PCH_PCI_EXPRESS_BASE_ADDRESS + (UINT32) (31 << 15)) + R_PCH_LPC_PMC_BASE) & B_PCH_LPC_PMC_BASE_BAR) + R_PCH_PMC_FUNC_DIS; - MmioOr32 (PmcDisableAddress, B_PCH_PMC_FUNC_DIS_SATA); - S3BootScriptSaveMemWrite ( - EfiBootScriptWidthUint32, - (UINTN) PmcDisableAddress, - 1, - (VOID *) (UINTN) PmcDisableAddress - ); - } -} - -VOID -InstallReadyToLock ( - VOID - ) -{ - EFI_STATUS Status; - EFI_HANDLE Handle; - EFI_SMM_ACCESS2_PROTOCOL *SmmAccess; - EFI_ACPI_S3_SAVE_PROTOCOL *AcpiS3Save; - - // - // Install DxeSmmReadyToLock protocol prior to the processing of boot options - // - Status = gBS->LocateProtocol ( - &gEfiSmmAccess2ProtocolGuid, - NULL, - (VOID **) &SmmAccess - ); - if (!EFI_ERROR (Status)) { - - // - // Prepare S3 information, this MUST be done before DxeSmmReadyToLock - // - Status = gBS->LocateProtocol ( - &gEfiAcpiS3SaveProtocolGuid, - NULL, - (VOID **)&AcpiS3Save - ); - if (!EFI_ERROR (Status)) { - AcpiS3Save->S3Save (AcpiS3Save, NULL); - } - - Handle = NULL; - Status = gBS->InstallProtocolInterface ( - &Handle, - &gExitPmAuthProtocolGuid, - EFI_NATIVE_INTERFACE, - NULL - ); - ASSERT_EFI_ERROR (Status); - - // - // Signal EndOfDxe PI Event - // - EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid); - - Handle = NULL; - Status = gBS->InstallProtocolInterface ( - &Handle, - &gEfiDxeSmmReadyToLockProtocolGuid, - EFI_NATIVE_INTERFACE, - NULL - ); - ASSERT_EFI_ERROR (Status); - } - - return ; -} - -VOID -EFIAPI -ShellImageCallback ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - BdsSetConsoleMode (TRUE); - DEBUG ((EFI_D_INFO, "BdsEntry ShellImageCallback \n")); -} - -// -// BDS Platform Functions -// -/** - Platform Bds init. Include the platform firmware vendor, revision - and so crc check. - - @param VOID - - @retval None. - -**/ -VOID -EFIAPI -PlatformBdsInit ( - VOID - ) -{ - EFI_STATUS Status; - EFI_EVENT ShellImageEvent; - EFI_GUID ShellEnvProtocol = SHELL_ENVIRONMENT_INTERFACE_PROTOCOL; - - #ifdef __GNUC__ - SerialPortWrite((UINT8 *)">>>>BdsEntry[GCC]\r\n", 19); - #else - SerialPortWrite((UINT8 *)">>>>BdsEntry\r\n", 14); - #endif - BdsLibSaveMemoryTypeInformation (); - - // - // Before user authentication, the user identification devices need be connected - // from the platform customized device paths - // - PlatformBdsConnectAuthDevice (); - - // - // As console is not ready, the auto logon user will be identified. - // - BdsLibUserIdentify (&mCurrentUser); - - // - // Change Gop mode when boot into Shell - // - if (mShellImageCallbackReg == NULL) { - Status = gBS->CreateEvent ( - EFI_EVENT_NOTIFY_SIGNAL, - EFI_TPL_CALLBACK, - ShellImageCallback, - NULL, - &ShellImageEvent - ); - if (!EFI_ERROR (Status)) { - Status = gBS->RegisterProtocolNotify ( - &ShellEnvProtocol, - ShellImageEvent, - &mShellImageCallbackReg - ); - - DEBUG ((EFI_D_INFO, "BdsEntry ShellImageCallback \n")); - } - } -} - -EFI_STATUS -GetGopDevicePath ( - IN EFI_DEVICE_PATH_PROTOCOL *PciDevicePath, - OUT EFI_DEVICE_PATH_PROTOCOL **GopDevicePath - ) -{ - UINTN Index; - EFI_STATUS Status; - EFI_HANDLE PciDeviceHandle; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EFI_DEVICE_PATH_PROTOCOL *TempPciDevicePath; - UINTN GopHandleCount; - EFI_HANDLE *GopHandleBuffer; - - UINTN VarSize; - SYSTEM_CONFIGURATION mSystemConfiguration; - - if (PciDevicePath == NULL || GopDevicePath == NULL) { - return EFI_INVALID_PARAMETER; - } - - // - // Initialize the GopDevicePath to be PciDevicePath - // - *GopDevicePath = PciDevicePath; - TempPciDevicePath = PciDevicePath; - - Status = gBS->LocateDevicePath ( - &gEfiDevicePathProtocolGuid, - &TempPciDevicePath, - &PciDeviceHandle - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Try to connect this handle, so that GOP driver could start on this - // device and create child handles with GraphicsOutput Protocol installed - // on them, then we get device paths of these child handles and select - // them as possible console device. - // - - // - // Select display devices - // - VarSize = sizeof(SYSTEM_CONFIGURATION); - Status = gRT->GetVariable( - L"Setup", - &gEfiNormalSetupGuid, - NULL, - &VarSize, - &mSystemConfiguration - ); - if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) { - //The setup variable is corrupted - VarSize = sizeof(SYSTEM_CONFIGURATION); - Status = gRT->GetVariable( - L"SetupRecovery", - &gEfiNormalSetupGuid, - NULL, - &VarSize, - &mSystemConfiguration - ); - ASSERT_EFI_ERROR (Status); - } - - if(mSystemConfiguration.BootDisplayDevice != 0x0) - { - ACPI_ADR_DEVICE_PATH AcpiAdr; - EFI_DEVICE_PATH_PROTOCOL *MyDevicePath = NULL; - - AcpiAdr.Header.Type = ACPI_DEVICE_PATH; - AcpiAdr.Header.SubType = ACPI_ADR_DP; - - switch (mSystemConfiguration.BootDisplayDevice) { - case 1: - AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, PORT_CRT, 0); //CRT Device - break; - case 2: - AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL, PORT_B_HDMI, 0); //HDMI Device Port B - break; - case 3: - AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL, PORT_B_DP, 0); //DP PortB - break; - case 4: - AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL, PORT_C_DP, 0); //DP PortC - break; - case 5: - AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL, PORT_C_DP, 0); //eDP Port C - break; - case 6: - AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL, PORT_MIPI_A, 0); //DSI Port A - break; - case 7: - AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL, PORT_MIPI_C, 0); //DSI Port C - break; - default: - AcpiAdr.ADR= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, PORT_CRT, 0); - break; - } - - SetDevicePathNodeLength (&AcpiAdr.Header, sizeof (ACPI_ADR_DEVICE_PATH)); - - MyDevicePath = AppendDevicePathNode(MyDevicePath, (EFI_DEVICE_PATH_PROTOCOL*)&AcpiAdr); - - gBS->ConnectController ( - PciDeviceHandle, - NULL, - MyDevicePath, - FALSE - ); - - FreePool(MyDevicePath); - } - else - { - gBS->ConnectController ( - PciDeviceHandle, - NULL, - NULL, - FALSE - ); - } - - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiGraphicsOutputProtocolGuid, - NULL, - &GopHandleCount, - &GopHandleBuffer - ); - if (!EFI_ERROR (Status)) { - // - // Add all the child handles as possible Console Device - // - for (Index = 0; Index < GopHandleCount; Index++) { - Status = gBS->HandleProtocol ( - GopHandleBuffer[Index], - &gEfiDevicePathProtocolGuid, - (VOID**)&TempDevicePath - ); - if (EFI_ERROR (Status)) { - continue; - } - if (CompareMem ( - PciDevicePath, - TempDevicePath, - GetDevicePathSize (PciDevicePath) - END_DEVICE_PATH_LENGTH - ) == 0) { - // - // In current implementation, we only enable one of the child handles - // as console device, i.e. sotre one of the child handle's device - // path to variable "ConOut" - // In future, we could select all child handles to be console device - // - *GopDevicePath = TempDevicePath; - } - } - gBS->FreePool (GopHandleBuffer); - } - - return EFI_SUCCESS; -} - -/** - - Search out all the platform pci or agp video device. The function may will - find multiple video device, and return all enabled device path. - - @param PlugInPciVgaDevicePath Return the platform plug in pci video device - path if the system have plug in pci video device. - @param OnboardPciVgaDevicePath Return the platform active agp video device path - if the system have plug in agp video device or on - chip agp device. - - @retval EFI_SUCCSS Get all platform active video device path. - @retval EFI_STATUS Return the status of gBS->LocateDevicePath (), - gBS->ConnectController (), - and gBS->LocateHandleBuffer (). - -**/ -EFI_STATUS -GetPlugInPciVgaDevicePath ( - IN OUT EFI_DEVICE_PATH_PROTOCOL **PlugInPciVgaDevicePath, - IN OUT EFI_DEVICE_PATH_PROTOCOL **OnboardPciVgaDevicePath - ) -{ - EFI_STATUS Status; - EFI_HANDLE RootHandle; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - UINTN Index; - UINTN Index1; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - BOOLEAN PlugInPciVga; - EFI_PCI_IO_PROTOCOL *PciIo; - PCI_TYPE00 Pci; - - DevicePath = NULL; - PlugInPciVga = TRUE; - HandleCount = 0; - HandleBuffer = NULL; - - // - // Make all the PCI_IO protocols on PCI Seg 0 show up - // - BdsLibConnectDevicePath (gPlatformRootBridges[0]); - - Status = gBS->LocateDevicePath ( - &gEfiDevicePathProtocolGuid, - &gPlatformRootBridges[0], - &RootHandle - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = gBS->ConnectController ( - RootHandle, - NULL, - NULL, - FALSE - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Start to check all the pci io to find all possible VGA device - // - HandleCount = 0; - HandleBuffer = NULL; - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiPciIoProtocolGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - if (EFI_ERROR (Status)) { - return Status; - } - - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gEfiPciIoProtocolGuid, - (VOID**)&PciIo - ); - if (!EFI_ERROR (Status)) { - - // - // Check for all VGA device - // - Status = PciIo->Pci.Read ( - PciIo, - EfiPciIoWidthUint32, - 0, - sizeof (Pci) / sizeof (UINT32), - &Pci - ); - if (EFI_ERROR (Status)) { - continue; - } - - // - // Here we decide which VGA device to enable in PCI bus - // - // The first plugin PCI VGA card device will be present as PCI VGA - // The onchip AGP or AGP card will be present as AGP VGA - // - if (!IS_PCI_VGA (&Pci)) { - continue; - } - - // - // Set the device as the possible console out device, - // - // Below code will make every VGA device to be one - // of the possibe console out device - // - PlugInPciVga = TRUE; - gBS->HandleProtocol ( - HandleBuffer[Index], - &gEfiDevicePathProtocolGuid, - (VOID**)&DevicePath - ); - - Index1 = 0; - - while (gPlatformAllPossiblePciVgaConsole[Index1] != NULL) { - if (CompareMem ( - DevicePath, - gPlatformAllPossiblePciVgaConsole[Index1], - GetDevicePathSize (gPlatformAllPossiblePciVgaConsole[Index1]) - ) == 0) { - - // - // This device is an AGP device - // - *OnboardPciVgaDevicePath = DevicePath; - PlugInPciVga = FALSE; - break; - } - - Index1 ++; - } - - if (PlugInPciVga) { - *PlugInPciVgaDevicePath = DevicePath; - } - } - } - - FreePool (HandleBuffer); - - return EFI_SUCCESS; -} - -/** - - Find the platform active vga, and base on the policy to enable the vga as - the console out device. The policy is driven by one setup variable "VBIOS". - - None. - - @param EFI_UNSUPPORTED There is no active vga device - - @retval EFI_STATUS Return the status of BdsLibGetVariableAndSize () - -**/ -EFI_STATUS -PlatformBdsForceActiveVga ( - VOID - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *PlugInPciVgaDevicePath; - EFI_DEVICE_PATH_PROTOCOL *OnboardPciVgaDevicePath; - EFI_DEVICE_PATH_PROTOCOL *DevicePathFirst; - EFI_DEVICE_PATH_PROTOCOL *DevicePathSecond; - EFI_DEVICE_PATH_PROTOCOL *GopDevicePath; - UINTN VarSize; - SYSTEM_CONFIGURATION mSystemConfiguration; - - Status = EFI_SUCCESS; - PlugInPciVgaDevicePath = NULL; - OnboardPciVgaDevicePath = NULL; - - // - // Check the policy which is the first enabled VGA - // - GetPlugInPciVgaDevicePath (&PlugInPciVgaDevicePath, &OnboardPciVgaDevicePath); - - if (PlugInPciVgaDevicePath == NULL && OnboardPciVgaDevicePath == NULL) { - return EFI_UNSUPPORTED; - } - - VarSize = sizeof(SYSTEM_CONFIGURATION); - Status = gRT->GetVariable( - L"Setup", - &gEfiNormalSetupGuid, - NULL, - &VarSize, - &mSystemConfiguration - ); - if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) { - //The setup variable is corrupted - VarSize = sizeof(SYSTEM_CONFIGURATION); - Status = gRT->GetVariable( - L"SetupRecovery", - &gEfiNormalSetupGuid, - NULL, - &VarSize, - &mSystemConfiguration - ); - ASSERT_EFI_ERROR (Status); - } - - - if ((PlugInPciVgaDevicePath == NULL && OnboardPciVgaDevicePath != NULL) ) { - DEBUG ((EFI_D_ERROR,"Update onboard PCI VGA ...\n")); - DevicePathFirst = OnboardPciVgaDevicePath; - DevicePathSecond = PlugInPciVgaDevicePath; - goto UpdateConOut; - } - if(OnboardPciVgaDevicePath != NULL && mSystemConfiguration.PrimaryVideoAdaptor == 0) { - DEBUG ((EFI_D_ERROR,"Update onboard PCI VGA When set primary!!!...\n")); - DevicePathFirst = OnboardPciVgaDevicePath; - DevicePathSecond = PlugInPciVgaDevicePath; - goto UpdateConOut; - } - - DEBUG ((EFI_D_ERROR,"Update plug in PCI VGA ...\n")); - DevicePathFirst = PlugInPciVgaDevicePath; - DevicePathSecond = OnboardPciVgaDevicePath; - -UpdateConOut: - GetGopDevicePath (DevicePathFirst, &GopDevicePath); - DevicePathFirst = GopDevicePath; - - Status = BdsLibUpdateConsoleVariable ( - L"ConOut", - DevicePathFirst, - DevicePathSecond - ); - - return Status; -} - -VOID -UpdateConsoleResolution( - VOID - ) -{ - UINT32 HorizontalResolution; - UINT32 VerticalResolution; - SYSTEM_CONFIGURATION SystemConfiguration; - UINTN VarSize; - EFI_STATUS Status; - - - HorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution); - VerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution); - - VarSize = sizeof(SYSTEM_CONFIGURATION); - Status = gRT->GetVariable( - L"Setup", - &gEfiNormalSetupGuid, - NULL, - &VarSize, - &SystemConfiguration - ); - if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) { - //The setup variable is corrupted - VarSize = sizeof(SYSTEM_CONFIGURATION); - Status = gRT->GetVariable( - L"SetupRecovery", - &gEfiNormalSetupGuid, - NULL, - &VarSize, - &SystemConfiguration - ); - ASSERT_EFI_ERROR (Status); - } - - switch (SystemConfiguration.IgdFlatPanel) { - - case 0: - // - // Use the detault PCD values. - // - break; - - case 1: - HorizontalResolution = 640; - VerticalResolution = 480; - break; - - case 2: - HorizontalResolution = 800; - VerticalResolution = 600; - break; - - case 3: - HorizontalResolution = 1024; - VerticalResolution = 768; - break; - - case 4: - HorizontalResolution = 1280; - VerticalResolution = 1024; - break; - - case 5: - HorizontalResolution = 1366; - VerticalResolution = 768; - break; - - case 6: - HorizontalResolution = 1680; - VerticalResolution = 1050; - break; - - case 7: - HorizontalResolution = 1920; - VerticalResolution = 1200; - break; - - case 8: - HorizontalResolution = 1280; - VerticalResolution = 800; - break; - } - - PcdSet32 (PcdSetupVideoHorizontalResolution, HorizontalResolution); - PcdSet32 (PcdSetupVideoVerticalResolution, VerticalResolution); - DEBUG ((EFI_D_ERROR, "HorizontalResolution = %x; VerticalResolution = %x", HorizontalResolution, VerticalResolution)); - - return; -} - -/** - Connect the predefined platform default console device. Always try to find - and enable the vga device if have. - - @param PlatformConsole Predefined platform default console device array. - - @retval EFI_SUCCESS Success connect at least one ConIn and ConOut - device, there must have one ConOut device is - active vga device. - - @retval EFI_STATUS Return the status of - BdsLibConnectAllDefaultConsoles () - -**/ -EFI_STATUS -PlatformBdsConnectConsole ( - IN BDS_CONSOLE_CONNECT_ENTRY *PlatformConsole -) -{ - EFI_STATUS Status; - UINTN Index; - EFI_DEVICE_PATH_PROTOCOL *VarConout; - EFI_DEVICE_PATH_PROTOCOL *VarConin; - UINTN DevicePathSize; - - UpdateConsoleResolution(); - - Index = 0; - Status = EFI_SUCCESS; - DevicePathSize = 0; - VarConout = BdsLibGetVariableAndSize ( - L"ConOut", - &gEfiGlobalVariableGuid, - &DevicePathSize - ); - VarConin = BdsLibGetVariableAndSize ( - L"ConIn", - &gEfiGlobalVariableGuid, - &DevicePathSize - ); - if (VarConout == NULL || VarConin == NULL) { - // - // Have chance to connect the platform default console, - // the platform default console is the minimum device group - // the platform should support - // - while (PlatformConsole[Index].DevicePath != NULL) { - - // - // Update the console variable with the connect type - // - if ((PlatformConsole[Index].ConnectType & CONSOLE_IN) == CONSOLE_IN) { - BdsLibUpdateConsoleVariable (L"ConIn", PlatformConsole[Index].DevicePath, NULL); - } - - if ((PlatformConsole[Index].ConnectType & CONSOLE_OUT) == CONSOLE_OUT) { - BdsLibUpdateConsoleVariable (L"ConOut", PlatformConsole[Index].DevicePath, NULL); - } - - if ((PlatformConsole[Index].ConnectType & STD_ERROR) == STD_ERROR) { - BdsLibUpdateConsoleVariable (L"ErrOut", PlatformConsole[Index].DevicePath, NULL); - } - - Index ++; - } - } - - // - // Make sure we have at least one active VGA, and have the right - // active VGA in console variable - // - Status = PlatformBdsForceActiveVga (); - if (EFI_ERROR (Status)) { - return Status; - } - - DEBUG ((EFI_D_INFO, "DISPLAY INIT DONE\n")); - - // - // Connect the all the default console with current console variable - // - Status = BdsLibConnectAllDefaultConsoles (); - if (EFI_ERROR (Status)) { - return Status; - } - - return EFI_SUCCESS; -} - -/** - Connect with predefined platform connect sequence, - the OEM/IBV can customize with their own connect sequence. - - @param None. - - @retval None. - -**/ -VOID -PlatformBdsConnectSequence ( - VOID - ) -{ - UINTN Index; - - Index = 0; - - // - // Here we can get the customized platform connect sequence - // Notes: we can connect with new variable which record the - // last time boots connect device path sequence - // - while (gPlatformConnectSequence[Index] != NULL) { - - // - // Build the platform boot option - // - BdsLibConnectDevicePath (gPlatformConnectSequence[Index]); - Index ++; - } - - // - // Just use the simple policy to connect all devices - // There should be no difference between debug tip and release tip, or it will be extremely hard to debug. - // - // There is case that IdeController driver will write boot script in driver model Start() function. It will be rejected by boot script save. - // It is only found when DEBUG disabled, because we are using BdsLibConnectAll() when DEBUG enabled. - // - // So we use BdsLibConnectAll() here to make sure IdeController.Start() is invoked before InstallReadyToLock(). - // We may also consider to connect SataController only later if needed. - // - BdsLibConnectAll (); -} - -/** - - Load the predefined driver option, OEM/IBV can customize this - to load their own drivers - - @param BdsDriverLists The header of the driver option link list. - - @retval None. - -**/ -VOID -PlatformBdsGetDriverOption ( - IN OUT LIST_ENTRY *BdsDriverLists - ) -{ - UINTN Index; - - Index = 0; - - // - // Here we can get the customized platform driver option - // - while (gPlatformDriverOption[Index] != NULL) { - - // - // Build the platform boot option - // - BdsLibRegisterNewOption (BdsDriverLists, gPlatformDriverOption[Index], NULL, L"DriverOrder"); - Index ++; - } - -} - -/** - This function is used for some critical time if the the system - have no any boot option, and there is no time out for user to add - the new boot option. This can also treat as the platform default - boot option. - - @param BdsBootOptionList The header of the boot option link list. - - @retval None. - -**/ -VOID -PlatformBdsPredictBootOption ( - IN OUT LIST_ENTRY *BdsBootOptionList - ) -{ - UINTN Index; - - Index = 0; - - // - // Here give chance to get platform boot option data - // - while (gPlatformBootOption[Index] != NULL) { - - // - // Build the platform boot option - // - BdsLibRegisterNewOption (BdsBootOptionList, gPlatformBootOption[Index], NULL, L"BootOrder"); - Index ++; - } -} - -/** - Perform the platform diagnostic, such like test memory. OEM/IBV also - can customize this fuction to support specific platform diagnostic. - - @param MemoryTestLevel The memory test intensive level - @param QuietBoot Indicate if need to enable the quiet boot - @param BaseMemoryTest A pointer to BdsMemoryTest() - - @retval None. - -**/ -VOID -PlatformBdsDiagnostics ( - IN EXTENDMEM_COVERAGE_LEVEL MemoryTestLevel, - IN BOOLEAN QuietBoot, - IN BASEM_MEMORY_TEST BaseMemoryTest - ) -{ - EFI_STATUS Status; - - // - // Here we can decide if we need to show - // the diagnostics screen - // Notes: this quiet boot code should be remove - // from the graphic lib - // - if (QuietBoot) { - EnableQuietBoot (PcdGetPtr(PcdLogoFile)); - - // - // Perform system diagnostic - // - Status = BaseMemoryTest (MemoryTestLevel); - if (EFI_ERROR (Status)) { - DisableQuietBoot (); - } - - return; - } - - // - // Perform system diagnostic - // - Status = BaseMemoryTest (MemoryTestLevel); -} - - -/** - For EFI boot option, BDS separate them as six types: - 1. Network - The boot option points to the SimpleNetworkProtocol device. - Bds will try to automatically create this type boot option when enumerate. - 2. Shell - The boot option points to internal flash shell. - Bds will try to automatically create this type boot option when enumerate. - 3. Removable BlockIo - The boot option only points to the removable media - device, like USB flash disk, DVD, Floppy etc. - These device should contain a *removable* blockIo - protocol in their device handle. - Bds will try to automatically create this type boot option - when enumerate. - 4. Fixed BlockIo - The boot option only points to a Fixed blockIo device, - like HardDisk. - These device should contain a *fixed* blockIo - protocol in their device handle. - BDS will skip fixed blockIo devices, and NOT - automatically create boot option for them. But BDS - will help to delete those fixed blockIo boot option, - whose description rule conflict with other auto-created - boot options. - 5. Non-BlockIo Simplefile - The boot option points to a device whose handle - has SimpleFileSystem Protocol, but has no blockio - protocol. These devices do not offer blockIo - protocol, but BDS still can get the - \EFI\BOOT\boot{machinename}.EFI by SimpleFileSystem - Protocol. - 6. File - The boot option points to a file. These boot options are usually - created by user manually or OS loader. BDS will not delete or modify - these boot options. - - This function will enumerate all possible boot device in the system, and - automatically create boot options for Network, Shell, Removable BlockIo, - and Non-BlockIo Simplefile devices. - It will only execute once of every boot. - - @param BdsBootOptionList The header of the link list which indexed all - current boot options - - @retval EFI_SUCCESS Finished all the boot device enumerate and create - the boot option base on that boot device - - @retval EFI_OUT_OF_RESOURCES Failed to enumerate the boot device and create the boot option list -**/ -EFI_STATUS -EFIAPI -PlatformBdsLibEnumerateAllBootOption ( - IN OUT LIST_ENTRY *BdsBootOptionList - ) -{ - EFI_STATUS Status; - UINT16 FloppyNumber; - UINT16 HarddriveNumber; - UINT16 CdromNumber; - UINT16 UsbNumber; - UINT16 MiscNumber; - UINT16 ScsiNumber; - UINT16 NonBlockNumber; - UINTN NumberBlockIoHandles; - EFI_HANDLE *BlockIoHandles; - EFI_BLOCK_IO_PROTOCOL *BlkIo; - BOOLEAN Removable[2]; - UINTN RemovableIndex; - UINTN Index; - UINTN NumOfLoadFileHandles; - EFI_HANDLE *LoadFileHandles; - UINTN FvHandleCount; - EFI_HANDLE *FvHandleBuffer; - EFI_FV_FILETYPE Type; - UINTN Size; - EFI_FV_FILE_ATTRIBUTES Attributes; - UINT32 AuthenticationStatus; - EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - UINTN DevicePathType; - CHAR16 Buffer[40]; - EFI_HANDLE *FileSystemHandles; - UINTN NumberFileSystemHandles; - BOOLEAN NeedDelete; - EFI_IMAGE_DOS_HEADER DosHeader; - CHAR8 *PlatLang; - CHAR8 *LastLang; - EFI_IMAGE_OPTIONAL_HEADER_UNION HdrData; - EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr; - CHAR16 *MacStr; - CHAR16 *IPverStr; - EFI_HANDLE *NetworkHandles; - UINTN BufferSize; - - FloppyNumber = 0; - HarddriveNumber = 0; - CdromNumber = 0; - UsbNumber = 0; - MiscNumber = 0; - ScsiNumber = 0; - PlatLang = NULL; - LastLang = NULL; - ZeroMem (Buffer, sizeof (Buffer)); - - // - // If the boot device enumerate happened, just get the boot - // device from the boot order variable - // - if (mEnumBootDevice) { - GetVariable2 (LAST_ENUM_LANGUAGE_VARIABLE_NAME, &gLastEnumLangGuid, (VOID**)&LastLang, NULL); - GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&PlatLang, NULL); - ASSERT (PlatLang != NULL); - if ((LastLang != NULL) && (AsciiStrCmp (LastLang, PlatLang) == 0)) { - Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder"); - FreePool (LastLang); - FreePool (PlatLang); - return Status; - } else { - Status = gRT->SetVariable ( - LAST_ENUM_LANGUAGE_VARIABLE_NAME, - &gLastEnumLangGuid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE, - AsciiStrSize (PlatLang), - PlatLang - ); - // - // Failure to set the variable only impacts the performance next time enumerating the boot options. - // - - if (LastLang != NULL) { - FreePool (LastLang); - } - FreePool (PlatLang); - } - } - - // - // Notes: this dirty code is to get the legacy boot option from the - // BBS table and create to variable as the EFI boot option, it should - // be removed after the CSM can provide legacy boot option directly - // - REFRESH_LEGACY_BOOT_OPTIONS; - - // - // Delete invalid boot option - // - BdsDeleteAllInvalidEfiBootOption (); - - // - // Parse removable media followed by fixed media. - // The Removable[] array is used by the for-loop below to create removable media boot options - // at first, and then to create fixed media boot options. - // - Removable[0] = FALSE; - Removable[1] = TRUE; - - gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiBlockIoProtocolGuid, - NULL, - &NumberBlockIoHandles, - &BlockIoHandles - ); - - for (RemovableIndex = 0; RemovableIndex < 2; RemovableIndex++) { - for (Index = 0; Index < NumberBlockIoHandles; Index++) { - Status = gBS->HandleProtocol ( - BlockIoHandles[Index], - &gEfiBlockIoProtocolGuid, - (VOID **) &BlkIo - ); - // - // skip the logical partition - // - if (EFI_ERROR (Status) || BlkIo->Media->LogicalPartition) { - continue; - } - - // - // firstly fixed block io then the removable block io - // - if (BlkIo->Media->RemovableMedia == Removable[RemovableIndex]) { - continue; - } - DevicePath = DevicePathFromHandle (BlockIoHandles[Index]); - DevicePathType = BdsGetBootTypeFromDevicePath (DevicePath); - - switch (DevicePathType) { - case BDS_EFI_ACPI_FLOPPY_BOOT: - if (FloppyNumber != 0) { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY)), FloppyNumber); - } else { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_FLOPPY))); - } - BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer); - FloppyNumber++; - break; - - // - // Assume a removable SATA device should be the DVD/CD device, a fixed SATA device should be the Hard Drive device. - // - case BDS_EFI_MESSAGE_ATAPI_BOOT: - case BDS_EFI_MESSAGE_SATA_BOOT: - if (BlkIo->Media->RemovableMedia) { - if (CdromNumber != 0) { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD)), CdromNumber); - } else { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_CD_DVD))); - } - CdromNumber++; - } else { - if (HarddriveNumber != 0) { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE)), HarddriveNumber); - } else { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_HARDDRIVE))); - } - HarddriveNumber++; - } - DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Buffer: %S\n", Buffer)); - BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer); - break; - - case BDS_EFI_MESSAGE_USB_DEVICE_BOOT: - if (UsbNumber != 0) { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB)), UsbNumber); - } else { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_USB))); - } - BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer); - UsbNumber++; - break; - - case BDS_EFI_MESSAGE_SCSI_BOOT: - if (ScsiNumber != 0) { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI)), ScsiNumber); - } else { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_SCSI))); - } - BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer); - ScsiNumber++; - break; - - case BDS_EFI_MESSAGE_MISC_BOOT: - default: - if (MiscNumber != 0) { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC)), MiscNumber); - } else { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_MISC))); - } - BdsLibBuildOptionFromHandle (BlockIoHandles[Index], BdsBootOptionList, Buffer); - MiscNumber++; - break; - } - } - } - - if (NumberBlockIoHandles != 0) { - FreePool (BlockIoHandles); - } - - // - // If there is simple file protocol which does not consume block Io protocol, create a boot option for it here. - // - NonBlockNumber = 0; - gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiSimpleFileSystemProtocolGuid, - NULL, - &NumberFileSystemHandles, - &FileSystemHandles - ); - for (Index = 0; Index < NumberFileSystemHandles; Index++) { - Status = gBS->HandleProtocol ( - FileSystemHandles[Index], - &gEfiBlockIoProtocolGuid, - (VOID **) &BlkIo - ); - if (!EFI_ERROR (Status)) { - // - // Skip if the file system handle supports a BlkIo protocol, - // - continue; - } - - // - // Do the removable Media thing. \EFI\BOOT\boot{machinename}.EFI - // machinename is ia32, ia64, x64, ... - // - Hdr.Union = &HdrData; - NeedDelete = TRUE; - Status = BdsLibGetImageHeader ( - FileSystemHandles[Index], - EFI_REMOVABLE_MEDIA_FILE_NAME, - &DosHeader, - Hdr - ); - if (!EFI_ERROR (Status) && - EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Hdr.Pe32->FileHeader.Machine) && - Hdr.Pe32->OptionalHeader.Subsystem == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) { - NeedDelete = FALSE; - } - - if (NeedDelete) { - // - // No such file or the file is not a EFI application, delete this boot option - // - BdsLibDeleteOptionFromHandle (FileSystemHandles[Index]); - } else { - if (NonBlockNumber != 0) { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s %d", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK)), NonBlockNumber); - } else { - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NON_BLOCK))); - } - BdsLibBuildOptionFromHandle (FileSystemHandles[Index], BdsBootOptionList, Buffer); - NonBlockNumber++; - } - } - - if (NumberFileSystemHandles != 0) { - FreePool (FileSystemHandles); - } - - // - // Check if we have on flash shell - // - gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiFirmwareVolume2ProtocolGuid, - NULL, - &FvHandleCount, - &FvHandleBuffer - ); - for (Index = 0; Index < FvHandleCount; Index++) { - gBS->HandleProtocol ( - FvHandleBuffer[Index], - &gEfiFirmwareVolume2ProtocolGuid, - (VOID **) &Fv - ); - - Status = Fv->ReadFile ( - Fv, - &gUefiShellFileGuid, - NULL, - &Size, - &Type, - &Attributes, - &AuthenticationStatus - ); - if (EFI_ERROR (Status)) { - // - // Skip if no shell file in the FV - // - continue; - } - // - // Build the shell boot option - // - BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList); - } - - if (FvHandleCount != 0) { - FreePool (FvHandleBuffer); - } - - // - // Parse Network Boot Device - // - NumOfLoadFileHandles = 0; - // - // Search Load File protocol for PXE boot option. - // - gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiLoadFileProtocolGuid, - NULL, - &NumOfLoadFileHandles, - &LoadFileHandles - ); - - for (Index = 0; Index < NumOfLoadFileHandles; Index++) { - -// -//Locate EFI_DEVICE_PATH_PROTOCOL to dynamically get IPv4/IPv6 protocol information. -// - - Status = gBS->HandleProtocol ( - LoadFileHandles[Index], - &gEfiDevicePathProtocolGuid, - (VOID **) &DevicePath - ); - - ASSERT_EFI_ERROR (Status); - - while (!IsDevicePathEnd (DevicePath)) { - if ((DevicePath->Type == MESSAGING_DEVICE_PATH) && - (DevicePath->SubType == MSG_IPv4_DP)) { - - // - //Get handle infomation - // - BufferSize = 0; - NetworkHandles = NULL; - Status = gBS->LocateHandle ( - ByProtocol, - &gEfiSimpleNetworkProtocolGuid, - NULL, - &BufferSize, - NetworkHandles - ); - - if (Status == EFI_BUFFER_TOO_SMALL) { - NetworkHandles = AllocateZeroPool(BufferSize); - if (NetworkHandles == NULL) { - return (EFI_OUT_OF_RESOURCES); - } - Status = gBS->LocateHandle( - ByProtocol, - &gEfiSimpleNetworkProtocolGuid, - NULL, - &BufferSize, - NetworkHandles - ); - } - - // - //Get the MAC string - // - Status = NetLibGetMacString ( - *NetworkHandles, - NULL, - &MacStr - ); - if (EFI_ERROR (Status)) { - return Status; - } - IPverStr = L" IPv4"; - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr); - break; - } - if((DevicePath->Type == MESSAGING_DEVICE_PATH) && - (DevicePath->SubType == MSG_IPv6_DP)) { - - // - //Get handle infomation - // - BufferSize = 0; - NetworkHandles = NULL; - Status = gBS->LocateHandle ( - ByProtocol, - &gEfiSimpleNetworkProtocolGuid, - NULL, - &BufferSize, - NetworkHandles - ); - - if (Status == EFI_BUFFER_TOO_SMALL) { - NetworkHandles = AllocateZeroPool(BufferSize); - if (NetworkHandles == NULL) { - return (EFI_OUT_OF_RESOURCES); - } - Status = gBS->LocateHandle( - ByProtocol, - &gEfiSimpleNetworkProtocolGuid, - NULL, - &BufferSize, - NetworkHandles - ); - } - - // - //Get the MAC string - // - Status = NetLibGetMacString ( - *NetworkHandles, - NULL, - &MacStr - ); - if (EFI_ERROR (Status)) { - return Status; - } - IPverStr = L" IPv6"; - UnicodeSPrint (Buffer, sizeof (Buffer), L"%s%s%s", BdsLibGetStringById (STRING_TOKEN (STR_DESCRIPTION_NETWORK)),MacStr,IPverStr); - break; - } - DevicePath = NextDevicePathNode (DevicePath); - } - - BdsLibBuildOptionFromHandle (LoadFileHandles[Index], BdsBootOptionList, Buffer); - } - - if (NumOfLoadFileHandles != 0) { - FreePool (LoadFileHandles); - } - - // - // Check if we have on flash shell - // - /* gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiFirmwareVolume2ProtocolGuid, - NULL, - &FvHandleCount, - &FvHandleBuffer - ); - for (Index = 0; Index < FvHandleCount; Index++) { - gBS->HandleProtocol ( - FvHandleBuffer[Index], - &gEfiFirmwareVolume2ProtocolGuid, - (VOID **) &Fv - ); - - Status = Fv->ReadFile ( - Fv, - &gUefiShellFileGuid, - NULL, - &Size, - &Type, - &Attributes, - &AuthenticationStatus - ); - if (EFI_ERROR (Status)) { - // - // Skip if no shell file in the FV - // - continue; - } - // - // Build the shell boot option - // - BdsLibBuildOptionFromShell (FvHandleBuffer[Index], BdsBootOptionList); - } - - if (FvHandleCount != 0) { - FreePool (FvHandleBuffer); - } */ - - // - // Make sure every boot only have one time - // boot device enumerate - // - Status = BdsLibBuildOptionFromVar (BdsBootOptionList, L"BootOrder"); - mEnumBootDevice = TRUE; - - return Status; -} - - - -/** - - The function will execute with as the platform policy, current policy - is driven by boot mode. IBV/OEM can customize this code for their specific - policy action. - - @param DriverOptionList - The header of the driver option link list - @param BootOptionList - The header of the boot option link list - @param ProcessCapsules - A pointer to ProcessCapsules() - @param BaseMemoryTest - A pointer to BaseMemoryTest() - - @retval None. - -**/ -VOID -EFIAPI -PlatformBdsPolicyBehavior ( - IN OUT LIST_ENTRY *DriverOptionList, - IN OUT LIST_ENTRY *BootOptionList, - IN PROCESS_CAPSULES BdsProcessCapsules, - IN BASEM_MEMORY_TEST BaseMemoryTest - ) -{ - EFI_STATUS Status; - UINT16 Timeout; - EFI_BOOT_MODE BootMode; - BOOLEAN DeferredImageExist; - UINTN Index; - SYSTEM_CONFIGURATION SystemConfiguration; - UINTN VarSize; - PLATFORM_PCI_DEVICE_PATH *EmmcBootDevPath; - EFI_GLOBAL_NVS_AREA_PROTOCOL *GlobalNvsArea; - EFI_HANDLE FvProtocolHandle; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - UINTN Index1; - UINTN SataPciRegBase = 0; - UINT16 SataModeSelect = 0; - VOID *RegistrationExitPmAuth = NULL; - EFI_EVENT Event; - BOOLEAN IsFirstBoot; - UINT16 *BootOrder; - UINTN BootOrderSize; - ESRT_MANAGEMENT_PROTOCOL *EsrtManagement; - - Timeout = PcdGet16 (PcdPlatformBootTimeOut); - if (Timeout > 10 ) { - //we think the Timeout variable is corrupted - Timeout = 10; - } - - VarSize = sizeof(SYSTEM_CONFIGURATION); - Status = gRT->GetVariable( - NORMAL_SETUP_NAME, - &gEfiNormalSetupGuid, - NULL, - &VarSize, - &SystemConfiguration - ); - - if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) { - //The setup variable is corrupted - VarSize = sizeof(SYSTEM_CONFIGURATION); - Status = gRT->GetVariable( - L"SetupRecovery", - &gEfiNormalSetupGuid, - NULL, - &VarSize, - &SystemConfiguration - ); - ASSERT_EFI_ERROR (Status); - } - - // - // Load the driver option as the driver option list - // - PlatformBdsGetDriverOption (DriverOptionList); - - // - // Get current Boot Mode - // - BootMode = GetBootModeHob(); - - // - // No deferred images exist by default - // - DeferredImageExist = FALSE; - if ((BootMode != BOOT_WITH_MINIMAL_CONFIGURATION) && (PcdGet32(PcdFlashFvShellSize) > 0)){ - gDS->ProcessFirmwareVolume ( - (VOID *)(UINTN)PcdGet32(PcdFlashFvShellBase), - PcdGet32(PcdFlashFvShellSize), - &FvProtocolHandle - ); - } - - if (SystemConfiguration.FastBoot == 1) { - BootOrder = BdsLibGetVariableAndSize ( - L"BootOrder", - &gEfiGlobalVariableGuid, - &BootOrderSize - ); - if ((BootOrder != NULL) && (BootMode != BOOT_ON_FLASH_UPDATE)) { - // - // BootOrder exist, it means system has boot before. We can do fast boot. - // - BootMode = BOOT_WITH_MINIMAL_CONFIGURATION; - } - } - - - // - // Use eMMC to boot OS and turn on AHCI, when SATA HDD is diconnected, - // SATA AHCI CTLR device will show yellow bang, implement this solution to solve it. - // - SataPciRegBase = MmPciAddress (0, 0, PCI_DEVICE_NUMBER_PCH_SATA, 0, 0); - SataModeSelect = MmioRead16 (SataPciRegBase + R_PCH_SATA_MAP) & B_PCH_SATA_MAP_SMS_MASK; - Status = EFI_SUCCESS; - if (SataModeSelect != V_PCH_SATA_MAP_SMS_IDE) { - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, - DisableAhciCtlr, - &SataPciRegBase, - &Event - ); - if (!EFI_ERROR (Status)) { - Status = gBS->RegisterProtocolNotify ( - &gExitPmAuthProtocolGuid, - Event, - &RegistrationExitPmAuth - ); - } - } - - Status = gBS->LocateProtocol(&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtManagement); - if (EFI_ERROR(Status)) { - EsrtManagement = NULL; - } - - DEBUG ((DEBUG_INFO, "BDS: BootMode=%02x\n", BootMode)); - - switch (BootMode) { - - case BOOT_WITH_MINIMAL_CONFIGURATION: - PlatformBdsInitHotKeyEvent (); - PlatformBdsConnectSimpleConsole (gPlatformSimpleConsole); - - - // - // Check to see if it's needed to dispatch more DXE drivers. - // - for (Index = 0; Index < sizeof(ConnectDriverTable)/sizeof(EFI_GUID *); Index++) { - Status = gBS->LocateHandleBuffer ( - ByProtocol, - ConnectDriverTable[Index], - NULL, - &HandleCount, - &HandleBuffer - ); - if (!EFI_ERROR (Status)) { - for (Index1 = 0; Index1 < HandleCount; Index1++) { - gBS->ConnectController ( - HandleBuffer[Index1], - NULL, - NULL, - TRUE - ); - } - } - - if (HandleBuffer != NULL) { - FreePool (HandleBuffer); - } - - gDS->Dispatch (); - } - - // - // Locate the Global NVS Protocol. - // - Status = gBS->LocateProtocol ( - &gEfiGlobalNvsAreaProtocolGuid, - NULL, - (void **)&GlobalNvsArea - ); - if (GlobalNvsArea->Area->emmcVersion == 0){ - EmmcBootDevPath = (PLATFORM_PCI_DEVICE_PATH *)gPlatformSimpleBootOption[0]; - EmmcBootDevPath->PciDevice.Device = 0x10; - } - - // - // Connect boot device here to give time to read keyboard. - // - BdsLibConnectDevicePath (gPlatformSimpleBootOption[0]); - - // - // This is a workround for dectecting hotkey from USB keyboard. - // - gBS->Stall(KEYBOARD_TIMER_INTERVAL); - - if (mHotKeyTimerEvent != NULL) { - gBS->SetTimer ( - mHotKeyTimerEvent, - TimerCancel, - 0 - ); - gBS->CloseEvent (mHotKeyTimerEvent); - mHotKeyTimerEvent = NULL; - } - if (mHotKeyPressed) { - // - // Skip show progress count down - // - Timeout = 0xFFFF; - goto FULL_CONFIGURATION; - } - - EnableQuietBoot (PcdGetPtr(PcdLogoFile)); - if (!SystemConfiguration.QuietBoot) { - PlatformBdsDiagnostics (IGNORE, FALSE, BaseMemoryTest); - } - - - #ifdef TPM_ENABLED - TcgPhysicalPresenceLibProcessRequest(); - #endif - #ifdef FTPM_ENABLE - Tcg2PhysicalPresenceLibProcessRequest(NULL); - #endif - - if (EsrtManagement != NULL) { - EsrtManagement->LockEsrtRepository(); - } - - // - // Close boot script and install ready to lock - // - InstallReadyToLock (); - - // - // Give one chance to enter the setup if we - // select Gummiboot "Reboot Into Firmware Interface" and Fast Boot is enabled. - // - BootIntoFirmwareInterface(); - break; - - case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES: - - // - // In no-configuration boot mode, we can connect the - // console directly. - // - BdsLibConnectAllDefaultConsoles (); - PlatformBdsDiagnostics (IGNORE, TRUE, BaseMemoryTest); - - // - // Perform some platform specific connect sequence - // - PlatformBdsConnectSequence (); - - // - // As console is ready, perform user identification again. - // - if (mCurrentUser == NULL) { - PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist); - if (DeferredImageExist) { - // - // After user authentication, the deferred drivers was loaded again. - // Here, need to ensure the deferred images are connected. - // - BdsLibConnectAllDefaultConsoles (); - PlatformBdsConnectSequence (); - } - } - - if (EsrtManagement != NULL) { - EsrtManagement->LockEsrtRepository(); - } - - // - // Close boot script and install ready to lock - // - InstallReadyToLock (); - - // - // Notes: current time out = 0 can not enter the - // front page - // - PlatformBdsEnterFrontPageWithHotKey (Timeout, FALSE); - - // - // Check the boot option with the boot option list - // - BdsLibBuildOptionFromVar (BootOptionList, L"BootOrder"); - break; - - case BOOT_ON_FLASH_UPDATE: - - // - // Boot with the specific configuration - // - PlatformBdsConnectConsole (gPlatformConsole); - PlatformBdsDiagnostics (EXTENSIVE, TRUE, BaseMemoryTest); - - DEBUG((DEBUG_INFO, "ProcessCapsules Before EndOfDxe......\n")); - ProcessCapsules (); - DEBUG((DEBUG_INFO, "ProcessCapsules Done\n")); - - // - // Close boot script and install ready to lock - // - InstallReadyToLock (); - - BdsLibConnectAll (); - - // - // Perform user identification - // - if (mCurrentUser == NULL) { - PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist); - if (DeferredImageExist) { - // - // After user authentication, the deferred drivers was loaded again. - // Here, need to ensure the deferred images are connected. - // - BdsLibConnectAll (); - } - } - - if (EsrtManagement != NULL) { - EsrtManagement->SyncEsrtFmp(); - } - - DEBUG((DEBUG_INFO, "ProcessCapsules After ConnectAll......\n")); - ProcessCapsules(); - DEBUG((DEBUG_INFO, "ProcessCapsules Done\n")); - break; - - case BOOT_IN_RECOVERY_MODE: - - // - // In recovery mode, just connect platform console - // and show up the front page - // - PlatformBdsConnectConsole (gPlatformConsole); - PlatformBdsDiagnostics (EXTENSIVE, FALSE, BaseMemoryTest); - BdsLibConnectAll (); - - // - // Perform user identification - // - if (mCurrentUser == NULL) { - PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist); - if (DeferredImageExist) { - // - // After user authentication, the deferred drivers was loaded again. - // Here, need to ensure the deferred drivers are connected. - // - BdsLibConnectAll (); - } - } - - // - // Close boot script and install ready to lock - // - InstallReadyToLock (); - - // - // In recovery boot mode, we still enter to the - // frong page now - // - PlatformBdsEnterFrontPageWithHotKey (Timeout, FALSE); - break; - -FULL_CONFIGURATION: - case BOOT_WITH_FULL_CONFIGURATION: - case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS: - case BOOT_WITH_DEFAULT_SETTINGS: - default: - - // - // Connect platform console - // - Status = PlatformBdsConnectConsole (gPlatformConsole); - if (EFI_ERROR (Status)) { - - // - // Here OEM/IBV can customize with defined action - // - PlatformBdsNoConsoleAction (); - } - - // - // Chenyunh[TODO]: This is Workgroud to show the fs for uSDcard, - // Need to root cause this issue. - // - DEBUG ((DEBUG_ERROR, "Start to reconnect all driver.\n")); - BdsLibDisconnectAllEfi(); - BdsLibConnectAll (); - DEBUG ((DEBUG_ERROR, "End to reconnect all driver.\n")); - - // - // Perform some platform specific connect sequence - // - PlatformBdsConnectSequence (); - EnableQuietBoot (PcdGetPtr(PcdLogoFile)); - if (!SystemConfiguration.QuietBoot) { - PlatformBdsDiagnostics (IGNORE, FALSE, BaseMemoryTest); - } - - // - // Do a pre-delay so Hard Disk can spin up and see more logo. - // - gBS->Stall(SystemConfiguration.HddPredelay * 1000000); - - // - // Perform user identification - // - if (mCurrentUser == NULL) { - PlatformBdsUserIdentify (&mCurrentUser, &DeferredImageExist); - if (DeferredImageExist) { - // - // After user authentication, the deferred drivers was loaded again. - // Here, need to ensure the deferred drivers are connected. - // - Status = PlatformBdsConnectConsole (gPlatformConsole); - if (EFI_ERROR (Status)) { - PlatformBdsNoConsoleAction (); - } - PlatformBdsConnectSequence (); - } - } - #ifdef TPM_ENABLED - TcgPhysicalPresenceLibProcessRequest(); - #endif - #ifdef FTPM_ENABLE - Tcg2PhysicalPresenceLibProcessRequest(NULL); - #endif - - if (EsrtManagement != NULL) { - EsrtManagement->SyncEsrtFmp(); - } - // - // Close boot script and install ready to lock - // - InstallReadyToLock (); - - // - // Here we have enough time to do the enumeration of boot device - // - PlatformBdsLibEnumerateAllBootOption (BootOptionList); - - // - // Give one chance to enter the setup if we - // have the time out - // - PlatformBdsEnterFrontPageWithHotKey (Timeout, FALSE); - - // - // Give one chance to enter the setup if we - // select Gummiboot "Reboot Into Firmware Interface" - // - BootIntoFirmwareInterface(); - - // - // In default boot mode, always find all boot - // option and do enumerate all the default boot option - // - if (Timeout == 0) { - BdsLibBuildOptionFromVar (BootOptionList, L"BootOrder"); - if (IsListEmpty(BootOptionList)) { - PlatformBdsPredictBootOption (BootOptionList); - } - - return; - } - - - break; - } - - - IsFirstBoot = PcdGetBool(PcdBootState); - if (IsFirstBoot) { - PcdSetBool(PcdBootState, FALSE); - } - return; - -} - -/** - Hook point after a boot attempt succeeds. We don't expect a boot option to - return, so the UEFI 2.0 specification defines that you will default to an - interactive mode and stop processing the BootOrder list in this case. This - is alos a platform implementation and can be customized by IBV/OEM. - - @param Option Pointer to Boot Option that succeeded to boot. - - @retval None. - -**/ -VOID -EFIAPI -PlatformBdsBootSuccess ( - IN BDS_COMMON_OPTION *Option - ) -{ - CHAR16 *TmpStr; - - // - // If Boot returned with EFI_SUCCESS and there is not in the boot device - // select loop then we need to pop up a UI and wait for user input. - // - TmpStr = Option->StatusString; - if (TmpStr != NULL) { - BdsLibOutputStrings (gST->ConOut, TmpStr, Option->Description, L"\n\r", NULL); - FreePool(TmpStr); - } -} - -/** - Hook point after a boot attempt fails. - - @param Option - Pointer to Boot Option that failed to boot. - @param Status - Status returned from failed boot. - @param ExitData - Exit data returned from failed boot. - @param ExitDataSize - Exit data size returned from failed boot. - - @retval None. - -**/ -VOID -EFIAPI -PlatformBdsBootFail ( - IN BDS_COMMON_OPTION *Option, - IN EFI_STATUS Status, - IN CHAR16 *ExitData, - IN UINTN ExitDataSize - ) -{ - CHAR16 *TmpStr; - EFI_HANDLE FvProtocolHandle; - - // - // If Boot returned with failed status then we need to pop up a UI and wait - // for user input. - // - TmpStr = Option->StatusString; - if (TmpStr != NULL) { - BdsLibOutputStrings (gST->ConOut, TmpStr, Option->Description, L"\n\r", NULL); - FreePool(TmpStr); - } - if (PcdGet32(PcdFlashFvShellSize) > 0){ - gDS->ProcessFirmwareVolume ( - (VOID *)(UINTN)PcdGet32(PcdFlashFvShellBase), - PcdGet32(PcdFlashFvShellSize), - &FvProtocolHandle - ); - } - PlatformBdsConnectSequence (); -} - -/** - This function is remained for IBV/OEM to do some platform action, - if there no console device can be connected. - - @param None. - - @retval EFI_SUCCESS Direct return success now. - -**/ -EFI_STATUS -PlatformBdsNoConsoleAction ( - VOID - ) -{ - return EFI_SUCCESS; -} - -/** - This function locks the block - - @param Base The base address flash region to be locked. - -**/ -VOID -BdsLockFv ( - IN EFI_PHYSICAL_ADDRESS Base - ) -{ - EFI_FV_BLOCK_MAP_ENTRY *BlockMap; - EFI_FIRMWARE_VOLUME_HEADER *FvHeader; - EFI_PHYSICAL_ADDRESS BaseAddress; - UINT32 BlockLength; - UINTN Index; - - BaseAddress = Base - 0x400000 + 2; - FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) ((UINTN) (Base)); - BlockMap = &(FvHeader->BlockMap[0]); - - while ((BlockMap->NumBlocks != 0) && (BlockMap->Length != 0)) { - BlockLength = BlockMap->Length; - for (Index = 0; Index < BlockMap->NumBlocks; Index++) { - MmioOr8 ((UINTN) BaseAddress, 0x03); - BaseAddress += BlockLength; - } - BlockMap++; - } -} - -VOID -EFIAPI -PlatformBdsLockNonUpdatableFlash ( - VOID - ) -{ - EFI_PHYSICAL_ADDRESS Base; - - Base = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashFvMainBase); - if (Base > 0) { - BdsLockFv (Base); - } - - Base = (EFI_PHYSICAL_ADDRESS) PcdGet32 (PcdFlashFvRecoveryBase); - if (Base > 0) { - BdsLockFv (Base); - } -} - -/** - Lock the ConsoleIn device in system table. All key - presses will be ignored until the Password is typed in. The only way to - disable the password is to type it in to a ConIn device. - - @param Password Password used to lock ConIn device. - - @retval EFI_SUCCESS lock the Console In Spliter virtual handle successfully. - @retval EFI_UNSUPPORTED Password not found - -**/ -EFI_STATUS -EFIAPI -LockKeyboards ( - IN CHAR16 *Password - ) -{ - return EFI_UNSUPPORTED; -} - -/** - Connect the predefined platform default authentication devices. - - This function connects the predefined device path for authentication device, - and if the predefined device path has child device path, the child handle will - be connected too. But the child handle of the child will not be connected. - -**/ -VOID -EFIAPI -PlatformBdsConnectAuthDevice ( - VOID - ) -{ - EFI_STATUS Status; - UINTN Index; - UINTN HandleIndex; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - EFI_DEVICE_PATH_PROTOCOL *ChildDevicePath; - EFI_USER_MANAGER_PROTOCOL *Manager; - - Status = gBS->LocateProtocol ( - &gEfiUserManagerProtocolGuid, - NULL, - (VOID **) &Manager - ); - if (EFI_ERROR (Status)) { - // - // As user manager protocol is not installed, the authentication devices - // should not be connected. - // - return ; - } - - Index = 0; - while (gUserAuthenticationDevice[Index] != NULL) { - // - // Connect the platform customized device paths - // - BdsLibConnectDevicePath (gUserAuthenticationDevice[Index]); - Index++; - } - - // - // Find and connect the child device paths of the platform customized device paths - // - HandleBuffer = NULL; - for (Index = 0; gUserAuthenticationDevice[Index] != NULL; Index++) { - HandleCount = 0; - Status = gBS->LocateHandleBuffer ( - AllHandles, - NULL, - NULL, - &HandleCount, - &HandleBuffer - ); - ASSERT (!EFI_ERROR (Status)); - - // - // Find and connect the child device paths of gUserIdentificationDevice[Index] - // - for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) { - ChildDevicePath = NULL; - Status = gBS->HandleProtocol ( - HandleBuffer[HandleIndex], - &gEfiDevicePathProtocolGuid, - (VOID **) &ChildDevicePath - ); - if (EFI_ERROR (Status) || ChildDevicePath == NULL) { - continue; - } - - if (CompareMem ( - ChildDevicePath, - gUserAuthenticationDevice[Index], - (GetDevicePathSize (gUserAuthenticationDevice[Index]) - sizeof (EFI_DEVICE_PATH_PROTOCOL)) - ) != 0) { - continue; - } - gBS->ConnectController ( - HandleBuffer[HandleIndex], - NULL, - NULL, - TRUE - ); - } - } - - if (HandleBuffer != NULL) { - FreePool (HandleBuffer); - } -} - -/** - This function is to identify a user, and return whether deferred images exist. - - @param[out] User Point to user profile handle. - @param[out] DeferredImageExist On return, points to TRUE if the deferred image - exist or FALSE if it did not exist. - -**/ -VOID -EFIAPI -PlatformBdsUserIdentify ( - OUT EFI_USER_PROFILE_HANDLE *User, - OUT BOOLEAN *DeferredImageExist - ) -{ - EFI_STATUS Status; - EFI_DEFERRED_IMAGE_LOAD_PROTOCOL *DeferredImage; - UINTN HandleCount; - EFI_HANDLE *HandleBuf; - UINTN Index; - UINTN DriverIndex; - EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath; - VOID *DriverImage; - UINTN ImageSize; - BOOLEAN BootOption; - - // - // Perform user identification - // - do { - Status = BdsLibUserIdentify (User); - } while (EFI_ERROR (Status)); - - // - // After user authentication now, try to find whether deferred image exists - // - HandleCount = 0; - HandleBuf = NULL; - *DeferredImageExist = FALSE; - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiDeferredImageLoadProtocolGuid, - NULL, - &HandleCount, - &HandleBuf - ); - if (EFI_ERROR (Status)) { - return ; - } - - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol ( - HandleBuf[Index], - &gEfiDeferredImageLoadProtocolGuid, - (VOID **) &DeferredImage - ); - if (!EFI_ERROR (Status)) { - // - // Find whether deferred image exists in this instance. - // - DriverIndex = 0; - Status = DeferredImage->GetImageInfo( - DeferredImage, - DriverIndex, - &ImageDevicePath, - (VOID **) &DriverImage, - &ImageSize, - &BootOption - ); - if (!EFI_ERROR (Status)) { - // - // The deferred image is found. - // - FreePool (HandleBuf); - *DeferredImageExist = TRUE; - return ; - } - } - } - - FreePool (HandleBuf); -} - -UINTN gHotKey = 0; - - -EFI_STATUS -ShowProgressHotKey ( - IN UINT16 TimeoutDefault - ) -{ - CHAR16 *TmpStr; - UINT16 TimeoutRemain; - EFI_STATUS Status; - EFI_INPUT_KEY Key; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color; - UINT32 GpioValue; - CHAR16 *TmpStr1; - CHAR16 *TmpStr2; - CHAR16 *TmpStr3; - UINTN TmpStrSize; - VOID *Buffer; - UINTN Size; - - if (TimeoutDefault == 0) { - return EFI_TIMEOUT; - } - - gST->ConOut->SetAttribute(gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)); - - if (DebugAssertEnabled()) - { - DEBUG ((EFI_D_INFO, "\n\nStart showing progress bar... Press any key to stop it, or press or to enter setup page! ...Zzz....\n")); - } - else - { - #ifdef __GNUC__ - SerialPortWrite((UINT8 *)"\n\n>>>>Start boot option, Press or to enter setup page(5 Sec)[GCC]", 76); - #else - SerialPortWrite((UINT8 *)"\n\n>>>>Start boot option, Press or to enter setup page(5 Sec)", 71); - #endif - } - SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff); - SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0); - SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff); - - TmpStr2 = NULL; - TmpStr3 = NULL; - - // - // Check if the platform is using test key. - // - Status = GetSectionFromAnyFv( - PcdGetPtr(PcdEdkiiRsa2048Sha256TestPublicKeyFileGuid), - EFI_SECTION_RAW, - 0, - &Buffer, - &Size - ); - if (!EFI_ERROR(Status)) { - if ((Size == PcdGetSize(PcdRsa2048Sha256PublicKeyBuffer)) && - (CompareMem(Buffer, PcdGetPtr(PcdRsa2048Sha256PublicKeyBuffer), Size) == 0)) { - TmpStr2 = L"WARNING: Recovery Test Key is used.\r\n"; - if (DebugAssertEnabled()) { - DEBUG ((DEBUG_INFO, "\n\nWARNING: Recovery Test Key is used.\n")); - } else { - SerialPortWrite((UINT8 *)"\n\nWARNING: Recovery Test Key is used.", sizeof("\n\nWARNING: Recovery Test Key is used.")); - } - PcdSetBoolS(PcdTestKeyUsed, TRUE); - } - FreePool(Buffer); - } - Status = GetSectionFromAnyFv( - PcdGetPtr(PcdEdkiiPkcs7TestPublicKeyFileGuid), - EFI_SECTION_RAW, - 0, - &Buffer, - &Size - ); - if (!EFI_ERROR(Status)) { - if ((Size == PcdGetSize(PcdPkcs7CertBuffer)) && - (CompareMem(Buffer, PcdGetPtr(PcdPkcs7CertBuffer), Size) == 0)) { - TmpStr3 = L"WARNING: Capsule Test Key is used.\r\n"; - if (DebugAssertEnabled()) { - DEBUG ((DEBUG_INFO, "\n\nWARNING: Capsule Test Key is used.\r\n")); - } else { - SerialPortWrite((UINT8 *)"\n\nWARNING: Capsule Test Key is used.", sizeof("\n\nWARNING: Capsule Test Key is used.")); - } - PcdSetBoolS(PcdTestKeyUsed, TRUE); - } - FreePool(Buffer); - } - - // - // Clear the progress status bar first - // - TmpStr1 = L"Start boot option, Press or to enter setup page.\r\n"; - TmpStrSize = StrSize(TmpStr1); - if (TmpStr2 != NULL) { - TmpStrSize += StrSize(TmpStr2); - } - if (TmpStr3 != NULL) { - TmpStrSize += StrSize(TmpStr3); - } - TmpStr = AllocatePool (TmpStrSize); - if (TmpStr == NULL) { - TmpStr = TmpStr1; - } else { - StrCpyS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr1); - if (TmpStr2 != NULL) { - StrCatS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr2); - } - if (TmpStr3 != NULL) { - StrCatS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr3); - } - } - PlatformBdsShowProgress (Foreground, Background, TmpStr, Color, 0, 0); - - TimeoutRemain = TimeoutDefault; - while (TimeoutRemain != 0) { - if (DebugAssertEnabled()) - { - DEBUG ((EFI_D_INFO, "Showing progress bar...Remaining %d second!\n", TimeoutRemain)); - } - else - { - SerialPortWrite ((UINT8 *)".", 1); - } - Status = WaitForSingleEvent (gST->ConIn->WaitForKey, ONE_SECOND); - if (Status != EFI_TIMEOUT) { - break; - } - TimeoutRemain--; - - // - // Show progress - // - if (TmpStr != NULL) { - PlatformBdsShowProgress ( - Foreground, - Background, - TmpStr, - Color, - ((TimeoutDefault - TimeoutRemain) * 100 / TimeoutDefault), - 0 - ); - } - } - - // - // Timeout expired - // - if (TimeoutRemain == 0) { - if (DebugAssertEnabled()) - { - } - else - { - SerialPortWrite ((UINT8 *)"\r\n", 2); - } - return EFI_TIMEOUT; - } - - // - // User pressed some key - // - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Check Volume Up Key to enter Setup - // - GpioValue = MmioRead32 (IO_BASE_ADDRESS + 0x0668); // The value of GPIOC_5 - if (((GpioValue & BIT0) == 0) && (Key.ScanCode == SCAN_UP)) { - gHotKey = 0; - return EFI_SUCCESS; - } - - if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) { - // - // User pressed enter, equivalent to select "continue" - // - return EFI_TIMEOUT; - } - - // - //F2 -- Front Page - //F5 -- Device Manager - //F7 -- Boot Manager - // do not use F8. generally people assume it is windows safe mode key. - //F9 -- Boot order - // - DEBUG ((EFI_D_INFO, "[Key Pressed]: ScanCode 0x%x\n", Key.ScanCode)); - switch(Key.ScanCode) { - case SCAN_F2: - gHotKey = 0; - break; - - case SCAN_DELETE: - gHotKey = 0; - break; - - case SCAN_F5: - gHotKey = FRONT_PAGE_KEY_DEVICE_MANAGER; - break; - - case SCAN_F7: - gHotKey = FRONT_PAGE_KEY_BOOT_MANAGER; - break; - - case SCAN_F9: - gHotKey = FRONT_PAGE_KEY_BOOT_MAINTAIN; - break; - - default: - //set gHotKey to continue so that flow will not go into CallFrontPage - gHotKey = FRONT_PAGE_KEY_CONTINUE; - return EFI_TIMEOUT; - break; - } - - return EFI_SUCCESS; -} - - - -/** - This function is the main entry of the platform setup entry. - The function will present the main menu of the system setup, - this is the platform reference part and can be customize. - - - @param TimeoutDefault The fault time out value before the system - continue to boot. - @param ConnectAllHappened The indicater to check if the connect all have - already happened. - -**/ -VOID -PlatformBdsEnterFrontPageWithHotKey ( - IN UINT16 TimeoutDefault, - IN BOOLEAN ConnectAllHappened - ) -{ - EFI_STATUS Status; - - EFI_STATUS LogoStatus; - EFI_BOOT_LOGO_PROTOCOL *BootLogo; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut; - UINTN BootTextColumn; - UINTN BootTextRow; - - GraphicsOutput = NULL; - SimpleTextOut = NULL; - - PERF_START (NULL, "BdsTimeOut", "BDS", 0); - - // - // Indicate if we need connect all in the platform setup - // - if (ConnectAllHappened) { - gConnectAllHappened = TRUE; - } - - if (!mModeInitialized) { - // - // After the console is ready, get current video resolution - // and text mode before launching setup at first time. - // - Status = gBS->HandleProtocol ( - gST->ConsoleOutHandle, - &gEfiGraphicsOutputProtocolGuid, - (VOID**)&GraphicsOutput - ); - if (EFI_ERROR (Status)) { - GraphicsOutput = NULL; - } - - Status = gBS->HandleProtocol ( - gST->ConsoleOutHandle, - &gEfiSimpleTextOutProtocolGuid, - (VOID**)&SimpleTextOut - ); - if (EFI_ERROR (Status)) { - SimpleTextOut = NULL; - } - - if (GraphicsOutput != NULL) { - // - // Get current video resolution and text mode. - // - mBootHorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution; - mBootVerticalResolution = GraphicsOutput->Mode->Info->VerticalResolution; - } - - if (SimpleTextOut != NULL) { - Status = SimpleTextOut->QueryMode ( - SimpleTextOut, - SimpleTextOut->Mode->Mode, - &BootTextColumn, - &BootTextRow - ); - mBootTextModeColumn = (UINT32)BootTextColumn; - mBootTextModeRow = (UINT32)BootTextRow; - } - - // - // Get user defined text mode for setup. - // - mSetupHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution); - mSetupVerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution); - mSetupTextModeColumn = PcdGet32 (PcdSetupConOutColumn); - mSetupTextModeRow = PcdGet32 (PcdSetupConOutRow); - - mModeInitialized = TRUE; - } - - if (TimeoutDefault != 0xffff) { - Status = ShowProgressHotKey (TimeoutDefault); - - // - // Ensure screen is clear when switch Console from Graphics mode to Text mode - // - gST->ConOut->EnableCursor (gST->ConOut, TRUE); - gST->ConOut->ClearScreen (gST->ConOut); - - // - // Boot Logo is corrupted, report it using Boot Logo protocol. - // - LogoStatus = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo); - if (!EFI_ERROR (LogoStatus) && (BootLogo != NULL)) { - BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0); - } - - if (EFI_ERROR (Status)) { - // - // Timeout or user press enter to continue - // - goto Exit; - } - } - - // - // Install BM HiiPackages. - // Keep BootMaint HiiPackage, so that it can be covered by global setting. - // - InitBMPackage (); - do { - - BdsSetConsoleMode (TRUE); - - InitializeFrontPage (FALSE); - - // - // Update Front Page strings - // - UpdateFrontPageStrings (); - - Status = EFI_SUCCESS; - gCallbackKey = 0; - if (gHotKey == 0) { - Status = CallFrontPage (); - } else { - gCallbackKey = gHotKey; - gHotKey = 0; - } - - // - // If gCallbackKey is greater than 1 and less or equal to 5, - // it will launch configuration utilities. - // 2 = set language - // 3 = boot manager - // 4 = device manager - // 5 = boot maintenance manager - // - if (gCallbackKey != 0) { - REPORT_STATUS_CODE ( - EFI_PROGRESS_CODE, - (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_USER_SETUP) - ); - } - - // - // Based on the key that was set, we can determine what to do - // - switch (gCallbackKey) { - // - // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can - // describe to their customers in documentation how to find their setup information (namely - // under the device manager and specific buckets) - // - // These entries consist of the Continue, Select language, Boot Manager, and Device Manager - // - case FRONT_PAGE_KEY_CONTINUE: - - // - // User hit continue - // - break; - - case FRONT_PAGE_KEY_LANGUAGE: - - // - // User made a language setting change - display front page again - // - break; - - case FRONT_PAGE_KEY_BOOT_MANAGER: - // - // Remove the installed BootMaint HiiPackages when exit. - // - FreeBMPackage (); - - // - // User chose to run the Boot Manager - // - CallBootManager (); - - // - // Reinstall BootMaint HiiPackages after exiting from Boot Manager. - // - InitBMPackage (); - break; - - case FRONT_PAGE_KEY_DEVICE_MANAGER: - - // - // Display the Device Manager - // - do { - CallDeviceManager (); - } while (gCallbackKey == FRONT_PAGE_KEY_DEVICE_MANAGER); - break; - - case FRONT_PAGE_KEY_BOOT_MAINTAIN: - - // - // Display the Boot Maintenance Manager - // - BdsStartBootMaint (); - break; - } - - } while (((UINTN)gCallbackKey) != FRONT_PAGE_KEY_CONTINUE); - - // - //Will leave browser, check any reset required change is applied? if yes, reset system - // - SetupResetReminder (); - // - // Remove the installed BootMaint HiiPackages when exit. - // - FreeBMPackage (); - -Exit: - // - // Automatically load current entry - // Note: The following lines of code only execute when Auto boot - // takes affect - // - PERF_END (NULL, "BdsTimeOut", "BDS", 0); -} - - -VOID -BootIntoFirmwareInterface( -VOID -) -{ - EFI_STATUS Status; - UINTN DataSize; - UINT16 Timeout; - UINT64 OsIndication; - - - OsIndication = 0; - DataSize = sizeof(UINT64); - Status = gRT->GetVariable ( - L"OsIndications", - &gEfiGlobalVariableGuid, - NULL, - &DataSize, - &OsIndication - ); - - DEBUG ((EFI_D_INFO, "OSIndication Variable Value %d\n", OsIndication)); - // - //Goto FrontPage directly when bit EFI_OS_INDICATIONS_BOOT_TO_FW_UI in OSIndication Variable is setted. - // - if (!EFI_ERROR(Status) && (OsIndication != 0)) { - Timeout = 0xffff; - PlatformBdsEnterFrontPage (Timeout, FALSE); - } -} - - -EFI_STATUS -PlatformBdsConnectSimpleConsole ( - IN BDS_CONSOLE_CONNECT_ENTRY *PlatformConsole -) -{ - EFI_STATUS Status; - UINTN Index; - EFI_DEVICE_PATH_PROTOCOL *VarConout; - EFI_DEVICE_PATH_PROTOCOL *VarConin; - UINTN DevicePathSize; - - - Index = 0; - Status = EFI_SUCCESS; - DevicePathSize = 0; - VarConout = BdsLibGetVariableAndSize ( - L"ConOut", - &gEfiGlobalVariableGuid, - &DevicePathSize - ); - VarConin = BdsLibGetVariableAndSize ( - L"ConIn", - &gEfiGlobalVariableGuid, - &DevicePathSize - ); - if (VarConout == NULL || VarConin == NULL) { - // - // Have chance to connect the platform default console, - // the platform default console is the minimum device group - // the platform should support - // - while (PlatformConsole[Index].DevicePath != NULL) { - - // - // Update the console variable with the connect type - // - if ((PlatformConsole[Index].ConnectType & CONSOLE_IN) == CONSOLE_IN) { - BdsLibUpdateConsoleVariable (L"ConIn", PlatformConsole[Index].DevicePath, NULL); - } - - if ((PlatformConsole[Index].ConnectType & CONSOLE_OUT) == CONSOLE_OUT) { - BdsLibUpdateConsoleVariable (L"ConOut", PlatformConsole[Index].DevicePath, NULL); - } - - if ((PlatformConsole[Index].ConnectType & STD_ERROR) == STD_ERROR) { - BdsLibUpdateConsoleVariable (L"ErrOut", PlatformConsole[Index].DevicePath, NULL); - } - - Index ++; - } - } - - // - // Connect ConIn first to give keyboard time to parse hot key event. - // - Status = BdsLibConnectConsoleVariable (L"ConIn"); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Make sure we have at least one active VGA, and have the right - // active VGA in console variable - // - Status = PlatformBdsForceActiveVga (); - - // - // It seems impossible not to have any ConOut device on platform, - // so we check the status here. - // - Status = BdsLibConnectConsoleVariable (L"ConOut"); - if (EFI_ERROR (Status)) { - return Status; - } - - return EFI_SUCCESS; -} - - -/** - Timer handler to convert the key from USB. - - @param Event Indicates the event that invoke this function. - @param Context Indicates the calling context. -**/ -VOID -EFIAPI -HotKeyTimerHandler ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - EFI_STATUS Status; - EFI_INPUT_KEY Key; - - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); - if (EFI_ERROR (Status)) { - return; - } - - switch(Key.ScanCode) { - case SCAN_F2: - gHotKey = 0; - mHotKeyPressed = TRUE; - break; - - case SCAN_F5: - gHotKey = FRONT_PAGE_KEY_DEVICE_MANAGER; - mHotKeyPressed = TRUE; - break; - - case SCAN_F7: - gHotKey = FRONT_PAGE_KEY_BOOT_MANAGER; - mHotKeyPressed = TRUE; - break; - - case SCAN_F9: - gHotKey = FRONT_PAGE_KEY_BOOT_MAINTAIN; - mHotKeyPressed = TRUE; - break; - } - - if (mHotKeyPressed) { - gBS->SetTimer ( - mHotKeyTimerEvent, - TimerCancel, - 0 - ); - gBS->CloseEvent (mHotKeyTimerEvent); - mHotKeyTimerEvent = NULL; - } - - return; -} - - -/** - Callback function for SimpleTextInEx protocol install events - - @param Event the event that is signaled. - @param Context not used here. - -**/ -VOID -EFIAPI -HitHotkeyEvent ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - EFI_STATUS Status; - - Status = gBS->CloseEvent(mHitHotkeyEvent); - if (EFI_ERROR (Status)) { - return; - } - Status = gBS->CreateEvent ( - EVT_TIMER | EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - HotKeyTimerHandler, - NULL, - &mHotKeyTimerEvent - ); - if (EFI_ERROR (Status)) { - return; - } - Status = gBS->SetTimer ( - mHotKeyTimerEvent, - TimerPeriodic, - KEYBOARD_TIMER_INTERVAL - ); - if (EFI_ERROR (Status)) { - return; - } - - return; -} - - -VOID -EFIAPI -PlatformBdsInitHotKeyEvent ( - VOID - ) -{ - EFI_STATUS Status; - - // - // Register Protocol notify for Hotkey service - // - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, - HitHotkeyEvent, - NULL, - &mHitHotkeyEvent - ); - ASSERT_EFI_ERROR (Status); - - // - // Register for protocol notifications on this event - // - Status = gBS->RegisterProtocolNotify ( - &gEfiSimpleTextInputExProtocolGuid, - mHitHotkeyEvent, - &mHitHotkeyRegistration - ); - ASSERT_EFI_ERROR (Status); -}