ANDROID: iommu/dma: Add support for DMA_ATTR_SYS_CACHE_NWA

IOMMU_SYS_CACHE_NWA allows buffers for non-coherent devices to be
mapped with the correct memory attributes so that the buffers can be
cached in the system cache, with a no write allocate cache policy.
However, this property is only usable by drivers that invoke the IOMMU
API directly; it is not usable by drivers that use the DMA API.

Thus, introduce DMA_ATTR_SYS_CACHE_NWA, so that drivers for
non-coherent devices that use the DMA API can use it to specify if
they want a buffer to be cached in the system cache.

Bug: 189339242
Change-Id: Ic812a1fb144a58deb4279c2bf121fc6cc4c3b208
Signed-off-by: Isaac J. Manjarres <isaacm@codeaurora.org>
Signed-off-by: Georgi Djakov <quic_c_gdjako@quicinc.com>
This commit is contained in:
Isaac J. Manjarres 2021-01-04 18:11:10 -08:00 committed by Chris Goldsworthy
parent ed46a5c09b
commit 0f690b56fe
3 changed files with 13 additions and 1 deletions

View File

@ -615,6 +615,8 @@ static int dma_info_to_prot(enum dma_data_direction dir, bool coherent,
prot |= IOMMU_PRIV;
if (attrs & DMA_ATTR_SYS_CACHE)
prot |= IOMMU_SYS_CACHE;
if (attrs & DMA_ATTR_SYS_CACHE_NWA)
prot |= IOMMU_SYS_CACHE_NWA;
switch (dir) {
case DMA_BIDIRECTIONAL:

View File

@ -69,6 +69,15 @@
*/
#define DMA_ATTR_SYS_CACHE (1UL << 10)
/*
* DMA_ATTR_SYS_CACHE_NWA: used to indicate that the buffer should be mapped
* with the correct memory attributes so that it can be cached in the system or
* last level cache, with a no write allocate cache policy. This is useful for
* buffers that are being mapped for devices that are non-coherent, but can use
* the system cache.
*/
#define DMA_ATTR_SYS_CACHE_NWA (1UL << 11)
/*
* A dma_addr_t can hold any valid DMA or bus address for the platform. It can
* be given to a device to use as a DMA source or target. It is specific to a

View File

@ -420,7 +420,8 @@ pgprot_t dma_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs)
if (attrs & DMA_ATTR_WRITE_COMBINE)
return pgprot_writecombine(prot);
#endif
if (attrs & DMA_ATTR_SYS_CACHE)
if (attrs & DMA_ATTR_SYS_CACHE ||
attrs & DMA_ATTR_SYS_CACHE_NWA)
return pgprot_syscached(prot);
return pgprot_dmacoherent(prot);
}