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
36struct device;
37struct device_node;
38struct gen_pool;
39
40
41
42
43
44
45
46
47
48typedef unsigned long (*genpool_algo_t)(unsigned long *map,
49 unsigned long size,
50 unsigned long start,
51 unsigned int nr,
52 void *data, struct gen_pool *pool);
53
54
55
56
57struct gen_pool {
58 spinlock_t lock;
59 struct list_head chunks;
60 int min_alloc_order;
61
62 genpool_algo_t algo;
63 void *data;
64
65 const char *name;
66};
67
68
69
70
71struct gen_pool_chunk {
72 struct list_head next_chunk;
73 atomic_t avail;
74 phys_addr_t phys_addr;
75 unsigned long start_addr;
76 unsigned long end_addr;
77 unsigned long bits[0];
78};
79
80
81
82
83struct genpool_data_align {
84 int align;
85};
86
87
88
89
90struct genpool_data_fixed {
91 unsigned long offset;
92};
93
94extern struct gen_pool *gen_pool_create(int, int);
95extern phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned long);
96extern int gen_pool_add_virt(struct gen_pool *, unsigned long, phys_addr_t,
97 size_t, int);
98
99
100
101
102
103
104
105
106
107
108
109
110static inline int gen_pool_add(struct gen_pool *pool, unsigned long addr,
111 size_t size, int nid)
112{
113 return gen_pool_add_virt(pool, addr, -1, size, nid);
114}
115extern void gen_pool_destroy(struct gen_pool *);
116extern unsigned long gen_pool_alloc(struct gen_pool *, size_t);
117extern unsigned long gen_pool_alloc_algo(struct gen_pool *, size_t,
118 genpool_algo_t algo, void *data);
119extern void *gen_pool_dma_alloc(struct gen_pool *pool, size_t size,
120 dma_addr_t *dma);
121extern void gen_pool_free(struct gen_pool *, unsigned long, size_t);
122extern void gen_pool_for_each_chunk(struct gen_pool *,
123 void (*)(struct gen_pool *, struct gen_pool_chunk *, void *), void *);
124extern size_t gen_pool_avail(struct gen_pool *);
125extern size_t gen_pool_size(struct gen_pool *);
126
127extern void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo,
128 void *data);
129
130extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
131 unsigned long start, unsigned int nr, void *data,
132 struct gen_pool *pool);
133
134extern unsigned long gen_pool_fixed_alloc(unsigned long *map,
135 unsigned long size, unsigned long start, unsigned int nr,
136 void *data, struct gen_pool *pool);
137
138extern unsigned long gen_pool_first_fit_align(unsigned long *map,
139 unsigned long size, unsigned long start, unsigned int nr,
140 void *data, struct gen_pool *pool);
141
142
143extern unsigned long gen_pool_first_fit_order_align(unsigned long *map,
144 unsigned long size, unsigned long start, unsigned int nr,
145 void *data, struct gen_pool *pool);
146
147extern unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
148 unsigned long start, unsigned int nr, void *data,
149 struct gen_pool *pool);
150
151
152extern struct gen_pool *devm_gen_pool_create(struct device *dev,
153 int min_alloc_order, int nid, const char *name);
154extern struct gen_pool *gen_pool_get(struct device *dev, const char *name);
155
156bool addr_in_gen_pool(struct gen_pool *pool, unsigned long start,
157 size_t size);
158
159#ifdef CONFIG_OF
160extern struct gen_pool *of_gen_pool_get(struct device_node *np,
161 const char *propname, int index);
162#else
163static inline struct gen_pool *of_gen_pool_get(struct device_node *np,
164 const char *propname, int index)
165{
166 return NULL;
167}
168#endif
169#endif
170