arm64: dma-mapping: optimize unmap coherency check
Change arm_iommu_unmap_page to check the DMA attributes for buffer coherency support instead of checking the iommu page table. This change now requires that clients correctly set the DMA_ATTR_FORCE_COHERENT or DMA_ATTR_FORCE_NON_COHERENT DMA attributes in their unmap call if they used it with their map call. This will improve the performance of the arm_iommu_unmap_page call. Change-Id: Ie96ef0a1906a8732b7b1eef7bed8aa85abee95f4 Signed-off-by: Liam Mark <lmark@codeaurora.org>
This commit is contained in:
parent
98094e2149
commit
37a29f1605
2 changed files with 10 additions and 3 deletions
|
@ -132,6 +132,11 @@ DMA_ATTR_FORCE_COHERENT
|
|||
|
||||
When passed to a DMA map call the DMA_ATTR_FORCE_COHERENT DMA
|
||||
attribute can be used to force a buffer to be mapped as IO coherent.
|
||||
|
||||
When the DMA_ATTR_FORCE_COHERENT attribute is set during a map call ensure
|
||||
that it is also set during for the matching unmap call to ensure that the
|
||||
correct cache maintenance is carried out.
|
||||
|
||||
This DMA attribute is only currently supported for arm64 stage 1 IOMMU
|
||||
mappings.
|
||||
|
||||
|
@ -143,5 +148,9 @@ coherent.
|
|||
The DMA_ATTR_FORCE_NON_COHERENT DMA attribute overrides the buffer IO
|
||||
coherency configuration set by making the device IO coherent.
|
||||
|
||||
When the DMA_ATTR_FORCE_NON_COHERENT attribute is set during a map call
|
||||
ensure that it is also set during for the matching unmap call to ensure
|
||||
that the correct cache maintenance is carried out.
|
||||
|
||||
This DMA attribute is only currently supported for arm64 stage 1 IOMMU
|
||||
mappings.
|
||||
|
|
|
@ -1821,10 +1821,8 @@ static void arm_iommu_unmap_page(struct device *dev, dma_addr_t handle,
|
|||
mapping->domain, iova));
|
||||
int offset = handle & ~PAGE_MASK;
|
||||
int len = PAGE_ALIGN(size + offset);
|
||||
bool iova_coherent = iommu_is_iova_coherent(mapping->domain,
|
||||
handle);
|
||||
|
||||
if (!(iova_coherent ||
|
||||
if (!(is_dma_coherent(dev, attrs) ||
|
||||
dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs)))
|
||||
__dma_page_dev_to_cpu(page, offset, size, dir);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue