Blame view

include/linux/memblock.h 20.1 KB
2874c5fd2   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-or-later */
95f72d1ed   Yinghai Lu   lmb: rename to me...
2
3
4
5
6
7
8
9
  #ifndef _LINUX_MEMBLOCK_H
  #define _LINUX_MEMBLOCK_H
  #ifdef __KERNEL__
  
  /*
   * Logical memory blocks.
   *
   * Copyright (C) 2001 Peter Bergner, IBM Corp.
95f72d1ed   Yinghai Lu   lmb: rename to me...
10
11
12
13
   */
  
  #include <linux/init.h>
  #include <linux/mm.h>
57c8a661d   Mike Rapoport   mm: remove includ...
14
15
16
17
18
19
20
21
22
23
24
25
26
  #include <asm/dma.h>
  
  extern unsigned long max_low_pfn;
  extern unsigned long min_low_pfn;
  
  /*
   * highest page
   */
  extern unsigned long max_pfn;
  /*
   * highest possible page
   */
  extern unsigned long long max_possible_pfn;
95f72d1ed   Yinghai Lu   lmb: rename to me...
27

9a0de1bfe   Mike Rapoport   docs/mm: memblock...
28
29
30
31
32
33
34
  /**
   * enum memblock_flags - definition of memory region attributes
   * @MEMBLOCK_NONE: no special request
   * @MEMBLOCK_HOTPLUG: hotpluggable region
   * @MEMBLOCK_MIRROR: mirrored region
   * @MEMBLOCK_NOMAP: don't add to kernel direct mapping
   */
e1720fee2   Mike Rapoport   mm/memblock: add ...
35
  enum memblock_flags {
fc6daaf93   Tony Luck   mm/memblock: add ...
36
37
  	MEMBLOCK_NONE		= 0x0,	/* No special request */
  	MEMBLOCK_HOTPLUG	= 0x1,	/* hotpluggable region */
a3f5bafcc   Tony Luck   mm/memblock: allo...
38
  	MEMBLOCK_MIRROR		= 0x2,	/* mirrored region */
bf3d3cc58   Ard Biesheuvel   mm/memblock: add ...
39
  	MEMBLOCK_NOMAP		= 0x4,	/* don't add to kernel direct mapping */
fc6daaf93   Tony Luck   mm/memblock: add ...
40
  };
66b16edf9   Tang Chen   memblock, mem_hot...
41

9a0de1bfe   Mike Rapoport   docs/mm: memblock...
42
43
  /**
   * struct memblock_region - represents a memory region
8cbd54f52   chenqiwu   include/linux/mem...
44
   * @base: base address of the region
9a0de1bfe   Mike Rapoport   docs/mm: memblock...
45
46
47
48
   * @size: size of the region
   * @flags: memory region attributes
   * @nid: NUMA node id
   */
e3239ff92   Benjamin Herrenschmidt   memblock: Rename ...
49
  struct memblock_region {
2898cc4cd   Benjamin Herrenschmidt   memblock: Change ...
50
51
  	phys_addr_t base;
  	phys_addr_t size;
e1720fee2   Mike Rapoport   mm/memblock: add ...
52
  	enum memblock_flags flags;
3f08a302f   Mike Rapoport   mm: remove CONFIG...
53
  #ifdef CONFIG_NEED_MULTIPLE_NODES
7c0caeb86   Tejun Heo   memblock: Add opt...
54
55
  	int nid;
  #endif
95f72d1ed   Yinghai Lu   lmb: rename to me...
56
  };
9a0de1bfe   Mike Rapoport   docs/mm: memblock...
57
58
59
60
61
62
63
64
  /**
   * struct memblock_type - collection of memory regions of certain type
   * @cnt: number of regions
   * @max: size of the allocated array
   * @total_size: size of all regions
   * @regions: array of regions
   * @name: the memory type symbolic name
   */
e3239ff92   Benjamin Herrenschmidt   memblock: Rename ...
65
  struct memblock_type {
9a0de1bfe   Mike Rapoport   docs/mm: memblock...
66
67
68
  	unsigned long cnt;
  	unsigned long max;
  	phys_addr_t total_size;
bf23c51f1   Benjamin Herrenschmidt   memblock: Move me...
69
  	struct memblock_region *regions;
0262d9c84   Heiko Carstens   memblock: embed m...
70
  	char *name;
95f72d1ed   Yinghai Lu   lmb: rename to me...
71
  };
9a0de1bfe   Mike Rapoport   docs/mm: memblock...
72
73
74
75
  /**
   * struct memblock - memblock allocator metadata
   * @bottom_up: is bottom up direction?
   * @current_limit: physical address of the current allocation limit
8cbd54f52   chenqiwu   include/linux/mem...
76
   * @memory: usable memory regions
9a0de1bfe   Mike Rapoport   docs/mm: memblock...
77
   * @reserved: reserved memory regions
9a0de1bfe   Mike Rapoport   docs/mm: memblock...
78
   */
