/** @file
Intel VTd library definitions.
Copyright (c) 2023 Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _INTEL_VTD_PEI_DXE_LIB_H_
#define _INTEL_VTD_PEI_DXE_LIB_H_
//
// Include files
//
#include
#include
#include
#include
#if defined (EXT_CALLBACK)
#define _VTDLIB_DEBUG(PrintLevel, ...) \
do { \
VtdLogEventCallback (Context, CallbackHandle, PrintLevel, ##__VA_ARGS__); \
} while (FALSE)
#define VTDLIB_DEBUG(Expression) _VTDLIB_DEBUG Expression
#else
#define VTDLIB_DEBUG(Expression) DEBUG(Expression)
#endif
#pragma pack(1)
typedef struct {
UINT8 DeviceType;
VTD_SOURCE_ID PciSourceId;
EDKII_PLATFORM_VTD_PCI_DEVICE_ID PciDeviceId;
// for statistic analysis
UINT64 AccessCount;
} PCI_DEVICE_DATA;
typedef struct {
BOOLEAN IncludeAllFlag;
UINT16 Segment;
UINT32 PciDeviceDataMaxNumber;
UINT32 PciDeviceDataNumber;
PCI_DEVICE_DATA PciDeviceData[1];
} PCI_DEVICE_INFORMATION;
typedef struct {
UINT64 Uint64Lo;
UINT64 Uint64Hi;
}VTD_UINT128;
typedef struct {
UINT64 BaseAddress;
UINT32 VerReg;
UINT64 CapReg;
UINT64 EcapReg;
UINT32 GstsReg;
UINT64 RtaddrReg;
UINT64 CcmdReg;
UINT32 FstsReg;
UINT32 FectlReg;
UINT32 FedataReg;
UINT32 FeaddrReg;
UINT32 FeuaddrReg;
UINT64 IqercdReg;
UINT64 IvaReg;
UINT64 IotlbReg;
UINT16 FrcdRegNum; // Number of FRCD Registers
VTD_UINT128 FrcdReg[1];
} VTD_REGESTER_INFO;
typedef struct {
UINT64 BaseAddress;
UINT32 FstsReg;
UINT64 IqercdReg;
} VTD_REGESTER_QI_INFO;
typedef struct {
UINT64 BaseAddress;
UINT32 GstsReg;
UINT64 RtaddrReg;
UINT32 FstsReg;
UINT32 FectlReg;
UINT64 IqercdReg;
UINT16 FrcdRegNum; // Number of FRCD Registers
VTD_UINT128 FrcdReg[1];
} VTD_REGESTER_THIN_INFO;
typedef struct {
VTD_SOURCE_ID SourceId;
EFI_PHYSICAL_ADDRESS DeviceAddress;
UINT64 Length;
UINT64 IoMmuAccess;
EFI_STATUS Status;
} VTD_PROTOCOL_SET_ATTRIBUTE;
typedef struct {
UINT64 BaseAddress;
UINT64 TableAddress;
BOOLEAN Is5LevelPaging;
} VTD_ROOT_TABLE_INFO;
#pragma pack()
/**
@brief This callback function is to handle the Vtd log strings.
[Consumption]
Dump VTd log
@param[in] Context Context
@param[in] ErrorLevel The error level of the debug message.
@param[in] Buffer Event string
**/
typedef
VOID
(EFIAPI *EDKII_VTD_LIB_STRING_CB) (
IN VOID *Context,
IN UINTN ErrorLevel,
IN CHAR8 *Buffer
);
/**
@brief This function is to dump DMAR ACPI table.
[Consumption]
Dump VTd log
@param[in] Context Event Context
@param[in out] CallbackHandle Callback Handler
@param[in] Dmar DMAR ACPI table
**/
VOID
VtdLibDumpAcpiDmar (
IN VOID *Context,
IN OUT EDKII_VTD_LIB_STRING_CB CallbackHandle,
IN EFI_ACPI_DMAR_HEADER *Dmar
);
/**
@brief This function is to dump DRHD DMAR ACPI table.
[Consumption]
Dump VTd log
@param[in] Context Event Context
@param[in out] CallbackHandle Callback Handler
@param[in] Dmar DMAR ACPI table
**/
VOID
VtdLibDumpAcpiDmarDrhd (
IN VOID *Context,
IN OUT EDKII_VTD_LIB_STRING_CB CallbackHandle,
IN EFI_ACPI_DMAR_HEADER *Dmar
);
/**
@brief This function is to dump the PCI device information of the VTd engine.
[Consumption]
Dump VTd log
@param[in] Context Event Context
@param[in out] CallbackHandle Callback Handler
@param[in] PciDeviceInfo PCI device information
**/
VOID
VtdLibDumpPciDeviceInfo (
IN VOID *Context,
IN OUT EDKII_VTD_LIB_STRING_CB CallbackHandle,
IN PCI_DEVICE_INFORMATION *PciDeviceInfo
);
/**
@brief This function is to dump DMAR context entry table.
[Consumption]
Dump VTd log
@param[in] Context Event context
@param[in out] CallbackHandle Callback handler
@param[in] RootEntry DMAR root entry.
@param[in] Is5LevelPaging If it is the 5 level paging.
**/
VOID
VtdLibDumpDmarContextEntryTable (
IN VOID *Context,
IN OUT EDKII_VTD_LIB_STRING_CB CallbackHandle,
IN VTD_ROOT_ENTRY *RootEntry,
IN BOOLEAN Is5LevelPaging
);
/**
@brief This function is to dump DMAR extended context entry table.
[Consumption]
Dump VTd log
@param[in] Context Event context
@param[in out] CallbackHandle Callback handler
@param[in] ExtRootEntry DMAR extended root entry.
@param[in] Is5LevelPaging If it is the 5 level paging.
**/
VOID
VtdLibDumpDmarExtContextEntryTable (
IN VOID *Context,
IN OUT EDKII_VTD_LIB_STRING_CB CallbackHandle,
IN VTD_EXT_ROOT_ENTRY *ExtRootEntry,
IN BOOLEAN Is5LevelPaging
);
/**
@brief This function is to dump VTd registers.
[Consumption]
Dump VTd log
@param[in] Context Event context
@param[in out] CallbackHandle Callback handler
@param[in] VtdRegInfo Registers Information
**/
VOID
VtdLibDumpVtdRegsAll (
IN VOID *Context,
IN OUT EDKII_VTD_LIB_STRING_CB CallbackHandle,
IN VTD_REGESTER_INFO *VtdRegInfo
);
/**
@brief This function is to dump VTd registers.
[Consumption]
Dump VTd log
@param[in] Context Event context
@param[in out] CallbackHandle Callback handler
@param[in] VtdRegInfo Registers Information
**/
VOID
VtdLibDumpVtdRegsThin (
IN VOID *Context,
IN OUT EDKII_VTD_LIB_STRING_CB CallbackHandle,
IN VTD_REGESTER_THIN_INFO *VtdRegInfo
);
/**
@brief This function is to decode log event context.
[Consumption]
Dump VTd log
@param[in] Context Event context
@param[in out] CallbackHandle Callback handler
@param[in] Event Event struct
@retval TRUE Decode event success
@retval FALSE Unknown event
**/
BOOLEAN
VtdLibDecodeEvent (
IN VOID *Context,
IN OUT EDKII_VTD_LIB_STRING_CB CallbackHandle,
IN VTDLOG_EVENT *Event
);
/**
@brief Pre-boot DMA protection End Process
+----------------------+
| OnExitBootServices |
+----------------------+
||
\/
+-------------------------------------------------+
| Flush Write Buffer |
| VtdLibFlushWriteBuffer () |
+-------------------------------------------------+
||
\/
+-------------------------------------------------+
| Invalidate Context Cache |
| VtdLibSubmitQueuedInvalidationDescriptor () |
+-------------------------------------------------+
||
\/
+-------------------------------------------------+
| Invalidate IOTLB |
| VtdLibSubmitQueuedInvalidationDescriptor () |
+-------------------------------------------------+
||
\/
+-------------------------------------------------+
| Disable DMAR |
| VtdLibDisableDmar () |
+-------------------------------------------------+
||
\/
+-------------------------------------------------+
| Disable Queued Invalidation interface |
| VtdLibDisableQueuedInvalidationInterface () |
+-------------------------------------------------+
**/
/**
@brief This function is to flush VTd engine write buffer.
[Consumption]
Operate VTd engine
@param[in] VtdUnitBaseAddress The base address of the VTd engine.
**/
VOID
VtdLibFlushWriteBuffer (
IN UINTN VtdUnitBaseAddress
);
/**
@brief This function is to clear Global Command Register Bits.
[Consumption]
Operate VTd engine
@param[in] VtdUnitBaseAddress The base address of the VTd engine.
@param[in] BitMask Bit mask.
**/
VOID
VtdLibClearGlobalCommandRegisterBits (
IN UINTN VtdUnitBaseAddress,
IN UINT32 BitMask
);
/**
@brief This function is to set VTd Global Command Register Bits.
[Consumption]
Operate VTd engine
@param[in] VtdUnitBaseAddress The base address of the VTd engine.
@param[in] BitMask Bit mask.
**/
VOID
VtdLibSetGlobalCommandRegisterBits (
IN UINTN VtdUnitBaseAddress,
IN UINT32 BitMask
);
/**
@brief This function is to disable DMAR.
[Consumption]
Operate VTd engine
@param[in] VtdUnitBaseAddress The base address of the VTd engine.
@retval EFI_SUCCESS DMAR translation is disabled.
**/
EFI_STATUS
VtdLibDisableDmar (
IN UINTN VtdUnitBaseAddress
);
/**
@brief This function is to disable PMR.
[Consumption]
Operate VTd engine
@param[in] VtdUnitBaseAddress The base address of the VTd engine.
@retval EFI_SUCCESS PMR is disabled.
@retval EFI_UNSUPPORTED PMR is not supported.
@retval EFI_NOT_STARTED PMR was not enabled.
**/
EFI_STATUS
VtdLibDisablePmr (
IN UINTN VtdUnitBaseAddress
);
/**
@brief This function is to disable queued invalidation interface
[Introduction]
Disable queued invalidation interface.
[Consumption]
Operate VTd engine
@param[in] VtdUnitBaseAddress The base address of the VTd engine.
**/
VOID
VtdLibDisableQueuedInvalidationInterface (
IN UINTN VtdUnitBaseAddress
);
/**
@brief This function is to submit a queued invalidation descriptor
[Introduction]
Submit the queued invalidation descriptor to the remapping
hardware unit and wait for its completion.
[Consumption]
Operate VTd engine
@param[in] VtdUnitBaseAddress The base address of the VTd engine.
@param[in] Desc The invalidate descriptor
@param[in] ClearFaultBits TRUE - This API will clear the queued invalidation fault bits if any.
FALSE - The caller need to check and clear the queued invalidation fault bits.
@retval EFI_SUCCESS The operation was successful.
@retval RETURN_DEVICE_ERROR A fault is detected.
@retval EFI_INVALID_PARAMETER Parameter is invalid.
@retval EFI_DEVICE_ERROR Detect fault, need to clear fault bits if ClearFaultBits is FALSE
**/
EFI_STATUS
VtdLibSubmitQueuedInvalidationDescriptor (
IN UINTN VtdUnitBaseAddress,
IN VOID *Desc,
IN BOOLEAN ClearFaultBits
);
#endif