| Jes Sorensen | f14f75b | 2005-06-21 17:15:02 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Basic general purpose allocator for managing special purpose memory | 
 | 3 |  * not managed by the regular kmalloc/kfree interface. | 
 | 4 |  * Uses for this includes on-device special memory, uncached memory | 
 | 5 |  * etc. | 
 | 6 |  * | 
| Jes Sorensen | f14f75b | 2005-06-21 17:15:02 -0700 | [diff] [blame] | 7 |  * This source code is licensed under the GNU General Public License, | 
 | 8 |  * Version 2.  See the file COPYING for more details. | 
 | 9 |  */ | 
 | 10 |  | 
| Jes Sorensen | f14f75b | 2005-06-21 17:15:02 -0700 | [diff] [blame] | 11 |  | 
 | 12 | /* | 
| Dean Nelson | 929f972 | 2006-06-23 02:03:21 -0700 | [diff] [blame] | 13 |  *  General purpose special memory pool descriptor. | 
| Jes Sorensen | f14f75b | 2005-06-21 17:15:02 -0700 | [diff] [blame] | 14 |  */ | 
 | 15 | struct gen_pool { | 
| Dean Nelson | 929f972 | 2006-06-23 02:03:21 -0700 | [diff] [blame] | 16 | 	rwlock_t lock; | 
 | 17 | 	struct list_head chunks;	/* list of chunks in this pool */ | 
 | 18 | 	int min_alloc_order;		/* minimum allocation order */ | 
| Jes Sorensen | f14f75b | 2005-06-21 17:15:02 -0700 | [diff] [blame] | 19 | }; | 
 | 20 |  | 
| Dean Nelson | 929f972 | 2006-06-23 02:03:21 -0700 | [diff] [blame] | 21 | /* | 
 | 22 |  *  General purpose special memory pool chunk descriptor. | 
 | 23 |  */ | 
 | 24 | struct gen_pool_chunk { | 
 | 25 | 	spinlock_t lock; | 
 | 26 | 	struct list_head next_chunk;	/* next chunk in pool */ | 
 | 27 | 	unsigned long start_addr;	/* starting address of memory chunk */ | 
 | 28 | 	unsigned long end_addr;		/* ending address of memory chunk */ | 
 | 29 | 	unsigned long bits[0];		/* bitmap for allocating memory chunk */ | 
 | 30 | }; | 
 | 31 |  | 
 | 32 | extern struct gen_pool *gen_pool_create(int, int); | 
 | 33 | extern int gen_pool_add(struct gen_pool *, unsigned long, size_t, int); | 
 | 34 | extern unsigned long gen_pool_alloc(struct gen_pool *, size_t); | 
 | 35 | extern void gen_pool_free(struct gen_pool *, unsigned long, size_t); |