aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/xtensa/kernel/pci-dma.c10
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 {