diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.c b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.c index 4a4d82e7f1..6052a0aebe 100644 --- a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.c +++ b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.c @@ -13,7 +13,6 @@ #include "DmaProtection.h" -EFI_ACPI_SDT_PROTOCOL *mAcpiSdt; UINT64 mBelow4GMemoryLimit; UINT64 mAbove4GMemoryLimit; @@ -350,11 +349,6 @@ SetupVtd ( // // 1. setup // - DEBUG ((DEBUG_INFO, "GetDmarAcpiTable\n")); - Status = GetDmarAcpiTable (); - if (EFI_ERROR (Status)) { - return; - } DEBUG ((DEBUG_INFO, "ParseDmarAcpiTable\n")); Status = ParseDmarAcpiTableDrhd (); if (EFI_ERROR (Status)) { @@ -399,27 +393,29 @@ SetupVtd ( } /** - ACPI notification function. + Notification function of ACPI Table change. - @param[in] Table A pointer to the ACPI table header. - @param[in] Version The ACPI table's version. - @param[in] TableKey The table key for this ACPI table. + 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. - @retval EFI_SUCCESS The notification function is executed. **/ -EFI_STATUS +VOID EFIAPI AcpiNotificationFunc ( - IN EFI_ACPI_SDT_HEADER *Table, - IN EFI_ACPI_TABLE_VERSION Version, - IN UINTN TableKey + IN EFI_EVENT Event, + IN VOID *Context ) { - if (Table->Signature == EFI_ACPI_4_0_DMA_REMAPPING_TABLE_SIGNATURE) { - DEBUG((DEBUG_INFO, "Vtd AcpiNotificationFunc\n")); - SetupVtd (); + EFI_STATUS Status; + + Status = GetDmarAcpiTable (); + if (EFI_ERROR (Status)) { + return; } - return EFI_SUCCESS; + SetupVtd (); + gBS->CloseEvent (Event); } /** @@ -474,11 +470,26 @@ InitializeDmaProtection ( EFI_STATUS Status; EFI_EVENT ExitBootServicesEvent; EFI_EVENT LegacyBootEvent; - - Status = gBS->LocateProtocol (&gEfiAcpiSdtProtocolGuid, NULL, (VOID **) &mAcpiSdt); + EFI_EVENT Event; + + Status = gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + AcpiNotificationFunc, + NULL, + &gEfiAcpi10TableGuid, + &Event + ); ASSERT_EFI_ERROR (Status); - Status = mAcpiSdt->RegisterNotify (TRUE, AcpiNotificationFunc); + Status = gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + AcpiNotificationFunc, + NULL, + &gEfiAcpi20TableGuid, + &Event + ); ASSERT_EFI_ERROR (Status); Status = gBS->CreateEventEx ( diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.h b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.h index f7b5292f23..0886647ea6 100644 --- a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.h +++ b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.h @@ -36,7 +36,6 @@ #include #include #include -#include #include #include diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmarAcpiTable.c b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmarAcpiTable.c index 39b70a134e..81dec10967 100644 --- a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmarAcpiTable.c +++ b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmarAcpiTable.c @@ -989,6 +989,10 @@ GetDmarAcpiTable ( VOID *AcpiTable; EFI_STATUS Status; + if (mAcpiDmarTable != NULL) { + return EFI_SUCCESS; + } + AcpiTable = NULL; Status = EfiGetSystemConfigurationTable ( &gEfiAcpi20TableGuid, @@ -1006,10 +1010,10 @@ GetDmarAcpiTable ( (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)AcpiTable, EFI_ACPI_4_0_DMA_REMAPPING_TABLE_SIGNATURE ); - DEBUG ((DEBUG_INFO,"DMAR Table - 0x%08x\n", mAcpiDmarTable)); if (mAcpiDmarTable == NULL) { - return EFI_UNSUPPORTED; + return EFI_NOT_FOUND; } + DEBUG ((DEBUG_INFO,"DMAR Table - 0x%08x\n", mAcpiDmarTable)); VtdDumpDmarTable(); return EFI_SUCCESS; diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/IntelVTdDxe.inf b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/IntelVTdDxe.inf index fde33bb224..bfb6777040 100644 --- a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/IntelVTdDxe.inf +++ b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/IntelVTdDxe.inf @@ -63,12 +63,15 @@ [Guids] gEfiEventExitBootServicesGuid ## CONSUMES ## Event - gEfiAcpi20TableGuid ## CONSUMES ## SystemTable - gEfiAcpi10TableGuid ## CONSUMES ## SystemTable + ## CONSUMES ## SystemTable + ## CONSUMES ## Event + gEfiAcpi20TableGuid + ## CONSUMES ## SystemTable + ## CONSUMES ## Event + gEfiAcpi10TableGuid [Protocols] gEdkiiIoMmuProtocolGuid ## PRODUCES - gEfiAcpiSdtProtocolGuid ## CONSUMES gEfiPciIoProtocolGuid ## CONSUMES gEfiPciEnumerationCompleteProtocolGuid ## CONSUMES gEdkiiPlatformVTdPolicyProtocolGuid ## SOMETIMES_CONSUMES @@ -77,8 +80,7 @@ gIntelSiliconPkgTokenSpaceGuid.PcdVTdPolicyPropertyMask ## CONSUMES [Depex] - gEfiPciRootBridgeIoProtocolGuid AND - gEfiAcpiSdtProtocolGuid + gEfiPciRootBridgeIoProtocolGuid [UserExtensions.TianoCore."ExtraFiles"] IntelVTdDxeExtra.uni