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