mirror of https://github.com/acidanthera/audk.git
79 lines
3.0 KiB
C
79 lines
3.0 KiB
C
|
/** @file
|
||
|
Provide common utility functions to PciHostBridgeLib instances in
|
||
|
ArmVirtPkg and OvmfPkg.
|
||
|
|
||
|
Copyright (C) 2016, Red Hat, Inc.
|
||
|
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
|
||
|
Copyright (c) 2020, Huawei Corporation. All rights reserved.<BR>
|
||
|
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#include <IndustryStandard/Acpi10.h>
|
||
|
#include <Library/DebugLib.h>
|
||
|
#include <Library/PciHostBridgeUtilityLib.h>
|
||
|
|
||
|
|
||
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||
|
CHAR16 *mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr[] = {
|
||
|
L"Mem", L"I/O", L"Bus"
|
||
|
};
|
||
|
|
||
|
|
||
|
/**
|
||
|
Utility function to inform the platform that the resource conflict happens.
|
||
|
|
||
|
@param[in] Configuration Pointer to PCI I/O and PCI memory resource
|
||
|
descriptors. The Configuration contains the
|
||
|
resources for all the root bridges. The resource
|
||
|
for each root bridge is terminated with END
|
||
|
descriptor and an additional END is appended
|
||
|
indicating the end of the entire resources. The
|
||
|
resource descriptor field values follow the
|
||
|
description in
|
||
|
EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL
|
||
|
.SubmitResources().
|
||
|
**/
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
PciHostBridgeUtilityResourceConflict (
|
||
|
IN VOID *Configuration
|
||
|
)
|
||
|
{
|
||
|
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor;
|
||
|
UINTN RootBridgeIndex;
|
||
|
DEBUG ((DEBUG_ERROR, "PciHostBridge: Resource conflict happens!\n"));
|
||
|
|
||
|
RootBridgeIndex = 0;
|
||
|
Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Configuration;
|
||
|
while (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {
|
||
|
DEBUG ((DEBUG_ERROR, "RootBridge[%d]:\n", RootBridgeIndex++));
|
||
|
for (; Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR; Descriptor++) {
|
||
|
ASSERT (Descriptor->ResType <
|
||
|
ARRAY_SIZE (mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr)
|
||
|
);
|
||
|
DEBUG ((DEBUG_ERROR, " %s: Length/Alignment = 0x%lx / 0x%lx\n",
|
||
|
mPciHostBridgeUtilityLibAcpiAddressSpaceTypeStr[Descriptor->ResType],
|
||
|
Descriptor->AddrLen, Descriptor->AddrRangeMax
|
||
|
));
|
||
|
if (Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {
|
||
|
DEBUG ((DEBUG_ERROR, " Granularity/SpecificFlag = %ld / %02x%s\n",
|
||
|
Descriptor->AddrSpaceGranularity, Descriptor->SpecificFlag,
|
||
|
((Descriptor->SpecificFlag &
|
||
|
EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE
|
||
|
) != 0) ? L" (Prefetchable)" : L""
|
||
|
));
|
||
|
}
|
||
|
}
|
||
|
//
|
||
|
// Skip the END descriptor for root bridge
|
||
|
//
|
||
|
ASSERT (Descriptor->Desc == ACPI_END_TAG_DESCRIPTOR);
|
||
|
Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)(
|
||
|
(EFI_ACPI_END_TAG_DESCRIPTOR *)Descriptor + 1
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|