blob: 3ac47604a6c01dfc259c0ce7f4a7120315dafd92 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Russell King0ddbccd2008-09-25 15:59:19 +01002 * linux/arch/arm/mm/dma-mapping.c
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 *
4 * Copyright (C) 2000-2004 Russell King
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * DMA uncached mapping support.
11 */
12#include <linux/module.h>
13#include <linux/mm.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090014#include <linux/gfp.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070015#include <linux/errno.h>
16#include <linux/list.h>
17#include <linux/init.h>
18#include <linux/device.h>
19#include <linux/dma-mapping.h>
Nicolas Pitre39af22a2010-12-15 15:14:45 -050020#include <linux/highmem.h>
Jon Medhurst99d17172011-08-02 17:28:27 +010021#include <linux/slab.h>
Marek Szyprowski4ce63fc2012-05-16 15:48:21 +020022#include <linux/iommu.h>
23#include <linux/vmalloc.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070024
Lennert Buytenhek23759dc2006-04-02 00:07:39 +010025#include <asm/memory.h>
Nicolas Pitre43377452009-03-12 22:52:09 -040026#include <asm/highmem.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <asm/cacheflush.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070028#include <asm/tlbflush.h>
Kevin Hilman37134cd2006-01-12 16:12:21 +000029#include <asm/sizes.h>
Jon Medhurst99d17172011-08-02 17:28:27 +010030#include <asm/mach/arch.h>
Marek Szyprowski4ce63fc2012-05-16 15:48:21 +020031#include <asm/dma-iommu.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032
Russell King022ae532011-07-08 21:26:59 +010033#include "mm.h"
34
Marek Szyprowski15237e12012-02-10 19:55:20 +010035/*
36 * The DMA API is built upon the notion of "buffer ownership". A buffer
37 * is either exclusively owned by the CPU (and therefore may be accessed
38 * by it) or exclusively owned by the DMA device. These helper functions
39 * represent the transitions between these two ownership states.
40 *
41 * Note, however, that on later ARMs, this notion does not work due to
42 * speculative prefetches. We model our approach on the assumption that
43 * the CPU does do speculative prefetches, which means we clean caches
44 * before transfers and delay cache invalidation until transfer completion.
45 *
Marek Szyprowski15237e12012-02-10 19:55:20 +010046 */
Marek Szyprowski51fde3492012-02-10 19:55:20 +010047static void __dma_page_cpu_to_dev(struct page *, unsigned long,
Marek Szyprowski15237e12012-02-10 19:55:20 +010048 size_t, enum dma_data_direction);
Marek Szyprowski51fde3492012-02-10 19:55:20 +010049static void __dma_page_dev_to_cpu(struct page *, unsigned long,
Marek Szyprowski15237e12012-02-10 19:55:20 +010050 size_t, enum dma_data_direction);
51
Marek Szyprowski2dc6a012012-02-10 19:55:20 +010052/**
53 * arm_dma_map_page - map a portion of a page for streaming DMA
54 * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
55 * @page: page that buffer resides in
56 * @offset: offset into page for start of buffer
57 * @size: size of buffer to map
58 * @dir: DMA transfer direction
59 *
60 * Ensure that any data held in the cache is appropriately discarded
61 * or written back.
62 *
63 * The device owns this memory once this call has completed. The CPU
64 * can regain ownership by calling dma_unmap_page().
65 */
Marek Szyprowski51fde3492012-02-10 19:55:20 +010066static dma_addr_t arm_dma_map_page(struct device *dev, struct page *page,
Marek Szyprowski2dc6a012012-02-10 19:55:20 +010067 unsigned long offset, size_t size, enum dma_data_direction dir,
68 struct dma_attrs *attrs)
69{
Marek Szyprowski51fde3492012-02-10 19:55:20 +010070 if (!arch_is_coherent())
71 __dma_page_cpu_to_dev(page, offset, size, dir);
72 return pfn_to_dma(dev, page_to_pfn(page)) + offset;
Marek Szyprowski2dc6a012012-02-10 19:55:20 +010073}
74
75/**
76 * arm_dma_unmap_page - unmap a buffer previously mapped through dma_map_page()
77 * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
78 * @handle: DMA address of buffer
79 * @size: size of buffer (same as passed to dma_map_page)
80 * @dir: DMA transfer direction (same as passed to dma_map_page)
81 *
82 * Unmap a page streaming mode DMA translation. The handle and size
83 * must match what was provided in the previous dma_map_page() call.
84 * All other usages are undefined.
85 *
86 * After this call, reads by the CPU to the buffer are guaranteed to see
87 * whatever the device wrote there.
88 */
Marek Szyprowski51fde3492012-02-10 19:55:20 +010089static void arm_dma_unmap_page(struct device *dev, dma_addr_t handle,
Marek Szyprowski2dc6a012012-02-10 19:55:20 +010090 size_t size, enum dma_data_direction dir,
91 struct dma_attrs *attrs)
92{
Marek Szyprowski51fde3492012-02-10 19:55:20 +010093 if (!arch_is_coherent())
94 __dma_page_dev_to_cpu(pfn_to_page(dma_to_pfn(dev, handle)),
95 handle & ~PAGE_MASK, size, dir);
Marek Szyprowski2dc6a012012-02-10 19:55:20 +010096}
97
Marek Szyprowski51fde3492012-02-10 19:55:20 +010098static void arm_dma_sync_single_for_cpu(struct device *dev,
Marek Szyprowski2dc6a012012-02-10 19:55:20 +010099 dma_addr_t handle, size_t size, enum dma_data_direction dir)
100{
101 unsigned int offset = handle & (PAGE_SIZE - 1);
102 struct page *page = pfn_to_page(dma_to_pfn(dev, handle-offset));
Marek Szyprowski51fde3492012-02-10 19:55:20 +0100103 if (!arch_is_coherent())
104 __dma_page_dev_to_cpu(page, offset, size, dir);
Marek Szyprowski2dc6a012012-02-10 19:55:20 +0100105}
106
Marek Szyprowski51fde3492012-02-10 19:55:20 +0100107static void arm_dma_sync_single_for_device(struct device *dev,
Marek Szyprowski2dc6a012012-02-10 19:55:20 +0100108 dma_addr_t handle, size_t size, enum dma_data_direction dir)
109{
110 unsigned int offset = handle & (PAGE_SIZE - 1);
111 struct page *page = pfn_to_page(dma_to_pfn(dev, handle-offset));
Marek Szyprowski51fde3492012-02-10 19:55:20 +0100112 if (!arch_is_coherent())
113 __dma_page_cpu_to_dev(page, offset, size, dir);
Marek Szyprowski2dc6a012012-02-10 19:55:20 +0100114}
115
116static int arm_dma_set_mask(struct device *dev, u64 dma_mask);
117
118struct dma_map_ops arm_dma_ops = {
Marek Szyprowskif99d6032012-05-16 18:31:23 +0200119 .alloc = arm_dma_alloc,
120 .free = arm_dma_free,
121 .mmap = arm_dma_mmap,
Marek Szyprowski2dc6a012012-02-10 19:55:20 +0100122 .map_page = arm_dma_map_page,
123 .unmap_page = arm_dma_unmap_page,
124 .map_sg = arm_dma_map_sg,
125 .unmap_sg = arm_dma_unmap_sg,
126 .sync_single_for_cpu = arm_dma_sync_single_for_cpu,
127 .sync_single_for_device = arm_dma_sync_single_for_device,
128 .sync_sg_for_cpu = arm_dma_sync_sg_for_cpu,
129 .sync_sg_for_device = arm_dma_sync_sg_for_device,
130 .set_dma_mask = arm_dma_set_mask,
131};
132EXPORT_SYMBOL(arm_dma_ops);
133
Catalin Marinasab6494f2009-07-24 12:35:02 +0100134static u64 get_coherent_dma_mask(struct device *dev)
135{
Russell King022ae532011-07-08 21:26:59 +0100136 u64 mask = (u64)arm_dma_limit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700137
Catalin Marinasab6494f2009-07-24 12:35:02 +0100138 if (dev) {
139 mask = dev->coherent_dma_mask;
140
141 /*
142 * Sanity check the DMA mask - it must be non-zero, and
143 * must be able to be satisfied by a DMA allocation.
144 */
145 if (mask == 0) {
146 dev_warn(dev, "coherent DMA mask is unset\n");
147 return 0;
148 }
149
Russell King022ae532011-07-08 21:26:59 +0100150 if ((~mask) & (u64)arm_dma_limit) {
Catalin Marinasab6494f2009-07-24 12:35:02 +0100151 dev_warn(dev, "coherent DMA mask %#llx is smaller "
152 "than system GFP_DMA mask %#llx\n",
Russell King022ae532011-07-08 21:26:59 +0100153 mask, (u64)arm_dma_limit);
Catalin Marinasab6494f2009-07-24 12:35:02 +0100154 return 0;
155 }
156 }
157
158 return mask;
159}
160
Marek Szyprowski4ce63fc2012-05-16 15:48:21 +0200161static void __dma_clear_buffer(struct page *page, size_t size)
162{
163 void *ptr;
164 /*
165 * Ensure that the allocated pages are zeroed, and that any data
166 * lurking in the kernel direct-mapped region is invalidated.
167 */
168 ptr = page_address(page);
169 if (ptr) {
170 memset(ptr, 0, size);
171 dmac_flush_range(ptr, ptr + size);
172 outer_flush_range(__pa(ptr), __pa(ptr) + size);
173 }
174}
175
Russell King7a9a32a2009-11-19 15:31:07 +0000176/*
177 * Allocate a DMA buffer for 'dev' of size 'size' using the
178 * specified gfp mask. Note that 'size' must be page aligned.
179 */
180static struct page *__dma_alloc_buffer(struct device *dev, size_t size, gfp_t gfp)
181{
182 unsigned long order = get_order(size);
183 struct page *page, *p, *e;
Russell King7a9a32a2009-11-19 15:31:07 +0000184 u64 mask = get_coherent_dma_mask(dev);
185
186#ifdef CONFIG_DMA_API_DEBUG
187 u64 limit = (mask + 1) & ~mask;
188 if (limit && size >= limit) {
189 dev_warn(dev, "coherent allocation too big (requested %#x mask %#llx)\n",
190 size, mask);
191 return NULL;
192 }
193#endif
194
195 if (!mask)
196 return NULL;
197
198 if (mask < 0xffffffffULL)
199 gfp |= GFP_DMA;
200
201 page = alloc_pages(gfp, order);
202 if (!page)
203 return NULL;
204
205 /*
206 * Now split the huge page and free the excess pages
207 */
208 split_page(page, order);
209 for (p = page + (size >> PAGE_SHIFT), e = page + (1 << order); p < e; p++)
210 __free_page(p);
211
Marek Szyprowski4ce63fc2012-05-16 15:48:21 +0200212 __dma_clear_buffer(page, size);
Russell King7a9a32a2009-11-19 15:31:07 +0000213
214 return page;
215}
216
217/*
218 * Free a DMA buffer. 'size' must be page aligned.
219 */
220static void __dma_free_buffer(struct page *page, size_t size)
221{
222 struct page *e = page + (size >> PAGE_SHIFT);
223
224 while (page < e) {
225 __free_page(page);
226 page++;
227 }
228}
229
Catalin Marinasab6494f2009-07-24 12:35:02 +0100230#ifdef CONFIG_MMU
Catalin Marinasa5e9d382010-06-21 15:09:06 +0100231
Jon Medhurst99d17172011-08-02 17:28:27 +0100232#define CONSISTENT_OFFSET(x) (((unsigned long)(x) - consistent_base) >> PAGE_SHIFT)
Linus Torvalds1fdb24e2011-10-28 12:02:27 -0700233#define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - consistent_base) >> PMD_SHIFT)
Catalin Marinasa5e9d382010-06-21 15:09:06 +0100234
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235/*
Kevin Hilman37134cd2006-01-12 16:12:21 +0000236 * These are the page tables (2MB each) covering uncached, DMA consistent allocations
Linus Torvalds1da177e2005-04-16 15:20:36 -0700237 */
Jon Medhurst99d17172011-08-02 17:28:27 +0100238static pte_t **consistent_pte;
239
Jon Medhurst99d17172011-08-02 17:28:27 +0100240#define DEFAULT_CONSISTENT_DMA_SIZE SZ_2M
Jon Medhurst99d17172011-08-02 17:28:27 +0100241
242unsigned long consistent_base = CONSISTENT_END - DEFAULT_CONSISTENT_DMA_SIZE;
243
244void __init init_consistent_dma_size(unsigned long size)
245{
246 unsigned long base = CONSISTENT_END - ALIGN(size, SZ_2M);
247
248 BUG_ON(consistent_pte); /* Check we're called before DMA region init */
249 BUG_ON(base < VMALLOC_END);
250
251 /* Grow region to accommodate specified size */
252 if (base < consistent_base)
253 consistent_base = base;
254}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700255
Russell King13ccf3a2009-11-19 15:07:04 +0000256#include "vmregion.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700257
Russell King13ccf3a2009-11-19 15:07:04 +0000258static struct arm_vmregion_head consistent_head = {
259 .vm_lock = __SPIN_LOCK_UNLOCKED(&consistent_head.vm_lock),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700260 .vm_list = LIST_HEAD_INIT(consistent_head.vm_list),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700261 .vm_end = CONSISTENT_END,
262};
263
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264#ifdef CONFIG_HUGETLB_PAGE
265#error ARM Coherent DMA allocator does not (yet) support huge TLB
266#endif
267
Russell King88c58f32009-11-19 16:46:02 +0000268/*
269 * Initialise the consistent memory allocation.
270 */
271static int __init consistent_init(void)
272{
273 int ret = 0;
274 pgd_t *pgd;
Russell King516295e2010-11-21 16:27:49 +0000275 pud_t *pud;
Russell King88c58f32009-11-19 16:46:02 +0000276 pmd_t *pmd;
277 pte_t *pte;
278 int i = 0;
Jon Medhurst99d17172011-08-02 17:28:27 +0100279 unsigned long base = consistent_base;
Catalin Marinas53cbcbc2011-11-17 13:11:21 +0100280 unsigned long num_ptes = (CONSISTENT_END - base) >> PMD_SHIFT;
Jon Medhurst99d17172011-08-02 17:28:27 +0100281
282 consistent_pte = kmalloc(num_ptes * sizeof(pte_t), GFP_KERNEL);
283 if (!consistent_pte) {
284 pr_err("%s: no memory\n", __func__);
285 return -ENOMEM;
286 }
287
288 pr_debug("DMA memory: 0x%08lx - 0x%08lx:\n", base, CONSISTENT_END);
289 consistent_head.vm_start = base;
Russell King88c58f32009-11-19 16:46:02 +0000290
291 do {
292 pgd = pgd_offset(&init_mm, base);
Russell King516295e2010-11-21 16:27:49 +0000293
294 pud = pud_alloc(&init_mm, pgd, base);
295 if (!pud) {
Marek Szyprowski6b6f7702012-02-28 10:19:14 +0100296 pr_err("%s: no pud tables\n", __func__);
Russell King516295e2010-11-21 16:27:49 +0000297 ret = -ENOMEM;
298 break;
299 }
300
301 pmd = pmd_alloc(&init_mm, pud, base);
Russell King88c58f32009-11-19 16:46:02 +0000302 if (!pmd) {
Marek Szyprowski6b6f7702012-02-28 10:19:14 +0100303 pr_err("%s: no pmd tables\n", __func__);
Russell King88c58f32009-11-19 16:46:02 +0000304 ret = -ENOMEM;
305 break;
306 }
307 WARN_ON(!pmd_none(*pmd));
308
309 pte = pte_alloc_kernel(pmd, base);
310 if (!pte) {
Marek Szyprowski6b6f7702012-02-28 10:19:14 +0100311 pr_err("%s: no pte tables\n", __func__);
Russell King88c58f32009-11-19 16:46:02 +0000312 ret = -ENOMEM;
313 break;
314 }
315
316 consistent_pte[i++] = pte;
Catalin Marinase73fc882011-08-23 14:07:23 +0100317 base += PMD_SIZE;
Russell King88c58f32009-11-19 16:46:02 +0000318 } while (base < CONSISTENT_END);
319
320 return ret;
321}
322
323core_initcall(consistent_init);
324
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325static void *
Russell King45cd5292012-01-12 23:08:07 +0000326__dma_alloc_remap(struct page *page, size_t size, gfp_t gfp, pgprot_t prot,
327 const void *caller)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328{
Russell King13ccf3a2009-11-19 15:07:04 +0000329 struct arm_vmregion *c;
Russell King5bc23d32010-07-25 08:57:02 +0100330 size_t align;
331 int bit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700332
Jon Medhurst99d17172011-08-02 17:28:27 +0100333 if (!consistent_pte) {
Marek Szyprowski6b6f7702012-02-28 10:19:14 +0100334 pr_err("%s: not initialised\n", __func__);
Russell Kingebd7a842009-11-19 20:58:31 +0000335 dump_stack();
Russell Kingebd7a842009-11-19 20:58:31 +0000336 return NULL;
337 }
338
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339 /*
Russell King5bc23d32010-07-25 08:57:02 +0100340 * Align the virtual region allocation - maximum alignment is
341 * a section size, minimum is a page size. This helps reduce
342 * fragmentation of the DMA space, and also prevents allocations
343 * smaller than a section from crossing a section boundary.
344 */
Russell Kingc947f692010-11-03 16:00:15 +0000345 bit = fls(size - 1);
Russell King5bc23d32010-07-25 08:57:02 +0100346 if (bit > SECTION_SHIFT)
347 bit = SECTION_SHIFT;
348 align = 1 << bit;
349
350 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700351 * Allocate a virtual address in the consistent mapping region.
352 */
Russell King5bc23d32010-07-25 08:57:02 +0100353 c = arm_vmregion_alloc(&consistent_head, align, size,
Russell King45cd5292012-01-12 23:08:07 +0000354 gfp & ~(__GFP_DMA | __GFP_HIGHMEM), caller);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700355 if (c) {
Kevin Hilman37134cd2006-01-12 16:12:21 +0000356 pte_t *pte;
Kevin Hilman37134cd2006-01-12 16:12:21 +0000357 int idx = CONSISTENT_PTE_INDEX(c->vm_start);
358 u32 off = CONSISTENT_OFFSET(c->vm_start) & (PTRS_PER_PTE-1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700359
Kevin Hilman37134cd2006-01-12 16:12:21 +0000360 pte = consistent_pte[idx] + off;
Marek Szyprowski4ce63fc2012-05-16 15:48:21 +0200361 c->priv = page;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700362
Linus Torvalds1da177e2005-04-16 15:20:36 -0700363 do {
364 BUG_ON(!pte_none(*pte));
365
Russell Kingad1ae2f2006-12-13 14:34:43 +0000366 set_pte_ext(pte, mk_pte(page, prot), 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367 page++;
368 pte++;
Kevin Hilman37134cd2006-01-12 16:12:21 +0000369 off++;
370 if (off >= PTRS_PER_PTE) {
371 off = 0;
372 pte = consistent_pte[++idx];
373 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374 } while (size -= PAGE_SIZE);
375
Russell King2be23c42010-09-08 16:27:56 +0100376 dsb();
377
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378 return (void *)c->vm_start;
379 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700380 return NULL;
381}
Russell King695ae0a2009-11-19 16:31:39 +0000382
383static void __dma_free_remap(void *cpu_addr, size_t size)
384{
385 struct arm_vmregion *c;
386 unsigned long addr;
387 pte_t *ptep;
388 int idx;
389 u32 off;
390
391 c = arm_vmregion_find_remove(&consistent_head, (unsigned long)cpu_addr);
392 if (!c) {
Marek Szyprowski6b6f7702012-02-28 10:19:14 +0100393 pr_err("%s: trying to free invalid coherent area: %p\n",
Russell King695ae0a2009-11-19 16:31:39 +0000394 __func__, cpu_addr);
395 dump_stack();
396 return;
397 }
398
399 if ((c->vm_end - c->vm_start) != size) {
Marek Szyprowski6b6f7702012-02-28 10:19:14 +0100400 pr_err("%s: freeing wrong coherent size (%ld != %d)\n",
Russell King695ae0a2009-11-19 16:31:39 +0000401 __func__, c->vm_end - c->vm_start, size);
402 dump_stack();
403 size = c->vm_end - c->vm_start;
404 }
405
406 idx = CONSISTENT_PTE_INDEX(c->vm_start);
407 off = CONSISTENT_OFFSET(c->vm_start) & (PTRS_PER_PTE-1);
408 ptep = consistent_pte[idx] + off;
409 addr = c->vm_start;
410 do {
411 pte_t pte = ptep_get_and_clear(&init_mm, addr, ptep);
Russell King695ae0a2009-11-19 16:31:39 +0000412
413 ptep++;
414 addr += PAGE_SIZE;
415 off++;
416 if (off >= PTRS_PER_PTE) {
417 off = 0;
418 ptep = consistent_pte[++idx];
419 }
420
Russell Kingacaac252009-11-20 18:19:52 +0000421 if (pte_none(pte) || !pte_present(pte))
Marek Szyprowski6b6f7702012-02-28 10:19:14 +0100422 pr_crit("%s: bad page in kernel page table\n",
423 __func__);
Russell King695ae0a2009-11-19 16:31:39 +0000424 } while (size -= PAGE_SIZE);
425
426 flush_tlb_kernel_range(c->vm_start, c->vm_end);
427
428 arm_vmregion_free(&consistent_head, c);
429}
430
Marek Szyprowskif99d6032012-05-16 18:31:23 +0200431static inline pgprot_t __get_dma_pgprot(struct dma_attrs *attrs, pgprot_t prot)
432{
433 prot = dma_get_attr(DMA_ATTR_WRITE_COMBINE, attrs) ?
434 pgprot_writecombine(prot) :
435 pgprot_dmacoherent(prot);
436 return prot;
437}
438
Catalin Marinasab6494f2009-07-24 12:35:02 +0100439#else /* !CONFIG_MMU */
Russell King695ae0a2009-11-19 16:31:39 +0000440
Russell King45cd5292012-01-12 23:08:07 +0000441#define __dma_alloc_remap(page, size, gfp, prot, c) page_address(page)
Russell King31ebf942009-11-19 21:12:17 +0000442#define __dma_free_remap(addr, size) do { } while (0)
Marek Szyprowskif99d6032012-05-16 18:31:23 +0200443#define __get_dma_pgprot(attrs, prot) __pgprot(0)
Russell King31ebf942009-11-19 21:12:17 +0000444
445#endif /* CONFIG_MMU */
446
Catalin Marinasab6494f2009-07-24 12:35:02 +0100447static void *
448__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp,
Russell King45cd5292012-01-12 23:08:07 +0000449 pgprot_t prot, const void *caller)
Catalin Marinasab6494f2009-07-24 12:35:02 +0100450{
Russell King04da5692009-11-19 15:54:45 +0000451 struct page *page;
Russell King31ebf942009-11-19 21:12:17 +0000452 void *addr;
Catalin Marinasab6494f2009-07-24 12:35:02 +0100453
Sumit Bhattacharyaea2e7052011-11-24 00:47:12 +0100454 /*
455 * Following is a work-around (a.k.a. hack) to prevent pages
456 * with __GFP_COMP being passed to split_page() which cannot
457 * handle them. The real problem is that this flag probably
458 * should be 0 on ARM as it is not supported on this
459 * platform; see CONFIG_HUGETLBFS.
460 */
461 gfp &= ~(__GFP_COMP);
462
Marek Szyprowski553ac782012-02-29 14:45:28 +0100463 *handle = DMA_ERROR_CODE;
Russell King04da5692009-11-19 15:54:45 +0000464 size = PAGE_ALIGN(size);
465
466 page = __dma_alloc_buffer(dev, size, gfp);
467 if (!page)
468 return NULL;
469
Russell King31ebf942009-11-19 21:12:17 +0000470 if (!arch_is_coherent())
Russell King45cd5292012-01-12 23:08:07 +0000471 addr = __dma_alloc_remap(page, size, gfp, prot, caller);
Russell King31ebf942009-11-19 21:12:17 +0000472 else
473 addr = page_address(page);
474
475 if (addr)
Russell King9eedd962011-01-03 00:00:17 +0000476 *handle = pfn_to_dma(dev, page_to_pfn(page));
Russell Kingd8e89b42011-09-22 10:32:25 +0100477 else
478 __dma_free_buffer(page, size);
Russell King31ebf942009-11-19 21:12:17 +0000479
480 return addr;
Catalin Marinasab6494f2009-07-24 12:35:02 +0100481}
Russell King695ae0a2009-11-19 16:31:39 +0000482
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483/*
484 * Allocate DMA-coherent memory space and return both the kernel remapped
485 * virtual and bus address for that space.
486 */
Marek Szyprowskif99d6032012-05-16 18:31:23 +0200487void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
488 gfp_t gfp, struct dma_attrs *attrs)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700489{
Marek Szyprowskif99d6032012-05-16 18:31:23 +0200490 pgprot_t prot = __get_dma_pgprot(attrs, pgprot_kernel);
Dmitry Baryshkov1fe53262008-07-18 13:30:14 +0400491 void *memory;
492
493 if (dma_alloc_from_coherent(dev, size, handle, &memory))
494 return memory;
495
Marek Szyprowskif99d6032012-05-16 18:31:23 +0200496 return __dma_alloc(dev, size, handle, gfp, prot,
Russell King45cd5292012-01-12 23:08:07 +0000497 __builtin_return_address(0));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499
500/*
Marek Szyprowskif99d6032012-05-16 18:31:23 +0200501 * Create userspace mapping for the DMA-coherent memory.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700502 */
Marek Szyprowskif99d6032012-05-16 18:31:23 +0200503int arm_dma_mmap(struct device *dev, struct vm_area_struct *vma,
504 void *cpu_addr, dma_addr_t dma_addr, size_t size,
505 struct dma_attrs *attrs)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700506{
Catalin Marinasab6494f2009-07-24 12:35:02 +0100507 int ret = -ENXIO;
508#ifdef CONFIG_MMU
Russell King13ccf3a2009-11-19 15:07:04 +0000509 unsigned long user_size, kern_size;
510 struct arm_vmregion *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511
Marek Szyprowskif99d6032012-05-16 18:31:23 +0200512 vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot);
513
Marek Szyprowski47142f02012-05-15 19:04:13 +0200514 if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret))
515 return ret;
516
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517 user_size = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
518
Russell King13ccf3a2009-11-19 15:07:04 +0000519 c = arm_vmregion_find(&consistent_head, (unsigned long)cpu_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700520 if (c) {
521 unsigned long off = vma->vm_pgoff;
Marek Szyprowski4ce63fc2012-05-16 15:48:21 +0200522 struct page *pages = c->priv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700523
524 kern_size = (c->vm_end - c->vm_start) >> PAGE_SHIFT;
525
526 if (off < kern_size &&
527 user_size <= (kern_size - off)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528 ret = remap_pfn_range(vma, vma->vm_start,
Marek Szyprowski4ce63fc2012-05-16 15:48:21 +0200529 page_to_pfn(pages) + off,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700530 user_size << PAGE_SHIFT,
531 vma->vm_page_prot);
532 }
533 }
Catalin Marinasab6494f2009-07-24 12:35:02 +0100534#endif /* CONFIG_MMU */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700535
536 return ret;
537}
538
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539/*
540 * free a page as defined by the above mapping.
Russell King5edf71a2005-11-25 15:52:51 +0000541 * Must not be called with IRQs disabled.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542 */
Marek Szyprowskif99d6032012-05-16 18:31:23 +0200543void arm_dma_free(struct device *dev, size_t size, void *cpu_addr,
544 dma_addr_t handle, struct dma_attrs *attrs)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545{
Russell King5edf71a2005-11-25 15:52:51 +0000546 WARN_ON(irqs_disabled());
547
Dmitry Baryshkov1fe53262008-07-18 13:30:14 +0400548 if (dma_release_from_coherent(dev, get_order(size), cpu_addr))
549 return;
550
Russell King3e82d012009-11-19 15:38:12 +0000551 size = PAGE_ALIGN(size);
552
Russell King695ae0a2009-11-19 16:31:39 +0000553 if (!arch_is_coherent())
554 __dma_free_remap(cpu_addr, size);
Russell King7a9a32a2009-11-19 15:31:07 +0000555
Russell King9eedd962011-01-03 00:00:17 +0000556 __dma_free_buffer(pfn_to_page(dma_to_pfn(dev, handle)), size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558
Russell King65af1912009-11-24 17:53:33 +0000559static void dma_cache_maint_page(struct page *page, unsigned long offset,
Russell Kinga9c91472009-11-26 16:19:58 +0000560 size_t size, enum dma_data_direction dir,
561 void (*op)(const void *, size_t, int))
Russell King65af1912009-11-24 17:53:33 +0000562{
563 /*
564 * A single sg entry may refer to multiple physically contiguous
565 * pages. But we still need to process highmem pages individually.
566 * If highmem is not configured then the bulk of this loop gets
567 * optimized out.
568 */
569 size_t left = size;
570 do {
571 size_t len = left;
Russell King93f1d622009-11-24 14:41:01 +0000572 void *vaddr;
573
574 if (PageHighMem(page)) {
575 if (len + offset > PAGE_SIZE) {
576 if (offset >= PAGE_SIZE) {
577 page += offset / PAGE_SIZE;
578 offset %= PAGE_SIZE;
579 }
580 len = PAGE_SIZE - offset;
Russell King65af1912009-11-24 17:53:33 +0000581 }
Russell King93f1d622009-11-24 14:41:01 +0000582 vaddr = kmap_high_get(page);
583 if (vaddr) {
584 vaddr += offset;
Russell Kinga9c91472009-11-26 16:19:58 +0000585 op(vaddr, len, dir);
Russell King93f1d622009-11-24 14:41:01 +0000586 kunmap_high(page);
Nicolas Pitre7e5a69e2010-03-29 21:46:02 +0100587 } else if (cache_is_vipt()) {
Nicolas Pitre39af22a2010-12-15 15:14:45 -0500588 /* unmapped pages might still be cached */
589 vaddr = kmap_atomic(page);
Nicolas Pitre7e5a69e2010-03-29 21:46:02 +0100590 op(vaddr + offset, len, dir);
Nicolas Pitre39af22a2010-12-15 15:14:45 -0500591 kunmap_atomic(vaddr);
Russell King93f1d622009-11-24 14:41:01 +0000592 }
593 } else {
594 vaddr = page_address(page) + offset;
Russell Kinga9c91472009-11-26 16:19:58 +0000595 op(vaddr, len, dir);
Russell King65af1912009-11-24 17:53:33 +0000596 }
Russell King65af1912009-11-24 17:53:33 +0000597 offset = 0;
598 page++;
599 left -= len;
600 } while (left);
601}
602
Marek Szyprowski51fde3492012-02-10 19:55:20 +0100603/*
604 * Make an area consistent for devices.
605 * Note: Drivers should NOT use this function directly, as it will break
606 * platforms with CONFIG_DMABOUNCE.
607 * Use the driver DMA support - see dma-mapping.h (dma_sync_*)
608 */
609static void __dma_page_cpu_to_dev(struct page *page, unsigned long off,
Russell King65af1912009-11-24 17:53:33 +0000610 size_t size, enum dma_data_direction dir)
611{
Nicolas Pitre43377452009-03-12 22:52:09 -0400612 unsigned long paddr;
Nicolas Pitre43377452009-03-12 22:52:09 -0400613
Russell Kinga9c91472009-11-26 16:19:58 +0000614 dma_cache_maint_page(page, off, size, dir, dmac_map_area);
Nicolas Pitre43377452009-03-12 22:52:09 -0400615
Russell King65af1912009-11-24 17:53:33 +0000616 paddr = page_to_phys(page) + off;
Russell King2ffe2da2009-10-31 16:52:16 +0000617 if (dir == DMA_FROM_DEVICE) {
618 outer_inv_range(paddr, paddr + size);
619 } else {
620 outer_clean_range(paddr, paddr + size);
621 }
622 /* FIXME: non-speculating: flush on bidirectional mappings? */
Nicolas Pitre43377452009-03-12 22:52:09 -0400623}
Russell King4ea0d732009-11-24 16:27:17 +0000624
Marek Szyprowski51fde3492012-02-10 19:55:20 +0100625static void __dma_page_dev_to_cpu(struct page *page, unsigned long off,
Russell King4ea0d732009-11-24 16:27:17 +0000626 size_t size, enum dma_data_direction dir)
627{
Russell King2ffe2da2009-10-31 16:52:16 +0000628 unsigned long paddr = page_to_phys(page) + off;
629
630 /* FIXME: non-speculating: not required */
631 /* don't bother invalidating if DMA to device */
632 if (dir != DMA_TO_DEVICE)
633 outer_inv_range(paddr, paddr + size);
634
Russell Kinga9c91472009-11-26 16:19:58 +0000635 dma_cache_maint_page(page, off, size, dir, dmac_unmap_area);
Catalin Marinasc0177802010-09-13 15:57:36 +0100636
637 /*
638 * Mark the D-cache clean for this page to avoid extra flushing.
639 */
640 if (dir != DMA_TO_DEVICE && off == 0 && size >= PAGE_SIZE)
641 set_bit(PG_dcache_clean, &page->flags);
Russell King4ea0d732009-11-24 16:27:17 +0000642}
Nicolas Pitre43377452009-03-12 22:52:09 -0400643
Russell Kingafd1a322008-09-25 16:30:57 +0100644/**
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100645 * arm_dma_map_sg - map a set of SG buffers for streaming mode DMA
Russell Kingafd1a322008-09-25 16:30:57 +0100646 * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
647 * @sg: list of buffers
648 * @nents: number of buffers to map
649 * @dir: DMA transfer direction
650 *
651 * Map a set of buffers described by scatterlist in streaming mode for DMA.
652 * This is the scatter-gather version of the dma_map_single interface.
653 * Here the scatter gather list elements are each tagged with the
654 * appropriate dma address and length. They are obtained via
655 * sg_dma_{address,length}.
656 *
657 * Device ownership issues as mentioned for dma_map_single are the same
658 * here.
659 */
Marek Szyprowski2dc6a012012-02-10 19:55:20 +0100660int arm_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
661 enum dma_data_direction dir, struct dma_attrs *attrs)
Russell Kingafd1a322008-09-25 16:30:57 +0100662{
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100663 struct dma_map_ops *ops = get_dma_ops(dev);
Russell Kingafd1a322008-09-25 16:30:57 +0100664 struct scatterlist *s;
Russell King01135d922008-09-25 21:05:02 +0100665 int i, j;
Russell Kingafd1a322008-09-25 16:30:57 +0100666
667 for_each_sg(sg, s, nents, i) {
Marek Szyprowski4ce63fc2012-05-16 15:48:21 +0200668#ifdef CONFIG_NEED_SG_DMA_LENGTH
669 s->dma_length = s->length;
670#endif
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100671 s->dma_address = ops->map_page(dev, sg_page(s), s->offset,
672 s->length, dir, attrs);
Russell King01135d922008-09-25 21:05:02 +0100673 if (dma_mapping_error(dev, s->dma_address))
674 goto bad_mapping;
Russell Kingafd1a322008-09-25 16:30:57 +0100675 }
Russell Kingafd1a322008-09-25 16:30:57 +0100676 return nents;
Russell King01135d922008-09-25 21:05:02 +0100677
678 bad_mapping:
679 for_each_sg(sg, s, i, j)
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100680 ops->unmap_page(dev, sg_dma_address(s), sg_dma_len(s), dir, attrs);
Russell King01135d922008-09-25 21:05:02 +0100681 return 0;
Russell Kingafd1a322008-09-25 16:30:57 +0100682}
Russell Kingafd1a322008-09-25 16:30:57 +0100683
684/**
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100685 * arm_dma_unmap_sg - unmap a set of SG buffers mapped by dma_map_sg
Russell Kingafd1a322008-09-25 16:30:57 +0100686 * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
687 * @sg: list of buffers
Linus Walleij0adfca62011-01-12 18:50:37 +0100688 * @nents: number of buffers to unmap (same as was passed to dma_map_sg)
Russell Kingafd1a322008-09-25 16:30:57 +0100689 * @dir: DMA transfer direction (same as was passed to dma_map_sg)
690 *
691 * Unmap a set of streaming mode DMA translations. Again, CPU access
692 * rules concerning calls here are the same as for dma_unmap_single().
693 */
Marek Szyprowski2dc6a012012-02-10 19:55:20 +0100694void arm_dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
695 enum dma_data_direction dir, struct dma_attrs *attrs)
Russell Kingafd1a322008-09-25 16:30:57 +0100696{
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100697 struct dma_map_ops *ops = get_dma_ops(dev);
Russell King01135d922008-09-25 21:05:02 +0100698 struct scatterlist *s;
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100699
Russell King01135d922008-09-25 21:05:02 +0100700 int i;
701
702 for_each_sg(sg, s, nents, i)
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100703 ops->unmap_page(dev, sg_dma_address(s), sg_dma_len(s), dir, attrs);
Russell Kingafd1a322008-09-25 16:30:57 +0100704}
Russell Kingafd1a322008-09-25 16:30:57 +0100705
706/**
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100707 * arm_dma_sync_sg_for_cpu
Russell Kingafd1a322008-09-25 16:30:57 +0100708 * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
709 * @sg: list of buffers
710 * @nents: number of buffers to map (returned from dma_map_sg)
711 * @dir: DMA transfer direction (same as was passed to dma_map_sg)
712 */
Marek Szyprowski2dc6a012012-02-10 19:55:20 +0100713void arm_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,
Russell Kingafd1a322008-09-25 16:30:57 +0100714 int nents, enum dma_data_direction dir)
715{
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100716 struct dma_map_ops *ops = get_dma_ops(dev);
Russell Kingafd1a322008-09-25 16:30:57 +0100717 struct scatterlist *s;
718 int i;
719
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100720 for_each_sg(sg, s, nents, i)
721 ops->sync_single_for_cpu(dev, sg_dma_address(s), s->length,
722 dir);
Russell Kingafd1a322008-09-25 16:30:57 +0100723}
Russell Kingafd1a322008-09-25 16:30:57 +0100724
725/**
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100726 * arm_dma_sync_sg_for_device
Russell Kingafd1a322008-09-25 16:30:57 +0100727 * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
728 * @sg: list of buffers
729 * @nents: number of buffers to map (returned from dma_map_sg)
730 * @dir: DMA transfer direction (same as was passed to dma_map_sg)
731 */
Marek Szyprowski2dc6a012012-02-10 19:55:20 +0100732void arm_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
Russell Kingafd1a322008-09-25 16:30:57 +0100733 int nents, enum dma_data_direction dir)
734{
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100735 struct dma_map_ops *ops = get_dma_ops(dev);
Russell Kingafd1a322008-09-25 16:30:57 +0100736 struct scatterlist *s;
737 int i;
738
Marek Szyprowski2a550e72012-02-10 19:55:20 +0100739 for_each_sg(sg, s, nents, i)
740 ops->sync_single_for_device(dev, sg_dma_address(s), s->length,
741 dir);
Russell Kingafd1a322008-09-25 16:30:57 +0100742}
Russell King24056f52011-01-03 11:29:28 +0000743
Russell King022ae532011-07-08 21:26:59 +0100744/*
745 * Return whether the given device DMA address mask can be supported
746 * properly. For example, if your device can only drive the low 24-bits
747 * during bus mastering, then you would pass 0x00ffffff as the mask
748 * to this function.
749 */
750int dma_supported(struct device *dev, u64 mask)
751{
752 if (mask < (u64)arm_dma_limit)
753 return 0;
754 return 1;
755}
756EXPORT_SYMBOL(dma_supported);
757
Marek Szyprowski2dc6a012012-02-10 19:55:20 +0100758static int arm_dma_set_mask(struct device *dev, u64 dma_mask)
Russell King022ae532011-07-08 21:26:59 +0100759{
760 if (!dev->dma_mask || !dma_supported(dev, dma_mask))
761 return -EIO;
762
Russell King022ae532011-07-08 21:26:59 +0100763 *dev->dma_mask = dma_mask;
Russell King022ae532011-07-08 21:26:59 +0100764
765 return 0;
766}
Russell King022ae532011-07-08 21:26:59 +0100767
Russell King24056f52011-01-03 11:29:28 +0000768#define PREALLOC_DMA_DEBUG_ENTRIES 4096
769
770static int __init dma_debug_do_init(void)
771{
Russell King45cd5292012-01-12 23:08:07 +0000772#ifdef CONFIG_MMU
773 arm_vmregion_create_proc("dma-mappings", &consistent_head);
774#endif
Russell King24056f52011-01-03 11:29:28 +0000775 dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
776 return 0;
777}
778fs_initcall(dma_debug_do_init);
Marek Szyprowski4ce63fc2012-05-16 15:48:21 +0200779
780#ifdef CONFIG_ARM_DMA_USE_IOMMU
781
782/* IOMMU */
783
784static inline dma_addr_t __alloc_iova(struct dma_iommu_mapping *mapping,
785 size_t size)
786{
787 unsigned int order = get_order(size);
788 unsigned int align = 0;
789 unsigned int count, start;
790 unsigned long flags;
791
792 count = ((PAGE_ALIGN(size) >> PAGE_SHIFT) +
793 (1 << mapping->order) - 1) >> mapping->order;
794
795 if (order > mapping->order)
796 align = (1 << (order - mapping->order)) - 1;
797
798 spin_lock_irqsave(&mapping->lock, flags);
799 start = bitmap_find_next_zero_area(mapping->bitmap, mapping->bits, 0,
800 count, align);
801 if (start > mapping->bits) {
802 spin_unlock_irqrestore(&mapping->lock, flags);
803 return DMA_ERROR_CODE;
804 }
805
806 bitmap_set(mapping->bitmap, start, count);
807 spin_unlock_irqrestore(&mapping->lock, flags);
808
809 return mapping->base + (start << (mapping->order + PAGE_SHIFT));
810}
811
812static inline void __free_iova(struct dma_iommu_mapping *mapping,
813 dma_addr_t addr, size_t size)
814{
815 unsigned int start = (addr - mapping->base) >>
816 (mapping->order + PAGE_SHIFT);
817 unsigned int count = ((size >> PAGE_SHIFT) +
818 (1 << mapping->order) - 1) >> mapping->order;
819 unsigned long flags;
820
821 spin_lock_irqsave(&mapping->lock, flags);
822 bitmap_clear(mapping->bitmap, start, count);
823 spin_unlock_irqrestore(&mapping->lock, flags);
824}
825
826static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, gfp_t gfp)
827{
828 struct page **pages;
829 int count = size >> PAGE_SHIFT;
830 int array_size = count * sizeof(struct page *);
831 int i = 0;
832
833 if (array_size <= PAGE_SIZE)
834 pages = kzalloc(array_size, gfp);
835 else
836 pages = vzalloc(array_size);
837 if (!pages)
838 return NULL;
839
840 while (count) {
841 int j, order = __ffs(count);
842
843 pages[i] = alloc_pages(gfp | __GFP_NOWARN, order);
844 while (!pages[i] && order)
845 pages[i] = alloc_pages(gfp | __GFP_NOWARN, --order);
846 if (!pages[i])
847 goto error;
848
849 if (order)
850 split_page(pages[i], order);
851 j = 1 << order;
852 while (--j)
853 pages[i + j] = pages[i] + j;
854
855 __dma_clear_buffer(pages[i], PAGE_SIZE << order);
856 i += 1 << order;
857 count -= 1 << order;
858 }
859
860 return pages;
861error:
862 while (--i)
863 if (pages[i])
864 __free_pages(pages[i], 0);
865 if (array_size < PAGE_SIZE)
866 kfree(pages);
867 else
868 vfree(pages);
869 return NULL;
870}
871
872static int __iommu_free_buffer(struct device *dev, struct page **pages, size_t size)
873{
874 int count = size >> PAGE_SHIFT;
875 int array_size = count * sizeof(struct page *);
876 int i;
877 for (i = 0; i < count; i++)
878 if (pages[i])
879 __free_pages(pages[i], 0);
880 if (array_size < PAGE_SIZE)
881 kfree(pages);
882 else
883 vfree(pages);
884 return 0;
885}
886
887/*
888 * Create a CPU mapping for a specified pages
889 */
890static void *
891__iommu_alloc_remap(struct page **pages, size_t size, gfp_t gfp, pgprot_t prot)
892{
893 struct arm_vmregion *c;
894 size_t align;
895 size_t count = size >> PAGE_SHIFT;
896 int bit;
897
898 if (!consistent_pte[0]) {
899 pr_err("%s: not initialised\n", __func__);
900 dump_stack();
901 return NULL;
902 }
903
904 /*
905 * Align the virtual region allocation - maximum alignment is
906 * a section size, minimum is a page size. This helps reduce
907 * fragmentation of the DMA space, and also prevents allocations
908 * smaller than a section from crossing a section boundary.
909 */
910 bit = fls(size - 1);
911 if (bit > SECTION_SHIFT)
912 bit = SECTION_SHIFT;
913 align = 1 << bit;
914
915 /*
916 * Allocate a virtual address in the consistent mapping region.
917 */
918 c = arm_vmregion_alloc(&consistent_head, align, size,
919 gfp & ~(__GFP_DMA | __GFP_HIGHMEM), NULL);
920 if (c) {
921 pte_t *pte;
922 int idx = CONSISTENT_PTE_INDEX(c->vm_start);
923 int i = 0;
924 u32 off = CONSISTENT_OFFSET(c->vm_start) & (PTRS_PER_PTE-1);
925
926 pte = consistent_pte[idx] + off;
927 c->priv = pages;
928
929 do {
930 BUG_ON(!pte_none(*pte));
931
932 set_pte_ext(pte, mk_pte(pages[i], prot), 0);
933 pte++;
934 off++;
935 i++;
936 if (off >= PTRS_PER_PTE) {
937 off = 0;
938 pte = consistent_pte[++idx];
939 }
940 } while (i < count);
941
942 dsb();
943
944 return (void *)c->vm_start;
945 }
946 return NULL;
947}
948
949/*
950 * Create a mapping in device IO address space for specified pages
951 */
952static dma_addr_t
953__iommu_create_mapping(struct device *dev, struct page **pages, size_t size)
954{
955 struct dma_iommu_mapping *mapping = dev->archdata.mapping;
956 unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT;
957 dma_addr_t dma_addr, iova;
958 int i, ret = DMA_ERROR_CODE;
959
960 dma_addr = __alloc_iova(mapping, size);
961 if (dma_addr == DMA_ERROR_CODE)
962 return dma_addr;
963
964 iova = dma_addr;
965 for (i = 0; i < count; ) {
966 unsigned int next_pfn = page_to_pfn(pages[i]) + 1;
967 phys_addr_t phys = page_to_phys(pages[i]);
968 unsigned int len, j;
969
970 for (j = i + 1; j < count; j++, next_pfn++)
971 if (page_to_pfn(pages[j]) != next_pfn)
972 break;
973
974 len = (j - i) << PAGE_SHIFT;
975 ret = iommu_map(mapping->domain, iova, phys, len, 0);
976 if (ret < 0)
977 goto fail;
978 iova += len;
979 i = j;
980 }
981 return dma_addr;
982fail:
983 iommu_unmap(mapping->domain, dma_addr, iova-dma_addr);
984 __free_iova(mapping, dma_addr, size);
985 return DMA_ERROR_CODE;
986}
987
988static int __iommu_remove_mapping(struct device *dev, dma_addr_t iova, size_t size)
989{
990 struct dma_iommu_mapping *mapping = dev->archdata.mapping;
991
992 /*
993 * add optional in-page offset from iova to size and align
994 * result to page size
995 */
996 size = PAGE_ALIGN((iova & ~PAGE_MASK) + size);
997 iova &= PAGE_MASK;
998
999 iommu_unmap(mapping->domain, iova, size);
1000 __free_iova(mapping, iova, size);
1001 return 0;
1002}
1003
1004static void *arm_iommu_alloc_attrs(struct device *dev, size_t size,
1005 dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs)
1006{
1007 pgprot_t prot = __get_dma_pgprot(attrs, pgprot_kernel);
1008 struct page **pages;
1009 void *addr = NULL;
1010
1011 *handle = DMA_ERROR_CODE;
1012 size = PAGE_ALIGN(size);
1013
1014 pages = __iommu_alloc_buffer(dev, size, gfp);
1015 if (!pages)
1016 return NULL;
1017
1018 *handle = __iommu_create_mapping(dev, pages, size);
1019 if (*handle == DMA_ERROR_CODE)
1020 goto err_buffer;
1021
1022 addr = __iommu_alloc_remap(pages, size, gfp, prot);
1023 if (!addr)
1024 goto err_mapping;
1025
1026 return addr;
1027
1028err_mapping:
1029 __iommu_remove_mapping(dev, *handle, size);
1030err_buffer:
1031 __iommu_free_buffer(dev, pages, size);
1032 return NULL;
1033}
1034
1035static int arm_iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma,
1036 void *cpu_addr, dma_addr_t dma_addr, size_t size,
1037 struct dma_attrs *attrs)
1038{
1039 struct arm_vmregion *c;
1040
1041 vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot);
1042 c = arm_vmregion_find(&consistent_head, (unsigned long)cpu_addr);
1043
1044 if (c) {
1045 struct page **pages = c->priv;
1046
1047 unsigned long uaddr = vma->vm_start;
1048 unsigned long usize = vma->vm_end - vma->vm_start;
1049 int i = 0;
1050
1051 do {
1052 int ret;
1053
1054 ret = vm_insert_page(vma, uaddr, pages[i++]);
1055 if (ret) {
1056 pr_err("Remapping memory, error: %d\n", ret);
1057 return ret;
1058 }
1059
1060 uaddr += PAGE_SIZE;
1061 usize -= PAGE_SIZE;
1062 } while (usize > 0);
1063 }
1064 return 0;
1065}
1066
1067/*
1068 * free a page as defined by the above mapping.
1069 * Must not be called with IRQs disabled.
1070 */
1071void arm_iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr,
1072 dma_addr_t handle, struct dma_attrs *attrs)
1073{
1074 struct arm_vmregion *c;
1075 size = PAGE_ALIGN(size);
1076
1077 c = arm_vmregion_find(&consistent_head, (unsigned long)cpu_addr);
1078 if (c) {
1079 struct page **pages = c->priv;
1080 __dma_free_remap(cpu_addr, size);
1081 __iommu_remove_mapping(dev, handle, size);
1082 __iommu_free_buffer(dev, pages, size);
1083 }
1084}
1085
1086/*
1087 * Map a part of the scatter-gather list into contiguous io address space
1088 */
1089static int __map_sg_chunk(struct device *dev, struct scatterlist *sg,
1090 size_t size, dma_addr_t *handle,
1091 enum dma_data_direction dir)
1092{
1093 struct dma_iommu_mapping *mapping = dev->archdata.mapping;
1094 dma_addr_t iova, iova_base;
1095 int ret = 0;
1096 unsigned int count;
1097 struct scatterlist *s;
1098
1099 size = PAGE_ALIGN(size);
1100 *handle = DMA_ERROR_CODE;
1101
1102 iova_base = iova = __alloc_iova(mapping, size);
1103 if (iova == DMA_ERROR_CODE)
1104 return -ENOMEM;
1105
1106 for (count = 0, s = sg; count < (size >> PAGE_SHIFT); s = sg_next(s)) {
1107 phys_addr_t phys = page_to_phys(sg_page(s));
1108 unsigned int len = PAGE_ALIGN(s->offset + s->length);
1109
1110 if (!arch_is_coherent())
1111 __dma_page_cpu_to_dev(sg_page(s), s->offset, s->length, dir);
1112
1113 ret = iommu_map(mapping->domain, iova, phys, len, 0);
1114 if (ret < 0)
1115 goto fail;
1116 count += len >> PAGE_SHIFT;
1117 iova += len;
1118 }
1119 *handle = iova_base;
1120
1121 return 0;
1122fail:
1123 iommu_unmap(mapping->domain, iova_base, count * PAGE_SIZE);
1124 __free_iova(mapping, iova_base, size);
1125 return ret;
1126}
1127
1128/**
1129 * arm_iommu_map_sg - map a set of SG buffers for streaming mode DMA
1130 * @dev: valid struct device pointer
1131 * @sg: list of buffers
1132 * @nents: number of buffers to map
1133 * @dir: DMA transfer direction
1134 *
1135 * Map a set of buffers described by scatterlist in streaming mode for DMA.
1136 * The scatter gather list elements are merged together (if possible) and
1137 * tagged with the appropriate dma address and length. They are obtained via
1138 * sg_dma_{address,length}.
1139 */
1140int arm_iommu_map_sg(struct device *dev, struct scatterlist *sg, int nents,
1141 enum dma_data_direction dir, struct dma_attrs *attrs)
1142{
1143 struct scatterlist *s = sg, *dma = sg, *start = sg;
1144 int i, count = 0;
1145 unsigned int offset = s->offset;
1146 unsigned int size = s->offset + s->length;
1147 unsigned int max = dma_get_max_seg_size(dev);
1148
1149 for (i = 1; i < nents; i++) {
1150 s = sg_next(s);
1151
1152 s->dma_address = DMA_ERROR_CODE;
1153 s->dma_length = 0;
1154
1155 if (s->offset || (size & ~PAGE_MASK) || size + s->length > max) {
1156 if (__map_sg_chunk(dev, start, size, &dma->dma_address,
1157 dir) < 0)
1158 goto bad_mapping;
1159
1160 dma->dma_address += offset;
1161 dma->dma_length = size - offset;
1162
1163 size = offset = s->offset;
1164 start = s;
1165 dma = sg_next(dma);
1166 count += 1;
1167 }
1168 size += s->length;
1169 }
1170 if (__map_sg_chunk(dev, start, size, &dma->dma_address, dir) < 0)
1171 goto bad_mapping;
1172
1173 dma->dma_address += offset;
1174 dma->dma_length = size - offset;
1175
1176 return count+1;
1177
1178bad_mapping:
1179 for_each_sg(sg, s, count, i)
1180 __iommu_remove_mapping(dev, sg_dma_address(s), sg_dma_len(s));
1181 return 0;
1182}
1183
1184/**
1185 * arm_iommu_unmap_sg - unmap a set of SG buffers mapped by dma_map_sg
1186 * @dev: valid struct device pointer
1187 * @sg: list of buffers
1188 * @nents: number of buffers to unmap (same as was passed to dma_map_sg)
1189 * @dir: DMA transfer direction (same as was passed to dma_map_sg)
1190 *
1191 * Unmap a set of streaming mode DMA translations. Again, CPU access
1192 * rules concerning calls here are the same as for dma_unmap_single().
1193 */
1194void arm_iommu_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
1195 enum dma_data_direction dir, struct dma_attrs *attrs)
1196{
1197 struct scatterlist *s;
1198 int i;
1199
1200 for_each_sg(sg, s, nents, i) {
1201 if (sg_dma_len(s))
1202 __iommu_remove_mapping(dev, sg_dma_address(s),
1203 sg_dma_len(s));
1204 if (!arch_is_coherent())
1205 __dma_page_dev_to_cpu(sg_page(s), s->offset,
1206 s->length, dir);
1207 }
1208}
1209
1210/**
1211 * arm_iommu_sync_sg_for_cpu
1212 * @dev: valid struct device pointer
1213 * @sg: list of buffers
1214 * @nents: number of buffers to map (returned from dma_map_sg)
1215 * @dir: DMA transfer direction (same as was passed to dma_map_sg)
1216 */
1217void arm_iommu_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,
1218 int nents, enum dma_data_direction dir)
1219{
1220 struct scatterlist *s;
1221 int i;
1222
1223 for_each_sg(sg, s, nents, i)
1224 if (!arch_is_coherent())
1225 __dma_page_dev_to_cpu(sg_page(s), s->offset, s->length, dir);
1226
1227}
1228
1229/**
1230 * arm_iommu_sync_sg_for_device
1231 * @dev: valid struct device pointer
1232 * @sg: list of buffers
1233 * @nents: number of buffers to map (returned from dma_map_sg)
1234 * @dir: DMA transfer direction (same as was passed to dma_map_sg)
1235 */
1236void arm_iommu_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
1237 int nents, enum dma_data_direction dir)
1238{
1239 struct scatterlist *s;
1240 int i;
1241
1242 for_each_sg(sg, s, nents, i)
1243 if (!arch_is_coherent())
1244 __dma_page_cpu_to_dev(sg_page(s), s->offset, s->length, dir);
1245}
1246
1247
1248/**
1249 * arm_iommu_map_page
1250 * @dev: valid struct device pointer
1251 * @page: page that buffer resides in
1252 * @offset: offset into page for start of buffer
1253 * @size: size of buffer to map
1254 * @dir: DMA transfer direction
1255 *
1256 * IOMMU aware version of arm_dma_map_page()
1257 */
1258static dma_addr_t arm_iommu_map_page(struct device *dev, struct page *page,
1259 unsigned long offset, size_t size, enum dma_data_direction dir,
1260 struct dma_attrs *attrs)
1261{
1262 struct dma_iommu_mapping *mapping = dev->archdata.mapping;
1263 dma_addr_t dma_addr;
1264 int ret, len = PAGE_ALIGN(size + offset);
1265
1266 if (!arch_is_coherent())
1267 __dma_page_cpu_to_dev(page, offset, size, dir);
1268
1269 dma_addr = __alloc_iova(mapping, len);
1270 if (dma_addr == DMA_ERROR_CODE)
1271 return dma_addr;
1272
1273 ret = iommu_map(mapping->domain, dma_addr, page_to_phys(page), len, 0);
1274 if (ret < 0)
1275 goto fail;
1276
1277 return dma_addr + offset;
1278fail:
1279 __free_iova(mapping, dma_addr, len);
1280 return DMA_ERROR_CODE;
1281}
1282
1283/**
1284 * arm_iommu_unmap_page
1285 * @dev: valid struct device pointer
1286 * @handle: DMA address of buffer
1287 * @size: size of buffer (same as passed to dma_map_page)
1288 * @dir: DMA transfer direction (same as passed to dma_map_page)
1289 *
1290 * IOMMU aware version of arm_dma_unmap_page()
1291 */
1292static void arm_iommu_unmap_page(struct device *dev, dma_addr_t handle,
1293 size_t size, enum dma_data_direction dir,
1294 struct dma_attrs *attrs)
1295{
1296 struct dma_iommu_mapping *mapping = dev->archdata.mapping;
1297 dma_addr_t iova = handle & PAGE_MASK;
1298 struct page *page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova));
1299 int offset = handle & ~PAGE_MASK;
1300 int len = PAGE_ALIGN(size + offset);
1301
1302 if (!iova)
1303 return;
1304
1305 if (!arch_is_coherent())
1306 __dma_page_dev_to_cpu(page, offset, size, dir);
1307
1308 iommu_unmap(mapping->domain, iova, len);
1309 __free_iova(mapping, iova, len);
1310}
1311
1312static void arm_iommu_sync_single_for_cpu(struct device *dev,
1313 dma_addr_t handle, size_t size, enum dma_data_direction dir)
1314{
1315 struct dma_iommu_mapping *mapping = dev->archdata.mapping;
1316 dma_addr_t iova = handle & PAGE_MASK;
1317 struct page *page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova));
1318 unsigned int offset = handle & ~PAGE_MASK;
1319
1320 if (!iova)
1321 return;
1322
1323 if (!arch_is_coherent())
1324 __dma_page_dev_to_cpu(page, offset, size, dir);
1325}
1326
1327static void arm_iommu_sync_single_for_device(struct device *dev,
1328 dma_addr_t handle, size_t size, enum dma_data_direction dir)
1329{
1330 struct dma_iommu_mapping *mapping = dev->archdata.mapping;
1331 dma_addr_t iova = handle & PAGE_MASK;
1332 struct page *page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova));
1333 unsigned int offset = handle & ~PAGE_MASK;
1334
1335 if (!iova)
1336 return;
1337
1338 __dma_page_cpu_to_dev(page, offset, size, dir);
1339}
1340
1341struct dma_map_ops iommu_ops = {
1342 .alloc = arm_iommu_alloc_attrs,
1343 .free = arm_iommu_free_attrs,
1344 .mmap = arm_iommu_mmap_attrs,
1345
1346 .map_page = arm_iommu_map_page,
1347 .unmap_page = arm_iommu_unmap_page,
1348 .sync_single_for_cpu = arm_iommu_sync_single_for_cpu,
1349 .sync_single_for_device = arm_iommu_sync_single_for_device,
1350
1351 .map_sg = arm_iommu_map_sg,
1352 .unmap_sg = arm_iommu_unmap_sg,
1353 .sync_sg_for_cpu = arm_iommu_sync_sg_for_cpu,
1354 .sync_sg_for_device = arm_iommu_sync_sg_for_device,
1355};
1356
1357/**
1358 * arm_iommu_create_mapping
1359 * @bus: pointer to the bus holding the client device (for IOMMU calls)
1360 * @base: start address of the valid IO address space
1361 * @size: size of the valid IO address space
1362 * @order: accuracy of the IO addresses allocations
1363 *
1364 * Creates a mapping structure which holds information about used/unused
1365 * IO address ranges, which is required to perform memory allocation and
1366 * mapping with IOMMU aware functions.
1367 *
1368 * The client device need to be attached to the mapping with
1369 * arm_iommu_attach_device function.
1370 */
1371struct dma_iommu_mapping *
1372arm_iommu_create_mapping(struct bus_type *bus, dma_addr_t base, size_t size,
1373 int order)
1374{
1375 unsigned int count = size >> (PAGE_SHIFT + order);
1376 unsigned int bitmap_size = BITS_TO_LONGS(count) * sizeof(long);
1377 struct dma_iommu_mapping *mapping;
1378 int err = -ENOMEM;
1379
1380 if (!count)
1381 return ERR_PTR(-EINVAL);
1382
1383 mapping = kzalloc(sizeof(struct dma_iommu_mapping), GFP_KERNEL);
1384 if (!mapping)
1385 goto err;
1386
1387 mapping->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
1388 if (!mapping->bitmap)
1389 goto err2;
1390
1391 mapping->base = base;
1392 mapping->bits = BITS_PER_BYTE * bitmap_size;
1393 mapping->order = order;
1394 spin_lock_init(&mapping->lock);
1395
1396 mapping->domain = iommu_domain_alloc(bus);
1397 if (!mapping->domain)
1398 goto err3;
1399
1400 kref_init(&mapping->kref);
1401 return mapping;
1402err3:
1403 kfree(mapping->bitmap);
1404err2:
1405 kfree(mapping);
1406err:
1407 return ERR_PTR(err);
1408}
1409
1410static void release_iommu_mapping(struct kref *kref)
1411{
1412 struct dma_iommu_mapping *mapping =
1413 container_of(kref, struct dma_iommu_mapping, kref);
1414
1415 iommu_domain_free(mapping->domain);
1416 kfree(mapping->bitmap);
1417 kfree(mapping);
1418}
1419
1420void arm_iommu_release_mapping(struct dma_iommu_mapping *mapping)
1421{
1422 if (mapping)
1423 kref_put(&mapping->kref, release_iommu_mapping);
1424}
1425
1426/**
1427 * arm_iommu_attach_device
1428 * @dev: valid struct device pointer
1429 * @mapping: io address space mapping structure (returned from
1430 * arm_iommu_create_mapping)
1431 *
1432 * Attaches specified io address space mapping to the provided device,
1433 * this replaces the dma operations (dma_map_ops pointer) with the
1434 * IOMMU aware version. More than one client might be attached to
1435 * the same io address space mapping.
1436 */
1437int arm_iommu_attach_device(struct device *dev,
1438 struct dma_iommu_mapping *mapping)
1439{
1440 int err;
1441
1442 err = iommu_attach_device(mapping->domain, dev);
1443 if (err)
1444 return err;
1445
1446 kref_get(&mapping->kref);
1447 dev->archdata.mapping = mapping;
1448 set_dma_ops(dev, &iommu_ops);
1449
1450 pr_info("Attached IOMMU controller to %s device.\n", dev_name(dev));
1451 return 0;
1452}
1453
1454#endif