1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30#ifndef __GENALLOC_H__
31#define __GENALLOC_H__
32
33#include <linux/spinlock_types.h>
34
35struct device;
36struct device_node;
37
38
39
40
41
42
43
44
45
46typedef unsigned long (*genpool_algo_t)(unsigned long *map,
47 unsigned long size,
48 unsigned long start,
49 unsigned int nr,
50 void *data);
51
52
53
54
55struct gen_pool {
56 spinlock_t lock;
57 struct list_head chunks;
58 int min_alloc_order;
59
60 genpool_algo_t algo;
61 void *data;
62};
63
64
65
66
67struct gen_pool_chunk {
68 struct list_head next_chunk;
69 atomic_t avail;
70 phys_addr_t phys_addr;
71 unsigned long start_addr;
72 unsigned long end_addr;
73 unsigned long bits[0];
74};
75
76extern struct gen_pool *gen_pool_create(int, int);
77extern phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned long);
78extern int gen_pool_add_virt(struct gen_pool *, unsigned long, phys_addr_t,
79 size_t, int);
80
81
82
83
84
85
86
87
88
89
90
91
92static inline int gen_pool_add(struct gen_pool *pool, unsigned long addr,
93 size_t size, int nid)
94{
95 return gen_pool_add_virt(pool, addr, -1, size, nid);
96}
97extern void gen_pool_destroy(struct gen_pool *);
98extern unsigned long gen_pool_alloc(struct gen_pool *, size_t);
99extern void *gen_pool_dma_alloc(struct gen_pool *pool, size_t size,
100 dma_addr_t *dma);
101extern void gen_pool_free(struct gen_pool *, unsigned long, size_t);
102extern void gen_pool_for_each_chunk(struct gen_pool *,
103 void (*)(struct gen_pool *, struct gen_pool_chunk *, void *), void *);
104extern size_t gen_pool_avail(struct gen_pool *);
105extern size_t gen_pool_size(struct gen_pool *);
106
107extern void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo,
108 void *data);
109
110extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
111 unsigned long start, unsigned int nr, void *data);
112
113extern unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
114 unsigned long start, unsigned int nr, void *data);
115
116extern struct gen_pool *devm_gen_pool_create(struct device *dev,
117 int min_alloc_order, int nid);
118extern struct gen_pool *dev_get_gen_pool(struct device *dev);
119
120#ifdef CONFIG_OF
121extern struct gen_pool *of_get_named_gen_pool(struct device_node *np,
122 const char *propname, int index);
123#else
124static inline struct gen_pool *of_get_named_gen_pool(struct device_node *np,
125 const char *propname, int index)
126{
127 return NULL;
128}
129#endif
130#endif
131