95f72d1ed   Yinghai Lu   lmb: rename to me...
79
  struct memblock {
79442ed18   Tang Chen   mm/memblock.c: in...
80
  	bool bottom_up;  /* is bottom up direction? */
2898cc4cd   Benjamin Herrenschmidt   memblock: Change ...
81
  	phys_addr_t current_limit;
e3239ff92   Benjamin Herrenschmidt   memblock: Rename ...
82
83
  	struct memblock_type memory;
  	struct memblock_type reserved;
95f72d1ed   Yinghai Lu   lmb: rename to me...
84
85
86
  };
  
  extern struct memblock memblock;
5e63cf43a   Yinghai Lu   memblock: Expose ...
87

350e88bad   Mike Rapoport   mm: memblock: mak...
88
  #ifndef CONFIG_ARCH_KEEP_MEMBLOCK
036fbb21d   Kirill A. Shutemov   memblock: fix sec...
89
90
  #define __init_memblock __meminit
  #define __initdata_memblock __meminitdata
3010f8765   Pavel Tatashin   mm: discard membl...
91
  void memblock_discard(void);
036fbb21d   Kirill A. Shutemov   memblock: fix sec...
92
93
94
  #else
  #define __init_memblock
  #define __initdata_memblock
350e88bad   Mike Rapoport   mm: memblock: mak...
95
  static inline void memblock_discard(void) {}
036fbb21d   Kirill A. Shutemov   memblock: fix sec...
96
  #endif
fc769a8e7   Tejun Heo   memblock: Replace...
97
98
  phys_addr_t memblock_find_in_range(phys_addr_t start, phys_addr_t end,
  				   phys_addr_t size, phys_addr_t align);
1aadc0560   Tejun Heo   memblock: s/membl...
99
  void memblock_allow_resize(void);
7fb0bc3f0   Tejun Heo   memblock: Impleme...
100
  int memblock_add_node(phys_addr_t base, phys_addr_t size, int nid);
581adcbe1   Tejun Heo   memblock: Make me...
101
102
103
104
  int memblock_add(phys_addr_t base, phys_addr_t size);
  int memblock_remove(phys_addr_t base, phys_addr_t size);
  int memblock_free(phys_addr_t base, phys_addr_t size);
  int memblock_reserve(phys_addr_t base, phys_addr_t size);
02634a44b   Anshuman Khandual   mm/memblock: defi...
105
106
107
  #ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
  int memblock_physmem_add(phys_addr_t base, phys_addr_t size);
  #endif
6ede1fd3c   Yinghai Lu   x86, mm: Trim mem...
108
  void memblock_trim_memory(phys_addr_t align);
95cf82ecc   Tang Chen   mem-hotplug: hand...
109
110
  bool memblock_overlaps_region(struct memblock_type *type,
  			      phys_addr_t base, phys_addr_t size);
66b16edf9   Tang Chen   memblock, mem_hot...
111
112
  int memblock_mark_hotplug(phys_addr_t base, phys_addr_t size);
  int memblock_clear_hotplug(phys_addr_t base, phys_addr_t size);
a3f5bafcc   Tony Luck   mm/memblock: allo...
113
  int memblock_mark_mirror(phys_addr_t base, phys_addr_t size);
bf3d3cc58   Ard Biesheuvel   mm/memblock: add ...
114
  int memblock_mark_nomap(phys_addr_t base, phys_addr_t size);
4c546b8a3   AKASHI Takahiro   memblock: add mem...
115
  int memblock_clear_nomap(phys_addr_t base, phys_addr_t size);
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
116

57c8a661d   Mike Rapoport   mm: remove includ...
117
118
119
  unsigned long memblock_free_all(void);
  void reset_node_managed_pages(pg_data_t *pgdat);
  void reset_all_zones_managed_pages(void);
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
120
  /* Low level functions */
e1720fee2   Mike Rapoport   mm/memblock: add ...
121
  void __next_mem_range(u64 *idx, int nid, enum memblock_flags flags,
fc6daaf93   Tony Luck   mm/memblock: add ...
122
  		      struct memblock_type *type_a,
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
123
124
  		      struct memblock_type *type_b, phys_addr_t *out_start,
  		      phys_addr_t *out_end, int *out_nid);
e1720fee2   Mike Rapoport   mm/memblock: add ...
125
  void __next_mem_range_rev(u64 *idx, int nid, enum memblock_flags flags,
fc6daaf93   Tony Luck   mm/memblock: add ...
126
  			  struct memblock_type *type_a,
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
127
128
  			  struct memblock_type *type_b, phys_addr_t *out_start,
  			  phys_addr_t *out_end, int *out_nid);
