coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
raminit.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef __X4X_RAMINIT_H__
4 #define __X4X_RAMINIT_H__
5 
6 #include <stdint.h>
7 
8 #define NOP_CMD 0x2
9 #define PRECHARGE_CMD 0x4
10 #define MRS_CMD 0x6
11 #define EMRS_CMD 0x8
12 #define EMRS1_CMD (EMRS_CMD | 0x10)
13 #define EMRS2_CMD (EMRS_CMD | 0x20)
14 #define EMRS3_CMD (EMRS_CMD | 0x30)
15 #define ZQCAL_CMD 0xa
16 #define CBR_CMD 0xc
17 #define NORMALOP_CMD 0xe
18 
19 #define TOTAL_CHANNELS 2
20 #define TOTAL_DIMMS 4
21 #define TOTAL_BYTELANES 8
22 #define DIMMS_PER_CHANNEL (TOTAL_DIMMS / TOTAL_CHANNELS)
23 #define RAW_CARD_UNPOPULATED 0xff
24 #define RAW_CARD_POPULATED 0
25 
26 #define DIMM_IS_POPULATED(dimms, idx) (dimms[idx].card_type != RAW_CARD_UNPOPULATED)
27 #define IF_DIMM_POPULATED(dimms, idx) if (dimms[idx].card_type != RAW_CARD_UNPOPULATED)
28 #define ONLY_DIMMA_IS_POPULATED(dimms, ch) ( \
29  (DIMM_IS_POPULATED(dimms, (ch == 0) ? 0 : 2) && \
30  !DIMM_IS_POPULATED(dimms, (ch == 0) ? 1 : 3)))
31 #define ONLY_DIMMB_IS_POPULATED(dimms, ch) ( \
32  (DIMM_IS_POPULATED(dimms, (ch == 0) ? 1 : 3) && \
33  !DIMM_IS_POPULATED(dimms, (ch == 0) ? 0 : 2)))
34 #define BOTH_DIMMS_ARE_POPULATED(dimms, ch) ( \
35  (DIMM_IS_POPULATED(dimms, (ch == 0) ? 0 : 2) && \
36  (DIMM_IS_POPULATED(dimms, (ch == 0) ? 1 : 3))))
37 #define FOR_EACH_DIMM(idx) \
38  for (idx = 0; idx < TOTAL_DIMMS; ++idx)
39 #define FOR_EACH_POPULATED_DIMM(dimms, idx) \
40  FOR_EACH_DIMM(idx) IF_DIMM_POPULATED(dimms, idx)
41 #define FOR_EACH_DIMM_IN_CHANNEL(ch, idx) \
42  for (idx = (ch) << 1; idx < ((ch) << 1) + DIMMS_PER_CHANNEL; ++idx)
43 #define FOR_EACH_POPULATED_DIMM_IN_CHANNEL(dimms, ch, idx) \
44  FOR_EACH_DIMM_IN_CHANNEL(ch, idx) IF_DIMM_POPULATED(dimms, idx)
45 #define CHANNEL_IS_POPULATED(dimms, idx) \
46  ((dimms[idx<<1].card_type != RAW_CARD_UNPOPULATED) \
47  || (dimms[(idx<<1) + 1].card_type != RAW_CARD_UNPOPULATED))
48 #define CHANNEL_IS_CARDF(dimms, idx) \
49  ((dimms[idx<<1].card_type == 0xf) \
50  || (dimms[(idx<<1) + 1].card_type == 0xf))
51 #define IF_CHANNEL_POPULATED(dimms, idx) \
52  if ((dimms[idx<<1].card_type != RAW_CARD_UNPOPULATED) \
53  || (dimms[(idx<<1) + 1].card_type != RAW_CARD_UNPOPULATED))
54 #define FOR_EACH_CHANNEL(idx) \
55  for (idx = 0; idx < TOTAL_CHANNELS; ++idx)
56 #define FOR_EACH_POPULATED_CHANNEL(dimms, idx) \
57  FOR_EACH_CHANNEL(idx) IF_CHANNEL_POPULATED(dimms, idx)
58 
59 #define RANKS_PER_CHANNEL 4
60 #define RANK_IS_POPULATED(dimms, ch, r) \
61  (((dimms[ch<<1].card_type != RAW_CARD_UNPOPULATED) && ((r) < dimms[ch<<1].ranks)) || \
62  ((dimms[(ch<<1) + 1].card_type != RAW_CARD_UNPOPULATED) && ((r) >= 2) && ((r) < (dimms[(ch<<1) + 1].ranks + 2))))
63 #define IF_RANK_POPULATED(dimms, ch, r) \
64  if (((dimms[ch<<1].card_type != RAW_CARD_UNPOPULATED) \
65  && ((r) < dimms[ch<<1].ranks)) \
66  || ((dimms[(ch<<1) + 1].card_type != RAW_CARD_UNPOPULATED) \
67  && ((r) >= 2) && ((r) < (dimms[(ch<<1) + 1].ranks + 2))))
68 #define FOR_EACH_RANK_IN_CHANNEL(r) \
69  for (r = 0; r < RANKS_PER_CHANNEL; ++r)
70 #define FOR_EACH_POPULATED_RANK_IN_CHANNEL(dimms, ch, r) \
71  FOR_EACH_RANK_IN_CHANNEL(r) IF_RANK_POPULATED(dimms, ch, r)
72 #define FOR_EACH_RANK(ch, r) \
73  FOR_EACH_CHANNEL(ch) FOR_EACH_RANK_IN_CHANNEL(r)
74 #define FOR_EACH_POPULATED_RANK(dimms, ch, r) \
75  FOR_EACH_RANK(ch, r) IF_RANK_POPULATED(dimms, ch, r)
76 #define FOR_EACH_BYTELANE(l) \
77  for (l = 0; l < TOTAL_BYTELANES; l++)
78 #define FOR_EACH_POPULATED_CHANNEL_AND_BYTELANE(dimms, ch, l) \
79  FOR_EACH_POPULATED_CHANNEL (dimms, ch) FOR_EACH_BYTELANE(l)
80 
81 #define DDR3_MAX_CAS 18
82 
83 enum fsb_clock {
87 };
88 
89 enum mem_clock {
96 };
97 
98 enum ddr {
99  DDR2 = 2,
100  DDR3 = 3,
101 };
102 
103 enum ddrxspd {
104  DDR2SPD = 0x8,
105  DDR3SPD = 0xb,
106 };
107 
108 enum chip_width { /* as in DDR3 spd */
113 };
114 
115 enum chip_cap { /* as in DDR3 spd */
123 };
124 
125 struct dll_setting {
132 };
133 
137 };
138 
139 enum n_banks {
142 };
143 
144 struct timings {
145  unsigned int CAS;
146  unsigned int tclk;
147  enum fsb_clock fsb_clk;
148  enum mem_clock mem_clk;
149  unsigned int tRAS;
150  unsigned int tRP;
151  unsigned int tRCD;
152  unsigned int tWR;
153  unsigned int tRFC;
154  unsigned int tWTR;
155  unsigned int tRRD;
156  unsigned int tRTP;
157 };
158 
159 struct dimminfo {
160  unsigned int card_type; /* 0xff: unpopulated, 0xa - 0xf: raw card type A - F */
161  enum chip_width width;
162  unsigned int page_size; /* of whole DIMM in Bytes (4096 or 8192) */
163  enum n_banks n_banks;
164  unsigned int ranks;
165  unsigned int rows;
166  unsigned int cols;
169 };
170 
177 };
178 
179 /* The setup is up to two DIMMs per channel */
180 struct sysinfo {
182  enum fsb_clock max_fsb;
183 
184  int dimm_config[2];
185  int spd_type;
186  int channel_capacity[2];
187  struct timings selected_timings;
188  struct dimminfo dimms[4];
191  /*
192  * The rt_dqs delay register for rank 0 seems to be used
193  * for all other ranks on the channel, so only save that
194  */
200 };
201 
203  CLKSET0 = 0,
210 };
211 
212 void sdram_initialize(int boot_path, const u8 *spd_map);
213 void do_raminit(struct sysinfo *, int fast_boot);
214 void rcven(struct sysinfo *s);
215 u32 fsb_to_mhz(u32 speed);
216 u32 ddr_to_mhz(u32 speed);
217 u32 test_address(int channel, int rank);
218 void dqsset(u8 ch, u8 lane, const struct dll_setting *setting);
219 void dqset(u8 ch, u8 lane, const struct dll_setting *setting);
220 void rt_set_dqs(u8 channel, u8 lane, u8 rank, struct rt_dqs_setting *dqs_setting);
221 int do_write_training(struct sysinfo *s);
222 int do_read_training(struct sysinfo *s);
223 void search_write_leveling(struct sysinfo *s);
224 void send_jedec_cmd(const struct sysinfo *s, u8 r, u8 ch, u8 cmd, u32 val);
225 
226 extern const struct dll_setting default_ddr2_667_ctrl[7];
227 extern const struct dll_setting default_ddr2_800_ctrl[7];
228 extern const struct dll_setting default_ddr3_800_ctrl[2][7];
229 extern const struct dll_setting default_ddr3_1067_ctrl[2][7];
230 extern const struct dll_setting default_ddr3_1333_ctrl[2][7];
233 extern const struct dll_setting default_ddr3_800_dqs[2][TOTAL_BYTELANES];
234 extern const struct dll_setting default_ddr3_1067_dqs[2][TOTAL_BYTELANES];
235 extern const struct dll_setting default_ddr3_1333_dqs[2][TOTAL_BYTELANES];
236 extern const struct dll_setting default_ddr2_667_dq[TOTAL_BYTELANES];
237 extern const struct dll_setting default_ddr2_800_dq[TOTAL_BYTELANES];
238 extern const struct dll_setting default_ddr3_800_dq[2][TOTAL_BYTELANES];
239 extern const struct dll_setting default_ddr3_1067_dq[2][TOTAL_BYTELANES];
240 extern const struct dll_setting default_ddr3_1333_dq[2][TOTAL_BYTELANES];
241 extern const u8 ddr3_emrs1_rtt_nom_config[16][4];
242 extern const u8 post_jedec_tab[3][4][2];
243 extern const u32 ddr3_c2_tab[2][3][6][2];
244 extern const u8 ddr3_c2_x264[3][6];
245 extern const u16 ddr3_c2_x23c[3][6];
246 
247 #endif /* __X4X_RAMINIT_H__ */
void sdram_initialize(void)
Definition: raminit.c:1692
static struct dramc_channel const ch[2]
@ FSB_CLOCK_800MHz
Definition: raminit.h:14
chip_cap
Definition: raminit.h:34
@ CHIP_CAP_1G
Definition: raminit.h:37
@ CHIP_CAP_4G
Definition: raminit.h:39
@ CHIP_CAP_512M
Definition: raminit.h:36
@ CHIP_CAP_8G
Definition: raminit.h:40
@ CHIP_CAP_2G
Definition: raminit.h:38
@ CHIP_CAP_256M
Definition: raminit.h:35
@ CHIP_CAP_16G
Definition: raminit.h:41
@ MEM_CLOCK_667MHz
Definition: raminit.h:18
@ MEM_CLOCK_800MHz
Definition: raminit.h:19
ddr
Definition: raminit.h:22
@ DDR3
Definition: raminit.h:24
@ DDR2
Definition: raminit.h:23
chip_width
Definition: raminit.h:27
@ CHIP_WIDTH_x32
Definition: raminit.h:31
@ CHIP_WIDTH_x8
Definition: raminit.h:29
@ CHIP_WIDTH_x4
Definition: raminit.h:28
@ CHIP_WIDTH_x16
Definition: raminit.h:30
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
uint8_t u8
Definition: stdint.h:45
u8 mirrored
Definition: raminit.h:168
unsigned int cols
Definition: raminit.h:69
unsigned int rows
Definition: raminit.h:68
unsigned int card_type
Definition: raminit.h:59
unsigned int ranks
Definition: raminit.h:67
u16 spd_crc
Definition: raminit.h:167
unsigned int page_size
Definition: raminit.h:64
enum chip_width width
Definition: raminit.h:62
enum n_banks n_banks
Definition: raminit.h:163
u8 clk_delay
Definition: raminit.h:130
u8 medium[TOTAL_BYTELANES]
Definition: raminit.h:174
u8 pi[TOTAL_BYTELANES]
Definition: raminit.h:176
u8 coarse_offset[TOTAL_BYTELANES]
Definition: raminit.h:173
u8 min_common_coarse
Definition: raminit.h:172
u8 tap[TOTAL_BYTELANES]
Definition: raminit.h:175
int channel_capacity[2]
Definition: raminit.h:112
struct dimminfo dimms[4]
Definition: raminit.h:114
struct rt_dqs_setting rt_dqs[TOTAL_CHANNELS][TOTAL_BYTELANES]
Definition: raminit.h:195
int spd_type
Definition: raminit.h:111
int dimm_config[2]
Definition: raminit.h:109
struct dll_setting dqs_settings[TOTAL_CHANNELS][TOTAL_BYTELANES]
Definition: raminit.h:196
u8 spd_map[4]
Definition: raminit.h:115
u8 stacked_mode
Definition: raminit.h:199
enum fsb_clock max_fsb
Definition: raminit.h:182
struct dll_setting dq_settings[TOTAL_CHANNELS][TOTAL_BYTELANES]
Definition: raminit.h:197
u8 nmode
Definition: raminit.h:198
struct rcven_timings rcven_t[TOTAL_CHANNELS]
Definition: raminit.h:190
struct timings selected_timings
Definition: raminit.h:113
int boot_path
Definition: raminit.h:100
unsigned int tclk
Definition: raminit.h:146
unsigned int tRTP
Definition: raminit.h:55
enum mem_clock mem_clk
Definition: raminit.h:148
unsigned int tRP
Definition: raminit.h:49
unsigned int tRRD
Definition: raminit.h:54
unsigned int tWR
Definition: raminit.h:51
unsigned int tWTR
Definition: raminit.h:53
unsigned int tRCD
Definition: raminit.h:50
unsigned int tRFC
Definition: raminit.h:52
unsigned int CAS
Definition: raminit.h:45
enum fsb_clock fsb_clk
Definition: raminit.h:147
unsigned int tRAS
Definition: raminit.h:48
u8 val
Definition: sys.c:300
#define s(param, src_bits, pmcreg, dst_bits)
void dqset(u8 ch, u8 lane, const struct dll_setting *setting)
u32 fsb_to_mhz(u32 speed)
Definition: raminit_ddr23.c:21
const u16 ddr3_c2_x23c[3][6]
const u8 post_jedec_tab[3][4][2]
fsb_clock
Definition: raminit.h:83
@ FSB_CLOCK_1066MHz
Definition: raminit.h:85
@ FSB_CLOCK_1333MHz
Definition: raminit.h:86
void search_write_leveling(struct sysinfo *s)
Definition: dq_dqs.c:740
void rt_set_dqs(u8 channel, u8 lane, u8 rank, struct rt_dqs_setting *dqs_setting)
int do_read_training(struct sysinfo *s)
Definition: dq_dqs.c:421
const u32 ddr3_c2_tab[2][3][6][2]
const struct dll_setting default_ddr3_1067_dq[2][TOTAL_BYTELANES]
const u8 ddr3_emrs1_rtt_nom_config[16][4]
#define TOTAL_BYTELANES
Definition: raminit.h:21
u32 ddr_to_mhz(u32 speed)
Definition: raminit_ddr23.c:26
const struct dll_setting default_ddr3_800_dq[2][TOTAL_BYTELANES]
const struct dll_setting default_ddr2_800_dq[TOTAL_BYTELANES]
const struct dll_setting default_ddr3_1067_dqs[2][TOTAL_BYTELANES]
const struct dll_setting default_ddr3_1333_dqs[2][TOTAL_BYTELANES]
n_banks
Definition: raminit.h:139
@ N_BANKS_4
Definition: raminit.h:140
@ N_BANKS_8
Definition: raminit.h:141
const struct dll_setting default_ddr2_800_ctrl[7]
const struct dll_setting default_ddr3_1333_ctrl[2][7]
void send_jedec_cmd(const struct sysinfo *s, u8 r, u8 ch, u8 cmd, u32 val)
void dqsset(u8 ch, u8 lane, const struct dll_setting *setting)
All finer DQ and DQS DLL settings are set to the same value for each rank in a channel,...
const struct dll_setting default_ddr2_800_dqs[TOTAL_BYTELANES]
ddrxspd
Definition: raminit.h:103
@ DDR3SPD
Definition: raminit.h:105
@ DDR2SPD
Definition: raminit.h:104
const struct dll_setting default_ddr2_667_dq[TOTAL_BYTELANES]
const struct dll_setting default_ddr3_800_dqs[2][TOTAL_BYTELANES]
ddr2_signals
Definition: raminit.h:202
@ CTRL2
Definition: raminit.h:208
@ CTRL0
Definition: raminit.h:204
@ CMD
Definition: raminit.h:206
@ CLKSET0
Definition: raminit.h:203
@ CLKSET1
Definition: raminit.h:205
@ CTRL3
Definition: raminit.h:209
@ CTRL1
Definition: raminit.h:207
int do_write_training(struct sysinfo *s)
Definition: dq_dqs.c:253
mem_clock
Definition: raminit.h:89
@ MEM_CLOCK_1333MHz
Definition: raminit.h:95
@ MEM_CLOCK_1066MHz
Definition: raminit.h:94
@ MEM_CLOCK_533MHz
Definition: raminit.h:91
@ MEM_CLOCK_400MHz
Definition: raminit.h:90
const u8 ddr3_c2_x264[3][6]
const struct dll_setting default_ddr2_667_dqs[TOTAL_BYTELANES]
#define TOTAL_CHANNELS
Definition: raminit.h:19
u32 test_address(int channel, int rank)
const struct dll_setting default_ddr3_1067_ctrl[2][7]
const struct dll_setting default_ddr3_1333_dq[2][TOTAL_BYTELANES]
const struct dll_setting default_ddr3_800_ctrl[2][7]
void rcven(struct sysinfo *s)
Definition: rcven.c:282
void do_raminit(struct sysinfo *, int fast_boot)
const struct dll_setting default_ddr2_667_ctrl[7]
Definition: raminit_tables.c:6