spdmemvar.h revision 1.12 1 /* $NetBSD: spdmemvar.h,v 1.12 2016/09/05 04:06:55 msaitoh 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 SPD_BITFIELD( \
422 uint8_t ddr3_ROM_used:4, \
423 uint8_t ddr3_ROM_size:3, \
424 uint8_t ddr3_crccover:1, \
425 );
426 uint8_t ddr3_romrev;
427 uint8_t ddr3_type;
428 uint8_t ddr3_mod_type;
429 SPD_BITFIELD( \
430 /* chipsize is offset by 28: 0 = 256M, 1 = 512M, ... */ \
431 uint8_t ddr3_chipsize:4, \
432 /* logbanks is offset by 3 */ \
433 uint8_t ddr3_logbanks:3, \
434 uint8_t ddr3_unused1:1, \
435 );
436 /* cols is offset by 9, rows offset by 12 */
437 SPD_BITFIELD( \
438 uint8_t ddr3_cols:3, \
439 uint8_t ddr3_rows:5, , \
440 );
441 SPD_BITFIELD( \
442 uint8_t ddr3_NOT15V:1, \
443 uint8_t ddr3_135V:1, \
444 uint8_t ddr3_125V:1, \
445 uint8_t ddr3_unused2:5 \
446 );
447 /* chipwidth in bits offset by 2: 0 = X4, 1 = X8, 2 = X16 */
448 /* physbanks is offset by 1 */
449 SPD_BITFIELD( \
450 uint8_t ddr3_chipwidth:3, \
451 uint8_t ddr3_physbanks:5, , \
452 );
453 /* datawidth in bits offset by 3: 1 = 16b, 2 = 32b, 3 = 64b */
454 SPD_BITFIELD( \
455 uint8_t ddr3_datawidth:3, \
456 uint8_t ddr3_hasECC:2, \
457 uint8_t ddr3_unused2a:3 , \
458 );
459 /* Fine time base, in pico-seconds */
460 SPD_BITFIELD( \
461 uint8_t ddr3_ftb_divisor:4, \
462 uint8_t ddr3_ftb_dividend:4, , \
463 );
464 uint8_t ddr3_mtb_dividend; /* 0x0108 = 0.1250ns */
465 uint8_t ddr3_mtb_divisor; /* 0x010f = 0.0625ns */
466 uint8_t ddr3_tCKmin; /* in terms of mtb */
467 uint8_t ddr3_unused3;
468 uint16_t ddr3_CAS_sup; /* Bit 0 ==> CAS 4 cycles */
469 uint8_t ddr3_tAAmin; /* in terms of mtb */
470 uint8_t ddr3_tWRmin;
471 uint8_t ddr3_tRCDmin;
472 uint8_t ddr3_tRRDmin;
473 uint8_t ddr3_tRPmin;
474 SPD_BITFIELD( \
475 uint8_t ddr3_tRAS_msb:4, \
476 uint8_t ddr3_tRC_msb:4, , \
477 );
478 uint8_t ddr3_tRAS_lsb;
479 uint8_t ddr3_tRC_lsb;
480 uint8_t ddr3_tRFCmin_lsb;
481 uint8_t ddr3_tRFCmin_msb;
482 uint8_t ddr3_tWTRmin;
483 uint8_t ddr3_tRTPmin;
484 SPD_BITFIELD( \
485 uint8_t ddr3_tFAW_msb:4, , , \
486 );
487 uint8_t ddr3_tFAW_lsb;
488 uint8_t ddr3_output_drvrs;
489 SPD_BITFIELD( \
490 uint8_t ddr3_ext_temp_range:1, \
491 uint8_t ddr3_ext_temp_2x_refresh:1, \
492 uint8_t ddr3_asr_refresh:1, \
493 /* Bit 4 indicates on-die thermal sensor */
494 /* Bit 7 indicates Partial-Array Self-Refresh (PASR) */
495 uint8_t ddr3_unused7:5 \
496 );
497 SPD_BITFIELD( \
498 uint8_t ddr3_therm_sensor_acc:7,\
499 uint8_t ddr3_has_therm_sensor:1, , \
500 );
501 SPD_BITFIELD( \
502 uint8_t ddr3_non_std_devtype:7, \
503 uint8_t ddr3_std_device:1, , \
504 );
505 uint8_t ddr3_unused4[26];
506 uint8_t ddr3_mod_height;
507 uint8_t ddr3_mod_thickness;
508 uint8_t ddr3_ref_card;
509 uint8_t ddr3_mapping;
510 uint8_t ddr3_unused5[53];
511 uint8_t ddr3_mfgID_lsb;
512 uint8_t ddr3_mfgID_msb;
513 uint8_t ddr3_mfgloc;
514 uint8_t ddr3_mfg_year;
515 uint8_t ddr3_mfg_week;
516 uint8_t ddr3_serial[4];
517 uint16_t ddr3_crc;
518 uint8_t ddr3_part[18];
519 uint8_t ddr3_rev[2];
520 uint8_t ddr3_dram_mfgID_lsb;
521 uint8_t ddr3_dram_mfgID_msb;
522 uint8_t ddr3_vendor[26];
523 } __packed;
524
525 /* DDR4 info from JEDEC Standard No. 21-C, Annex L - 4.1.2.12 */
526
527 /* Module-type specific bytes - bytes 0x080 thru 0x0ff */
528
529 struct spdmem_ddr4_mod_unbuffered {
530 SPD_BITFIELD( \
531 uint8_t ddr4_unbuf_mod_height:4, \
532 uint8_t ddr4_unbuf_card_ext:4, , \
533 );
534 SPD_BITFIELD( \
535 uint8_t ddr4_unbuf_max_thick_front:4, \
536 uint8_t ddr4_unbuf_max_thick_back:4, , \
537 );
538 SPD_BITFIELD( \
539 uint8_t ddr4_unbuf_refcard:5, \
540 uint8_t ddr4_unbuf_refcard_rev:2, \
541 uint8_t ddr4_unbuf_refcard_ext:1, \
542 );
543 SPD_BITFIELD( \
544 uint8_t ddr4_unbuf_mirror_mapping:1, \
545 uint8_t ddr4_unbuf_unused1:7, , \
546 );
547 uint8_t ddr4_unbuf_unused2[122];
548 uint8_t ddr4_unbuf_crc[2];
549 } __packed;
550
551 struct spdmem_ddr4_mod_registered {
552 SPD_BITFIELD( \
553 uint8_t ddr4_reg_mod_height:4, \
554 uint8_t ddr4_reg_card_ext:4, , \
555 );
556 SPD_BITFIELD( \
557 uint8_t ddr4_reg_max_thick_front:4, \
558 uint8_t ddr4_reg_max_thick_back:4, , \
559 );
560 SPD_BITFIELD( \
561 uint8_t ddr4_reg_refcard:5, \
562 uint8_t ddr4_reg_refcard_rev:2, \
563 uint8_t ddr4_reg_refcard_ext:1, \
564 );
565 SPD_BITFIELD( \
566 uint8_t ddr4_reg_regcnt:2, \
567 uint8_t ddr4_reg_dram_rows:2, \
568 uint8_t ddr4_reg_unused1:4, \
569 );
570 SPD_BITFIELD( \
571 uint8_t ddr4_reg_heat_spread_char:7, \
572 uint8_t ddr4_reg_heat_spread_exist:1, , \
573 );
574 uint8_t ddr4_reg_mfg_id_lsb;
575 uint8_t ddr4_reg_mfg_id_msb;
576 uint8_t ddr4_reg_revision;
577 SPD_BITFIELD( \
578 uint8_t ddr4_reg_mirror_mapping:1, \
579 uint8_t ddr4_reg_unused2:7, , \
580 );
581 SPD_BITFIELD( \
582 uint8_t ddr4_reg_output_drive_CKE:2, \
583 uint8_t ddr4_reg_output_drive_ODT:2, \
584 uint8_t ddr4_reg_output_drive_CmdAddr:2,\
585 uint8_t ddr4_reg_output_drive_chipsel:2 \
586 );
587 SPD_BITFIELD( \
588 uint8_t ddr4_reg_output_drive_CK_Y0Y2:2,\
589 uint8_t ddr4_reg_output_drive_CK_Y1Y3:2,\
590 uint8_t ddr4_reg_unused3:4, \
591 );
592 uint8_t ddr4_reg_unused4[115];
593 uint8_t ddr4_reg_crc[2];
594 } __packed;
595
596 struct spdmem_ddr4_mod_reduced_load {
597 SPD_BITFIELD( \
598 uint8_t ddr4_rload_mod_height:4, \
599 uint8_t ddr4_rload_card_ext:4, , \
600 );
601 SPD_BITFIELD( \
602 uint8_t ddr4_rload_max_thick_front:4, \
603 uint8_t ddr4_rload_max_thick_back:4, , \
604 );
605 SPD_BITFIELD( \
606 uint8_t ddr4_rload_refcard:5, \
607 uint8_t ddr4_rload_refcard_rev:2, \
608 uint8_t ddr4_rload_refcard_ext:1, \
609 );
610 SPD_BITFIELD( \
611 uint8_t ddr4_rload_regcnt:2, \
612 uint8_t ddr4_rload_dram_rows:2, \
613 uint8_t ddr4_rload_unused1:4, \
614 );
615 SPD_BITFIELD( \
616 uint8_t ddr4_rload_unused2:7, \
617 uint8_t ddr4_rload_heat_spread_exist:1, , \
618 );
619 uint8_t ddr4_rload_reg_mfg_id_lsb;
620 uint8_t ddr4_rload_reg_mfg_id_msb;
621 uint8_t ddr4_rload_reg_revision;
622 SPD_BITFIELD( \
623 uint8_t ddr4_rload_reg_mirror_mapping:1,\
624 uint8_t ddr4_rload_unused3:7, , \
625 );
626 SPD_BITFIELD( \
627 uint8_t ddr4_rload_output_drive_CKE:2, \
628 uint8_t ddr4_rload_output_drive_ODT:2, \
629 uint8_t ddr4_rload_output_drive_CmdAddr:2, \
630 uint8_t ddr4_rload_output_drive_chipsel:2 \
631 );
632 SPD_BITFIELD( \
633 uint8_t ddr4_rload_output_drive_CK_Y0Y2:2, \
634 uint8_t ddr4_rload_output_drive_CK_Y1Y3:2, \
635 uint8_t ddr4_rload_unused4:4, \
636 );
637 uint8_t ddr4_rload_dbuff_revision;
638 SPD_BITFIELD( \
639 uint8_t ddr4_rload_VrefDQ_0:6, \
640 uint8_t ddr4_rload_unused5:2, , \
641 );
642 SPD_BITFIELD( \
643 uint8_t ddr4_rload_VrefDQ_1:6, \
644 uint8_t ddr4_rload_unused6:2, , \
645 );
646 SPD_BITFIELD( \
647 uint8_t ddr4_rload_VrefDQ_2:6, \
648 uint8_t ddr4_rload_unused7:2, , \
649 );
650 SPD_BITFIELD( \
651 uint8_t ddr4_rload_VrefDQ_3:6, \
652 uint8_t ddr4_rload_unused8:2, , \
653 );
654 SPD_BITFIELD( \
655 uint8_t ddr4_rload_VrefDQ_buffer:6, \
656 uint8_t ddr4_rload_unused9:2, , \
657 );
658 SPD_BITFIELD( \
659 uint8_t ddr4_rload_MDQ_Read_Term_Str_1866:3, \
660 uint8_t ddr4_rload_unused10:1, \
661 uint8_t ddr4_rload_MDQ_Drive_Str_1866:3, \
662 uint8_t ddr4_rload_unused11:1 \
663 );
664 SPD_BITFIELD( \
665 uint8_t ddr4_rload_MDQ_Read_Term_Str_2400:3, \
666 uint8_t ddr4_rload_unused12:1, \
667 uint8_t ddr4_rload_MDQ_Drive_Str_2400:3, \
668 uint8_t ddr4_rload_unused13:1 \
669 );
670 SPD_BITFIELD( \
671 uint8_t ddr4_rload_MDQ_Read_Term_Str_3200:3, \
672 uint8_t ddr4_rload_unused14:1, \
673 uint8_t ddr4_rload_MDQ_Drive_Str_3200:3, \
674 uint8_t ddr4_rload_unused15:1 \
675 );
676 SPD_BITFIELD( \
677 uint8_t ddr4_rload_DRAM_Drive_Str_1866:2, \
678 uint8_t ddr4_rload_DRAM_Drive_Str_2400:2, \
679 uint8_t ddr4_rload_DRAM_Drive_Str_3200:2, \
680 uint8_t ddr4_rload_unused16:2 \
681 );
682 SPD_BITFIELD( \
683 uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_1866:3, \
684 uint8_t ddr4_rload_DRAM_ODT_RTT_WR_1866:3, \
685 uint8_t ddr4_rload_unused17:2, \
686 );
687 SPD_BITFIELD( \
688 uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_2400:3, \
689 uint8_t ddr4_rload_DRAM_ODT_RTT_WR_2400:3, \
690 uint8_t ddr4_rload_unused18:2, \
691 );
692 SPD_BITFIELD( \
693 uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_3200:3, \
694 uint8_t ddr4_rload_DRAM_ODT_RTT_WR_3200:3, \
695 uint8_t ddr4_rload_unused19:2, \
696 );
697 SPD_BITFIELD( \
698 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_1866:3, \
699 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_1866:3, \
700 uint8_t ddr4_rload_unused20:2, \
701 );
702 SPD_BITFIELD( \
703 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_2400:3, \
704 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_2400:3, \
705 uint8_t ddr4_rload_unused21:2, \
706 );
707 SPD_BITFIELD( \
708 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_3200:3, \
709 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_3200:3, \
710 uint8_t ddr4_rload_unused22:2, \
711 );
712 uint8_t ddr4_rload_unused23[99];
713 uint8_t ddr4_rload_crc[2];
714 } __packed;
715
716 struct spdmem_ddr4 { /* Dual Data Rate 4 SDRAM */
717 SPD_BITFIELD( \
718 uint8_t ddr4_ROM_used:4, \
719 uint8_t ddr4_ROM_size:3, \
720 uint8_t ddr4_unused0:1, \
721 );
722 uint8_t ddr4_romrev;
723 uint8_t ddr4_type;
724 SPD_BITFIELD( \
725 uint8_t ddr4_mod_type:4, \
726 uint8_t ddr4_hybrid_media:3, \
727 uint8_t ddr4_hybrid:1, \
728 );
729 SPD_BITFIELD( \
730 /* capacity is offset by 28: 0 = 256M, 1 = 512M, ... */ \
731 uint8_t ddr4_capacity:4, \
732 /* logbanks is offset by 2 */ \
733 uint8_t ddr4_logbanks:2, \
734 /* bankgroups is offset by 0 */
735 uint8_t ddr4_bankgroups:2, \
736 );
737 /* cols is offset by 9, rows offset by 12 */
738 SPD_BITFIELD( \
739 uint8_t ddr4_cols:3, \
740 uint8_t ddr4_rows:3, \
741 uint8_t ddr4_unused2:2, \
742 );
743 SPD_BITFIELD( \
744 uint8_t ddr4_signal_loading:2, \
745 uint8_t ddr4_unused3:2, \
746 uint8_t ddr4_diecount:3, \
747 uint8_t ddr4_non_monolithic:1 \
748 );
749 SPD_BITFIELD( \
750 uint8_t ddr4_max_activate_count:4, \
751 uint8_t ddr4_max_activate_window:2, \
752 uint8_t ddr4_unused4:2, \
753 );
754 uint8_t ddr4_unused5; /* SDRAM Thermal & Refresh Options */
755 SPD_BITFIELD( \
756 uint8_t ddr4_unused6:6, \
757 uint8_t ddr4_ppr_support:2, , /* post package repair */ \
758 );
759 uint8_t ddr4_unused7;
760 SPD_BITFIELD( \
761 uint8_t ddr4_dram_vdd_12:2, \
762 uint8_t ddr4_dram_vdd_tbd1:2, \
763 uint8_t ddr4_dram_vdd_tbd2:2, \
764 uint8_t ddr4_unused8:2 \
765 );
766 SPD_BITFIELD( \
767 /* device width is 0=4, 1=8, 2=16, or 4=32 bits */ \
768 uint8_t ddr4_device_width:3, \
769 /* number of package ranks is field value plus 1 */ \
770 uint8_t ddr4_package_ranks:3, \
771 uint8_t ddr4_unused9:2, \
772 );
773 SPD_BITFIELD( \
774 /* primary width is offset by 3, extension is offset by 2 */ \
775 uint8_t ddr4_primary_bus_width:3, \
776 uint8_t ddr4_bus_width_extension:2, \
777 uint8_t ddr4_unused10:3, \
778 );
779 SPD_BITFIELD( \
780 uint8_t ddr4_unused11:7, \
781 uint8_t ddr4_has_therm_sensor:1, , \
782 );
783 SPD_BITFIELD( \
784 uint8_t ddr4_ext_mod_type:4, \
785 uint8_t ddr4_unused12:4, , \
786 );
787 uint8_t ddr4_unused13;
788 SPD_BITFIELD( \
789 /* units = 1ps (10**-12sec) */ \
790 uint8_t ddr4_fine_timebase:2, \
791 /* units = 125ps */ \
792 uint8_t ddr4_medium_timebase:2, , \
793 );
794 uint8_t ddr4_tCKAVGmin_mtb;
795 uint8_t ddr4_tCKAVGmax_mtb;
796 /* Bit 0 of CAS_supported[0 corresponds to CL=7 */
797 uint8_t ddr4_CAS_supported[4];
798 uint8_t ddr4_tAAmin_mtb;
799 uint8_t ddr4_tRCDmin_mtb;
800 uint8_t ddr4_tRPmin_mtb;
801 SPD_BITFIELD( \
802 uint8_t ddr4_tRASmin_msb:4, \
803 uint8_t ddr4_tRCmin_mtb_msb:4, , \
804 );
805 uint8_t ddr4_tRASmin_lsb;
806 uint8_t ddr4_tRCmin_mtb_lsb;
807 uint8_t ddr4_tRFC1min_lsb;
808 uint8_t ddr4_tRFC1min_msb;
809 uint8_t ddr4_tRFC2min_lsb;
810 uint8_t ddr4_tRFC2min_msb;
811 uint8_t ddr4_tRFC4min_lsb;
812 uint8_t ddr4_tRFC4min_msb;
813 SPD_BITFIELD( \
814 uint8_t ddr4_tFAW_mtb_msb:4, \
815 uint8_t ddr4_unused14:4, , \
816 );
817 uint8_t ddr4_tFAWmin_mtb_lsb;
818 uint8_t ddr4_tRRD_Smin_mtb;
819 uint8_t ddr4_tRRD_Lmin_mtb;
820 uint8_t ddr4_tCCD_Lmin_mtb;
821 uint8_t ddr4_tWR_min_msb;
822 uint8_t ddr4_tWR_min_mtb;
823 uint8_t ddr4_tWTR_min;
824 uint8_t ddr4_tWTR_Smin_mtb;
825 uint8_t ddr4_tWTR_Lmin_mtb;
826 uint8_t ddr4_unused15[14];
827 uint8_t ddr4_connector_map[18];
828 uint8_t ddr4_unused16[39];
829 uint8_t ddr4_tCCD_Lmin_ftb;
830 uint8_t ddr4_tRRD_Lmin_ftb;
831 uint8_t ddr4_tRRD_Smin_ftb;
832 uint8_t ddr4_tRCmin_ftb;
833 uint8_t ddr4_tRPmin_ftb;
834 uint8_t ddr4_tRCDmin_ftb;
835 uint8_t ddr4_tAAmin_ftb;
836 uint8_t ddr4_tCKAVGmax_ftb;
837 uint8_t ddr4_tCKAVGmin_ftb;
838 uint16_t ddr4_crc;
839 union {
840 struct spdmem_ddr4_mod_unbuffered u2_unbuf;
841 struct spdmem_ddr4_mod_registered u2_reg;
842 struct spdmem_ddr4_mod_reduced_load u2_red_load;
843 } ddr4_u2;
844 uint8_t ddr4_unused17[64];
845 uint8_t ddr4_module_mfg_lsb;
846 uint8_t ddr4_module_mfg_msb;
847 uint8_t ddr4_module_mfg_loc;
848 uint8_t ddr4_module_mfg_year;
849 uint8_t ddr4_module_mfg_week;
850 uint8_t ddr4_serial_number[4];
851 uint8_t ddr4_part_number[20];
852 uint8_t ddr4_revision_code;
853 uint8_t ddr4_dram_mfgID_lsb;
854 uint8_t ddr4_dram_mfgID_msb;
855 uint8_t ddr4_dram_stepping;
856 uint8_t ddr4_mfg_specific_data[29];
857 uint8_t ddr4_unused18[2];
858 uint8_t ddr4_user_data[128];
859 } __packed;
860
861 struct spdmem {
862 union {
863 struct spdmem_fbdimm u1_fbd;
864 struct spdmem_fpm u1_fpm;
865 struct spdmem_ddr u1_ddr;
866 struct spdmem_ddr2 u1_ddr2;
867 struct spdmem_sdram u1_sdr;
868 struct spdmem_rambus u1_rdr;
869 struct spdmem_rom u1_rom;
870 struct spdmem_ddr3 u1_ddr3;
871 struct spdmem_ddr4 u1_ddr4;
872 } sm_u1;
873 } __packed;
874 #define sm_fbd sm_u1.u1_fbd
875 #define sm_fpm sm_u1.u1_fpm
876 #define sm_ddr sm_u1.u1_ddr
877 #define sm_ddr2 sm_u1.u1_ddr2
878 #define sm_rdr sm_u1.u1_rdr
879 #define sm_rom sm_u1.u1_rom
880 #define sm_ddr3 sm_u1.u1_ddr3
881 #define sm_sdr sm_u1.u1_sdr
882 #define sm_ddr4 sm_u1.u1_ddr4
883
884 /* some fields are in the same place for all memory types */
885
886 #define sm_len sm_fpm.fpm_len
887 #define sm_size sm_fpm.fpm_size
888 #define sm_type sm_fpm.fpm_type
889 #define sm_cksum sm_fpm.fpm_cksum
890 #define sm_config sm_fpm.fpm_config
891 #define sm_voltage sm_fpm.fpm_voltage
892 #define sm_refresh sm_fpm.fpm_refresh
893 #define sm_selfrefresh sm_fpm.fpm_selfrefresh
894
895 #define SPDMEM_TYPE_MAXLEN 40
896
897 struct spdmem_softc {
898 int (*sc_read)(struct spdmem_softc *, uint16_t, uint8_t *);
899 struct spdmem sc_spd_data;
900 struct sysctllog *sc_sysctl_log;
901 char sc_type[SPDMEM_TYPE_MAXLEN];
902 };
903
904 int spdmem_common_probe(struct spdmem_softc *);
905 void spdmem_common_attach(struct spdmem_softc *, device_t);
906 int spdmem_common_detach(struct spdmem_softc *, device_t);
907