CloverBootloader/OvmfPkg/Library/HardwareInfoLib/HardwareInfoPciHostBridgeLib.h

257 lines
10 KiB
C

/**@file
Hardware info library with types and accessors to parse information about
PCI host bridges.
Copyright 2021 - 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef __HARDWARE_INFO_PCI_HOST_BRIDGE_LIB_H__
#define __HARDWARE_INFO_PCI_HOST_BRIDGE_LIB_H__
#include <Uefi/UefiBaseType.h>
#include <Uefi/UefiSpec.h>
#include <Library/PciHostBridgeLib.h>
//
// Host Bridge resources information
//
#pragma pack(1)
typedef struct {
//
// Feature tracking, initially 0
//
UINT64 Version;
//
// Host bridge enabled attributes (EFI_PCI_ATTRIBUTE_*)
//
UINT64 Attributes;
union {
UINT32 Uint32;
struct {
UINT32 DmaAbove4G : 1;
UINT32 NoExtendedConfigSpace : 1;
UINT32 CombineMemPMem : 1;
UINT32 Reserved : 29;
} Bits;
} Flags;
//
// Bus number range
//
UINT8 BusNrStart;
UINT8 BusNrLast;
UINT8 Padding[2];
//
// IO aperture
//
UINT64 IoStart;
UINT64 IoSize;
//
// 32-bit MMIO aperture
//
UINT64 MemStart;
UINT64 MemSize;
//
// 32-bit prefetchable MMIO aperture
//
UINT64 PMemStart;
UINT64 PMemSize;
//
// 64-bit MMIO aperture
//
UINT64 MemAbove4GStart;
UINT64 MemAbove4GSize;
//
// 64-bit prefetchable MMIO aperture
//
UINT64 PMemAbove4GStart;
UINT64 PMemAbove4GSize;
//
// MMIO accessible PCIe config space (ECAM)
//
UINT64 PcieConfigStart;
UINT64 PcieConfigSize;
} HOST_BRIDGE_INFO;
#pragma pack()
/**
Extract the last MMIO address, either from high (64-bit) or low (32-bit)
memory used by the HostBridge's apertures.
@param[in] HostBridge Root bridge's resources specification
@param[in] DataSize Size in bytes of the actually filled
data available in the HostBridge object
@param[in] HighMem 64-bit (true) or 32-bit (false) MMIO
address
@param[out] LastMmioAddress Pointer to last MMIO address
@retval EFI_SUCCESS Operation succeeded
@retval EFI_INVALID_PARAMETER One or more pointer parameters are
invalid
@retval EFI_INCOMPATIBLE_VERSION HostBridge information belongs to
an unsupported version
**/
EFI_STATUS
HardwareInfoPciHostBridgeLastMmioAddress (
IN CONST HOST_BRIDGE_INFO *HostBridge,
IN UINTN DataSize,
IN BOOLEAN HighMem,
OUT UINT64 *LastMmioAddress
);
/**
Interpret the HostBridge resources and extact the bus number
range.
@param[in] HostBridge Root bridge's resources specification
@param[in] DataSize Size in bytes of the actually filled
data available in the HostBridge object
@param[out] BusNrStart Pointer to the Bus Number range start
@param[out] BusNrLast Pointer to the Bus Number range end
@retval EFI_SUCCESS Retrieved the bus number range
without any issues.
@retval EFI_INVALID_PARAMETER One of the parameters is invalid,
either NULL pointer or size 0
@retval EFI_INCOMPATIBLE_VERSION HostBridge data of unsupported
version
**/
EFI_STATUS
HardwareInfoPciHostBridgeGetBusNrRange (
IN CONST HOST_BRIDGE_INFO *HostBridge,
IN UINTN DataSize,
OUT UINTN *BusNrStart,
OUT UINTN *BusNrLast
);
/**
Interpret the MMIO resources in HostBridge and set the apertures
in 32-bit space (Mem), 64-bit space (MemAbove4G), PIO (IO) and
ECAM (PcieConfig) accordingly.
The 2 types of apertures in each MMIO space (prefetchable and
non-prefetchable) may be merged into a single window, hence if both
types of apertures are defined while the CombineMemPMem flag is set,
the ranges must be contiguous.
@param[in] HostBridge Root bridge's resources specification
@param[in] DataSize Size in bytes of the actually filled
data available in the HostBridge object
@param[out] Mem Pointer to 32-bit MMIO aperture
@param[out] MemAbove4G Pointer to 64-bit MMIO aperture
@param[out] PMem Pointer to the 32-bit prefetchable MMIO aperture
@param[out] PMemAbove4G Pointer to the 64-bit prefetchable MMIO aperture
@param[out] PcieConfig Pointer to MMIO mapped PCIe config aperture (ECAM)
@retval EFI_INVALID_PARAMETER HostBridge object is invalid
@retval EFI_INCOMPATIBLE_VERSION HostBridge information belongs to
an unsupported version
@retval EFI_WARN_STALE_DATA One or more valid aperture in the
HostBridge's resources were ignored
because corresponding aperture pointer
is NULL.
@retval EFI_SUCCESS Operation executed cleanly, all valid
ranges were parsed into the corresponding
aperture object.
**/
EFI_STATUS
HardwareInfoPciHostBridgeGetApertures (
IN CONST HOST_BRIDGE_INFO *HostBridge,
IN UINTN DataSize,
OUT PCI_ROOT_BRIDGE_APERTURE *Io,
OUT PCI_ROOT_BRIDGE_APERTURE *Mem,
OUT PCI_ROOT_BRIDGE_APERTURE *MemAbove4G,
OUT PCI_ROOT_BRIDGE_APERTURE *PMem,
OUT PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G,
OUT PCI_ROOT_BRIDGE_APERTURE *PcieConfig
);
/**
Retrieve all flags and attributes of a host bridge describing the
resources and capabilities.
@param[in] HostBridge Host bridge information object
@param[in] DataSize Size in bytes of the actually filled
data available in the HostBridge object
@param[out] Attributes Pointer to the host bridge's attributes
@param[out] DmaAbove4G Pointer to the DMA Above 4G flag
@param[out] NoExtendedConfigSpace Pointer to the Extended Config Space flag
@param[out] CombineMemPMem Pointer to the Combine Mem and PMem flag
@retval EFI_INVALID_PARAMETER HostBridge object is invalid
@retval EFI_INCOMPATIBLE_VERSION HostBridge information belongs to
an unsupported version
@retval EFI_SUCCESS Operation executed cleanly
**/
EFI_STATUS
HardwareInfoPciHostBridgeGetFlags (
IN CONST HOST_BRIDGE_INFO *HostBridge,
IN UINTN DataSize,
OUT UINT64 *Attributes OPTIONAL,
OUT BOOLEAN *DmaAbove4G OPTIONAL,
OUT BOOLEAN *NoExtendedConfigSpace OPTIONAL,
OUT BOOLEAN *CombineMemPMem OPTIONAL
);
/**
Getter that parses information from a HOST_BRIDGE_INFO object
into smaller chunks of types handled by the PciHostBridgeLib.
@param[in] HostBridge Host bridge information object
@param[in] DataSize Size in bytes of the actually filled
data available in the HostBridge object
@param[out] BusNrStart Pointer to the Bus Number range start
@param[out] BusNrLast Pointer to the Bus Number range end
@param[out] Attributes Pointer to the host bridge's attributes
@param[out] DmaAbove4G Pointer to the DMA Above 4G flag
@param[out] NoExtendedConfigSpace Pointer to the Extended Config Space flag
@param[out] CombineMemPMem Pointer to the Combine Mem and PMem flag
@param[out] Io Pointer to the PIO aperture object
@param[out] Mem Pointer to the 32-bit MMIO aperture object
@param[out] MemAbove4G Pointer to the 64-bit MMIO aperture object
@param[out] PMem Pointer to the 32-bit prefetchable MMIO
aperture object
@param[out] PMemAbove4G Pointer to the 64-bit prefetchable MMIO
aperture object
@param[out] PcieConfig MMIO mapped PCIe config aperture (ECAM)
@retval EFI_SUCCESS Whole operation succeeded
@retval EFI_INVALID_PARAMETER HostBridge object and/or non-optional
output parameters are invalid
@retval EFI_INCOMPATIBLE_VERSION HostBridge information provided belongs to
and unsupported version
@retval EFI_WARN_STALE_DATA One or more apertures having valid ranges
in the HostBridge info were ignored because
the correspnding aperture pointer is NULL
**/
EFI_STATUS
HardwareInfoPciHostBridgeGet (
IN CONST HOST_BRIDGE_INFO *HostBridge,
IN UINTN DataSize,
OUT UINTN *BusNrStart,
OUT UINTN *BusNrLast,
OUT UINT64 *Attributes OPTIONAL,
OUT BOOLEAN *DmaAbove4G OPTIONAL,
OUT BOOLEAN *NoExtendedConfigSpace OPTIONAL,
OUT BOOLEAN *CombineMemPMem OPTIONAL,
OUT PCI_ROOT_BRIDGE_APERTURE *Io OPTIONAL,
OUT PCI_ROOT_BRIDGE_APERTURE *Mem OPTIONAL,
OUT PCI_ROOT_BRIDGE_APERTURE *MemAbove4G OPTIONAL,
OUT PCI_ROOT_BRIDGE_APERTURE *PMem OPTIONAL,
OUT PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G OPTIONAL,
OUT PCI_ROOT_BRIDGE_APERTURE *PcieConfig OPTIONAL
);
#endif // __HARDWARE_INFO_PCI_HOST_BRIDGE_LIB_H__