xref: /rk3399_rockchip-uboot/include/sysmem.h (revision e9237ab5ed0b7532eb807e91f2c12b9ee8a15f51)
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 /**
109*e9237ab5SJoseph Chen  * sysmem_alloc_temporary_mem() - Alloc a temporary shared memory buffer
1103bee194fSJoseph Chen  *
1113bee194fSJoseph Chen  * @size: region size
1123bee194fSJoseph Chen  *
113*e9237ab5SJoseph Chen  * @return 0 on failed, otherwise allocated addr.
1143bee194fSJoseph Chen  */
115*e9237ab5SJoseph Chen ulong sysmem_alloc_temporary_mem(phys_size_t size);
1163bee194fSJoseph Chen 
1173bee194fSJoseph Chen /**
1186e15146eSJoseph Chen  * sysmem_free() - Free allocated sysmem region
119ffa8f8b7SJoseph Chen  *
120ffa8f8b7SJoseph Chen  * @base: region base
121ffa8f8b7SJoseph Chen  *
122ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
123ffa8f8b7SJoseph Chen  */
124ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base);
125ffa8f8b7SJoseph Chen 
126ffa8f8b7SJoseph Chen /**
1272c66f6f3SJoseph Chen  * sysmem_dump() - Dump all sysmem region state
128ffa8f8b7SJoseph Chen  */
129ffa8f8b7SJoseph Chen void sysmem_dump(void);
130ffa8f8b7SJoseph Chen 
131ffa8f8b7SJoseph Chen /**
1322c66f6f3SJoseph Chen  * sysmem_overflow_check() - Sysmem regions overflow check
1332c66f6f3SJoseph Chen  */
1342c66f6f3SJoseph Chen void sysmem_overflow_check(void);
1352c66f6f3SJoseph Chen 
1362c66f6f3SJoseph Chen /**
137ffa8f8b7SJoseph Chen  * board_sysmem_reserve() - Weak function for board to implement
138ffa8f8b7SJoseph Chen  *
139ffa8f8b7SJoseph Chen  * @sysmem: global sysmem point, ignored
140ffa8f8b7SJoseph Chen  *
141ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
142ffa8f8b7SJoseph Chen  */
143ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem);
1446e15146eSJoseph Chen #else
sysmem_has_init(void)1456e15146eSJoseph Chen static inline bool sysmem_has_init(void) { return false; }
sysmem_init(void)1466e15146eSJoseph Chen static inline int sysmem_init(void) { return 0; }
sysmem_initr(void)1476e15146eSJoseph Chen static inline int sysmem_initr(void) { return 0; }
sysmem_free(phys_addr_t base)1486e15146eSJoseph Chen static inline int sysmem_free(phys_addr_t base) { return 0; }
sysmem_dump(void)1496e15146eSJoseph Chen static inline void sysmem_dump(void) {}
sysmem_overflow_check(void)150f3ff8d72SJoseph Chen static inline void sysmem_overflow_check(void) {}
board_sysmem_reserve(struct sysmem * sysmem)1516e15146eSJoseph Chen __weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; }
152dcb404a6SJoseph Chen 
sysmem_alloc(enum memblk_id id,phys_size_t size)153dcb404a6SJoseph Chen static inline void *sysmem_alloc(enum memblk_id id, phys_size_t size)
154dcb404a6SJoseph Chen {
155dcb404a6SJoseph Chen 	return malloc(size);
156dcb404a6SJoseph Chen }
157dcb404a6SJoseph Chen 
sysmem_alloc_temporary_mem(phys_size_t size)158*e9237ab5SJoseph Chen static inline ulong sysmem_alloc_temporary_mem(phys_size_t size)
1593bee194fSJoseph Chen {
160*e9237ab5SJoseph Chen 	return 0;
1613bee194fSJoseph Chen }
1623bee194fSJoseph Chen 
sysmem_alloc_base(enum memblk_id id,phys_addr_t base,phys_size_t size)1636e15146eSJoseph Chen static inline void *sysmem_alloc_base(enum memblk_id id,
1646e15146eSJoseph Chen 				      phys_addr_t base, phys_size_t size)
1656e15146eSJoseph Chen {
1666e15146eSJoseph Chen 	return (void *)base;
1676e15146eSJoseph Chen }
sysmem_alloc_base_by_name(const char * name,phys_addr_t base,phys_size_t size)1686e15146eSJoseph Chen static inline void *sysmem_alloc_base_by_name(const char *name,
1696e15146eSJoseph Chen 					      phys_addr_t base,
1706e15146eSJoseph Chen 					      phys_size_t size)
1716e15146eSJoseph Chen {
1726e15146eSJoseph Chen 	return (void *)base;
1736e15146eSJoseph Chen }
sysmem_fdt_reserve_alloc_base(const char * name,phys_addr_t base,phys_size_t size)1746e15146eSJoseph Chen static inline void *sysmem_fdt_reserve_alloc_base(const char *name,
1756e15146eSJoseph Chen 						  phys_addr_t base,
1766e15146eSJoseph Chen 						  phys_size_t size)
1776e15146eSJoseph Chen {
1786e15146eSJoseph Chen 	return (void *)base;
1796e15146eSJoseph Chen }
1806e15146eSJoseph Chen #endif /* CONFIG_SYSMEM */
181ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */
182