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