xref: /rk3399_rockchip-uboot/include/sysmem.h (revision ffa8f8b76ea89ab65082d036dfb58c7fb136d861)
1*ffa8f8b7SJoseph Chen /* SPDX-License-Identifier:     GPL-2.0+ */
2*ffa8f8b7SJoseph Chen /*
3*ffa8f8b7SJoseph Chen  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
4*ffa8f8b7SJoseph Chen  */
5*ffa8f8b7SJoseph Chen 
6*ffa8f8b7SJoseph Chen #ifndef _SYSMEM_H
7*ffa8f8b7SJoseph Chen #define _SYSMEM_H
8*ffa8f8b7SJoseph Chen 
9*ffa8f8b7SJoseph Chen #include <asm/types.h>
10*ffa8f8b7SJoseph Chen 
11*ffa8f8b7SJoseph Chen #define	MAX_SYSMEM_REGIONS		64
12*ffa8f8b7SJoseph Chen 
13*ffa8f8b7SJoseph Chen #undef	MAX_LMB_REGIONS
14*ffa8f8b7SJoseph Chen #define	MAX_LMB_REGIONS			MAX_SYSMEM_REGIONS
15*ffa8f8b7SJoseph Chen 
16*ffa8f8b7SJoseph Chen struct sysmem_property {
17*ffa8f8b7SJoseph Chen 	const char *name;
18*ffa8f8b7SJoseph Chen 	phys_addr_t base;
19*ffa8f8b7SJoseph Chen 	phys_size_t size;
20*ffa8f8b7SJoseph Chen 	struct list_head node;
21*ffa8f8b7SJoseph Chen };
22*ffa8f8b7SJoseph Chen 
23*ffa8f8b7SJoseph Chen struct sysmem {
24*ffa8f8b7SJoseph Chen 	struct lmb lmb;
25*ffa8f8b7SJoseph Chen 	struct list_head allocated_head;
26*ffa8f8b7SJoseph Chen 	struct list_head reserved_head;
27*ffa8f8b7SJoseph Chen 	ulong allocated_cnt;
28*ffa8f8b7SJoseph Chen 	bool has_init;
29*ffa8f8b7SJoseph Chen };
30*ffa8f8b7SJoseph Chen 
31*ffa8f8b7SJoseph Chen /**
32*ffa8f8b7SJoseph Chen  * sysmem_init() - Sysmem initialization
33*ffa8f8b7SJoseph Chen  *
34*ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
35*ffa8f8b7SJoseph Chen  */
36*ffa8f8b7SJoseph Chen int sysmem_init(void);
37*ffa8f8b7SJoseph Chen 
38*ffa8f8b7SJoseph Chen /**
39*ffa8f8b7SJoseph Chen  * sysmem_add() - Add sysmem region
40*ffa8f8b7SJoseph Chen  *
41*ffa8f8b7SJoseph Chen  * @base: region base address
42*ffa8f8b7SJoseph Chen  * @size: region size
43*ffa8f8b7SJoseph Chen  *
44*ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
45*ffa8f8b7SJoseph Chen  */
46*ffa8f8b7SJoseph Chen int sysmem_add(phys_addr_t base, phys_size_t size);
47*ffa8f8b7SJoseph Chen 
48*ffa8f8b7SJoseph Chen /**
49*ffa8f8b7SJoseph Chen  * sysmem_reserve() - Reserve sysmem region
50*ffa8f8b7SJoseph Chen  *
51*ffa8f8b7SJoseph Chen  * @name: region name
52*ffa8f8b7SJoseph Chen  * @base: region base address
53*ffa8f8b7SJoseph Chen  * @size: region size
54*ffa8f8b7SJoseph Chen  *
55*ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
56*ffa8f8b7SJoseph Chen  */
57*ffa8f8b7SJoseph Chen int sysmem_reserve(const char *name, phys_addr_t base, phys_size_t size);
58*ffa8f8b7SJoseph Chen 
59*ffa8f8b7SJoseph Chen /**
60*ffa8f8b7SJoseph Chen  * sysmem_alloc() - Alloc sysmem region at anywhere
61*ffa8f8b7SJoseph Chen  *
62*ffa8f8b7SJoseph Chen  * @name: region name
63*ffa8f8b7SJoseph Chen  * @size: region size
64*ffa8f8b7SJoseph Chen  *
65*ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
66*ffa8f8b7SJoseph Chen  */
67*ffa8f8b7SJoseph Chen void *sysmem_alloc(const char *name, phys_size_t size);
68*ffa8f8b7SJoseph Chen 
69*ffa8f8b7SJoseph Chen /**
70*ffa8f8b7SJoseph Chen  * sysmem_alloc_align() - Alloc sysmem region at anywhere with addr align down
71*ffa8f8b7SJoseph Chen  *
72*ffa8f8b7SJoseph Chen  * @name: region name
73*ffa8f8b7SJoseph Chen  * @size: region size
74*ffa8f8b7SJoseph Chen  * @align: region base address align (down)
75*ffa8f8b7SJoseph Chen  *
76*ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
77*ffa8f8b7SJoseph Chen  */
78*ffa8f8b7SJoseph Chen void *sysmem_alloc_align(const char *name, phys_size_t size, ulong align);
79*ffa8f8b7SJoseph Chen 
80*ffa8f8b7SJoseph Chen /**
81*ffa8f8b7SJoseph Chen  * sysmem_alloc_base() - Alloc sysmem region at the expect addr
82*ffa8f8b7SJoseph Chen  *
83*ffa8f8b7SJoseph Chen  * @name: region name
84*ffa8f8b7SJoseph Chen  * @base: region base
85*ffa8f8b7SJoseph Chen  * @size: region size
86*ffa8f8b7SJoseph Chen  *
87*ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
88*ffa8f8b7SJoseph Chen  */
89*ffa8f8b7SJoseph Chen void *sysmem_alloc_base(const char *name, phys_addr_t base, phys_size_t size);
90*ffa8f8b7SJoseph Chen 
91*ffa8f8b7SJoseph Chen /**
92*ffa8f8b7SJoseph Chen  * sysmem_alloc_align_base() - Alloc sysmem region at the expect addr with align down
93*ffa8f8b7SJoseph Chen  *
94*ffa8f8b7SJoseph Chen  * @name: region name
95*ffa8f8b7SJoseph Chen  * @base: region base
96*ffa8f8b7SJoseph Chen  * @size: region size
97*ffa8f8b7SJoseph Chen  * @align: region base address align (down)
98*ffa8f8b7SJoseph Chen  *
99*ffa8f8b7SJoseph Chen  * @return NULL on error, otherwise the allocated region address ptr
100*ffa8f8b7SJoseph Chen  */
101*ffa8f8b7SJoseph Chen void *sysmem_alloc_align_base(const char *name, phys_addr_t base,
102*ffa8f8b7SJoseph Chen 			      phys_size_t size, ulong align);
103*ffa8f8b7SJoseph Chen 
104*ffa8f8b7SJoseph Chen /**
105*ffa8f8b7SJoseph Chen  * sysmem_free() - Free sysmem region
106*ffa8f8b7SJoseph Chen  *
107*ffa8f8b7SJoseph Chen  * @base: region base
108*ffa8f8b7SJoseph Chen  *
109*ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
110*ffa8f8b7SJoseph Chen  */
111*ffa8f8b7SJoseph Chen int sysmem_free(phys_addr_t base);
112*ffa8f8b7SJoseph Chen 
113*ffa8f8b7SJoseph Chen /**
114*ffa8f8b7SJoseph Chen  * sysmem_check() - Check sysmem regions
115*ffa8f8b7SJoseph Chen  *
116*ffa8f8b7SJoseph Chen  * @return 0 on okay, otherwise something wrong
117*ffa8f8b7SJoseph Chen  */
118*ffa8f8b7SJoseph Chen int sysmem_check(void);
119*ffa8f8b7SJoseph Chen 
120*ffa8f8b7SJoseph Chen /**
121*ffa8f8b7SJoseph Chen  * sysmem_dump_all() - Dump all sysmem stat
122*ffa8f8b7SJoseph Chen  */
123*ffa8f8b7SJoseph Chen void sysmem_dump(void);
124*ffa8f8b7SJoseph Chen 
125*ffa8f8b7SJoseph Chen /**
126*ffa8f8b7SJoseph Chen  * sysmem_dump_check() - Dump all sysmem stat and check overflow
127*ffa8f8b7SJoseph Chen  */
128*ffa8f8b7SJoseph Chen int sysmem_dump_check(void);
129*ffa8f8b7SJoseph Chen 
130*ffa8f8b7SJoseph Chen /**
131*ffa8f8b7SJoseph Chen  * board_sysmem_reserve() - Weak function for board to implement
132*ffa8f8b7SJoseph Chen  *
133*ffa8f8b7SJoseph Chen  * @sysmem: global sysmem point, ignored
134*ffa8f8b7SJoseph Chen  *
135*ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
136*ffa8f8b7SJoseph Chen  */
137*ffa8f8b7SJoseph Chen int board_sysmem_reserve(struct sysmem *sysmem);
138*ffa8f8b7SJoseph Chen 
139*ffa8f8b7SJoseph Chen /**
140*ffa8f8b7SJoseph Chen  * arch_sysmem_reserve() - Weak function for arch to implement
141*ffa8f8b7SJoseph Chen  *
142*ffa8f8b7SJoseph Chen  * @sysmem: global sysmem point, ignored
143*ffa8f8b7SJoseph Chen  *
144*ffa8f8b7SJoseph Chen  * @return 0 on success, otherwise error
145*ffa8f8b7SJoseph Chen  */
146*ffa8f8b7SJoseph Chen int arch_sysmem_reserve(struct sysmem *sysmem);
147*ffa8f8b7SJoseph Chen 
148*ffa8f8b7SJoseph Chen #endif /* _SYSMEM_H */
149