mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-29 18:23:45 +01:00 
			
		
		
		
	- Predfined -> Predefined - minimue -> minimum - predeined -> predefined - excute -> execute - availible -> available - discontiguous -> discontinuous - permenent -> permanent - immediatly -> immediately - environmemt -> environment - Seperator -> Separator - remmeber -> remember - initailized -> initialized Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Gary Lin <glin@suse.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
		
			
				
	
	
		
			558 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			558 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++ @file
 | |
| 
 | |
| Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
 | |
| Portions copyright (c) 2011, Apple Inc. All rights reserved.
 | |
| This program and the accompanying materials
 | |
| are licensed and made available under the terms and conditions of the BSD License
 | |
| which accompanies this distribution.  The full text of the license may be found at
 | |
| http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "BdsPlatform.h"
 | |
| 
 | |
| EMU_SYSTEM_CONFIGURATION mSystemConfigData;
 | |
| 
 | |
| VOID
 | |
| SetupVariableInit (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                      Status;
 | |
|   UINTN                           Size;
 | |
| 
 | |
|   Size = sizeof (mSystemConfigData);
 | |
|   Status = gRT->GetVariable (
 | |
|                   L"Setup",
 | |
|                   &gEmuSystemConfigGuid,
 | |
|                   NULL,
 | |
|                   &Size,
 | |
|                   (VOID *) &mSystemConfigData
 | |
|                   );
 | |
| 
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     //
 | |
|     // SetupVariable is corrupt
 | |
|     //
 | |
|     mSystemConfigData.ConOutRow = PcdGet32 (PcdConOutColumn);
 | |
|     mSystemConfigData.ConOutColumn = PcdGet32 (PcdConOutRow);
 | |
| 
 | |
|     Status = gRT->SetVariable (
 | |
|                     L"Setup",
 | |
|                     &gEmuSystemConfigGuid,
 | |
|                     EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
 | |
|                     sizeof (mSystemConfigData),
 | |
|                     (VOID *) &mSystemConfigData
 | |
|                     );
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       DEBUG ((EFI_D_ERROR, "Failed to save Setup Variable to non-volatile storage, Status = %r\n", Status));
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| //
 | |
| // BDS Platform Functions
 | |
| //
 | |
| VOID
 | |
| EFIAPI
 | |
| PlatformBdsInit (
 | |
|   VOID
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Platform Bds init. Include the platform firmware vendor, revision
 | |
|   and so crc check.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   None.
 | |
| 
 | |
| **/
 | |
| {
 | |
|   SetupVariableInit ();
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| PlatformBdsConnectConsole (
 | |
|   IN BDS_CONSOLE_CONNECT_ENTRY   *PlatformConsole
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Connect the predefined platform default console device. Always try to find
 | |
|   and enable the vga device if have.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   PlatformConsole         - Predefined platform default console device array.
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS             - Success connect at least one ConIn and ConOut
 | |
|                             device, there must have one ConOut device is
 | |
|                             active vga device.
 | |
| 
 | |
|   EFI_STATUS              - Return the status of
 | |
|                             BdsLibConnectAllDefaultConsoles ()
 | |
| 
 | |
| **/
 | |
| {
 | |
|   EFI_STATUS  Status;
 | |
|   UINTN       Index;
 | |
| 
 | |
|   Index   = 0;
 | |
|   Status  = EFI_SUCCESS;
 | |
| 
 | |
|   //
 | |
|   // 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 the all the default console with current cosole variable
 | |
|   //
 | |
|   Status = BdsLibConnectAllDefaultConsoles ();
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| VOID
 | |
| PlatformBdsConnectSequence (
 | |
|   VOID
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Connect with predefined platform connect sequence,
 | |
|   the OEM/IBV can customize with their own connect sequence.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   None.
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   None.
 | |
| 
 | |
| **/
 | |
| {
 | |
|   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
 | |
|   //
 | |
|   BdsLibConnectAll ();
 | |
| }
 | |
| 
 | |
| VOID
 | |
| PlatformBdsGetDriverOption (
 | |
|   IN OUT LIST_ENTRY              *BdsDriverLists
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Load the predefined driver option, OEM/IBV can customize this
 | |
|   to load their own drivers
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   BdsDriverLists  - The header of the driver option link list.
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   None.
 | |
| 
 | |
| **/
 | |
| {
 | |
|   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++;
 | |
|   }
 | |
| 
 | |
| }
 | |
| 
 | |
| VOID
 | |
| PlatformBdsDiagnostics (
 | |
|   IN EXTENDMEM_COVERAGE_LEVEL    MemoryTestLevel,
 | |
|   IN BOOLEAN                     QuietBoot,
 | |
|   IN BASEM_MEMORY_TEST           BaseMemoryTest
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Perform the platform diagnostic, such like test memory. OEM/IBV also
 | |
|   can customize this fuction to support specific platform diagnostic.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   MemoryTestLevel  - The memory test intensive level
 | |
| 
 | |
|   QuietBoot        - Indicate if need to enable the quiet boot
 | |
| 
 | |
|   BaseMemoryTest   - A pointer to BdsMemoryTest()
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   None.
 | |
| 
 | |
| **/
 | |
| {
 | |
|   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);
 | |
| }
 | |
| 
 | |
| VOID
 | |
| EFIAPI
 | |
| PlatformBdsPolicyBehavior (
 | |
|   IN OUT LIST_ENTRY                  *DriverOptionList,
 | |
|   IN OUT LIST_ENTRY                  *BootOptionList,
 | |
|   IN PROCESS_CAPSULES                ProcessCapsules,
 | |
|   IN BASEM_MEMORY_TEST               BaseMemoryTest
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   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.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   DriverOptionList - The header of the driver option link list
 | |
| 
 | |
|   BootOptionList   - The header of the boot option link list
 | |
| 
 | |
|   ProcessCapsules  - A pointer to ProcessCapsules()
 | |
| 
 | |
|   BaseMemoryTest   - A pointer to BaseMemoryTest()
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   None.
 | |
| 
 | |
| **/
 | |
| {
 | |
|   EFI_STATUS     Status;
 | |
|   UINT16         Timeout;
 | |
|   EFI_BOOT_MODE  BootMode;
 | |
| 
 | |
|   //
 | |
|   // Init the time out value
 | |
|   //
 | |
|   Timeout = PcdGet16 (PcdPlatformBootTimeOut);
 | |
| 
 | |
|   //
 | |
|   // Load the driver option as the driver option list
 | |
|   //
 | |
|   PlatformBdsGetDriverOption (DriverOptionList);
 | |
| 
 | |
|   //
 | |
|   // Get current Boot Mode
 | |
|   //
 | |
|   Status = BdsLibGetBootMode (&BootMode);
 | |
| 
 | |
|   //
 | |
|   // Go the different platform policy with different boot mode
 | |
|   // Notes: this part code can be change with the table policy
 | |
|   //
 | |
|   switch (BootMode) {
 | |
| 
 | |
|   case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES:
 | |
|   case BOOT_WITH_MINIMAL_CONFIGURATION:
 | |
|     //
 | |
|     // In no-configuration boot mode, we can connect the
 | |
|     // console directly.
 | |
|     //
 | |
|     BdsLibConnectAllDefaultConsoles ();
 | |
|     PlatformBdsDiagnostics (IGNORE, TRUE, BaseMemoryTest);
 | |
| 
 | |
|     //
 | |
|     // Perform some platform specific connect sequence
 | |
|     //
 | |
|     PlatformBdsConnectSequence ();
 | |
| 
 | |
|     //
 | |
|     // Notes: current time out = 0 can not enter the
 | |
|     // front page
 | |
|     //
 | |
|     PlatformBdsEnterFrontPage (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, FALSE, BaseMemoryTest);
 | |
|     BdsLibConnectAll ();
 | |
|     ProcessCapsules (BOOT_ON_FLASH_UPDATE);
 | |
|     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);
 | |
| 
 | |
|     //
 | |
|     // In recovery boot mode, we still enter to the
 | |
|     // frong page now
 | |
|     //
 | |
|     PlatformBdsEnterFrontPage (Timeout, FALSE);
 | |
|     break;
 | |
| 
 | |
|   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 ();
 | |
|     }
 | |
| 
 | |
|     PlatformBdsDiagnostics (IGNORE, TRUE, BaseMemoryTest);
 | |
| 
 | |
|     //
 | |
|     // Perform some platform specific connect sequence
 | |
|     //
 | |
|     PlatformBdsConnectSequence ();
 | |
| 
 | |
|     //
 | |
|     // Give one chance to enter the setup if we
 | |
|     // have the time out
 | |
|     //
 | |
|     PlatformBdsEnterFrontPage (Timeout, FALSE);
 | |
| 
 | |
|     //
 | |
|     // Here we have enough time to do the enumeration of boot device
 | |
|     //
 | |
|     BdsLibEnumerateAllBootOption (BootOptionList);
 | |
|     break;
 | |
|   }
 | |
| 
 | |
|   return ;
 | |
| 
 | |
| }
 | |
| 
 | |
| VOID
 | |
| EFIAPI
 | |
| PlatformBdsBootSuccess (
 | |
|   IN  BDS_COMMON_OPTION   *Option
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Hook point after a boot attempt succeeds. We don't expect a boot option to
 | |
|   return, so the EFI 1.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.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Option - Pointer to Boot Option that succeeded to boot.
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   None.
 | |
| 
 | |
| **/
 | |
| {
 | |
|   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);
 | |
|   }
 | |
| }
 | |
| 
 | |
| VOID
 | |
| EFIAPI
 | |
| PlatformBdsBootFail (
 | |
|   IN  BDS_COMMON_OPTION  *Option,
 | |
|   IN  EFI_STATUS         Status,
 | |
|   IN  CHAR16             *ExitData,
 | |
|   IN  UINTN              ExitDataSize
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Hook point after a boot attempt fails.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Option - Pointer to Boot Option that failed to boot.
 | |
| 
 | |
|   Status - Status returned from failed boot.
 | |
| 
 | |
|   ExitData - Exit data returned from failed boot.
 | |
| 
 | |
|   ExitDataSize - Exit data size returned from failed boot.
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   None.
 | |
| 
 | |
| **/
 | |
| {
 | |
|   CHAR16  *TmpStr;
 | |
| 
 | |
|   //
 | |
|   // 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);
 | |
|   }
 | |
| }
 | |
| 
 | |
| EFI_STATUS
 | |
| PlatformBdsNoConsoleAction (
 | |
|   VOID
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   This function is remained for IBV/OEM to do some platform action,
 | |
|   if there no console device can be connected.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   None.
 | |
| 
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS      - Direct return success now.
 | |
| 
 | |
| **/
 | |
| {
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| VOID
 | |
| EFIAPI
 | |
| PlatformBdsLockNonUpdatableFlash (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   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;
 | |
| }
 |