xref: /rk3399_rockchip-uboot/include/bidram.h (revision 1d09cf29cded007e7cb3c55a78f6a0a5a3845a12)
1483d0493SJoseph Chen /* SPDX-License-Identifier:     GPL-2.0+ */
2483d0493SJoseph Chen /*
3483d0493SJoseph Chen  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
4483d0493SJoseph Chen  */
5483d0493SJoseph Chen 
6483d0493SJoseph Chen #ifndef _BIDRAM_H
7483d0493SJoseph Chen #define _BIDRAM_H
8483d0493SJoseph Chen 
9483d0493SJoseph Chen #include <memblk.h>
10483d0493SJoseph Chen 
11483d0493SJoseph Chen typedef struct memblock *(*parse_fn_t)(int *);
12483d0493SJoseph Chen 
13483d0493SJoseph Chen struct bidram {
14483d0493SJoseph Chen 	struct lmb lmb;
15483d0493SJoseph Chen 	struct list_head reserved_head;
16483d0493SJoseph Chen 	bool has_init;
17*1d09cf29SJoseph Chen 	bool fixup;
18*1d09cf29SJoseph Chen 	u64 base_u64[MEM_RESV_COUNT]; /* 4GB+ */
19*1d09cf29SJoseph Chen 	u64 size_u64[MEM_RESV_COUNT];
20483d0493SJoseph Chen };
21483d0493SJoseph Chen 
22483d0493SJoseph Chen /**
23483d0493SJoseph Chen  * bidram_initr() - Initial bidram after relocation.
24483d0493SJoseph Chen  *
25483d0493SJoseph Chen  * @return 0 on success, otherwise error
26483d0493SJoseph Chen  */
27483d0493SJoseph Chen int bidram_initr(void);
28483d0493SJoseph Chen 
29483d0493SJoseph Chen /**
30483d0493SJoseph Chen  * bidram_get_ram_size() - Initial bidram and get ram size.
31483d0493SJoseph Chen  *
32483d0493SJoseph Chen  * @parse_fn: function to parse ddr memory regions
33483d0493SJoseph Chen  *
34483d0493SJoseph Chen  * @return ram size, 0 on success, otherwise the effect ram size.
35483d0493SJoseph Chen  */
36483d0493SJoseph Chen phys_size_t bidram_get_ram_size(void);
37483d0493SJoseph Chen 
38483d0493SJoseph Chen /**
39483d0493SJoseph Chen  * bidram_gen_gd_bi_dram() - Update gd->bd->bi_dram[] according to bidram state.
40483d0493SJoseph Chen  */
41483d0493SJoseph Chen void bidram_gen_gd_bi_dram(void);
42483d0493SJoseph Chen 
43483d0493SJoseph Chen /**
44483d0493SJoseph Chen  * bidram_reserve() - Reserve bidram region
45483d0493SJoseph Chen  *
46483d0493SJoseph Chen  * @id: memblk id
47483d0493SJoseph Chen  * @base: region base address
48483d0493SJoseph Chen  * @size: region size
49483d0493SJoseph Chen  *
50483d0493SJoseph Chen  * @return 0 on success, otherwise error
51483d0493SJoseph Chen  */
52483d0493SJoseph Chen int bidram_reserve(enum memblk_id id, phys_addr_t base, phys_size_t size);
53483d0493SJoseph Chen 
54483d0493SJoseph Chen /**
55483d0493SJoseph Chen  * bidram_reserve_by_name() - Reserve bidram region by name
56483d0493SJoseph Chen  *
57483d0493SJoseph Chen  * @name: region name
58483d0493SJoseph Chen  * @base: region base address
59483d0493SJoseph Chen  * @size: region size
60483d0493SJoseph Chen  *
61483d0493SJoseph Chen  * @return 0 on success, otherwise error
62483d0493SJoseph Chen  */
63483d0493SJoseph Chen int bidram_reserve_by_name(const char *name, phys_addr_t base, phys_size_t size);
64483d0493SJoseph Chen 
65483d0493SJoseph Chen /**
66483d0493SJoseph Chen  * bidram_dump_all() - Dump all bidram stat
67483d0493SJoseph Chen  */
68483d0493SJoseph Chen void bidram_dump(void);
69483d0493SJoseph Chen 
70483d0493SJoseph Chen /**
71*1d09cf29SJoseph Chen  * bidram_fixup() - Fixup bi_dram[] for 4GB+ memory
72*1d09cf29SJoseph Chen  *
73*1d09cf29SJoseph Chen  * @return 0 on success, otherwise error
74*1d09cf29SJoseph Chen  */
75*1d09cf29SJoseph Chen int bidram_fixup(void);
76*1d09cf29SJoseph Chen 
77*1d09cf29SJoseph Chen /**
78*1d09cf29SJoseph Chen  * bidram_append_size() - Append 4GB+ memory
79*1d09cf29SJoseph Chen  *
80*1d09cf29SJoseph Chen  * @return 4GB+ size
81*1d09cf29SJoseph Chen  */
82*1d09cf29SJoseph Chen u64 bidram_append_size(void);
83*1d09cf29SJoseph Chen 
84*1d09cf29SJoseph Chen /**
85fc7ff0f0SJoseph Chen  * bidram_reserved_is_overlap() - Check outside memory is overlap with reserved
86fc7ff0f0SJoseph Chen  *
87fc7ff0f0SJoseph Chen  * @base: region base address
88fc7ff0f0SJoseph Chen  * @size: region size
89fc7ff0f0SJoseph Chen  *
90fc7ff0f0SJoseph Chen  * @return memblk struct when overlap, otherwise NULL
91fc7ff0f0SJoseph Chen  */
92fc7ff0f0SJoseph Chen struct memblock *bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size);
93fc7ff0f0SJoseph Chen 
94fc7ff0f0SJoseph Chen /**
95483d0493SJoseph Chen  * board_bidram_parse_fn() - Weak function for board to implement
96483d0493SJoseph Chen  */
97483d0493SJoseph Chen parse_fn_t board_bidram_parse_fn(void);
98483d0493SJoseph Chen 
99483d0493SJoseph Chen /**
100483d0493SJoseph Chen  * board_bidram_reserve() - Weak function for board to implement
101483d0493SJoseph Chen  *
102483d0493SJoseph Chen  * @bidram: global bidram point, ignored
103483d0493SJoseph Chen  *
104483d0493SJoseph Chen  * @return 0 on success, otherwise error
105483d0493SJoseph Chen  */
106483d0493SJoseph Chen int board_bidram_reserve(struct bidram *bidram);
107483d0493SJoseph Chen 
108483d0493SJoseph Chen #endif /* _BIDRAM_H */
109