From 31fcee6d99daa9c6b733371f20a69c8b26e0ab77 Mon Sep 17 00:00:00 2001 From: Jianyong Wu Date: Mon, 5 Jul 2021 18:06:39 +0800 Subject: ArmVirtPkg: Add PlatformHasAcpiDtDxe for Cloud Hypervisor The ArmVirtPkg\PlatformHasAcpiDtDxe implementation is not common and is specific for Qemu. So add a Cloud Hypervisor specific version that decides whether the firmware should expose an ACPI based or a Device Tree based hardware description to an operating system. Cc: Laszlo Ersek Cc: Sami Mujawar Signed-off-by: Jianyong Wu Reviewed-by: Sami Mujawar --- .../CloudHvHasAcpiDtDxe.c | 79 ++++++++++++++++++++++ .../CloudHvHasAcpiDtDxe.inf | 42 ++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 ArmVirtPkg/CloudHvPlatformHasAcpiDtDxe/CloudHvHasAcpiDtDxe.c create mode 100644 ArmVirtPkg/CloudHvPlatformHasAcpiDtDxe/CloudHvHasAcpiDtDxe.inf diff --git a/ArmVirtPkg/CloudHvPlatformHasAcpiDtDxe/CloudHvHasAcpiDtDxe.c b/ArmVirtPkg/CloudHvPlatformHasAcpiDtDxe/CloudHvHasAcpiDtDxe.c new file mode 100644 index 0000000..4cf1d39 --- /dev/null +++ b/ArmVirtPkg/CloudHvPlatformHasAcpiDtDxe/CloudHvHasAcpiDtDxe.c @@ -0,0 +1,79 @@ +/** @file + Decide whether the firmware should expose an ACPI- and/or a Device Tree-based + hardware description to the operating system. + + Copyright (c) 2021, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include + +/** Entry point for the Cloud Hypervisor PlatformHasAcpiDtDxe. + + @param [in] ImageHandle Handle for this image. + @param [in] SystemTable Pointer to the EFI system table. + + @return EFI_SUCCESS If ACPI or Device Tree based hardware + description protocol was installed. + @return EFI_INVALID_PARAMETER A parameter was invalid. + @return EFI_OUT_OF_RESOURCES Insufficient resources exist to complete + the request. +**/ +EFI_STATUS +EFIAPI +PlatformHasAcpiDt ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + // + // If we fail to install any of the necessary protocols below, the OS will be + // unbootable anyway (due to lacking hardware description), so tolerate no + // errors here. + // + if (MAX_UINTN == MAX_UINT64 && + !PcdGetBool (PcdForceNoAcpi)) { + Status = gBS->InstallProtocolInterface ( + &ImageHandle, + &gEdkiiPlatformHasAcpiGuid, + EFI_NATIVE_INTERFACE, + NULL + ); + if (EFI_ERROR (Status)) { + goto Failed; + } + + return Status; + } + + // + // Expose the Device Tree otherwise. + // + Status = gBS->InstallProtocolInterface ( + &ImageHandle, + &gEdkiiPlatformHasDeviceTreeGuid, + EFI_NATIVE_INTERFACE, + NULL + ); + if (EFI_ERROR (Status)) { + goto Failed; + } + + return Status; + +Failed: + ASSERT_EFI_ERROR (Status); + CpuDeadLoop (); + // + // Keep compilers happy. + // + return Status; +} diff --git a/ArmVirtPkg/CloudHvPlatformHasAcpiDtDxe/CloudHvHasAcpiDtDxe.inf b/ArmVirtPkg/CloudHvPlatformHasAcpiDtDxe/CloudHvHasAcpiDtDxe.inf new file mode 100644 index 0000000..4af06b2 --- /dev/null +++ b/ArmVirtPkg/CloudHvPlatformHasAcpiDtDxe/CloudHvHasAcpiDtDxe.inf @@ -0,0 +1,42 @@ +## @file +# Decide whether the firmware should expose an ACPI- and/or a Device Tree-based +# hardware description to the operating system. +# +# Copyright (c) 2021, Arm Limited. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = CloudHvPlatformHasAcpiDtDxe + FILE_GUID = 71fe72f9-6dc1-199d-5054-13b4200ee88d + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = PlatformHasAcpiDt + +[Sources] + CloudHvHasAcpiDtDxe.c + +[Packages] + ArmVirtPkg/ArmVirtPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + PcdLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Guids] + gEdkiiPlatformHasAcpiGuid ## SOMETIMES_PRODUCES ## PROTOCOL + gEdkiiPlatformHasDeviceTreeGuid ## SOMETIMES_PRODUCES ## PROTOCOL + +[Pcd] + gArmVirtTokenSpaceGuid.PcdForceNoAcpi + +[Depex] + gEfiVariableArchProtocolGuid -- cgit v1.1