qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [edk2 PATCH 03/12] ArmVirtualizationPkg: clone PlatformInte


From: Laszlo Ersek
Subject: [Qemu-devel] [edk2 PATCH 03/12] ArmVirtualizationPkg: clone PlatformIntelBdsLib from ArmPlatformPkg
Date: Fri, 28 Nov 2014 00:19:18 +0100

In the next patch(es) we'll customize the PlatformBdsLib instance used by
ArmVirtualizationQemu.dsc. Let's clone it first verbatim from
ArmPlatformPkg/Library/PlatformIntelBdsLib, changing only its FILE_GUID.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <address@hidden>
---
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
 |  65 ++++++++++
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h
      |  35 +++++
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
      | 376 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc                  
         |   2 +-
 4 files changed, 477 insertions(+), 1 deletion(-)

diff --git 
a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
 
b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
new file mode 100644
index 0000000..d635f13
--- /dev/null
+++ 
b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
@@ -0,0 +1,65 @@
+## @file
+#  Implementation for PlatformBdsLib library class interfaces.
+#  using ARM Platform framework.
+#
+#  Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD 
License
+#  which accompanies this distribution.  The full text of the license may be 
found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = PlatformIntelBdsLib
+  FILE_GUID                      = 46DF84EB-F603-4D39-99D8-E1E86B50BCC2
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = PlatformBdsLib|DXE_DRIVER
+  CONSTRUCTOR                    = PlatformIntelBdsConstructor
+
+#
+# The following information is for reference only and not required by the 
build tools.
+#
+#  VALID_ARCHITECTURES           = ARM AARCH64
+#
+
+[Sources]
+  IntelBdsPlatform.c
+  IntelBdsPlatform.h
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
+
+[LibraryClasses]
+  BaseLib
+  BaseMemoryLib
+  BdsLib
+  DebugLib
+  DevicePathLib
+  MemoryAllocationLib
+  UefiBootServicesTableLib
+  PcdLib
+  GenericBdsLib
+
+[Guids]
+  gArmGlobalVariableGuid
+
+[Pcd]
+  gArmPlatformTokenSpaceGuid.PcdDefaultConInPaths
+  gArmPlatformTokenSpaceGuid.PcdDefaultConOutPaths
+  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformBootTimeOut
+
+[Protocols]
+  gEfiDevicePathFromTextProtocolGuid
+  gEfiDevicePathToTextProtocolGuid
diff --git 
a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h
 
