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/types.h>
34#include <linux/spinlock_types.h>
35#include <linux/atomic.h>
36
37struct device;
38struct device_node;
39struct gen_pool;
40
41
42
43
44
45
46
47
48
49
50typedef unsigned long (*genpool_algo_t)(unsigned long *map,
51 unsigned long size,
52 unsigned long start,
53 unsigned int nr,
54 void *data, struct gen_pool *pool,
55 unsigned long start_addr);
56
57
58
59
60struct gen_pool {
61 spinlock_t lock;
62 struct list_head chunks;
63 int min_alloc_order;
64
65 genpool_algo_t algo;
66 void *data;
67
68 const char *name;
69};
70
71
72
73
74struct gen_pool_chunk {
75 struct list_head next_chunk;
76 atomic_long_t avail;
77 phys_addr_t phys_addr;
78 void *owner;
79 unsigned long start_addr;
80 unsigned long end_addr;
81 unsigned long bits[0];
82};
83
84
85
86
87struct genpool_data_align {
88 int align;
89};
90
91
92
93
94struct genpool_data_fixed {
95 unsigned long offset;
96};
97
98extern struct gen_pool *gen_pool_create(int, int);
99extern phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned long);
100extern int gen_pool_add_owner(struct gen_pool *, unsigned long, phys_addr_t,
101 size_t, int, void *);
102
103static inline int gen_pool_add_virt(struct gen_pool *pool, unsigned long addr,
104 phys_addr_t phys, size_t size, int nid)
105{
106 return gen_pool_add_owner(pool, addr, phys, size, nid, NULL);
107}
108
109
110
111
112
113
114
115
116
117
118
119
120
121static inline int gen_pool_add(struct gen_pool *pool, unsigned long addr,
122 size_t size, int nid)
123{
124 return gen_pool_add_virt(pool, addr, -1, size, nid);
125}
126extern void gen_pool_destroy(struct gen_pool *);
127unsigned long gen_pool_alloc_algo_owner(struct gen_pool *pool, size_t size,
128 genpool_algo_t algo, void *data, void **owner);
129
130static inline unsigned long gen_pool_alloc_owner(struct gen_pool *pool,
131 size_t size, void **owner)
132{
133 return gen_pool_alloc_algo_owner(pool, size, pool->algo, pool->data,
134 owner);
135}
136
137static inline unsigned long gen_pool_alloc_algo(struct gen_pool *pool,
138 size_t size, genpool_algo_t algo, void *data)
139{
140 return gen_pool_alloc_algo_owner(pool, size, algo, data, NULL);
141}
142
143
144
145
146
147
148
149
150
151
152
153static inline unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size)
154{
155 return gen_pool_alloc_algo(pool, size, pool->algo, pool->data);
156}
157
158extern void *gen_pool_dma_alloc(struct gen_pool *pool, size_t size,
159 dma_addr_t *dma);
160extern void *gen_pool_dma_alloc_algo(struct gen_pool *pool, size_t size,
161 dma_addr_t *dma, genpool_algo_t algo, void *data);
162extern void *gen_pool_dma_alloc_align(struct gen_pool *pool, size_t size,
163 dma_addr_t *dma, int align);
164extern void *gen_pool_dma_zalloc(struct gen_pool *pool, size_t size, dma_addr_t *dma);
165extern void *gen_pool_dma_zalloc_algo(struct gen_pool *pool, size_t size,
166 dma_addr_t *dma, genpool_algo_t algo, void *data);
167extern void *gen_pool_dma_zalloc_align(struct gen_pool *pool, size_t size,
168 dma_addr_t *dma, int align);
169extern void gen_pool_free_owner(struct gen_pool *pool, unsigned long addr,
170 size_t size, void **owner);
171static inline void gen_pool_free(struct gen_pool *pool, unsigned long addr,
172 size_t size)
173{
174 gen_pool_free_owner(pool, addr, size, NULL);
175}
176
177extern void gen_pool_for_each_chunk(struct gen_pool *,
178 void (*)(struct gen_pool *, struct gen_pool_chunk *, void *), void *);
179extern size_t gen_pool_avail(struct gen_pool *);
180extern size_t gen_pool_size(struct gen_pool *);
181
182extern void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo,
183 void *data);
184
185extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
186 unsigned long start, unsigned int nr, void *data,
187 struct gen_pool *pool, unsigned long start_addr);
188
189extern unsigned long gen_pool_fixed_alloc(unsigned long *map,
190 unsigned long size, unsigned long start, unsigned int nr,
191 void *data, struct gen_pool *pool, unsigned long start_addr);
192
193extern unsigned long gen_pool_first_fit_align(unsigned long *map,
194 unsigned long size, unsigned long start, unsigned int nr,
195 void *data, struct gen_pool *pool, unsigned long start_addr);
196
197
198extern unsigned long gen_pool_first_fit_order_align(unsigned long *map,
199 unsigned long size, unsigned long start, unsigned int nr,
200 void *data, struct gen_pool *pool, unsigned long start_addr);
201
202extern unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
203 unsigned long start, unsigned int nr, void *data,
204 struct gen_pool *pool, unsigned long start_addr);
205
206
207extern struct gen_pool *devm_gen_pool_create(struct device *dev,
208 int min_alloc_order, int nid, const char *name);
209extern struct gen_pool *gen_pool_get(struct device *dev, const char *name);
210
211extern bool gen_pool_has_addr(struct gen_pool *pool, unsigned long start,
212 size_t size);
213
214#ifdef CONFIG_OF
215extern struct gen_pool *of_gen_pool_get(struct device_node *np,
216 const char *propname, int index);
217#else
218static inline struct gen_pool *of_gen_pool_get(struct device_node *np,
219 const char *propname, int index)
220{
221 return NULL;
222}
223#endif
224#endif
225