1
2#ifndef _LINUX_LMB_H
3#define _LINUX_LMB_H
4#ifdef __KERNEL__
5
6#include <asm/types.h>
7#include <asm/u-boot.h>
8
9
10
11
12
13
14
15
16
17
18
19
20
21struct lmb_property {
22 phys_addr_t base;
23 phys_size_t size;
24};
25
26
27
28
29
30
31
32
33struct lmb_region {
34 unsigned long cnt;
35 unsigned long max;
36#if IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
37 struct lmb_property region[CONFIG_LMB_MAX_REGIONS];
38#else
39 struct lmb_property *region;
40#endif
41};
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56struct lmb {
57 struct lmb_region memory;
58 struct lmb_region reserved;
59#if !IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
60 struct lmb_property memory_regions[CONFIG_LMB_MEMORY_REGIONS];
61 struct lmb_property reserved_regions[CONFIG_LMB_RESERVED_REGIONS];
62#endif
63};
64
65extern void lmb_init(struct lmb *lmb);
66extern void lmb_init_and_reserve(struct lmb *lmb, struct bd_info *bd,
67 void *fdt_blob);
68extern void lmb_init_and_reserve_range(struct lmb *lmb, phys_addr_t base,
69 phys_size_t size, void *fdt_blob);
70extern long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size);
71extern long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size);
72extern phys_addr_t lmb_alloc(struct lmb *lmb, phys_size_t size, ulong align);
73extern phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align,
74 phys_addr_t max_addr);
75extern phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align,
76 phys_addr_t max_addr);
77extern phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base,
78 phys_size_t size);
79extern phys_size_t lmb_get_free_size(struct lmb *lmb, phys_addr_t addr);
80extern int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr);
81extern long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size);
82
83extern void lmb_dump_all(struct lmb *lmb);
84extern void lmb_dump_all_force(struct lmb *lmb);
85
86static inline phys_size_t
87lmb_size_bytes(struct lmb_region *type, unsigned long region_nr)
88{
89 return type->region[region_nr].size;
90}
91
92void board_lmb_reserve(struct lmb *lmb);
93void arch_lmb_reserve(struct lmb *lmb);
94
95#endif
96
97#endif
98