genalloc.h 2.0 KB
Newer Older
J
Jes Sorensen 已提交
1 2 3 4 5 6 7 8 9 10 11
/*
 * Basic general purpose allocator for managing special purpose memory
 * not managed by the regular kmalloc/kfree interface.
 * Uses for this includes on-device special memory, uncached memory
 * etc.
 *
 * This source code is licensed under the GNU General Public License,
 * Version 2.  See the file COPYING for more details.
 */


12 13
#ifndef __GENALLOC_H__
#define __GENALLOC_H__
J
Jes Sorensen 已提交
14
/*
15
 *  General purpose special memory pool descriptor.
J
Jes Sorensen 已提交
16
 */
17 18 19 20
struct gen_pool {
	rwlock_t lock;
	struct list_head chunks;	/* list of chunks in this pool */
	int min_alloc_order;		/* minimum allocation order */
J
Jes Sorensen 已提交
21 22 23
};

/*
24
 *  General purpose special memory pool chunk descriptor.
J
Jes Sorensen 已提交
25
 */
26
struct gen_pool_chunk {
J
Jes Sorensen 已提交
27
	spinlock_t lock;
28
	struct list_head next_chunk;	/* next chunk in pool */
29
	phys_addr_t phys_addr;		/* physical starting address of memory chunk */
30 31 32
	unsigned long start_addr;	/* starting address of memory chunk */
	unsigned long end_addr;		/* ending address of memory chunk */
	unsigned long bits[0];		/* bitmap for allocating memory chunk */
J
Jes Sorensen 已提交
33 34
};

35
extern struct gen_pool *gen_pool_create(int, int);
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
extern phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned long);
extern int gen_pool_add_virt(struct gen_pool *, unsigned long, phys_addr_t,
			     size_t, int);
/**
 * gen_pool_add - add a new chunk of special memory to the pool
 * @pool: pool to add new memory chunk to
 * @addr: starting address of memory chunk to add to pool
 * @size: size in bytes of the memory chunk to add to pool
 * @nid: node id of the node the chunk structure and bitmap should be
 *       allocated on, or -1
 *
 * Add a new chunk of special memory to the specified pool.
 *
 * Returns 0 on success or a -ve errno on failure.
 */
static inline int gen_pool_add(struct gen_pool *pool, unsigned long addr,
			       size_t size, int nid)
{
	return gen_pool_add_virt(pool, addr, -1, size, nid);
}
S
Steve Wise 已提交
56
extern void gen_pool_destroy(struct gen_pool *);
57 58
extern unsigned long gen_pool_alloc(struct gen_pool *, size_t);
extern void gen_pool_free(struct gen_pool *, unsigned long, size_t);
59
#endif /* __GENALLOC_H__ */