Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit adbfa4e6 authored by Max Filippov's avatar Max Filippov
Browse files

xtensa: support DMA_ATTR_NO_KERNEL_MAPPING attribute



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: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 3f2bbf44
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -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,7 +151,9 @@ 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 &&
	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);