]> Git Repo - J-u-boot.git/blob - include/lmb.h
Merge patch series "phycore-am62/4: Add more boot sources"
[J-u-boot.git] / include / lmb.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 #ifndef _LINUX_LMB_H
3 #define _LINUX_LMB_H
4 #ifdef __KERNEL__
5
6 #include <alist.h>
7 #include <asm/types.h>
8 #include <asm/u-boot.h>
9 #include <linux/bitops.h>
10
11 /*
12  * Logical memory blocks.
13  *
14  * Copyright (C) 2001 Peter Bergner, IBM Corp.
15  */
16
17 /**
18  * enum lmb_flags - definition of memory region attributes
19  * @LMB_NONE: no special request
20  * @LMB_NOMAP: don't add to mmu configuration
21  */
22 enum lmb_flags {
23         LMB_NONE                = 0,
24         LMB_NOMAP               = BIT(1),
25         LMB_NOOVERWRITE         = BIT(2),
26 };
27
28 /**
29  * struct lmb_region - Description of one region.
30  *
31  * @base:       Base address of the region.
32  * @size:       Size of the region
33  * @flags:      memory region attributes
34  */
35 struct lmb_region {
36         phys_addr_t base;
37         phys_size_t size;
38         enum lmb_flags flags;
39 };
40
41 /**
42  * struct lmb - The LMB structure
43  *
44  * @free_mem:   List of free memory regions
45  * @used_mem:   List of used/reserved memory regions
46  */
47 struct lmb {
48         struct alist free_mem;
49         struct alist used_mem;
50 };
51
52 /**
53  * lmb_init() - Initialise the LMB module
54  *
55  * Initialise the LMB lists needed for keeping the memory map. There
56  * are two lists, in form of alloced list data structure. One for the
57  * available memory, and one for the used memory. Initialise the two
58  * lists as part of board init. Add memory to the available memory
59  * list and reserve common areas by adding them to the used memory
60  * list.
61  *
62  * Return: 0 on success, -ve on error
63  */
64 int lmb_init(void);
65
66 /**
67  * lmb_add_memory() - Add memory range for LMB allocations
68  *
69  * Add the entire available memory range to the pool of memory that
70  * can be used by the LMB module for allocations.
71  *
72  * Return: None
73  */
74 void lmb_add_memory(void);
75
76 long lmb_add(phys_addr_t base, phys_size_t size);
77 long lmb_reserve(phys_addr_t base, phys_size_t size);
78 /**
79  * lmb_reserve_flags - Reserve one region with a specific flags bitfield.
80  *
81  * @base:       base address of the memory region
82  * @size:       size of the memory region
83  * @flags:      flags for the memory region
84  * Return:      0 if OK, > 0 for coalesced region or a negative error code.
85  */
86 long lmb_reserve_flags(phys_addr_t base, phys_size_t size,
87                        enum lmb_flags flags);
88 phys_addr_t lmb_alloc(phys_size_t size, ulong align);
89 phys_addr_t lmb_alloc_base(phys_size_t size, ulong align, phys_addr_t max_addr);
90 phys_addr_t lmb_alloc_addr(phys_addr_t base, phys_size_t size);
91 phys_size_t lmb_get_free_size(phys_addr_t addr);
92
93 /**
94  * lmb_is_reserved_flags() - test if address is in reserved region with flag bits set
95  *
96  * The function checks if a reserved region comprising @addr exists which has
97  * all flag bits set which are set in @flags.
98  *
99  * @addr:       address to be tested
100  * @flags:      bitmap with bits to be tested
101  * Return:      1 if matching reservation exists, 0 otherwise
102  */
103 int lmb_is_reserved_flags(phys_addr_t addr, int flags);
104
105 long lmb_free(phys_addr_t base, phys_size_t size);
106
107 void lmb_dump_all(void);
108 void lmb_dump_all_force(void);
109
110 struct lmb *lmb_get(void);
111 int lmb_push(struct lmb *store);
112 void lmb_pop(struct lmb *store);
113
114 #endif /* __KERNEL__ */
115
116 #endif /* _LINUX_LMB_H */
This page took 0.031698 seconds and 4 git commands to generate.