hc
2025-02-14 bbb9540dc49f70f6b703d1c8d1b85fa5f602d86e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* SPDX-License-Identifier:     GPL-2.0+ */
/*
 * (C) Copyright 2019 Rockchip Electronics Co., Ltd
 */
 
#ifndef _BIDRAM_H
#define _BIDRAM_H
 
#include <memblk.h>
 
typedef struct memblock *(*parse_fn_t)(int *);
 
struct bidram {
   struct lmb lmb;
   struct list_head reserved_head;
   bool has_init;
   bool fixup;
   u64 base_u64[MEM_RESV_COUNT]; /* 4GB+ */
   u64 size_u64[MEM_RESV_COUNT];
};
 
#ifdef CONFIG_BIDRAM
/**
 * bidram_initr() - Initial bidram after relocation.
 *
 * @return 0 on success, otherwise error
 */
int bidram_initr(void);
 
/**
 * bidram_get_ram_size() - Initial bidram and get ram size.
 *
 * @parse_fn: function to parse ddr memory regions
 *
 * @return ram size, 0 on success, otherwise the effect ram size.
 */
phys_size_t bidram_get_ram_size(void);
 
/**
 * bidram_gen_gd_bi_dram() - Update gd->bd->bi_dram[] according to bidram state.
 */
void bidram_gen_gd_bi_dram(void);
 
/**
 * bidram_reserve() - Reserve bidram region
 *
 * @id: memblk id
 * @base: region base address
 * @size: region size
 *
 * @return 0 on success, otherwise error
 */
int bidram_reserve(enum memblk_id id, phys_addr_t base, phys_size_t size);
 
/**
 * bidram_reserve_by_name() - Reserve bidram region by name
 *
 * @name: region name
 * @base: region base address
 * @size: region size
 *
 * @return 0 on success, otherwise error
 */
int bidram_reserve_by_name(const char *name, phys_addr_t base, phys_size_t size);
 
/**
 * bidram_dump_all() - Dump all bidram stat
 */
void bidram_dump(void);
 
/**
 * bidram_fixup() - Fixup bi_dram[] for 4GB+ memory
 *
 * @return 0 on success, otherwise error
 */
int bidram_fixup(void);
 
/**
 * bidram_append_size() - Append 4GB+ memory
 *
 * @return 4GB+ size
 */
u64 bidram_append_size(void);
 
/**
 * bidram_reserved_is_overlap() - Check outside memory is overlap with reserved
 *
 * @base: region base address
 * @size: region size
 *
 * @return memblk struct when overlap, otherwise NULL
 */
struct memblock *bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size);
 
/**
 * board_bidram_parse_fn() - Weak function for board to implement
 */
parse_fn_t board_bidram_parse_fn(void);
 
/**
 * board_bidram_reserve() - Weak function for board to implement
 *
 * @bidram: global bidram point, ignored
 *
 * @return 0 on success, otherwise error
 */
int board_bidram_reserve(struct bidram *bidram);
#else
static inline int bidram_initr(void) { return 0; }
static inline phys_size_t bidram_get_ram_size(void) { return 0; }
static inline void bidram_gen_gd_bi_dram(void) { }
static inline int bidram_reserve(enum memblk_id id, phys_addr_t base,
                phys_size_t size) { return 0; }
static inline int bidram_reserve_by_name(const char *name, phys_addr_t base,
                    phys_size_t size) { return 0; }
static inline void bidram_dump(void) {}
static inline int bidram_fixup(void) { return 0; }
static inline u64 bidram_append_size(void) { return 0; }
static inline parse_fn_t board_bidram_parse_fn(void) { return NULL; }
static inline int board_bidram_reserve(struct bidram *bidram) { return 0; }
static inline struct memblock *
   bidram_reserved_is_overlap(phys_addr_t base, phys_size_t size)
{
   return NULL;
}
 
#endif
 
#endif /* _BIDRAM_H */