/** Completes the DmaMapBusMasterRead(), DmaMapBusMasterWrite(), or DmaMapBusMasterCommonBuffer() operation and releases any corresponding resources. @param Mapping The mapping value returned from DmaMap*(). @retval EFI_SUCCESS The range was unmapped. @retval EFI_DEVICE_ERROR The data was not committed to the target system memory. **/ EFI_STATUS EFIAPI DmaUnmap ( IN VOID *Mapping ) { MAP_INFO_INSTANCE *Map; if (Mapping == NULL) { ASSERT (FALSE); return EFI_INVALID_PARAMETER; } Map = (MAP_INFO_INSTANCE *)Mapping; if (Map->DoubleBuffer) { if ((Map->Operation == MapOperationBusMasterWrite) || (Map->Operation == MapOperationBusMasterCommonBuffer)) { CopyMem ((VOID *)(UINTN)Map->HostAddress, (VOID *)(UINTN)Map->DeviceAddress, Map->NumberOfBytes); } DmaFreeBuffer (EFI_SIZE_TO_PAGES (Map->NumberOfBytes), (VOID *)(UINTN)Map->DeviceAddress); } else { if (Map->Operation == MapOperationBusMasterWrite) { // // Make sure we read buffer from uncached memory and not the cache // gCpu->FlushDataCache (gCpu, Map->HostAddress, Map->NumberOfBytes, EfiCpuFlushTypeInvalidate); } } FreePool (Map); return EFI_SUCCESS; }
EFI_STATUS PciIoFreeBuffer ( IN EFI_PCI_IO_PROTOCOL *This, IN UINTN Pages, IN VOID *HostAddress ) { return DmaFreeBuffer (Pages, HostAddress); }
EFI_STATUS PciRbFreeBuffer ( IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, IN UINTN Pages, IN VOID *HostAddress ) { PCI_TRACE ("PciRbFreeBuffer()"); return DmaFreeBuffer (Pages, HostAddress); }