[edk2] [Patch][edk2-platforms/devel-IntelAtomProcessorE3900] DMAR Table Installation.

zwei4 posted 1 patch 5 years, 9 months ago
Failed in applying to current master (apply log)
.../Common/Acpi/AcpiPlatformDxe/AcpiPlatform.c     |   4 +-
.../Common/Acpi/AcpiTablesPCAT/AcpiTables.inf      |   4 +-
.../PlatformDsc/Components.IA32.dsc                |   8 +-
.../BroxtonPlatformPkg/PlatformDsc/Components.dsc  |  18 +-
Platform/BroxtonPlatformPkg/PlatformPkg.fdf        |   6 +
Silicon/BroxtonSoC/BroxtonSiPkg/BroxtonSiPkg.dec   |   2 +
.../SouthCluster/AcpiTableDmar/AcpiTableDmar.inf   |  32 +++
.../SouthCluster/AcpiTableDmar}/Dmar.aslc          |   2 +-
.../SouthCluster/AcpiTableDmar}/Dmar.h             |   2 +-
.../SouthCluster/Library/DxeVtdLib/DxeVtdLib.c     | 260 +++++++++++++++++----
.../SouthCluster/Library/DxeVtdLib/DxeVtdLib.inf   |  12 +-
11 files changed, 294 insertions(+), 56 deletions(-)
create mode 100644 Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar/AcpiTableDmar.inf
rename {Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/Dmar => Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar}/Dmar.aslc (95%)
rename {Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/Dmar => Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar}/Dmar.h (90%)
[edk2] [Patch][edk2-platforms/devel-IntelAtomProcessorE3900] DMAR Table Installation.
Posted by zwei4 5 years, 9 months ago
Move DMAR table into a separate FFS file to make it easier to be located and installed at proper time by VT-d library.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: David Wei <david.wei@intel.com>
CC: Mang Guo <mang.guo@intel.com>
---
 .../Common/Acpi/AcpiPlatformDxe/AcpiPlatform.c     |   4 +-
 .../Common/Acpi/AcpiTablesPCAT/AcpiTables.inf      |   4 +-
 .../PlatformDsc/Components.IA32.dsc                |   8 +-
 .../BroxtonPlatformPkg/PlatformDsc/Components.dsc  |  18 +-
 Platform/BroxtonPlatformPkg/PlatformPkg.fdf        |   6 +
 Silicon/BroxtonSoC/BroxtonSiPkg/BroxtonSiPkg.dec   |   2 +
 .../SouthCluster/AcpiTableDmar/AcpiTableDmar.inf   |  32 +++
 .../SouthCluster/AcpiTableDmar}/Dmar.aslc          |   2 +-
 .../SouthCluster/AcpiTableDmar}/Dmar.h             |   2 +-
 .../SouthCluster/Library/DxeVtdLib/DxeVtdLib.c     | 260 +++++++++++++++++----
 .../SouthCluster/Library/DxeVtdLib/DxeVtdLib.inf   |  12 +-
 11 files changed, 294 insertions(+), 56 deletions(-)
 create mode 100644 Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar/AcpiTableDmar.inf
 rename {Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/Dmar => Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar}/Dmar.aslc (95%)
 rename {Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/Dmar => Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar}/Dmar.h (90%)

