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