IntelSiliconPkg/IntelVTdPmrPei: Parse RMRR table.
[mirror_edk2.git] / IntelSiliconPkg / Feature / VTd / IntelVTdPmrPei / IntelVTdPmr.c
index 0fe9645..6179dfe 100644 (file)
@@ -22,7 +22,7 @@
 \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
@@ -60,7 +60,7 @@ GetPhmrAlignment (
   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
@@ -73,11 +73,13 @@ GetPhmrAlignment (
 /**\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
@@ -85,8 +87,11 @@ GetLowMemoryAlignment (
   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
@@ -97,11 +102,13 @@ GetLowMemoryAlignment (
 /**\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
@@ -109,8 +116,11 @@ GetHighMemoryAlignment (
   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
@@ -246,6 +256,7 @@ SetPmrRegion (
 /**\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
@@ -256,6 +267,7 @@ SetPmrRegion (
 **/\r
 EFI_STATUS\r
 SetDmaProtectedRange (\r
+  IN UINT64        EngineMask,\r
   IN UINT32        LowMemoryBase,\r
   IN UINT32        LowMemoryLength,\r
   IN UINT64        HighMemoryBase,\r
@@ -265,12 +277,15 @@ SetDmaProtectedRange (
   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
@@ -279,7 +294,7 @@ SetDmaProtectedRange (
     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
@@ -291,11 +306,13 @@ SetDmaProtectedRange (
 /**\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
@@ -303,8 +320,11 @@ DisableDmaProtection (
 \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