3010f8765   Pavel Tatashin   mm: discard membl...
129
  void __memblock_free_late(phys_addr_t base, phys_addr_t size);
776499058   David Hildenbrand   mm/memblock: expo...
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  #ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
  static inline void __next_physmem_range(u64 *idx, struct memblock_type *type,
  					phys_addr_t *out_start,
  					phys_addr_t *out_end)
  {
  	extern struct memblock_type physmem;
  
  	__next_mem_range(idx, NUMA_NO_NODE, MEMBLOCK_NONE, &physmem, type,
  			 out_start, out_end, NULL);
  }
  
  /**
   * for_each_physmem_range - iterate through physmem areas not included in type.
   * @i: u64 used as loop variable
   * @type: ptr to memblock_type which excludes from the iteration, can be %NULL
   * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL
   * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL
   */
  #define for_each_physmem_range(i, type, p_start, p_end)			\
  	for (i = 0, __next_physmem_range(&i, type, p_start, p_end);	\
  	     i != (u64)ULLONG_MAX;					\
  	     __next_physmem_range(&i, type, p_start, p_end))
  #endif /* CONFIG_HAVE_MEMBLOCK_PHYS_MAP */
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
153
  /**
6e245ad4a   Mike Rapoport   memblock: reduce ...
154
   * __for_each_mem_range - iterate through memblock areas from type_a and not
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
155
156
157
158
159
   * included in type_b. Or just type_a if type_b is NULL.
   * @i: u64 used as loop variable
   * @type_a: ptr to memblock_type to iterate
   * @type_b: ptr to memblock_type which excludes from the iteration
   * @nid: node selector, %NUMA_NO_NODE for all nodes
fc6daaf93   Tony Luck   mm/memblock: add ...
160
   * @flags: pick from blocks based on memory attributes
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
161
162
163
164
   * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL
   * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL
   * @p_nid: ptr to int for nid of the range, can be %NULL
   */
6e245ad4a   Mike Rapoport   memblock: reduce ...
165
  #define __for_each_mem_range(i, type_a, type_b, nid, flags,		\
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
166
  			   p_start, p_end, p_nid)			\
fc6daaf93   Tony Luck   mm/memblock: add ...
167
  	for (i = 0, __next_mem_range(&i, nid, flags, type_a, type_b,	\
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
168
169
  				     p_start, p_end, p_nid);		\
  	     i != (u64)ULLONG_MAX;					\
fc6daaf93   Tony Luck   mm/memblock: add ...
170
  	     __next_mem_range(&i, nid, flags, type_a, type_b,		\
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
171
172
173
  			      p_start, p_end, p_nid))
  
  /**
6e245ad4a   Mike Rapoport   memblock: reduce ...
174
   * __for_each_mem_range_rev - reverse iterate through memblock areas from
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
175
176
177
178
179
   * type_a and not included in type_b. Or just type_a if type_b is NULL.
   * @i: u64 used as loop variable
   * @type_a: ptr to memblock_type to iterate
   * @type_b: ptr to memblock_type which excludes from the iteration
   * @nid: node selector, %NUMA_NO_NODE for all nodes
fc6daaf93   Tony Luck   mm/memblock: add ...
180
   * @flags: pick from blocks based on memory attributes
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
181
182
183
184
   * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL
   * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL
   * @p_nid: ptr to int for nid of the range, can be %NULL
   */
6e245ad4a   Mike Rapoport   memblock: reduce ...
185
186
  #define __for_each_mem_range_rev(i, type_a, type_b, nid, flags,		\
  				 p_start, p_end, p_nid)			\
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
187
  	for (i = (u64)ULLONG_MAX,					\
6e245ad4a   Mike Rapoport   memblock: reduce ...
188
  		     __next_mem_range_rev(&i, nid, flags, type_a, type_b, \
ba6c19fd1   Chen Gang   include/linux/mem...
189
  					  p_start, p_end, p_nid);	\
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
190
  	     i != (u64)ULLONG_MAX;					\
fc6daaf93   Tony Luck   mm/memblock: add ...
191
  	     __next_mem_range_rev(&i, nid, flags, type_a, type_b,	\
f1af9d3af   Philipp Hachtmann   mm/memblock: Do s...
192
  				  p_start, p_end, p_nid))
