spdmemvar.h revision 1.10 1 1.10 msaitoh /* $NetBSD: spdmemvar.h,v 1.10 2015/12/24 14:16:18 msaitoh Exp $ */
2 1.1 pgoyette
3 1.1 pgoyette /*
4 1.1 pgoyette * Copyright (c) 2007 Paul Goyette
5 1.1 pgoyette * Copyright (c) 2007 Tobias Nygren
6 1.1 pgoyette * All rights reserved.
7 1.1 pgoyette *
8 1.1 pgoyette * Redistribution and use in source and binary forms, with or without
9 1.1 pgoyette * modification, are permitted provided that the following conditions
10 1.1 pgoyette * are met:
11 1.1 pgoyette * 1. Redistributions of source code must retain the above copyright
12 1.1 pgoyette * notice, this list of conditions and the following disclaimer.
13 1.1 pgoyette * 2. Redistributions in binary form must reproduce the above copyright
14 1.1 pgoyette * notice, this list of conditions and the following disclaimer in the
15 1.1 pgoyette * documentation and/or other materials provided with the distribution.
16 1.1 pgoyette * 3. The name of the author may not be used to endorse or promote products
17 1.1 pgoyette * derived from this software without specific prior written permission.
18 1.1 pgoyette *
19 1.1 pgoyette * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS
20 1.1 pgoyette * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 pgoyette * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 pgoyette * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 pgoyette * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 pgoyette * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 pgoyette * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 pgoyette * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 pgoyette * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 pgoyette * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 pgoyette * POSSIBILITY OF SUCH DAMAGE.
30 1.1 pgoyette */
31 1.1 pgoyette
32 1.1 pgoyette /*
33 1.1 pgoyette * This information is extracted from JEDEC standard SPD4_01 (www.jedec.org)
34 1.1 pgoyette */
35 1.1 pgoyette
36 1.1 pgoyette #if BYTE_ORDER == BIG_ENDIAN
37 1.1 pgoyette #define SPD_BITFIELD(a, b, c, d) d; c; b; a
38 1.1 pgoyette #else
39 1.1 pgoyette #define SPD_BITFIELD(a, b, c, d) a; b; c; d
40 1.1 pgoyette #endif
41 1.1 pgoyette
42 1.5 pgoyette /*
43 1.5 pgoyette * NOTE
44 1.5 pgoyette *
45 1.5 pgoyette * Fields with "offsets" are field widths, measured in bits,
46 1.5 pgoyette * with "offset" additional bits. Thus, a field with value
47 1.5 pgoyette * of 2 with an offset of 14 defines a field with total width
48 1.5 pgoyette * of 16 bits.
49 1.5 pgoyette */
50 1.5 pgoyette
51 1.1 pgoyette struct spdmem_fpm { /* FPM and EDO DIMMS */
52 1.5 pgoyette uint8_t fpm_len;
53 1.5 pgoyette uint8_t fpm_size;
54 1.5 pgoyette uint8_t fpm_type;
55 1.1 pgoyette uint8_t fpm_rows;
56 1.1 pgoyette uint8_t fpm_cols;
57 1.1 pgoyette uint8_t fpm_banks;
58 1.1 pgoyette uint16_t fpm_datawidth; /* endian-sensitive */
59 1.1 pgoyette uint8_t fpm_voltage;
60 1.1 pgoyette uint8_t fpm_tRAC;
61 1.1 pgoyette uint8_t fpm_tCAC;
62 1.1 pgoyette uint8_t fpm_config;
63 1.1 pgoyette SPD_BITFIELD( \
64 1.1 pgoyette uint8_t fpm_refresh:7, \
65 1.1 pgoyette uint8_t fpm_selfrefresh:1, , \
66 1.1 pgoyette );
67 1.1 pgoyette uint8_t fpm_dram_dramwidth;
68 1.1 pgoyette uint8_t fpm_dram_eccwidth;
69 1.1 pgoyette uint8_t fpm_unused2[17];
70 1.1 pgoyette uint8_t fpm_superset;
71 1.1 pgoyette uint8_t fpm_unused3[30];
72 1.1 pgoyette uint8_t fpm_cksum;
73 1.1 pgoyette } __packed;
74 1.1 pgoyette
75 1.1 pgoyette struct spdmem_sdram { /* PC66/PC100/PC133 SDRAM */
76 1.5 pgoyette uint8_t sdr_len;
77 1.5 pgoyette uint8_t sdr_size;
78 1.5 pgoyette uint8_t sdr_type;
79 1.1 pgoyette SPD_BITFIELD( \
80 1.1 pgoyette uint8_t sdr_rows:4, \
81 1.1 pgoyette uint8_t sdr_rows2:4, , \
82 1.1 pgoyette );
83 1.1 pgoyette SPD_BITFIELD( \
84 1.1 pgoyette uint8_t sdr_cols:4, \
85 1.1 pgoyette uint8_t sdr_cols2:4, , \
86 1.1 pgoyette );
87 1.1 pgoyette uint8_t sdr_banks;
88 1.1 pgoyette uint16_t sdr_datawidth; /* endian-sensitive */
89 1.1 pgoyette uint8_t sdr_voltage;
90 1.1 pgoyette SPD_BITFIELD( \
91 1.1 pgoyette uint8_t sdr_cycle_tenths:4, \
92 1.1 pgoyette uint8_t sdr_cycle_whole:4, , \
93 1.1 pgoyette );
94 1.1 pgoyette SPD_BITFIELD(
95 1.1 pgoyette uint8_t sdr_tAC_tenths:4, \
96 1.1 pgoyette uint8_t sdr_tAC_whole:4, , \
97 1.1 pgoyette );
98 1.1 pgoyette uint8_t sdr_config;
99 1.1 pgoyette SPD_BITFIELD( \
100 1.1 pgoyette uint8_t sdr_refresh:7, \
101 1.1 pgoyette uint8_t sdr_selfrefresh:1, , \
102 1.1 pgoyette );
103 1.1 pgoyette SPD_BITFIELD( \
104 1.1 pgoyette uint8_t sdr_dramwidth:7, \
105 1.1 pgoyette uint8_t sdr_dram_asym_bank2:1, ,\
106 1.1 pgoyette );
107 1.1 pgoyette SPD_BITFIELD( \
108 1.1 pgoyette uint8_t sdr_eccwidth:7, \
109 1.1 pgoyette uint8_t sdr_ecc_asym_bank2:1, , \
110 1.1 pgoyette );
111 1.1 pgoyette uint8_t sdr_min_clk_delay;
112 1.1 pgoyette SPD_BITFIELD( \
113 1.1 pgoyette uint8_t sdr_burstlengths:4, \
114 1.1 pgoyette uint8_t sdr_unused1:4, , \
115 1.1 pgoyette );
116 1.1 pgoyette uint8_t sdr_banks_per_chip;
117 1.1 pgoyette uint8_t sdr_tCAS;
118 1.1 pgoyette uint8_t sdr_tCS;
119 1.1 pgoyette uint8_t sdr_tWE;
120 1.1 pgoyette uint8_t sdr_mod_attrs;
121 1.1 pgoyette uint8_t sdr_dev_attrs;
122 1.1 pgoyette uint8_t sdr_min_cc_1;
123 1.1 pgoyette uint8_t sdr_max_tAC_1;
124 1.1 pgoyette uint8_t sdr_min_cc_2;
125 1.1 pgoyette uint8_t sdr_max_tAC_2;
126 1.1 pgoyette uint8_t sdr_tRP;
127 1.1 pgoyette uint8_t sdr_tRRD;
128 1.1 pgoyette uint8_t sdr_tRCD;
129 1.1 pgoyette uint8_t sdr_tRAS;
130 1.1 pgoyette uint8_t sdr_module_rank_density;
131 1.1 pgoyette uint8_t sdr_tIS;
132 1.1 pgoyette #define sdr_superset sdr_tIS
133 1.1 pgoyette uint8_t sdr_tIH;
134 1.1 pgoyette uint8_t sdr_tDS;
135 1.1 pgoyette uint8_t sdr_tDH;
136 1.1 pgoyette uint8_t sdr_unused2[5];
137 1.1 pgoyette uint8_t sdr_tRC;
138 1.1 pgoyette uint8_t sdr_unused3[18];
139 1.1 pgoyette uint8_t sdr_esdram;
140 1.1 pgoyette uint8_t sdr_super_tech;
141 1.1 pgoyette uint8_t sdr_spdrev;
142 1.1 pgoyette uint8_t sdr_cksum;
143 1.1 pgoyette } __packed;
144 1.1 pgoyette
145 1.1 pgoyette struct spdmem_rom {
146 1.5 pgoyette uint8_t rom_len;
147 1.5 pgoyette uint8_t rom_size;
148 1.5 pgoyette uint8_t rom_type;
149 1.1 pgoyette uint8_t rom_rows;
150 1.1 pgoyette uint8_t rom_cols;
151 1.1 pgoyette uint8_t rom_banks;
152 1.1 pgoyette uint16_t rom_datawidth; /* endian-sensitive */
153 1.1 pgoyette uint8_t rom_voltage;
154 1.1 pgoyette uint16_t rom_tAA; /* endian-sensitive */
155 1.1 pgoyette uint8_t rom_config;
156 1.1 pgoyette uint8_t rom_unused1;
157 1.1 pgoyette uint8_t rom_tPA;
158 1.1 pgoyette uint8_t rom_tOE;
159 1.1 pgoyette uint16_t rom_tCE; /* endian-sensitive */
160 1.1 pgoyette uint8_t rom_burstlength;
161 1.1 pgoyette uint8_t rom_unused2[14];
162 1.1 pgoyette uint8_t rom_superset[31];
163 1.1 pgoyette uint8_t rom_cksum;
164 1.1 pgoyette } __packed;
165 1.1 pgoyette
166 1.1 pgoyette
167 1.1 pgoyette struct spdmem_ddr { /* Dual Data Rate SDRAM */
168 1.5 pgoyette uint8_t ddr_len;
169 1.5 pgoyette uint8_t ddr_size;
170 1.5 pgoyette uint8_t ddr_type;
171 1.1 pgoyette SPD_BITFIELD( \
172 1.1 pgoyette uint8_t ddr_rows:4, \
173 1.1 pgoyette uint8_t ddr_rows2:4, , \
174 1.1 pgoyette );
175 1.1 pgoyette SPD_BITFIELD( \
176 1.1 pgoyette uint8_t ddr_cols:4, \
177 1.1 pgoyette uint8_t ddr_cols2:4, , \
178 1.1 pgoyette );
179 1.1 pgoyette uint8_t ddr_ranks;
180 1.1 pgoyette uint16_t ddr_datawidth; /* endian-sensitive */
181 1.1 pgoyette uint8_t ddr_voltage;
182 1.1 pgoyette SPD_BITFIELD( \
183 1.1 pgoyette uint8_t ddr_cycle_tenths:4, \
184 1.1 pgoyette uint8_t ddr_cycle_whole:4, , \
185 1.1 pgoyette );
186 1.1 pgoyette SPD_BITFIELD( \
187 1.1 pgoyette uint8_t ddr_tAC_hundredths:4, \
188 1.1 pgoyette uint8_t ddr_tAC_tenths:4, , \
189 1.1 pgoyette );
190 1.1 pgoyette uint8_t ddr_config;
191 1.1 pgoyette SPD_BITFIELD( \
192 1.1 pgoyette uint8_t ddr_refresh:7, \
193 1.1 pgoyette uint8_t ddr_selfrefresh:1, , \
194 1.1 pgoyette );
195 1.1 pgoyette SPD_BITFIELD( \
196 1.1 pgoyette uint8_t ddr_dramwidth:7, \
197 1.1 pgoyette uint8_t ddr_dram_asym_bank2:1, ,\
198 1.1 pgoyette );
199 1.1 pgoyette SPD_BITFIELD( \
200 1.1 pgoyette uint8_t ddr_eccwidth:7, \
201 1.1 pgoyette uint8_t ddr_ecc_asym_bank2:1, , \
202 1.1 pgoyette );
203 1.1 pgoyette uint8_t ddr_min_clk_delay;
204 1.1 pgoyette SPD_BITFIELD( \
205 1.1 pgoyette uint8_t ddr_burstlengths:4, \
206 1.1 pgoyette uint8_t ddr_unused1:4, , \
207 1.1 pgoyette );
208 1.1 pgoyette uint8_t ddr_banks_per_chip;
209 1.1 pgoyette uint8_t ddr_tCAS;
210 1.1 pgoyette uint8_t ddr_tCS;
211 1.1 pgoyette uint8_t ddr_tWE;
212 1.1 pgoyette uint8_t ddr_mod_attrs;
213 1.1 pgoyette uint8_t ddr_dev_attrs;
214 1.1 pgoyette uint8_t ddr_min_cc_05;
215 1.1 pgoyette uint8_t ddr_max_tAC_05;
216 1.1 pgoyette uint8_t ddr_min_cc_1;
217 1.1 pgoyette uint8_t ddr_max_tAC_1;
218 1.1 pgoyette uint8_t ddr_tRP;
219 1.1 pgoyette uint8_t ddr_tRRD;
220 1.1 pgoyette uint8_t ddr_tRCD;
221 1.1 pgoyette uint8_t ddr_tRAS;
222 1.1 pgoyette uint8_t ddr_module_rank_density;
223 1.1 pgoyette uint8_t ddr_tIS;
224 1.1 pgoyette #define ddr_superset ddr_tIS
225 1.1 pgoyette uint8_t ddr_tIH;
226 1.1 pgoyette uint8_t ddr_tDS;
227 1.1 pgoyette uint8_t ddr_tDH;
228 1.1 pgoyette uint8_t ddr_unused2[5];
229 1.1 pgoyette uint8_t ddr_tRC;
230 1.1 pgoyette uint8_t ddr_tRFC;
231 1.1 pgoyette uint8_t ddr_tCK;
232 1.1 pgoyette uint8_t ddr_tDQSQ;
233 1.1 pgoyette uint8_t ddr_tQHS;
234 1.1 pgoyette uint8_t ddr_unused3;
235 1.1 pgoyette uint8_t ddr_height;
236 1.1 pgoyette uint8_t ddr_unused4[15];
237 1.1 pgoyette uint8_t ddr_cksum;
238 1.1 pgoyette } __packed;
239 1.1 pgoyette
240 1.1 pgoyette struct spdmem_ddr2 { /* Dual Data Rate 2 SDRAM */
241 1.5 pgoyette uint8_t ddr2_len;
242 1.5 pgoyette uint8_t ddr2_size;
243 1.5 pgoyette uint8_t ddr2_type;
244 1.1 pgoyette SPD_BITFIELD( \
245 1.1 pgoyette uint8_t ddr2_rows:5, \
246 1.1 pgoyette uint8_t ddr2_unused1:3, , \
247 1.1 pgoyette );
248 1.1 pgoyette SPD_BITFIELD( \
249 1.1 pgoyette uint8_t ddr2_cols:4, \
250 1.1 pgoyette uint8_t ddr2_unused2:4, , \
251 1.1 pgoyette );
252 1.1 pgoyette SPD_BITFIELD( \
253 1.1 pgoyette uint8_t ddr2_ranks:3,
254 1.1 pgoyette uint8_t ddr2_cardoncard:1, \
255 1.1 pgoyette uint8_t ddr2_package:1, \
256 1.1 pgoyette uint8_t ddr2_height:3 \
257 1.1 pgoyette );
258 1.1 pgoyette uint8_t ddr2_datawidth;
259 1.1 pgoyette uint8_t ddr2_unused3;
260 1.1 pgoyette uint8_t ddr2_voltage;
261 1.1 pgoyette SPD_BITFIELD( \
262 1.1 pgoyette uint8_t ddr2_cycle_frac:4, \
263 1.1 pgoyette uint8_t ddr2_cycle_whole:4, , \
264 1.1 pgoyette );
265 1.1 pgoyette SPD_BITFIELD( \
266 1.1 pgoyette uint8_t ddr2_tAC_hundredths:4, \
267 1.1 pgoyette uint8_t ddr2_tAC_tenths:4, , \
268 1.1 pgoyette );
269 1.1 pgoyette uint8_t ddr2_config;
270 1.1 pgoyette SPD_BITFIELD( \
271 1.1 pgoyette uint8_t ddr2_refresh:7, \
272 1.1 pgoyette uint8_t ddr2_selfrefresh:1, , \
273 1.1 pgoyette );
274 1.1 pgoyette uint8_t ddr2_dramwidth;
275 1.1 pgoyette uint8_t ddr2_eccwidth;
276 1.1 pgoyette uint8_t ddr2_unused4;
277 1.1 pgoyette SPD_BITFIELD( \
278 1.1 pgoyette uint8_t ddr2_burstlengths:4, \
279 1.1 pgoyette uint8_t ddr2_unused5:4, , \
280 1.1 pgoyette );
281 1.1 pgoyette uint8_t ddr2_banks_per_chip;
282 1.1 pgoyette uint8_t ddr2_tCAS;
283 1.1 pgoyette uint8_t ddr2_mechanical;
284 1.1 pgoyette uint8_t ddr2_dimm_type;
285 1.1 pgoyette uint8_t ddr2_mod_attrs;
286 1.1 pgoyette uint8_t ddr2_dev_attrs;
287 1.1 pgoyette uint8_t ddr2_min_cc_1;
288 1.1 pgoyette uint8_t ddr2_max_tAC_1;
289 1.1 pgoyette uint8_t ddr2_min_cc_2;
290 1.1 pgoyette uint8_t ddr2_max_tAC_2;
291 1.1 pgoyette uint8_t ddr2_tRP;
292 1.1 pgoyette uint8_t ddr2_tRRD;
293 1.1 pgoyette uint8_t ddr2_tRCD;
294 1.1 pgoyette uint8_t ddr2_tRAS;
295 1.1 pgoyette uint8_t ddr2_module_rank_density;
296 1.1 pgoyette uint8_t ddr2_tIS;
297 1.1 pgoyette uint8_t ddr2_tIH;
298 1.1 pgoyette uint8_t ddr2_tDS;
299 1.1 pgoyette uint8_t ddr2_tDH;
300 1.1 pgoyette uint8_t ddr2_tWR;
301 1.1 pgoyette uint8_t ddr2_tWTR;
302 1.1 pgoyette uint8_t ddr2_tRTP;
303 1.1 pgoyette uint8_t ddr2_probe;
304 1.1 pgoyette uint8_t ddr2_extensions;
305 1.1 pgoyette uint8_t ddr2_tRC;
306 1.1 pgoyette uint8_t ddr2_tRFC;
307 1.1 pgoyette uint8_t ddr2_tCK;
308 1.1 pgoyette uint8_t ddr2_tDQSQ;
309 1.1 pgoyette uint8_t ddr2_tQHS;
310 1.1 pgoyette uint8_t ddr2_pll_relock;
311 1.1 pgoyette uint8_t ddr2_Tcasemax;
312 1.1 pgoyette uint8_t ddr2_Psi_TA_DRAM;
313 1.1 pgoyette uint8_t ddr2_dt0;
314 1.1 pgoyette uint8_t ddr2_dt2NQ;
315 1.1 pgoyette uint8_t ddr2_dr2P;
316 1.1 pgoyette uint8_t ddr2_dt3N;
317 1.1 pgoyette uint8_t ddr2_dt3Pfast;
318 1.1 pgoyette uint8_t ddr2_dt3Pslow;
319 1.1 pgoyette uint8_t ddr2_dt4R_4R4W_mode;
320 1.1 pgoyette uint8_t ddr2_dt5B;
321 1.1 pgoyette uint8_t ddr2_dt7;
322 1.1 pgoyette uint8_t ddr2_Psi_TA_PLL;
323 1.1 pgoyette uint8_t ddr2_Psi_TA_Reg;
324 1.1 pgoyette uint8_t ddr2_dt_PLL_Active;
325 1.1 pgoyette uint8_t ddr2_dt_Reg_Active;
326 1.1 pgoyette uint8_t ddr2_spdrev;
327 1.1 pgoyette uint8_t ddr2_cksum;
328 1.1 pgoyette } __packed;
329 1.1 pgoyette
330 1.1 pgoyette struct spdmem_fbdimm { /* Fully-buffered DIMM */
331 1.5 pgoyette uint8_t fbdimm_len;
332 1.5 pgoyette uint8_t fbdimm_size;
333 1.5 pgoyette uint8_t fbdimm_type;
334 1.1 pgoyette SPD_BITFIELD( \
335 1.1 pgoyette uint8_t fbdimm_ps1_voltage:4, \
336 1.1 pgoyette uint8_t fbdimm_ps2_voltage:4, , \
337 1.1 pgoyette );
338 1.1 pgoyette SPD_BITFIELD( \
339 1.1 pgoyette uint8_t fbdimm_banks:2, \
340 1.1 pgoyette uint8_t fbdimm_cols:3, \
341 1.1 pgoyette uint8_t fbdimm_rows:3, \
342 1.1 pgoyette );
343 1.1 pgoyette SPD_BITFIELD( \
344 1.1 pgoyette uint8_t fbdimm_thick:3, \
345 1.1 pgoyette uint8_t fbdimm_height:3, \
346 1.1 pgoyette uint8_t fbdimm_unused1:2, \
347 1.1 pgoyette );
348 1.1 pgoyette uint8_t fbdimm_mod_type;
349 1.1 pgoyette SPD_BITFIELD( \
350 1.1 pgoyette uint8_t fbdimm_dev_width:3, \
351 1.1 pgoyette uint8_t fbdimm_ranks:3, \
352 1.1 pgoyette uint8_t fbdimm_unused2:2, \
353 1.1 pgoyette );
354 1.1 pgoyette SPD_BITFIELD( \
355 1.1 pgoyette uint8_t fbdimm_ftb_divisor:4, \
356 1.1 pgoyette uint8_t fbdimm_ftp_dividend:4, ,\
357 1.1 pgoyette );
358 1.1 pgoyette uint8_t fbdimm_mtb_dividend;
359 1.1 pgoyette uint8_t fbdimm_mtb_divisor;
360 1.1 pgoyette uint8_t fbdimm_tCKmin;
361 1.1 pgoyette uint8_t fbdimm_tCKmax;
362 1.1 pgoyette uint8_t fbdimm_tCAS;
363 1.1 pgoyette uint8_t fbdimm_tAAmin;
364 1.1 pgoyette SPD_BITFIELD( \
365 1.1 pgoyette uint8_t fbdimm_tWR_min:4, \
366 1.1 pgoyette uint8_t fbdimm_WR_range:4, , \
367 1.1 pgoyette );
368 1.1 pgoyette uint8_t fbdimm_tWR;
369 1.1 pgoyette SPD_BITFIELD( \
370 1.1 pgoyette uint8_t fbdimm_tWL_min:4, \
371 1.1 pgoyette uint8_t fbdimm_tWL_range:4, , \
372 1.1 pgoyette );
373 1.1 pgoyette SPD_BITFIELD( \
374 1.1 pgoyette uint8_t fbdimm_tAL_min:4, \
375 1.1 pgoyette uint8_t fbdimm_tAL_range:4, , \
376 1.1 pgoyette );
377 1.1 pgoyette uint8_t fbdimm_tRCDmin;
378 1.1 pgoyette uint8_t fbdimm_tRRDmin;
379 1.1 pgoyette uint8_t fbdimm_tRPmin;
380 1.1 pgoyette SPD_BITFIELD( \
381 1.1 pgoyette uint8_t fbdimm_tRAS_msb:4, \
382 1.1 pgoyette uint8_t fbdimm_tRC_msb:4, , \
383 1.1 pgoyette );
384 1.1 pgoyette uint8_t fbdimm_tRAS_lsb;
385 1.1 pgoyette uint8_t fbdimm_tRC_lsb;
386 1.1 pgoyette uint16_t fbdimm_tRFC; /* endian-sensitive */
387 1.1 pgoyette uint8_t fbdimm_tWTR;
388 1.1 pgoyette uint8_t fbdimm_tRTP;
389 1.1 pgoyette SPD_BITFIELD( \
390 1.1 pgoyette uint8_t fbdimm_burst_4:1, \
391 1.1 pgoyette uint8_t fbdimm_burst_8:1, \
392 1.1 pgoyette uint8_t fbdimm_unused3:6, \
393 1.1 pgoyette );
394 1.1 pgoyette uint8_t fbdimm_terms;
395 1.1 pgoyette uint8_t fbdimm_drivers;
396 1.1 pgoyette uint8_t fbdimm_tREFI;
397 1.1 pgoyette uint8_t fbdimm_Tcasemax;
398 1.1 pgoyette uint8_t fbdimm_Psi_TA_SDRAM;
399 1.1 pgoyette uint8_t fbdimm_DT0;
400 1.1 pgoyette uint8_t fbdimm_DT2N_DT2Q;
401 1.1 pgoyette uint8_t fbdimm_DT2P;
402 1.1 pgoyette uint8_t fbdimm_DT3N;
403 1.1 pgoyette uint8_t fbdimm_DT4R_DT4R4W;
404 1.1 pgoyette uint8_t fbdimm_DT5B;
405 1.1 pgoyette uint8_t fbdimm_DT7;
406 1.1 pgoyette uint8_t fbdimm_unused4[84];
407 1.1 pgoyette uint16_t fbdimm_crc;
408 1.1 pgoyette } __packed;
409 1.1 pgoyette
410 1.1 pgoyette struct spdmem_rambus { /* Direct Rambus DRAM */
411 1.5 pgoyette uint8_t rdr_len;
412 1.5 pgoyette uint8_t rdr_size;
413 1.5 pgoyette uint8_t rdr_type;
414 1.1 pgoyette SPD_BITFIELD( \
415 1.1 pgoyette uint8_t rdr_rows:4, \
416 1.1 pgoyette uint8_t rdr_cols:4, , \
417 1.1 pgoyette );
418 1.1 pgoyette } __packed;
419 1.1 pgoyette
420 1.1 pgoyette struct spdmem_ddr3 { /* Dual Data Rate 3 SDRAM */
421 1.5 pgoyette uint8_t ddr3_len;
422 1.5 pgoyette uint8_t ddr3_size;
423 1.5 pgoyette uint8_t ddr3_type;
424 1.1 pgoyette uint8_t ddr3_mod_type;
425 1.1 pgoyette SPD_BITFIELD( \
426 1.1 pgoyette /* chipsize is offset by 28: 0 = 256M, 1 = 512M, ... */ \
427 1.1 pgoyette uint8_t ddr3_chipsize:4, \
428 1.1 pgoyette /* logbanks is offset by 3 */ \
429 1.1 pgoyette uint8_t ddr3_logbanks:3, \
430 1.1 pgoyette uint8_t ddr3_unused1:1, \
431 1.1 pgoyette );
432 1.1 pgoyette /* cols is offset by 9, rows offset by 12 */
433 1.1 pgoyette SPD_BITFIELD( \
434 1.1 pgoyette uint8_t ddr3_cols:3, \
435 1.1 pgoyette uint8_t ddr3_rows:5, , \
436 1.1 pgoyette );
437 1.1 pgoyette SPD_BITFIELD( \
438 1.1 pgoyette uint8_t ddr3_NOT15V:1, \
439 1.1 pgoyette uint8_t ddr3_135V:1, \
440 1.7 msaitoh uint8_t ddr3_125V:1, \
441 1.1 pgoyette uint8_t ddr3_unused2:5 \
442 1.1 pgoyette );
443 1.1 pgoyette /* chipwidth in bits offset by 2: 0 = X4, 1 = X8, 2 = X16 */
444 1.1 pgoyette /* physbanks is offset by 1 */
445 1.1 pgoyette SPD_BITFIELD( \
446 1.1 pgoyette uint8_t ddr3_chipwidth:3, \
447 1.1 pgoyette uint8_t ddr3_physbanks:5, , \
448 1.1 pgoyette );
449 1.1 pgoyette /* datawidth in bits offset by 3: 1 = 16b, 2 = 32b, 3 = 64b */
450 1.1 pgoyette SPD_BITFIELD( \
451 1.1 pgoyette uint8_t ddr3_datawidth:3, \
452 1.1 pgoyette uint8_t ddr3_hasECC:2, \
453 1.1 pgoyette uint8_t ddr3_unused2a:3 , \
454 1.1 pgoyette );
455 1.1 pgoyette /* Fine time base, in pico-seconds */
456 1.1 pgoyette SPD_BITFIELD( \
457 1.1 pgoyette uint8_t ddr3_ftb_divisor:4, \
458 1.1 pgoyette uint8_t ddr3_ftb_dividend:4, , \
459 1.1 pgoyette );
460 1.1 pgoyette uint8_t ddr3_mtb_dividend; /* 0x0108 = 0.1250ns */
461 1.1 pgoyette uint8_t ddr3_mtb_divisor; /* 0x010f = 0.0625ns */
462 1.1 pgoyette uint8_t ddr3_tCKmin; /* in terms of mtb */
463 1.1 pgoyette uint8_t ddr3_unused3;
464 1.1 pgoyette uint16_t ddr3_CAS_sup; /* Bit 0 ==> CAS 4 cycles */
465 1.1 pgoyette uint8_t ddr3_tAAmin; /* in terms of mtb */
466 1.1 pgoyette uint8_t ddr3_tWRmin;
467 1.1 pgoyette uint8_t ddr3_tRCDmin;
468 1.1 pgoyette uint8_t ddr3_tRRDmin;
469 1.1 pgoyette uint8_t ddr3_tRPmin;
470 1.1 pgoyette SPD_BITFIELD( \
471 1.1 pgoyette uint8_t ddr3_tRAS_msb:4, \
472 1.1 pgoyette uint8_t ddr3_tRC_msb:4, , \
473 1.1 pgoyette );
474 1.1 pgoyette uint8_t ddr3_tRAS_lsb;
475 1.1 pgoyette uint8_t ddr3_tRC_lsb;
476 1.1 pgoyette uint8_t ddr3_tRFCmin_lsb;
477 1.1 pgoyette uint8_t ddr3_tRFCmin_msb;
478 1.1 pgoyette uint8_t ddr3_tWTRmin;
479 1.1 pgoyette uint8_t ddr3_tRTPmin;
480 1.1 pgoyette SPD_BITFIELD( \
481 1.1 pgoyette uint8_t ddr3_tFAW_msb:4, , , \
482 1.1 pgoyette );
483 1.1 pgoyette uint8_t ddr3_tFAW_lsb;
484 1.1 pgoyette uint8_t ddr3_output_drvrs;
485 1.1 pgoyette SPD_BITFIELD( \
486 1.1 pgoyette uint8_t ddr3_ext_temp_range:1, \
487 1.1 pgoyette uint8_t ddr3_ext_temp_2x_refresh:1, \
488 1.1 pgoyette uint8_t ddr3_asr_refresh:1, \
489 1.1 pgoyette /* Bit 4 indicates on-die thermal sensor */
490 1.1 pgoyette /* Bit 7 indicates Partial-Array Self-Refresh (PASR) */
491 1.1 pgoyette uint8_t ddr3_unused7:5 \
492 1.1 pgoyette );
493 1.1 pgoyette SPD_BITFIELD( \
494 1.1 pgoyette uint8_t ddr3_therm_sensor_acc:7,\
495 1.1 pgoyette uint8_t ddr3_has_therm_sensor:1, , \
496 1.1 pgoyette );
497 1.1 pgoyette SPD_BITFIELD( \
498 1.1 pgoyette uint8_t ddr3_non_std_devtype:7, \
499 1.1 pgoyette uint8_t ddr3_std_device:1, , \
500 1.1 pgoyette );
501 1.1 pgoyette uint8_t ddr3_unused4[26];
502 1.1 pgoyette uint8_t ddr3_mod_height;
503 1.1 pgoyette uint8_t ddr3_mod_thickness;
504 1.1 pgoyette uint8_t ddr3_ref_card;
505 1.1 pgoyette uint8_t ddr3_mapping;
506 1.1 pgoyette uint8_t ddr3_unused5[53];
507 1.1 pgoyette uint8_t ddr3_mfgID_lsb;
508 1.1 pgoyette uint8_t ddr3_mfgID_msb;
509 1.1 pgoyette uint8_t ddr3_mfgloc;
510 1.1 pgoyette uint8_t ddr3_mfg_year;
511 1.1 pgoyette uint8_t ddr3_mfg_week;
512 1.1 pgoyette uint8_t ddr3_serial[4];
513 1.1 pgoyette uint16_t ddr3_crc;
514 1.3 soren uint8_t ddr3_part[18];
515 1.3 soren uint8_t ddr3_rev[2];
516 1.3 soren uint8_t ddr3_dram_mfgID_lsb;
517 1.3 soren uint8_t ddr3_dram_mfgID_msb;
518 1.3 soren uint8_t ddr3_vendor[26];
519 1.1 pgoyette } __packed;
520 1.1 pgoyette
521 1.5 pgoyette /* DDR4 info from JEDEC Standard No. 21-C, Annex L - 4.1.2.12 */
522 1.5 pgoyette
523 1.5 pgoyette /* Module-type specific bytes - bytes 0x080 thru 0x0ff */
524 1.5 pgoyette
525 1.5 pgoyette struct spdmem_ddr4_mod_unbuffered {
526 1.5 pgoyette SPD_BITFIELD( \
527 1.5 pgoyette uint8_t ddr4_unbuf_mod_height:4, \
528 1.5 pgoyette uint8_t ddr4_unbuf_card_ext:4, , \
529 1.5 pgoyette );
530 1.5 pgoyette SPD_BITFIELD( \
531 1.5 pgoyette uint8_t ddr4_unbuf_max_thick_front:4, \
532 1.5 pgoyette uint8_t ddr4_unbuf_max_thick_back:4, , \
533 1.5 pgoyette );
534 1.5 pgoyette SPD_BITFIELD( \
535 1.5 pgoyette uint8_t ddr4_unbuf_refcard:5, \
536 1.5 pgoyette uint8_t ddr4_unbuf_refcard_rev:2, \
537 1.5 pgoyette uint8_t ddr4_unbuf_refcard_ext:1, \
538 1.5 pgoyette );
539 1.5 pgoyette SPD_BITFIELD( \
540 1.5 pgoyette uint8_t ddr4_unbuf_mirror_mapping:1, \
541 1.5 pgoyette uint8_t ddr4_unbuf_unused1:7, , \
542 1.5 pgoyette );
543 1.5 pgoyette uint8_t ddr4_unbuf_unused2[122];
544 1.5 pgoyette uint8_t ddr4_unbuf_crc[2];
545 1.5 pgoyette } __packed;
546 1.5 pgoyette
547 1.5 pgoyette struct spdmem_ddr4_mod_registered {
548 1.5 pgoyette SPD_BITFIELD( \
549 1.5 pgoyette uint8_t ddr4_reg_mod_height:4, \
550 1.5 pgoyette uint8_t ddr4_reg_card_ext:4, , \
551 1.5 pgoyette );
552 1.5 pgoyette SPD_BITFIELD( \
553 1.5 pgoyette uint8_t ddr4_reg_max_thick_front:4, \
554 1.5 pgoyette uint8_t ddr4_reg_max_thick_back:4, , \
555 1.5 pgoyette );
556 1.5 pgoyette SPD_BITFIELD( \
557 1.5 pgoyette uint8_t ddr4_reg_refcard:5, \
558 1.5 pgoyette uint8_t ddr4_reg_refcard_rev:2, \
559 1.5 pgoyette uint8_t ddr4_reg_refcard_ext:1, \
560 1.5 pgoyette );
561 1.5 pgoyette SPD_BITFIELD( \
562 1.5 pgoyette uint8_t ddr4_reg_regcnt:2, \
563 1.5 pgoyette uint8_t ddr4_reg_dram_rows:2, \
564 1.5 pgoyette uint8_t ddr4_reg_unused1:4, \
565 1.5 pgoyette );
566 1.5 pgoyette SPD_BITFIELD( \
567 1.5 pgoyette uint8_t ddr4_reg_heat_spread_char:7, \
568 1.5 pgoyette uint8_t ddr4_reg_heat_spread_exist:1, , \
569 1.5 pgoyette );
570 1.5 pgoyette uint8_t ddr4_reg_mfg_id_lsb;
571 1.5 pgoyette uint8_t ddr4_reg_mfg_id_msb;
572 1.5 pgoyette uint8_t ddr4_reg_revision;
573 1.5 pgoyette SPD_BITFIELD( \
574 1.5 pgoyette uint8_t ddr4_reg_mirror_mapping:1, \
575 1.5 pgoyette uint8_t ddr4_reg_unused2:7, , \
576 1.5 pgoyette );
577 1.5 pgoyette SPD_BITFIELD( \
578 1.5 pgoyette uint8_t ddr4_reg_output_drive_CKE:2, \
579 1.5 pgoyette uint8_t ddr4_reg_output_drive_ODT:2, \
580 1.5 pgoyette uint8_t ddr4_reg_output_drive_CmdAddr:2,\
581 1.5 pgoyette uint8_t ddr4_reg_output_drive_chipsel:2 \
582 1.5 pgoyette );
583 1.5 pgoyette SPD_BITFIELD( \
584 1.5 pgoyette uint8_t ddr4_reg_output_drive_CK_Y0Y2:2,\
585 1.5 pgoyette uint8_t ddr4_reg_output_drive_CK_Y1Y3:2,\
586 1.5 pgoyette uint8_t ddr4_reg_unused3:4, \
587 1.5 pgoyette );
588 1.5 pgoyette uint8_t ddr4_reg_unused4[115];
589 1.5 pgoyette uint8_t ddr4_reg_crc[2];
590 1.5 pgoyette } __packed;
591 1.5 pgoyette
592 1.5 pgoyette struct spdmem_ddr4_mod_reduced_load {
593 1.5 pgoyette SPD_BITFIELD( \
594 1.5 pgoyette uint8_t ddr4_rload_mod_height:4, \
595 1.5 pgoyette uint8_t ddr4_rload_card_ext:4, , \
596 1.5 pgoyette );
597 1.5 pgoyette SPD_BITFIELD( \
598 1.5 pgoyette uint8_t ddr4_rload_max_thick_front:4, \
599 1.5 pgoyette uint8_t ddr4_rload_max_thick_back:4, , \
600 1.5 pgoyette );
601 1.5 pgoyette SPD_BITFIELD( \
602 1.5 pgoyette uint8_t ddr4_rload_refcard:5, \
603 1.5 pgoyette uint8_t ddr4_rload_refcard_rev:2, \
604 1.5 pgoyette uint8_t ddr4_rload_refcard_ext:1, \
605 1.5 pgoyette );
606 1.5 pgoyette SPD_BITFIELD( \
607 1.5 pgoyette uint8_t ddr4_rload_regcnt:2, \
608 1.5 pgoyette uint8_t ddr4_rload_dram_rows:2, \
609 1.5 pgoyette uint8_t ddr4_rload_unused1:4, \
610 1.5 pgoyette );
611 1.5 pgoyette SPD_BITFIELD( \
612 1.5 pgoyette uint8_t ddr4_rload_unused2:7, \
613 1.5 pgoyette uint8_t ddr4_rload_heat_spread_exist:1, , \
614 1.5 pgoyette );
615 1.5 pgoyette uint8_t ddr4_rload_reg_mfg_id_lsb;
616 1.5 pgoyette uint8_t ddr4_rload_reg_mfg_id_msb;
617 1.5 pgoyette uint8_t ddr4_rload_reg_revision;
618 1.5 pgoyette SPD_BITFIELD( \
619 1.5 pgoyette uint8_t ddr4_rload_reg_mirror_mapping:1,\
620 1.5 pgoyette uint8_t ddr4_rload_unused3:7, , \
621 1.5 pgoyette );
622 1.5 pgoyette SPD_BITFIELD( \
623 1.5 pgoyette uint8_t ddr4_rload_output_drive_CKE:2, \
624 1.5 pgoyette uint8_t ddr4_rload_output_drive_ODT:2, \
625 1.5 pgoyette uint8_t ddr4_rload_output_drive_CmdAddr:2, \
626 1.5 pgoyette uint8_t ddr4_rload_output_drive_chipsel:2 \
627 1.5 pgoyette );
628 1.5 pgoyette SPD_BITFIELD( \
629 1.5 pgoyette uint8_t ddr4_rload_output_drive_CK_Y0Y2:2, \
630 1.5 pgoyette uint8_t ddr4_rload_output_drive_CK_Y1Y3:2, \
631 1.5 pgoyette uint8_t ddr4_rload_unused4:4, \
632 1.5 pgoyette );
633 1.5 pgoyette uint8_t ddr4_rload_dbuff_revision;
634 1.5 pgoyette SPD_BITFIELD( \
635 1.5 pgoyette uint8_t ddr4_rload_VrefDQ_0:6, \
636 1.5 pgoyette uint8_t ddr4_rload_unused5:2, , \
637 1.5 pgoyette );
638 1.5 pgoyette SPD_BITFIELD( \
639 1.5 pgoyette uint8_t ddr4_rload_VrefDQ_1:6, \
640 1.5 pgoyette uint8_t ddr4_rload_unused6:2, , \
641 1.5 pgoyette );
642 1.5 pgoyette SPD_BITFIELD( \
643 1.5 pgoyette uint8_t ddr4_rload_VrefDQ_2:6, \
644 1.5 pgoyette uint8_t ddr4_rload_unused7:2, , \
645 1.5 pgoyette );
646 1.5 pgoyette SPD_BITFIELD( \
647 1.5 pgoyette uint8_t ddr4_rload_VrefDQ_3:6, \
648 1.5 pgoyette uint8_t ddr4_rload_unused8:2, , \
649 1.5 pgoyette );
650 1.5 pgoyette SPD_BITFIELD( \
651 1.5 pgoyette uint8_t ddr4_rload_VrefDQ_buffer:6, \
652 1.5 pgoyette uint8_t ddr4_rload_unused9:2, , \
653 1.5 pgoyette );
654 1.5 pgoyette SPD_BITFIELD( \
655 1.5 pgoyette uint8_t ddr4_rload_MDQ_Read_Term_Str_1866:3, \
656 1.5 pgoyette uint8_t ddr4_rload_unused10:1, \
657 1.5 pgoyette uint8_t ddr4_rload_MDQ_Drive_Str_1866:3, \
658 1.5 pgoyette uint8_t ddr4_rload_unused11:1 \
659 1.5 pgoyette );
660 1.5 pgoyette SPD_BITFIELD( \
661 1.5 pgoyette uint8_t ddr4_rload_MDQ_Read_Term_Str_2400:3, \
662 1.5 pgoyette uint8_t ddr4_rload_unused12:1, \
663 1.5 pgoyette uint8_t ddr4_rload_MDQ_Drive_Str_2400:3, \
664 1.5 pgoyette uint8_t ddr4_rload_unused13:1 \
665 1.5 pgoyette );
666 1.5 pgoyette SPD_BITFIELD( \
667 1.5 pgoyette uint8_t ddr4_rload_MDQ_Read_Term_Str_3200:3, \
668 1.5 pgoyette uint8_t ddr4_rload_unused14:1, \
669 1.5 pgoyette uint8_t ddr4_rload_MDQ_Drive_Str_3200:3, \
670 1.5 pgoyette uint8_t ddr4_rload_unused15:1 \
671 1.5 pgoyette );
672 1.5 pgoyette SPD_BITFIELD( \
673 1.5 pgoyette uint8_t ddr4_rload_DRAM_Drive_Str_1866:2, \
674 1.5 pgoyette uint8_t ddr4_rload_DRAM_Drive_Str_2400:2, \
675 1.5 pgoyette uint8_t ddr4_rload_DRAM_Drive_Str_3200:2, \
676 1.5 pgoyette uint8_t ddr4_rload_unused16:2 \
677 1.5 pgoyette );
678 1.5 pgoyette SPD_BITFIELD( \
679 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_1866:3, \
680 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_WR_1866:3, \
681 1.5 pgoyette uint8_t ddr4_rload_unused17:2, \
682 1.5 pgoyette );
683 1.5 pgoyette SPD_BITFIELD( \
684 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_2400:3, \
685 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_WR_2400:3, \
686 1.5 pgoyette uint8_t ddr4_rload_unused18:2, \
687 1.5 pgoyette );
688 1.5 pgoyette SPD_BITFIELD( \
689 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_3200:3, \
690 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_WR_3200:3, \
691 1.5 pgoyette uint8_t ddr4_rload_unused19:2, \
692 1.5 pgoyette );
693 1.5 pgoyette SPD_BITFIELD( \
694 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_1866:3, \
695 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_1866:3, \
696 1.5 pgoyette uint8_t ddr4_rload_unused20:2, \
697 1.5 pgoyette );
698 1.5 pgoyette SPD_BITFIELD( \
699 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_2400:3, \
700 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_2400:3, \
701 1.5 pgoyette uint8_t ddr4_rload_unused21:2, \
702 1.5 pgoyette );
703 1.5 pgoyette SPD_BITFIELD( \
704 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_3200:3, \
705 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_3200:3, \
706 1.5 pgoyette uint8_t ddr4_rload_unused22:2, \
707 1.5 pgoyette );
708 1.5 pgoyette uint8_t ddr4_rload_unused23[99];
709 1.5 pgoyette uint8_t ddr4_rload_crc[2];
710 1.5 pgoyette } __packed;
711 1.5 pgoyette
712 1.5 pgoyette struct spdmem_ddr4 { /* Dual Data Rate 4 SDRAM */
713 1.5 pgoyette SPD_BITFIELD( \
714 1.5 pgoyette uint8_t ddr4_ROM_used:4, \
715 1.5 pgoyette uint8_t ddr4_ROM_size:3, \
716 1.5 pgoyette uint8_t ddr4_unused0:1, \
717 1.5 pgoyette );
718 1.5 pgoyette uint8_t ddr4_romrev;
719 1.5 pgoyette uint8_t ddr4_type;
720 1.5 pgoyette SPD_BITFIELD( \
721 1.5 pgoyette uint8_t ddr4_mod_type:4, \
722 1.10 msaitoh uint8_t ddr4_hybrid_media:3, \
723 1.10 msaitoh uint8_t ddr4_hybrid:1, \
724 1.5 pgoyette );
725 1.5 pgoyette SPD_BITFIELD( \
726 1.5 pgoyette /* capacity is offset by 28: 0 = 256M, 1 = 512M, ... */ \
727 1.5 pgoyette uint8_t ddr4_capacity:4, \
728 1.5 pgoyette /* logbanks is offset by 2 */ \
729 1.5 pgoyette uint8_t ddr4_logbanks:2, \
730 1.5 pgoyette /* bankgroups is offset by 0 */
731 1.5 pgoyette uint8_t ddr4_bankgroups:2, \
732 1.5 pgoyette );
733 1.5 pgoyette /* cols is offset by 9, rows offset by 12 */
734 1.5 pgoyette SPD_BITFIELD( \
735 1.5 pgoyette uint8_t ddr4_cols:3, \
736 1.5 pgoyette uint8_t ddr4_rows:3, \
737 1.5 pgoyette uint8_t ddr4_unused2:2, \
738 1.5 pgoyette );
739 1.5 pgoyette SPD_BITFIELD( \
740 1.5 pgoyette uint8_t ddr4_signal_loading:2, \
741 1.5 pgoyette uint8_t ddr4_unused3:2, \
742 1.5 pgoyette uint8_t ddr4_diecount:3, \
743 1.6 ozaki uint8_t ddr4_non_monolithic:1 \
744 1.5 pgoyette );
745 1.5 pgoyette SPD_BITFIELD( \
746 1.5 pgoyette uint8_t ddr4_max_activate_count:4, \
747 1.5 pgoyette uint8_t ddr4_max_activate_window:2, \
748 1.5 pgoyette uint8_t ddr4_unused4:2, \
749 1.5 pgoyette );
750 1.5 pgoyette uint8_t ddr4_unused5; /* SDRAM Thermal & Refresh Options */
751 1.5 pgoyette SPD_BITFIELD( \
752 1.5 pgoyette uint8_t ddr4_unused6:6, \
753 1.5 pgoyette uint8_t ddr4_ppr_support:2, , /* post package repair */ \
754 1.5 pgoyette );
755 1.5 pgoyette uint8_t ddr4_unused7;
756 1.5 pgoyette SPD_BITFIELD( \
757 1.5 pgoyette uint8_t ddr4_dram_vdd_12:2, \
758 1.5 pgoyette uint8_t ddr4_dram_vdd_tbd1:2, \
759 1.5 pgoyette uint8_t ddr4_dram_vdd_tbd2:2, \
760 1.5 pgoyette uint8_t ddr4_unused8:2 \
761 1.5 pgoyette );
762 1.5 pgoyette SPD_BITFIELD( \
763 1.5 pgoyette /* device width is 0=4, 1=8, 2=16, or 4=32 bits */ \
764 1.5 pgoyette uint8_t ddr4_device_width:3, \
765 1.5 pgoyette /* number of package ranks is field value plus 1 */ \
766 1.5 pgoyette uint8_t ddr4_package_ranks:3, \
767 1.5 pgoyette uint8_t ddr4_unused9:2, \
768 1.5 pgoyette );
769 1.5 pgoyette SPD_BITFIELD( \
770 1.5 pgoyette /* primary width is offset by 3, extension is offset by 2 */ \
771 1.5 pgoyette uint8_t ddr4_primary_bus_width:3, \
772 1.5 pgoyette uint8_t ddr4_bus_width_extension:2, \
773 1.5 pgoyette uint8_t ddr4_unused10:3, \
774 1.5 pgoyette );
775 1.5 pgoyette SPD_BITFIELD( \
776 1.5 pgoyette uint8_t ddr4_unused11:7, \
777 1.5 pgoyette uint8_t ddr4_has_therm_sensor:1, , \
778 1.5 pgoyette );
779 1.5 pgoyette SPD_BITFIELD( \
780 1.5 pgoyette uint8_t ddr4_ext_mod_type:4, \
781 1.5 pgoyette uint8_t ddr4_unused12:4, , \
782 1.5 pgoyette );
783 1.5 pgoyette uint8_t ddr4_unused13;
784 1.5 pgoyette SPD_BITFIELD( \
785 1.5 pgoyette /* units = 1ps (10**-12sec) */ \
786 1.5 pgoyette uint8_t ddr4_fine_timebase:2, \
787 1.5 pgoyette /* units = 125ps */ \
788 1.5 pgoyette uint8_t ddr4_medium_timebase:2, , \
789 1.5 pgoyette );
790 1.5 pgoyette uint8_t ddr4_tCKAVGmin_mtb;
791 1.5 pgoyette uint8_t ddr4_tCKAVGmax_mtb;
792 1.5 pgoyette /* Bit 0 of CAS_supported[0 corresponds to CL=7 */
793 1.5 pgoyette uint8_t ddr4_CAS_supported[4];
794 1.5 pgoyette uint8_t ddr4_tAAmin_mtb;
795 1.5 pgoyette uint8_t ddr4_tRCDmin_mtb;
796 1.5 pgoyette uint8_t ddr4_tRPmin_mtb;
797 1.5 pgoyette SPD_BITFIELD( \
798 1.5 pgoyette uint8_t ddr4_tRASmin_msb:4, \
799 1.5 pgoyette uint8_t ddr4_tRCmin_mtb_msb:4, , \
800 1.5 pgoyette );
801 1.5 pgoyette uint8_t ddr4_tRASmin_lsb;
802 1.5 pgoyette uint8_t ddr4_tRCmin_mtb_lsb;
803 1.5 pgoyette uint8_t ddr4_tRFC1min_lsb;
804 1.5 pgoyette uint8_t ddr4_tRFC1min_msb;
805 1.5 pgoyette uint8_t ddr4_tRFC2min_lsb;
806 1.5 pgoyette uint8_t ddr4_tRFC2min_msb;
807 1.5 pgoyette uint8_t ddr4_tRFC4min_lsb;
808 1.5 pgoyette uint8_t ddr4_tRFC4min_msb;
809 1.5 pgoyette SPD_BITFIELD( \
810 1.8 msaitoh uint8_t ddr4_tFAW_mtb_msb:4, \
811 1.8 msaitoh uint8_t ddr4_unused14:4, , \
812 1.5 pgoyette );
813 1.5 pgoyette uint8_t ddr4_tFAWmin_mtb_lsb;
814 1.5 pgoyette uint8_t ddr4_tRRD_Smin_mtb;
815 1.5 pgoyette uint8_t ddr4_tRRD_Lmin_mtb;
816 1.5 pgoyette uint8_t ddr4_tCCD_Lmin_mtb;
817 1.10 msaitoh uint8_t ddr4_tWR_min_msb;
818 1.10 msaitoh uint8_t ddr4_tWR_min_mtb;
819 1.10 msaitoh uint8_t ddr4_tWTR_min;
820 1.10 msaitoh uint8_t ddr4_tWTR_Smin_mtb;
821 1.10 msaitoh uint8_t ddr4_tWTR_Lmin_mtb;
822 1.10 msaitoh uint8_t ddr4_unused15[14];
823 1.5 pgoyette uint8_t ddr4_connector_map[18];
824 1.5 pgoyette uint8_t ddr4_unused16[39];
825 1.5 pgoyette uint8_t ddr4_tCCD_Lmin_ftb;
826 1.5 pgoyette uint8_t ddr4_tRRD_Lmin_ftb;
827 1.5 pgoyette uint8_t ddr4_tRRD_Smin_ftb;
828 1.5 pgoyette uint8_t ddr4_tRCmin_ftb;
829 1.5 pgoyette uint8_t ddr4_tRPmin_ftb;
830 1.5 pgoyette uint8_t ddr4_tRCDmin_ftb;
831 1.5 pgoyette uint8_t ddr4_tAAmin_ftb;
832 1.5 pgoyette uint8_t ddr4_tCKAVGmax_ftb;
833 1.5 pgoyette uint8_t ddr4_tCKAVGmin_ftb;
834 1.5 pgoyette uint16_t ddr4_crc;
835 1.5 pgoyette union {
836 1.5 pgoyette struct spdmem_ddr4_mod_unbuffered u2_unbuf;
837 1.5 pgoyette struct spdmem_ddr4_mod_registered u2_reg;
838 1.5 pgoyette struct spdmem_ddr4_mod_reduced_load u2_red_load;
839 1.5 pgoyette } ddr4_u2;
840 1.5 pgoyette uint8_t ddr4_unused17[64];
841 1.5 pgoyette uint8_t ddr4_module_mfg_lsb;
842 1.5 pgoyette uint8_t ddr4_module_mfg_msb;
843 1.5 pgoyette uint8_t ddr4_module_mfg_loc;
844 1.5 pgoyette uint8_t ddr4_module_mfg_year;
845 1.5 pgoyette uint8_t ddr4_module_mfg_week;
846 1.5 pgoyette uint8_t ddr4_serial_number[4];
847 1.5 pgoyette uint8_t ddr4_part_number[20];
848 1.5 pgoyette uint8_t ddr4_revision_code;
849 1.5 pgoyette uint8_t ddr4_dram_mfgID_lsb;
850 1.5 pgoyette uint8_t ddr4_dram_mfgID_msb;
851 1.5 pgoyette uint8_t ddr4_dram_stepping;
852 1.5 pgoyette uint8_t ddr4_mfg_specific_data[29];
853 1.5 pgoyette uint8_t ddr4_unused18[2];
854 1.6 ozaki uint8_t ddr4_user_data[128];
855 1.5 pgoyette } __packed;
856 1.5 pgoyette
857 1.1 pgoyette struct spdmem {
858 1.1 pgoyette union {
859 1.1 pgoyette struct spdmem_fbdimm u1_fbd;
860 1.1 pgoyette struct spdmem_fpm u1_fpm;
861 1.1 pgoyette struct spdmem_ddr u1_ddr;
862 1.1 pgoyette struct spdmem_ddr2 u1_ddr2;
863 1.1 pgoyette struct spdmem_sdram u1_sdr;
864 1.1 pgoyette struct spdmem_rambus u1_rdr;
865 1.1 pgoyette struct spdmem_rom u1_rom;
866 1.1 pgoyette struct spdmem_ddr3 u1_ddr3;
867 1.5 pgoyette struct spdmem_ddr4 u1_ddr4;
868 1.1 pgoyette } sm_u1;
869 1.1 pgoyette } __packed;
870 1.1 pgoyette #define sm_fbd sm_u1.u1_fbd
871 1.1 pgoyette #define sm_fpm sm_u1.u1_fpm
872 1.1 pgoyette #define sm_ddr sm_u1.u1_ddr
873 1.1 pgoyette #define sm_ddr2 sm_u1.u1_ddr2
874 1.1 pgoyette #define sm_rdr sm_u1.u1_rdr
875 1.1 pgoyette #define sm_rom sm_u1.u1_rom
876 1.1 pgoyette #define sm_ddr3 sm_u1.u1_ddr3
877 1.1 pgoyette #define sm_sdr sm_u1.u1_sdr
878 1.5 pgoyette #define sm_ddr4 sm_u1.u1_ddr4
879 1.1 pgoyette
880 1.1 pgoyette /* some fields are in the same place for all memory types */
881 1.1 pgoyette
882 1.5 pgoyette #define sm_len sm_fpm.fpm_len
883 1.5 pgoyette #define sm_size sm_fpm.fpm_size
884 1.5 pgoyette #define sm_type sm_fpm.fpm_type
885 1.1 pgoyette #define sm_cksum sm_fpm.fpm_cksum
886 1.1 pgoyette #define sm_config sm_fpm.fpm_config
887 1.1 pgoyette #define sm_voltage sm_fpm.fpm_voltage
888 1.1 pgoyette #define sm_refresh sm_fpm.fpm_refresh
889 1.1 pgoyette #define sm_selfrefresh sm_fpm.fpm_selfrefresh
890 1.1 pgoyette
891 1.10 msaitoh #define SPDMEM_TYPE_MAXLEN 40
892 1.1 pgoyette
893 1.1 pgoyette struct spdmem_softc {
894 1.9 mlelstv uint8_t (*sc_read)(struct spdmem_softc *, uint16_t);
895 1.1 pgoyette struct spdmem sc_spd_data;
896 1.2 pgoyette struct sysctllog *sc_sysctl_log;
897 1.1 pgoyette char sc_type[SPDMEM_TYPE_MAXLEN];
898 1.1 pgoyette };
899 1.1 pgoyette
900 1.2 pgoyette int spdmem_common_probe(struct spdmem_softc *);
901 1.1 pgoyette void spdmem_common_attach(struct spdmem_softc *, device_t);
902 1.2 pgoyette int spdmem_common_detach(struct spdmem_softc *, device_t);
903