mirror of https://github.com/acidanthera/audk.git
82 lines
1.9 KiB
C
82 lines
1.9 KiB
C
/** @file
|
|
OVMF ACPI Platform Driver for Xen guests
|
|
|
|
Copyright (C) 2021, Red Hat, Inc.
|
|
Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include <Library/AcpiPlatformLib.h> // InstallAcpiTablesFromMemory()
|
|
#include <Library/DebugLib.h> // DEBUG()
|
|
#include <Library/XenPlatformLib.h> // XenDetected()
|
|
|
|
#include "AcpiPlatform.h"
|
|
|
|
#define XEN_ACPI_PHYSICAL_ADDRESS 0x000EA020
|
|
#define XEN_BIOS_PHYSICAL_END 0x000FFFFF
|
|
|
|
/**
|
|
Effective entrypoint of Acpi Platform driver.
|
|
|
|
@param ImageHandle
|
|
@param SystemTable
|
|
|
|
@return EFI_SUCCESS
|
|
@return EFI_LOAD_ERROR
|
|
@return EFI_OUT_OF_RESOURCES
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
InstallAcpiTables (
|
|
IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable
|
|
)
|
|
{
|
|
EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdpStructurePtr;
|
|
EFI_XEN_INFO *XenInfo;
|
|
EFI_STATUS Status;
|
|
|
|
if (XenDetected ()) {
|
|
//
|
|
// Detect the RSDP structure
|
|
//
|
|
|
|
//
|
|
// First look for PVH one
|
|
//
|
|
XenInfo = XenGetInfoHOB ();
|
|
ASSERT (XenInfo != NULL);
|
|
if (XenInfo->RsdpPvh != NULL) {
|
|
DEBUG ((
|
|
DEBUG_INFO,
|
|
"%a: Use ACPI RSDP table at 0x%p\n",
|
|
gEfiCallerBaseName,
|
|
XenInfo->RsdpPvh
|
|
));
|
|
RsdpStructurePtr = XenInfo->RsdpPvh;
|
|
} else {
|
|
//
|
|
// Otherwise, look for the HVM one
|
|
//
|
|
Status = GetAcpiRsdpFromMemory (
|
|
XEN_ACPI_PHYSICAL_ADDRESS,
|
|
XEN_BIOS_PHYSICAL_END,
|
|
&RsdpStructurePtr
|
|
);
|
|
if (EFI_ERROR (Status)) {
|
|
return Status;
|
|
}
|
|
}
|
|
|
|
Status = InstallAcpiTablesFromRsdp (
|
|
AcpiTable,
|
|
RsdpStructurePtr
|
|
);
|
|
} else {
|
|
Status = EFI_UNSUPPORTED;
|
|
}
|
|
|
|
return Status;
|
|
}
|