Home | History | Annotate | Line # | Download | only in ic
spdmemvar.h revision 1.2
      1  1.2  pgoyette /* $NetBSD: spdmemvar.h,v 1.2 2011/08/01 03:49:52 pgoyette 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.1  pgoyette struct spdmem_fpm {				/* FPM and EDO DIMMS */
     43  1.1  pgoyette 	uint8_t fpm_rows;
     44  1.1  pgoyette 	uint8_t fpm_cols;
     45  1.1  pgoyette 	uint8_t fpm_banks;
     46  1.1  pgoyette 	uint16_t fpm_datawidth;			/* endian-sensitive */
     47  1.1  pgoyette 	uint8_t fpm_voltage;
     48  1.1  pgoyette 	uint8_t	fpm_tRAC;
     49  1.1  pgoyette 	uint8_t fpm_tCAC;
     50  1.1  pgoyette 	uint8_t fpm_config;
     51  1.1  pgoyette 	SPD_BITFIELD(				\
     52  1.1  pgoyette 		uint8_t fpm_refresh:7,		\
     53  1.1  pgoyette 		uint8_t fpm_selfrefresh:1, ,	\
     54  1.1  pgoyette 	);
     55  1.1  pgoyette 	uint8_t fpm_dram_dramwidth;
     56  1.1  pgoyette 	uint8_t fpm_dram_eccwidth;
     57  1.1  pgoyette 	uint8_t	fpm_unused2[17];
     58  1.1  pgoyette 	uint8_t	fpm_superset;
     59  1.1  pgoyette 	uint8_t fpm_unused3[30];
     60  1.1  pgoyette 	uint8_t	fpm_cksum;
     61  1.1  pgoyette } __packed;
     62  1.1  pgoyette 
     63  1.1  pgoyette struct spdmem_sdram {				/* PC66/PC100/PC133 SDRAM */
     64  1.1  pgoyette 	SPD_BITFIELD(				\
     65  1.1  pgoyette 		uint8_t sdr_rows:4,		\
     66  1.1  pgoyette 		uint8_t sdr_rows2:4, ,		\
     67  1.1  pgoyette 	);
     68  1.1  pgoyette 	SPD_BITFIELD(				\
     69  1.1  pgoyette 		uint8_t sdr_cols:4,		\
     70  1.1  pgoyette 		uint8_t sdr_cols2:4, ,		\
     71  1.1  pgoyette 	);
     72  1.1  pgoyette 	uint8_t sdr_banks;
     73  1.1  pgoyette 	uint16_t sdr_datawidth;			/* endian-sensitive */
     74  1.1  pgoyette 	uint8_t sdr_voltage;
     75  1.1  pgoyette 	SPD_BITFIELD(				\
     76  1.1  pgoyette 		uint8_t sdr_cycle_tenths:4,	\
     77  1.1  pgoyette 		uint8_t sdr_cycle_whole:4, ,	\
     78  1.1  pgoyette 	);
     79  1.1  pgoyette 	SPD_BITFIELD(
     80  1.1  pgoyette 		uint8_t sdr_tAC_tenths:4,	\
     81  1.1  pgoyette 		uint8_t	sdr_tAC_whole:4, ,	\
     82  1.1  pgoyette 	);
     83  1.1  pgoyette 	uint8_t sdr_config;
     84  1.1  pgoyette 	SPD_BITFIELD(				\
     85  1.1  pgoyette 		uint8_t sdr_refresh:7,		\
     86  1.1  pgoyette 		uint8_t sdr_selfrefresh:1, ,	\
     87  1.1  pgoyette 	);
     88  1.1  pgoyette 	SPD_BITFIELD(				\
     89  1.1  pgoyette 		uint8_t sdr_dramwidth:7,	\
     90  1.1  pgoyette 		uint8_t sdr_dram_asym_bank2:1, ,\
     91  1.1  pgoyette 	);
     92  1.1  pgoyette 	SPD_BITFIELD(				\
     93  1.1  pgoyette 		uint8_t sdr_eccwidth:7,		\
     94  1.1  pgoyette 		uint8_t sdr_ecc_asym_bank2:1, ,	\
     95  1.1  pgoyette 	);
     96  1.1  pgoyette 	uint8_t sdr_min_clk_delay;
     97  1.1  pgoyette 	SPD_BITFIELD(				\
     98  1.1  pgoyette 		uint8_t sdr_burstlengths:4,	\
     99  1.1  pgoyette 		uint8_t sdr_unused1:4, ,	\
    100  1.1  pgoyette 	);
    101  1.1  pgoyette 	uint8_t sdr_banks_per_chip;
    102  1.1  pgoyette 	uint8_t sdr_tCAS;
    103  1.1  pgoyette 	uint8_t sdr_tCS;
    104  1.1  pgoyette 	uint8_t sdr_tWE;
    105  1.1  pgoyette 	uint8_t sdr_mod_attrs;
    106  1.1  pgoyette 	uint8_t sdr_dev_attrs;
    107  1.1  pgoyette 	uint8_t sdr_min_cc_1;
    108  1.1  pgoyette 	uint8_t sdr_max_tAC_1;
    109  1.1  pgoyette 	uint8_t sdr_min_cc_2;
    110  1.1  pgoyette 	uint8_t sdr_max_tAC_2;
    111  1.1  pgoyette 	uint8_t sdr_tRP;
    112  1.1  pgoyette 	uint8_t sdr_tRRD;
    113  1.1  pgoyette 	uint8_t sdr_tRCD;
    114  1.1  pgoyette 	uint8_t sdr_tRAS;
    115  1.1  pgoyette 	uint8_t sdr_module_rank_density;
    116  1.1  pgoyette 	uint8_t sdr_tIS;
    117  1.1  pgoyette #define	sdr_superset sdr_tIS
    118  1.1  pgoyette 	uint8_t sdr_tIH;
    119  1.1  pgoyette 	uint8_t sdr_tDS;
    120  1.1  pgoyette 	uint8_t sdr_tDH;
    121  1.1  pgoyette 	uint8_t sdr_unused2[5];
    122  1.1  pgoyette 	uint8_t sdr_tRC;
    123  1.1  pgoyette 	uint8_t	sdr_unused3[18];
    124  1.1  pgoyette 	uint8_t	sdr_esdram;
    125  1.1  pgoyette 	uint8_t	sdr_super_tech;
    126  1.1  pgoyette 	uint8_t	sdr_spdrev;
    127  1.1  pgoyette 	uint8_t	sdr_cksum;
    128  1.1  pgoyette } __packed;
    129  1.1  pgoyette 
    130  1.1  pgoyette struct spdmem_rom {
    131  1.1  pgoyette 	uint8_t rom_rows;
    132  1.1  pgoyette 	uint8_t rom_cols;
    133  1.1  pgoyette 	uint8_t rom_banks;
    134  1.1  pgoyette 	uint16_t rom_datawidth;			/* endian-sensitive */
    135  1.1  pgoyette 	uint8_t rom_voltage;
    136  1.1  pgoyette 	uint16_t rom_tAA;			/* endian-sensitive */
    137  1.1  pgoyette 	uint8_t rom_config;
    138  1.1  pgoyette 	uint8_t	rom_unused1;
    139  1.1  pgoyette 	uint8_t	rom_tPA;
    140  1.1  pgoyette 	uint8_t rom_tOE;
    141  1.1  pgoyette 	uint16_t rom_tCE;			/* endian-sensitive */
    142  1.1  pgoyette 	uint8_t	rom_burstlength;
    143  1.1  pgoyette 	uint8_t rom_unused2[14];
    144  1.1  pgoyette 	uint8_t	rom_superset[31];
    145  1.1  pgoyette 	uint8_t	rom_cksum;
    146  1.1  pgoyette } __packed;
    147  1.1  pgoyette 
    148  1.1  pgoyette 
    149  1.1  pgoyette struct spdmem_ddr {				/* Dual Data Rate SDRAM */
    150  1.1  pgoyette 	SPD_BITFIELD(				\
    151  1.1  pgoyette 		uint8_t ddr_rows:4,		\
    152  1.1  pgoyette 		uint8_t ddr_rows2:4, ,		\
    153  1.1  pgoyette 	);
    154  1.1  pgoyette 	SPD_BITFIELD(				\
    155  1.1  pgoyette 		uint8_t ddr_cols:4,		\
    156  1.1  pgoyette 		uint8_t ddr_cols2:4, ,		\
    157  1.1  pgoyette 	);
    158  1.1  pgoyette 	uint8_t ddr_ranks;
    159  1.1  pgoyette 	uint16_t ddr_datawidth;			/* endian-sensitive */
    160  1.1  pgoyette 	uint8_t ddr_voltage;
    161  1.1  pgoyette 	SPD_BITFIELD(				\
    162  1.1  pgoyette 		uint8_t ddr_cycle_tenths:4,	\
    163  1.1  pgoyette 		uint8_t ddr_cycle_whole:4, ,	\
    164  1.1  pgoyette 	);
    165  1.1  pgoyette 	SPD_BITFIELD(				\
    166  1.1  pgoyette 		uint8_t ddr_tAC_hundredths:4,	\
    167  1.1  pgoyette 		uint8_t	ddr_tAC_tenths:4, ,	\
    168  1.1  pgoyette 	);
    169  1.1  pgoyette 	uint8_t ddr_config;
    170  1.1  pgoyette 	SPD_BITFIELD(				\
    171  1.1  pgoyette 		uint8_t ddr_refresh:7,		\
    172  1.1  pgoyette 		uint8_t ddr_selfrefresh:1, ,	\
    173  1.1  pgoyette 	);
    174  1.1  pgoyette 	SPD_BITFIELD(				\
    175  1.1  pgoyette 		uint8_t ddr_dramwidth:7,	\
    176  1.1  pgoyette 		uint8_t ddr_dram_asym_bank2:1, ,\
    177  1.1  pgoyette 	);
    178  1.1  pgoyette 	SPD_BITFIELD(				\
    179  1.1  pgoyette 		uint8_t ddr_eccwidth:7,		\
    180  1.1  pgoyette 		uint8_t ddr_ecc_asym_bank2:1, ,	\
    181  1.1  pgoyette 	);
    182  1.1  pgoyette 	uint8_t ddr_min_clk_delay;
    183  1.1  pgoyette 	SPD_BITFIELD(				\
    184  1.1  pgoyette 		uint8_t ddr_burstlengths:4,	\
    185  1.1  pgoyette 		uint8_t ddr_unused1:4, ,	\
    186  1.1  pgoyette 	);
    187  1.1  pgoyette 	uint8_t ddr_banks_per_chip;
    188  1.1  pgoyette 	uint8_t ddr_tCAS;
    189  1.1  pgoyette 	uint8_t ddr_tCS;
    190  1.1  pgoyette 	uint8_t ddr_tWE;
    191  1.1  pgoyette 	uint8_t ddr_mod_attrs;
    192  1.1  pgoyette 	uint8_t ddr_dev_attrs;
    193  1.1  pgoyette 	uint8_t ddr_min_cc_05;
    194  1.1  pgoyette 	uint8_t ddr_max_tAC_05;
    195  1.1  pgoyette 	uint8_t ddr_min_cc_1;
    196  1.1  pgoyette 	uint8_t ddr_max_tAC_1;
    197  1.1  pgoyette 	uint8_t ddr_tRP;
    198  1.1  pgoyette 	uint8_t ddr_tRRD;
    199  1.1  pgoyette 	uint8_t ddr_tRCD;
    200  1.1  pgoyette 	uint8_t ddr_tRAS;
    201  1.1  pgoyette 	uint8_t ddr_module_rank_density;
    202  1.1  pgoyette 	uint8_t ddr_tIS;
    203  1.1  pgoyette #define	ddr_superset ddr_tIS
    204  1.1  pgoyette 	uint8_t ddr_tIH;
    205  1.1  pgoyette 	uint8_t ddr_tDS;
    206  1.1  pgoyette 	uint8_t ddr_tDH;
    207  1.1  pgoyette 	uint8_t	ddr_unused2[5];
    208  1.1  pgoyette 	uint8_t ddr_tRC;
    209  1.1  pgoyette 	uint8_t ddr_tRFC;
    210  1.1  pgoyette 	uint8_t ddr_tCK;
    211  1.1  pgoyette 	uint8_t	ddr_tDQSQ;
    212  1.1  pgoyette 	uint8_t	ddr_tQHS;
    213  1.1  pgoyette 	uint8_t	ddr_unused3;
    214  1.1  pgoyette 	uint8_t	ddr_height;
    215  1.1  pgoyette 	uint8_t ddr_unused4[15];
    216  1.1  pgoyette 	uint8_t	ddr_cksum;
    217  1.1  pgoyette } __packed;
    218  1.1  pgoyette 
    219  1.1  pgoyette struct spdmem_ddr2 {				/* Dual Data Rate 2 SDRAM */
    220  1.1  pgoyette 	SPD_BITFIELD(				\
    221  1.1  pgoyette 		uint8_t ddr2_rows:5,		\
    222  1.1  pgoyette 		uint8_t ddr2_unused1:3,	,	\
    223  1.1  pgoyette 	);
    224  1.1  pgoyette 	SPD_BITFIELD(				\
    225  1.1  pgoyette 		uint8_t ddr2_cols:4,		\
    226  1.1  pgoyette 		uint8_t ddr2_unused2:4, ,	\
    227  1.1  pgoyette 	);
    228  1.1  pgoyette 	SPD_BITFIELD(				\
    229  1.1  pgoyette 		uint8_t ddr2_ranks:3,
    230  1.1  pgoyette 		uint8_t ddr2_cardoncard:1,	\
    231  1.1  pgoyette 		uint8_t ddr2_package:1,		\
    232  1.1  pgoyette 		uint8_t ddr2_height:3		\
    233  1.1  pgoyette 	);
    234  1.1  pgoyette 	uint8_t ddr2_datawidth;
    235  1.1  pgoyette 	uint8_t	ddr2_unused3;
    236  1.1  pgoyette 	uint8_t ddr2_voltage;
    237  1.1  pgoyette 	SPD_BITFIELD(				\
    238  1.1  pgoyette 		uint8_t ddr2_cycle_frac:4,	\
    239  1.1  pgoyette 		uint8_t ddr2_cycle_whole:4, ,	\
    240  1.1  pgoyette 	);
    241  1.1  pgoyette 	SPD_BITFIELD(				\
    242  1.1  pgoyette 		uint8_t ddr2_tAC_hundredths:4,	\
    243  1.1  pgoyette 		uint8_t	ddr2_tAC_tenths:4, ,	\
    244  1.1  pgoyette 	);
    245  1.1  pgoyette 	uint8_t ddr2_config;
    246  1.1  pgoyette 	SPD_BITFIELD(				\
    247  1.1  pgoyette 		uint8_t ddr2_refresh:7,		\
    248  1.1  pgoyette 		uint8_t ddr2_selfrefresh:1, ,	\
    249  1.1  pgoyette 	);
    250  1.1  pgoyette 	uint8_t	ddr2_dramwidth;
    251  1.1  pgoyette 	uint8_t	ddr2_eccwidth;
    252  1.1  pgoyette 	uint8_t	ddr2_unused4;
    253  1.1  pgoyette 	SPD_BITFIELD(				\
    254  1.1  pgoyette 		uint8_t ddr2_burstlengths:4,	\
    255  1.1  pgoyette 		uint8_t ddr2_unused5:4, ,	\
    256  1.1  pgoyette 	);
    257  1.1  pgoyette 	uint8_t ddr2_banks_per_chip;
    258  1.1  pgoyette 	uint8_t ddr2_tCAS;
    259  1.1  pgoyette 	uint8_t ddr2_mechanical;
    260  1.1  pgoyette 	uint8_t	ddr2_dimm_type;
    261  1.1  pgoyette 	uint8_t ddr2_mod_attrs;
    262  1.1  pgoyette 	uint8_t ddr2_dev_attrs;
    263  1.1  pgoyette 	uint8_t ddr2_min_cc_1;
    264  1.1  pgoyette 	uint8_t ddr2_max_tAC_1;
    265  1.1  pgoyette 	uint8_t ddr2_min_cc_2;
    266  1.1  pgoyette 	uint8_t ddr2_max_tAC_2;
    267  1.1  pgoyette 	uint8_t ddr2_tRP;
    268  1.1  pgoyette 	uint8_t ddr2_tRRD;
    269  1.1  pgoyette 	uint8_t ddr2_tRCD;
    270  1.1  pgoyette 	uint8_t ddr2_tRAS;
    271  1.1  pgoyette 	uint8_t ddr2_module_rank_density;
    272  1.1  pgoyette 	uint8_t ddr2_tIS;
    273  1.1  pgoyette 	uint8_t ddr2_tIH;
    274  1.1  pgoyette 	uint8_t ddr2_tDS;
    275  1.1  pgoyette 	uint8_t ddr2_tDH;
    276  1.1  pgoyette 	uint8_t ddr2_tWR;
    277  1.1  pgoyette 	uint8_t ddr2_tWTR;
    278  1.1  pgoyette 	uint8_t ddr2_tRTP;
    279  1.1  pgoyette 	uint8_t ddr2_probe;
    280  1.1  pgoyette 	uint8_t	ddr2_extensions;
    281  1.1  pgoyette 	uint8_t	ddr2_tRC;
    282  1.1  pgoyette 	uint8_t	ddr2_tRFC;
    283  1.1  pgoyette 	uint8_t	ddr2_tCK;
    284  1.1  pgoyette 	uint8_t	ddr2_tDQSQ;
    285  1.1  pgoyette 	uint8_t	ddr2_tQHS;
    286  1.1  pgoyette 	uint8_t	ddr2_pll_relock;
    287  1.1  pgoyette 	uint8_t	ddr2_Tcasemax;
    288  1.1  pgoyette 	uint8_t	ddr2_Psi_TA_DRAM;
    289  1.1  pgoyette 	uint8_t	ddr2_dt0;
    290  1.1  pgoyette 	uint8_t	ddr2_dt2NQ;
    291  1.1  pgoyette 	uint8_t	ddr2_dr2P;
    292  1.1  pgoyette 	uint8_t	ddr2_dt3N;
    293  1.1  pgoyette 	uint8_t	ddr2_dt3Pfast;
    294  1.1  pgoyette 	uint8_t	ddr2_dt3Pslow;
    295  1.1  pgoyette 	uint8_t	ddr2_dt4R_4R4W_mode;
    296  1.1  pgoyette 	uint8_t	ddr2_dt5B;
    297  1.1  pgoyette 	uint8_t	ddr2_dt7;
    298  1.1  pgoyette 	uint8_t	ddr2_Psi_TA_PLL;
    299  1.1  pgoyette 	uint8_t	ddr2_Psi_TA_Reg;
    300  1.1  pgoyette 	uint8_t	ddr2_dt_PLL_Active;
    301  1.1  pgoyette 	uint8_t	ddr2_dt_Reg_Active;
    302  1.1  pgoyette 	uint8_t ddr2_spdrev;
    303  1.1  pgoyette 	uint8_t	ddr2_cksum;
    304  1.1  pgoyette } __packed;
    305  1.1  pgoyette 
    306  1.1  pgoyette struct spdmem_fbdimm {				/* Fully-buffered DIMM */
    307  1.1  pgoyette 	SPD_BITFIELD(				\
    308  1.1  pgoyette 		uint8_t	fbdimm_ps1_voltage:4,	\
    309  1.1  pgoyette 		uint8_t	fbdimm_ps2_voltage:4, ,	\
    310  1.1  pgoyette 	);
    311  1.1  pgoyette 	SPD_BITFIELD(				\
    312  1.1  pgoyette 		uint8_t	fbdimm_banks:2,		\
    313  1.1  pgoyette 		uint8_t	fbdimm_cols:3,		\
    314  1.1  pgoyette 		uint8_t	fbdimm_rows:3,		\
    315  1.1  pgoyette 	);
    316  1.1  pgoyette 	SPD_BITFIELD(				\
    317  1.1  pgoyette 		uint8_t	fbdimm_thick:3,		\
    318  1.1  pgoyette 		uint8_t	fbdimm_height:3,	\
    319  1.1  pgoyette 		uint8_t	fbdimm_unused1:2,	\
    320  1.1  pgoyette 	);
    321  1.1  pgoyette 	uint8_t	fbdimm_mod_type;
    322  1.1  pgoyette 	SPD_BITFIELD(				\
    323  1.1  pgoyette 		uint8_t	fbdimm_dev_width:3,	\
    324  1.1  pgoyette 		uint8_t	fbdimm_ranks:3,		\
    325  1.1  pgoyette 		uint8_t fbdimm_unused2:2,	\
    326  1.1  pgoyette 	);
    327  1.1  pgoyette 	SPD_BITFIELD(				\
    328  1.1  pgoyette 		uint8_t	fbdimm_ftb_divisor:4,	\
    329  1.1  pgoyette 		uint8_t	fbdimm_ftp_dividend:4, ,\
    330  1.1  pgoyette 	);
    331  1.1  pgoyette 	uint8_t	fbdimm_mtb_dividend;
    332  1.1  pgoyette 	uint8_t	fbdimm_mtb_divisor;
    333  1.1  pgoyette 	uint8_t	fbdimm_tCKmin;
    334  1.1  pgoyette 	uint8_t	fbdimm_tCKmax;
    335  1.1  pgoyette 	uint8_t	fbdimm_tCAS;
    336  1.1  pgoyette 	uint8_t	fbdimm_tAAmin;
    337  1.1  pgoyette 	SPD_BITFIELD(				\
    338  1.1  pgoyette 		uint8_t	fbdimm_tWR_min:4,	\
    339  1.1  pgoyette 		uint8_t	fbdimm_WR_range:4, ,	\
    340  1.1  pgoyette 	);
    341  1.1  pgoyette 	uint8_t	fbdimm_tWR;
    342  1.1  pgoyette 	SPD_BITFIELD(				\
    343  1.1  pgoyette 		uint8_t	fbdimm_tWL_min:4,	\
    344  1.1  pgoyette 		uint8_t	fbdimm_tWL_range:4, ,	\
    345  1.1  pgoyette 	);
    346  1.1  pgoyette 	SPD_BITFIELD(				\
    347  1.1  pgoyette 		uint8_t	fbdimm_tAL_min:4,	\
    348  1.1  pgoyette 		uint8_t	fbdimm_tAL_range:4, ,	\
    349  1.1  pgoyette 	);
    350  1.1  pgoyette 	uint8_t	fbdimm_tRCDmin;
    351  1.1  pgoyette 	uint8_t	fbdimm_tRRDmin;
    352  1.1  pgoyette 	uint8_t	fbdimm_tRPmin;
    353  1.1  pgoyette 	SPD_BITFIELD(				\
    354  1.1  pgoyette 		uint8_t	fbdimm_tRAS_msb:4,	\
    355  1.1  pgoyette 		uint8_t	fbdimm_tRC_msb:4, ,	\
    356  1.1  pgoyette 	);
    357  1.1  pgoyette 	uint8_t	fbdimm_tRAS_lsb;
    358  1.1  pgoyette 	uint8_t	fbdimm_tRC_lsb;
    359  1.1  pgoyette 	uint16_t fbdimm_tRFC;			/* endian-sensitive */
    360  1.1  pgoyette 	uint8_t	fbdimm_tWTR;
    361  1.1  pgoyette 	uint8_t	fbdimm_tRTP;
    362  1.1  pgoyette 	SPD_BITFIELD(				\
    363  1.1  pgoyette 		uint8_t	fbdimm_burst_4:1,	\
    364  1.1  pgoyette 		uint8_t	fbdimm_burst_8:1,	\
    365  1.1  pgoyette 		uint8_t	fbdimm_unused3:6,	\
    366  1.1  pgoyette 	);
    367  1.1  pgoyette 	uint8_t	fbdimm_terms;
    368  1.1  pgoyette 	uint8_t	fbdimm_drivers;
    369  1.1  pgoyette 	uint8_t	fbdimm_tREFI;
    370  1.1  pgoyette 	uint8_t	fbdimm_Tcasemax;
    371  1.1  pgoyette 	uint8_t	fbdimm_Psi_TA_SDRAM;
    372  1.1  pgoyette 	uint8_t	fbdimm_DT0;
    373  1.1  pgoyette 	uint8_t	fbdimm_DT2N_DT2Q;
    374  1.1  pgoyette 	uint8_t	fbdimm_DT2P;
    375  1.1  pgoyette 	uint8_t	fbdimm_DT3N;
    376  1.1  pgoyette 	uint8_t	fbdimm_DT4R_DT4R4W;
    377  1.1  pgoyette 	uint8_t	fbdimm_DT5B;
    378  1.1  pgoyette 	uint8_t	fbdimm_DT7;
    379  1.1  pgoyette 	uint8_t	fbdimm_unused4[84];
    380  1.1  pgoyette 	uint16_t fbdimm_crc;
    381  1.1  pgoyette } __packed;
    382  1.1  pgoyette 
    383  1.1  pgoyette struct spdmem_rambus {				/* Direct Rambus DRAM */
    384  1.1  pgoyette 	SPD_BITFIELD(				\
    385  1.1  pgoyette 		uint8_t	rdr_rows:4,		\
    386  1.1  pgoyette 		uint8_t	rdr_cols:4, ,		\
    387  1.1  pgoyette 	);
    388  1.1  pgoyette } __packed;
    389  1.1  pgoyette 
    390  1.1  pgoyette struct spdmem_ddr3 {				/* Dual Data Rate 3 SDRAM */
    391  1.1  pgoyette 	uint8_t	ddr3_mod_type;
    392  1.1  pgoyette 	SPD_BITFIELD(				\
    393  1.1  pgoyette 		/* chipsize is offset by 28: 0 = 256M, 1 = 512M, ... */ \
    394  1.1  pgoyette 		uint8_t ddr3_chipsize:4,	\
    395  1.1  pgoyette 		/* logbanks is offset by 3 */	\
    396  1.1  pgoyette 		uint8_t ddr3_logbanks:3,	\
    397  1.1  pgoyette 		uint8_t ddr3_unused1:1,		\
    398  1.1  pgoyette 	);
    399  1.1  pgoyette 	/* cols is offset by 9, rows offset by 12 */
    400  1.1  pgoyette 	SPD_BITFIELD(				\
    401  1.1  pgoyette 		uint8_t ddr3_cols:3,		\
    402  1.1  pgoyette 		uint8_t ddr3_rows:5, ,		\
    403  1.1  pgoyette 	);
    404  1.1  pgoyette 	SPD_BITFIELD(				\
    405  1.1  pgoyette 		uint8_t ddr3_NOT15V:1,		\
    406  1.1  pgoyette 		uint8_t ddr3_135V:1,		\
    407  1.1  pgoyette 		uint8_t ddr3_12XV:1,		\
    408  1.1  pgoyette 		uint8_t	ddr3_unused2:5		\
    409  1.1  pgoyette 	);
    410  1.1  pgoyette 	/* chipwidth in bits offset by 2: 0 = X4, 1 = X8, 2 = X16 */
    411  1.1  pgoyette 	/* physbanks is offset by 1 */
    412  1.1  pgoyette 	SPD_BITFIELD(				\
    413  1.1  pgoyette 		uint8_t ddr3_chipwidth:3,	\
    414  1.1  pgoyette 		uint8_t ddr3_physbanks:5, ,	\
    415  1.1  pgoyette 	);
    416  1.1  pgoyette 	/* datawidth in bits offset by 3: 1 = 16b, 2 = 32b, 3 = 64b */
    417  1.1  pgoyette 	SPD_BITFIELD(				\
    418  1.1  pgoyette 		uint8_t ddr3_datawidth:3,	\
    419  1.1  pgoyette 		uint8_t ddr3_hasECC:2,		\
    420  1.1  pgoyette 		uint8_t ddr3_unused2a:3 ,	\
    421  1.1  pgoyette 	);
    422  1.1  pgoyette 	/* Fine time base, in pico-seconds */
    423  1.1  pgoyette 	SPD_BITFIELD(				\
    424  1.1  pgoyette 		uint8_t ddr3_ftb_divisor:4,	\
    425  1.1  pgoyette 		uint8_t ddr3_ftb_dividend:4, ,	\
    426  1.1  pgoyette 	);
    427  1.1  pgoyette 	uint8_t ddr3_mtb_dividend;	/* 0x0108 = 0.1250ns */
    428  1.1  pgoyette 	uint8_t	ddr3_mtb_divisor;	/* 0x010f = 0.0625ns */
    429  1.1  pgoyette 	uint8_t	ddr3_tCKmin;		/* in terms of mtb */
    430  1.1  pgoyette 	uint8_t	ddr3_unused3;
    431  1.1  pgoyette 	uint16_t ddr3_CAS_sup;		/* Bit 0 ==> CAS 4 cycles */
    432  1.1  pgoyette 	uint8_t	ddr3_tAAmin;		/* in terms of mtb */
    433  1.1  pgoyette 	uint8_t	ddr3_tWRmin;
    434  1.1  pgoyette 	uint8_t	ddr3_tRCDmin;
    435  1.1  pgoyette 	uint8_t	ddr3_tRRDmin;
    436  1.1  pgoyette 	uint8_t	ddr3_tRPmin;
    437  1.1  pgoyette 	SPD_BITFIELD(				\
    438  1.1  pgoyette 		uint8_t	ddr3_tRAS_msb:4,	\
    439  1.1  pgoyette 		uint8_t	ddr3_tRC_msb:4, ,	\
    440  1.1  pgoyette 	);
    441  1.1  pgoyette 	uint8_t	ddr3_tRAS_lsb;
    442  1.1  pgoyette 	uint8_t	ddr3_tRC_lsb;
    443  1.1  pgoyette 	uint8_t	ddr3_tRFCmin_lsb;
    444  1.1  pgoyette 	uint8_t	ddr3_tRFCmin_msb;
    445  1.1  pgoyette 	uint8_t	ddr3_tWTRmin;
    446  1.1  pgoyette 	uint8_t	ddr3_tRTPmin;
    447  1.1  pgoyette 	SPD_BITFIELD(				\
    448  1.1  pgoyette 		uint8_t	ddr3_tFAW_msb:4, , ,	\
    449  1.1  pgoyette 	);
    450  1.1  pgoyette 	uint8_t	ddr3_tFAW_lsb;
    451  1.1  pgoyette 	uint8_t	ddr3_output_drvrs;
    452  1.1  pgoyette 	SPD_BITFIELD(				\
    453  1.1  pgoyette 		uint8_t	ddr3_ext_temp_range:1,	\
    454  1.1  pgoyette 		uint8_t	ddr3_ext_temp_2x_refresh:1, \
    455  1.1  pgoyette 		uint8_t	ddr3_asr_refresh:1,	\
    456  1.1  pgoyette 		/* Bit 4 indicates on-die thermal sensor */
    457  1.1  pgoyette 		/* Bit 7 indicates Partial-Array Self-Refresh (PASR) */
    458  1.1  pgoyette 		uint8_t	ddr3_unused7:5		\
    459  1.1  pgoyette 	);
    460  1.1  pgoyette 	SPD_BITFIELD(				\
    461  1.1  pgoyette 		uint8_t ddr3_therm_sensor_acc:7,\
    462  1.1  pgoyette 		uint8_t ddr3_has_therm_sensor:1, , \
    463  1.1  pgoyette 	);
    464  1.1  pgoyette 	SPD_BITFIELD(				\
    465  1.1  pgoyette 		uint8_t ddr3_non_std_devtype:7,	\
    466  1.1  pgoyette 		uint8_t ddr3_std_device:1, ,	\
    467  1.1  pgoyette 	);
    468  1.1  pgoyette 	uint8_t	ddr3_unused4[26];
    469  1.1  pgoyette 	uint8_t	ddr3_mod_height;
    470  1.1  pgoyette 	uint8_t	ddr3_mod_thickness;
    471  1.1  pgoyette 	uint8_t	ddr3_ref_card;
    472  1.1  pgoyette 	uint8_t	ddr3_mapping;
    473  1.1  pgoyette 	uint8_t	ddr3_unused5[53];
    474  1.1  pgoyette 	uint8_t	ddr3_mfgID_lsb;
    475  1.1  pgoyette 	uint8_t	ddr3_mfgID_msb;
    476  1.1  pgoyette 	uint8_t	ddr3_mfgloc;
    477  1.1  pgoyette 	uint8_t	ddr3_mfg_year;
    478  1.1  pgoyette 	uint8_t	ddr3_mfg_week;
    479  1.1  pgoyette 	uint8_t	ddr3_serial[4];
    480  1.1  pgoyette 	uint16_t ddr3_crc;
    481  1.1  pgoyette } __packed;
    482  1.1  pgoyette 
    483  1.1  pgoyette struct spdmem {
    484  1.1  pgoyette 	uint8_t	sm_len;
    485  1.1  pgoyette 	uint8_t sm_size;
    486  1.1  pgoyette 	uint8_t sm_type;
    487  1.1  pgoyette 	union {
    488  1.1  pgoyette 		struct spdmem_fbdimm	u1_fbd;
    489  1.1  pgoyette 		struct spdmem_fpm	u1_fpm;
    490  1.1  pgoyette 		struct spdmem_ddr 	u1_ddr;
    491  1.1  pgoyette 		struct spdmem_ddr2	u1_ddr2;
    492  1.1  pgoyette 		struct spdmem_sdram	u1_sdr;
    493  1.1  pgoyette 		struct spdmem_rambus	u1_rdr;
    494  1.1  pgoyette 		struct spdmem_rom	u1_rom;
    495  1.1  pgoyette 		struct spdmem_ddr3	u1_ddr3;
    496  1.1  pgoyette 	} sm_u1;
    497  1.1  pgoyette 	uint8_t	sm_extension[128];
    498  1.1  pgoyette } __packed;
    499  1.1  pgoyette #define	sm_fbd		sm_u1.u1_fbd
    500  1.1  pgoyette #define	sm_fpm		sm_u1.u1_fpm
    501  1.1  pgoyette #define	sm_ddr		sm_u1.u1_ddr
    502  1.1  pgoyette #define	sm_ddr2		sm_u1.u1_ddr2
    503  1.1  pgoyette #define	sm_rdr		sm_u1.u1_rdr
    504  1.1  pgoyette #define	sm_rom		sm_u1.u1_rom
    505  1.1  pgoyette #define	sm_ddr3		sm_u1.u1_ddr3
    506  1.1  pgoyette #define	sm_sdr		sm_u1.u1_sdr
    507  1.1  pgoyette 
    508  1.1  pgoyette /* some fields are in the same place for all memory types */
    509  1.1  pgoyette 
    510  1.1  pgoyette #define sm_cksum	sm_fpm.fpm_cksum
    511  1.1  pgoyette #define sm_config	sm_fpm.fpm_config
    512  1.1  pgoyette #define sm_voltage	sm_fpm.fpm_voltage
    513  1.1  pgoyette #define	sm_refresh	sm_fpm.fpm_refresh
    514  1.1  pgoyette #define	sm_selfrefresh	sm_fpm.fpm_selfrefresh
    515  1.1  pgoyette 
    516  1.1  pgoyette #define SPDMEM_TYPE_MAXLEN 16
    517  1.1  pgoyette 
    518  1.1  pgoyette struct spdmem_softc {
    519  1.1  pgoyette 	uint8_t		(*sc_read)(struct spdmem_softc *, uint8_t);
    520  1.1  pgoyette 	struct spdmem	sc_spd_data;
    521  1.2  pgoyette 	struct sysctllog *sc_sysctl_log;
    522  1.1  pgoyette 	char		sc_type[SPDMEM_TYPE_MAXLEN];
    523  1.1  pgoyette };
    524  1.1  pgoyette 
    525  1.2  pgoyette int  spdmem_common_probe(struct spdmem_softc *);
    526  1.1  pgoyette void spdmem_common_attach(struct spdmem_softc *, device_t);
    527  1.2  pgoyette int  spdmem_common_detach(struct spdmem_softc *, device_t);
    528