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
33struct device;
34struct device_node;
35
36
37
38
39
40
41
42
43
44typedef unsigned long (*genpool_algo_t)(unsigned long *map,
45 unsigned long size,
46 unsigned long start,
47 unsigned int nr,
48 void *data);
49
50
51
52
53struct gen_pool {
54 spinlock_t lock;
55 struct list_head chunks;
56 int min_alloc_order;
57
58 genpool_algo_t algo;
59 void *data;
60};
61
62
63
64
65struct gen_pool_chunk {
66 struct list_head next_chunk;
67 atomic_t avail;
68 phys_addr_t phys_addr;
69 unsigned long start_addr;
70 unsigned long end_addr;
71 unsigned long bits[0];
72};
73
74extern struct gen_pool *gen_pool_create(int, int);
75extern phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned long);
76extern int gen_pool_add_virt(struct gen_pool *, unsigned long, phys_addr_t,
77 size_t, int);
78
79
80
81
82
83
84
85
86
87
88
89
90static inline int gen_pool_add(struct gen_pool *pool, unsigned long addr,
91 size_t size, int nid)
92{
93 return gen_pool_add_virt(pool, addr, -1, size, nid);
94}
95extern void gen_pool_destroy(struct gen_pool *);
96extern unsigned long gen_pool_alloc(struct gen_pool *, size_t);
97extern void gen_pool_free(struct gen_pool *, unsigned long, size_t);
98extern void gen_pool_for_each_chunk(struct gen_pool *,
99 void (*)(struct gen_pool *, struct gen_pool_chunk *, void *), void *);
100extern size_t gen_pool_avail(struct gen_pool *);
101extern size_t gen_pool_size(struct gen_pool *);
102
103extern void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo,
104 void *data);
105
106extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
107 unsigned long start, unsigned int nr, void *data);
108
109extern unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
110 unsigned long start, unsigned int nr, void *data);
111
112extern struct gen_pool *devm_gen_pool_create(struct device *dev,
113 int min_alloc_order, int nid);
114extern struct gen_pool *dev_get_gen_pool(struct device *dev);
115
116#ifdef CONFIG_OF
117extern struct gen_pool *of_get_named_gen_pool(struct device_node *np,
118 const char *propname, int index);
119#else
120static inline struct gen_pool *of_get_named_gen_pool(struct device_node *np,
121 const char *propname, int index)
122{
123 return NULL;
124}
125#endif
126#endif
127