xref: /rk3399_rockchip-uboot/include/bidram.h (revision 677769312e9d2a8d51a0b7b418a63fbe6b79c609)
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 /**
7982a88d5eSXuhui Lin  * board_bidram_fixup() - Fixup bi_dram[] based on Soc boards.
8082a88d5eSXuhui Lin  */
8182a88d5eSXuhui Lin void board_bidram_fixup(void);
8282a88d5eSXuhui Lin 
8382a88d5eSXuhui 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 /**
91*67776931SXuhui Lin  * board_bidram_append_size() - Append board specific memory
92*67776931SXuhui Lin  *
93*67776931SXuhui Lin  * @return board specific size
94*67776931SXuhui Lin  */
95*67776931SXuhui Lin u64 board_bidram_append_size(void);
96*67776931SXuhui Lin 
97*67776931SXuhui Lin /**
98fc7ff0f0SJoseph Chen  * bidram_reserved_is_overlap() - Check outside memory is overlap with reserved
99fc7ff0f0SJoseph Chen  *
100fc7ff0f0SJoseph Chen  * @base: region base address
101fc7ff0f0SJoseph Chen  * @size: region size
102fc7ff0f0SJoseph Chen  *
103fc7ff0f0SJoseph Chen  * @return memblk struct when overlap, otherwise NULL
104fc7ff0f0SJoseph Chen  */
105fc7ff0f0SJoseph Chen struct memblock *bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size);
106fc7ff0f0SJoseph Chen 
107fc7ff0f0SJoseph Chen /**
108483d0493SJoseph Chen  * board_bidram_parse_fn() - Weak function for board to implement
109483d0493SJoseph Chen  */
110483d0493SJoseph Chen parse_fn_t board_bidram_parse_fn(void);
111483d0493SJoseph Chen 
112483d0493SJoseph Chen /**
113483d0493SJoseph Chen  * board_bidram_reserve() - Weak function for board to implement
114483d0493SJoseph Chen  *
115483d0493SJoseph Chen  * @bidram: global bidram point, ignored
116483d0493SJoseph Chen  *
117483d0493SJoseph Chen  * @return 0 on success, otherwise error
118483d0493SJoseph Chen  */
119483d0493SJoseph Chen int board_bidram_reserve(struct bidram *bidram);
120a3320facSJoseph Chen #else
bidram_initr(void)121a3320facSJoseph Chen static inline int bidram_initr(void) { return 0; }
bidram_get_ram_size(void)122a3320facSJoseph Chen static inline phys_size_t bidram_get_ram_size(void) { return 0; }
bidram_gen_gd_bi_dram(void)123a3320facSJoseph Chen static inline void bidram_gen_gd_bi_dram(void) { }
bidram_reserve(enum memblk_id id,phys_addr_t base,phys_size_t size)124a3320facSJoseph Chen static inline int bidram_reserve(enum memblk_id id, phys_addr_t base,
125a3320facSJoseph Chen 				 phys_size_t size) { return 0; }
bidram_reserve_by_name(const char * name,phys_addr_t base,phys_size_t size)126a3320facSJoseph Chen static inline int bidram_reserve_by_name(const char *name, phys_addr_t base,
127a3320facSJoseph Chen 					 phys_size_t size) { return 0; }
bidram_dump(void)128a3320facSJoseph Chen static inline void bidram_dump(void) {}
bidram_fixup(void)129a3320facSJoseph Chen static inline int bidram_fixup(void) { return 0; }
bidram_append_size(void)130a3320facSJoseph Chen static inline u64 bidram_append_size(void) { return 0; }
board_bidram_parse_fn(void)131a3320facSJoseph Chen static inline parse_fn_t board_bidram_parse_fn(void) { return NULL; }
board_bidram_reserve(struct bidram * bidram)132a3320facSJoseph Chen static inline int board_bidram_reserve(struct bidram *bidram) { return 0; }
133a3320facSJoseph Chen static inline struct memblock *
bidram_reserved_is_overlap(phys_addr_t base,phys_size_t size)134a3320facSJoseph Chen 	bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size)
135a3320facSJoseph Chen {
136a3320facSJoseph Chen 	return NULL;
137a3320facSJoseph Chen }
138a3320facSJoseph Chen 
139a3320facSJoseph Chen #endif
140483d0493SJoseph Chen 
141483d0493SJoseph Chen #endif /* _BIDRAM_H */
142