MdeModulePkg/PciHostBridge: Add IOMMU support.
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / PciHostBridgeDxe / PciHostBridge.c
index 9005dee..70726a6 100644 (file)
@@ -28,6 +28,10 @@ GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mPciResourceTypeStr[] = {
   L"I/O", L"Mem", L"PMem", L"Mem64", L"PMem64", L"Bus"\r
 };\r
 \r
+EDKII_IOMMU_PROTOCOL        *mIoMmuProtocol;\r
+EFI_EVENT                   mIoMmuEvent;\r
+VOID                        *mIoMmuRegistration;\r
+\r
 /**\r
   Ensure the compatibility of an IO space descriptor with the IO aperture.\r
 \r
@@ -312,6 +316,28 @@ FreeMemorySpaceMap:
   return Status;\r
 }\r
 \r
+/**\r
+  Event notification that is fired when IOMMU protocol is installed.\r
+\r
+  @param  Event                 The Event that is being processed.\r
+  @param  Context               Event Context.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IoMmuProtocolCallback (\r
+  IN  EFI_EVENT       Event,\r
+  IN  VOID            *Context\r
+  )\r
+{\r
+  EFI_STATUS   Status;\r
+\r
+  Status = gBS->LocateProtocol (&gEdkiiIoMmuProtocolGuid, NULL, (VOID **)&mIoMmuProtocol);\r
+  if (!EFI_ERROR(Status)) {\r
+    gBS->CloseEvent (mIoMmuEvent);\r
+  }\r
+}\r
+\r
 /**\r
 \r
   Entry point of this driver.\r
@@ -489,6 +515,17 @@ InitializePciHostBridge (
     ASSERT_EFI_ERROR (Status);\r
   }\r
   PciHostBridgeFreeRootBridges (RootBridges, RootBridgeCount);\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    mIoMmuEvent = EfiCreateProtocolNotifyEvent (\r
+                    &gEdkiiIoMmuProtocolGuid,\r
+                    TPL_CALLBACK,\r
+                    IoMmuProtocolCallback,\r
+                    NULL,\r
+                    &mIoMmuRegistration\r
+                    );\r
+  }\r
+\r
   return Status;\r
 }\r
 \r