xref: /rk3399_rockchip-uboot/include/sysmem.h (revision f3ff8d72ffe1e1fdf0a4370a783ad1e4156d0768)
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;
2350226c8fSJoseph Chen 	struct list_head kmem_resv_head;
24ffa8f8b7SJoseph Chen 	ulong allocated_cnt;
2550226c8fSJoseph 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 /**
63acffe332SJoseph Chen  * sysmem_alloc_by_name() - Alloc sysmem region by name at the expect addr
64acffe332SJoseph Chen  *
65acffe332SJoseph Chen  * @name: memblk name
66acffe332SJoseph Chen  * @size: region size
67acffe332SJoseph Chen  *
68acffe332SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
69acffe332SJoseph Chen  */
70acffe332SJoseph Chen void *sysmem_alloc_by_name(const char *name, phys_size_t size);
71acffe332SJoseph Chen 
72acffe332SJoseph Chen /**
73ffa8f8b7SJoseph Chen  * sysmem_alloc_base() - Alloc sysmem region at the expect addr
74ffa8f8b7SJoseph Chen  *
756e15146eSJoseph Chen  * @id: memblk id
76ffa8f8b7SJoseph Chen  * @base: region base
77ffa8f8b7SJoseph Chen  * @size: region size
78ffa8f8b7SJoseph Chen  *
79ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
80ffa8f8b7SJoseph Chen  */
816e15146eSJoseph Chen void *sysmem_alloc_base(enum memblk_id id, phys_addr_t base, phys_size_t size);
82ffa8f8b7SJoseph Chen 
83ffa8f8b7SJoseph Chen /**
846e15146eSJoseph Chen  * sysmem_alloc_base_by_name() - Alloc sysmem region at the expect addr by name
85ffa8f8b7SJoseph Chen  *
866e15146eSJoseph Chen  * @name: memblk name
87ffa8f8b7SJoseph Chen  * @base: region base
88ffa8f8b7SJoseph Chen  * @size: region size
89ffa8f8b7SJoseph Chen  *
90ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
91ffa8f8b7SJoseph Chen  */
926e15146eSJoseph Chen void *sysmem_alloc_base_by_name(const char *name,
936e15146eSJoseph Chen 				phys_addr_t base, phys_size_t size);
94ffa8f8b7SJoseph Chen 
95ffa8f8b7SJoseph Chen /**
966e15146eSJoseph Chen  * sysmem_fdt_reserve_alloc_base() - Alloc sysmem region at the expect addr by name,
976e15146eSJoseph Chen  *				     called only for reserve memory from fdt.
986e15146eSJoseph Chen  *
996e15146eSJoseph Chen  * @name: memblk name
1006e15146eSJoseph Chen  * @base: region base
1016e15146eSJoseph Chen  * @size: region size
1026e15146eSJoseph Chen  *
1036e15146eSJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
1046e15146eSJoseph Chen  */
1056e15146eSJoseph Chen void *sysmem_fdt_reserve_alloc_base(const char *name,
1066e15146eSJoseph Chen 				    phys_addr_t base, phys_size_t size);
1076e15146eSJoseph Chen 
1086e15146eSJoseph Chen /**
1093bee194fSJoseph Chen  * sysmem_can_alloc() - Check if the region can be allocated
1103bee194fSJoseph Chen  *
1113bee194fSJoseph Chen  * @base: region base
1123bee194fSJoseph Chen  * @size: region size
1133bee194fSJoseph Chen  *
1143bee194fSJoseph Chen  * @return true on okay.
1153bee194fSJoseph Chen  */
1163bee194fSJoseph Chen bool sysmem_can_alloc(phys_size_t base, phys_size_t size);
1173bee194fSJoseph Chen 
1183bee194fSJoseph Chen /**
1196e15146eSJoseph Chen  * sysmem_free() - Free allocated sysmem region
120ffa8f8b7SJoseph Chen  *
121ffa8f8b7SJoseph Chen  * @base: region base
122ffa8f8b7SJoseph Chen  *
123ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
124ffa8f8b7SJoseph Chen  */
125ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base);
126ffa8f8b7SJoseph Chen 
127ffa8f8b7SJoseph Chen /**
1282c66f6f3SJoseph Chen  * sysmem_dump() - Dump all sysmem region state
129ffa8f8b7SJoseph Chen  */
130ffa8f8b7SJoseph Chen void sysmem_dump(void);
131ffa8f8b7SJoseph Chen 
132ffa8f8b7SJoseph Chen /**
1332c66f6f3SJoseph Chen  * sysmem_overflow_check() - Sysmem regions overflow check
1342c66f6f3SJoseph Chen  */
1352c66f6f3SJoseph Chen void sysmem_overflow_check(void);
1362c66f6f3SJoseph Chen 
1372c66f6f3SJoseph Chen /**
138ffa8f8b7SJoseph Chen  * board_sysmem_reserve() - Weak function for board to implement
139ffa8f8b7SJoseph Chen  *
140ffa8f8b7SJoseph Chen  * @sysmem: global sysmem point, ignored
141ffa8f8b7SJoseph Chen  *
142ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
143ffa8f8b7SJoseph Chen  */
144ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem);
1456e15146eSJoseph Chen #else
1466e15146eSJoseph Chen static inline bool sysmem_has_init(void) { return false; }
1476e15146eSJoseph Chen static inline int sysmem_init(void) { return 0; }
1486e15146eSJoseph Chen static inline int sysmem_initr(void) { return 0; }
1496e15146eSJoseph Chen static inline int sysmem_free(phys_addr_t base) { return 0; }
1506e15146eSJoseph Chen static inline void sysmem_dump(void) {}
151*f3ff8d72SJoseph Chen static inline void sysmem_overflow_check(void) {}
1526e15146eSJoseph Chen __weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; }
153dcb404a6SJoseph Chen 
154dcb404a6SJoseph Chen static inline void *sysmem_alloc(enum memblk_id id, phys_size_t size)
155dcb404a6SJoseph Chen {
156dcb404a6SJoseph Chen 	return malloc(size);
157dcb404a6SJoseph Chen }
158dcb404a6SJoseph Chen 
1593bee194fSJoseph Chen static inline bool sysmem_can_alloc(phys_size_t base, phys_size_t size)
1603bee194fSJoseph Chen {
1613bee194fSJoseph Chen 	return true;
1623bee194fSJoseph Chen }
1633bee194fSJoseph Chen 
1646e15146eSJoseph Chen static inline void *sysmem_alloc_base(enum memblk_id id,
1656e15146eSJoseph Chen 				      phys_addr_t base, phys_size_t size)
1666e15146eSJoseph Chen {
1676e15146eSJoseph Chen 	return (void *)base;
1686e15146eSJoseph Chen }
1696e15146eSJoseph Chen static inline void *sysmem_alloc_base_by_name(const char *name,
1706e15146eSJoseph Chen 					      phys_addr_t base,
1716e15146eSJoseph Chen 					      phys_size_t size)
1726e15146eSJoseph Chen {
1736e15146eSJoseph Chen 	return (void *)base;
1746e15146eSJoseph Chen }
1756e15146eSJoseph Chen static inline void *sysmem_fdt_reserve_alloc_base(const char *name,
1766e15146eSJoseph Chen 						  phys_addr_t base,
1776e15146eSJoseph Chen 						  phys_size_t size)
1786e15146eSJoseph Chen {
1796e15146eSJoseph Chen 	return (void *)base;
1806e15146eSJoseph Chen }
1816e15146eSJoseph Chen #endif /* CONFIG_SYSMEM */
182ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */
183