Commit f9471dc1 authored by Mostafa Saleh's avatar Mostafa Saleh Committed by Joerg Roedel
Browse files

iommu/pages: Fix iommu_pages_flush_incoherent() for non-x86



The dma_sync_single_for_device() function expects a dma_addr_t, but
iommu_pages_flush_incoherent() was incorrectly passing a virtual
address.

Since iommu_pages_start_incoherent() enforces a 1:1 mapping between
DMA addresses and physical addresses (checked via WARN_ON), we can
convert the virtual address to a physical address before passing it to
the DMA API.

This also  matches the behaviour of the other non-x86 in
iommu_pages_free_incoherent(), which uses virt_to_phys(virt);

Fixes: 36ae67b1 ("iommu/pages: Add support for incoherent IOMMU page table walkers")
Signed-off-by: default avatarMostafa Saleh <smostafa@google.com>
Reviewed-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: default avatarPranjal Shrivastava <praan@google.com>
Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
parent 1f44aab7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -137,7 +137,7 @@ static inline void iommu_pages_flush_incoherent(struct device *dma_dev,
						void *virt, size_t offset,
						size_t len)
{
	dma_sync_single_for_device(dma_dev, (uintptr_t)virt + offset, len,
	dma_sync_single_for_device(dma_dev, virt_to_phys(virt) + offset, len,
				   DMA_TO_DEVICE);
}
void iommu_pages_stop_incoherent_list(struct iommu_pages_list *list,