xref: /rk3399_rockchip-uboot/include/sysmem.h (revision 2c9d117912719dca97b8973eeed469b5fa5dce1a)
1ffa8f8b7SJoseph Chen /* SPDX-License-Identifier:     GPL-2.0+ */
2ffa8f8b7SJoseph Chen /*
3ffa8f8b7SJoseph Chen  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
4ffa8f8b7SJoseph Chen  */
5ffa8f8b7SJoseph Chen 
6ffa8f8b7SJoseph Chen #ifndef _SYSMEM_H
7ffa8f8b7SJoseph Chen #define _SYSMEM_H
8ffa8f8b7SJoseph Chen 
9ffa8f8b7SJoseph Chen #include <asm/types.h>
10ffa8f8b7SJoseph Chen 
11ffa8f8b7SJoseph Chen #define	MAX_SYSMEM_REGIONS		64
12ffa8f8b7SJoseph Chen 
13ffa8f8b7SJoseph Chen #undef	MAX_LMB_REGIONS
14ffa8f8b7SJoseph Chen #define	MAX_LMB_REGIONS			MAX_SYSMEM_REGIONS
15ffa8f8b7SJoseph Chen 
16*2c9d1179SJoseph Chen /*
17*2c9d1179SJoseph Chen  * CONFIG_SYS_FDT_PAD default value is sync with bootm framework in:
18*2c9d1179SJoseph Chen  * common/image-fdt.c
19*2c9d1179SJoseph Chen  */
20*2c9d1179SJoseph Chen #ifndef CONFIG_SYS_FDT_PAD
21*2c9d1179SJoseph Chen #define CONFIG_SYS_FDT_PAD		0x3000
22*2c9d1179SJoseph Chen #endif
23*2c9d1179SJoseph Chen 
24ffa8f8b7SJoseph Chen struct sysmem_property {
25ffa8f8b7SJoseph Chen 	const char *name;
26ffa8f8b7SJoseph Chen 	phys_addr_t base;
27ffa8f8b7SJoseph Chen 	phys_size_t size;
28ffa8f8b7SJoseph Chen 	struct list_head node;
29ffa8f8b7SJoseph Chen };
30ffa8f8b7SJoseph Chen 
31ffa8f8b7SJoseph Chen struct sysmem {
32ffa8f8b7SJoseph Chen 	struct lmb lmb;
33ffa8f8b7SJoseph Chen 	struct list_head allocated_head;
34ffa8f8b7SJoseph Chen 	struct list_head reserved_head;
35ffa8f8b7SJoseph Chen 	ulong allocated_cnt;
36ffa8f8b7SJoseph Chen 	bool has_init;
37ffa8f8b7SJoseph Chen };
38ffa8f8b7SJoseph Chen 
39ffa8f8b7SJoseph Chen /**
40ffa8f8b7SJoseph Chen  * sysmem_init() - Sysmem initialization
41ffa8f8b7SJoseph Chen  *
42ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
43ffa8f8b7SJoseph Chen  */
44ffa8f8b7SJoseph Chen int sysmem_init(void);
45ffa8f8b7SJoseph Chen 
46ffa8f8b7SJoseph Chen /**
47ffa8f8b7SJoseph Chen  * sysmem_add() - Add sysmem region
48ffa8f8b7SJoseph Chen  *
49ffa8f8b7SJoseph Chen  * @base: region base address
50ffa8f8b7SJoseph Chen  * @size: region size
51ffa8f8b7SJoseph Chen  *
52ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
53ffa8f8b7SJoseph Chen  */
54ffa8f8b7SJoseph Chen int sysmem_add(phys_addr_t base, phys_size_t size);
55ffa8f8b7SJoseph Chen 
56ffa8f8b7SJoseph Chen /**
57ffa8f8b7SJoseph Chen  * sysmem_reserve() - Reserve sysmem region
58ffa8f8b7SJoseph Chen  *
59ffa8f8b7SJoseph Chen  * @name: region name
60ffa8f8b7SJoseph Chen  * @base: region base address
61ffa8f8b7SJoseph Chen  * @size: region size
62ffa8f8b7SJoseph Chen  *
63ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
64ffa8f8b7SJoseph Chen  */
65ffa8f8b7SJoseph Chen int sysmem_reserve(const char *name, phys_addr_t base, phys_size_t size);
66ffa8f8b7SJoseph Chen 
67ffa8f8b7SJoseph Chen /**
68ffa8f8b7SJoseph Chen  * sysmem_alloc() - Alloc sysmem region at anywhere
69ffa8f8b7SJoseph Chen  *
70ffa8f8b7SJoseph Chen  * @name: region name
71ffa8f8b7SJoseph Chen  * @size: region size
72ffa8f8b7SJoseph Chen  *
73ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
74ffa8f8b7SJoseph Chen  */
75ffa8f8b7SJoseph Chen void *sysmem_alloc(const char *name, phys_size_t size);
76ffa8f8b7SJoseph Chen 
77ffa8f8b7SJoseph Chen /**
78ffa8f8b7SJoseph Chen  * sysmem_alloc_align() - Alloc sysmem region at anywhere with addr align down
79ffa8f8b7SJoseph Chen  *
80ffa8f8b7SJoseph Chen  * @name: region name
81ffa8f8b7SJoseph Chen  * @size: region size
82ffa8f8b7SJoseph Chen  * @align: region base address align (down)
83ffa8f8b7SJoseph Chen  *
84ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
85ffa8f8b7SJoseph Chen  */
86ffa8f8b7SJoseph Chen void *sysmem_alloc_align(const char *name, phys_size_t size, ulong align);
87ffa8f8b7SJoseph Chen 
88ffa8f8b7SJoseph Chen /**
89ffa8f8b7SJoseph Chen  * sysmem_alloc_base() - Alloc sysmem region at the expect addr
90ffa8f8b7SJoseph Chen  *
91ffa8f8b7SJoseph Chen  * @name: region name
92ffa8f8b7SJoseph Chen  * @base: region base
93ffa8f8b7SJoseph Chen  * @size: region size
94ffa8f8b7SJoseph Chen  *
95ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
96ffa8f8b7SJoseph Chen  */
97ffa8f8b7SJoseph Chen void *sysmem_alloc_base(const char *name, phys_addr_t base, phys_size_t size);
98ffa8f8b7SJoseph Chen 
99ffa8f8b7SJoseph Chen /**
100ffa8f8b7SJoseph Chen  * sysmem_alloc_align_base() - Alloc sysmem region at the expect addr with align down
101ffa8f8b7SJoseph Chen  *
102ffa8f8b7SJoseph Chen  * @name: region name
103ffa8f8b7SJoseph Chen  * @base: region base
104ffa8f8b7SJoseph Chen  * @size: region size
105ffa8f8b7SJoseph Chen  * @align: region base address align (down)
106ffa8f8b7SJoseph Chen  *
107ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
108ffa8f8b7SJoseph Chen  */
109ffa8f8b7SJoseph Chen void *sysmem_alloc_align_base(const char *name, phys_addr_t base,
110ffa8f8b7SJoseph Chen 			      phys_size_t size, ulong align);
111ffa8f8b7SJoseph Chen 
112ffa8f8b7SJoseph Chen /**
113ffa8f8b7SJoseph Chen  * sysmem_free() - Free sysmem region
114ffa8f8b7SJoseph Chen  *
115ffa8f8b7SJoseph Chen  * @base: region base
116ffa8f8b7SJoseph Chen  *
117ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
118ffa8f8b7SJoseph Chen  */
119ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base);
120ffa8f8b7SJoseph Chen 
121ffa8f8b7SJoseph Chen /**
122ffa8f8b7SJoseph Chen  * sysmem_check() - Check sysmem regions
123ffa8f8b7SJoseph Chen  *
124ffa8f8b7SJoseph Chen  * @return 0 on okay, otherwise something wrong
125ffa8f8b7SJoseph Chen  */
126ffa8f8b7SJoseph Chen int sysmem_check(void);
127ffa8f8b7SJoseph Chen 
128ffa8f8b7SJoseph Chen /**
129ffa8f8b7SJoseph Chen  * sysmem_dump_all() - Dump all sysmem stat
130ffa8f8b7SJoseph Chen  */
131ffa8f8b7SJoseph Chen void sysmem_dump(void);
132ffa8f8b7SJoseph Chen 
133ffa8f8b7SJoseph Chen /**
134ffa8f8b7SJoseph Chen  * sysmem_dump_check() - Dump all sysmem stat and check overflow
135ffa8f8b7SJoseph Chen  */
136ffa8f8b7SJoseph Chen int sysmem_dump_check(void);
137ffa8f8b7SJoseph Chen 
138ffa8f8b7SJoseph Chen /**
139ffa8f8b7SJoseph Chen  * board_sysmem_reserve() - Weak function for board to implement
140ffa8f8b7SJoseph Chen  *
141ffa8f8b7SJoseph Chen  * @sysmem: global sysmem point, ignored
142ffa8f8b7SJoseph Chen  *
143ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
144ffa8f8b7SJoseph Chen  */
145ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem);
146ffa8f8b7SJoseph Chen 
147ffa8f8b7SJoseph Chen /**
148ffa8f8b7SJoseph Chen  * arch_sysmem_reserve() - Weak function for arch to implement
149ffa8f8b7SJoseph Chen  *
150ffa8f8b7SJoseph Chen  * @sysmem: global sysmem point, ignored
151ffa8f8b7SJoseph Chen  *
152ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
153ffa8f8b7SJoseph Chen  */
154ffa8f8b7SJoseph Chen int arch_sysmem_reserve(struct sysmem *sysmem);
155ffa8f8b7SJoseph Chen 
156ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */
157