/**@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__ |