xref: /rk3399_rockchip-uboot/include/sysmem.h (revision dcb404a6770682d7f913c9e6579f4c39a917ff15)
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 
96e15146eSJoseph Chen #include <memblk.h>
10*dcb404a6SJoseph Chen #include <malloc.h>
11ffa8f8b7SJoseph Chen 
122c9d1179SJoseph Chen /*
132c9d1179SJoseph Chen  * CONFIG_SYS_FDT_PAD default value is sync with bootm framework in:
142c9d1179SJoseph Chen  * common/image-fdt.c
152c9d1179SJoseph Chen  */
162c9d1179SJoseph Chen #ifndef CONFIG_SYS_FDT_PAD
172c9d1179SJoseph Chen #define CONFIG_SYS_FDT_PAD		0x3000
182c9d1179SJoseph Chen #endif
192c9d1179SJoseph Chen 
20ffa8f8b7SJoseph Chen struct sysmem {
21ffa8f8b7SJoseph Chen 	struct lmb lmb;
22ffa8f8b7SJoseph Chen 	struct list_head allocated_head;
23ffa8f8b7SJoseph Chen 	ulong allocated_cnt;
246e15146eSJoseph Chen 	bool has_initf;
256e15146eSJoseph Chen 	bool has_initr;
26ffa8f8b7SJoseph Chen };
27ffa8f8b7SJoseph Chen 
286e15146eSJoseph Chen #ifdef CONFIG_SYSMEM
296e15146eSJoseph Chen /**
306e15146eSJoseph Chen  * sysmem_has_init() - Is sysmem initialized
316e15146eSJoseph Chen  *
326e15146eSJoseph Chen  * @return true or false
336e15146eSJoseph Chen  */
346e15146eSJoseph Chen bool sysmem_has_init(void);
356e15146eSJoseph Chen 
36ffa8f8b7SJoseph Chen /**
37ffa8f8b7SJoseph Chen  * sysmem_init() - Sysmem initialization
38ffa8f8b7SJoseph Chen  *
39ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
40ffa8f8b7SJoseph Chen  */
41ffa8f8b7SJoseph Chen int sysmem_init(void);
42ffa8f8b7SJoseph Chen 
43ffa8f8b7SJoseph Chen /**
446e15146eSJoseph Chen  * sysmem_initr() - Sysmem initialization after relocation
45ffa8f8b7SJoseph Chen  *
46ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
47ffa8f8b7SJoseph Chen  */
486e15146eSJoseph Chen int sysmem_initr(void);
49ffa8f8b7SJoseph Chen 
50ffa8f8b7SJoseph Chen /**
51ffa8f8b7SJoseph Chen  * sysmem_alloc() - Alloc sysmem region at anywhere
52ffa8f8b7SJoseph Chen  *
536e15146eSJoseph Chen  * @id: memblk id
54ffa8f8b7SJoseph Chen  * @size: region size
55ffa8f8b7SJoseph Chen  *
56ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
57ffa8f8b7SJoseph Chen  */
586e15146eSJoseph Chen void *sysmem_alloc(enum memblk_id id, phys_size_t size);
59ffa8f8b7SJoseph Chen 
60ffa8f8b7SJoseph Chen /**
61ffa8f8b7SJoseph Chen  * sysmem_alloc_base() - Alloc sysmem region at the expect addr
62ffa8f8b7SJoseph Chen  *
636e15146eSJoseph Chen  * @id: memblk id
64ffa8f8b7SJoseph Chen  * @base: region base
65ffa8f8b7SJoseph Chen  * @size: region size
66ffa8f8b7SJoseph Chen  *
67ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
68ffa8f8b7SJoseph Chen  */
696e15146eSJoseph Chen void *sysmem_alloc_base(enum memblk_id id, phys_addr_t base, phys_size_t size);
70ffa8f8b7SJoseph Chen 
71ffa8f8b7SJoseph Chen /**
726e15146eSJoseph Chen  * sysmem_alloc_base_by_name() - Alloc sysmem region at the expect addr by name
73ffa8f8b7SJoseph Chen  *
746e15146eSJoseph Chen  * @name: memblk name
75ffa8f8b7SJoseph Chen  * @base: region base
76ffa8f8b7SJoseph Chen  * @size: region size
77ffa8f8b7SJoseph Chen  *
78ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
79ffa8f8b7SJoseph Chen  */
806e15146eSJoseph Chen void *sysmem_alloc_base_by_name(const char *name,
816e15146eSJoseph Chen 				phys_addr_t base, phys_size_t size);
82ffa8f8b7SJoseph Chen 
83ffa8f8b7SJoseph Chen /**
846e15146eSJoseph Chen  * sysmem_fdt_reserve_alloc_base() - Alloc sysmem region at the expect addr by name,
856e15146eSJoseph Chen  *				     called only for reserve memory from fdt.
866e15146eSJoseph Chen  *
876e15146eSJoseph Chen  * @name: memblk name
886e15146eSJoseph Chen  * @base: region base
896e15146eSJoseph Chen  * @size: region size
906e15146eSJoseph Chen  *
916e15146eSJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
926e15146eSJoseph Chen  */
936e15146eSJoseph Chen void *sysmem_fdt_reserve_alloc_base(const char *name,
946e15146eSJoseph Chen 				    phys_addr_t base, phys_size_t size);
956e15146eSJoseph Chen 
966e15146eSJoseph Chen /**
976e15146eSJoseph Chen  * sysmem_free() - Free allocated sysmem region
98ffa8f8b7SJoseph Chen  *
99ffa8f8b7SJoseph Chen  * @base: region base
100ffa8f8b7SJoseph Chen  *
101ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
102ffa8f8b7SJoseph Chen  */
103ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base);
104ffa8f8b7SJoseph Chen 
105ffa8f8b7SJoseph Chen /**
1066e15146eSJoseph Chen  * sysmem_dump() - Dump all sysmem region state and check overflow
107ffa8f8b7SJoseph Chen  */
108ffa8f8b7SJoseph Chen void sysmem_dump(void);
109ffa8f8b7SJoseph Chen 
110ffa8f8b7SJoseph Chen /**
111ffa8f8b7SJoseph Chen  * board_sysmem_reserve() - Weak function for board to implement
112ffa8f8b7SJoseph Chen  *
113ffa8f8b7SJoseph Chen  * @sysmem: global sysmem point, ignored
114ffa8f8b7SJoseph Chen  *
115ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
116ffa8f8b7SJoseph Chen  */
117ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem);
1186e15146eSJoseph Chen #else
1196e15146eSJoseph Chen static inline bool sysmem_has_init(void) { return false; }
1206e15146eSJoseph Chen static inline int sysmem_init(void) { return 0; }
1216e15146eSJoseph Chen static inline int sysmem_initr(void) { return 0; }
1226e15146eSJoseph Chen static inline int sysmem_free(phys_addr_t base) { return 0; }
1236e15146eSJoseph Chen static inline void sysmem_dump(void) {}
1246e15146eSJoseph Chen __weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; }
125*dcb404a6SJoseph Chen 
126*dcb404a6SJoseph Chen static inline void *sysmem_alloc(enum memblk_id id, phys_size_t size)
127*dcb404a6SJoseph Chen {
128*dcb404a6SJoseph Chen 	return malloc(size);
129*dcb404a6SJoseph Chen }
130*dcb404a6SJoseph Chen 
1316e15146eSJoseph Chen static inline void *sysmem_alloc_base(enum memblk_id id,
1326e15146eSJoseph Chen 				      phys_addr_t base, phys_size_t size)
1336e15146eSJoseph Chen {
1346e15146eSJoseph Chen 	return (void *)base;
1356e15146eSJoseph Chen }
1366e15146eSJoseph Chen static inline void *sysmem_alloc_base_by_name(const char *name,
1376e15146eSJoseph Chen 					      phys_addr_t base,
1386e15146eSJoseph Chen 					      phys_size_t size)
1396e15146eSJoseph Chen {
1406e15146eSJoseph Chen 	return (void *)base;
1416e15146eSJoseph Chen }
1426e15146eSJoseph Chen static inline void *sysmem_fdt_reserve_alloc_base(const char *name,
1436e15146eSJoseph Chen 						  phys_addr_t base,
1446e15146eSJoseph Chen 						  phys_size_t size)
1456e15146eSJoseph Chen {
1466e15146eSJoseph Chen 	return (void *)base;
1476e15146eSJoseph Chen }
1486e15146eSJoseph Chen #endif /* CONFIG_SYSMEM */
149ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */
150