xref: /netbsd-src/sys/dev/ic/spdmemvar.h (revision d909946ca08dceb44d7d0f22ec9488679695d976)
1 /* $NetBSD: spdmemvar.h,v 1.11 2016/01/05 11:49:32 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 	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_hybrid_media:3,	\
723 		uint8_t	ddr4_hybrid:1,		\
724 	);
725 	SPD_BITFIELD(				\
726 		/* capacity is offset by 28: 0 = 256M, 1 = 512M, ... */ \
727 		uint8_t	ddr4_capacity:4,	\
728 		/* logbanks is offset by 2 */	\
729 		uint8_t	ddr4_logbanks:2,	\
730 		/* bankgroups is offset by 0 */
731 		uint8_t	ddr4_bankgroups:2,	\
732 	);
733 	/* cols is offset by 9, rows offset by 12 */
734 	SPD_BITFIELD(				\
735 		uint8_t	ddr4_cols:3,		\
736 		uint8_t	ddr4_rows:3,		\
737 		uint8_t	ddr4_unused2:2,		\
738 	);
739 	SPD_BITFIELD(				\
740 		uint8_t	ddr4_signal_loading:2,	\
741 		uint8_t	ddr4_unused3:2,		\
742 		uint8_t	ddr4_diecount:3,	\
743 		uint8_t	ddr4_non_monolithic:1	\
744 	);
745 	SPD_BITFIELD(				\
746 		uint8_t ddr4_max_activate_count:4,	\
747 		uint8_t ddr4_max_activate_window:2,	\
748 		uint8_t ddr4_unused4:2,	\
749 	);
750 	uint8_t	ddr4_unused5;		/* SDRAM Thermal & Refresh Options */
751 	SPD_BITFIELD(				\
752 		uint8_t ddr4_unused6:6,		\
753 		uint8_t ddr4_ppr_support:2, ,	/* post package repair */ \
754 	);
755 	uint8_t ddr4_unused7;
756 	SPD_BITFIELD(				\
757 		uint8_t	ddr4_dram_vdd_12:2,	\
758 		uint8_t	ddr4_dram_vdd_tbd1:2,	\
759 		uint8_t	ddr4_dram_vdd_tbd2:2,	\
760 		uint8_t	ddr4_unused8:2		\
761 	);
762 	SPD_BITFIELD(				\
763 		/* device width is 0=4, 1=8, 2=16, or 4=32 bits */ \
764 		uint8_t	ddr4_device_width:3,	\
765 		/* number of package ranks is field value plus 1 */ \
766 		uint8_t	ddr4_package_ranks:3,	\
767 		uint8_t	ddr4_unused9:2,		\
768 	);
769 	SPD_BITFIELD(					\
770 		/* primary width is offset by 3, extension is offset by 2 */ \
771 		uint8_t	ddr4_primary_bus_width:3,	\
772 		uint8_t	ddr4_bus_width_extension:2,	\
773 		uint8_t	ddr4_unused10:3,		\
774 	);
775 	SPD_BITFIELD(				\
776 		uint8_t ddr4_unused11:7,	\
777 		uint8_t ddr4_has_therm_sensor:1, , \
778 	);
779 	SPD_BITFIELD(				\
780 		uint8_t ddr4_ext_mod_type:4,	\
781 		uint8_t ddr4_unused12:4, ,	\
782 	);
783 	uint8_t	ddr4_unused13;
784 	SPD_BITFIELD(				\
785 		/* units = 1ps (10**-12sec) */	\
786 		uint8_t	ddr4_fine_timebase:2,	\
787 		/* units = 125ps	    */	\
788 		uint8_t	ddr4_medium_timebase:2, ,	\
789 	);
790 	uint8_t	ddr4_tCKAVGmin_mtb;
791 	uint8_t	ddr4_tCKAVGmax_mtb;
792 	/* Bit 0 of CAS_supported[0 corresponds to CL=7 */
793 	uint8_t	ddr4_CAS_supported[4];
794 	uint8_t	ddr4_tAAmin_mtb;
795 	uint8_t	ddr4_tRCDmin_mtb;
796 	uint8_t	ddr4_tRPmin_mtb;
797 	SPD_BITFIELD(				\
798 		uint8_t	ddr4_tRASmin_msb:4,	\
799 		uint8_t	ddr4_tRCmin_mtb_msb:4, ,	\
800 	);
801 	uint8_t	ddr4_tRASmin_lsb;
802 	uint8_t	ddr4_tRCmin_mtb_lsb;
803 	uint8_t	ddr4_tRFC1min_lsb;
804 	uint8_t	ddr4_tRFC1min_msb;
805 	uint8_t	ddr4_tRFC2min_lsb;
806 	uint8_t	ddr4_tRFC2min_msb;
807 	uint8_t	ddr4_tRFC4min_lsb;
808 	uint8_t	ddr4_tRFC4min_msb;
809 	SPD_BITFIELD(				\
810 		uint8_t	ddr4_tFAW_mtb_msb:4,	\
811 		uint8_t	ddr4_unused14:4, ,	\
812 	);
813 	uint8_t	ddr4_tFAWmin_mtb_lsb;
814 	uint8_t	ddr4_tRRD_Smin_mtb;
815 	uint8_t	ddr4_tRRD_Lmin_mtb;
816 	uint8_t	ddr4_tCCD_Lmin_mtb;
817 	uint8_t	ddr4_tWR_min_msb;
818 	uint8_t	ddr4_tWR_min_mtb;
819 	uint8_t	ddr4_tWTR_min;
820 	uint8_t	ddr4_tWTR_Smin_mtb;
821 	uint8_t	ddr4_tWTR_Lmin_mtb;
822 	uint8_t	ddr4_unused15[14];
823 	uint8_t	ddr4_connector_map[18];
824 	uint8_t	ddr4_unused16[39];
825 	uint8_t	ddr4_tCCD_Lmin_ftb;
826 	uint8_t	ddr4_tRRD_Lmin_ftb;
827 	uint8_t	ddr4_tRRD_Smin_ftb;
828 	uint8_t	ddr4_tRCmin_ftb;
829 	uint8_t	ddr4_tRPmin_ftb;
830 	uint8_t	ddr4_tRCDmin_ftb;
831 	uint8_t	ddr4_tAAmin_ftb;
832 	uint8_t	ddr4_tCKAVGmax_ftb;
833 	uint8_t	ddr4_tCKAVGmin_ftb;
834 	uint16_t ddr4_crc;
835 	union {
836 		struct spdmem_ddr4_mod_unbuffered	u2_unbuf;
837 		struct spdmem_ddr4_mod_registered	u2_reg;
838 		struct spdmem_ddr4_mod_reduced_load	u2_red_load;
839 	} ddr4_u2;
840 	uint8_t	ddr4_unused17[64];
841 	uint8_t	ddr4_module_mfg_lsb;
842 	uint8_t	ddr4_module_mfg_msb;
843 	uint8_t	ddr4_module_mfg_loc;
844 	uint8_t	ddr4_module_mfg_year;
845 	uint8_t	ddr4_module_mfg_week;
846 	uint8_t	ddr4_serial_number[4];
847 	uint8_t	ddr4_part_number[20];
848 	uint8_t	ddr4_revision_code;
849 	uint8_t	ddr4_dram_mfgID_lsb;
850 	uint8_t	ddr4_dram_mfgID_msb;
851 	uint8_t	ddr4_dram_stepping;
852 	uint8_t ddr4_mfg_specific_data[29];
853 	uint8_t	ddr4_unused18[2];
854 	uint8_t	ddr4_user_data[128];
855 } __packed;
856 
857 struct spdmem {
858 	union {
859 		struct spdmem_fbdimm	u1_fbd;
860 		struct spdmem_fpm	u1_fpm;
861 		struct spdmem_ddr 	u1_ddr;
862 		struct spdmem_ddr2	u1_ddr2;
863 		struct spdmem_sdram	u1_sdr;
864 		struct spdmem_rambus	u1_rdr;
865 		struct spdmem_rom	u1_rom;
866 		struct spdmem_ddr3	u1_ddr3;
867 		struct spdmem_ddr4	u1_ddr4;
868 	} sm_u1;
869 } __packed;
870 #define	sm_fbd		sm_u1.u1_fbd
871 #define	sm_fpm		sm_u1.u1_fpm
872 #define	sm_ddr		sm_u1.u1_ddr
873 #define	sm_ddr2		sm_u1.u1_ddr2
874 #define	sm_rdr		sm_u1.u1_rdr
875 #define	sm_rom		sm_u1.u1_rom
876 #define	sm_ddr3		sm_u1.u1_ddr3
877 #define	sm_sdr		sm_u1.u1_sdr
878 #define	sm_ddr4		sm_u1.u1_ddr4
879 
880 /* some fields are in the same place for all memory types */
881 
882 #define sm_len		sm_fpm.fpm_len
883 #define sm_size		sm_fpm.fpm_size
884 #define sm_type		sm_fpm.fpm_type
885 #define sm_cksum	sm_fpm.fpm_cksum
886 #define sm_config	sm_fpm.fpm_config
887 #define sm_voltage	sm_fpm.fpm_voltage
888 #define	sm_refresh	sm_fpm.fpm_refresh
889 #define	sm_selfrefresh	sm_fpm.fpm_selfrefresh
890 
891 #define SPDMEM_TYPE_MAXLEN 40
892 
893 struct spdmem_softc {
894 	int		(*sc_read)(struct spdmem_softc *, uint16_t, uint8_t *);
895 	struct spdmem	sc_spd_data;
896 	struct sysctllog *sc_sysctl_log;
897 	char		sc_type[SPDMEM_TYPE_MAXLEN];
898 };
899 
900 int  spdmem_common_probe(struct spdmem_softc *);
901 void spdmem_common_attach(struct spdmem_softc *, device_t);
902 int  spdmem_common_detach(struct spdmem_softc *, device_t);
903