+/**\r
+ This function fills DeviceHandle/IoMmuAccess to the MAP_HANDLE_INFO,\r
+ based upon the DeviceAddress.\r
+\r
+ @param[in] DeviceHandle The device who initiates the DMA access request.\r
+ @param[in] DeviceAddress The base of device memory address to be used as the DMA memory.\r
+ @param[in] Length The length of device memory address to be used as the DMA memory.\r
+ @param[in] IoMmuAccess The IOMMU access.\r
+\r
+**/\r
+VOID\r
+SyncDeviceHandleToMapInfo (\r
+ IN EFI_HANDLE DeviceHandle,\r
+ IN EFI_PHYSICAL_ADDRESS DeviceAddress,\r
+ IN UINT64 Length,\r
+ IN UINT64 IoMmuAccess\r
+ )\r
+{\r
+ MAP_INFO *MapInfo;\r
+ MAP_HANDLE_INFO *MapHandleInfo;\r
+ LIST_ENTRY *Link;\r
+ EFI_TPL OriginalTpl;\r
+\r
+ //\r
+ // Find MapInfo according to DeviceAddress\r
+ //\r
+ OriginalTpl = gBS->RaiseTPL (VTD_TPL_LEVEL);\r
+ MapInfo = NULL;\r
+ for (Link = GetFirstNode (&gMaps)\r
+ ; !IsNull (&gMaps, Link)\r
+ ; Link = GetNextNode (&gMaps, Link)\r
+ ) {\r
+ MapInfo = MAP_INFO_FROM_LINK (Link);\r
+ if (MapInfo->DeviceAddress == DeviceAddress) {\r
+ break;\r
+ }\r
+ }\r
+ if ((MapInfo == NULL) || (MapInfo->DeviceAddress != DeviceAddress)) {\r
+ DEBUG ((DEBUG_ERROR, "SyncDeviceHandleToMapInfo: DeviceAddress(0x%lx) - not found\n", DeviceAddress));\r
+ gBS->RestoreTPL (OriginalTpl);\r
+ return ;\r
+ }\r
+\r
+ //\r
+ // Find MapHandleInfo according to DeviceHandle\r
+ //\r
+ MapHandleInfo = NULL;\r
+ for (Link = GetFirstNode (&MapInfo->HandleList)\r
+ ; !IsNull (&MapInfo->HandleList, Link)\r
+ ; Link = GetNextNode (&MapInfo->HandleList, Link)\r
+ ) {\r
+ MapHandleInfo = MAP_HANDLE_INFO_FROM_LINK (Link);\r
+ if (MapHandleInfo->DeviceHandle == DeviceHandle) {\r
+ break;\r
+ }\r
+ }\r
+ if ((MapHandleInfo != NULL) && (MapHandleInfo->DeviceHandle == DeviceHandle)) {\r
+ MapHandleInfo->IoMmuAccess = IoMmuAccess;\r
+ gBS->RestoreTPL (OriginalTpl);\r
+ return ;\r
+ }\r
+\r
+ //\r
+ // No DeviceHandle\r
+ // Initialize and insert the MAP_HANDLE_INFO structure\r
+ //\r
+ MapHandleInfo = AllocatePool (sizeof (MAP_HANDLE_INFO));\r
+ if (MapHandleInfo == NULL) {\r
+ DEBUG ((DEBUG_ERROR, "SyncDeviceHandleToMapInfo: %r\n", EFI_OUT_OF_RESOURCES));\r
+ gBS->RestoreTPL (OriginalTpl);\r
+ return ;\r
+ }\r
+\r
+ MapHandleInfo->Signature = MAP_HANDLE_INFO_SIGNATURE;\r
+ MapHandleInfo->DeviceHandle = DeviceHandle;\r
+ MapHandleInfo->IoMmuAccess = IoMmuAccess;\r
+\r
+ InsertTailList (&MapInfo->HandleList, &MapHandleInfo->Link);\r
+ gBS->RestoreTPL (OriginalTpl);\r
+\r
+ return ;\r
+}\r
+\r