REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1547
V2:
Abandon V1.
Do global invalidation of context-cache and IOTLB at
ExitBootServices.
V1:
Only doing IOTLB invalidation would cause a BSOD
'DRIVER_VERIFIER_DMA_VIOLATION' while changing the second
level page entry's attributes. So always do the global
invalidation of context-cache and IOTLB.
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Rangasai V Chaganty <rangasai.v.chaganty@intel.com>
Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>
- Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
IN VOID *Context\r
)\r
{\r
IN VOID *Context\r
)\r
{\r
DEBUG ((DEBUG_INFO, "Vtd OnExitBootServices\n"));\r
DumpVtdRegsAll ();\r
\r
DEBUG ((DEBUG_INFO, "Vtd OnExitBootServices\n"));\r
DumpVtdRegsAll ();\r
\r
+ DEBUG ((DEBUG_INFO, "Invalidate all\n"));\r
+ for (VtdIndex = 0; VtdIndex < mVtdUnitNumber; VtdIndex++) {\r
+ FlushWriteBuffer (VtdIndex);\r
+\r
+ InvalidateContextCache (VtdIndex);\r
+\r
+ InvalidateIOTLB (VtdIndex);\r
+ }\r
+\r
if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT1) == 0) {\r
DisableDmar ();\r
DumpVtdRegsAll ();\r
if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT1) == 0) {\r
DisableDmar ();\r
DumpVtdRegsAll ();\r
- Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
+/**\r
+ Flush VTd engine write buffer.\r
+\r
+ @param[in] VtdIndex The index used to identify a VTd engine.\r
+**/\r
+VOID\r
+FlushWriteBuffer (\r
+ IN UINTN VtdIndex\r
+ );\r
+\r
+/**\r
+ Invalidate VTd context cache.\r
+\r
+ @param[in] VtdIndex The index used to identify a VTd engine.\r
+**/\r
+EFI_STATUS\r
+InvalidateContextCache (\r
+ IN UINTN VtdIndex\r
+ );\r
+\r
+/**\r
+ Invalidate VTd IOTLB.\r
+\r
+ @param[in] VtdIndex The index used to identify a VTd engine.\r
+**/\r
+EFI_STATUS\r
+InvalidateIOTLB (\r
+ IN UINTN VtdIndex\r
+ );\r
+\r
/**\r
Invalid VTd global IOTLB.\r
\r
/**\r
Invalid VTd global IOTLB.\r
\r