]> git.proxmox.com Git - mirror_edk2.git/commitdiff
IntelSiliconPkg IntelVTdDxe: Use ACPI table event to get DMAR table
authorStar Zeng <star.zeng@intel.com>
Wed, 25 Oct 2017 09:23:03 +0000 (17:23 +0800)
committerStar Zeng <star.zeng@intel.com>
Mon, 6 Nov 2017 02:08:48 +0000 (10:08 +0800)
Use ACPI table event to get DMAR table instead of using ACPI SDT
notification as ACPI SDT is optional and the default value of
PcdInstallAcpiSdtProtocol is FALSE in MdeModulePkg.dec.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.c
IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.h
IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmarAcpiTable.c
IntelSiliconPkg/Feature/VTd/IntelVTdDxe/IntelVTdDxe.inf

index 4a4d82e7f1069664219226653cda0b6e6a80852a..6052a0aebe45197d9fd81c8280bed467893b6a71 100644 (file)
@@ -13,7 +13,6 @@
 \r
 #include "DmaProtection.h"\r
 \r
-EFI_ACPI_SDT_PROTOCOL                   *mAcpiSdt;\r
 UINT64                                  mBelow4GMemoryLimit;\r
 UINT64                                  mAbove4GMemoryLimit;\r
 \r
@@ -350,11 +349,6 @@ SetupVtd (
   //\r
   // 1. setup\r
   //\r
-  DEBUG ((DEBUG_INFO, "GetDmarAcpiTable\n"));\r
-  Status = GetDmarAcpiTable ();\r
-  if (EFI_ERROR (Status)) {\r
-    return;\r
-  }\r
   DEBUG ((DEBUG_INFO, "ParseDmarAcpiTable\n"));\r
   Status = ParseDmarAcpiTableDrhd ();\r
   if (EFI_ERROR (Status)) {\r
@@ -399,27 +393,29 @@ SetupVtd (
 }\r
 \r
 /**\r
-  ACPI notification function.\r
+  Notification function of ACPI Table change.\r
+\r
+  This is a notification function registered on ACPI Table change event.\r
 \r
-  @param[in] Table    A pointer to the ACPI table header.\r
-  @param[in] Version  The ACPI table's version.\r
-  @param[in] TableKey The table key for this ACPI table.\r
+  @param  Event        Event whose notification function is being invoked.\r
+  @param  Context      Pointer to the notification function's context.\r
 \r
-  @retval EFI_SUCCESS The notification function is executed.\r
 **/\r
-EFI_STATUS\r
+VOID\r
 EFIAPI\r
 AcpiNotificationFunc (\r
-  IN EFI_ACPI_SDT_HEADER    *Table,\r
-  IN EFI_ACPI_TABLE_VERSION Version,\r
-  IN UINTN                  TableKey\r
+  IN EFI_EVENT        Event,\r
+  IN VOID             *Context\r
   )\r
 {\r
-  if (Table->Signature == EFI_ACPI_4_0_DMA_REMAPPING_TABLE_SIGNATURE) {\r
-    DEBUG((DEBUG_INFO, "Vtd AcpiNotificationFunc\n"));\r
-    SetupVtd ();\r
+  EFI_STATUS          Status;\r
+\r
+  Status = GetDmarAcpiTable ();\r
+  if (EFI_ERROR (Status)) {\r
+    return;\r
   }\r
-  return EFI_SUCCESS;\r
+  SetupVtd ();\r
+  gBS->CloseEvent (Event);\r
 }\r
 \r
 /**\r
@@ -474,11 +470,26 @@ InitializeDmaProtection (
   EFI_STATUS  Status;\r
   EFI_EVENT   ExitBootServicesEvent;\r
   EFI_EVENT   LegacyBootEvent;\r
-\r
-  Status = gBS->LocateProtocol (&gEfiAcpiSdtProtocolGuid, NULL, (VOID **) &mAcpiSdt);\r
+  EFI_EVENT   Event;\r
+  \r
+  Status = gBS->CreateEventEx (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_CALLBACK,\r
+                  AcpiNotificationFunc,\r
+                  NULL,\r
+                  &gEfiAcpi10TableGuid,\r
+                  &Event\r
+                  );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-  Status = mAcpiSdt->RegisterNotify (TRUE, AcpiNotificationFunc);\r
+  Status = gBS->CreateEventEx (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_CALLBACK,\r
+                  AcpiNotificationFunc,\r
+                  NULL,\r
+                  &gEfiAcpi20TableGuid,\r
+                  &Event\r
+                  );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   Status = gBS->CreateEventEx (\r
index f7b5292f23e83267e2997b11ae2a9433fee5a864..0886647ea673296fe004df991d030c75c9810f4d 100644 (file)
@@ -36,7 +36,6 @@
 #include <Protocol/PciRootBridgeIo.h>\r
 #include <Protocol/PciIo.h>\r
 #include <Protocol/PciEnumerationComplete.h>\r
-#include <Protocol/AcpiSystemDescriptionTable.h>\r
 #include <Protocol/PlatformVtdPolicy.h>\r
 #include <Protocol/IoMmu.h>\r
 \r
index 39b70a134e1e8a41a5acd88377c5f73d5fa6fa73..81dec109675bf0543c253ef04d7a73b81c84c80c 100644 (file)
@@ -989,6 +989,10 @@ GetDmarAcpiTable (
   VOID                              *AcpiTable;\r
   EFI_STATUS                        Status;\r
 \r
+  if (mAcpiDmarTable != NULL) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
   AcpiTable = NULL;\r
   Status = EfiGetSystemConfigurationTable (\r
              &gEfiAcpi20TableGuid,\r
@@ -1006,10 +1010,10 @@ GetDmarAcpiTable (
                       (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)AcpiTable,\r
                       EFI_ACPI_4_0_DMA_REMAPPING_TABLE_SIGNATURE\r
                       );\r
-  DEBUG ((DEBUG_INFO,"DMAR Table - 0x%08x\n", mAcpiDmarTable));\r
   if (mAcpiDmarTable == NULL) {\r
-    return EFI_UNSUPPORTED;\r
+    return EFI_NOT_FOUND;\r
   }\r
+  DEBUG ((DEBUG_INFO,"DMAR Table - 0x%08x\n", mAcpiDmarTable));\r
   VtdDumpDmarTable();\r
 \r
   return EFI_SUCCESS;\r
index fde33bb224caca77435bafabd82e6f3b4fab7b1e..bfb67770406981988dcb6b5c4bf3b2690d251c79 100644 (file)
 \r
 [Guids]\r
   gEfiEventExitBootServicesGuid   ## CONSUMES ## Event\r
-  gEfiAcpi20TableGuid             ## CONSUMES ## SystemTable\r
-  gEfiAcpi10TableGuid             ## CONSUMES ## SystemTable\r
+  ## CONSUMES ## SystemTable\r
+  ## CONSUMES ## Event\r
+  gEfiAcpi20TableGuid\r
+  ## CONSUMES ## SystemTable\r
+  ## CONSUMES ## Event\r
+  gEfiAcpi10TableGuid\r
 \r
 [Protocols]\r
   gEdkiiIoMmuProtocolGuid                     ## PRODUCES\r
-  gEfiAcpiSdtProtocolGuid                     ## CONSUMES\r
   gEfiPciIoProtocolGuid                       ## CONSUMES\r
   gEfiPciEnumerationCompleteProtocolGuid      ## CONSUMES\r
   gEdkiiPlatformVTdPolicyProtocolGuid         ## SOMETIMES_CONSUMES\r
@@ -77,8 +80,7 @@
   gIntelSiliconPkgTokenSpaceGuid.PcdVTdPolicyPropertyMask   ## CONSUMES\r
 \r
 [Depex]\r
-  gEfiPciRootBridgeIoProtocolGuid AND\r
-  gEfiAcpiSdtProtocolGuid\r
+  gEfiPciRootBridgeIoProtocolGuid\r
 \r
 [UserExtensions.TianoCore."ExtraFiles"]\r
   IntelVTdDxeExtra.uni\r