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