]> git.karo-electronics.de Git - karo-tx-linux.git/blob - mm/dmapool.c
98798f414cb93c175fc77a855db03bf5374ad4c4
[karo-tx-linux.git] / mm / dmapool.c
1 /*
2  * DMA Pool allocator
3  *
4  * Copyright 2001 David Brownell
5  * Copyright 2007 Intel Corporation
6  *   Author: Matthew Wilcox <willy@linux.intel.com>
7  *
8  * This software may be redistributed and/or modified under the terms of
9  * the GNU General Public License ("GPL") version 2 as published by the
10  * Free Software Foundation.
11  *
12  * This allocator returns small blocks of a given size which are DMA-able by
13  * the given device.  It uses the dma_alloc_coherent page allocator to get
14  * new pages, then splits them up into blocks of the required size.
15  * Many older drivers still have their own code to do this.
16  *
17  * The current design of this allocator is fairly simple.  The pool is
18  * represented by the 'struct dma_pool' which keeps a doubly-linked list of
19  * allocated pages.  Each page in the page_list is split into blocks of at
20  * least 'size' bytes.  Free blocks are tracked in an unsorted singly-linked
21  * list of free blocks within the page.  Used blocks aren't tracked, but we
22  * keep a count of how many are currently allocated from each page.
23  */
24
25 #include <linux/device.h>
26 #include <linux/dma-mapping.h>
27 #include <linux/dmapool.h>
28 #include <linux/kernel.h>
29 #include <linux/list.h>
30 #include <linux/module.h>
31 #include <linux/mutex.h>
32 #include <linux/poison.h>
33 #include <linux/sched.h>
34 #include <linux/slab.h>
35 #include <linux/spinlock.h>
36 #include <linux/string.h>
37 #include <linux/types.h>
38 #include <linux/wait.h>
39
40 #if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB_DEBUG_ON)
41 #define DMAPOOL_DEBUG 1
42 #endif
43
44 struct dma_pool {               /* the pool */
45         struct list_head page_list;
46         spinlock_t lock;
47         size_t size;
48         struct device *dev;
49         size_t allocation;
50         size_t boundary;
51         char name[32];
52         wait_queue_head_t waitq;
53         struct list_head pools;
54 };
55
56 struct dma_page {               /* cacheable header for 'allocation' bytes */
57         struct list_head page_list;
58         void *vaddr;
59         dma_addr_t dma;
60         unsigned int in_use;
61         unsigned int offset;
62 };
63
64 #define POOL_TIMEOUT_JIFFIES    ((100 /* msec */ * HZ) / 1000)
65
66 static DEFINE_MUTEX(pools_lock);
67
68 static ssize_t
69 show_pools(struct device *dev, struct device_attribute *attr, char *buf)
70 {
71         unsigned temp;
72         unsigned size;
73         char *next;
74         struct dma_page *page;
75         struct dma_pool *pool;
76
77         next = buf;
78         size = PAGE_SIZE;
79
80         temp = scnprintf(next, size, "poolinfo - 0.1\n");
81         size -= temp;
82         next += temp;
83
84         mutex_lock(&pools_lock);
85         list_for_each_entry(pool, &dev->dma_pools, pools) {
86                 unsigned pages = 0;
87                 unsigned blocks = 0;
88
89                 spin_lock_irq(&pool->lock);
90                 list_for_each_entry(page, &pool->page_list, page_list) {
91                         pages++;
92                         blocks += page->in_use;
93                 }
94                 spin_unlock_irq(&pool->lock);
95
96                 /* per-pool info, no real statistics yet */
97                 temp = scnprintf(next, size, "%-16s %4u %4Zu %4Zu %2u\n",
98                                  pool->name, blocks,
99                                  pages * (pool->allocation / pool->size),
100                                  pool->size, pages);
101                 size -= temp;
102                 next += temp;
103         }
104         mutex_unlock(&pools_lock);
105
106         return PAGE_SIZE - size;
107 }
108
109 static DEVICE_ATTR(pools, S_IRUGO, show_pools, NULL);
110
111 /**
112  * dma_pool_create - Creates a pool of consistent memory blocks, for dma.
113  * @name: name of pool, for diagnostics
114  * @dev: device that will be doing the DMA
115  * @size: size of the blocks in this pool.
116  * @align: alignment requirement for blocks; must be a power of two
117  * @boundary: returned blocks won't cross this power of two boundary
118  * Context: !in_interrupt()
119  *
120  * Returns a dma allocation pool with the requested characteristics, or
121  * null if one can't be created.  Given one of these pools, dma_pool_alloc()
122  * may be used to allocate memory.  Such memory will all have "consistent"
123  * DMA mappings, accessible by the device and its driver without using
124  * cache flushing primitives.  The actual size of blocks allocated may be
125  * larger than requested because of alignment.
126  *
127  * If @boundary is nonzero, objects returned from dma_pool_alloc() won't
128  * cross that size boundary.  This is useful for devices which have
129  * addressing restrictions on individual DMA transfers, such as not crossing
130  * boundaries of 4KBytes.
131  */
132 struct dma_pool *dma_pool_create(const char *name, struct device *dev,
133                                  size_t size, size_t align, size_t boundary)
134 {
135         struct dma_pool *retval;
136         size_t allocation;
137
138         if (align == 0) {
139                 align = 1;
140         } else if (align & (align - 1)) {
141                 return NULL;
142         }
143
144         if (size == 0) {
145                 return NULL;
146         } else if (size < 4) {
147                 size = 4;
148         }
149
150         if ((size % align) != 0)
151                 size = ALIGN(size, align);
152
153         allocation = max_t(size_t, size, PAGE_SIZE);
154
155         if (!boundary) {
156                 boundary = allocation;
157         } else if ((boundary < size) || (boundary & (boundary - 1))) {
158                 return NULL;
159         }
160
161         retval = kmalloc_node(sizeof(*retval), GFP_KERNEL, dev_to_node(dev));
162         if (!retval)
163                 return retval;
164
165         strlcpy(retval->name, name, sizeof(retval->name));
166
167         retval->dev = dev;
168
169         INIT_LIST_HEAD(&retval->page_list);
170         spin_lock_init(&retval->lock);
171         retval->size = size;
172         retval->boundary = boundary;
173         retval->allocation = allocation;
174         init_waitqueue_head(&retval->waitq);
175
176         if (dev) {
177                 int ret;
178
179                 mutex_lock(&pools_lock);
180                 if (list_empty(&dev->dma_pools))
181                         ret = device_create_file(dev, &dev_attr_pools);
182                 else
183                         ret = 0;
184                 /* note:  not currently insisting "name" be unique */
185                 if (!ret)
186                         list_add(&retval->pools, &dev->dma_pools);
187                 else {
188                         kfree(retval);
189                         retval = NULL;
190                 }
191                 mutex_unlock(&pools_lock);
192         } else
193                 INIT_LIST_HEAD(&retval->pools);
194
195         return retval;
196 }
197 EXPORT_SYMBOL(dma_pool_create);
198
199 static void pool_initialise_page(struct dma_pool *pool, struct dma_page *page)
200 {
201         unsigned int offset = 0;
202         unsigned int next_boundary = pool->boundary;
203
204         do {
205                 unsigned int next = offset + pool->size;
206                 if (unlikely((next + pool->size) >= next_boundary)) {
207                         next = next_boundary;
208                         next_boundary += pool->boundary;
209                 }
210                 *(int *)(page->vaddr + offset) = next;
211                 offset = next;
212         } while (offset < pool->allocation);
213 }
214
215 #ifdef CONFIG_FSL_UTP
216 static struct dma_page *pool_alloc_page_nonbufferable(struct dma_pool *pool, gfp_t mem_flags)
217 {
218         struct dma_page *page;
219
220         page = kmalloc(sizeof(*page), mem_flags);
221         if (!page)
222                 return NULL;
223         page->vaddr = dma_alloc_noncacheable(pool->dev, pool->allocation,
224                                          &page->dma, mem_flags);
225         if (page->vaddr) {
226 #ifdef  DMAPOOL_DEBUG
227                 memset(page->vaddr, POOL_POISON_FREED, pool->allocation);
228 #endif
229                 pool_initialise_page(pool, page);
230                 list_add(&page->page_list, &pool->page_list);
231                 page->in_use = 0;
232                 page->offset = 0;
233         } else {
234                 kfree(page);
235                 page = NULL;
236         }
237         return page;
238 }
239 #endif
240
241 static struct dma_page *pool_alloc_page(struct dma_pool *pool, gfp_t mem_flags)
242 {
243         struct dma_page *page;
244
245         page = kmalloc(sizeof(*page), mem_flags);
246         if (!page)
247                 return NULL;
248         page->vaddr = dma_alloc_coherent(pool->dev, pool->allocation,
249                                          &page->dma, mem_flags);
250         if (page->vaddr) {
251 #ifdef  DMAPOOL_DEBUG
252                 memset(page->vaddr, POOL_POISON_FREED, pool->allocation);
253 #endif
254                 pool_initialise_page(pool, page);
255                 list_add(&page->page_list, &pool->page_list);
256                 page->in_use = 0;
257                 page->offset = 0;
258         } else {
259                 kfree(page);
260                 page = NULL;
261         }
262         return page;
263 }
264
265 static inline int is_page_busy(struct dma_page *page)
266 {
267         return page->in_use != 0;
268 }
269
270 static void pool_free_page(struct dma_pool *pool, struct dma_page *page)
271 {
272         dma_addr_t dma = page->dma;
273
274 #ifdef  DMAPOOL_DEBUG
275         memset(page->vaddr, POOL_POISON_FREED, pool->allocation);
276 #endif
277         dma_free_coherent(pool->dev, pool->allocation, page->vaddr, dma);
278         list_del(&page->page_list);
279         kfree(page);
280 }
281
282 /**
283  * dma_pool_destroy - destroys a pool of dma memory blocks.
284  * @pool: dma pool that will be destroyed
285  * Context: !in_interrupt()
286  *
287  * Caller guarantees that no more memory from the pool is in use,
288  * and that nothing will try to use the pool after this call.
289  */
290 void dma_pool_destroy(struct dma_pool *pool)
291 {
292         mutex_lock(&pools_lock);
293         list_del(&pool->pools);
294         if (pool->dev && list_empty(&pool->dev->dma_pools))
295                 device_remove_file(pool->dev, &dev_attr_pools);
296         mutex_unlock(&pools_lock);
297
298         while (!list_empty(&pool->page_list)) {
299                 struct dma_page *page;
300                 page = list_entry(pool->page_list.next,
301                                   struct dma_page, page_list);
302                 if (is_page_busy(page)) {
303                         if (pool->dev)
304                                 dev_err(pool->dev,
305                                         "dma_pool_destroy %s, %p busy\n",
306                                         pool->name, page->vaddr);
307                         else
308                                 printk(KERN_ERR
309                                        "dma_pool_destroy %s, %p busy\n",
310                                        pool->name, page->vaddr);
311                         /* leak the still-in-use consistent memory */
312                         list_del(&page->page_list);
313                         kfree(page);
314                 } else
315                         pool_free_page(pool, page);
316         }
317
318         kfree(pool);
319 }
320 EXPORT_SYMBOL(dma_pool_destroy);
321
322 /**
323  * dma_pool_alloc - get a block of consistent memory
324  * @pool: dma pool that will produce the block
325  * @mem_flags: GFP_* bitmask
326  * @handle: pointer to dma address of block
327  *
328  * This returns the kernel virtual address of a currently unused block,
329  * and reports its dma address through the handle.
330  * If such a memory block can't be allocated, %NULL is returned.
331  */
332 void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
333                      dma_addr_t *handle)
334 {
335         unsigned long flags;
336         struct dma_page *page;
337         size_t offset;
338         void *retval;
339
340         might_sleep_if(mem_flags & __GFP_WAIT);
341
342         spin_lock_irqsave(&pool->lock, flags);
343  restart:
344         list_for_each_entry(page, &pool->page_list, page_list) {
345                 if (page->offset < pool->allocation)
346                         goto ready;
347         }
348         page = pool_alloc_page(pool, GFP_ATOMIC);
349         if (!page) {
350                 if (mem_flags & __GFP_WAIT) {
351                         DECLARE_WAITQUEUE(wait, current);
352
353                         __set_current_state(TASK_UNINTERRUPTIBLE);
354                         __add_wait_queue(&pool->waitq, &wait);
355                         spin_unlock_irqrestore(&pool->lock, flags);
356
357                         schedule_timeout(POOL_TIMEOUT_JIFFIES);
358
359                         spin_lock_irqsave(&pool->lock, flags);
360                         __remove_wait_queue(&pool->waitq, &wait);
361                         goto restart;
362                 }
363                 retval = NULL;
364                 goto done;
365         }
366
367  ready:
368         page->in_use++;
369         offset = page->offset;
370         page->offset = *(int *)(page->vaddr + offset);
371         retval = offset + page->vaddr;
372         *handle = offset + page->dma;
373 #ifdef  DMAPOOL_DEBUG
374         memset(retval, POOL_POISON_ALLOCATED, pool->size);
375 #endif
376  done:
377         spin_unlock_irqrestore(&pool->lock, flags);
378         return retval;
379 }
380 EXPORT_SYMBOL(dma_pool_alloc);
381
382 #ifdef CONFIG_FSL_UTP
383 /**
384  * dma_pool_alloc_nonbufferable - get a block of consistent memory
385  * @pool: dma pool that will produce the block
386  * @mem_flags: GFP_* bitmask
387  * @handle: pointer to dma address of block
388  *
389  * This returns the kernel virtual address of a currently unused block,
390  * and reports its dma address through the handle.
391  * If such a memory block can't be allocated, %NULL is returned.
392  */
393 void *dma_pool_alloc_nonbufferable(struct dma_pool *pool, gfp_t mem_flags,
394                      dma_addr_t *handle)
395 {
396         unsigned long flags;
397         struct dma_page *page;
398         size_t offset;
399         void *retval;
400
401         might_sleep_if(mem_flags & __GFP_WAIT);
402
403         spin_lock_irqsave(&pool->lock, flags);
404  restart:
405         list_for_each_entry(page, &pool->page_list, page_list) {
406                 if (page->offset < pool->allocation)
407                         goto ready;
408         }
409         page = pool_alloc_page_nonbufferable(pool, GFP_ATOMIC);
410         if (!page) {
411                 if (mem_flags & __GFP_WAIT) {
412                         DECLARE_WAITQUEUE(wait, current);
413
414                         __set_current_state(TASK_UNINTERRUPTIBLE);
415                         __add_wait_queue(&pool->waitq, &wait);
416                         spin_unlock_irqrestore(&pool->lock, flags);
417
418                         schedule_timeout(POOL_TIMEOUT_JIFFIES);
419
420                         spin_lock_irqsave(&pool->lock, flags);
421                         __remove_wait_queue(&pool->waitq, &wait);
422                         goto restart;
423                 }
424                 retval = NULL;
425                 goto done;
426         }
427
428  ready:
429         page->in_use++;
430         offset = page->offset;
431         page->offset = *(int *)(page->vaddr + offset);
432         retval = offset + page->vaddr;
433         *handle = offset + page->dma;
434 #ifdef  DMAPOOL_DEBUG
435         memset(retval, POOL_POISON_ALLOCATED, pool->size);
436 #endif
437  done:
438         spin_unlock_irqrestore(&pool->lock, flags);
439         return retval;
440 }
441 EXPORT_SYMBOL(dma_pool_alloc_nonbufferable);
442 #endif
443
444 static struct dma_page *pool_find_page(struct dma_pool *pool, dma_addr_t dma)
445 {
446         struct dma_page *page;
447
448         list_for_each_entry(page, &pool->page_list, page_list) {
449                 if (dma < page->dma)
450                         continue;
451                 if (dma < (page->dma + pool->allocation))
452                         return page;
453         }
454         return NULL;
455 }
456
457 /**
458  * dma_pool_free - put block back into dma pool
459  * @pool: the dma pool holding the block
460  * @vaddr: virtual address of block
461  * @dma: dma address of block
462  *
463  * Caller promises neither device nor driver will again touch this block
464  * unless it is first re-allocated.
465  */
466 void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma)
467 {
468         struct dma_page *page;
469         unsigned long flags;
470         unsigned int offset;
471
472         spin_lock_irqsave(&pool->lock, flags);
473         page = pool_find_page(pool, dma);
474         if (!page) {
475                 spin_unlock_irqrestore(&pool->lock, flags);
476                 if (pool->dev)
477                         dev_err(pool->dev,
478                                 "dma_pool_free %s, %p/%lx (bad dma)\n",
479                                 pool->name, vaddr, (unsigned long)dma);
480                 else
481                         printk(KERN_ERR "dma_pool_free %s, %p/%lx (bad dma)\n",
482                                pool->name, vaddr, (unsigned long)dma);
483                 return;
484         }
485
486         offset = vaddr - page->vaddr;
487 #ifdef  DMAPOOL_DEBUG
488         if ((dma - page->dma) != offset) {
489                 spin_unlock_irqrestore(&pool->lock, flags);
490                 if (pool->dev)
491                         dev_err(pool->dev,
492                                 "dma_pool_free %s, %p (bad vaddr)/%Lx\n",
493                                 pool->name, vaddr, (unsigned long long)dma);
494                 else
495                         printk(KERN_ERR
496                                "dma_pool_free %s, %p (bad vaddr)/%Lx\n",
497                                pool->name, vaddr, (unsigned long long)dma);
498                 return;
499         }
500         {
501                 unsigned int chain = page->offset;
502                 while (chain < pool->allocation) {
503                         if (chain != offset) {
504                                 chain = *(int *)(page->vaddr + chain);
505                                 continue;
506                         }
507                         spin_unlock_irqrestore(&pool->lock, flags);
508                         if (pool->dev)
509                                 dev_err(pool->dev, "dma_pool_free %s, dma %Lx "
510                                         "already free\n", pool->name,
511                                         (unsigned long long)dma);
512                         else
513                                 printk(KERN_ERR "dma_pool_free %s, dma %Lx "
514                                         "already free\n", pool->name,
515                                         (unsigned long long)dma);
516                         return;
517                 }
518         }
519         memset(vaddr, POOL_POISON_FREED, pool->size);
520 #endif
521
522         page->in_use--;
523         *(int *)vaddr = page->offset;
524         page->offset = offset;
525         if (waitqueue_active(&pool->waitq))
526                 wake_up_locked(&pool->waitq);
527         /*
528          * Resist a temptation to do
529          *    if (!is_page_busy(page)) pool_free_page(pool, page);
530          * Better have a few empty pages hang around.
531          */
532         spin_unlock_irqrestore(&pool->lock, flags);
533 }
534 EXPORT_SYMBOL(dma_pool_free);
535
536 /*
537  * Managed DMA pool
538  */
539 static void dmam_pool_release(struct device *dev, void *res)
540 {
541         struct dma_pool *pool = *(struct dma_pool **)res;
542
543         dma_pool_destroy(pool);
544 }
545
546 static int dmam_pool_match(struct device *dev, void *res, void *match_data)
547 {
548         return *(struct dma_pool **)res == match_data;
549 }
550
551 /**
552  * dmam_pool_create - Managed dma_pool_create()
553  * @name: name of pool, for diagnostics
554  * @dev: device that will be doing the DMA
555  * @size: size of the blocks in this pool.
556  * @align: alignment requirement for blocks; must be a power of two
557  * @allocation: returned blocks won't cross this boundary (or zero)
558  *
559  * Managed dma_pool_create().  DMA pool created with this function is
560  * automatically destroyed on driver detach.
561  */
562 struct dma_pool *dmam_pool_create(const char *name, struct device *dev,
563                                   size_t size, size_t align, size_t allocation)
564 {
565         struct dma_pool **ptr, *pool;
566
567         ptr = devres_alloc(dmam_pool_release, sizeof(*ptr), GFP_KERNEL);
568         if (!ptr)
569                 return NULL;
570
571         pool = *ptr = dma_pool_create(name, dev, size, align, allocation);
572         if (pool)
573                 devres_add(dev, ptr);
574         else
575                 devres_free(ptr);
576
577         return pool;
578 }
579 EXPORT_SYMBOL(dmam_pool_create);
580
581 /**
582  * dmam_pool_destroy - Managed dma_pool_destroy()
583  * @pool: dma pool that will be destroyed
584  *
585  * Managed dma_pool_destroy().
586  */
587 void dmam_pool_destroy(struct dma_pool *pool)
588 {
589         struct device *dev = pool->dev;
590
591         dma_pool_destroy(pool);
592         WARN_ON(devres_destroy(dev, dmam_pool_release, dmam_pool_match, pool));
593 }
594 EXPORT_SYMBOL(dmam_pool_destroy);