mirror of https://github.com/acidanthera/audk.git
257 lines
10 KiB
C
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__
|