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