+++ /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 "DmaProtection.h"\r
-\r
-#pragma pack(1)\r
-\r
-typedef struct {\r
- EFI_ACPI_DESCRIPTION_HEADER Header;\r
- UINT32 Entry;\r
-} RSDT_TABLE;\r
-\r
-typedef struct {\r
- EFI_ACPI_DESCRIPTION_HEADER Header;\r
- UINT64 Entry;\r
-} XSDT_TABLE;\r
-\r
-#pragma pack()\r
-\r
-EFI_ACPI_DMAR_HEADER *mAcpiDmarTable = NULL;\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
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_IOAPIC:\r
- DEBUG ((DEBUG_INFO,\r
- " IOAPIC\n"\r
- ));\r
- break;\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_MSI_CAPABLE_HPET:\r
- DEBUG ((DEBUG_INFO,\r
- " MSI Capable HPET\n"\r
- ));\r
- break;\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_ACPI_NAMESPACE_DEVICE:\r
- DEBUG ((DEBUG_INFO,\r
- " ACPI Namespace Device\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 ANDD table.\r
-\r
- @param[in] Andd DMAR ANDD table\r
-**/\r
-VOID\r
-DumpDmarAndd (\r
- IN EFI_ACPI_DMAR_ANDD_HEADER *Andd\r
- )\r
-{\r
- if (Andd == NULL) {\r
- return;\r
- }\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " * ACPI Name-space Device Declaration Structure *\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- (sizeof(UINTN) == sizeof(UINT64)) ?\r
- " ANDD address ........................................... 0x%016lx\n" :\r
- " ANDD address ........................................... 0x%08x\n",\r
- Andd\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Type ................................................. 0x%04x\n",\r
- Andd->Header.Type\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Length ............................................... 0x%04x\n",\r
- Andd->Header.Length\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " ACPI Device Number ................................... 0x%02x\n",\r
- Andd->AcpiDeviceNumber\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " ACPI Object Name ..................................... '%a'\n",\r
- (Andd + 1)\r
- ));\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n\n"\r
- ));\r
-\r
- return;\r
-}\r
-\r
-/**\r
- Dump DMAR RHSA table.\r
-\r
- @param[in] Rhsa DMAR RHSA table\r
-**/\r
-VOID\r
-DumpDmarRhsa (\r
- IN EFI_ACPI_DMAR_RHSA_HEADER *Rhsa\r
- )\r
-{\r
- if (Rhsa == NULL) {\r
- return;\r
- }\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " * Remapping Hardware Status Affinity Structure *\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- (sizeof(UINTN) == sizeof(UINT64)) ?\r
- " RHSA address ........................................... 0x%016lx\n" :\r
- " RHSA address ........................................... 0x%08x\n",\r
- Rhsa\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Type ................................................. 0x%04x\n",\r
- Rhsa->Header.Type\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Length ............................................... 0x%04x\n",\r
- Rhsa->Header.Length\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Register Base Address ................................ 0x%016lx\n",\r
- Rhsa->RegisterBaseAddress\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Proximity Domain ..................................... 0x%08x\n",\r
- Rhsa->ProximityDomain\r
- ));\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n\n"\r
- ));\r
-\r
- return;\r
-}\r
-\r
-/**\r
- Dump DMAR ATSR table.\r
-\r
- @param[in] Atsr DMAR ATSR table\r
-**/\r
-VOID\r
-DumpDmarAtsr (\r
- IN EFI_ACPI_DMAR_ATSR_HEADER *Atsr\r
- )\r
-{\r
- EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *DmarDeviceScopeEntry;\r
- INTN AtsrLen;\r
-\r
- if (Atsr == NULL) {\r
- return;\r
- }\r
-\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " * Root Port ATS Capability Reporting Structure *\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " ***************************************************************************\n"\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- (sizeof(UINTN) == sizeof(UINT64)) ?\r
- " ATSR address ........................................... 0x%016lx\n" :\r
- " ATSR address ........................................... 0x%08x\n",\r
- Atsr\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Type ................................................. 0x%04x\n",\r
- Atsr->Header.Type\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Length ............................................... 0x%04x\n",\r
- Atsr->Header.Length\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Flags ................................................ 0x%02x\n",\r
- Atsr->Flags\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " ALL_PORTS .......................................... 0x%02x\n",\r
- Atsr->Flags & EFI_ACPI_DMAR_ATSR_FLAGS_ALL_PORTS\r
- ));\r
- DEBUG ((DEBUG_INFO,\r
- " Segment Number ....................................... 0x%04x\n",\r
- Atsr->SegmentNumber\r
- ));\r
-\r
- AtsrLen = Atsr->Header.Length - sizeof(EFI_ACPI_DMAR_ATSR_HEADER);\r
- DmarDeviceScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)(Atsr + 1);\r
- while (AtsrLen > 0) {\r
- DumpDmarDeviceScopeEntry (DmarDeviceScopeEntry);\r
- AtsrLen -= 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 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
- case EFI_ACPI_DMAR_TYPE_ATSR:\r
- DumpDmarAtsr ((EFI_ACPI_DMAR_ATSR_HEADER *)DmarHeader);\r
- break;\r
- case EFI_ACPI_DMAR_TYPE_RHSA:\r
- DumpDmarRhsa ((EFI_ACPI_DMAR_RHSA_HEADER *)DmarHeader);\r
- break;\r
- case EFI_ACPI_DMAR_TYPE_ANDD:\r
- DumpDmarAndd ((EFI_ACPI_DMAR_ANDD_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
- Dump DMAR ACPI table.\r
-**/\r
-VOID\r
-VtdDumpDmarTable (\r
- VOID\r
- )\r
-{\r
- DumpAcpiDMAR ((EFI_ACPI_DMAR_HEADER *)(UINTN)mAcpiDmarTable);\r
-}\r
-\r
-/**\r
- Get PCI device information from DMAR DevScopeEntry.\r
-\r
- @param[in] Segment The segment number.\r
- @param[in] DmarDevScopeEntry DMAR DevScopeEntry\r
- @param[out] Bus The bus number.\r
- @param[out] Device The device number.\r
- @param[out] Function The function number.\r
-\r
- @retval EFI_SUCCESS The PCI device information is returned.\r
-**/\r
-EFI_STATUS\r
-GetPciBusDeviceFunction (\r
- IN UINT16 Segment,\r
- IN EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *DmarDevScopeEntry,\r
- OUT UINT8 *Bus,\r
- OUT UINT8 *Device,\r
- OUT UINT8 *Function\r
- )\r
-{\r
- EFI_ACPI_DMAR_PCI_PATH *DmarPciPath;\r
- UINT8 MyBus;\r
- UINT8 MyDevice;\r
- UINT8 MyFunction;\r
-\r
- DmarPciPath = (EFI_ACPI_DMAR_PCI_PATH *)((UINTN)(DmarDevScopeEntry + 1));\r
- MyBus = DmarDevScopeEntry->StartBusNumber;\r
- MyDevice = DmarPciPath->Device;\r
- MyFunction = DmarPciPath->Function;\r
-\r
- switch (DmarDevScopeEntry->Type) {\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_PCI_ENDPOINT:\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_PCI_BRIDGE:\r
- while ((UINTN)DmarPciPath + sizeof(EFI_ACPI_DMAR_PCI_PATH) < (UINTN)DmarDevScopeEntry + DmarDevScopeEntry->Length) {\r
- MyBus = PciSegmentRead8 (PCI_SEGMENT_LIB_ADDRESS(Segment, MyBus, MyDevice, MyFunction, PCI_BRIDGE_SECONDARY_BUS_REGISTER_OFFSET));\r
- DmarPciPath ++;\r
- MyDevice = DmarPciPath->Device;\r
- MyFunction = DmarPciPath->Function;\r
- }\r
- break;\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_IOAPIC:\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_MSI_CAPABLE_HPET:\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_ACPI_NAMESPACE_DEVICE:\r
- break;\r
- }\r
-\r
- *Bus = MyBus;\r
- *Device = MyDevice;\r
- *Function = MyFunction;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Process DMAR DHRD table.\r
-\r
- @param[in] VtdIndex The index of VTd engine.\r
- @param[in] DmarDrhd The DRHD table.\r
-\r
- @retval EFI_SUCCESS The DRHD table is processed.\r
-**/\r
-EFI_STATUS\r
-ProcessDhrd (\r
- IN UINTN VtdIndex,\r
- IN EFI_ACPI_DMAR_DRHD_HEADER *DmarDrhd\r
- )\r
-{\r
- EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *DmarDevScopeEntry;\r
- UINT8 Bus;\r
- UINT8 Device;\r
- UINT8 Function;\r
- UINT8 SecondaryBusNumber;\r
- EFI_STATUS Status;\r
- VTD_SOURCE_ID SourceId;\r
-\r
- mVtdUnitInformation[VtdIndex].VtdUnitBaseAddress = (UINTN)DmarDrhd->RegisterBaseAddress;\r
- DEBUG ((DEBUG_INFO," VTD (%d) BaseAddress - 0x%016lx\n", VtdIndex, DmarDrhd->RegisterBaseAddress));\r
-\r
- mVtdUnitInformation[VtdIndex].Segment = DmarDrhd->SegmentNumber;\r
-\r
- if ((DmarDrhd->Flags & EFI_ACPI_DMAR_DRHD_FLAGS_INCLUDE_PCI_ALL) != 0) {\r
- mVtdUnitInformation[VtdIndex].PciDeviceInfo.IncludeAllFlag = TRUE;\r
- DEBUG ((DEBUG_INFO," ProcessDhrd: with INCLUDE ALL\n"));\r
-\r
- Status = ScanPciBus((VOID *)VtdIndex, DmarDrhd->SegmentNumber, 0, ScanBusCallbackRegisterPciDevice);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- } else {\r
- mVtdUnitInformation[VtdIndex].PciDeviceInfo.IncludeAllFlag = FALSE;\r
- DEBUG ((DEBUG_INFO," ProcessDhrd: without INCLUDE ALL\n"));\r
- }\r
-\r
- DmarDevScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)((UINTN)(DmarDrhd + 1));\r
- while ((UINTN)DmarDevScopeEntry < (UINTN)DmarDrhd + DmarDrhd->Header.Length) {\r
-\r
- Status = GetPciBusDeviceFunction (DmarDrhd->SegmentNumber, DmarDevScopeEntry, &Bus, &Device, &Function);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- DEBUG ((DEBUG_INFO," ProcessDhrd: "));\r
- switch (DmarDevScopeEntry->Type) {\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_PCI_ENDPOINT:\r
- DEBUG ((DEBUG_INFO,"PCI Endpoint"));\r
- break;\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_PCI_BRIDGE:\r
- DEBUG ((DEBUG_INFO,"PCI-PCI bridge"));\r
- break;\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_IOAPIC:\r
- DEBUG ((DEBUG_INFO,"IOAPIC"));\r
- break;\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_MSI_CAPABLE_HPET:\r
- DEBUG ((DEBUG_INFO,"MSI Capable HPET"));\r
- break;\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_ACPI_NAMESPACE_DEVICE:\r
- DEBUG ((DEBUG_INFO,"ACPI Namespace Device"));\r
- break;\r
- }\r
- DEBUG ((DEBUG_INFO," S%04x B%02x D%02x F%02x\n", DmarDrhd->SegmentNumber, Bus, Device, Function));\r
-\r
- SourceId.Bits.Bus = Bus;\r
- SourceId.Bits.Device = Device;\r
- SourceId.Bits.Function = Function;\r
-\r
- Status = RegisterPciDevice (VtdIndex, DmarDrhd->SegmentNumber, SourceId, DmarDevScopeEntry->Type, TRUE);\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // There might be duplication for special device other than standard PCI device.\r
- //\r
- switch (DmarDevScopeEntry->Type) {\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_PCI_ENDPOINT:\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_PCI_BRIDGE:\r
- return Status;\r
- }\r
- }\r
-\r
- switch (DmarDevScopeEntry->Type) {\r
- case EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_PCI_BRIDGE:\r
- SecondaryBusNumber = PciSegmentRead8 (PCI_SEGMENT_LIB_ADDRESS(DmarDrhd->SegmentNumber, Bus, Device, Function, PCI_BRIDGE_SECONDARY_BUS_REGISTER_OFFSET));\r
- Status = ScanPciBus ((VOID *)VtdIndex, DmarDrhd->SegmentNumber, SecondaryBusNumber, ScanBusCallbackRegisterPciDevice);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- break;\r
- default:\r
- break;\r
- }\r
-\r
- DmarDevScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)((UINTN)DmarDevScopeEntry + DmarDevScopeEntry->Length);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Process DMAR RMRR table.\r
-\r
- @param[in] DmarRmrr The RMRR table.\r
-\r
- @retval EFI_SUCCESS The RMRR table is processed.\r
-**/\r
-EFI_STATUS\r
-ProcessRmrr (\r
- IN EFI_ACPI_DMAR_RMRR_HEADER *DmarRmrr\r
- )\r
-{\r
- EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *DmarDevScopeEntry;\r
- UINT8 Bus;\r
- UINT8 Device;\r
- UINT8 Function;\r
- EFI_STATUS Status;\r
- VTD_SOURCE_ID SourceId;\r
-\r
- DEBUG ((DEBUG_INFO," RMRR (Base 0x%016lx, Limit 0x%016lx)\n", DmarRmrr->ReservedMemoryRegionBaseAddress, DmarRmrr->ReservedMemoryRegionLimitAddress));\r
-\r
- DmarDevScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)((UINTN)(DmarRmrr + 1));\r
- while ((UINTN)DmarDevScopeEntry < (UINTN)DmarRmrr + DmarRmrr->Header.Length) {\r
- if (DmarDevScopeEntry->Type != EFI_ACPI_DEVICE_SCOPE_ENTRY_TYPE_PCI_ENDPOINT) {\r
- DEBUG ((DEBUG_INFO,"RMRR DevScopeEntryType is not endpoint, type[0x%x] \n", DmarDevScopeEntry->Type));\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- Status = GetPciBusDeviceFunction (DmarRmrr->SegmentNumber, DmarDevScopeEntry, &Bus, &Device, &Function);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- DEBUG ((DEBUG_INFO,"RMRR S%04x B%02x D%02x F%02x\n", DmarRmrr->SegmentNumber, Bus, Device, Function));\r
-\r
- SourceId.Bits.Bus = Bus;\r
- SourceId.Bits.Device = Device;\r
- SourceId.Bits.Function = Function;\r
- Status = SetAccessAttribute (\r
- DmarRmrr->SegmentNumber,\r
- SourceId,\r
- DmarRmrr->ReservedMemoryRegionBaseAddress,\r
- DmarRmrr->ReservedMemoryRegionLimitAddress + 1 - DmarRmrr->ReservedMemoryRegionBaseAddress,\r
- EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- DmarDevScopeEntry = (EFI_ACPI_DMAR_DEVICE_SCOPE_STRUCTURE_HEADER *)((UINTN)DmarDevScopeEntry + DmarDevScopeEntry->Length);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Get VTd engine number.\r
-**/\r
-UINTN\r
-GetVtdEngineNumber (\r
- VOID\r
- )\r
-{\r
- EFI_ACPI_DMAR_STRUCTURE_HEADER *DmarHeader;\r
- UINTN VtdIndex;\r
-\r
- VtdIndex = 0;\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)(mAcpiDmarTable + 1));\r
- while ((UINTN)DmarHeader < (UINTN)mAcpiDmarTable + mAcpiDmarTable->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
- Parse DMAR DRHD table.\r
-\r
- @return EFI_SUCCESS The DMAR DRHD table is parsed.\r
-**/\r
-EFI_STATUS\r
-ParseDmarAcpiTableDrhd (\r
- VOID\r
- )\r
-{\r
- EFI_ACPI_DMAR_STRUCTURE_HEADER *DmarHeader;\r
- EFI_STATUS Status;\r
- UINTN VtdIndex;\r
-\r
- mVtdUnitNumber = GetVtdEngineNumber ();\r
- DEBUG ((DEBUG_INFO," VtdUnitNumber - %d\n", mVtdUnitNumber));\r
- ASSERT (mVtdUnitNumber > 0);\r
- if (mVtdUnitNumber == 0) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- mVtdUnitInformation = AllocateZeroPool (sizeof(*mVtdUnitInformation) * mVtdUnitNumber);\r
- ASSERT (mVtdUnitInformation != NULL);\r
- if (mVtdUnitInformation == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- VtdIndex = 0;\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)(mAcpiDmarTable + 1));\r
- while ((UINTN)DmarHeader < (UINTN)mAcpiDmarTable + mAcpiDmarTable->Header.Length) {\r
- switch (DmarHeader->Type) {\r
- case EFI_ACPI_DMAR_TYPE_DRHD:\r
- ASSERT (VtdIndex < mVtdUnitNumber);\r
- Status = ProcessDhrd (VtdIndex, (EFI_ACPI_DMAR_DRHD_HEADER *)DmarHeader);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\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 == mVtdUnitNumber);\r
-\r
- for (VtdIndex = 0; VtdIndex < mVtdUnitNumber; VtdIndex++) {\r
- DumpPciDeviceInfo (VtdIndex);\r
- }\r
- return EFI_SUCCESS ;\r
-}\r
-\r
-/**\r
- Parse DMAR DRHD table.\r
-\r
- @return EFI_SUCCESS The DMAR DRHD table is parsed.\r
-**/\r
-EFI_STATUS\r
-ParseDmarAcpiTableRmrr (\r
- VOID\r
- )\r
-{\r
- EFI_ACPI_DMAR_STRUCTURE_HEADER *DmarHeader;\r
- EFI_STATUS Status;\r
-\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)(mAcpiDmarTable + 1));\r
- while ((UINTN)DmarHeader < (UINTN)mAcpiDmarTable + mAcpiDmarTable->Header.Length) {\r
- switch (DmarHeader->Type) {\r
- case EFI_ACPI_DMAR_TYPE_RMRR:\r
- Status = ProcessRmrr ((EFI_ACPI_DMAR_RMRR_HEADER *)DmarHeader);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- break;\r
- default:\r
- break;\r
- }\r
- DmarHeader = (EFI_ACPI_DMAR_STRUCTURE_HEADER *)((UINTN)DmarHeader + DmarHeader->Length);\r
- }\r
- return EFI_SUCCESS ;\r
-}\r
-\r
-/**\r
- Get the DMAR ACPI table.\r
-\r
- @retval EFI_SUCCESS The DMAR ACPI table is got.\r
- @retval EFI_ALREADY_STARTED The DMAR ACPI table has been got previously.\r
- @retval EFI_NOT_FOUND The DMAR ACPI table is not found.\r
-**/\r
-EFI_STATUS\r
-GetDmarAcpiTable (\r
- VOID\r
- )\r
-{\r
- if (mAcpiDmarTable != NULL) {\r
- return EFI_ALREADY_STARTED;\r
- }\r
-\r
- mAcpiDmarTable = (EFI_ACPI_DMAR_HEADER *) EfiLocateFirstAcpiTable (\r
- EFI_ACPI_4_0_DMA_REMAPPING_TABLE_SIGNATURE\r
- );\r
- if (mAcpiDmarTable == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
- DEBUG ((DEBUG_INFO,"DMAR Table - 0x%08x\n", mAcpiDmarTable));\r
- VtdDumpDmarTable();\r
-\r
- return EFI_SUCCESS;\r
-}\r