Skip to content

Commit 0d8488a

Browse files
author
Christoph Hellwig
committed
arm64: use swiotlb_alloc and swiotlb_free
The generic swiotlb_alloc and swiotlb_free routines already take care of CMA allocations and adding GFP_DMA32 where needed, so use them instead of the arm specific helpers. Signed-off-by: Christoph Hellwig <[email protected]> Acked-by: Christian König <[email protected]> Reviewed-by: Robin Murphy <[email protected]>
1 parent ad67f5a commit 0d8488a

File tree

2 files changed

+4
-43
lines changed

2 files changed

+4
-43
lines changed

arch/arm64/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ config ARM64
5959
select COMMON_CLK
6060
select CPU_PM if (SUSPEND || CPU_IDLE)
6161
select DCACHE_WORD_ACCESS
62+
select DMA_DIRECT_OPS
6263
select EDAC_SUPPORT
6364
select FRAME_POINTER
6465
select GENERIC_ALLOCATOR

arch/arm64/mm/dma-mapping.c

Lines changed: 3 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -91,46 +91,6 @@ static int __free_from_pool(void *start, size_t size)
9191
return 1;
9292
}
9393

94-
static void *__dma_alloc_coherent(struct device *dev, size_t size,
95-
dma_addr_t *dma_handle, gfp_t flags,
96-
unsigned long attrs)
97-
{
98-
if (IS_ENABLED(CONFIG_ZONE_DMA32) &&
99-
dev->coherent_dma_mask <= DMA_BIT_MASK(32))
100-
flags |= GFP_DMA32;
101-
if (dev_get_cma_area(dev) && gfpflags_allow_blocking(flags)) {
102-
struct page *page;
103-
void *addr;
104-
105-
page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT,
106-
get_order(size), flags);
107-
if (!page)
108-
return NULL;
109-
110-
*dma_handle = phys_to_dma(dev, page_to_phys(page));
111-
addr = page_address(page);
112-
memset(addr, 0, size);
113-
return addr;
114-
} else {
115-
return swiotlb_alloc_coherent(dev, size, dma_handle, flags);
116-
}
117-
}
118-
119-
static void __dma_free_coherent(struct device *dev, size_t size,
120-
void *vaddr, dma_addr_t dma_handle,
121-
unsigned long attrs)
122-
{
123-
bool freed;
124-
phys_addr_t paddr = dma_to_phys(dev, dma_handle);
125-
126-
127-
freed = dma_release_from_contiguous(dev,
128-
phys_to_page(paddr),
129-
size >> PAGE_SHIFT);
130-
if (!freed)
131-
swiotlb_free_coherent(dev, size, vaddr, dma_handle);
132-
}
133-
13494
static void *__dma_alloc(struct device *dev, size_t size,
13595
dma_addr_t *dma_handle, gfp_t flags,
13696
unsigned long attrs)
@@ -152,7 +112,7 @@ static void *__dma_alloc(struct device *dev, size_t size,
152112
return addr;
153113
}
154114

155-
ptr = __dma_alloc_coherent(dev, size, dma_handle, flags, attrs);
115+
ptr = swiotlb_alloc(dev, size, dma_handle, flags, attrs);
156116
if (!ptr)
157117
goto no_mem;
158118

@@ -173,7 +133,7 @@ static void *__dma_alloc(struct device *dev, size_t size,
173133
return coherent_ptr;
174134

175135
no_map:
176-
__dma_free_coherent(dev, size, ptr, *dma_handle, attrs);
136+
swiotlb_free(dev, size, ptr, *dma_handle, attrs);
177137
no_mem:
178138
return NULL;
179139
}
@@ -191,7 +151,7 @@ static void __dma_free(struct device *dev, size_t size,
191151
return;
192152
vunmap(vaddr);
193153
}
194-
__dma_free_coherent(dev, size, swiotlb_addr, dma_handle, attrs);
154+
swiotlb_free(dev, size, swiotlb_addr, dma_handle, attrs);
195155
}
196156

197157
static dma_addr_t __swiotlb_map_page(struct device *dev, struct page *page,

0 commit comments

Comments
 (0)