xref: /rk3399_rockchip-uboot/include/bidram.h (revision 82a88d5e799f67bbfbf351a3b5e32dae1b19b70e)
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;
171d09cf29SJoseph Chen 	bool fixup;
181d09cf29SJoseph Chen 	u64 base_u64[MEM_RESV_COUNT]; /* 4GB+ */
191d09cf29SJoseph Chen 	u64 size_u64[MEM_RESV_COUNT];
20483d0493SJoseph Chen };
21483d0493SJoseph Chen 
22a3320facSJoseph Chen #ifdef CONFIG_BIDRAM
23483d0493SJoseph Chen /**
24483d0493SJoseph Chen  * bidram_initr() - Initial bidram after relocation.
25483d0493SJoseph Chen  *
26483d0493SJoseph Chen  * @return 0 on success, otherwise error
27483d0493SJoseph Chen  */
28483d0493SJoseph Chen int bidram_initr(void);
29483d0493SJoseph Chen 
30483d0493SJoseph Chen /**
31483d0493SJoseph Chen  * bidram_get_ram_size() - Initial bidram and get ram size.
32483d0493SJoseph Chen  *
33483d0493SJoseph Chen  * @parse_fn: function to parse ddr memory regions
34483d0493SJoseph Chen  *
35483d0493SJoseph Chen  * @return ram size, 0 on success, otherwise the effect ram size.
36483d0493SJoseph Chen  */
37483d0493SJoseph Chen phys_size_t bidram_get_ram_size(void);
38483d0493SJoseph Chen 
39483d0493SJoseph Chen /**
40483d0493SJoseph Chen  * bidram_gen_gd_bi_dram() - Update gd->bd->bi_dram[] according to bidram state.
41483d0493SJoseph Chen  */
42483d0493SJoseph Chen void bidram_gen_gd_bi_dram(void);
43483d0493SJoseph Chen 
44483d0493SJoseph Chen /**
45483d0493SJoseph Chen  * bidram_reserve() - Reserve bidram region
46483d0493SJoseph Chen  *
47483d0493SJoseph Chen  * @id: memblk id
48483d0493SJoseph Chen  * @base: region base address
49483d0493SJoseph Chen  * @size: region size
50483d0493SJoseph Chen  *
51483d0493SJoseph Chen  * @return 0 on success, otherwise error
52483d0493SJoseph Chen  */
53483d0493SJoseph Chen int bidram_reserve(enum memblk_id id, phys_addr_t base, phys_size_t size);
54483d0493SJoseph Chen 
55483d0493SJoseph Chen /**
56483d0493SJoseph Chen  * bidram_reserve_by_name() - Reserve bidram region by name
57483d0493SJoseph Chen  *
58483d0493SJoseph Chen  * @name: region name
59483d0493SJoseph Chen  * @base: region base address
60483d0493SJoseph Chen  * @size: region size
61483d0493SJoseph Chen  *
62483d0493SJoseph Chen  * @return 0 on success, otherwise error
63483d0493SJoseph Chen  */
64483d0493SJoseph Chen int bidram_reserve_by_name(const char *name, phys_addr_t base, phys_size_t size);
65483d0493SJoseph Chen 
66483d0493SJoseph Chen /**
67483d0493SJoseph Chen  * bidram_dump_all() - Dump all bidram stat
68483d0493SJoseph Chen  */
69483d0493SJoseph Chen void bidram_dump(void);
70483d0493SJoseph Chen 
71483d0493SJoseph Chen /**
721d09cf29SJoseph Chen  * bidram_fixup() - Fixup bi_dram[] for 4GB+ memory
731d09cf29SJoseph Chen  *
741d09cf29SJoseph Chen  * @return 0 on success, otherwise error
751d09cf29SJoseph Chen  */
761d09cf29SJoseph Chen int bidram_fixup(void);
771d09cf29SJoseph Chen 
781d09cf29SJoseph Chen /**
79*82a88d5eSXuhui Lin  * board_bidram_fixup() - Fixup bi_dram[] based on Soc boards.
80*82a88d5eSXuhui Lin  */
81*82a88d5eSXuhui Lin void board_bidram_fixup(void);
82*82a88d5eSXuhui Lin 
83*82a88d5eSXuhui Lin /**
841d09cf29SJoseph Chen  * bidram_append_size() - Append 4GB+ memory
851d09cf29SJoseph Chen  *
861d09cf29SJoseph Chen  * @return 4GB+ size
871d09cf29SJoseph Chen  */
881d09cf29SJoseph Chen u64 bidram_append_size(void);
891d09cf29SJoseph Chen 
901d09cf29SJoseph Chen /**
91fc7ff0f0SJoseph Chen  * bidram_reserved_is_overlap() - Check outside memory is overlap with reserved
92fc7ff0f0SJoseph Chen  *
93fc7ff0f0SJoseph Chen  * @base: region base address
94fc7ff0f0SJoseph Chen  * @size: region size
95fc7ff0f0SJoseph Chen  *
96fc7ff0f0SJoseph Chen  * @return memblk struct when overlap, otherwise NULL
97fc7ff0f0SJoseph Chen  */
98fc7ff0f0SJoseph Chen struct memblock *bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size);
99fc7ff0f0SJoseph Chen 
100fc7ff0f0SJoseph Chen /**
101483d0493SJoseph Chen  * board_bidram_parse_fn() - Weak function for board to implement
102483d0493SJoseph Chen  */
103483d0493SJoseph Chen parse_fn_t board_bidram_parse_fn(void);
104483d0493SJoseph Chen 
105483d0493SJoseph Chen /**
106483d0493SJoseph Chen  * board_bidram_reserve() - Weak function for board to implement
107483d0493SJoseph Chen  *
108483d0493SJoseph Chen  * @bidram: global bidram point, ignored
109483d0493SJoseph Chen  *
110483d0493SJoseph Chen  * @return 0 on success, otherwise error
111483d0493SJoseph Chen  */
112483d0493SJoseph Chen int board_bidram_reserve(struct bidram *bidram);
113a3320facSJoseph Chen #else
114a3320facSJoseph Chen static inline int bidram_initr(void) { return 0; }
115a3320facSJoseph Chen static inline phys_size_t bidram_get_ram_size(void) { return 0; }
116a3320facSJoseph Chen static inline void bidram_gen_gd_bi_dram(void) { }
117a3320facSJoseph Chen static inline int bidram_reserve(enum memblk_id id, phys_addr_t base,
118a3320facSJoseph Chen 				 phys_size_t size) { return 0; }
119a3320facSJoseph Chen static inline int bidram_reserve_by_name(const char *name, phys_addr_t base,
120a3320facSJoseph Chen 					 phys_size_t size) { return 0; }
121a3320facSJoseph Chen static inline void bidram_dump(void) {}
122a3320facSJoseph Chen static inline int bidram_fixup(void) { return 0; }
123a3320facSJoseph Chen static inline u64 bidram_append_size(void) { return 0; }
124a3320facSJoseph Chen static inline parse_fn_t board_bidram_parse_fn(void) { return NULL; }
125a3320facSJoseph Chen static inline int board_bidram_reserve(struct bidram *bidram) { return 0; }
126a3320facSJoseph Chen static inline struct memblock *
127a3320facSJoseph Chen 	bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size)
128a3320facSJoseph Chen {
129a3320facSJoseph Chen 	return NULL;
130a3320facSJoseph Chen }
131a3320facSJoseph Chen 
132a3320facSJoseph Chen #endif
133483d0493SJoseph Chen 
134483d0493SJoseph Chen #endif /* _BIDRAM_H */
135