b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h
new file mode 100644
index 0000000..a244ac9
--- /dev/null
+++ 
b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h
@@ -0,0 +1,35 @@
+/** @file
+  Head file for BDS Platform specific code
+
+Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD 
License
+which accompanies this distribution.  The full text of the license may be 
found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _INTEL_BDS_PLATFORM_H_
+#define _INTEL_BDS_PLATFORM_H_
+
+#include <Protocol/DevicePathFromText.h>
+#include <Protocol/DevicePathToText.h>
+
+#include <Library/BaseMemoryLib.h>
+#include <Library/BdsLib.h>
+#include <Library/DebugLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/BaseLib.h>
+#include <Library/PcdLib.h>
+#include <Library/GenericBdsLib.h>
+#include <Library/PlatformBdsLib.h>
+
+#include <Guid/GlobalVariable.h>
+
+#endif // _INTEL_BDS_PLATFORM_H
diff --git 
a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
 
b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
new file mode 100644
index 0000000..c07fc0f
--- /dev/null
+++ 
b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
@@ -0,0 +1,376 @@
+/** @file
+
+Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+
+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 "IntelBdsPlatform.h"
+
+///
+/// Predefined platform default time out value
+///
+UINT16                      gPlatformBootTimeOutDefault;
+
+EFI_STATUS
+EFIAPI
+PlatformIntelBdsConstructor (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  gPlatformBootTimeOutDefault = (UINT16)PcdGet16 (PcdPlatformBootTimeOut);
+  return EFI_SUCCESS;
+}
+
+//
+// BDS Platform Functions
+//
+/**
+  Platform Bds init. Include the platform firmware vendor, revision
+  and so crc check.
+
+**/
+VOID
+EFIAPI
+PlatformBdsInit (
+  VOID
+  )
+{
+}
+
+STATIC
+EFI_STATUS
+GetConsoleDevicePathFromVariable (
+  IN  CHAR16*             ConsoleVarName,
+  IN  CHAR16*             DefaultConsolePaths,
+  OUT EFI_DEVICE_PATH**   DevicePaths
+  )
+{
+  EFI_STATUS                Status;
+  UINTN                     Size;
+  EFI_DEVICE_PATH_PROTOCOL* DevicePathInstances;
+  EFI_DEVICE_PATH_PROTOCOL* DevicePathInstance;
+  CHAR16*                   DevicePathStr;
+  CHAR16*                   NextDevicePathStr;
+  EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL  *EfiDevicePathFromTextProtocol;
+
+  Status = GetGlobalEnvironmentVariable (ConsoleVarName, NULL, NULL, 
(VOID**)&DevicePathInstances);
+  if (EFI_ERROR(Status)) {
+    // In case no default console device path has been defined we assume a 
driver handles the console (eg: SimpleTextInOutSerial)
+    if ((DefaultConsolePaths == NULL) || (DefaultConsolePaths[0] == L'\0')) {
+      *DevicePaths = NULL;
+      return EFI_SUCCESS;
+    }
+
+    Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, 
(VOID **)&EfiDevicePathFromTextProtocol);
+    ASSERT_EFI_ERROR(Status);
+
+    DevicePathInstances = NULL;
+
+    // Extract the Device Path instances from the multi-device path string
+    while ((DefaultConsolePaths != NULL) && (DefaultConsolePaths[0] != L'\0')) 
{
+      NextDevicePathStr = StrStr (DefaultConsolePaths, L";");
+      if (NextDevicePathStr == NULL) {
+        DevicePathStr = DefaultConsolePaths;
+        DefaultConsolePaths = NULL;
+      } else {
+        DevicePathStr = (CHAR16*)AllocateCopyPool ((NextDevicePathStr - 
DefaultConsolePaths + 1) * sizeof(CHAR16), DefaultConsolePaths);
+        *(DevicePathStr + (NextDevicePathStr - DefaultConsolePaths)) = L'\0';
+        DefaultConsolePaths = NextDevicePathStr;
+        if (DefaultConsolePaths[0] == L';') {
+          DefaultConsolePaths++;
+        }
+      }
+
+      DevicePathInstance = 
EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (DevicePathStr);
+      ASSERT(DevicePathInstance != NULL);
+      DevicePathInstances = AppendDevicePathInstance (DevicePathInstances, 
DevicePathInstance);
+
+      if (NextDevicePathStr != NULL) {
+        FreePool (DevicePathStr);
+      }
+      FreePool (DevicePathInstance);
+    }
+
+    // Set the environment variable with this device path multi-instances
+    Size = GetDevicePathSize (DevicePathInstances);
+    if (Size > 0) {
+      gRT->SetVariable (
+          ConsoleVarName,
+          &gEfiGlobalVariableGuid,
+          EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | 
EFI_VARIABLE_RUNTIME_ACCESS,
+          Size,
+          DevicePathInstances
+          );
+    } else {
+      Status = EFI_INVALID_PARAMETER;
+    }
+  }
+
+  if (!EFI_ERROR(Status)) {
+    *DevicePaths = DevicePathInstances;
+  }
+  return Status;
+}
+
+STATIC
+EFI_STATUS
+InitializeConsolePipe (
+  IN EFI_DEVICE_PATH    *ConsoleDevicePaths,
+  IN EFI_GUID           *Protocol,
+  OUT EFI_HANDLE        *Handle,
+  OUT VOID*             *Interface
+  )
+{
+  EFI_STATUS                Status;
+  UINTN                     Size;
+  UINTN                     NoHandles;
+  EFI_HANDLE                *Buffer;
+  EFI_DEVICE_PATH_PROTOCOL* DevicePath;
+
+  // Connect all the Device Path Consoles
+  while (ConsoleDevicePaths != NULL) {
+    DevicePath = GetNextDevicePathInstance (&ConsoleDevicePaths, &Size);
+
+    Status = BdsConnectDevicePath (DevicePath, Handle, NULL);
+    DEBUG_CODE_BEGIN();
+      if (EFI_ERROR(Status)) {
+        // We convert back to the text representation of the device Path
+        EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol;
+        CHAR16* DevicePathTxt;
+        EFI_STATUS Status;
+
+        Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, 
(VOID **)&DevicePathToTextProtocol);
+        if (!EFI_ERROR(Status)) {
+          DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText 
(DevicePath, TRUE, TRUE);
+
+          DEBUG((EFI_D_ERROR,"Fail to start the console with the Device Path 
'%s'. (Error '%r')\n", DevicePathTxt, Status));
+
+          FreePool (DevicePathTxt);
+        }
+      }
+    DEBUG_CODE_END();
+
+    // If the console splitter driver is not supported by the platform then 
use the first Device Path
+    // instance for the console interface.
+    if (!EFI_ERROR(Status) && (*Interface == NULL)) {
+      Status = gBS->HandleProtocol (*Handle, Protocol, Interface);
+    }
+  }
+
+  // No Device Path has been defined for this console interface. We take the 
first protocol implementation
+  if (*Interface == NULL) {
+    Status = gBS->LocateHandleBuffer (ByProtocol, Protocol, NULL, &NoHandles, 
&Buffer);
+    if (EFI_ERROR (Status)) {
+      BdsConnectAllDrivers ();
+      Status = gBS->LocateHandleBuffer (ByProtocol, Protocol, NULL, 
&NoHandles, &Buffer);
+    }
+
+    if (!EFI_ERROR(Status)) {
+      *Handle = Buffer[0];
+      Status = gBS->HandleProtocol (*Handle, Protocol, Interface);
+      ASSERT_EFI_ERROR (Status);
+    }
+    FreePool (Buffer);
+  } else {
+    Status = EFI_SUCCESS;
+  }
+
+  return Status;
+}
+
+/**
+  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.
+  @return Return the status of BdsLibConnectAllDefaultConsoles ()
+
+**/
+EFI_STATUS
+PlatformBdsConnectConsole (
+  VOID
+  )
+{
+  EFI_STATUS                Status;
+  EFI_DEVICE_PATH*          ConOutDevicePaths;
+  EFI_DEVICE_PATH*          ConInDevicePaths;
+  EFI_DEVICE_PATH*          ConErrDevicePaths;
+
+  // By getting the Console Device Paths from the environment variables before 
initializing the console pipe, we
+  // create the 3 environment variables (ConIn, ConOut, ConErr) that allows to 
initialize all the console interface
+  // of newly installed console drivers
+  Status = GetConsoleDevicePathFromVariable (L"ConOut", 
(CHAR16*)PcdGetPtr(PcdDefaultConOutPaths), &ConOutDevicePaths);
+  ASSERT_EFI_ERROR (Status);
+  Status = GetConsoleDevicePathFromVariable (L"ConIn", 
(CHAR16*)PcdGetPtr(PcdDefaultConInPaths), &ConInDevicePaths);
+  ASSERT_EFI_ERROR (Status);
+  Status = GetConsoleDevicePathFromVariable (L"ErrOut", 
(CHAR16*)PcdGetPtr(PcdDefaultConOutPaths), &ConErrDevicePaths);
+  ASSERT_EFI_ERROR (Status);
+
+  // Initialize the Consoles
+  Status = InitializeConsolePipe (ConOutDevicePaths, 
&gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **)&gST->ConOut);
+  ASSERT_EFI_ERROR (Status);
+  Status = InitializeConsolePipe (ConInDevicePaths, 
&gEfiSimpleTextInProtocolGuid, &gST->ConsoleInHandle, (VOID **)&gST->ConIn);
+  ASSERT_EFI_ERROR (Status);
+  Status = InitializeConsolePipe (ConErrDevicePaths, 
&gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID 
**)&gST->StdErr);
+  if (EFI_ERROR(Status)) {
+    // In case of error, we reuse the console output for the error output
+    gST->StandardErrorHandle = gST->ConsoleOutHandle;
+    gST->StdErr = gST->ConOut;
+  }
+
+  return Status;
+}
+
+/**
+  Connect with predefined platform connect sequence,
+  the OEM/IBV can customize with their own connect sequence.
+**/
+VOID
+PlatformBdsConnectSequence (
+  VOID
+  )
+{
+}
+
+/**
+  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.
+
+**/
+VOID
+PlatformBdsGetDriverOption (
+  IN OUT LIST_ENTRY              *BdsDriverLists
+  )
+{
+}
+
+/**
+  Perform the platform diagnostic, such like test memory. OEM/IBV also
+  can customize this function 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()
+
+**/
+VOID
+PlatformBdsDiagnostics (
+  IN EXTENDMEM_COVERAGE_LEVEL    MemoryTestLevel,
+  IN BOOLEAN                     QuietBoot,
+  IN BASEM_MEMORY_TEST           BaseMemoryTest
+  )
+{
+}
+
+/**
+  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()
+
+**/
+VOID
+EFIAPI
+PlatformBdsPolicyBehavior (
+  IN LIST_ENTRY                      *DriverOptionList,
+  IN LIST_ENTRY                      *BootOptionList,
+  IN PROCESS_CAPSULES                ProcessCapsules,
+  IN BASEM_MEMORY_TEST               BaseMemoryTest
+  )
+{
+  EFI_STATUS Status;
+
+  Status = PlatformBdsConnectConsole ();
+  ASSERT_EFI_ERROR (Status);
+}
+
+/**
+  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 also a platform implementation and can be customized by IBV/OEM.
+
+  @param  Option                  Pointer to Boot Option that succeeded to 
boot.
+
+**/
+VOID
+EFIAPI
+PlatformBdsBootSuccess (
+  IN  BDS_COMMON_OPTION *Option
+  )
+{
+}
+
+/**
+  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.
+
+**/
+VOID
+EFIAPI
+PlatformBdsBootFail (
+  IN  BDS_COMMON_OPTION  *Option,
+  IN  EFI_STATUS         Status,
+  IN  CHAR16             *ExitData,
+  IN  UINTN              ExitDataSize
+  )
+{
+}
+
+/**
+  This function locks platform flash that is not allowed to be updated during 
normal boot path.
+  The flash layout is platform specific.
+**/
+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;
+}
diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc 
b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
index 60f7d7f..c825340 100644
--- a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc
@@ -52,7 +52,7 @@
 !ifdef INTEL_BDS
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
   GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
-  
PlatformBdsLib|ArmPlatformPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
+  
PlatformBdsLib|ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
   
CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
 !endif
 
-- 
1.8.3.1





reply via email to

[Prev in Thread] Current Thread [Next in Thread]