1 1.16 msaitoh /* $NetBSD: spdmemvar.h,v 1.16 2020/03/24 04:12:13 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.13 msaitoh uint8_t fbdimm_ftb_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.12 msaitoh SPD_BITFIELD( \ 422 1.12 msaitoh uint8_t ddr3_ROM_used:4, \ 423 1.12 msaitoh uint8_t ddr3_ROM_size:3, \ 424 1.12 msaitoh uint8_t ddr3_crccover:1, \ 425 1.12 msaitoh ); 426 1.12 msaitoh uint8_t ddr3_romrev; 427 1.5 pgoyette uint8_t ddr3_type; 428 1.1 pgoyette uint8_t ddr3_mod_type; 429 1.1 pgoyette SPD_BITFIELD( \ 430 1.1 pgoyette /* chipsize is offset by 28: 0 = 256M, 1 = 512M, ... */ \ 431 1.1 pgoyette uint8_t ddr3_chipsize:4, \ 432 1.1 pgoyette /* logbanks is offset by 3 */ \ 433 1.1 pgoyette uint8_t ddr3_logbanks:3, \ 434 1.1 pgoyette uint8_t ddr3_unused1:1, \ 435 1.1 pgoyette ); 436 1.1 pgoyette /* cols is offset by 9, rows offset by 12 */ 437 1.1 pgoyette SPD_BITFIELD( \ 438 1.1 pgoyette uint8_t ddr3_cols:3, \ 439 1.1 pgoyette uint8_t ddr3_rows:5, , \ 440 1.1 pgoyette ); 441 1.1 pgoyette SPD_BITFIELD( \ 442 1.1 pgoyette uint8_t ddr3_NOT15V:1, \ 443 1.1 pgoyette uint8_t ddr3_135V:1, \ 444 1.7 msaitoh uint8_t ddr3_125V:1, \ 445 1.1 pgoyette uint8_t ddr3_unused2:5 \ 446 1.1 pgoyette ); 447 1.1 pgoyette /* chipwidth in bits offset by 2: 0 = X4, 1 = X8, 2 = X16 */ 448 1.1 pgoyette /* physbanks is offset by 1 */ 449 1.1 pgoyette SPD_BITFIELD( \ 450 1.1 pgoyette uint8_t ddr3_chipwidth:3, \ 451 1.1 pgoyette uint8_t ddr3_physbanks:5, , \ 452 1.1 pgoyette ); 453 1.1 pgoyette /* datawidth in bits offset by 3: 1 = 16b, 2 = 32b, 3 = 64b */ 454 1.1 pgoyette SPD_BITFIELD( \ 455 1.1 pgoyette uint8_t ddr3_datawidth:3, \ 456 1.1 pgoyette uint8_t ddr3_hasECC:2, \ 457 1.1 pgoyette uint8_t ddr3_unused2a:3 , \ 458 1.1 pgoyette ); 459 1.1 pgoyette /* Fine time base, in pico-seconds */ 460 1.1 pgoyette SPD_BITFIELD( \ 461 1.1 pgoyette uint8_t ddr3_ftb_divisor:4, \ 462 1.1 pgoyette uint8_t ddr3_ftb_dividend:4, , \ 463 1.1 pgoyette ); 464 1.1 pgoyette uint8_t ddr3_mtb_dividend; /* 0x0108 = 0.1250ns */ 465 1.1 pgoyette uint8_t ddr3_mtb_divisor; /* 0x010f = 0.0625ns */ 466 1.15 msaitoh uint8_t ddr3_tCKmin_mtb; 467 1.1 pgoyette uint8_t ddr3_unused3; 468 1.1 pgoyette uint16_t ddr3_CAS_sup; /* Bit 0 ==> CAS 4 cycles */ 469 1.15 msaitoh uint8_t ddr3_tAAmin_mtb; 470 1.1 pgoyette uint8_t ddr3_tWRmin; 471 1.15 msaitoh uint8_t ddr3_tRCDmin_mtb; 472 1.1 pgoyette uint8_t ddr3_tRRDmin; 473 1.15 msaitoh uint8_t ddr3_tRPmin_mtb; 474 1.1 pgoyette SPD_BITFIELD( \ 475 1.1 pgoyette uint8_t ddr3_tRAS_msb:4, \ 476 1.15 msaitoh uint8_t ddr3_tRCmin_mtb_msb:4, , \ 477 1.1 pgoyette ); 478 1.1 pgoyette uint8_t ddr3_tRAS_lsb; 479 1.15 msaitoh uint8_t ddr3_tRCmin_mtb_lsb; 480 1.1 pgoyette uint8_t ddr3_tRFCmin_lsb; 481 1.1 pgoyette uint8_t ddr3_tRFCmin_msb; 482 1.1 pgoyette uint8_t ddr3_tWTRmin; 483 1.1 pgoyette uint8_t ddr3_tRTPmin; 484 1.1 pgoyette SPD_BITFIELD( \ 485 1.1 pgoyette uint8_t ddr3_tFAW_msb:4, , , \ 486 1.1 pgoyette ); 487 1.1 pgoyette uint8_t ddr3_tFAW_lsb; 488 1.1 pgoyette uint8_t ddr3_output_drvrs; 489 1.1 pgoyette SPD_BITFIELD( \ 490 1.1 pgoyette uint8_t ddr3_ext_temp_range:1, \ 491 1.1 pgoyette uint8_t ddr3_ext_temp_2x_refresh:1, \ 492 1.1 pgoyette uint8_t ddr3_asr_refresh:1, \ 493 1.1 pgoyette /* Bit 4 indicates on-die thermal sensor */ 494 1.1 pgoyette /* Bit 7 indicates Partial-Array Self-Refresh (PASR) */ 495 1.1 pgoyette uint8_t ddr3_unused7:5 \ 496 1.1 pgoyette ); 497 1.1 pgoyette SPD_BITFIELD( \ 498 1.1 pgoyette uint8_t ddr3_therm_sensor_acc:7,\ 499 1.1 pgoyette uint8_t ddr3_has_therm_sensor:1, , \ 500 1.1 pgoyette ); 501 1.1 pgoyette SPD_BITFIELD( \ 502 1.1 pgoyette uint8_t ddr3_non_std_devtype:7, \ 503 1.1 pgoyette uint8_t ddr3_std_device:1, , \ 504 1.1 pgoyette ); 505 1.15 msaitoh uint8_t ddr3_tCKmin_ftb; 506 1.15 msaitoh uint8_t ddr3_tAAmin_ftb; 507 1.15 msaitoh uint8_t ddr3_tRCDmin_ftb; 508 1.15 msaitoh uint8_t ddr3_tRPmin_ftb; 509 1.15 msaitoh uint8_t ddr3_tRCmin_ftb; 510 1.15 msaitoh uint8_t ddr3_unused4[2]; 511 1.15 msaitoh uint8_t ddr3_MAC; 512 1.16 msaitoh uint8_t ddr3_unused4a[18]; 513 1.1 pgoyette uint8_t ddr3_mod_height; 514 1.1 pgoyette uint8_t ddr3_mod_thickness; 515 1.1 pgoyette uint8_t ddr3_ref_card; 516 1.1 pgoyette uint8_t ddr3_mapping; 517 1.1 pgoyette uint8_t ddr3_unused5[53]; 518 1.1 pgoyette uint8_t ddr3_mfgID_lsb; 519 1.1 pgoyette uint8_t ddr3_mfgID_msb; 520 1.1 pgoyette uint8_t ddr3_mfgloc; 521 1.1 pgoyette uint8_t ddr3_mfg_year; 522 1.1 pgoyette uint8_t ddr3_mfg_week; 523 1.1 pgoyette uint8_t ddr3_serial[4]; 524 1.1 pgoyette uint16_t ddr3_crc; 525 1.3 soren uint8_t ddr3_part[18]; 526 1.3 soren uint8_t ddr3_rev[2]; 527 1.3 soren uint8_t ddr3_dram_mfgID_lsb; 528 1.3 soren uint8_t ddr3_dram_mfgID_msb; 529 1.3 soren uint8_t ddr3_vendor[26]; 530 1.1 pgoyette } __packed; 531 1.1 pgoyette 532 1.5 pgoyette /* DDR4 info from JEDEC Standard No. 21-C, Annex L - 4.1.2.12 */ 533 1.5 pgoyette 534 1.5 pgoyette /* Module-type specific bytes - bytes 0x080 thru 0x0ff */ 535 1.5 pgoyette 536 1.5 pgoyette struct spdmem_ddr4_mod_unbuffered { 537 1.5 pgoyette SPD_BITFIELD( \ 538 1.5 pgoyette uint8_t ddr4_unbuf_mod_height:4, \ 539 1.5 pgoyette uint8_t ddr4_unbuf_card_ext:4, , \ 540 1.5 pgoyette ); 541 1.5 pgoyette SPD_BITFIELD( \ 542 1.5 pgoyette uint8_t ddr4_unbuf_max_thick_front:4, \ 543 1.5 pgoyette uint8_t ddr4_unbuf_max_thick_back:4, , \ 544 1.5 pgoyette ); 545 1.5 pgoyette SPD_BITFIELD( \ 546 1.5 pgoyette uint8_t ddr4_unbuf_refcard:5, \ 547 1.5 pgoyette uint8_t ddr4_unbuf_refcard_rev:2, \ 548 1.5 pgoyette uint8_t ddr4_unbuf_refcard_ext:1, \ 549 1.5 pgoyette ); 550 1.5 pgoyette SPD_BITFIELD( \ 551 1.5 pgoyette uint8_t ddr4_unbuf_mirror_mapping:1, \ 552 1.5 pgoyette uint8_t ddr4_unbuf_unused1:7, , \ 553 1.5 pgoyette ); 554 1.5 pgoyette uint8_t ddr4_unbuf_unused2[122]; 555 1.5 pgoyette uint8_t ddr4_unbuf_crc[2]; 556 1.5 pgoyette } __packed; 557 1.5 pgoyette 558 1.5 pgoyette struct spdmem_ddr4_mod_registered { 559 1.5 pgoyette SPD_BITFIELD( \ 560 1.5 pgoyette uint8_t ddr4_reg_mod_height:4, \ 561 1.5 pgoyette uint8_t ddr4_reg_card_ext:4, , \ 562 1.5 pgoyette ); 563 1.5 pgoyette SPD_BITFIELD( \ 564 1.5 pgoyette uint8_t ddr4_reg_max_thick_front:4, \ 565 1.5 pgoyette uint8_t ddr4_reg_max_thick_back:4, , \ 566 1.5 pgoyette ); 567 1.5 pgoyette SPD_BITFIELD( \ 568 1.5 pgoyette uint8_t ddr4_reg_refcard:5, \ 569 1.5 pgoyette uint8_t ddr4_reg_refcard_rev:2, \ 570 1.5 pgoyette uint8_t ddr4_reg_refcard_ext:1, \ 571 1.5 pgoyette ); 572 1.5 pgoyette SPD_BITFIELD( \ 573 1.5 pgoyette uint8_t ddr4_reg_regcnt:2, \ 574 1.5 pgoyette uint8_t ddr4_reg_dram_rows:2, \ 575 1.5 pgoyette uint8_t ddr4_reg_unused1:4, \ 576 1.5 pgoyette ); 577 1.5 pgoyette SPD_BITFIELD( \ 578 1.5 pgoyette uint8_t ddr4_reg_heat_spread_char:7, \ 579 1.5 pgoyette uint8_t ddr4_reg_heat_spread_exist:1, , \ 580 1.5 pgoyette ); 581 1.5 pgoyette uint8_t ddr4_reg_mfg_id_lsb; 582 1.5 pgoyette uint8_t ddr4_reg_mfg_id_msb; 583 1.5 pgoyette uint8_t ddr4_reg_revision; 584 1.5 pgoyette SPD_BITFIELD( \ 585 1.5 pgoyette uint8_t ddr4_reg_mirror_mapping:1, \ 586 1.5 pgoyette uint8_t ddr4_reg_unused2:7, , \ 587 1.5 pgoyette ); 588 1.5 pgoyette SPD_BITFIELD( \ 589 1.5 pgoyette uint8_t ddr4_reg_output_drive_CKE:2, \ 590 1.5 pgoyette uint8_t ddr4_reg_output_drive_ODT:2, \ 591 1.5 pgoyette uint8_t ddr4_reg_output_drive_CmdAddr:2,\ 592 1.5 pgoyette uint8_t ddr4_reg_output_drive_chipsel:2 \ 593 1.5 pgoyette ); 594 1.5 pgoyette SPD_BITFIELD( \ 595 1.5 pgoyette uint8_t ddr4_reg_output_drive_CK_Y0Y2:2,\ 596 1.5 pgoyette uint8_t ddr4_reg_output_drive_CK_Y1Y3:2,\ 597 1.5 pgoyette uint8_t ddr4_reg_unused3:4, \ 598 1.5 pgoyette ); 599 1.5 pgoyette uint8_t ddr4_reg_unused4[115]; 600 1.5 pgoyette uint8_t ddr4_reg_crc[2]; 601 1.5 pgoyette } __packed; 602 1.5 pgoyette 603 1.5 pgoyette struct spdmem_ddr4_mod_reduced_load { 604 1.5 pgoyette SPD_BITFIELD( \ 605 1.5 pgoyette uint8_t ddr4_rload_mod_height:4, \ 606 1.5 pgoyette uint8_t ddr4_rload_card_ext:4, , \ 607 1.5 pgoyette ); 608 1.5 pgoyette SPD_BITFIELD( \ 609 1.5 pgoyette uint8_t ddr4_rload_max_thick_front:4, \ 610 1.5 pgoyette uint8_t ddr4_rload_max_thick_back:4, , \ 611 1.5 pgoyette ); 612 1.5 pgoyette SPD_BITFIELD( \ 613 1.5 pgoyette uint8_t ddr4_rload_refcard:5, \ 614 1.5 pgoyette uint8_t ddr4_rload_refcard_rev:2, \ 615 1.5 pgoyette uint8_t ddr4_rload_refcard_ext:1, \ 616 1.5 pgoyette ); 617 1.5 pgoyette SPD_BITFIELD( \ 618 1.5 pgoyette uint8_t ddr4_rload_regcnt:2, \ 619 1.5 pgoyette uint8_t ddr4_rload_dram_rows:2, \ 620 1.5 pgoyette uint8_t ddr4_rload_unused1:4, \ 621 1.5 pgoyette ); 622 1.5 pgoyette SPD_BITFIELD( \ 623 1.5 pgoyette uint8_t ddr4_rload_unused2:7, \ 624 1.5 pgoyette uint8_t ddr4_rload_heat_spread_exist:1, , \ 625 1.5 pgoyette ); 626 1.5 pgoyette uint8_t ddr4_rload_reg_mfg_id_lsb; 627 1.5 pgoyette uint8_t ddr4_rload_reg_mfg_id_msb; 628 1.5 pgoyette uint8_t ddr4_rload_reg_revision; 629 1.5 pgoyette SPD_BITFIELD( \ 630 1.5 pgoyette uint8_t ddr4_rload_reg_mirror_mapping:1,\ 631 1.5 pgoyette uint8_t ddr4_rload_unused3:7, , \ 632 1.5 pgoyette ); 633 1.5 pgoyette SPD_BITFIELD( \ 634 1.5 pgoyette uint8_t ddr4_rload_output_drive_CKE:2, \ 635 1.5 pgoyette uint8_t ddr4_rload_output_drive_ODT:2, \ 636 1.5 pgoyette uint8_t ddr4_rload_output_drive_CmdAddr:2, \ 637 1.5 pgoyette uint8_t ddr4_rload_output_drive_chipsel:2 \ 638 1.5 pgoyette ); 639 1.5 pgoyette SPD_BITFIELD( \ 640 1.5 pgoyette uint8_t ddr4_rload_output_drive_CK_Y0Y2:2, \ 641 1.5 pgoyette uint8_t ddr4_rload_output_drive_CK_Y1Y3:2, \ 642 1.5 pgoyette uint8_t ddr4_rload_unused4:4, \ 643 1.5 pgoyette ); 644 1.5 pgoyette uint8_t ddr4_rload_dbuff_revision; 645 1.5 pgoyette SPD_BITFIELD( \ 646 1.5 pgoyette uint8_t ddr4_rload_VrefDQ_0:6, \ 647 1.5 pgoyette uint8_t ddr4_rload_unused5:2, , \ 648 1.5 pgoyette ); 649 1.5 pgoyette SPD_BITFIELD( \ 650 1.5 pgoyette uint8_t ddr4_rload_VrefDQ_1:6, \ 651 1.5 pgoyette uint8_t ddr4_rload_unused6:2, , \ 652 1.5 pgoyette ); 653 1.5 pgoyette SPD_BITFIELD( \ 654 1.5 pgoyette uint8_t ddr4_rload_VrefDQ_2:6, \ 655 1.5 pgoyette uint8_t ddr4_rload_unused7:2, , \ 656 1.5 pgoyette ); 657 1.5 pgoyette SPD_BITFIELD( \ 658 1.5 pgoyette uint8_t ddr4_rload_VrefDQ_3:6, \ 659 1.5 pgoyette uint8_t ddr4_rload_unused8:2, , \ 660 1.5 pgoyette ); 661 1.5 pgoyette SPD_BITFIELD( \ 662 1.5 pgoyette uint8_t ddr4_rload_VrefDQ_buffer:6, \ 663 1.5 pgoyette uint8_t ddr4_rload_unused9:2, , \ 664 1.5 pgoyette ); 665 1.5 pgoyette SPD_BITFIELD( \ 666 1.5 pgoyette uint8_t ddr4_rload_MDQ_Read_Term_Str_1866:3, \ 667 1.5 pgoyette uint8_t ddr4_rload_unused10:1, \ 668 1.5 pgoyette uint8_t ddr4_rload_MDQ_Drive_Str_1866:3, \ 669 1.5 pgoyette uint8_t ddr4_rload_unused11:1 \ 670 1.5 pgoyette ); 671 1.5 pgoyette SPD_BITFIELD( \ 672 1.5 pgoyette uint8_t ddr4_rload_MDQ_Read_Term_Str_2400:3, \ 673 1.5 pgoyette uint8_t ddr4_rload_unused12:1, \ 674 1.5 pgoyette uint8_t ddr4_rload_MDQ_Drive_Str_2400:3, \ 675 1.5 pgoyette uint8_t ddr4_rload_unused13:1 \ 676 1.5 pgoyette ); 677 1.5 pgoyette SPD_BITFIELD( \ 678 1.5 pgoyette uint8_t ddr4_rload_MDQ_Read_Term_Str_3200:3, \ 679 1.5 pgoyette uint8_t ddr4_rload_unused14:1, \ 680 1.5 pgoyette uint8_t ddr4_rload_MDQ_Drive_Str_3200:3, \ 681 1.5 pgoyette uint8_t ddr4_rload_unused15:1 \ 682 1.5 pgoyette ); 683 1.5 pgoyette SPD_BITFIELD( \ 684 1.5 pgoyette uint8_t ddr4_rload_DRAM_Drive_Str_1866:2, \ 685 1.5 pgoyette uint8_t ddr4_rload_DRAM_Drive_Str_2400:2, \ 686 1.5 pgoyette uint8_t ddr4_rload_DRAM_Drive_Str_3200:2, \ 687 1.5 pgoyette uint8_t ddr4_rload_unused16:2 \ 688 1.5 pgoyette ); 689 1.5 pgoyette SPD_BITFIELD( \ 690 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_1866:3, \ 691 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_WR_1866:3, \ 692 1.5 pgoyette uint8_t ddr4_rload_unused17:2, \ 693 1.5 pgoyette ); 694 1.5 pgoyette SPD_BITFIELD( \ 695 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_2400:3, \ 696 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_WR_2400:3, \ 697 1.5 pgoyette uint8_t ddr4_rload_unused18:2, \ 698 1.5 pgoyette ); 699 1.5 pgoyette SPD_BITFIELD( \ 700 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_3200:3, \ 701 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_WR_3200:3, \ 702 1.5 pgoyette uint8_t ddr4_rload_unused19:2, \ 703 1.5 pgoyette ); 704 1.5 pgoyette SPD_BITFIELD( \ 705 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_1866:3, \ 706 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_1866:3, \ 707 1.5 pgoyette uint8_t ddr4_rload_unused20:2, \ 708 1.5 pgoyette ); 709 1.5 pgoyette SPD_BITFIELD( \ 710 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_2400:3, \ 711 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_2400:3, \ 712 1.5 pgoyette uint8_t ddr4_rload_unused21:2, \ 713 1.5 pgoyette ); 714 1.5 pgoyette SPD_BITFIELD( \ 715 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_3200:3, \ 716 1.5 pgoyette uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_3200:3, \ 717 1.5 pgoyette uint8_t ddr4_rload_unused22:2, \ 718 1.5 pgoyette ); 719 1.5 pgoyette uint8_t ddr4_rload_unused23[99]; 720 1.5 pgoyette uint8_t ddr4_rload_crc[2]; 721 1.5 pgoyette } __packed; 722 1.5 pgoyette 723 1.5 pgoyette struct spdmem_ddr4 { /* Dual Data Rate 4 SDRAM */ 724 1.5 pgoyette SPD_BITFIELD( \ 725 1.5 pgoyette uint8_t ddr4_ROM_used:4, \ 726 1.5 pgoyette uint8_t ddr4_ROM_size:3, \ 727 1.5 pgoyette uint8_t ddr4_unused0:1, \ 728 1.5 pgoyette ); 729 1.5 pgoyette uint8_t ddr4_romrev; 730 1.5 pgoyette uint8_t ddr4_type; 731 1.5 pgoyette SPD_BITFIELD( \ 732 1.5 pgoyette uint8_t ddr4_mod_type:4, \ 733 1.10 msaitoh uint8_t ddr4_hybrid_media:3, \ 734 1.10 msaitoh uint8_t ddr4_hybrid:1, \ 735 1.5 pgoyette ); 736 1.5 pgoyette SPD_BITFIELD( \ 737 1.5 pgoyette /* capacity is offset by 28: 0 = 256M, 1 = 512M, ... */ \ 738 1.5 pgoyette uint8_t ddr4_capacity:4, \ 739 1.5 pgoyette /* logbanks is offset by 2 */ \ 740 1.5 pgoyette uint8_t ddr4_logbanks:2, \ 741 1.5 pgoyette /* bankgroups is offset by 0 */ 742 1.5 pgoyette uint8_t ddr4_bankgroups:2, \ 743 1.5 pgoyette ); 744 1.5 pgoyette /* cols is offset by 9, rows offset by 12 */ 745 1.5 pgoyette SPD_BITFIELD( \ 746 1.5 pgoyette uint8_t ddr4_cols:3, \ 747 1.5 pgoyette uint8_t ddr4_rows:3, \ 748 1.5 pgoyette uint8_t ddr4_unused2:2, \ 749 1.5 pgoyette ); 750 1.5 pgoyette SPD_BITFIELD( \ 751 1.5 pgoyette uint8_t ddr4_signal_loading:2, \ 752 1.5 pgoyette uint8_t ddr4_unused3:2, \ 753 1.5 pgoyette uint8_t ddr4_diecount:3, \ 754 1.6 ozaki uint8_t ddr4_non_monolithic:1 \ 755 1.5 pgoyette ); 756 1.5 pgoyette SPD_BITFIELD( \ 757 1.5 pgoyette uint8_t ddr4_max_activate_count:4, \ 758 1.5 pgoyette uint8_t ddr4_max_activate_window:2, \ 759 1.5 pgoyette uint8_t ddr4_unused4:2, \ 760 1.5 pgoyette ); 761 1.5 pgoyette uint8_t ddr4_unused5; /* SDRAM Thermal & Refresh Options */ 762 1.5 pgoyette SPD_BITFIELD( \ 763 1.5 pgoyette uint8_t ddr4_unused6:6, \ 764 1.5 pgoyette uint8_t ddr4_ppr_support:2, , /* post package repair */ \ 765 1.5 pgoyette ); 766 1.5 pgoyette uint8_t ddr4_unused7; 767 1.5 pgoyette SPD_BITFIELD( \ 768 1.5 pgoyette uint8_t ddr4_dram_vdd_12:2, \ 769 1.5 pgoyette uint8_t ddr4_dram_vdd_tbd1:2, \ 770 1.5 pgoyette uint8_t ddr4_dram_vdd_tbd2:2, \ 771 1.5 pgoyette uint8_t ddr4_unused8:2 \ 772 1.5 pgoyette ); 773 1.5 pgoyette SPD_BITFIELD( \ 774 1.5 pgoyette /* device width is 0=4, 1=8, 2=16, or 4=32 bits */ \ 775 1.5 pgoyette uint8_t ddr4_device_width:3, \ 776 1.5 pgoyette /* number of package ranks is field value plus 1 */ \ 777 1.5 pgoyette uint8_t ddr4_package_ranks:3, \ 778 1.14 msaitoh uint8_t ddr4_rank_mix:1, \ 779 1.14 msaitoh uint8_t ddr4_unused9:1 \ 780 1.5 pgoyette ); 781 1.5 pgoyette SPD_BITFIELD( \ 782 1.5 pgoyette /* primary width is offset by 3, extension is offset by 2 */ \ 783 1.5 pgoyette uint8_t ddr4_primary_bus_width:3, \ 784 1.5 pgoyette uint8_t ddr4_bus_width_extension:2, \ 785 1.5 pgoyette uint8_t ddr4_unused10:3, \ 786 1.5 pgoyette ); 787 1.5 pgoyette SPD_BITFIELD( \ 788 1.5 pgoyette uint8_t ddr4_unused11:7, \ 789 1.5 pgoyette uint8_t ddr4_has_therm_sensor:1, , \ 790 1.5 pgoyette ); 791 1.5 pgoyette SPD_BITFIELD( \ 792 1.5 pgoyette uint8_t ddr4_ext_mod_type:4, \ 793 1.5 pgoyette uint8_t ddr4_unused12:4, , \ 794 1.5 pgoyette ); 795 1.5 pgoyette uint8_t ddr4_unused13; 796 1.5 pgoyette SPD_BITFIELD( \ 797 1.5 pgoyette /* units = 1ps (10**-12sec) */ \ 798 1.5 pgoyette uint8_t ddr4_fine_timebase:2, \ 799 1.5 pgoyette /* units = 125ps */ \ 800 1.5 pgoyette uint8_t ddr4_medium_timebase:2, , \ 801 1.5 pgoyette ); 802 1.5 pgoyette uint8_t ddr4_tCKAVGmin_mtb; 803 1.5 pgoyette uint8_t ddr4_tCKAVGmax_mtb; 804 1.5 pgoyette /* Bit 0 of CAS_supported[0 corresponds to CL=7 */ 805 1.5 pgoyette uint8_t ddr4_CAS_supported[4]; 806 1.5 pgoyette uint8_t ddr4_tAAmin_mtb; 807 1.5 pgoyette uint8_t ddr4_tRCDmin_mtb; 808 1.5 pgoyette uint8_t ddr4_tRPmin_mtb; 809 1.5 pgoyette SPD_BITFIELD( \ 810 1.5 pgoyette uint8_t ddr4_tRASmin_msb:4, \ 811 1.5 pgoyette uint8_t ddr4_tRCmin_mtb_msb:4, , \ 812 1.5 pgoyette ); 813 1.5 pgoyette uint8_t ddr4_tRASmin_lsb; 814 1.5 pgoyette uint8_t ddr4_tRCmin_mtb_lsb; 815 1.5 pgoyette uint8_t ddr4_tRFC1min_lsb; 816 1.5 pgoyette uint8_t ddr4_tRFC1min_msb; 817 1.5 pgoyette uint8_t ddr4_tRFC2min_lsb; 818 1.5 pgoyette uint8_t ddr4_tRFC2min_msb; 819 1.5 pgoyette uint8_t ddr4_tRFC4min_lsb; 820 1.5 pgoyette uint8_t ddr4_tRFC4min_msb; 821 1.5 pgoyette SPD_BITFIELD( \ 822 1.8 msaitoh uint8_t ddr4_tFAW_mtb_msb:4, \ 823 1.8 msaitoh uint8_t ddr4_unused14:4, , \ 824 1.5 pgoyette ); 825 1.5 pgoyette uint8_t ddr4_tFAWmin_mtb_lsb; 826 1.5 pgoyette uint8_t ddr4_tRRD_Smin_mtb; 827 1.5 pgoyette uint8_t ddr4_tRRD_Lmin_mtb; 828 1.5 pgoyette uint8_t ddr4_tCCD_Lmin_mtb; 829 1.10 msaitoh uint8_t ddr4_tWR_min_msb; 830 1.10 msaitoh uint8_t ddr4_tWR_min_mtb; 831 1.10 msaitoh uint8_t ddr4_tWTR_min; 832 1.10 msaitoh uint8_t ddr4_tWTR_Smin_mtb; 833 1.10 msaitoh uint8_t ddr4_tWTR_Lmin_mtb; 834 1.10 msaitoh uint8_t ddr4_unused15[14]; 835 1.5 pgoyette uint8_t ddr4_connector_map[18]; 836 1.5 pgoyette uint8_t ddr4_unused16[39]; 837 1.5 pgoyette uint8_t ddr4_tCCD_Lmin_ftb; 838 1.5 pgoyette uint8_t ddr4_tRRD_Lmin_ftb; 839 1.5 pgoyette uint8_t ddr4_tRRD_Smin_ftb; 840 1.5 pgoyette uint8_t ddr4_tRCmin_ftb; 841 1.5 pgoyette uint8_t ddr4_tRPmin_ftb; 842 1.5 pgoyette uint8_t ddr4_tRCDmin_ftb; 843 1.5 pgoyette uint8_t ddr4_tAAmin_ftb; 844 1.5 pgoyette uint8_t ddr4_tCKAVGmax_ftb; 845 1.5 pgoyette uint8_t ddr4_tCKAVGmin_ftb; 846 1.5 pgoyette uint16_t ddr4_crc; 847 1.5 pgoyette union { 848 1.5 pgoyette struct spdmem_ddr4_mod_unbuffered u2_unbuf; 849 1.5 pgoyette struct spdmem_ddr4_mod_registered u2_reg; 850 1.5 pgoyette struct spdmem_ddr4_mod_reduced_load u2_red_load; 851 1.5 pgoyette } ddr4_u2; 852 1.5 pgoyette uint8_t ddr4_unused17[64]; 853 1.5 pgoyette uint8_t ddr4_module_mfg_lsb; 854 1.5 pgoyette uint8_t ddr4_module_mfg_msb; 855 1.5 pgoyette uint8_t ddr4_module_mfg_loc; 856 1.5 pgoyette uint8_t ddr4_module_mfg_year; 857 1.5 pgoyette uint8_t ddr4_module_mfg_week; 858 1.5 pgoyette uint8_t ddr4_serial_number[4]; 859 1.5 pgoyette uint8_t ddr4_part_number[20]; 860 1.5 pgoyette uint8_t ddr4_revision_code; 861 1.5 pgoyette uint8_t ddr4_dram_mfgID_lsb; 862 1.5 pgoyette uint8_t ddr4_dram_mfgID_msb; 863 1.5 pgoyette uint8_t ddr4_dram_stepping; 864 1.5 pgoyette uint8_t ddr4_mfg_specific_data[29]; 865 1.5 pgoyette uint8_t ddr4_unused18[2]; 866 1.6 ozaki uint8_t ddr4_user_data[128]; 867 1.5 pgoyette } __packed; 868 1.5 pgoyette 869 1.1 pgoyette struct spdmem { 870 1.1 pgoyette union { 871 1.1 pgoyette struct spdmem_fbdimm u1_fbd; 872 1.1 pgoyette struct spdmem_fpm u1_fpm; 873 1.1 pgoyette struct spdmem_ddr u1_ddr; 874 1.1 pgoyette struct spdmem_ddr2 u1_ddr2; 875 1.1 pgoyette struct spdmem_sdram u1_sdr; 876 1.1 pgoyette struct spdmem_rambus u1_rdr; 877 1.1 pgoyette struct spdmem_rom u1_rom; 878 1.1 pgoyette struct spdmem_ddr3 u1_ddr3; 879 1.5 pgoyette struct spdmem_ddr4 u1_ddr4; 880 1.1 pgoyette } sm_u1; 881 1.1 pgoyette } __packed; 882 1.1 pgoyette #define sm_fbd sm_u1.u1_fbd 883 1.1 pgoyette #define sm_fpm sm_u1.u1_fpm 884 1.1 pgoyette #define sm_ddr sm_u1.u1_ddr 885 1.1 pgoyette #define sm_ddr2 sm_u1.u1_ddr2 886 1.1 pgoyette #define sm_rdr sm_u1.u1_rdr 887 1.1 pgoyette #define sm_rom sm_u1.u1_rom 888 1.1 pgoyette #define sm_ddr3 sm_u1.u1_ddr3 889 1.1 pgoyette #define sm_sdr sm_u1.u1_sdr 890 1.5 pgoyette #define sm_ddr4 sm_u1.u1_ddr4 891 1.1 pgoyette 892 1.1 pgoyette /* some fields are in the same place for all memory types */ 893 1.1 pgoyette 894 1.5 pgoyette #define sm_len sm_fpm.fpm_len 895 1.5 pgoyette #define sm_size sm_fpm.fpm_size 896 1.5 pgoyette #define sm_type sm_fpm.fpm_type 897 1.1 pgoyette #define sm_cksum sm_fpm.fpm_cksum 898 1.1 pgoyette #define sm_config sm_fpm.fpm_config 899 1.1 pgoyette #define sm_voltage sm_fpm.fpm_voltage 900 1.1 pgoyette #define sm_refresh sm_fpm.fpm_refresh 901 1.1 pgoyette #define sm_selfrefresh sm_fpm.fpm_selfrefresh 902 1.1 pgoyette 903 1.10 msaitoh #define SPDMEM_TYPE_MAXLEN 40 904 1.1 pgoyette 905 1.1 pgoyette struct spdmem_softc { 906 1.11 msaitoh int (*sc_read)(struct spdmem_softc *, uint16_t, uint8_t *); 907 1.1 pgoyette struct spdmem sc_spd_data; 908 1.2 pgoyette struct sysctllog *sc_sysctl_log; 909 1.1 pgoyette char sc_type[SPDMEM_TYPE_MAXLEN]; 910 1.1 pgoyette }; 911 1.1 pgoyette 912 1.2 pgoyette int spdmem_common_probe(struct spdmem_softc *); 913 1.1 pgoyette void spdmem_common_attach(struct spdmem_softc *, device_t); 914 1.2 pgoyette int spdmem_common_detach(struct spdmem_softc *, device_t); 915