1#ifndef _LINUX_MEMBLOCK_H
2#define _LINUX_MEMBLOCK_H
3#ifdef __KERNEL__
4
5#ifdef CONFIG_HAVE_MEMBLOCK
6
7
8
9
10
11
12
13
14
15
16
17#include <linux/init.h>
18#include <linux/mm.h>
19
20#include <asm/memblock.h>
21
22#define INIT_MEMBLOCK_REGIONS 128
23#define MEMBLOCK_ERROR 0
24
25struct memblock_region {
26 phys_addr_t base;
27 phys_addr_t size;
28};
29
30struct memblock_type {
31 unsigned long cnt;
32 unsigned long max;
33 struct memblock_region *regions;
34};
35
36struct memblock {
37 phys_addr_t current_limit;
38 phys_addr_t memory_size;
39 struct memblock_type memory;
40 struct memblock_type reserved;
41};
42
43extern struct memblock memblock;
44extern int memblock_debug;
45extern int memblock_can_resize;
46
47#define memblock_dbg(fmt, ...) \
48 if (memblock_debug) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
49
50u64 memblock_find_in_range(u64 start, u64 end, u64 size, u64 align);
51int memblock_free_reserved_regions(void);
52int memblock_reserve_reserved_regions(void);
53
54extern void memblock_init(void);
55extern void memblock_analyze(void);
56extern long memblock_add(phys_addr_t base, phys_addr_t size);
57extern long memblock_remove(phys_addr_t base, phys_addr_t size);
58extern long memblock_free(phys_addr_t base, phys_addr_t size);
59extern long memblock_reserve(phys_addr_t base, phys_addr_t size);
60
61
62
63
64extern phys_addr_t memblock_alloc_nid(phys_addr_t size, phys_addr_t align,
65 int nid);
66extern phys_addr_t memblock_alloc_try_nid(phys_addr_t size, phys_addr_t align,
67 int nid);
68
69extern phys_addr_t memblock_alloc(phys_addr_t size, phys_addr_t align);
70
71
72#define MEMBLOCK_ALLOC_ANYWHERE (~(phys_addr_t)0)
73#define MEMBLOCK_ALLOC_ACCESSIBLE 0
74
75extern phys_addr_t memblock_alloc_base(phys_addr_t size,
76 phys_addr_t align,
77 phys_addr_t max_addr);
78extern phys_addr_t __memblock_alloc_base(phys_addr_t size,
79 phys_addr_t align,
80 phys_addr_t max_addr);
81extern phys_addr_t memblock_phys_mem_size(void);
82extern phys_addr_t memblock_end_of_DRAM(void);
83extern void memblock_enforce_memory_limit(phys_addr_t memory_limit);
84extern int memblock_is_memory(phys_addr_t addr);
85extern int memblock_is_region_memory(phys_addr_t base, phys_addr_t size);
86extern int memblock_is_reserved(phys_addr_t addr);
87extern int memblock_is_region_reserved(phys_addr_t base, phys_addr_t size);
88
89extern void memblock_dump_all(void);
90
91
92extern phys_addr_t memblock_nid_range(phys_addr_t start, phys_addr_t end, int *nid);
93extern int memblock_memory_can_coalesce(phys_addr_t addr1, phys_addr_t size1,
94 phys_addr_t addr2, phys_addr_t size2);
95
96
97
98
99
100
101
102extern void memblock_set_current_limit(phys_addr_t limit);
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117static inline unsigned long memblock_region_memory_base_pfn(const struct memblock_region *reg)
118{
119 return PFN_UP(reg->base);
120}
121
122
123
124
125
126static inline unsigned long memblock_region_memory_end_pfn(const struct memblock_region *reg)
127{
128 return PFN_DOWN(reg->base + reg->size);
129}
130
131
132
133
134
135static inline unsigned long memblock_region_reserved_base_pfn(const struct memblock_region *reg)
136{
137 return PFN_DOWN(reg->base);
138}
139
140
141
142
143
144static inline unsigned long memblock_region_reserved_end_pfn(const struct memblock_region *reg)
145{
146 return PFN_UP(reg->base + reg->size);
147}
148
149#define for_each_memblock(memblock_type, region) \
150 for (region = memblock.memblock_type.regions; \
151 region < (memblock.memblock_type.regions + memblock.memblock_type.cnt); \
152 region++)
153
154
155#ifdef ARCH_DISCARD_MEMBLOCK
156#define __init_memblock __init
157#define __initdata_memblock __initdata
158#else
159#define __init_memblock
160#define __initdata_memblock
161#endif
162
163#endif
164
165#endif
166
167#endif
168