8e7a7f861   Robin Holt   memblock: introdu...
193
  /**
6e245ad4a   Mike Rapoport   memblock: reduce ...
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
   * for_each_mem_range - iterate through memory areas.
   * @i: u64 used as loop variable
   * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL
   * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL
   */
  #define for_each_mem_range(i, p_start, p_end) \
  	__for_each_mem_range(i, &memblock.memory, NULL, NUMA_NO_NODE,	\
  			     MEMBLOCK_NONE, p_start, p_end, NULL)
  
  /**
   * for_each_mem_range_rev - reverse iterate through memblock areas from
   * type_a and not included in type_b. Or just type_a if type_b is NULL.
   * @i: u64 used as loop variable
   * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL
   * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL
   */
  #define for_each_mem_range_rev(i, p_start, p_end)			\
  	__for_each_mem_range_rev(i, &memblock.memory, NULL, NUMA_NO_NODE, \
  				 MEMBLOCK_NONE, p_start, p_end, NULL)
  
  /**
9f3d5eaa3   Mike Rapoport   memblock: impleme...
215
   * for_each_reserved_mem_range - iterate over all reserved memblock areas
8e7a7f861   Robin Holt   memblock: introdu...
216
217
218
219
220
221
222
   * @i: u64 used as loop variable
   * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL
   * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL
   *
   * Walks over reserved areas of memblock. Available as soon as memblock
   * is initialized.
   */
9f3d5eaa3   Mike Rapoport   memblock: impleme...
223
224
225
  #define for_each_reserved_mem_range(i, p_start, p_end)			\
  	__for_each_mem_range(i, &memblock.reserved, NULL, NUMA_NO_NODE,	\
  			     MEMBLOCK_NONE, p_start, p_end, NULL)
8e7a7f861   Robin Holt   memblock: introdu...
226

55ac590c2   Tang Chen   memblock, mem_hot...
227
228
229
230
  static inline bool memblock_is_hotpluggable(struct memblock_region *m)
  {
  	return m->flags & MEMBLOCK_HOTPLUG;
  }
a3f5bafcc   Tony Luck   mm/memblock: allo...
231
232
233
234
  static inline bool memblock_is_mirror(struct memblock_region *m)
  {
  	return m->flags & MEMBLOCK_MIRROR;
  }
bf3d3cc58   Ard Biesheuvel   mm/memblock: add ...
235
236
237
238
  static inline bool memblock_is_nomap(struct memblock_region *m)
  {
  	return m->flags & MEMBLOCK_NOMAP;
  }
e76b63f80   Yinghai Lu   memblock, numa: b...
239
240
  int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn,
  			    unsigned long  *end_pfn);
0ee332c14   Tejun Heo   memblock: Kill ea...
241
242
243
244
245
246
247
248
249
250
251
  void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn,
  			  unsigned long *out_end_pfn, int *out_nid);
  
  /**
   * for_each_mem_pfn_range - early memory pfn range iterator
   * @i: an integer used as loop variable
   * @nid: node selector, %MAX_NUMNODES for all nodes
   * @p_start: ptr to ulong for start pfn of the range, can be %NULL
   * @p_end: ptr to ulong for end pfn of the range, can be %NULL
   * @p_nid: ptr to int for nid of the range, can be %NULL
   *
f2d52fe51   Wanpeng Li   mm/memblock: clea...
252
   * Walks over configured memory ranges.
0ee332c14   Tejun Heo   memblock: Kill ea...
253
254
255
256
   */
  #define for_each_mem_pfn_range(i, nid, p_start, p_end, p_nid)		\
  	for (i = -1, __next_mem_pfn_range(&i, nid, p_start, p_end, p_nid); \
  	     i >= 0; __next_mem_pfn_range(&i, nid, p_start, p_end, p_nid))
0ee332c14   Tejun Heo   memblock: Kill ea...
257

837566e7e   Alexander Duyck   mm: implement new...
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
  #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
  void __next_mem_pfn_range_in_zone(u64 *idx, struct zone *zone,
  				  unsigned long *out_spfn,
  				  unsigned long *out_epfn);
  /**
   * for_each_free_mem_range_in_zone - iterate through zone specific free
   * memblock areas
   * @i: u64 used as loop variable
   * @zone: zone in which all of the memory blocks reside
   * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL
   * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL
   *
   * Walks over free (memory && !reserved) areas of memblock in a specific
   * zone. Available once memblock and an empty zone is initialized. The main
   * assumption is that the zone start, end, and pgdat have been associated.
   * This way we can use the zone to determine NUMA node, and if a given part
   * of the memblock is valid for the zone.
   */
  #define for_each_free_mem_pfn_range_in_zone(i, zone, p_start, p_end)	\
  	for (i = 0,							\
  	     __next_mem_pfn_range_in_zone(&i, zone, p_start, p_end);	\
  	     i != U64_MAX;					\
  	     __next_mem_pfn_range_in_zone(&i, zone, p_start, p_end))
