\r
#include "IntelVTdPmrPei.h"\r
\r
-extern EDKII_VTD_INFO_PPI *mVTdInfoPpi;\r
+extern VTD_INFO *mVTdInfo;\r
\r
/**\r
Get protected low memory alignment.\r
UINT64 Data64;\r
UINT8 HostAddressWidth;\r
\r
- HostAddressWidth = mVTdInfoPpi->HostAddressWidth;\r
+ HostAddressWidth = mVTdInfo->HostAddressWidth;\r
\r
MmioWrite64 (VtdUnitBaseAddress + R_PMEN_HIGH_BASE_REG, 0xFFFFFFFFFFFFFFFF);\r
Data64 = MmioRead64 (VtdUnitBaseAddress + R_PMEN_HIGH_BASE_REG);\r
/**\r
Get protected low memory alignment.\r
\r
+ @param EngineMask The mask of the VTd engine to be accessed.\r
+\r
@return protected low memory alignment.\r
**/\r
UINT32\r
GetLowMemoryAlignment (\r
- VOID\r
+ IN UINT64 EngineMask\r
)\r
{\r
UINTN Index;\r
UINT32 FinalAlignment;\r
\r
FinalAlignment = 0;\r
- for (Index = 0; Index < mVTdInfoPpi->VTdEngineCount; Index++) {\r
- Alignment = GetPlmrAlignment ((UINTN)mVTdInfoPpi->VTdEngineAddress[Index]);\r
+ for (Index = 0; Index < mVTdInfo->VTdEngineCount; Index++) {\r
+ if ((EngineMask & LShiftU64(1, Index)) == 0) {\r
+ continue;\r
+ }\r
+ Alignment = GetPlmrAlignment ((UINTN)mVTdInfo->VTdEngineAddress[Index]);\r
if (FinalAlignment < Alignment) {\r
FinalAlignment = Alignment;\r
}\r
/**\r
Get protected high memory alignment.\r
\r
+ @param EngineMask The mask of the VTd engine to be accessed.\r
+\r
@return protected high memory alignment.\r
**/\r
UINT64\r
GetHighMemoryAlignment (\r
- VOID\r
+ IN UINT64 EngineMask\r
)\r
{\r
UINTN Index;\r
UINT64 FinalAlignment;\r
\r
FinalAlignment = 0;\r
- for (Index = 0; Index < mVTdInfoPpi->VTdEngineCount; Index++) {\r
- Alignment = GetPhmrAlignment ((UINTN)mVTdInfoPpi->VTdEngineAddress[Index]);\r
+ for (Index = 0; Index < mVTdInfo->VTdEngineCount; Index++) {\r
+ if ((EngineMask & LShiftU64(1, Index)) == 0) {\r
+ continue;\r
+ }\r
+ Alignment = GetPhmrAlignment ((UINTN)mVTdInfo->VTdEngineAddress[Index]);\r
if (FinalAlignment < Alignment) {\r
FinalAlignment = Alignment;\r
}\r
/**\r
Set DMA protected region.\r
\r
+ @param EngineMask The mask of the VTd engine to be accessed.\r
@param LowMemoryBase The protected low memory region base.\r
@param LowMemoryLength The protected low memory region length.\r
@param HighMemoryBase The protected high memory region base.\r
**/\r
EFI_STATUS\r
SetDmaProtectedRange (\r
+ IN UINT64 EngineMask,\r
IN UINT32 LowMemoryBase,\r
IN UINT32 LowMemoryLength,\r
IN UINT64 HighMemoryBase,\r
UINTN Index;\r
EFI_STATUS Status;\r
\r
- DEBUG ((DEBUG_INFO, "SetDmaProtectedRange - [0x%x, 0x%x] [0x%lx, 0x%lx]\n", LowMemoryBase, LowMemoryLength, HighMemoryBase, HighMemoryLength));\r
+ DEBUG ((DEBUG_INFO, "SetDmaProtectedRange(0x%lx) - [0x%x, 0x%x] [0x%lx, 0x%lx]\n", EngineMask, LowMemoryBase, LowMemoryLength, HighMemoryBase, HighMemoryLength));\r
\r
- for (Index = 0; Index < mVTdInfoPpi->VTdEngineCount; Index++) {\r
- DisablePmr ((UINTN)mVTdInfoPpi->VTdEngineAddress[Index]);\r
+ for (Index = 0; Index < mVTdInfo->VTdEngineCount; Index++) {\r
+ if ((EngineMask & LShiftU64(1, Index)) == 0) {\r
+ continue;\r
+ }\r
+ DisablePmr ((UINTN)mVTdInfo->VTdEngineAddress[Index]);\r
Status = SetPmrRegion (\r
- (UINTN)mVTdInfoPpi->VTdEngineAddress[Index],\r
+ (UINTN)mVTdInfo->VTdEngineAddress[Index],\r
LowMemoryBase,\r
LowMemoryLength,\r
HighMemoryBase,\r
if (EFI_ERROR(Status)) {\r
return Status;\r
}\r
- Status = EnablePmr ((UINTN)mVTdInfoPpi->VTdEngineAddress[Index]);\r
+ Status = EnablePmr ((UINTN)mVTdInfo->VTdEngineAddress[Index]);\r
if (EFI_ERROR(Status)) {\r
return Status;\r
}\r
/**\r
Diable DMA protection.\r
\r
+ @param EngineMask The mask of the VTd engine to be accessed.\r
+\r
@retval DMA protection is disabled.\r
**/\r
EFI_STATUS\r
DisableDmaProtection (\r
- VOID\r
+ IN UINT64 EngineMask\r
)\r
{\r
UINTN Index;\r
\r
DEBUG ((DEBUG_INFO, "DisableDmaProtection\n"));\r
\r
- for (Index = 0; Index < mVTdInfoPpi->VTdEngineCount; Index++) {\r
- Status = DisablePmr ((UINTN)mVTdInfoPpi->VTdEngineAddress[Index]);\r
+ for (Index = 0; Index < mVTdInfo->VTdEngineCount; Index++) {\r
+ if ((EngineMask & LShiftU64(1, Index)) == 0) {\r
+ continue;\r
+ }\r
+ Status = DisablePmr ((UINTN)mVTdInfo->VTdEngineAddress[Index]);\r
if (EFI_ERROR(Status)) {\r
return Status;\r
}\r