mirror of https://github.com/acidanthera/audk.git
OvmfPkg: Install ACPI tables for Cloud Hypervisor
Adding support for retrieving the Cloud Hypervisor ACPI tables as a fallback mechanism if tables are not found through fw_cfg. Reviewed-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> Signed-off-by: Rob Bradford <robert.bradford@intel.com> Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
parent
66bce05f6d
commit
7594c5bfe2
|
@ -7,6 +7,8 @@
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
#include <OvmfPlatforms.h> // CLOUDHV_DEVICE_ID
|
||||||
|
|
||||||
#include "AcpiPlatform.h"
|
#include "AcpiPlatform.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -27,7 +29,14 @@ InstallAcpiTables (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
UINT16 HostBridgeDevId;
|
||||||
|
|
||||||
|
HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);
|
||||||
|
if (HostBridgeDevId == CLOUDHV_DEVICE_ID) {
|
||||||
|
Status = InstallCloudHvTables (AcpiTable);
|
||||||
|
} else {
|
||||||
Status = InstallQemuFwCfgTables (AcpiTable);
|
Status = InstallQemuFwCfgTables (AcpiTable);
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,12 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct S3_CONTEXT S3_CONTEXT;
|
typedef struct S3_CONTEXT S3_CONTEXT;
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
InstallCloudHvTables (
|
||||||
|
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol
|
||||||
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InstallQemuFwCfgTables (
|
InstallQemuFwCfgTables (
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
AcpiPlatform.c
|
AcpiPlatform.c
|
||||||
AcpiPlatform.h
|
AcpiPlatform.h
|
||||||
BootScript.c
|
BootScript.c
|
||||||
|
CloudHvAcpi.c
|
||||||
EntryPoint.c
|
EntryPoint.c
|
||||||
PciDecoding.c
|
PciDecoding.c
|
||||||
QemuFwCfgAcpi.c
|
QemuFwCfgAcpi.c
|
||||||
|
@ -54,6 +55,7 @@
|
||||||
|
|
||||||
[Pcd]
|
[Pcd]
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration
|
gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId
|
||||||
|
|
||||||
[Depex]
|
[Depex]
|
||||||
gEfiAcpiTableProtocolGuid
|
gEfiAcpiTableProtocolGuid
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
/** @file
|
||||||
|
OVMF ACPI Cloud Hypervisor support
|
||||||
|
|
||||||
|
Copyright (c) 2021, Intel Corporation. All rights reserved.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include <IndustryStandard/CloudHv.h> // CLOUDHV_RSDP_ADDRESS
|
||||||
|
#include <Library/BaseLib.h> // CpuDeadLoop()
|
||||||
|
#include <Library/DebugLib.h> // DEBUG()
|
||||||
|
|
||||||
|
#include "AcpiPlatform.h"
|
||||||
|
|
||||||
|
// Get the ACPI tables from EBDA start
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
InstallCloudHvTables (
|
||||||
|
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINTN TableHandle;
|
||||||
|
|
||||||
|
EFI_ACPI_DESCRIPTION_HEADER *Xsdt;
|
||||||
|
VOID *CurrentTableEntry;
|
||||||
|
UINTN CurrentTablePointer;
|
||||||
|
EFI_ACPI_DESCRIPTION_HEADER *CurrentTable;
|
||||||
|
UINTN Index;
|
||||||
|
UINTN NumberOfTableEntries;
|
||||||
|
EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt2Table;
|
||||||
|
EFI_ACPI_DESCRIPTION_HEADER *DsdtTable;
|
||||||
|
|
||||||
|
Fadt2Table = NULL;
|
||||||
|
DsdtTable = NULL;
|
||||||
|
TableHandle = 0;
|
||||||
|
NumberOfTableEntries = 0;
|
||||||
|
EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *AcpiRsdpStructurePtr = (VOID *)CLOUDHV_RSDP_ADDRESS;
|
||||||
|
|
||||||
|
// If XSDT table is found, just install its tables.
|
||||||
|
// Otherwise, try to find and install the RSDT tables.
|
||||||
|
//
|
||||||
|
if (AcpiRsdpStructurePtr->XsdtAddress) {
|
||||||
|
//
|
||||||
|
// Retrieve the addresses of XSDT and
|
||||||
|
// calculate the number of its table entries.
|
||||||
|
//
|
||||||
|
Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)
|
||||||
|
AcpiRsdpStructurePtr->XsdtAddress;
|
||||||
|
NumberOfTableEntries = (Xsdt->Length -
|
||||||
|
sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /
|
||||||
|
sizeof (UINT64);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Install ACPI tables found in XSDT.
|
||||||
|
//
|
||||||
|
for (Index = 0; Index < NumberOfTableEntries; Index++) {
|
||||||
|
//
|
||||||
|
// Get the table entry from XSDT
|
||||||
|
//
|
||||||
|
CurrentTableEntry = (VOID *)((UINT8 *)Xsdt +
|
||||||
|
sizeof (EFI_ACPI_DESCRIPTION_HEADER) +
|
||||||
|
Index * sizeof (UINT64));
|
||||||
|
CurrentTablePointer = (UINTN)*(UINT64 *)CurrentTableEntry;
|
||||||
|
CurrentTable = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Install the XSDT tables
|
||||||
|
//
|
||||||
|
Status = AcpiProtocol->InstallAcpiTable (
|
||||||
|
AcpiProtocol,
|
||||||
|
CurrentTable,
|
||||||
|
CurrentTable->Length,
|
||||||
|
&TableHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get the X-DSDT table address from the table FADT
|
||||||
|
//
|
||||||
|
if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) {
|
||||||
|
Fadt2Table = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)
|
||||||
|
(UINTN)CurrentTablePointer;
|
||||||
|
DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt2Table->XDsdt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Install DSDT table. If we reached this point without finding the DSDT,
|
||||||
|
// then we're out of sync with the hypervisor, and cannot continue.
|
||||||
|
//
|
||||||
|
if (DsdtTable == NULL) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __FUNCTION__));
|
||||||
|
ASSERT (FALSE);
|
||||||
|
CpuDeadLoop ();
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = AcpiProtocol->InstallAcpiTable (
|
||||||
|
AcpiProtocol,
|
||||||
|
DsdtTable,
|
||||||
|
DsdtTable->Length,
|
||||||
|
&TableHandle
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
|
@ -38,4 +38,9 @@
|
||||||
//
|
//
|
||||||
#define CLOUDHV_SMBIOS_ADDRESS 0xf0000
|
#define CLOUDHV_SMBIOS_ADDRESS 0xf0000
|
||||||
|
|
||||||
|
//
|
||||||
|
// RSDP address
|
||||||
|
//
|
||||||
|
#define CLOUDHV_RSDP_ADDRESS 0xa0000
|
||||||
|
|
||||||
#endif // __CLOUDHV_H__
|
#endif // __CLOUDHV_H__
|
||||||
|
|
Loading…
Reference in New Issue