0e56acae4   Alexander Duyck   mm: initialize MA...
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
  
  /**
   * for_each_free_mem_range_in_zone_from - iterate through zone specific
   * free memblock areas from a given point
   * @i: u64 used as loop variable
   * @zone: zone in which all of the memory blocks reside
   * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL
   * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL
   *
   * Walks over free (memory && !reserved) areas of memblock in a specific
   * zone, continuing from current position. Available as soon as memblock is
   * initialized.
   */
  #define for_each_free_mem_pfn_range_in_zone_from(i, zone, p_start, p_end) \
  	for (; i != U64_MAX;					  \
  	     __next_mem_pfn_range_in_zone(&i, zone, p_start, p_end))
ecd096506   Daniel Jordan   mm: make deferred...
297
298
  
  int __init deferred_page_init_max_threads(const struct cpumask *node_cpumask);
837566e7e   Alexander Duyck   mm: implement new...
299
  #endif /* CONFIG_DEFERRED_STRUCT_PAGE_INIT */
35fd0808d   Tejun Heo   memblock: Impleme...
300
301
302
  /**
   * for_each_free_mem_range - iterate through free memblock areas
   * @i: u64 used as loop variable
b11542335   Grygorii Strashko   mm/memblock: swit...
303
   * @nid: node selector, %NUMA_NO_NODE for all nodes
d30b5545b   Florian Fainelli   include/linux/mem...
304
   * @flags: pick from blocks based on memory attributes
35fd0808d   Tejun Heo   memblock: Impleme...
305
306
307
308
309
310
311
   * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL
   * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL
   * @p_nid: ptr to int for nid of the range, can be %NULL
   *
   * Walks over free (memory && !reserved) areas of memblock.  Available as
   * soon as memblock is initialized.
   */
fc6daaf93   Tony Luck   mm/memblock: add ...
312
  #define for_each_free_mem_range(i, nid, flags, p_start, p_end, p_nid)	\
6e245ad4a   Mike Rapoport   memblock: reduce ...
313
314
  	__for_each_mem_range(i, &memblock.memory, &memblock.reserved,	\
  			     nid, flags, p_start, p_end, p_nid)
7bd0b0f0d   Tejun Heo   memblock: Reimple...
315
316
317
318
  
  /**
   * for_each_free_mem_range_reverse - rev-iterate through free memblock areas
   * @i: u64 used as loop variable
b11542335   Grygorii Strashko   mm/memblock: swit...
319
   * @nid: node selector, %NUMA_NO_NODE for all nodes
d30b5545b   Florian Fainelli   include/linux/mem...
320
   * @flags: pick from blocks based on memory attributes
7bd0b0f0d   Tejun Heo   memblock: Reimple...
321
322
323
324
325
326
327
   * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL
   * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL
   * @p_nid: ptr to int for nid of the range, can be %NULL
   *
   * Walks over free (memory && !reserved) areas of memblock in reverse
   * order.  Available as soon as memblock is initialized.
   */
fc6daaf93   Tony Luck   mm/memblock: add ...
328
329
  #define for_each_free_mem_range_reverse(i, nid, flags, p_start, p_end,	\
  					p_nid)				\
6e245ad4a   Mike Rapoport   memblock: reduce ...
330
331
  	__for_each_mem_range_rev(i, &memblock.memory, &memblock.reserved, \
  				 nid, flags, p_start, p_end, p_nid)
7bd0b0f0d   Tejun Heo   memblock: Reimple...
332

e7e8de591   Tang Chen   memblock: make me...
333
334
  int memblock_set_node(phys_addr_t base, phys_addr_t size,
  		      struct memblock_type *type, int nid);
7c0caeb86   Tejun Heo   memblock: Add opt...
335

3f08a302f   Mike Rapoport   mm: remove CONFIG...
336
  #ifdef CONFIG_NEED_MULTIPLE_NODES
7c0caeb86   Tejun Heo   memblock: Add opt...
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
  static inline void memblock_set_region_node(struct memblock_region *r, int nid)
  {
  	r->nid = nid;
  }
  
  static inline int memblock_get_region_node(const struct memblock_region *r)
  {
  	return r->nid;
  }
  #else
  static inline void memblock_set_region_node(struct memblock_region *r, int nid)
  {
  }
  
  static inline int memblock_get_region_node(const struct memblock_region *r)
  {
  	return 0;
  }
3f08a302f   Mike Rapoport   mm: remove CONFIG...
355
  #endif /* CONFIG_NEED_MULTIPLE_NODES */
7c0caeb86   Tejun Heo   memblock: Add opt...
356

57c8a661d   Mike Rapoport   mm: remove includ...
357
358
359
  /* Flags for memblock allocation APIs */
  #define MEMBLOCK_ALLOC_ANYWHERE	(~(phys_addr_t)0)
  #define MEMBLOCK_ALLOC_ACCESSIBLE	0
