xref: /rk3399_rockchip-uboot/include/sysmem.h (revision 2c66f6f37e202feb856b17b93ee024e0fe082e56)
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>
10dcb404a6SJoseph 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 /**
973bee194fSJoseph Chen  * sysmem_can_alloc() - Check if the region can be allocated
983bee194fSJoseph Chen  *
993bee194fSJoseph Chen  * @base: region base
1003bee194fSJoseph Chen  * @size: region size
1013bee194fSJoseph Chen  *
1023bee194fSJoseph Chen  * @return true on okay.
1033bee194fSJoseph Chen  */
1043bee194fSJoseph Chen bool sysmem_can_alloc(phys_size_t base, phys_size_t size);
1053bee194fSJoseph Chen 
1063bee194fSJoseph Chen /**
1076e15146eSJoseph Chen  * sysmem_free() - Free allocated sysmem region
108ffa8f8b7SJoseph Chen  *
109ffa8f8b7SJoseph Chen  * @base: region base
110ffa8f8b7SJoseph Chen  *
111ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
112ffa8f8b7SJoseph Chen  */
113ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base);
114ffa8f8b7SJoseph Chen 
115ffa8f8b7SJoseph Chen /**
116*2c66f6f3SJoseph Chen  * sysmem_dump() - Dump all sysmem region state
117ffa8f8b7SJoseph Chen  */
118ffa8f8b7SJoseph Chen void sysmem_dump(void);
119ffa8f8b7SJoseph Chen 
120ffa8f8b7SJoseph Chen /**
121*2c66f6f3SJoseph Chen  * sysmem_overflow_check() - Sysmem regions overflow check
122*2c66f6f3SJoseph Chen  */
123*2c66f6f3SJoseph Chen void sysmem_overflow_check(void);
124*2c66f6f3SJoseph Chen 
125*2c66f6f3SJoseph Chen /**
126ffa8f8b7SJoseph Chen  * board_sysmem_reserve() - Weak function for board to implement
127ffa8f8b7SJoseph Chen  *
128ffa8f8b7SJoseph Chen  * @sysmem: global sysmem point, ignored
129ffa8f8b7SJoseph Chen  *
130ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
131ffa8f8b7SJoseph Chen  */
132ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem);
1336e15146eSJoseph Chen #else
1346e15146eSJoseph Chen static inline bool sysmem_has_init(void) { return false; }
1356e15146eSJoseph Chen static inline int sysmem_init(void) { return 0; }
1366e15146eSJoseph Chen static inline int sysmem_initr(void) { return 0; }
1376e15146eSJoseph Chen static inline int sysmem_free(phys_addr_t base) { return 0; }
1386e15146eSJoseph Chen static inline void sysmem_dump(void) {}
139*2c66f6f3SJoseph Chen void sysmem_overflow_check(void) {}
140*2c66f6f3SJoseph Chen 
1416e15146eSJoseph Chen __weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; }
142dcb404a6SJoseph Chen 
143dcb404a6SJoseph Chen static inline void *sysmem_alloc(enum memblk_id id, phys_size_t size)
144dcb404a6SJoseph Chen {
145dcb404a6SJoseph Chen 	return malloc(size);
146dcb404a6SJoseph Chen }
147dcb404a6SJoseph Chen 
1483bee194fSJoseph Chen static inline bool sysmem_can_alloc(phys_size_t base, phys_size_t size)
1493bee194fSJoseph Chen {
1503bee194fSJoseph Chen 	return true;
1513bee194fSJoseph Chen }
1523bee194fSJoseph Chen 
1536e15146eSJoseph Chen static inline void *sysmem_alloc_base(enum memblk_id id,
1546e15146eSJoseph Chen 				      phys_addr_t base, phys_size_t size)
1556e15146eSJoseph Chen {
1566e15146eSJoseph Chen 	return (void *)base;
1576e15146eSJoseph Chen }
1586e15146eSJoseph Chen static inline void *sysmem_alloc_base_by_name(const char *name,
1596e15146eSJoseph Chen 					      phys_addr_t base,
1606e15146eSJoseph Chen 					      phys_size_t size)
1616e15146eSJoseph Chen {
1626e15146eSJoseph Chen 	return (void *)base;
1636e15146eSJoseph Chen }
1646e15146eSJoseph Chen static inline void *sysmem_fdt_reserve_alloc_base(const char *name,
1656e15146eSJoseph Chen 						  phys_addr_t base,
1666e15146eSJoseph Chen 						  phys_size_t size)
1676e15146eSJoseph Chen {
1686e15146eSJoseph Chen 	return (void *)base;
1696e15146eSJoseph Chen }
1706e15146eSJoseph Chen #endif /* CONFIG_SYSMEM */
171ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */
172