diff options
| -rw-r--r-- | arch/xtensa/kernel/pci-dma.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/xtensa/kernel/pci-dma.c b/arch/xtensa/kernel/pci-dma.c index a83d60e92908..5c8a67fc3aa1 100644 --- a/arch/xtensa/kernel/pci-dma.c +++ b/arch/xtensa/kernel/pci-dma.c | |||
| @@ -116,6 +116,10 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, | |||
| 116 | 116 | ||
| 117 | *handle = phys_to_dma(dev, page_to_phys(page)); | 117 | *handle = phys_to_dma(dev, page_to_phys(page)); |
| 118 | 118 | ||
| 119 | if (attrs & DMA_ATTR_NO_KERNEL_MAPPING) { | ||
| 120 | return page; | ||
| 121 | } | ||
| 122 | |||
| 119 | #ifdef CONFIG_MMU | 123 | #ifdef CONFIG_MMU |
| 120 | if (PageHighMem(page)) { | 124 | if (PageHighMem(page)) { |
| 121 | void *p; | 125 | void *p; |
| @@ -147,8 +151,10 @@ void arch_dma_free(struct device *dev, size_t size, void *vaddr, | |||
| 147 | unsigned long addr = (unsigned long)vaddr; | 151 | unsigned long addr = (unsigned long)vaddr; |
| 148 | struct page *page; | 152 | struct page *page; |
| 149 | 153 | ||
| 150 | if (addr >= XCHAL_KSEG_BYPASS_VADDR && | 154 | if (attrs & DMA_ATTR_NO_KERNEL_MAPPING) { |
| 151 | addr - XCHAL_KSEG_BYPASS_VADDR < XCHAL_KSEG_SIZE) { | 155 | page = vaddr; |
| 156 | } else if (addr >= XCHAL_KSEG_BYPASS_VADDR && | ||
| 157 | addr - XCHAL_KSEG_BYPASS_VADDR < XCHAL_KSEG_SIZE) { | ||
| 152 | addr += XCHAL_KSEG_CACHED_VADDR - XCHAL_KSEG_BYPASS_VADDR; | 158 | addr += XCHAL_KSEG_CACHED_VADDR - XCHAL_KSEG_BYPASS_VADDR; |
| 153 | page = virt_to_page(addr); | 159 | page = virt_to_page(addr); |
| 154 | } else { | 160 | } else { |