fed84c785   Qian Cai   mm/memblock.c: sk...
360
  #define MEMBLOCK_ALLOC_KASAN		1
57c8a661d   Mike Rapoport   mm: remove includ...
361
362
363
364
365
366
367
  
  /* We are using top down, so it is safe to use 0 here */
  #define MEMBLOCK_LOW_LIMIT 0
  
  #ifndef ARCH_LOW_ADDRESS_LIMIT
  #define ARCH_LOW_ADDRESS_LIMIT  0xffffffffUL
  #endif
8a770c2a8   Mike Rapoport   memblock: emphasi...
368
369
  phys_addr_t memblock_phys_alloc_range(phys_addr_t size, phys_addr_t align,
  				      phys_addr_t start, phys_addr_t end);
8676af1ff   Aslan Bakirov   mm: cma: NUMA nod...
370
371
372
  phys_addr_t memblock_alloc_range_nid(phys_addr_t size,
  				      phys_addr_t align, phys_addr_t start,
  				      phys_addr_t end, int nid, bool exact_nid);
9a8dd708d   Mike Rapoport   memblock: rename ...
373
  phys_addr_t memblock_phys_alloc_try_nid(phys_addr_t size, phys_addr_t align, int nid);
9d1e24928   Benjamin Herrenschmidt   memblock: Separat...
374

ecc3e771f   Mike Rapoport   memblock: membloc...
375
376
377
378
379
380
  static inline phys_addr_t memblock_phys_alloc(phys_addr_t size,
  					      phys_addr_t align)
  {
  	return memblock_phys_alloc_range(size, align, 0,
  					 MEMBLOCK_ALLOC_ACCESSIBLE);
  }
e63075a3c   Benjamin Herrenschmidt   memblock: Introdu...
381

0ac398b17   Yunfeng Ye   mm: support membl...
382
383
384
  void *memblock_alloc_exact_nid_raw(phys_addr_t size, phys_addr_t align,
  				 phys_addr_t min_addr, phys_addr_t max_addr,
  				 int nid);
57c8a661d   Mike Rapoport   mm: remove includ...
385
386
387
  void *memblock_alloc_try_nid_raw(phys_addr_t size, phys_addr_t align,
  				 phys_addr_t min_addr, phys_addr_t max_addr,
  				 int nid);
57c8a661d   Mike Rapoport   mm: remove includ...
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
  void *memblock_alloc_try_nid(phys_addr_t size, phys_addr_t align,
  			     phys_addr_t min_addr, phys_addr_t max_addr,
  			     int nid);
  
  static inline void * __init memblock_alloc(phys_addr_t size,  phys_addr_t align)
  {
  	return memblock_alloc_try_nid(size, align, MEMBLOCK_LOW_LIMIT,
  				      MEMBLOCK_ALLOC_ACCESSIBLE, NUMA_NO_NODE);
  }
  
  static inline void * __init memblock_alloc_raw(phys_addr_t size,
  					       phys_addr_t align)
  {
  	return memblock_alloc_try_nid_raw(size, align, MEMBLOCK_LOW_LIMIT,
  					  MEMBLOCK_ALLOC_ACCESSIBLE,
  					  NUMA_NO_NODE);
  }
  
  static inline void * __init memblock_alloc_from(phys_addr_t size,
  						phys_addr_t align,
  						phys_addr_t min_addr)
  {
  	return memblock_alloc_try_nid(size, align, min_addr,
  				      MEMBLOCK_ALLOC_ACCESSIBLE, NUMA_NO_NODE);
  }
57c8a661d   Mike Rapoport   mm: remove includ...
413
414
415
416
417
418
  static inline void * __init memblock_alloc_low(phys_addr_t size,
  					       phys_addr_t align)
  {
  	return memblock_alloc_try_nid(size, align, MEMBLOCK_LOW_LIMIT,
  				      ARCH_LOW_ADDRESS_LIMIT, NUMA_NO_NODE);
  }
57c8a661d   Mike Rapoport   mm: remove includ...
419
420
421
422
423
424
425
  
  static inline void * __init memblock_alloc_node(phys_addr_t size,
  						phys_addr_t align, int nid)
  {
  	return memblock_alloc_try_nid(size, align, MEMBLOCK_LOW_LIMIT,
  				      MEMBLOCK_ALLOC_ACCESSIBLE, nid);
  }
