Merge "arm64: dma-mapping: optimize unmap coherency check"
This commit is contained in:
commit
c03b5c2d1c
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
|
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.
|
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
|
This DMA attribute is only currently supported for arm64 stage 1 IOMMU
|
||||||
mappings.
|
mappings.
|
||||||
|
|
||||||
|
@ -143,5 +148,9 @@ coherent.
|
||||||
The DMA_ATTR_FORCE_NON_COHERENT DMA attribute overrides the buffer IO
|
The DMA_ATTR_FORCE_NON_COHERENT DMA attribute overrides the buffer IO
|
||||||
coherency configuration set by making the device IO coherent.
|
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
|
This DMA attribute is only currently supported for arm64 stage 1 IOMMU
|
||||||
mappings.
|
mappings.
|
||||||
|
|
|
@ -1821,10 +1821,8 @@ static void arm_iommu_unmap_page(struct device *dev, dma_addr_t handle,
|
||||||
mapping->domain, iova));
|
mapping->domain, iova));
|
||||||
int offset = handle & ~PAGE_MASK;
|
int offset = handle & ~PAGE_MASK;
|
||||||
int len = PAGE_ALIGN(size + offset);
|
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_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs)))
|
||||||
__dma_page_dev_to_cpu(page, offset, size, dir);
|
__dma_page_dev_to_cpu(page, offset, size, dir);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue