]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
xtensa: support DMA_ATTR_NO_KERNEL_MAPPING attribute
authorMax Filippov <jcmvbkbc@gmail.com>
Thu, 15 Feb 2018 00:12:54 +0000 (16:12 -0800)
committerMax Filippov <jcmvbkbc@gmail.com>
Wed, 11 Jul 2018 18:13:33 +0000 (11:13 -0700)
An application that doesn't need kernel mapping of the DMA memory it
allocates may specify DMA_ATTR_NO_KERNEL_MAPPING attribute to allocation
function. Support this attribute and return address of the first struct
page that covers the allocation.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
arch/xtensa/kernel/pci-dma.c

index a83d60e92908fb99f80df3999c8819a5c88378d8..5c8a67fc3aa17e6950670c07e882beae3678155c 100644 (file)
@@ -116,6 +116,10 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
 
        *handle = phys_to_dma(dev, page_to_phys(page));
 
+       if (attrs & DMA_ATTR_NO_KERNEL_MAPPING) {
+               return page;
+       }
+
 #ifdef CONFIG_MMU
        if (PageHighMem(page)) {
                void *p;
@@ -147,8 +151,10 @@ void arch_dma_free(struct device *dev, size_t size, void *vaddr,
        unsigned long addr = (unsigned long)vaddr;
        struct page *page;
 
-       if (addr >= XCHAL_KSEG_BYPASS_VADDR &&
-           addr - XCHAL_KSEG_BYPASS_VADDR < XCHAL_KSEG_SIZE) {
+       if (attrs & DMA_ATTR_NO_KERNEL_MAPPING) {
+               page = vaddr;
+       } else if (addr >= XCHAL_KSEG_BYPASS_VADDR &&
+                  addr - XCHAL_KSEG_BYPASS_VADDR < XCHAL_KSEG_SIZE) {
                addr += XCHAL_KSEG_CACHED_VADDR - XCHAL_KSEG_BYPASS_VADDR;
                page = virt_to_page(addr);
        } else {