57c8a661d   Mike Rapoport   mm: remove includ...
426
427
428
  static inline void __init memblock_free_early(phys_addr_t base,
  					      phys_addr_t size)
  {
4d72868c8   Mike Rapoport   memblock: replace...
429
  	memblock_free(base, size);
57c8a661d   Mike Rapoport   mm: remove includ...
430
431
432
433
434
  }
  
  static inline void __init memblock_free_early_nid(phys_addr_t base,
  						  phys_addr_t size, int nid)
  {
4d72868c8   Mike Rapoport   memblock: replace...
435
  	memblock_free(base, size);
57c8a661d   Mike Rapoport   mm: remove includ...
436
437
438
439
440
441
  }
  
  static inline void __init memblock_free_late(phys_addr_t base, phys_addr_t size)
  {
  	__memblock_free_late(base, size);
  }
79442ed18   Tang Chen   mm/memblock.c: in...
442
443
444
  /*
   * Set the allocation direction to bottom-up or top-down.
   */
2cfb3665e   Fabian Frederick   include/linux/mem...
445
  static inline void __init memblock_set_bottom_up(bool enable)
79442ed18   Tang Chen   mm/memblock.c: in...
446
447
448
449
450
451
452
453
454
455
456
457
458
  {
  	memblock.bottom_up = enable;
  }
  
  /*
   * Check if the allocation direction is bottom-up or not.
   * if this is true, that said, memblock will allocate memory
   * in bottom-up direction.
   */
  static inline bool memblock_bottom_up(void)
  {
  	return memblock.bottom_up;
  }
79442ed18   Tang Chen   mm/memblock.c: in...
459

581adcbe1   Tejun Heo   memblock: Make me...
460
  phys_addr_t memblock_phys_mem_size(void);
8907de5dc   Srikar Dronamraju   mm/memblock.c: ex...
461
  phys_addr_t memblock_reserved_size(void);
581adcbe1   Tejun Heo   memblock: Make me...
462
463
464
  phys_addr_t memblock_start_of_DRAM(void);
  phys_addr_t memblock_end_of_DRAM(void);
  void memblock_enforce_memory_limit(phys_addr_t memory_limit);
c9ca9b4e2   AKASHI Takahiro   memblock: add mem...
465
  void memblock_cap_memory_range(phys_addr_t base, phys_addr_t size);
a571d4eb5   Dennis Chen   mm/memblock.c: ad...
466
  void memblock_mem_limit_remove_map(phys_addr_t limit);
b4ad0c7e0   Yaowei Bai   mm/memblock.c: me...
467
  bool memblock_is_memory(phys_addr_t addr);
937f0c267   Yaowei Bai   mm/memblock: memb...
468
469
  bool memblock_is_map_memory(phys_addr_t addr);
  bool memblock_is_region_memory(phys_addr_t base, phys_addr_t size);
b4ad0c7e0   Yaowei Bai   mm/memblock.c: me...
470
  bool memblock_is_reserved(phys_addr_t addr);
c5c5c9d10   Tang Chen   mm/memblock.c: ma...
471
  bool memblock_is_region_reserved(phys_addr_t base, phys_addr_t size);
581adcbe1   Tejun Heo   memblock: Make me...
472

87c55870f   Mike Rapoport   memblock: make me...
473
  void memblock_dump_all(void);
95f72d1ed   Yinghai Lu   lmb: rename to me...
474

e63075a3c   Benjamin Herrenschmidt   memblock: Introdu...
475
476
477
478
479
480
  /**
   * memblock_set_current_limit - Set the current allocation limit to allow
   *                         limiting allocations to what is currently
   *                         accessible during boot
   * @limit: New limit value (physical address)
   */
581adcbe1   Tejun Heo   memblock: Make me...
481
  void memblock_set_current_limit(phys_addr_t limit);
e63075a3c   Benjamin Herrenschmidt   memblock: Introdu...
482

35a1f0bd0   Benjamin Herrenschmidt   memblock: Remove ...
483

fec510141   Laura Abbott   ARM: 7993/1: mm/m...
484
  phys_addr_t memblock_get_current_limit(void);
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
485
486
487
488
489
490
491
492
493
  /*
   * pfn conversion functions
   *
   * While the memory MEMBLOCKs should always be page aligned, the reserved
   * MEMBLOCKs may not be. This accessor attempt to provide a very clear
   * idea of what they return for such non aligned MEMBLOCKs.
   */
  
  /**
47cec4432   Mike Rapoport   docs/mm: memblock...
494
   * memblock_region_memory_base_pfn - get the lowest pfn of the memory region
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
495
   * @reg: memblock_region structure
47cec4432   Mike Rapoport   docs/mm: memblock...
496
497
   *
   * Return: the lowest pfn intersecting with the memory region
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
498
   */
c7fc2de0c   Yinghai Lu   memblock, bootmem...
499
  static inline unsigned long memblock_region_memory_base_pfn(const struct memblock_region *reg)
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
500
  {
c7fc2de0c   Yinghai Lu   memblock, bootmem...
501
  	return PFN_UP(reg->base);
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
502
503
504
  }
  
  /**
47cec4432   Mike Rapoport   docs/mm: memblock...
505
   * memblock_region_memory_end_pfn - get the end pfn of the memory region
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
506
   * @reg: memblock_region structure
47cec4432   Mike Rapoport   docs/mm: memblock...
507
508
   *
   * Return: the end_pfn of the reserved region
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
509
   */