diff --git a/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiPlatformDxe/AcpiPlatform.c b/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiPlatformDxe/AcpiPlatform.c
index c18753b61c..6a4d675eb2 100644
--- a/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiPlatformDxe/AcpiPlatform.c
+++ b/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiPlatformDxe/AcpiPlatform.c
@@ -1,7 +1,7 @@
 /** @file
   ACPI Platform Driver.
 
-  Copyright (c) 2012 - 2017, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.<BR>
 
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD License
@@ -1081,7 +1081,7 @@ OnReadyToBoot (
   //
   // Update the DMAR Table
   //
-  UpdateDmarOnReadyToBoot (SetupVarBuffer.VTdEnable);
+  // UpdateDmarOnReadyToBoot (SetupVarBuffer.VTdEnable);
 
   //
   // Publish ACPI 1.0 or 2.0 Tables
diff --git a/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/AcpiTables.inf b/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/AcpiTables.inf
index 1e456e3405..ea5da05602 100644
--- a/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/AcpiTables.inf
+++ b/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/AcpiTables.inf
@@ -1,7 +1,7 @@
 ## @file
 #  Component information file for the ACPI tables.
 #
-#  Copyright (c) 1999 - 2016, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD License
@@ -29,8 +29,6 @@
   Madt/Madt30.aslc
   Mcfg/Mcfg.aslc
   Hpet/Hpet.aslc
-  Dmar/Dmar.aslc
-  Dmar/Dmar.h
   Lpit/Lpit.aslc
   Lpit/Lpit.h
   SsdtRtd3/RvpRtd3.asl
diff --git a/Platform/BroxtonPlatformPkg/PlatformDsc/Components.IA32.dsc b/Platform/BroxtonPlatformPkg/PlatformDsc/Components.IA32.dsc
index 8615ebc5c0..1aec4a9244 100644
--- a/Platform/BroxtonPlatformPkg/PlatformDsc/Components.IA32.dsc
+++ b/Platform/BroxtonPlatformPkg/PlatformDsc/Components.IA32.dsc
@@ -210,4 +210,10 @@
 
 !if $(SOURCE_DEBUG_ENABLE) == TRUE
   SourceLevelDebugPkg/DebugAgentPei/DebugAgentPei.inf
-!endif
\ No newline at end of file
+!endif
+
+#
+# VT-d for DMA Protection
+#
+$(PLATFORM_PACKAGE_COMMON)/PlatformSettings/PlatformVTdInfoPei/PlatformVTdInfoPei.inf
+IntelSiliconPkg/Feature/VTd/IntelVTdPmrPei/IntelVTdPmrPei.inf
\ No newline at end of file
diff --git a/Platform/BroxtonPlatformPkg/PlatformDsc/Components.dsc b/Platform/BroxtonPlatformPkg/PlatformDsc/Components.dsc
index f1bb26b9d9..15b75be4a5 100644
--- a/Platform/BroxtonPlatformPkg/PlatformDsc/Components.dsc
+++ b/Platform/BroxtonPlatformPkg/PlatformDsc/Components.dsc
@@ -18,7 +18,7 @@
   #
   MdeModulePkg/Core/Dxe/DxeMain.inf {
     <PcdsPatchableInModule>
-      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000046
+      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000047
     <LibraryClasses>
   !if $(DXE_CRC32_SECTION_ENABLE) == TRUE
       NULL|MdeModulePkg/Library/DxeCrc32GuidedSectionExtractLib/DxeCrc32GuidedSectionExtractLib.inf
@@ -26,7 +26,6 @@
   !if $(LZMA_ENABLE) == TRUE
       NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
   !endif
-     DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf 
   }
   MdeModulePkg/Universal/PCD/Dxe/Pcd.inf {
     <LibraryClasses>
@@ -544,4 +543,17 @@
   # Application
   #
   $(PLATFORM_PACKAGE_COMMON)/Application/FirmwareUpdate/FirmwareUpdate.inf
-
+  MdeModulePkg/Application/VariableInfo/VariableInfo.inf
+  
+  #
+  # VT-d for DMA Protection
+  #
+  $(PLATFORM_SI_PACKAGE)/SouthCluster/AcpiTableDmar/AcpiTableDmar.inf
+  $(PLATFORM_PACKAGE_COMMON)/PlatformSettings/PlatformVTdDxe/PlatformVTdDxe.inf {
+    <PcdsPatchableInModule>
+      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x0
+  }
+  IntelSiliconPkg/Feature/VTd/IntelVTdDxe/IntelVTdDxe.inf {
+    <PcdsPatchableInModule>
+      gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x0
+  }
\ No newline at end of file
diff --git a/Platform/BroxtonPlatformPkg/PlatformPkg.fdf b/Platform/BroxtonPlatformPkg/PlatformPkg.fdf
index 2e42acacc0..ca22f75965 100644
--- a/Platform/BroxtonPlatformPkg/PlatformPkg.fdf
+++ b/Platform/BroxtonPlatformPkg/PlatformPkg.fdf
@@ -763,6 +763,12 @@ APRIORI DXE {
   #
   INF  $(PLATFORM_PACKAGE_COMMON)/Acpi/UsbTypeCDxe/UsbTypeCDxe.inf
 
+  
+  #
+  # VT-d for MDA Protection
+  #
+  INF RuleOverride = ACPITABLE $(PLATFORM_SI_PACKAGE)/SouthCluster/AcpiTableDmar/AcpiTableDmar.inf
+
 [FV.FVOBB]
   BlockSize          = $(FLASH_BLOCK_SIZE)
   FvAlignment        = 16
diff --git a/Silicon/BroxtonSoC/BroxtonSiPkg/BroxtonSiPkg.dec b/Silicon/BroxtonSoC/BroxtonSiPkg/BroxtonSiPkg.dec
index a28765f233..05508a4c18 100644
--- a/Silicon/BroxtonSoC/BroxtonSiPkg/BroxtonSiPkg.dec
+++ b/Silicon/BroxtonSoC/BroxtonSiPkg/BroxtonSiPkg.dec
@@ -242,6 +242,8 @@
   gEfiBpdtLibBp1DataGuid                = { 0x7a4ecf02, 0xa1cf, 0x4e42, { 0xb6, 0x33, 0xfe, 0x95, 0x54, 0xbb, 0x60, 0xf8 } }
   gEfiBpdtLibBp2DataGuid                = { 0x75b0886e, 0xcd6a, 0x469f, { 0xae, 0x0b, 0x8c, 0xed, 0x90, 0x33, 0xd1, 0x99 } }
   
+  gAcpiDmarTableFileGuid                = { 0x6767abfe, 0x27d2, 0x41b3, { 0xa0, 0x84, 0xb8, 0xa8, 0x98, 0x24, 0xd3, 0x5a } }
+
 [Includes.common]
   Include
   Library
diff --git a/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar/AcpiTableDmar.inf b/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar/AcpiTableDmar.inf
new file mode 100644
index 0000000000..1e9fafab5a
--- /dev/null
+++ b/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar/AcpiTableDmar.inf
@@ -0,0 +1,32 @@
+## @file
+#  Component information file for the ACPI tables.
+#
+#  Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution. The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php.
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = AcpiTableDmar
+  FILE_GUID                      = 6767ABFE-27D2-41B3-A084-B8A89824D35A
+  MODULE_TYPE                    = USER_DEFINED
+  VERSION_STRING                 = 1.0
+  EDK_RELEASE_VERSION            = 0x00020000
+  EFI_SPECIFICATION_VERSION      = 0x00020000
+
+[sources.common]
+  Dmar.aslc
+  Dmar.h
+
+[Packages]
+  MdePkg/MdePkg.dec
+  BroxtonPlatformPkg/PlatformPkg.dec
+  BroxtonSiPkg/BroxtonSiPkg.dec
diff --git a/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/Dmar/Dmar.aslc b/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar/Dmar.aslc
similarity index 95%
rename from Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/Dmar/Dmar.aslc
rename to Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar/Dmar.aslc
index 98ffab2c86..8c0e172cc5 100644
--- a/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/Dmar/Dmar.aslc
+++ b/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar/Dmar.aslc
@@ -1,7 +1,7 @@
 /** @file
   ACPI DMA address Remapping table
 
-  Copyright (c) 1999 - 2016, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>
 
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD License
diff --git a/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/Dmar/Dmar.h b/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar/Dmar.h
similarity index 90%
rename from Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/Dmar/Dmar.h
rename to Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar/Dmar.h
index 558a96408e..eb886320c4 100644
--- a/Platform/BroxtonPlatformPkg/Common/Acpi/AcpiTablesPCAT/Dmar/Dmar.h
+++ b/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/AcpiTableDmar/Dmar.h
@@ -2,7 +2,7 @@
   This file describes the contents of the ACPI DMA address Remapping
   Some additional ACPI values are defined in Acpi1_0.h and Acpi2_0.h.
 
-  Copyright (c) 1999 - 2016, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>
 
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD License
diff --git a/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/Library/DxeVtdLib/DxeVtdLib.c b/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/Library/DxeVtdLib/DxeVtdLib.c
index a21816ec38..80f37a664b 100644
--- a/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/Library/DxeVtdLib/DxeVtdLib.c
+++ b/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/Library/DxeVtdLib/DxeVtdLib.c
@@ -1,7 +1,7 @@
 /** @file
   This code provides a initialization of Intel VT-d (Virtualization Technology for Directed I/O).
 
-  Copyright (c) 1999 - 2016, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>
 
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD License
@@ -527,66 +527,164 @@ UpdateDmarOnReadyToBoot (
   BOOLEAN   VtEnable
   )
 {
-  EFI_ACPI_DESCRIPTION_HEADER     *Table;
-  EFI_ACPI_SUPPORT_PROTOCOL       *AcpiSupport;
+  EFI_ACPI_TABLE_PROTOCOL         *AcpiTableProtocol;
   EFI_ACPI_TABLE_VERSION          Version;
   EFI_STATUS                      Status;
-  UINT8                           Index;
-  UINTN                           Handle;
-
-  AcpiSupport = NULL;
+  UINT16                          Index;
+  EFI_HANDLE                      *HandleBuffer;
+  UINTN                           NumberOfHandles;
+  EFI_FV_FILETYPE                 FileType;
+  UINT32                          FvStatus;
+  EFI_FV_FILE_ATTRIBUTES          Attributes;
+  UINTN                           Size;
+  INTN                            Instance;
+  EFI_ACPI_COMMON_HEADER          *CurrentTable;
+  UINTN                           AcpiTableHandle;
+  EFI_FIRMWARE_VOLUME2_PROTOCOL   *FwVol;
+  EFI_ACPI_DESCRIPTION_HEADER     *DmarAcpiTable;
+
+  AcpiTableProtocol = NULL;
+  DmarAcpiTable = NULL;
   Index       = 0;
 
   //
   // Locate ACPI support protocol
   //
-  Status = gBS->LocateProtocol (&gEfiAcpiSupportProtocolGuid, NULL, (VOID **) &AcpiSupport);
+  Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **) &AcpiTableProtocol);
   ASSERT_EFI_ERROR (Status);
 
-  //
-  // Find the DMAR ACPI table
-  //
-  do {
-    Status = AcpiSupport->GetAcpiTable(AcpiSupport, Index, (VOID **) &Table, &Version, &Handle);
-    if (Status == EFI_NOT_FOUND) {
+  ///
+  /// Locate protocol.
+  /// There is little chance we can't find an FV protocol
+  ///
+  Status = gBS->LocateHandleBuffer (
+                  ByProtocol,
+                  &gEfiFirmwareVolume2ProtocolGuid,
+                  NULL,
+                  &NumberOfHandles,
+                  &HandleBuffer
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+  ///
+  /// Looking for FV with ACPI storage file
+  ///
+  for (Index = 0; Index < NumberOfHandles; Index++) {
+    ///
+    /// Get the protocol on this handle
+    /// This should not fail because of LocateHandleBuffer
+    ///
+    Status = gBS->HandleProtocol (
+                    HandleBuffer[Index],
+                    &gEfiFirmwareVolume2ProtocolGuid,
+                    (VOID **) &FwVol
+                    );
+    ASSERT_EFI_ERROR (Status);
+
+    ///
+    /// See if it has the ACPI storage file
+    ///
+    Size      = 0;
+    FvStatus  = 0;
+    Status = FwVol->ReadFile (
+                      FwVol,
+                      &gAcpiDmarTableFileGuid,
+                      NULL,
+                      &Size,
+                      &FileType,
+                      &Attributes,
+                      &FvStatus
+                      );
+
+    ///
+    /// If we found it, then we are done
+    ///
+    if (Status == EFI_SUCCESS) {
       break;
     }
-    ASSERT_EFI_ERROR(Status);
-    Index++;
-  } while (Table->Signature != EFI_ACPI_VTD_DMAR_TABLE_SIGNATURE);
-
-  DEBUG ((DEBUG_INFO, "DMAR ACPI Table: Address = 0x%x, Version = %u, Handle = %u\n", Table, Version, Handle));
-
-  if (VtEnable) {
-    //
-    // Update the DMAR table structure
-    //
-    DEBUG ((DEBUG_INFO, "DMAR ACPI table to be Installed \n"));
-    DmarTableUpdate (Table, &Version);
-  } else {
-    //
-    // Uninstall DMAR table
-    //
-    DEBUG ((DEBUG_INFO, "DMAR ACPI table to be Uninstalled \n"));
-    Table = NULL;
   }
-
-  //
-  // Update the DMAR ACPI table
-  //
-  Status = AcpiSupport->SetAcpiTable (
-                          AcpiSupport,
-                          Table,
-                          TRUE,
-                          Version,
-                          &Handle
+  ///
+  /// Our exit status is determined by the success of the previous operations
+  /// If the protocol was found, Instance already points to it.
+  ///
+  ///
+  /// Free any allocated buffers
+  ///
+  FreePool (HandleBuffer);
+
+  ///
+  /// Sanity check that we found our data file
+  ///
+  ASSERT (FwVol);
+  if (FwVol == NULL) {
+    return;
+  }
+  ///
+  /// By default, a table belongs in all ACPI table versions published.
+  ///
+  Version = EFI_ACPI_TABLE_VERSION_1_0B | EFI_ACPI_TABLE_VERSION_2_0 | EFI_ACPI_TABLE_VERSION_3_0;
+
+  ///
+  /// Read tables from the storage file.
+  ///
+  Instance      = 0;
+  CurrentTable  = NULL;
+
+  while (Status == EFI_SUCCESS) {
+    Status = FwVol->ReadSection (
+                      FwVol,
+                      &gAcpiDmarTableFileGuid,
+                      EFI_SECTION_RAW,
+                      Instance,
+                      (VOID **) &CurrentTable,
+                      &Size,
+                      &FvStatus
+                      );
+
+    if (!EFI_ERROR (Status)) {
+      ///
+      /// Check the Signature ID to modify the table
+      ///
+      switch (((EFI_ACPI_DESCRIPTION_HEADER *) CurrentTable)->Signature) {
+
+        case EFI_ACPI_VTD_DMAR_TABLE_SIGNATURE:
+          DmarAcpiTable = (EFI_ACPI_DESCRIPTION_HEADER *) CurrentTable;
+          DmarTableUpdate (DmarAcpiTable, &Version);
+          break;
+
+        default:
+          break;
+      }
+      ///
+      /// Increment the instance
+      ///
+      Instance++;
+      CurrentTable = NULL;
+    }
+  }
+  ///
+  /// Update the VTD table in the ACPI tables.
+  ///
+  AcpiTableHandle = 0;
+  if (DmarAcpiTable != NULL) {
+    DEBUG ((DEBUG_INFO, "Installing DMAR ACPI table.\n"));
+    Status = AcpiTableProtocol->InstallAcpiTable (
+                          AcpiTableProtocol,
+                          DmarAcpiTable,
+                          DmarAcpiTable->Length,
+                          &AcpiTableHandle
                           );
+    ASSERT_EFI_ERROR (Status);
+  }
+
 
   if (!EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_INFO, "DMAR ACPI table was successfully updated\n"));
+    DEBUG ((DEBUG_INFO, "DMAR ACPI table has been successfully installed and updated.\n"));
   } else {
     DEBUG ((DEBUG_ERROR, "Error updating the DMAR ACPI table\n"));
   }
+
+  EfiEventGroupSignal (&gEfiAcpi10TableGuid);
 }
 
 
@@ -629,6 +727,77 @@ UpdateRmrrUsbAddress (
 }
 
 
+/**
+  Notification function of ACPI Table change.
+
+  This is a notification function registered on ACPI Table change event.
+
+  @param  Event        Event whose notification function is being invoked.
+  @param  Context      Pointer to the notification function's context.
+
+**/
+VOID
+EFIAPI
+PciEnumerationCompleteCallback (
+  IN EFI_EVENT        Event,
+  IN VOID             *Context
+  )
+{
+  EFI_STATUS          Status;
+  SC_POLICY_HOB         *ScPolicy;
+  EFI_PEI_HOB_POINTERS  HobPtr;
+  SC_VTD_CONFIG         *VtdConfig;
+
+  gBS->CloseEvent (Event);
+
+  //
+  // Get SC VT-d config block
+  //
+  HobPtr.Guid = GetFirstGuidHob (&gScPolicyHobGuid);
+  ASSERT (HobPtr.Guid != NULL);
+  ScPolicy = (SC_POLICY_HOB*) GET_GUID_HOB_DATA (HobPtr.Guid);
+  Status = GetConfigBlock ((VOID *) ScPolicy, &gVtdConfigGuid, (VOID *) &VtdConfig);
+
+  if ((BOOLEAN)(UINT8)(VtdConfig->VtdEnable) == TRUE) {
+    UpdateDmarOnReadyToBoot ((BOOLEAN)(UINT8)(VtdConfig->VtdEnable));
+  }
+  
+}
+
+VOID
+InstallAcpiDmarTable (
+  BOOLEAN VtdEnable
+)
+{
+
+  VOID        *CallbackNotifyReg;
+  EFI_EVENT   CallbackEvent;
+  EFI_STATUS  Status;
+
+  Status = gBS->CreateEvent (
+                  EVT_NOTIFY_SIGNAL,
+                  TPL_CALLBACK,
+                  PciEnumerationCompleteCallback,
+                  NULL,
+                  &CallbackEvent
+                  );
+
+  ASSERT_EFI_ERROR (Status);
+
+
+  Status = gBS->RegisterProtocolNotify (
+                  &gEfiPciEnumerationCompleteProtocolGuid,
+                  CallbackEvent,
+                  &CallbackNotifyReg
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+
+  return;
+
+}
+
+
 /**
   Locate the VT-d ACPI tables data file and update it based on current configuration and capabilities.
 
@@ -676,6 +845,11 @@ VtdInit (
   //
   UpdateRmrrUsbAddress (VtdConfig);
 
+  //
+  // Register callback function for updating DMAR table.
+  //
+  InstallAcpiDmarTable ((BOOLEAN)(VtdConfig->VtdEnable));
+  
   DEBUG ((DEBUG_INFO, "VtdInit () - End\n"));
 
   return EFI_SUCCESS;
diff --git a/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/Library/DxeVtdLib/DxeVtdLib.inf b/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/Library/DxeVtdLib/DxeVtdLib.inf
index 4f22249ac7..801e094db0 100644
--- a/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/Library/DxeVtdLib/DxeVtdLib.inf
+++ b/Silicon/BroxtonSoC/BroxtonSiPkg/SouthCluster/Library/DxeVtdLib/DxeVtdLib.inf
@@ -1,7 +1,7 @@
 ## @file
 #  Library for Intel VT-d.
 #
-#  Copyright (c) 1999 - 2016, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD License
@@ -33,10 +33,18 @@
 [Guids]
   gVtdConfigGuid
   gScPolicyHobGuid
+  gEfiAcpi10TableGuid
+  gEfiAcpi20TableGuid
 
 [Protocols]
   gEfiAcpiSupportProtocolGuid     ## CONSUMES
-
+  gEfiFirmwareVolume2ProtocolGuid ## CONSUMES
+  gEfiPciEnumerationCompleteProtocolGuid ## CONSUMES
+  
+[Guids]
+  gAcpiDmarTableFileGuid
+  gEfiAcpi10TableGuid
+  
 [Packages]
   MdePkg/MdePkg.dec
   BroxtonSiPkg/BroxtonSiPkg.dec
-- 
2.14.1.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel