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