c7fc2de0c   Yinghai Lu   memblock, bootmem...
510
  static inline unsigned long memblock_region_memory_end_pfn(const struct memblock_region *reg)
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
511
  {
c7fc2de0c   Yinghai Lu   memblock, bootmem...
512
  	return PFN_DOWN(reg->base + reg->size);
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
513
514
515
  }
  
  /**
47cec4432   Mike Rapoport   docs/mm: memblock...
516
   * memblock_region_reserved_base_pfn - get the lowest pfn of the reserved region
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
517
   * @reg: memblock_region structure
47cec4432   Mike Rapoport   docs/mm: memblock...
518
519
   *
   * Return: the lowest pfn intersecting with the reserved region
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
520
   */
c7fc2de0c   Yinghai Lu   memblock, bootmem...
521
  static inline unsigned long memblock_region_reserved_base_pfn(const struct memblock_region *reg)
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
522
  {
c7fc2de0c   Yinghai Lu   memblock, bootmem...
523
  	return PFN_DOWN(reg->base);
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
524
525
526
  }
  
  /**
47cec4432   Mike Rapoport   docs/mm: memblock...
527
   * memblock_region_reserved_end_pfn - get the end pfn of the reserved region
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
528
   * @reg: memblock_region structure
47cec4432   Mike Rapoport   docs/mm: memblock...
529
530
   *
   * Return: the end_pfn of the reserved region
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
531
   */
c7fc2de0c   Yinghai Lu   memblock, bootmem...
532
  static inline unsigned long memblock_region_reserved_end_pfn(const struct memblock_region *reg)
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
533
  {
c7fc2de0c   Yinghai Lu   memblock, bootmem...
534
  	return PFN_UP(reg->base + reg->size);
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
535
  }
cc6de1680   Mike Rapoport   memblock: use sep...
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
  /**
   * for_each_mem_region - itereate over memory regions
   * @region: loop variable
   */
  #define for_each_mem_region(region)					\
  	for (region = memblock.memory.regions;				\
  	     region < (memblock.memory.regions + memblock.memory.cnt);	\
  	     region++)
  
  /**
   * for_each_reserved_mem_region - itereate over reserved memory regions
   * @region: loop variable
   */
  #define for_each_reserved_mem_region(region)				\
  	for (region = memblock.reserved.regions;			\
  	     region < (memblock.reserved.regions + memblock.reserved.cnt); \
5b385f259   Benjamin Herrenschmidt   memblock: Introdu...
552
  	     region++)
57c8a661d   Mike Rapoport   mm: remove includ...
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
  extern void *alloc_large_system_hash(const char *tablename,
  				     unsigned long bucketsize,
  				     unsigned long numentries,
  				     int scale,
  				     int flags,
  				     unsigned int *_hash_shift,
  				     unsigned int *_hash_mask,
  				     unsigned long low_limit,
  				     unsigned long high_limit);
  
  #define HASH_EARLY	0x00000001	/* Allocating during early boot? */
  #define HASH_SMALL	0x00000002	/* sub-page allocation allowed, min
  					 * shift passed via *_hash_shift */
  #define HASH_ZERO	0x00000004	/* Zero allocated hash table */
  
  /* Only NUMA needs hash distribution. 64bit NUMA architectures have
   * sufficient vmalloc space.
   */
  #ifdef CONFIG_NUMA
  #define HASHDIST_DEFAULT IS_ENABLED(CONFIG_64BIT)
  extern int hashdist;		/* Distribute hashes across NUMA nodes? */
  #else
  #define hashdist (0)
  #endif
4a20799d1   Vladimir Murzin   mm: move memtest ...
577
  #ifdef CONFIG_MEMTEST
7f70baeeb   Vladimir Murzin   memtest: use phys...
578
  extern void early_memtest(phys_addr_t start, phys_addr_t end);
4a20799d1   Vladimir Murzin   mm: move memtest ...
579
  #else
7f70baeeb   Vladimir Murzin   memtest: use phys...
580
  static inline void early_memtest(phys_addr_t start, phys_addr_t end)
4a20799d1   Vladimir Murzin   mm: move memtest ...
581
582
583
  {
  }
  #endif
f0b37fad9   Yinghai Lu   memblock: Protect...
584

95f72d1ed   Yinghai Lu   lmb: rename to me...
585
586
587
  #endif /* __KERNEL__ */
  
  #endif /* _LINUX_MEMBLOCK_H */