xref: /rk3399_rockchip-uboot/include/sysmem.h (revision 6e15146effedeaad2a6687afcbf83d1907a0b996)
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 
9*6e15146eSJoseph Chen #include <memblk.h>
10ffa8f8b7SJoseph Chen 
112c9d1179SJoseph Chen /*
122c9d1179SJoseph Chen  * CONFIG_SYS_FDT_PAD default value is sync with bootm framework in:
132c9d1179SJoseph Chen  * common/image-fdt.c
142c9d1179SJoseph Chen  */
152c9d1179SJoseph Chen #ifndef CONFIG_SYS_FDT_PAD
162c9d1179SJoseph Chen #define CONFIG_SYS_FDT_PAD		0x3000
172c9d1179SJoseph Chen #endif
182c9d1179SJoseph Chen 
19ffa8f8b7SJoseph Chen struct sysmem {
20ffa8f8b7SJoseph Chen 	struct lmb lmb;
21ffa8f8b7SJoseph Chen 	struct list_head allocated_head;
22ffa8f8b7SJoseph Chen 	ulong allocated_cnt;
23*6e15146eSJoseph Chen 	bool has_initf;
24*6e15146eSJoseph Chen 	bool has_initr;
25ffa8f8b7SJoseph Chen };
26ffa8f8b7SJoseph Chen 
27*6e15146eSJoseph Chen #ifdef CONFIG_SYSMEM
28*6e15146eSJoseph Chen /**
29*6e15146eSJoseph Chen  * sysmem_has_init() - Is sysmem initialized
30*6e15146eSJoseph Chen  *
31*6e15146eSJoseph Chen  * @return true or false
32*6e15146eSJoseph Chen  */
33*6e15146eSJoseph Chen bool sysmem_has_init(void);
34*6e15146eSJoseph Chen 
35ffa8f8b7SJoseph Chen /**
36ffa8f8b7SJoseph Chen  * sysmem_init() - Sysmem initialization
37ffa8f8b7SJoseph Chen  *
38ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
39ffa8f8b7SJoseph Chen  */
40ffa8f8b7SJoseph Chen int sysmem_init(void);
41ffa8f8b7SJoseph Chen 
42ffa8f8b7SJoseph Chen /**
43*6e15146eSJoseph Chen  * sysmem_initr() - Sysmem initialization after relocation
44ffa8f8b7SJoseph Chen  *
45ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
46ffa8f8b7SJoseph Chen  */
47*6e15146eSJoseph Chen int sysmem_initr(void);
48ffa8f8b7SJoseph Chen 
49ffa8f8b7SJoseph Chen /**
50ffa8f8b7SJoseph Chen  * sysmem_alloc() - Alloc sysmem region at anywhere
51ffa8f8b7SJoseph Chen  *
52*6e15146eSJoseph Chen  * @id: memblk id
53ffa8f8b7SJoseph Chen  * @size: region size
54ffa8f8b7SJoseph Chen  *
55ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
56ffa8f8b7SJoseph Chen  */
57*6e15146eSJoseph Chen void *sysmem_alloc(enum memblk_id id, phys_size_t size);
58ffa8f8b7SJoseph Chen 
59ffa8f8b7SJoseph Chen /**
60ffa8f8b7SJoseph Chen  * sysmem_alloc_base() - Alloc sysmem region at the expect addr
61ffa8f8b7SJoseph Chen  *
62*6e15146eSJoseph Chen  * @id: memblk id
63ffa8f8b7SJoseph Chen  * @base: region base
64ffa8f8b7SJoseph Chen  * @size: region size
65ffa8f8b7SJoseph Chen  *
66ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
67ffa8f8b7SJoseph Chen  */
68*6e15146eSJoseph Chen void *sysmem_alloc_base(enum memblk_id id, phys_addr_t base, phys_size_t size);
69ffa8f8b7SJoseph Chen 
70ffa8f8b7SJoseph Chen /**
71*6e15146eSJoseph Chen  * sysmem_alloc_base_by_name() - Alloc sysmem region at the expect addr by name
72ffa8f8b7SJoseph Chen  *
73*6e15146eSJoseph Chen  * @name: memblk name
74ffa8f8b7SJoseph Chen  * @base: region base
75ffa8f8b7SJoseph Chen  * @size: region size
76ffa8f8b7SJoseph Chen  *
77ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
78ffa8f8b7SJoseph Chen  */
79*6e15146eSJoseph Chen void *sysmem_alloc_base_by_name(const char *name,
80*6e15146eSJoseph Chen 				phys_addr_t base, phys_size_t size);
81ffa8f8b7SJoseph Chen 
82ffa8f8b7SJoseph Chen /**
83*6e15146eSJoseph Chen  * sysmem_fdt_reserve_alloc_base() - Alloc sysmem region at the expect addr by name,
84*6e15146eSJoseph Chen  *				     called only for reserve memory from fdt.
85*6e15146eSJoseph Chen  *
86*6e15146eSJoseph Chen  * @name: memblk name
87*6e15146eSJoseph Chen  * @base: region base
88*6e15146eSJoseph Chen  * @size: region size
89*6e15146eSJoseph Chen  *
90*6e15146eSJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
91*6e15146eSJoseph Chen  */
92*6e15146eSJoseph Chen void *sysmem_fdt_reserve_alloc_base(const char *name,
93*6e15146eSJoseph Chen 				    phys_addr_t base, phys_size_t size);
94*6e15146eSJoseph Chen 
95*6e15146eSJoseph Chen /**
96*6e15146eSJoseph Chen  * sysmem_free() - Free allocated sysmem region
97ffa8f8b7SJoseph Chen  *
98ffa8f8b7SJoseph Chen  * @base: region base
99ffa8f8b7SJoseph Chen  *
100ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
101ffa8f8b7SJoseph Chen  */
102ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base);
103ffa8f8b7SJoseph Chen 
104ffa8f8b7SJoseph Chen /**
105*6e15146eSJoseph Chen  * sysmem_dump() - Dump all sysmem region state and check overflow
106ffa8f8b7SJoseph Chen  */
107ffa8f8b7SJoseph Chen void sysmem_dump(void);
108ffa8f8b7SJoseph Chen 
109ffa8f8b7SJoseph Chen /**
110ffa8f8b7SJoseph Chen  * board_sysmem_reserve() - Weak function for board to implement
111ffa8f8b7SJoseph Chen  *
112ffa8f8b7SJoseph Chen  * @sysmem: global sysmem point, ignored
113ffa8f8b7SJoseph Chen  *
114ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
115ffa8f8b7SJoseph Chen  */
116ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem);
117*6e15146eSJoseph Chen #else
118*6e15146eSJoseph Chen static inline bool sysmem_has_init(void) { return false; }
119*6e15146eSJoseph Chen static inline int sysmem_init(void) { return 0; }
120*6e15146eSJoseph Chen static inline int sysmem_initr(void) { return 0; }
121*6e15146eSJoseph Chen static inline int sysmem_free(phys_addr_t base) { return 0; }
122*6e15146eSJoseph Chen static inline void sysmem_dump(void) {}
123*6e15146eSJoseph Chen __weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; }
124*6e15146eSJoseph Chen static inline void *sysmem_alloc_base(enum memblk_id id,
125*6e15146eSJoseph Chen 				      phys_addr_t base, phys_size_t size)
126*6e15146eSJoseph Chen {
127*6e15146eSJoseph Chen 	return (void *)base;
128*6e15146eSJoseph Chen }
129*6e15146eSJoseph Chen static inline void *sysmem_alloc_base_by_name(const char *name,
130*6e15146eSJoseph Chen 					      phys_addr_t base,
131*6e15146eSJoseph Chen 					      phys_size_t size)
132*6e15146eSJoseph Chen {
133*6e15146eSJoseph Chen 	return (void *)base;
134*6e15146eSJoseph Chen }
135*6e15146eSJoseph Chen static inline void *sysmem_fdt_reserve_alloc_base(const char *name,
136*6e15146eSJoseph Chen 						  phys_addr_t base,
137*6e15146eSJoseph Chen 						  phys_size_t size)
138*6e15146eSJoseph Chen {
139*6e15146eSJoseph Chen 	return (void *)base;
140*6e15146eSJoseph Chen }
141*6e15146eSJoseph Chen #endif /* CONFIG_SYSMEM */
142ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */
143