Blame view

include/linux/genalloc.h 5.68 KB
f14f75b81   Jes Sorensen   [PATCH] ia64 unca...
1
  /*
7f184275a   Huang Ying   lib, Make gen_poo...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   * Basic general purpose allocator for managing special purpose
   * memory, for example, memory that is not managed by the regular
   * kmalloc/kfree interface.  Uses for this includes on-device special
   * memory, uncached memory etc.
   *
   * It is safe to use the allocator in NMI handlers and other special
   * unblockable contexts that could otherwise deadlock on locks.  This
   * is implemented by using atomic operations and retries on any
   * conflicts.  The disadvantage is that there may be livelocks in
   * extreme cases.  For better scalability, one allocator can be used
   * for each CPU.
   *
   * The lockless operation only works if there is enough memory
   * available.  If new memory is added to the pool a lock has to be
   * still taken.  So any user relying on locklessness has to ensure
   * that sufficient memory is preallocated.
   *
   * The basic atomic operation of this allocator is cmpxchg on long.
   * On architectures that don't have NMI-safe cmpxchg implementation,
   * the allocator can NOT be used in NMI handler.  So code uses the
   * allocator in NMI handler should depend on
   * CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG.
f14f75b81   Jes Sorensen   [PATCH] ia64 unca...
24
   *
f14f75b81   Jes Sorensen   [PATCH] ia64 unca...
25
26
27
   * This source code is licensed under the GNU General Public License,
   * Version 2.  See the file COPYING for more details.
   */
f14f75b81   Jes Sorensen   [PATCH] ia64 unca...
28

6aae6e030   Jean-Christophe PLAGNIOL-VILLARD   include/linux/gen...
29
30
  #ifndef __GENALLOC_H__
  #define __GENALLOC_H__
9375db07a   Philipp Zabel   genalloc: add dev...
31

de2dd0eb3   Zhao Qiang   genalloc:support ...
32
  #include <linux/types.h>
b30afea01   Shawn Guo   include/linux/gen...
33
  #include <linux/spinlock_types.h>
9375db07a   Philipp Zabel   genalloc: add dev...
34
35
  struct device;
  struct device_node;
de2dd0eb3   Zhao Qiang   genalloc:support ...
36
  struct gen_pool;
9375db07a   Philipp Zabel   genalloc: add dev...
37

ca279cf10   Benjamin Gaignard   genalloc: make it...
38
39
40
41
42
43
44
45
46
47
48
49
  /**
   * Allocation callback function type definition
   * @map: Pointer to bitmap
   * @size: The bitmap size in bits
   * @start: The bitnumber to start searching at
   * @nr: The number of zeroed bits we're looking for
   * @data: optional additional data used by @genpool_algo_t
   */
  typedef unsigned long (*genpool_algo_t)(unsigned long *map,
  			unsigned long size,
  			unsigned long start,
  			unsigned int nr,
de2dd0eb3   Zhao Qiang   genalloc:support ...
50
  			void *data, struct gen_pool *pool);
ca279cf10   Benjamin Gaignard   genalloc: make it...
51

f14f75b81   Jes Sorensen   [PATCH] ia64 unca...
52
  /*
929f97276   Dean Nelson   [PATCH] change ge...
53
   *  General purpose special memory pool descriptor.
f14f75b81   Jes Sorensen   [PATCH] ia64 unca...
54
   */
929f97276   Dean Nelson   [PATCH] change ge...
55
  struct gen_pool {
7f184275a   Huang Ying   lib, Make gen_poo...
56
  	spinlock_t lock;
929f97276   Dean Nelson   [PATCH] change ge...
57
58
  	struct list_head chunks;	/* list of chunks in this pool */
  	int min_alloc_order;		/* minimum allocation order */
ca279cf10   Benjamin Gaignard   genalloc: make it...
59
60
61
  
  	genpool_algo_t algo;		/* allocation function */
  	void *data;
c98c36355   Vladimir Zapolskiy   genalloc: add sup...
62
63
  
  	const char *name;
f14f75b81   Jes Sorensen   [PATCH] ia64 unca...
64
65
66
  };
  
  /*
929f97276   Dean Nelson   [PATCH] change ge...
67
   *  General purpose special memory pool chunk descriptor.
f14f75b81   Jes Sorensen   [PATCH] ia64 unca...
68
   */
929f97276   Dean Nelson   [PATCH] change ge...
69
  struct gen_pool_chunk {
929f97276   Dean Nelson   [PATCH] change ge...
70
  	struct list_head next_chunk;	/* next chunk in pool */
7f184275a   Huang Ying   lib, Make gen_poo...
71
  	atomic_t avail;
3c8f370de   Jean-Christophe PLAGNIOL-VILLARD   lib/genalloc.c: a...
72
  	phys_addr_t phys_addr;		/* physical starting address of memory chunk */
674470d97   Joonyoung Shim   lib/genalloc.c: f...
73
74
  	unsigned long start_addr;	/* start address of memory chunk */
  	unsigned long end_addr;		/* end address of memory chunk (inclusive) */
929f97276   Dean Nelson   [PATCH] change ge...
75
  	unsigned long bits[0];		/* bitmap for allocating memory chunk */
f14f75b81   Jes Sorensen   [PATCH] ia64 unca...
76
  };
