xref: /rk3399_rockchip-uboot/include/sysmem.h (revision 50226c8f956b13577b22fb21175ebd0cdcf0b7ae)
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;
23*50226c8fSJoseph Chen 	struct list_head kmem_resv_head;
24ffa8f8b7SJoseph Chen 	ulong allocated_cnt;
25*50226c8fSJoseph Chen 	ulong kmem_resv_cnt;
266e15146eSJoseph Chen 	bool has_initf;
276e15146eSJoseph Chen 	bool has_initr;
28ffa8f8b7SJoseph Chen };
29ffa8f8b7SJoseph Chen 
306e15146eSJoseph Chen #ifdef CONFIG_SYSMEM
316e15146eSJoseph Chen /**
326e15146eSJoseph Chen  * sysmem_has_init() - Is sysmem initialized
336e15146eSJoseph Chen  *
346e15146eSJoseph Chen  * @return true or false
356e15146eSJoseph Chen  */
366e15146eSJoseph Chen bool sysmem_has_init(void);
376e15146eSJoseph Chen 
38ffa8f8b7SJoseph Chen /**
39ffa8f8b7SJoseph Chen  * sysmem_init() - Sysmem initialization
40ffa8f8b7SJoseph Chen  *
41ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
42ffa8f8b7SJoseph Chen  */
43ffa8f8b7SJoseph Chen int sysmem_init(void);
44ffa8f8b7SJoseph Chen 
45ffa8f8b7SJoseph Chen /**
466e15146eSJoseph Chen  * sysmem_initr() - Sysmem initialization after relocation
47ffa8f8b7SJoseph Chen  *
48ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
49ffa8f8b7SJoseph Chen  */
506e15146eSJoseph Chen int sysmem_initr(void);
51ffa8f8b7SJoseph Chen 
52ffa8f8b7SJoseph Chen /**
53ffa8f8b7SJoseph Chen  * sysmem_alloc() - Alloc sysmem region at anywhere
54ffa8f8b7SJoseph Chen  *
556e15146eSJoseph Chen  * @id: memblk id
56ffa8f8b7SJoseph Chen  * @size: region size
57ffa8f8b7SJoseph Chen  *
58ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
59ffa8f8b7SJoseph Chen  */
606e15146eSJoseph Chen void *sysmem_alloc(enum memblk_id id, phys_size_t size);
61ffa8f8b7SJoseph Chen 
62ffa8f8b7SJoseph Chen /**
63ffa8f8b7SJoseph Chen  * sysmem_alloc_base() - Alloc sysmem region at the expect addr
64ffa8f8b7SJoseph Chen  *
656e15146eSJoseph Chen  * @id: memblk id
66ffa8f8b7SJoseph Chen  * @base: region base
67ffa8f8b7SJoseph Chen  * @size: region size
68ffa8f8b7SJoseph Chen  *
69ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
70ffa8f8b7SJoseph Chen  */
716e15146eSJoseph Chen void *sysmem_alloc_base(enum memblk_id id, phys_addr_t base, phys_size_t size);
72ffa8f8b7SJoseph Chen 
73ffa8f8b7SJoseph Chen /**
746e15146eSJoseph Chen  * sysmem_alloc_base_by_name() - Alloc sysmem region at the expect addr by name
75ffa8f8b7SJoseph Chen  *
766e15146eSJoseph Chen  * @name: memblk name
77ffa8f8b7SJoseph Chen  * @base: region base
78ffa8f8b7SJoseph Chen  * @size: region size
79ffa8f8b7SJoseph Chen  *
80ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
81ffa8f8b7SJoseph Chen  */
826e15146eSJoseph Chen void *sysmem_alloc_base_by_name(const char *name,
836e15146eSJoseph Chen 				phys_addr_t base, phys_size_t size);
84ffa8f8b7SJoseph Chen 
85ffa8f8b7SJoseph Chen /**
866e15146eSJoseph Chen  * sysmem_fdt_reserve_alloc_base() - Alloc sysmem region at the expect addr by name,
876e15146eSJoseph Chen  *				     called only for reserve memory from fdt.
886e15146eSJoseph Chen  *
896e15146eSJoseph Chen  * @name: memblk name
906e15146eSJoseph Chen  * @base: region base
916e15146eSJoseph Chen  * @size: region size
926e15146eSJoseph Chen  *
936e15146eSJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
946e15146eSJoseph Chen  */
956e15146eSJoseph Chen void *sysmem_fdt_reserve_alloc_base(const char *name,
966e15146eSJoseph Chen 				    phys_addr_t base, phys_size_t size);
976e15146eSJoseph Chen 
986e15146eSJoseph Chen /**
993bee194fSJoseph Chen  * sysmem_can_alloc() - Check if the region can be allocated
1003bee194fSJoseph Chen  *
1013bee194fSJoseph Chen  * @base: region base
1023bee194fSJoseph Chen  * @size: region size
1033bee194fSJoseph Chen  *
1043bee194fSJoseph Chen  * @return true on okay.
1053bee194fSJoseph Chen  */
1063bee194fSJoseph Chen bool sysmem_can_alloc(phys_size_t base, phys_size_t size);
1073bee194fSJoseph Chen 
1083bee194fSJoseph Chen /**
1096e15146eSJoseph Chen  * sysmem_free() - Free allocated sysmem region
110ffa8f8b7SJoseph Chen  *
111ffa8f8b7SJoseph Chen  * @base: region base
112ffa8f8b7SJoseph Chen  *
113ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
114ffa8f8b7SJoseph Chen  */
115ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base);
116ffa8f8b7SJoseph Chen 
117ffa8f8b7SJoseph Chen /**
1182c66f6f3SJoseph Chen  * sysmem_dump() - Dump all sysmem region state
119ffa8f8b7SJoseph Chen  */
120ffa8f8b7SJoseph Chen void sysmem_dump(void);
121ffa8f8b7SJoseph Chen 
122ffa8f8b7SJoseph Chen /**
1232c66f6f3SJoseph Chen  * sysmem_overflow_check() - Sysmem regions overflow check
1242c66f6f3SJoseph Chen  */
1252c66f6f3SJoseph Chen void sysmem_overflow_check(void);
1262c66f6f3SJoseph Chen 
1272c66f6f3SJoseph Chen /**
128ffa8f8b7SJoseph Chen  * board_sysmem_reserve() - Weak function for board to implement
129ffa8f8b7SJoseph Chen  *
130ffa8f8b7SJoseph Chen  * @sysmem: global sysmem point, ignored
131ffa8f8b7SJoseph Chen  *
132ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
133ffa8f8b7SJoseph Chen  */
134ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem);
1356e15146eSJoseph Chen #else
1366e15146eSJoseph Chen static inline bool sysmem_has_init(void) { return false; }
1376e15146eSJoseph Chen static inline int sysmem_init(void) { return 0; }
1386e15146eSJoseph Chen static inline int sysmem_initr(void) { return 0; }
1396e15146eSJoseph Chen static inline int sysmem_free(phys_addr_t base) { return 0; }
1406e15146eSJoseph Chen static inline void sysmem_dump(void) {}
1412c66f6f3SJoseph Chen void sysmem_overflow_check(void) {}
1422c66f6f3SJoseph Chen 
1436e15146eSJoseph Chen __weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; }
144dcb404a6SJoseph Chen 
145dcb404a6SJoseph Chen static inline void *sysmem_alloc(enum memblk_id id, phys_size_t size)
146dcb404a6SJoseph Chen {
147dcb404a6SJoseph Chen 	return malloc(size);
148dcb404a6SJoseph Chen }
149dcb404a6SJoseph Chen 
1503bee194fSJoseph Chen static inline bool sysmem_can_alloc(phys_size_t base, phys_size_t size)
1513bee194fSJoseph Chen {
1523bee194fSJoseph Chen 	return true;
1533bee194fSJoseph Chen }
1543bee194fSJoseph Chen 
1556e15146eSJoseph Chen static inline void *sysmem_alloc_base(enum memblk_id id,
1566e15146eSJoseph Chen 				      phys_addr_t base, phys_size_t size)
1576e15146eSJoseph Chen {
1586e15146eSJoseph Chen 	return (void *)base;
1596e15146eSJoseph Chen }
1606e15146eSJoseph Chen static inline void *sysmem_alloc_base_by_name(const char *name,
1616e15146eSJoseph Chen 					      phys_addr_t base,
1626e15146eSJoseph Chen 					      phys_size_t size)
1636e15146eSJoseph Chen {
1646e15146eSJoseph Chen 	return (void *)base;
1656e15146eSJoseph Chen }
1666e15146eSJoseph Chen static inline void *sysmem_fdt_reserve_alloc_base(const char *name,
1676e15146eSJoseph Chen 						  phys_addr_t base,
1686e15146eSJoseph Chen 						  phys_size_t size)
1696e15146eSJoseph Chen {
1706e15146eSJoseph Chen 	return (void *)base;
1716e15146eSJoseph Chen }
1726e15146eSJoseph Chen #endif /* CONFIG_SYSMEM */
173ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */
174