]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelSiliconPkg/IntelVTdDxe/IntelVTdDxe.c
IntelSiliconPkg/IntelVtd: Consume VTd policy PCD
[mirror_edk2.git] / IntelSiliconPkg / IntelVTdDxe / IntelVTdDxe.c
index d22222d713b8060c889a7fc61df9ad0fc5f57580..64693a8c6ec3520d5e467facb6749f4ae52b8aad 100644 (file)
@@ -227,6 +227,8 @@ VTdSetAttribute (
   EFI_STATUS           Status;\r
   UINT16               Segment;\r
   VTD_SOURCE_ID        SourceId;\r
+  CHAR8                PerfToken[sizeof("VTD(S0000.B00.D00.F00)")];\r
+  UINT32               Identifier;\r
 \r
   DumpVtdIfError ();\r
 \r
@@ -239,8 +241,19 @@ VTdSetAttribute (
   DEBUG ((DEBUG_VERBOSE, "PCI(S%x.B%x.D%x.F%x) ", Segment, SourceId.Bits.Bus, SourceId.Bits.Device, SourceId.Bits.Function));\r
   DEBUG ((DEBUG_VERBOSE, "(0x%lx~0x%lx) - %lx\n", DeviceAddress, Length, IoMmuAccess));\r
 \r
+  PERF_CODE (\r
+    AsciiSPrint (PerfToken, sizeof(PerfToken), "S%04xB%02xD%02xF%01x", Segment, SourceId.Bits.Bus, SourceId.Bits.Device, SourceId.Bits.Function);\r
+    Identifier = (Segment << 16) | SourceId.Uint16;\r
+    PERF_START_EX (gImageHandle, PerfToken, "IntelVTD", 0, Identifier);\r
+  );\r
+\r
   Status = SetAccessAttribute (Segment, SourceId, DeviceAddress, Length, IoMmuAccess);\r
 \r
+  PERF_CODE (\r
+    Identifier = (Segment << 16) | SourceId.Uint16;\r
+    PERF_END_EX (gImageHandle, PerfToken, "IntelVTD", 0, Identifier);\r
+  );\r
+\r
   return Status;\r
 }\r
 \r
@@ -339,6 +352,10 @@ IntelVTdInitialize (
   EFI_STATUS  Status;\r
   EFI_HANDLE  Handle;\r
 \r
+  if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT0) == 0) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   InitializeDmaProtection ();\r
 \r
   Handle = NULL;\r