/** @file
VTD Info library.
All function in this library is available for PEI, DXE, and SMM,
But do not support UEFI RUNTIME environment call.
Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
/**
Get VTD Engine Base Address from PCD value
@param[in] VtdEngineNumber - Engine number for which VTD Base Adderess is required.
@retval VTD Engine Base Address
**/
UINT32
GetVtdBaseAddress (
IN UINT8 VtdEngineNumber
)
{
switch (VtdEngineNumber) {
case 0:
return PcdGet32(VtdEngine1BaseAddeess);
break;
case 2:
return PcdGet32(VtdEngine3BaseAddeess);
break;
default:
return 0x0;
break;
}
}
/**
Read VTD Engine Base Address from VTD BAR Offsets.
@param[in] VtdEngineNumber - Engine number for which VTD Base Adderess is required.
@retval VTD Engine Base Address
**/
UINT32
ReadVtdBaseAddress (
IN UINT8 VtdEngineNumber
)
{
UINT64 McD0BaseAddress;
UINTN MchBar;
McD0BaseAddress = PCI_SEGMENT_LIB_ADDRESS (SA_SEG_NUM, SA_MC_BUS, 0, 0, 0);
MchBar = PciSegmentRead32 (McD0BaseAddress + R_SA_MCHBAR) & (~BIT0);
switch (VtdEngineNumber) {
case 0:
return (MmioRead32 (MchBar + R_MCHBAR_VTD1_OFFSET) & (~BIT0));
break;
case 2:
return (MmioRead32 (MchBar + R_MCHBAR_VTD3_OFFSET) & (~BIT0));
break;
default:
return 0x0;
break;
}
}
/**
GetMaxVtdEngineNumber: Get Maximum Vtd Engine Number
@retval Vtd Engine Number
**/
UINT8
GetMaxVtdEngineNumber(
VOID
)
{
return (UINT8)VTD_ENGINE_NUMBER;
}