de2dd0eb3   Zhao Qiang   genalloc:support ...
77
78
79
80
81
82
  /*
   *  gen_pool data descriptor for gen_pool_first_fit_align.
   */
  struct genpool_data_align {
  	int align;		/* alignment by bytes for starting address */
  };
b26981c8f   Zhao Qiang   genalloc:support ...
83
84
85
86
87
88
  /*
   *  gen_pool data descriptor for gen_pool_fixed_alloc.
   */
  struct genpool_data_fixed {
  	unsigned long offset;		/* The offset of the specific region */
  };
929f97276   Dean Nelson   [PATCH] change ge...
89
  extern struct gen_pool *gen_pool_create(int, int);
3c8f370de   Jean-Christophe PLAGNIOL-VILLARD   lib/genalloc.c: a...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
  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);
  }
322acc96d   Steve Wise   [PATCH] LIB: add ...
110
  extern void gen_pool_destroy(struct gen_pool *);
929f97276   Dean Nelson   [PATCH] change ge...
111
  extern unsigned long gen_pool_alloc(struct gen_pool *, size_t);
de2dd0eb3   Zhao Qiang   genalloc:support ...
112
113
  extern unsigned long gen_pool_alloc_algo(struct gen_pool *, size_t,
  		genpool_algo_t algo, void *data);
684f0d3d1   Nicolin Chen   lib/genalloc: add...
114
115
  extern void *gen_pool_dma_alloc(struct gen_pool *pool, size_t size,
  		dma_addr_t *dma);
929f97276   Dean Nelson   [PATCH] change ge...
116
  extern void gen_pool_free(struct gen_pool *, unsigned long, size_t);
7f184275a   Huang Ying   lib, Make gen_poo...
117
118
119
120
  extern void gen_pool_for_each_chunk(struct gen_pool *,
  	void (*)(struct gen_pool *, struct gen_pool_chunk *, void *), void *);
  extern size_t gen_pool_avail(struct gen_pool *);
  extern size_t gen_pool_size(struct gen_pool *);
ca279cf10   Benjamin Gaignard   genalloc: make it...
121
122
123
124
125
  
  extern void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo,
  		void *data);
  
  extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
de2dd0eb3   Zhao Qiang   genalloc:support ...
126
127
  		unsigned long start, unsigned int nr, void *data,
  		struct gen_pool *pool);
b26981c8f   Zhao Qiang   genalloc:support ...
128
129
130
  extern unsigned long gen_pool_fixed_alloc(unsigned long *map,
  		unsigned long size, unsigned long start, unsigned int nr,
  		void *data, struct gen_pool *pool);
de2dd0eb3   Zhao Qiang   genalloc:support ...
131
132
133
  extern unsigned long gen_pool_first_fit_align(unsigned long *map,
  		unsigned long size, unsigned long start, unsigned int nr,
  		void *data, struct gen_pool *pool);
ca279cf10   Benjamin Gaignard   genalloc: make it...
134

505e3be6c   Laura Abbott   lib/genalloc.c: a...
135
136
  extern unsigned long gen_pool_first_fit_order_align(unsigned long *map,
  		unsigned long size, unsigned long start, unsigned int nr,
de2dd0eb3   Zhao Qiang   genalloc:support ...
137
  		void *data, struct gen_pool *pool);
505e3be6c   Laura Abbott   lib/genalloc.c: a...
138

ca279cf10   Benjamin Gaignard   genalloc: make it...
139
  extern unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
de2dd0eb3   Zhao Qiang   genalloc:support ...
140
141
  		unsigned long start, unsigned int nr, void *data,
  		struct gen_pool *pool);
ca279cf10   Benjamin Gaignard   genalloc: make it...
142

9375db07a   Philipp Zabel   genalloc: add dev...
143
  extern struct gen_pool *devm_gen_pool_create(struct device *dev,
738581735   Vladimir Zapolskiy   genalloc: add nam...
144
145
  		int min_alloc_order, int nid, const char *name);
  extern struct gen_pool *gen_pool_get(struct device *dev, const char *name);
9375db07a   Philipp Zabel   genalloc: add dev...
146

9efb3a421   Laura Abbott   lib/genalloc.c: a...
147
148
  bool addr_in_gen_pool(struct gen_pool *pool, unsigned long start,
  			size_t size);
9375db07a   Philipp Zabel   genalloc: add dev...
149
  #ifdef CONFIG_OF
abdd4a702   Vladimir Zapolskiy   genalloc: rename ...
150
  extern struct gen_pool *of_gen_pool_get(struct device_node *np,
9375db07a   Philipp Zabel   genalloc: add dev...
151
152
  	const char *propname, int index);
  #else
abdd4a702   Vladimir Zapolskiy   genalloc: rename ...
153
  static inline struct gen_pool *of_gen_pool_get(struct device_node *np,
9375db07a   Philipp Zabel   genalloc: add dev...
154
155
156
157
158
  	const char *propname, int index)
  {
  	return NULL;
  }
  #endif
6aae6e030   Jean-Christophe PLAGNIOL-VILLARD   include/linux/gen...
159
  #endif /* __GENALLOC_H__ */