Home | History | Annotate | Line # | Download | only in ic
spdmemvar.h revision 1.7
      1 /* $NetBSD: spdmemvar.h,v 1.7 2015/05/15 08:44:24 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_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,	\
    810 		uint8_t	ddr4_unused14, ,	\
    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 *, uint8_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