+++ /dev/null
-/** @file\r
-\r
- Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>\r
- SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include <Uefi.h>\r
-#include <PiPei.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/HobLib.h>\r
-#include <IndustryStandard/Vtd.h>\r
-#include <Ppi/VtdInfo.h>\r
-\r
-#include "IntelVTdPmrPei.h"\r
-\r
-/**\r
- Dump DMAR DeviceScopeEntry.\r
-\r
- @param[in] DmarDeviceScopeEntry DMAR DeviceScopeEntry\r
-**/\r
-VOID\r
-DumpDmarDeviceScopeEntry (\r
- IN EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *DmarDeviceScopeEntry\r
- )\r
-{\r
- UINTN PciPathNumber;\r
- UINTN PciPathIndex;\r
- EFI_ACPI_DMAR_PCI_PATH *PciPath;\r
-\r
- if (DmarDeviceScopeEntry == NULL) {\r
- return;\r
- }\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " *************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " * DMA-Remapping Device Scope Entry Structure *\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " *************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- (sizeof(UINTN) == sizeof(UINT64)) ?\r
- " DMAR Device Scope Entry address ...................... 0x%016lx\n" :\r
- " DMAR Device Scope Entry address ...................... 0x%08x\n",\r
- DmarDeviceScopeEntry\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Device Scope Entry Type ............................ 0x%02x\n",\r
- DmarDeviceScopeEntry->Type\r
- ));\r
- switch (DmarDeviceScopeEntry->Type) {\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_PCI_ENDPOINT:\r
- DEBUG ((DEBUG_INFO,\r
- " PCI Endpoint Device\n"\r
- ));\r
- break;\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_PCI_BRIDGE:\r
- DEBUG ((DEBUG_INFO,\r
- " PCI Sub-hierachy\n"\r
- ));\r
- break;\r
- default:\r
- break;\r
- }\r
- DEBUG ((DEBUG_INFO,\r
- " Length ............................................. 0x%02x\n",\r
- DmarDeviceScopeEntry->Length\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Enumeration ID ..................................... 0x%02x\n",\r
- DmarDeviceScopeEntry->EnumerationId\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Starting Bus Number ................................ 0x%02x\n",\r
- DmarDeviceScopeEntry->StartBusNumber\r
- ));\r
-\r
- PciPathNumber = (DmarDeviceScopeEntry->Length - sizeof(EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER)) / sizeof(EFI_ACPI_DMAR_PCI_PATH);\r
- PciPath = (EFI_ACPI_DMAR_PCI_PATH *)(DmarDeviceScopeEntry + 1);\r
- for (PciPathIndex = 0; PciPathIndex < PciPathNumber; PciPathIndex++) {\r
- DEBUG ((DEBUG_INFO,\r
- " Device ............................................. 0x%02x\n",\r
- PciPath[PciPathIndex].Device\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Function ........................................... 0x%02x\n",\r
- PciPath[PciPathIndex].Function\r
- ));\r
- }\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " *************************************************************************\n\n"\r
- ));\r
-\r
- return;\r
-}\r
-\r
-/**\r
- Dump DMAR RMRR table.\r
-\r
- @param[in] Rmrr DMAR RMRR table\r
-**/\r
-VOID\r
-DumpDmarRmrr (\r
- IN EFI_ACPI_DMAR_RMRR_HEADER *Rmrr\r
- )\r
-{\r
- EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *DmarDeviceScopeEntry;\r
- INTN RmrrLen;\r
-\r
- if (Rmrr == NULL) {\r
- return;\r
- }\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " * Reserved Memory Region Reporting Structure *\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- (sizeof(UINTN) == sizeof(UINT64)) ?\r
- " RMRR address ........................................... 0x%016lx\n" :\r
- " RMRR address ........................................... 0x%08x\n",\r
- Rmrr\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Type ................................................. 0x%04x\n",\r
- Rmrr->Header.Type\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Length ............................................... 0x%04x\n",\r
- Rmrr->Header.Length\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Segment Number ....................................... 0x%04x\n",\r
- Rmrr->SegmentNumber\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Reserved Memory Region Base Address .................. 0x%016lx\n",\r
- Rmrr->ReservedMemoryRegionBaseAddress\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Reserved Memory Region Limit Address ................. 0x%016lx\n",\r
- Rmrr->ReservedMemoryRegionLimitAddress\r
- ));\r
-\r
- RmrrLen = Rmrr->Header.Length - sizeof(EFI_ACPI_DMAR_RMRR_HEADER);\r
- DmarDeviceScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)(Rmrr + 1);\r
- while (RmrrLen > 0) {\r
- DumpDmarDeviceScopeEntry (DmarDeviceScopeEntry);\r
- RmrrLen -= DmarDeviceScopeEntry->Length;\r
- DmarDeviceScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)((UINTN)DmarDeviceScopeEntry + DmarDeviceScopeEntry->Length);\r
- }\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n\n"\r
- ));\r
-\r
- return;\r
-}\r
-\r
-/**\r
- Dump DMAR DRHD table.\r
-\r
- @param[in] Drhd DMAR DRHD table\r
-**/\r
-VOID\r
-DumpDmarDrhd (\r
- IN EFI_ACPI_DMAR_DRHD_HEADER *Drhd\r
- )\r
-{\r
- EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *DmarDeviceScopeEntry;\r
- INTN DrhdLen;\r
-\r
- if (Drhd == NULL) {\r
- return;\r
- }\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " * DMA-Remapping Hardware Definition Structure *\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- (sizeof(UINTN) == sizeof(UINT64)) ?\r
- " DRHD address ........................................... 0x%016lx\n" :\r
- " DRHD address ........................................... 0x%08x\n",\r
- Drhd\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Type ................................................. 0x%04x\n",\r
- Drhd->Header.Type\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Length ............................................... 0x%04x\n",\r
- Drhd->Header.Length\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Flags ................................................ 0x%02x\n",\r
- Drhd->Flags\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " INCLUDE_PCI_ALL .................................... 0x%02x\n",\r
- Drhd->Flags & EFI_ACPI_DMAR_DRHD_FLAGS_INCLUDE_PCI_ALL\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Segment Number ....................................... 0x%04x\n",\r
- Drhd->SegmentNumber\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Register Base Address ................................ 0x%016lx\n",\r
- Drhd->RegisterBaseAddress\r
- ));\r
-\r
- DrhdLen = Drhd->Header.Length - sizeof(EFI_ACPI_DMAR_DRHD_HEADER);\r
- DmarDeviceScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)(Drhd + 1);\r
- while (DrhdLen > 0) {\r
- DumpDmarDeviceScopeEntry (DmarDeviceScopeEntry);\r
- DrhdLen -= DmarDeviceScopeEntry->Length;\r
- DmarDeviceScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)((UINTN)DmarDeviceScopeEntry + DmarDeviceScopeEntry->Length);\r
- }\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n\n"\r
- ));\r
-\r
- return;\r
-}\r
-\r
-/**\r
- Dump DMAR ACPI table.\r
-\r
- @param[in] Dmar DMAR ACPI table\r
-**/\r
-VOID\r
-DumpAcpiDMAR (\r
- IN EFI_ACPI_DMAR_HEADER *Dmar\r
- )\r
-{\r
- EFI_ACPI_DMAR_STRUCTURE_HEADER *DmarHeader;\r
- INTN DmarLen;\r
-\r
- if (Dmar == NULL) {\r
- return;\r
- }\r
-\r
- //\r
- // Dump Dmar table\r
- //\r
- DEBUG ((DEBUG_INFO,\r
- "*****************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- "* DMAR Table *\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- "*****************************************************************************\n"\r
- ));\r
-\r
- DEBUG ((DEBUG_INFO,\r
- (sizeof(UINTN) == sizeof(UINT64)) ?\r
- "DMAR address ............................................. 0x%016lx\n" :\r
- "DMAR address ............................................. 0x%08x\n",\r
- Dmar\r
- ));\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " Table Contents:\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Host Address Width ................................... 0x%02x\n",\r
- Dmar->HostAddressWidth\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Flags ................................................ 0x%02x\n",\r
- Dmar->Flags\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " INTR_REMAP ......................................... 0x%02x\n",\r
- Dmar->Flags & EFI_ACPI_DMAR_FLAGS_INTR_REMAP\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " X2APIC_OPT_OUT_SET ................................. 0x%02x\n",\r
- Dmar->Flags & EFI_ACPI_DMAR_FLAGS_X2APIC_OPT_OUT\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " DMA_CTRL_PLATFORM_OPT_IN_FLAG ...................... 0x%02x\n",\r
- Dmar->Flags & EFI_ACPI_DMAR_FLAGS_DMA_CTRL_PLATFORM_OPT_IN_FLAG\r
- ));\r
-\r
- DmarLen = Dmar->Header.Length - sizeof(EFI_ACPI_DMAR_HEADER);\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)(Dmar + 1);\r
- while (DmarLen > 0) {\r
- switch (DmarHeader->Type) {\r
- case EFI_ACPI_DMAR_TYPE_DRHD:\r
- DumpDmarDrhd ((EFI_ACPI_DMAR_DRHD_HEADER *)DmarHeader);\r
- break;\r
- case EFI_ACPI_DMAR_TYPE_RMRR:\r
- DumpDmarRmrr ((EFI_ACPI_DMAR_RMRR_HEADER *)DmarHeader);\r
- break;\r
- default:\r
- break;\r
- }\r
- DmarLen -= DmarHeader->Length;\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)DmarHeader + DmarHeader->Length);\r
- }\r
-\r
- DEBUG ((DEBUG_INFO,\r
- "*****************************************************************************\n\n"\r
- ));\r
-\r
- return;\r
-}\r
-\r
-/**\r
- Get VTd engine number.\r
-\r
- @param[in] AcpiDmarTable DMAR ACPI table\r
-\r
- @return the VTd engine number.\r
-**/\r
-UINTN\r
-GetVtdEngineNumber (\r
- IN EFI_ACPI_DMAR_HEADER *AcpiDmarTable\r
- )\r
-{\r
- EFI_ACPI_DMAR_STRUCTURE_HEADER *DmarHeader;\r
- UINTN VtdIndex;\r
-\r
- VtdIndex = 0;\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)(AcpiDmarTable + 1));\r
- while ((UINTN)DmarHeader < (UINTN)AcpiDmarTable + AcpiDmarTable->Header.Length) {\r
- switch (DmarHeader->Type) {\r
- case EFI_ACPI_DMAR_TYPE_DRHD:\r
- VtdIndex++;\r
- break;\r
- default:\r
- break;\r
- }\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)DmarHeader + DmarHeader->Length);\r
- }\r
- return VtdIndex ;\r
-}\r
-\r
-/**\r
- Process DMAR DHRD table.\r
-\r
- @param[in] VTdInfo The VTd engine context information.\r
- @param[in] VtdIndex The index of VTd engine.\r
- @param[in] DmarDrhd The DRHD table.\r
-**/\r
-VOID\r
-ProcessDhrd (\r
- IN VTD_INFO *VTdInfo,\r
- IN UINTN VtdIndex,\r
- IN EFI_ACPI_DMAR_DRHD_HEADER *DmarDrhd\r
- )\r
-{\r
- DEBUG ((DEBUG_INFO," VTD (%d) BaseAddress - 0x%016lx\n", VtdIndex, DmarDrhd->RegisterBaseAddress));\r
- VTdInfo->VTdEngineAddress[VtdIndex] = DmarDrhd->RegisterBaseAddress;\r
-}\r
-\r
-/**\r
- Parse DMAR DRHD table.\r
-\r
- @param[in] AcpiDmarTable DMAR ACPI table\r
-\r
- @return EFI_SUCCESS The DMAR DRHD table is parsed.\r
-**/\r
-EFI_STATUS\r
-ParseDmarAcpiTableDrhd (\r
- IN EFI_ACPI_DMAR_HEADER *AcpiDmarTable\r
- )\r
-{\r
- EFI_ACPI_DMAR_STRUCTURE_HEADER *DmarHeader;\r
- UINTN VtdUnitNumber;\r
- UINTN VtdIndex;\r
- VTD_INFO *VTdInfo;\r
-\r
- VtdUnitNumber = GetVtdEngineNumber (AcpiDmarTable);\r
- if (VtdUnitNumber == 0) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- VTdInfo = BuildGuidHob (&mVTdInfoGuid, sizeof(VTD_INFO) + (VtdUnitNumber - 1) * sizeof(UINT64));\r
- ASSERT(VTdInfo != NULL);\r
- if (VTdInfo == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- //\r
- // Initialize the engine mask to all.\r
- //\r
- VTdInfo->AcpiDmarTable = AcpiDmarTable;\r
- VTdInfo->EngineMask = LShiftU64 (1, VtdUnitNumber) - 1;\r
- VTdInfo->HostAddressWidth = AcpiDmarTable->HostAddressWidth;\r
- VTdInfo->VTdEngineCount = VtdUnitNumber;\r
-\r
- VtdIndex = 0;\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)(AcpiDmarTable + 1));\r
- while ((UINTN)DmarHeader < (UINTN)AcpiDmarTable + AcpiDmarTable->Header.Length) {\r
- switch (DmarHeader->Type) {\r
- case EFI_ACPI_DMAR_TYPE_DRHD:\r
- ASSERT (VtdIndex < VtdUnitNumber);\r
- ProcessDhrd (VTdInfo, VtdIndex, (EFI_ACPI_DMAR_DRHD_HEADER *)DmarHeader);\r
- VtdIndex++;\r
-\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)DmarHeader + DmarHeader->Length);\r
- }\r
- ASSERT (VtdIndex == VtdUnitNumber);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Return the VTd engine index according to the Segment and DevScopeEntry.\r
-\r
- @param AcpiDmarTable DMAR ACPI table\r
- @param Segment The segment of the VTd engine\r
- @param DevScopeEntry The DevScopeEntry of the VTd engine\r
-\r
- @return The VTd engine index according to the Segment and DevScopeEntry.\r
- @retval -1 The VTd engine is not found.\r
-**/\r
-UINTN\r
-GetVTdEngineFromDevScopeEntry (\r
- IN EFI_ACPI_DMAR_HEADER *AcpiDmarTable,\r
- IN UINT16 Segment,\r
- IN EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *DevScopeEntry\r
- )\r
-{\r
- EFI_ACPI_DMAR_STRUCTURE_HEADER *DmarHeader;\r
- UINTN VtdIndex;\r
- EFI_ACPI_DMAR_DRHD_HEADER *DmarDrhd;\r
- EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *ThisDevScopeEntry;\r
-\r
- VtdIndex = 0;\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)(AcpiDmarTable + 1));\r
- while ((UINTN)DmarHeader < (UINTN)AcpiDmarTable + AcpiDmarTable->Header.Length) {\r
- switch (DmarHeader->Type) {\r
- case EFI_ACPI_DMAR_TYPE_DRHD:\r
- DmarDrhd = (EFI_ACPI_DMAR_DRHD_HEADER *)DmarHeader;\r
- if (DmarDrhd->SegmentNumber != Segment) {\r
- // Mismatch\r
- break;\r
- }\r
- if ((DmarDrhd->Header.Length == sizeof(EFI_ACPI_DMAR_DRHD_HEADER)) ||\r
- ((DmarDrhd->Flags & EFI_ACPI_DMAR_DRHD_FLAGS_INCLUDE_PCI_ALL) != 0)) {\r
- // No DevScopeEntry\r
- // Do not handle PCI_ALL\r
- break;\r
- }\r
- ThisDevScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)((UINTN)(DmarDrhd + 1));\r
- while ((UINTN)ThisDevScopeEntry < (UINTN)DmarDrhd + DmarDrhd->Header.Length) {\r
- if ((ThisDevScopeEntry->Length == DevScopeEntry->Length) &&\r
- (CompareMem (ThisDevScopeEntry, DevScopeEntry, DevScopeEntry->Length) == 0)) {\r
- return VtdIndex;\r
- }\r
- ThisDevScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)((UINTN)ThisDevScopeEntry + ThisDevScopeEntry->Length);\r
- }\r
- break;\r
- default:\r
- break;\r
- }\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)DmarHeader + DmarHeader->Length);\r
- }\r
- return (UINTN)-1;\r
-}\r
-\r
-/**\r
- Process DMAR RMRR table.\r
-\r
- @param[in] VTdInfo The VTd engine context information.\r
- @param[in] DmarRmrr The RMRR table.\r
-**/\r
-VOID\r
-ProcessRmrr (\r
- IN VTD_INFO *VTdInfo,\r
- IN EFI_ACPI_DMAR_RMRR_HEADER *DmarRmrr\r
- )\r
-{\r
- EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *DmarDevScopeEntry;\r
- UINTN VTdIndex;\r
- UINT64 RmrrMask;\r
- UINTN LowBottom;\r
- UINTN LowTop;\r
- UINTN HighBottom;\r
- UINT64 HighTop;\r
- EFI_ACPI_DMAR_HEADER *AcpiDmarTable;\r
-\r
- AcpiDmarTable = VTdInfo->AcpiDmarTable;\r
-\r
- DEBUG ((DEBUG_INFO," RMRR (Base 0x%016lx, Limit 0x%016lx)\n", DmarRmrr->ReservedMemoryRegionBaseAddress, DmarRmrr->ReservedMemoryRegionLimitAddress));\r
-\r
- if ((DmarRmrr->ReservedMemoryRegionBaseAddress == 0) ||\r
- (DmarRmrr->ReservedMemoryRegionLimitAddress == 0)) {\r
- return ;\r
- }\r
-\r
- DmarDevScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)((UINTN)(DmarRmrr + 1));\r
- while ((UINTN)DmarDevScopeEntry < (UINTN)DmarRmrr + DmarRmrr->Header.Length) {\r
- ASSERT (DmarDevScopeEntry->Type == EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_PCI_ENDPOINT);\r
-\r
- VTdIndex = GetVTdEngineFromDevScopeEntry (AcpiDmarTable, DmarRmrr->SegmentNumber, DmarDevScopeEntry);\r
- if (VTdIndex != (UINTN)-1) {\r
- RmrrMask = LShiftU64 (1, VTdIndex);\r
-\r
- LowBottom = 0;\r
- LowTop = (UINTN)DmarRmrr->ReservedMemoryRegionBaseAddress;\r
- HighBottom = (UINTN)DmarRmrr->ReservedMemoryRegionLimitAddress + 1;\r
- HighTop = LShiftU64 (1, VTdInfo->HostAddressWidth + 1);\r
-\r
- SetDmaProtectedRange (\r
- VTdInfo,\r
- RmrrMask,\r
- 0,\r
- (UINT32)(LowTop - LowBottom),\r
- HighBottom,\r
- HighTop - HighBottom\r
- );\r
-\r
- //\r
- // Remove the engine from the engine mask.\r
- // The assumption is that any other PEI driver does not access\r
- // the device covered by this engine.\r
- //\r
- VTdInfo->EngineMask = VTdInfo->EngineMask & (~RmrrMask);\r
- }\r
-\r
- DmarDevScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)((UINTN)DmarDevScopeEntry + DmarDevScopeEntry->Length);\r
- }\r
-}\r
-\r
-/**\r
- Parse DMAR DRHD table.\r
-\r
- @param[in] VTdInfo The VTd engine context information.\r
-**/\r
-VOID\r
-ParseDmarAcpiTableRmrr (\r
- IN VTD_INFO *VTdInfo\r
- )\r
-{\r
- EFI_ACPI_DMAR_HEADER *AcpiDmarTable;\r
- EFI_ACPI_DMAR_STRUCTURE_HEADER *DmarHeader;\r
-\r
- AcpiDmarTable = VTdInfo->AcpiDmarTable;\r
-\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)(AcpiDmarTable + 1));\r
- while ((UINTN)DmarHeader < (UINTN)AcpiDmarTable + AcpiDmarTable->Header.Length) {\r
- switch (DmarHeader->Type) {\r
- case EFI_ACPI_DMAR_TYPE_RMRR:\r
- ProcessRmrr (VTdInfo, (EFI_ACPI_DMAR_RMRR_HEADER *)DmarHeader);\r
- break;\r
- default:\r
- break;\r
- }\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)DmarHeader + DmarHeader->Length);\r
- }\r
-}\r