mirror of https://github.com/acidanthera/audk.git
OvmfPkg/XenAcpiPlatformDxe: remove the QEMU ACPI linker/loader client
The root of the QEMU ACPI linker/loader client in XenAcpiPlatformDxe is the InstallQemuFwCfgTables() function. This function always fails on Xen, due to its top-most QemuFwCfgFindFile() call. Remove the InstallQemuFwCfgTables() function call from XenAcpiPlatformDxe, along with all dependencies that now become unused. Cc: Anthony Perard <anthony.perard@citrix.com> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Julien Grall <julien@xen.org> Cc: Philippe Mathieu-Daudé <philmd@redhat.com> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2122 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20210526201446.12554-14-lersek@redhat.com> Reviewed-by: Ard Biesheuvel <ardb@kernel.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
This commit is contained in:
parent
a31fcb5096
commit
4115840c28
|
@ -256,7 +256,7 @@ InstallAcpiTables (
|
||||||
if (XenDetected ()) {
|
if (XenDetected ()) {
|
||||||
Status = InstallXenTables (AcpiTable);
|
Status = InstallXenTables (AcpiTable);
|
||||||
} else {
|
} else {
|
||||||
Status = InstallQemuFwCfgTables (AcpiTable);
|
Status = EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
|
|
|
@ -11,14 +11,6 @@
|
||||||
#define ACPI_PLATFORM_H_
|
#define ACPI_PLATFORM_H_
|
||||||
|
|
||||||
#include <Protocol/AcpiTable.h> // EFI_ACPI_TABLE_PROTOCOL
|
#include <Protocol/AcpiTable.h> // EFI_ACPI_TABLE_PROTOCOL
|
||||||
#include <Protocol/PciIo.h> // EFI_PCI_IO_PROTOCOL
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
|
||||||
UINT64 PciAttributes;
|
|
||||||
} ORIGINAL_ATTRIBUTES;
|
|
||||||
|
|
||||||
typedef struct S3_CONTEXT S3_CONTEXT;
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
|
@ -49,54 +41,11 @@ InstallXenTables (
|
||||||
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol
|
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
InstallQemuFwCfgTables (
|
|
||||||
IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol
|
|
||||||
);
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InstallAcpiTables (
|
InstallAcpiTables (
|
||||||
IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable
|
IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable
|
||||||
);
|
);
|
||||||
|
|
||||||
VOID
|
|
||||||
EnablePciDecoding (
|
|
||||||
OUT ORIGINAL_ATTRIBUTES **OriginalAttributes,
|
|
||||||
OUT UINTN *Count
|
|
||||||
);
|
|
||||||
|
|
||||||
VOID
|
|
||||||
RestorePciDecoding (
|
|
||||||
IN ORIGINAL_ATTRIBUTES *OriginalAttributes,
|
|
||||||
IN UINTN Count
|
|
||||||
);
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
AllocateS3Context (
|
|
||||||
OUT S3_CONTEXT **S3Context,
|
|
||||||
IN UINTN WritePointerCount
|
|
||||||
);
|
|
||||||
|
|
||||||
VOID
|
|
||||||
ReleaseS3Context (
|
|
||||||
IN S3_CONTEXT *S3Context
|
|
||||||
);
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
SaveCondensedWritePointerToS3Context (
|
|
||||||
IN OUT S3_CONTEXT *S3Context,
|
|
||||||
IN UINT16 PointerItem,
|
|
||||||
IN UINT8 PointerSize,
|
|
||||||
IN UINT32 PointerOffset,
|
|
||||||
IN UINT64 PointerValue
|
|
||||||
);
|
|
||||||
|
|
||||||
EFI_STATUS
|
|
||||||
TransferS3ContextToBootScript (
|
|
||||||
IN S3_CONTEXT *S3Context
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1,269 +0,0 @@
|
||||||
/** @file
|
|
||||||
Append an ACPI S3 Boot Script fragment from the QEMU_LOADER_WRITE_POINTER
|
|
||||||
commands of QEMU's fully processed table linker/loader script.
|
|
||||||
|
|
||||||
Copyright (C) 2017-2021, Red Hat, Inc.
|
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
**/
|
|
||||||
|
|
||||||
#include <Library/BaseLib.h> // CpuDeadLoop()
|
|
||||||
#include <Library/DebugLib.h> // DEBUG()
|
|
||||||
#include <Library/MemoryAllocationLib.h> // AllocatePool()
|
|
||||||
#include <Library/QemuFwCfgS3Lib.h> // QemuFwCfgS3ScriptSkipBytes()
|
|
||||||
|
|
||||||
#include "AcpiPlatform.h"
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Condensed structure for capturing the fw_cfg operations -- select, skip,
|
|
||||||
// write -- inherent in executing a QEMU_LOADER_WRITE_POINTER command.
|
|
||||||
//
|
|
||||||
typedef struct {
|
|
||||||
UINT16 PointerItem; // resolved from QEMU_LOADER_WRITE_POINTER.PointerFile
|
|
||||||
UINT8 PointerSize; // copied as-is from QEMU_LOADER_WRITE_POINTER
|
|
||||||
UINT32 PointerOffset; // copied as-is from QEMU_LOADER_WRITE_POINTER
|
|
||||||
UINT64 PointerValue; // resolved from QEMU_LOADER_WRITE_POINTER.PointeeFile
|
|
||||||
// and QEMU_LOADER_WRITE_POINTER.PointeeOffset
|
|
||||||
} CONDENSED_WRITE_POINTER;
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Context structure to accumulate CONDENSED_WRITE_POINTER objects from
|
|
||||||
// QEMU_LOADER_WRITE_POINTER commands.
|
|
||||||
//
|
|
||||||
// Any pointers in this structure own the pointed-to objects; that is, when the
|
|
||||||
// context structure is released, all pointed-to objects must be released too.
|
|
||||||
//
|
|
||||||
struct S3_CONTEXT {
|
|
||||||
CONDENSED_WRITE_POINTER *WritePointers; // one array element per processed
|
|
||||||
// QEMU_LOADER_WRITE_POINTER
|
|
||||||
// command
|
|
||||||
UINTN Allocated; // number of elements allocated for
|
|
||||||
// WritePointers
|
|
||||||
UINTN Used; // number of elements populated in
|
|
||||||
// WritePointers
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Scratch buffer, allocated in EfiReservedMemoryType type memory, for the ACPI
|
|
||||||
// S3 Boot Script opcodes to work on.
|
|
||||||
//
|
|
||||||
#pragma pack (1)
|
|
||||||
typedef union {
|
|
||||||
UINT64 PointerValue; // filled in from CONDENSED_WRITE_POINTER.PointerValue
|
|
||||||
} SCRATCH_BUFFER;
|
|
||||||
#pragma pack ()
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Allocate an S3_CONTEXT object.
|
|
||||||
|
|
||||||
@param[out] S3Context The allocated S3_CONTEXT object is returned
|
|
||||||
through this parameter.
|
|
||||||
|
|
||||||
@param[in] WritePointerCount Number of CONDENSED_WRITE_POINTER elements to
|
|
||||||
allocate room for. WritePointerCount must be
|
|
||||||
positive.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS Allocation successful.
|
|
||||||
|
|
||||||
@retval EFI_OUT_OF_RESOURCES Out of memory.
|
|
||||||
|
|
||||||
@retval EFI_INVALID_PARAMETER WritePointerCount is zero.
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
AllocateS3Context (
|
|
||||||
OUT S3_CONTEXT **S3Context,
|
|
||||||
IN UINTN WritePointerCount
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
S3_CONTEXT *Context;
|
|
||||||
|
|
||||||
if (WritePointerCount == 0) {
|
|
||||||
return EFI_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
|
|
||||||
Context = AllocateZeroPool (sizeof *Context);
|
|
||||||
if (Context == NULL) {
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
|
|
||||||
Context->WritePointers = AllocatePool (WritePointerCount *
|
|
||||||
sizeof *Context->WritePointers);
|
|
||||||
if (Context->WritePointers == NULL) {
|
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
|
||||||
goto FreeContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
Context->Allocated = WritePointerCount;
|
|
||||||
*S3Context = Context;
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
|
|
||||||
FreeContext:
|
|
||||||
FreePool (Context);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Release an S3_CONTEXT object.
|
|
||||||
|
|
||||||
@param[in] S3Context The object to release.
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
ReleaseS3Context (
|
|
||||||
IN S3_CONTEXT *S3Context
|
|
||||||
)
|
|
||||||
{
|
|
||||||
FreePool (S3Context->WritePointers);
|
|
||||||
FreePool (S3Context);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Save the information necessary to replicate a QEMU_LOADER_WRITE_POINTER
|
|
||||||
command during S3 resume, in condensed format.
|
|
||||||
|
|
||||||
This function is to be called from ProcessCmdWritePointer(), after all the
|
|
||||||
sanity checks have passed, and before the fw_cfg operations are performed.
|
|
||||||
|
|
||||||
@param[in,out] S3Context The S3_CONTEXT object into which the caller wants
|
|
||||||
to save the information that was derived from
|
|
||||||
QEMU_LOADER_WRITE_POINTER.
|
|
||||||
|
|
||||||
@param[in] PointerItem The FIRMWARE_CONFIG_ITEM that
|
|
||||||
QEMU_LOADER_WRITE_POINTER.PointerFile was resolved
|
|
||||||
to, expressed as a UINT16 value.
|
|
||||||
|
|
||||||
@param[in] PointerSize Copied directly from
|
|
||||||
QEMU_LOADER_WRITE_POINTER.PointerSize.
|
|
||||||
|
|
||||||
@param[in] PointerOffset Copied directly from
|
|
||||||
QEMU_LOADER_WRITE_POINTER.PointerOffset.
|
|
||||||
|
|
||||||
@param[in] PointerValue The base address of the allocated / downloaded
|
|
||||||
fw_cfg blob that is identified by
|
|
||||||
QEMU_LOADER_WRITE_POINTER.PointeeFile, plus
|
|
||||||
QEMU_LOADER_WRITE_POINTER.PointeeOffset.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The information derived from
|
|
||||||
QEMU_LOADER_WRITE_POINTER has been successfully
|
|
||||||
absorbed into S3Context.
|
|
||||||
|
|
||||||
@retval EFI_OUT_OF_RESOURCES No room available in S3Context.
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
SaveCondensedWritePointerToS3Context (
|
|
||||||
IN OUT S3_CONTEXT *S3Context,
|
|
||||||
IN UINT16 PointerItem,
|
|
||||||
IN UINT8 PointerSize,
|
|
||||||
IN UINT32 PointerOffset,
|
|
||||||
IN UINT64 PointerValue
|
|
||||||
)
|
|
||||||
{
|
|
||||||
CONDENSED_WRITE_POINTER *Condensed;
|
|
||||||
|
|
||||||
if (S3Context->Used == S3Context->Allocated) {
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
Condensed = S3Context->WritePointers + S3Context->Used;
|
|
||||||
Condensed->PointerItem = PointerItem;
|
|
||||||
Condensed->PointerSize = PointerSize;
|
|
||||||
Condensed->PointerOffset = PointerOffset;
|
|
||||||
Condensed->PointerValue = PointerValue;
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "%a: 0x%04x/[0x%08x+%d] := 0x%Lx (%Lu)\n",
|
|
||||||
__FUNCTION__, PointerItem, PointerOffset, PointerSize, PointerValue,
|
|
||||||
(UINT64)S3Context->Used));
|
|
||||||
++S3Context->Used;
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
FW_CFG_BOOT_SCRIPT_CALLBACK_FUNCTION provided to QemuFwCfgS3Lib.
|
|
||||||
**/
|
|
||||||
STATIC
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
AppendFwCfgBootScript (
|
|
||||||
IN OUT VOID *Context, OPTIONAL
|
|
||||||
IN OUT VOID *ExternalScratchBuffer
|
|
||||||
)
|
|
||||||
{
|
|
||||||
S3_CONTEXT *S3Context;
|
|
||||||
SCRATCH_BUFFER *ScratchBuffer;
|
|
||||||
UINTN Index;
|
|
||||||
|
|
||||||
S3Context = Context;
|
|
||||||
ScratchBuffer = ExternalScratchBuffer;
|
|
||||||
|
|
||||||
for (Index = 0; Index < S3Context->Used; ++Index) {
|
|
||||||
CONST CONDENSED_WRITE_POINTER *Condensed;
|
|
||||||
RETURN_STATUS Status;
|
|
||||||
|
|
||||||
Condensed = &S3Context->WritePointers[Index];
|
|
||||||
|
|
||||||
Status = QemuFwCfgS3ScriptSkipBytes (Condensed->PointerItem,
|
|
||||||
Condensed->PointerOffset);
|
|
||||||
if (RETURN_ERROR (Status)) {
|
|
||||||
goto FatalError;
|
|
||||||
}
|
|
||||||
|
|
||||||
ScratchBuffer->PointerValue = Condensed->PointerValue;
|
|
||||||
Status = QemuFwCfgS3ScriptWriteBytes (-1, Condensed->PointerSize);
|
|
||||||
if (RETURN_ERROR (Status)) {
|
|
||||||
goto FatalError;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DEBUG ((DEBUG_VERBOSE, "%a: boot script fragment saved\n", __FUNCTION__));
|
|
||||||
|
|
||||||
ReleaseS3Context (S3Context);
|
|
||||||
return;
|
|
||||||
|
|
||||||
FatalError:
|
|
||||||
ASSERT (FALSE);
|
|
||||||
CpuDeadLoop ();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Translate and append the information from an S3_CONTEXT object to the ACPI S3
|
|
||||||
Boot Script.
|
|
||||||
|
|
||||||
The effects of a successful call to this function cannot be undone.
|
|
||||||
|
|
||||||
@param[in] S3Context The S3_CONTEXT object to translate to ACPI S3 Boot
|
|
||||||
Script opcodes. If the function returns successfully,
|
|
||||||
the caller must set the S3Context pointer -- originally
|
|
||||||
returned by AllocateS3Context() -- immediately to NULL,
|
|
||||||
because the ownership of S3Context has been transferred.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The translation of S3Context to ACPI S3 Boot Script
|
|
||||||
opcodes has been successfully executed or queued. (This
|
|
||||||
includes the case when S3Context was empty on input and
|
|
||||||
no ACPI S3 Boot Script opcodes have been necessary to
|
|
||||||
produce.)
|
|
||||||
|
|
||||||
@return Error codes from underlying functions.
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
TransferS3ContextToBootScript (
|
|
||||||
IN S3_CONTEXT *S3Context
|
|
||||||
)
|
|
||||||
{
|
|
||||||
RETURN_STATUS Status;
|
|
||||||
|
|
||||||
if (S3Context->Used == 0) {
|
|
||||||
ReleaseS3Context (S3Context);
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = QemuFwCfgS3CallWhenBootScriptReady (AppendFwCfgBootScript,
|
|
||||||
S3Context, sizeof (SCRATCH_BUFFER));
|
|
||||||
return (EFI_STATUS)Status;
|
|
||||||
}
|
|
|
@ -1,194 +0,0 @@
|
||||||
/** @file
|
|
||||||
Temporarily enable IO and MMIO decoding for all PCI devices while QEMU
|
|
||||||
regenerates the ACPI tables.
|
|
||||||
|
|
||||||
Copyright (C) 2016-2021, Red Hat, Inc.
|
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
**/
|
|
||||||
|
|
||||||
#include <Library/DebugLib.h> // DEBUG()
|
|
||||||
#include <Library/MemoryAllocationLib.h> // AllocatePool()
|
|
||||||
#include <Library/UefiBootServicesTableLib.h> // gBS
|
|
||||||
|
|
||||||
#include "AcpiPlatform.h"
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Collect all PciIo protocol instances in the system. Save their original
|
|
||||||
attributes, and enable IO and MMIO decoding for each.
|
|
||||||
|
|
||||||
This is a best effort function; it doesn't return status codes. Its
|
|
||||||
caller is supposed to proceed even if this function fails.
|
|
||||||
|
|
||||||
@param[out] OriginalAttributes On output, a dynamically allocated array of
|
|
||||||
ORIGINAL_ATTRIBUTES elements. The array lists
|
|
||||||
the PciIo protocol instances found in the
|
|
||||||
system at the time of the call, plus the
|
|
||||||
original PCI attributes for each.
|
|
||||||
|
|
||||||
Before returning, the function enables IO and
|
|
||||||
MMIO decoding for each PciIo instance it
|
|
||||||
finds.
|
|
||||||
|
|
||||||
On error, or when no such instances are
|
|
||||||
found, OriginalAttributes is set to NULL.
|
|
||||||
|
|
||||||
@param[out] Count On output, the number of elements in
|
|
||||||
OriginalAttributes. On error it is set to
|
|
||||||
zero.
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
EnablePciDecoding (
|
|
||||||
OUT ORIGINAL_ATTRIBUTES **OriginalAttributes,
|
|
||||||
OUT UINTN *Count
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
UINTN NoHandles;
|
|
||||||
EFI_HANDLE *Handles;
|
|
||||||
ORIGINAL_ATTRIBUTES *OrigAttrs;
|
|
||||||
UINTN Idx;
|
|
||||||
|
|
||||||
*OriginalAttributes = NULL;
|
|
||||||
*Count = 0;
|
|
||||||
|
|
||||||
if (PcdGetBool (PcdPciDisableBusEnumeration)) {
|
|
||||||
//
|
|
||||||
// The platform downloads ACPI tables from QEMU in general, but there are
|
|
||||||
// no root bridges in this execution. We're done.
|
|
||||||
//
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiPciIoProtocolGuid,
|
|
||||||
NULL /* SearchKey */, &NoHandles, &Handles);
|
|
||||||
if (Status == EFI_NOT_FOUND) {
|
|
||||||
//
|
|
||||||
// No PCI devices were found on either of the root bridges. We're done.
|
|
||||||
//
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_WARN, "%a: LocateHandleBuffer(): %r\n", __FUNCTION__,
|
|
||||||
Status));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
OrigAttrs = AllocatePool (NoHandles * sizeof *OrigAttrs);
|
|
||||||
if (OrigAttrs == NULL) {
|
|
||||||
DEBUG ((DEBUG_WARN, "%a: AllocatePool(): out of resources\n",
|
|
||||||
__FUNCTION__));
|
|
||||||
goto FreeHandles;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Idx = 0; Idx < NoHandles; ++Idx) {
|
|
||||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
|
||||||
UINT64 Attributes;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Look up PciIo on the handle and stash it
|
|
||||||
//
|
|
||||||
Status = gBS->HandleProtocol (Handles[Idx], &gEfiPciIoProtocolGuid,
|
|
||||||
(VOID**)&PciIo);
|
|
||||||
ASSERT_EFI_ERROR (Status);
|
|
||||||
OrigAttrs[Idx].PciIo = PciIo;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Stash the current attributes
|
|
||||||
//
|
|
||||||
Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationGet, 0,
|
|
||||||
&OrigAttrs[Idx].PciAttributes);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_WARN, "%a: EfiPciIoAttributeOperationGet: %r\n",
|
|
||||||
__FUNCTION__, Status));
|
|
||||||
goto RestoreAttributes;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Retrieve supported attributes
|
|
||||||
//
|
|
||||||
Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationSupported, 0,
|
|
||||||
&Attributes);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_WARN, "%a: EfiPciIoAttributeOperationSupported: %r\n",
|
|
||||||
__FUNCTION__, Status));
|
|
||||||
goto RestoreAttributes;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Enable IO and MMIO decoding
|
|
||||||
//
|
|
||||||
Attributes &= EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY;
|
|
||||||
Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationEnable,
|
|
||||||
Attributes, NULL);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_WARN, "%a: EfiPciIoAttributeOperationEnable: %r\n",
|
|
||||||
__FUNCTION__, Status));
|
|
||||||
goto RestoreAttributes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Success
|
|
||||||
//
|
|
||||||
FreePool (Handles);
|
|
||||||
*OriginalAttributes = OrigAttrs;
|
|
||||||
*Count = NoHandles;
|
|
||||||
return;
|
|
||||||
|
|
||||||
RestoreAttributes:
|
|
||||||
while (Idx > 0) {
|
|
||||||
--Idx;
|
|
||||||
OrigAttrs[Idx].PciIo->Attributes (OrigAttrs[Idx].PciIo,
|
|
||||||
EfiPciIoAttributeOperationSet,
|
|
||||||
OrigAttrs[Idx].PciAttributes,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
}
|
|
||||||
FreePool (OrigAttrs);
|
|
||||||
|
|
||||||
FreeHandles:
|
|
||||||
FreePool (Handles);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Restore the original PCI attributes saved with EnablePciDecoding().
|
|
||||||
|
|
||||||
@param[in] OriginalAttributes The array allocated and populated by
|
|
||||||
EnablePciDecoding(). This parameter may be
|
|
||||||
NULL. If OriginalAttributes is NULL, then the
|
|
||||||
function is a no-op; otherwise the PciIo
|
|
||||||
attributes will be restored, and the
|
|
||||||
OriginalAttributes array will be freed.
|
|
||||||
|
|
||||||
@param[in] Count The Count value stored by EnablePciDecoding(),
|
|
||||||
the number of elements in OriginalAttributes.
|
|
||||||
Count may be zero if and only if
|
|
||||||
OriginalAttributes is NULL.
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
RestorePciDecoding (
|
|
||||||
IN ORIGINAL_ATTRIBUTES *OriginalAttributes,
|
|
||||||
IN UINTN Count
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINTN Idx;
|
|
||||||
|
|
||||||
ASSERT ((OriginalAttributes == NULL) == (Count == 0));
|
|
||||||
if (OriginalAttributes == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Idx = 0; Idx < Count; ++Idx) {
|
|
||||||
OriginalAttributes[Idx].PciIo->Attributes (
|
|
||||||
OriginalAttributes[Idx].PciIo,
|
|
||||||
EfiPciIoAttributeOperationSet,
|
|
||||||
OriginalAttributes[Idx].PciAttributes,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
}
|
|
||||||
FreePool (OriginalAttributes);
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -24,11 +24,8 @@
|
||||||
[Sources]
|
[Sources]
|
||||||
AcpiPlatform.c
|
AcpiPlatform.c
|
||||||
AcpiPlatform.h
|
AcpiPlatform.h
|
||||||
BootScript.c
|
|
||||||
EntryPoint.c
|
EntryPoint.c
|
||||||
PciDecoding.c
|
|
||||||
Qemu.c
|
Qemu.c
|
||||||
QemuFwCfgAcpi.c
|
|
||||||
Xen.c
|
Xen.c
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
|
@ -43,10 +40,8 @@
|
||||||
DebugLib
|
DebugLib
|
||||||
DxeServicesTableLib
|
DxeServicesTableLib
|
||||||
MemoryAllocationLib
|
MemoryAllocationLib
|
||||||
OrderedCollectionLib
|
|
||||||
PcdLib
|
PcdLib
|
||||||
QemuFwCfgLib
|
QemuFwCfgLib
|
||||||
QemuFwCfgS3Lib
|
|
||||||
UefiBootServicesTableLib
|
UefiBootServicesTableLib
|
||||||
UefiDriverEntryPoint
|
UefiDriverEntryPoint
|
||||||
XenPlatformLib
|
XenPlatformLib
|
||||||
|
@ -54,7 +49,6 @@
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED
|
||||||
gEfiFirmwareVolume2ProtocolGuid # PROTOCOL SOMETIMES_CONSUMED
|
gEfiFirmwareVolume2ProtocolGuid # PROTOCOL SOMETIMES_CONSUMED
|
||||||
gEfiPciIoProtocolGuid # PROTOCOL SOMETIMES_CONSUMED
|
|
||||||
|
|
||||||
[Guids]
|
[Guids]
|
||||||
gRootBridgesConnectedEventGroupGuid
|
gRootBridgesConnectedEventGroupGuid
|
||||||
|
|
Loading…
Reference in New Issue