FreeBSD/Linux Kernel Cross Reference
sys/dev/ic/spdmem.c
1 /* $NetBSD: spdmem.c,v 1.38 2022/02/02 22:43:14 nakayama Exp $ */
2
3 /*
4 * Copyright (c) 2007 Nicolas Joly
5 * Copyright (c) 2007 Paul Goyette
6 * Copyright (c) 2007 Tobias Nygren
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 /*
34 * Serial Presence Detect (SPD) memory identification
35 */
36
37 #include <sys/cdefs.h>
38 __KERNEL_RCSID(0, "$NetBSD: spdmem.c,v 1.38 2022/02/02 22:43:14 nakayama Exp $");
39
40 #include <sys/param.h>
41 #include <sys/device.h>
42 #include <sys/endian.h>
43 #include <sys/sysctl.h>
44 #include <machine/bswap.h>
45
46 #include <dev/i2c/i2cvar.h>
47 #include <dev/ic/spdmemreg.h>
48 #include <dev/ic/spdmemvar.h>
49
50 /* Routines for decoding spd data */
51 static void decode_edofpm(const struct sysctlnode *, device_t, struct spdmem *);
52 static void decode_rom(const struct sysctlnode *, device_t, struct spdmem *);
53 static void decode_sdram(const struct sysctlnode *, device_t, struct spdmem *,
54 int);
55 static void decode_ddr(const struct sysctlnode *, device_t, struct spdmem *);
56 static void decode_ddr2(const struct sysctlnode *, device_t, struct spdmem *);
57 static void decode_ddr3(const struct sysctlnode *, device_t, struct spdmem *);
58 static void decode_ddr4(const struct sysctlnode *, device_t, struct spdmem *);
59 static void decode_fbdimm(const struct sysctlnode *, device_t, struct spdmem *);
60
61 static void decode_size_speed(device_t, const struct sysctlnode *,
62 int, int, int, int, bool, const char *, int);
63 static void decode_voltage_refresh(device_t, struct spdmem *);
64
65 #define IS_RAMBUS_TYPE (s->sm_len < 4)
66
67 static const char* const spdmem_basic_types[] = {
68 "unknown",
69 "FPM",
70 "EDO",
71 "Pipelined Nibble",
72 "SDRAM",
73 "ROM",
74 "DDR SGRAM",
75 "DDR SDRAM",
76 "DDR2 SDRAM",
77 "DDR2 SDRAM FB",
78 "DDR2 SDRAM FB Probe",
79 "DDR3 SDRAM",
80 "DDR4 SDRAM",
81 "unknown",
82 "DDR4E SDRAM",
83 "LPDDR3 SDRAM",
84 "LPDDR4 SDRAM",
85 "LPDDR4X SDRAM",
86 "DDR5 SDRAM"
87 };
88
89 static const char* const spdmem_ddr4_module_types[] = {
90 "DDR4 Extended",
91 "DDR4 RDIMM",
92 "DDR4 UDIMM",
93 "DDR4 SO-DIMM",
94 "DDR4 Load-Reduced DIMM",
95 "DDR4 Mini-RDIMM",
96 "DDR4 Mini-UDIMM",
97 "DDR4 Reserved",
98 "DDR4 72Bit SO-RDIMM",
99 "DDR4 72Bit SO-UDIMM",
100 "DDR4 Undefined",
101 "DDR4 Reserved",
102 "DDR4 16Bit SO-DIMM",
103 "DDR4 32Bit SO-DIMM",
104 "DDR4 Reserved",
105 "DDR4 Undefined"
106 };
107
108 static const char* const spdmem_superset_types[] = {
109 "unknown",
110 "ESDRAM",
111 "DDR ESDRAM",
112 "PEM EDO",
113 "PEM SDRAM"
114 };
115
116 static const char* const spdmem_voltage_types[] = {
117 "TTL (5V tolerant)",
118 "LvTTL (not 5V tolerant)",
119 "HSTL 1.5V",
120 "SSTL 3.3V",
121 "SSTL 2.5V",
122 "SSTL 1.8V"
123 };
124
125 static const char* const spdmem_refresh_types[] = {
126 "15.625us",
127 "3.9us",
128 "7.8us",
129 "31.3us",
130 "62.5us",
131 "125us"
132 };
133
134 static const char* const spdmem_parity_types[] = {
135 "no parity or ECC",
136 "data parity",
137 "data ECC",
138 "data parity and ECC",
139 "cmd/addr parity",
140 "cmd/addr/data parity",
141 "cmd/addr parity, data ECC",
142 "cmd/addr/data parity, data ECC"
143 };
144
145 int spd_rom_sizes[] = { 0, 128, 256, 384, 512 };
146
147
148 /* Cycle time fractional values (units of .001 ns) for DDR2 SDRAM */
149 static const uint16_t spdmem_cycle_frac[] = {
150 0, 100, 200, 300, 400, 500, 600, 700, 800, 900,
151 250, 333, 667, 750, 999, 999
152 };
153
154 /* Format string for timing info */
155 #define LATENCY "tAA-tRCD-tRP-tRAS: %d-%d-%d-%d\n"
156
157 /* CRC functions used for certain memory types */
158
159 static uint16_t
160 spdcrc16(struct spdmem_softc *sc, int count)
161 {
162 uint16_t crc;
163 int i, j;
164 uint8_t val;
165 crc = 0;
166 for (j = 0; j <= count; j++) {
167 (sc->sc_read)(sc, j, &val);
168 crc = crc ^ val << 8;
169 for (i = 0; i < 8; ++i)
170 if (crc & 0x8000)
171 crc = crc << 1 ^ 0x1021;
172 else
173 crc = crc << 1;
174 }
175 return (crc & 0xFFFF);
176 }
177
178 int
179 spdmem_common_probe(struct spdmem_softc *sc)
180 {
181 int cksum = 0;
182 uint8_t i, val, spd_type;
183 int spd_len, spd_crc_cover;
184 uint16_t crc_calc, crc_spd;
185
186 /* Read failed means a device doesn't exist */
187 if ((sc->sc_read)(sc, 2, &spd_type) != 0)
188 return 0;
189
190 /* Memory type should not be 0 */
191 if (spd_type == 0x00)
192 return 0;
193
194 /* For older memory types, validate the checksum over 1st 63 bytes */
195 if (spd_type <= SPDMEM_MEMTYPE_DDR2SDRAM) {
196 for (i = 0; i < 63; i++) {
197 (sc->sc_read)(sc, i, &val);
198 cksum += val;
199 }
200
201 (sc->sc_read)(sc, 63, &val);
202
203 if ((cksum & 0xff) != val) {
204 aprint_debug("spd checksum failed, calc = 0x%02x, "
205 "spd = 0x%02x\n", cksum, val);
206 return 0;
207 } else
208 return 1;
209 }
210
211 /* For DDR3 and FBDIMM, verify the CRC */
212 else if (spd_type <= SPDMEM_MEMTYPE_DDR3SDRAM) {
213 (sc->sc_read)(sc, 0, &val);
214 spd_len = val;
215 if (spd_len & SPDMEM_SPDCRC_116)
216 spd_crc_cover = 116;
217 else
218 spd_crc_cover = 125;
219 switch (spd_len & SPDMEM_SPDLEN_MASK) {
220 case SPDMEM_SPDLEN_128:
221 spd_len = 128;
222 break;
223 case SPDMEM_SPDLEN_176:
224 spd_len = 176;
225 break;
226 case SPDMEM_SPDLEN_256:
227 spd_len = 256;
228 break;
229 default:
230 return 0;
231 }
232 if (spd_crc_cover > spd_len)
233 return 0;
234 crc_calc = spdcrc16(sc, spd_crc_cover);
235 (sc->sc_read)(sc, 127, &val);
236 crc_spd = val << 8;
237 (sc->sc_read)(sc, 126, &val);
238 crc_spd |= val;
239 if (crc_calc != crc_spd) {
240 aprint_debug("crc16 failed, covers %d bytes, "
241 "calc = 0x%04x, spd = 0x%04x\n",
242 spd_crc_cover, crc_calc, crc_spd);
243 return 0;
244 }
245 return 1;
246 } else if (spd_type == SPDMEM_MEMTYPE_DDR4SDRAM) {
247 (sc->sc_read)(sc, 0, &val);
248 spd_len = val & 0x0f;
249 if ((unsigned int)spd_len >= __arraycount(spd_rom_sizes))
250 return 0;
251 spd_len = spd_rom_sizes[spd_len];
252 spd_crc_cover = 125; /* For byte 0 to 125 */
253 if (spd_crc_cover > spd_len)
254 return 0;
255 crc_calc = spdcrc16(sc, spd_crc_cover);
256 (sc->sc_read)(sc, 127, &val);
257 crc_spd = val << 8;
258 (sc->sc_read)(sc, 126, &val);
259 crc_spd |= val;
260 if (crc_calc != crc_spd) {
261 aprint_debug("crc16 failed, covers %d bytes, "
262 "calc = 0x%04x, spd = 0x%04x\n",
263 spd_crc_cover, crc_calc, crc_spd);
264 return 0;
265 }
266 /*
267 * We probably could also verify the CRC for the other
268 * "pages" of SPD data in blocks 1 and 2, but we'll do
269 * it some other time.
270 */
271 return 1;
272 } else if (spd_type == SPDMEM_MEMTYPE_DDR5SDRAM) {
273 /* XXX Need Datasheet. */
274 (sc->sc_read)(sc, 0, &val);
275 spd_len = val & 0x0f;
276 if ((unsigned int)spd_len >= __arraycount(spd_rom_sizes))
277 return 0;
278 aprint_verbose("DDR5 SPD ROM?\n");
279 return 0;
280 }
281
282 /* For unrecognized memory types, don't match at all */
283 return 0;
284 }
285
286 void
287 spdmem_common_attach(struct spdmem_softc *sc, device_t self)
288 {
289 struct spdmem *s = &(sc->sc_spd_data);
290 const char *type;
291 const char *rambus_rev = "Reserved";
292 int dimm_size;
293 unsigned int i, spd_len, spd_size;
294 const struct sysctlnode *node = NULL;
295
296 (sc->sc_read)(sc, 0, &s->sm_len);
297 (sc->sc_read)(sc, 1, &s->sm_size);
298 (sc->sc_read)(sc, 2, &s->sm_type);
299
300 if (s->sm_type == SPDMEM_MEMTYPE_DDR4SDRAM) {
301 /*
302 * An even newer encoding with one byte holding both
303 * the used-size and capacity values
304 */
305 spd_len = s->sm_len & 0x0f;
306 spd_size = (s->sm_len >> 4) & 0x07;
307
308 spd_len = spd_rom_sizes[spd_len];
309 spd_size *= 512;
310
311 } else if (s->sm_type >= SPDMEM_MEMTYPE_FBDIMM) {
312 /*
313 * FBDIMM and DDR3 (and probably all newer) have a different
314 * encoding of the SPD EEPROM used/total sizes
315 */
316 spd_size = 64 << (s->sm_len & SPDMEM_SPDSIZE_MASK);
317 switch (s->sm_len & SPDMEM_SPDLEN_MASK) {
318 case SPDMEM_SPDLEN_128:
319 spd_len = 128;
320 break;
321 case SPDMEM_SPDLEN_176:
322 spd_len = 176;
323 break;
324 case SPDMEM_SPDLEN_256:
325 spd_len = 256;
326 break;
327 default:
328 spd_len = 64;
329 break;
330 }
331 } else {
332 spd_size = 1 << s->sm_size;
333 spd_len = s->sm_len;
334 if (spd_len < 64)
335 spd_len = 64;
336 }
337 if (spd_len > spd_size)
338 spd_len = spd_size;
339 if (spd_len > sizeof(struct spdmem))
340 spd_len = sizeof(struct spdmem);
341 for (i = 3; i < spd_len; i++)
342 (sc->sc_read)(sc, i, &((uint8_t *)s)[i]);
343
344 /*
345 * Setup our sysctl subtree, hw.spdmemN
346 */
347 sc->sc_sysctl_log = NULL;
348 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, &node,
349 0, CTLTYPE_NODE,
350 device_xname(self), NULL, NULL, 0, NULL, 0,
351 CTL_HW, CTL_CREATE, CTL_EOL);
352 if (node != NULL && spd_len != 0)
353 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
354 0,
355 CTLTYPE_STRUCT, "spd_data",
356 SYSCTL_DESCR("raw spd data"), NULL,
357 0, s, spd_len,
358 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
359
360 /*
361 * Decode and print key SPD contents
362 */
363 if (IS_RAMBUS_TYPE) {
364 if (s->sm_type == SPDMEM_MEMTYPE_RAMBUS)
365 type = "Rambus";
366 else if (s->sm_type == SPDMEM_MEMTYPE_DIRECTRAMBUS)
367 type = "Direct Rambus";
368 else
369 type = "Rambus (unknown)";
370
371 switch (s->sm_len) {
372 case 0:
373 rambus_rev = "Invalid";
374 break;
375 case 1:
376 rambus_rev = "0.7";
377 break;
378 case 2:
379 rambus_rev = "1.0";
380 break;
381 default:
382 rambus_rev = "Reserved";
383 break;
384 }
385 } else {
386 if (s->sm_type < __arraycount(spdmem_basic_types))
387 type = spdmem_basic_types[s->sm_type];
388 else
389 type = "unknown memory type";
390
391 if (s->sm_type == SPDMEM_MEMTYPE_EDO &&
392 s->sm_fpm.fpm_superset == SPDMEM_SUPERSET_EDO_PEM)
393 type = spdmem_superset_types[SPDMEM_SUPERSET_EDO_PEM];
394 if (s->sm_type == SPDMEM_MEMTYPE_SDRAM &&
395 s->sm_sdr.sdr_superset == SPDMEM_SUPERSET_SDRAM_PEM)
396 type = spdmem_superset_types[SPDMEM_SUPERSET_SDRAM_PEM];
397 if (s->sm_type == SPDMEM_MEMTYPE_DDRSDRAM &&
398 s->sm_ddr.ddr_superset == SPDMEM_SUPERSET_DDR_ESDRAM)
399 type =
400 spdmem_superset_types[SPDMEM_SUPERSET_DDR_ESDRAM];
401 if (s->sm_type == SPDMEM_MEMTYPE_SDRAM &&
402 s->sm_sdr.sdr_superset == SPDMEM_SUPERSET_ESDRAM) {
403 type = spdmem_superset_types[SPDMEM_SUPERSET_ESDRAM];
404 }
405 if (s->sm_type == SPDMEM_MEMTYPE_DDR4SDRAM &&
406 s->sm_ddr4.ddr4_mod_type <
407 __arraycount(spdmem_ddr4_module_types)) {
408 type = spdmem_ddr4_module_types[s->sm_ddr4.ddr4_mod_type];
409 }
410 }
411
412 strlcpy(sc->sc_type, type, SPDMEM_TYPE_MAXLEN);
413
414 if (s->sm_type == SPDMEM_MEMTYPE_DDR4SDRAM) {
415 /*
416 * The latest spec (DDR4 SPD Document Release 3) defines
417 * NVDIMM Hybrid only.
418 */
419 if ((s->sm_ddr4.ddr4_hybrid)
420 && (s->sm_ddr4.ddr4_hybrid_media == 1))
421 strlcat(sc->sc_type, " NVDIMM hybrid",
422 SPDMEM_TYPE_MAXLEN);
423 }
424
425 if (node != NULL)
426 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
427 0,
428 CTLTYPE_STRING, "mem_type",
429 SYSCTL_DESCR("memory module type"), NULL,
430 0, sc->sc_type, 0,
431 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
432
433 if (IS_RAMBUS_TYPE) {
434 aprint_naive("\n");
435 aprint_normal("\n");
436 aprint_normal_dev(self, "%s, SPD Revision %s", type, rambus_rev);
437 dimm_size = 1 << (s->sm_rdr.rdr_rows + s->sm_rdr.rdr_cols - 13);
438 if (dimm_size >= 1024)
439 aprint_normal(", %dGB\n", dimm_size / 1024);
440 else
441 aprint_normal(", %dMB\n", dimm_size);
442
443 /* No further decode for RAMBUS memory */
444 return;
445 }
446 switch (s->sm_type) {
447 case SPDMEM_MEMTYPE_EDO:
448 case SPDMEM_MEMTYPE_FPM:
449 decode_edofpm(node, self, s);
450 break;
451 case SPDMEM_MEMTYPE_ROM:
452 decode_rom(node, self, s);
453 break;
454 case SPDMEM_MEMTYPE_SDRAM:
455 decode_sdram(node, self, s, spd_len);
456 break;
457 case SPDMEM_MEMTYPE_DDRSDRAM:
458 decode_ddr(node, self, s);
459 break;
460 case SPDMEM_MEMTYPE_DDR2SDRAM:
461 decode_ddr2(node, self, s);
462 break;
463 case SPDMEM_MEMTYPE_DDR3SDRAM:
464 decode_ddr3(node, self, s);
465 break;
466 case SPDMEM_MEMTYPE_FBDIMM:
467 case SPDMEM_MEMTYPE_FBDIMM_PROBE:
468 decode_fbdimm(node, self, s);
469 break;
470 case SPDMEM_MEMTYPE_DDR4SDRAM:
471 decode_ddr4(node, self, s);
472 break;
473 }
474
475 /* Dump SPD */
476 for (i = 0; i < spd_len; i += 16) {
477 unsigned int j, k;
478 aprint_debug_dev(self, "0x%02x:", i);
479 k = (spd_len > (i + 16)) ? i + 16 : spd_len;
480 for (j = i; j < k; j++)
481 aprint_debug(" %02x", ((uint8_t *)s)[j]);
482 aprint_debug("\n");
483 }
484 }
485
486 int
487 spdmem_common_detach(struct spdmem_softc *sc, device_t self)
488 {
489 sysctl_teardown(&sc->sc_sysctl_log);
490
491 return 0;
492 }
493
494 static void
495 decode_size_speed(device_t self, const struct sysctlnode *node,
496 int dimm_size, int cycle_time, int d_clk, int bits,
497 bool round, const char *ddr_type_string, int speed)
498 {
499 int p_clk;
500 struct spdmem_softc *sc = device_private(self);
501
502 if (dimm_size < 1024)
503 aprint_normal("%dMB", dimm_size);
504 else
505 aprint_normal("%dGB", dimm_size / 1024);
506 if (node != NULL)
507 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
508 CTLFLAG_IMMEDIATE,
509 CTLTYPE_INT, "size",
510 SYSCTL_DESCR("module size in MB"), NULL,
511 dimm_size, NULL, 0,
512 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
513
514 if (cycle_time == 0) {
515 aprint_normal("\n");
516 return;
517 }
518
519 /*
520 * Calculate p_clk first, since for DDR3 we need maximum significance.
521 * DDR3 rating is not rounded to a multiple of 100. This results in
522 * cycle_time of 1.5ns displayed as PC3-10666.
523 *
524 * For SDRAM, the speed is provided by the caller so we use it.
525 */
526 d_clk *= 1000 * 1000;
527 if (speed)
528 p_clk = speed;
529 else
530 p_clk = (d_clk * bits) / 8 / cycle_time;
531 d_clk = ((d_clk + cycle_time / 2) ) / cycle_time;
532 if (round) {
533 if ((p_clk % 100) >= 50)
534 p_clk += 50;
535 p_clk -= p_clk % 100;
536 }
537 aprint_normal(", %dMHz (%s-%d)\n",
538 d_clk, ddr_type_string, p_clk);
539 if (node != NULL)
540 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
541 CTLFLAG_IMMEDIATE,
542 CTLTYPE_INT, "speed",
543 SYSCTL_DESCR("memory speed in MHz"),
544 NULL, d_clk, NULL, 0,
545 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
546 }
547
548 static void
549 decode_voltage_refresh(device_t self, struct spdmem *s)
550 {
551 const char *voltage, *refresh;
552
553 if (s->sm_voltage < __arraycount(spdmem_voltage_types))
554 voltage = spdmem_voltage_types[s->sm_voltage];
555 else
556 voltage = "unknown";
557
558 if (s->sm_refresh < __arraycount(spdmem_refresh_types))
559 refresh = spdmem_refresh_types[s->sm_refresh];
560 else
561 refresh = "unknown";
562
563 aprint_verbose_dev(self, "voltage %s, refresh time %s%s\n",
564 voltage, refresh,
565 s->sm_selfrefresh?" (self-refreshing)":"");
566 }
567
568 static void
569 decode_edofpm(const struct sysctlnode *node, device_t self, struct spdmem *s)
570 {
571
572 aprint_naive("\n");
573 aprint_normal("\n");
574 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
575
576 aprint_normal("\n");
577 aprint_verbose_dev(self,
578 "%d rows, %d cols, %d banks, %dns tRAC, %dns tCAC\n",
579 s->sm_fpm.fpm_rows, s->sm_fpm.fpm_cols, s->sm_fpm.fpm_banks,
580 s->sm_fpm.fpm_tRAC, s->sm_fpm.fpm_tCAC);
581 }
582
583 static void
584 decode_rom(const struct sysctlnode *node, device_t self, struct spdmem *s)
585 {
586
587 aprint_naive("\n");
588 aprint_normal("\n");
589 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
590
591 aprint_normal("\n");
592 aprint_verbose_dev(self, "%d rows, %d cols, %d banks\n",
593 s->sm_rom.rom_rows, s->sm_rom.rom_cols, s->sm_rom.rom_banks);
594 }
595
596 static void
597 decode_sdram(const struct sysctlnode *node, device_t self, struct spdmem *s,
598 int spd_len)
599 {
600 int dimm_size, cycle_time, bits, tAA, i, speed, freq;
601
602 aprint_naive("\n");
603 aprint_normal("\n");
604 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
605
606 aprint_normal("%s, %s, ",
607 (s->sm_sdr.sdr_mod_attrs & SPDMEM_SDR_MASK_REG)?
608 " (registered)":"",
609 (s->sm_config < __arraycount(spdmem_parity_types))?
610 spdmem_parity_types[s->sm_config]:"invalid parity");
611
612 dimm_size = 1 << (s->sm_sdr.sdr_rows + s->sm_sdr.sdr_cols - 17);
613 dimm_size *= s->sm_sdr.sdr_banks * s->sm_sdr.sdr_banks_per_chip;
614
615 cycle_time = s->sm_sdr.sdr_cycle_whole * 1000 +
616 s->sm_sdr.sdr_cycle_tenths * 100;
617 bits = le16toh(s->sm_sdr.sdr_datawidth);
618 if (s->sm_config == 1 || s->sm_config == 2)
619 bits -= 8;
620
621 /* Calculate speed here - from OpenBSD */
622 if (spd_len >= 128)
623 freq = ((uint8_t *)s)[126];
624 else
625 freq = 0;
626 switch (freq) {
627 /*
628 * Must check cycle time since some PC-133 DIMMs
629 * actually report PC-100
630 */
631 case 100:
632 case 133:
633 if (cycle_time < 8000)
634 speed = 133;
635 else
636 speed = 100;
637 break;
638 case 0x66: /* Legacy DIMMs use _hex_ 66! */
639 default:
640 speed = 66;
641 }
642 decode_size_speed(self, node, dimm_size, cycle_time, 1, bits, FALSE,
643 "PC", speed);
644
645 aprint_verbose_dev(self,
646 "%d rows, %d cols, %d banks, %d banks/chip, %d.%dns cycle time\n",
647 s->sm_sdr.sdr_rows, s->sm_sdr.sdr_cols, s->sm_sdr.sdr_banks,
648 s->sm_sdr.sdr_banks_per_chip, cycle_time/1000,
649 (cycle_time % 1000) / 100);
650
651 tAA = 0;
652 for (i = 0; i < 8; i++)
653 if (s->sm_sdr.sdr_tCAS & (1 << i))
654 tAA = i;
655 tAA++;
656 aprint_verbose_dev(self, LATENCY, tAA, s->sm_sdr.sdr_tRCD,
657 s->sm_sdr.sdr_tRP, s->sm_sdr.sdr_tRAS);
658
659 decode_voltage_refresh(self, s);
660 }
661
662 static void
663 decode_ddr(const struct sysctlnode *node, device_t self, struct spdmem *s)
664 {
665 int dimm_size, cycle_time, bits, tAA, i;
666
667 aprint_naive("\n");
668 aprint_normal("\n");
669 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
670
671 aprint_normal("%s, %s, ",
672 (s->sm_ddr.ddr_mod_attrs & SPDMEM_DDR_MASK_REG)?
673 " (registered)":"",
674 (s->sm_config < __arraycount(spdmem_parity_types))?
675 spdmem_parity_types[s->sm_config]:"invalid parity");
676
677 dimm_size = 1 << (s->sm_ddr.ddr_rows + s->sm_ddr.ddr_cols - 17);
678 dimm_size *= s->sm_ddr.ddr_ranks * s->sm_ddr.ddr_banks_per_chip;
679
680 cycle_time = s->sm_ddr.ddr_cycle_whole * 1000 +
681 spdmem_cycle_frac[s->sm_ddr.ddr_cycle_tenths];
682 bits = le16toh(s->sm_ddr.ddr_datawidth);
683 if (s->sm_config == 1 || s->sm_config == 2)
684 bits -= 8;
685 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
686 "PC", 0);
687
688 aprint_verbose_dev(self,
689 "%d rows, %d cols, %d ranks, %d banks/chip, %d.%dns cycle time\n",
690 s->sm_ddr.ddr_rows, s->sm_ddr.ddr_cols, s->sm_ddr.ddr_ranks,
691 s->sm_ddr.ddr_banks_per_chip, cycle_time/1000,
692 (cycle_time % 1000 + 50) / 100);
693
694 tAA = 0;
695 for (i = 2; i < 8; i++)
696 if (s->sm_ddr.ddr_tCAS & (1 << i))
697 tAA = i;
698 tAA /= 2;
699
700 #define __DDR_ROUND(scale, field) \
701 ((scale * s->sm_ddr.field + cycle_time - 1) / cycle_time)
702
703 aprint_verbose_dev(self, LATENCY, tAA, __DDR_ROUND(250, ddr_tRCD),
704 __DDR_ROUND(250, ddr_tRP), __DDR_ROUND(1000, ddr_tRAS));
705
706 #undef __DDR_ROUND
707
708 decode_voltage_refresh(self, s);
709 }
710
711 static void
712 decode_ddr2(const struct sysctlnode *node, device_t self, struct spdmem *s)
713 {
714 int dimm_size, cycle_time, bits, tAA, i;
715
716 aprint_naive("\n");
717 aprint_normal("\n");
718 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
719
720 aprint_normal("%s, %s, ",
721 (s->sm_ddr2.ddr2_mod_attrs & SPDMEM_DDR2_MASK_REG)?
722 " (registered)":"",
723 (s->sm_config < __arraycount(spdmem_parity_types))?
724 spdmem_parity_types[s->sm_config]:"invalid parity");
725
726 dimm_size = 1 << (s->sm_ddr2.ddr2_rows + s->sm_ddr2.ddr2_cols - 17);
727 dimm_size *= (s->sm_ddr2.ddr2_ranks + 1) *
728 s->sm_ddr2.ddr2_banks_per_chip;
729
730 cycle_time = s->sm_ddr2.ddr2_cycle_whole * 1000 +
731 spdmem_cycle_frac[s->sm_ddr2.ddr2_cycle_frac];
732 bits = s->sm_ddr2.ddr2_datawidth;
733 if ((s->sm_config & 0x03) != 0)
734 bits -= 8;
735 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
736 "PC2", 0);
737
738 aprint_verbose_dev(self,
739 "%d rows, %d cols, %d ranks, %d banks/chip, %d.%02dns cycle time\n",
740 s->sm_ddr2.ddr2_rows, s->sm_ddr2.ddr2_cols,
741 s->sm_ddr2.ddr2_ranks + 1, s->sm_ddr2.ddr2_banks_per_chip,
742 cycle_time / 1000, (cycle_time % 1000 + 5) /10 );
743
744 tAA = 0;
745 for (i = 2; i < 8; i++)
746 if (s->sm_ddr2.ddr2_tCAS & (1 << i))
747 tAA = i;
748
749 #define __DDR2_ROUND(scale, field) \
750 ((scale * s->sm_ddr2.field + cycle_time - 1) / cycle_time)
751
752 aprint_verbose_dev(self, LATENCY, tAA, __DDR2_ROUND(250, ddr2_tRCD),
753 __DDR2_ROUND(250, ddr2_tRP), __DDR2_ROUND(1000, ddr2_tRAS));
754
755 #undef __DDR_ROUND
756
757 decode_voltage_refresh(self, s);
758 }
759
760 static void
761 print_part(const char *part, size_t pnsize)
762 {
763 const char *p = memchr(part, ' ', pnsize);
764 if (p == NULL)
765 p = part + pnsize;
766 aprint_normal(": %.*s\n", (int)(p - part), part);
767 }
768
769 static u_int
770 ddr3_value_pico(struct spdmem *s, uint8_t txx_mtb, uint8_t txx_ftb)
771 {
772 u_int mtb, ftb; /* in picoseconds */
773 intmax_t signed_txx_ftb;
774 u_int val;
775
776 mtb = (u_int)s->sm_ddr3.ddr3_mtb_dividend * 1000 /
777 s->sm_ddr3.ddr3_mtb_divisor;
778 ftb = (u_int)s->sm_ddr3.ddr3_ftb_dividend * 1000 /
779 s->sm_ddr3.ddr3_ftb_divisor;
780
781 /* tXX_ftb is signed value */
782 signed_txx_ftb = (int8_t)txx_ftb;
783 val = txx_mtb * mtb +
784 ((txx_ftb > 127) ? signed_txx_ftb : txx_ftb) * ftb / 1000;
785
786 return val;
787 }
788
789 #define __DDR3_VALUE_PICO(s, field) \
790 ddr3_value_pico(s, s->sm_ddr3.ddr3_##field##_mtb, \
791 s->sm_ddr3.ddr3_##field##_ftb)
792
793 static void
794 decode_ddr3(const struct sysctlnode *node, device_t self, struct spdmem *s)
795 {
796 int dimm_size, cycle_time, bits;
797
798 aprint_naive("\n");
799 print_part(s->sm_ddr3.ddr3_part, sizeof(s->sm_ddr3.ddr3_part));
800 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
801
802 if (s->sm_ddr3.ddr3_mod_type ==
803 SPDMEM_DDR3_TYPE_MINI_RDIMM ||
804 s->sm_ddr3.ddr3_mod_type == SPDMEM_DDR3_TYPE_RDIMM)
805 aprint_normal(" (registered)");
806 aprint_normal(", %sECC, %stemp-sensor, ",
807 (s->sm_ddr3.ddr3_hasECC)?"":"no ",
808 (s->sm_ddr3.ddr3_has_therm_sensor)?"":"no ");
809
810 /*
811 * DDR3 size specification is quite different from others
812 *
813 * Module capacity is defined as
814 * Chip_Capacity_in_bits / 8bits-per-byte *
815 * external_bus_width / internal_bus_width
816 * We further divide by 2**20 to get our answer in MB
817 */
818 dimm_size = (s->sm_ddr3.ddr3_chipsize + 28 - 20) - 3 +
819 (s->sm_ddr3.ddr3_datawidth + 3) -
820 (s->sm_ddr3.ddr3_chipwidth + 2);
821 dimm_size = (1 << dimm_size) * (s->sm_ddr3.ddr3_physbanks + 1);
822
823 cycle_time = __DDR3_VALUE_PICO(s, tCKmin);
824 bits = 1 << (s->sm_ddr3.ddr3_datawidth + 3);
825 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, FALSE,
826 "PC3", 0);
827
828 aprint_verbose_dev(self,
829 "%d rows, %d cols, %d log. banks, %d phys. banks, "
830 "%d.%03dns cycle time\n",
831 s->sm_ddr3.ddr3_rows + 12, s->sm_ddr3.ddr3_cols + 9,
832 1 << (s->sm_ddr3.ddr3_logbanks + 3),
833 s->sm_ddr3.ddr3_physbanks + 1,
834 cycle_time/1000, cycle_time % 1000);
835
836 #define __DDR3_CYCLES(val) \
837 ((val / cycle_time) + ((val % cycle_time) ? 1 : 0))
838
839 aprint_verbose_dev(self, LATENCY,
840 __DDR3_CYCLES(__DDR3_VALUE_PICO(s, tAAmin)),
841 __DDR3_CYCLES(__DDR3_VALUE_PICO(s, tRCDmin)),
842 __DDR3_CYCLES(__DDR3_VALUE_PICO(s, tRPmin)),
843 __DDR3_CYCLES((s->sm_ddr3.ddr3_tRAS_msb * 256
844 + s->sm_ddr3.ddr3_tRAS_lsb) * s->sm_ddr3.ddr3_mtb_dividend
845 / s->sm_ddr3.ddr3_mtb_divisor * 1000));
846
847 #undef __DDR3_CYCLES
848
849 /* For DDR3, Voltage is written in another area */
850 if (!s->sm_ddr3.ddr3_NOT15V || s->sm_ddr3.ddr3_135V
851 || s->sm_ddr3.ddr3_125V) {
852 aprint_verbose("%s:", device_xname(self));
853 if (!s->sm_ddr3.ddr3_NOT15V)
854 aprint_verbose(" 1.5V");
855 if (s->sm_ddr3.ddr3_135V)
856 aprint_verbose(" 1.35V");
857 if (s->sm_ddr3.ddr3_125V)
858 aprint_verbose(" 1.25V");
859 aprint_verbose(" operable\n");
860 }
861 }
862
863 static void
864 decode_fbdimm(const struct sysctlnode *node, device_t self, struct spdmem *s)
865 {
866 int dimm_size, cycle_time, bits;
867
868 aprint_naive("\n");
869 aprint_normal("\n");
870 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
871
872 /*
873 * FB-DIMM module size calculation is very much like DDR3
874 */
875 dimm_size = s->sm_fbd.fbdimm_rows + 12 +
876 s->sm_fbd.fbdimm_cols + 9 - 20 - 3;
877 dimm_size = (1 << dimm_size) * (1 << (s->sm_fbd.fbdimm_banks + 2));
878
879 cycle_time = (1000 * s->sm_fbd.fbdimm_mtb_dividend +
880 (s->sm_fbd.fbdimm_mtb_divisor / 2)) /
881 s->sm_fbd.fbdimm_mtb_divisor;
882 bits = 1 << (s->sm_fbd.fbdimm_dev_width + 2);
883 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
884 "PC2", 0);
885
886 aprint_verbose_dev(self,
887 "%d rows, %d cols, %d banks, %d.%02dns cycle time\n",
888 s->sm_fbd.fbdimm_rows, s->sm_fbd.fbdimm_cols,
889 1 << (s->sm_fbd.fbdimm_banks + 2),
890 cycle_time / 1000, (cycle_time % 1000 + 5) /10 );
891
892 #define __FBDIMM_CYCLES(field) (s->sm_fbd.field / s->sm_fbd.fbdimm_tCKmin)
893
894 aprint_verbose_dev(self, LATENCY, __FBDIMM_CYCLES(fbdimm_tAAmin),
895 __FBDIMM_CYCLES(fbdimm_tRCDmin), __FBDIMM_CYCLES(fbdimm_tRPmin),
896 (s->sm_fbd.fbdimm_tRAS_msb * 256 + s->sm_fbd.fbdimm_tRAS_lsb) /
897 s->sm_fbd.fbdimm_tCKmin);
898
899 #undef __FBDIMM_CYCLES
900
901 decode_voltage_refresh(self, s);
902 }
903
904 static void
905 decode_ddr4(const struct sysctlnode *node, device_t self, struct spdmem *s)
906 {
907 int dimm_size, cycle_time, ranks;
908 int tAA_clocks, tRCD_clocks, tRP_clocks, tRAS_clocks;
909
910 aprint_naive("\n");
911 print_part(s->sm_ddr4.ddr4_part_number,
912 sizeof(s->sm_ddr4.ddr4_part_number));
913 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
914 if (s->sm_ddr4.ddr4_mod_type < __arraycount(spdmem_ddr4_module_types))
915 aprint_normal(" (%s)",
916 spdmem_ddr4_module_types[s->sm_ddr4.ddr4_mod_type]);
917 aprint_normal(", %sECC, %stemp-sensor, ",
918 (s->sm_ddr4.ddr4_bus_width_extension) ? "" : "no ",
919 (s->sm_ddr4.ddr4_has_therm_sensor) ? "" : "no ");
920
921 /*
922 * DDR4 size calculation from JEDEC spec
923 *
924 * Module capacity in bytes is defined as
925 * Chip_Capacity_in_bits / 8bits-per-byte *
926 * primary_bus_width / DRAM_width *
927 * logical_ranks_per_DIMM
928 *
929 * logical_ranks_per DIMM equals package_ranks, but multiply
930 * by diecount for 3DS packages
931 *
932 * We further divide by 2**20 to get our answer in MB
933 */
934 dimm_size = (s->sm_ddr4.ddr4_capacity + 28) /* chip_capacity */
935 - 20 /* convert to MB */
936 - 3 /* bits --> bytes */
937 + (s->sm_ddr4.ddr4_primary_bus_width + 3); /* bus width */
938 switch (s->sm_ddr4.ddr4_device_width) { /* DRAM width */
939 case 0: dimm_size -= 2;
940 break;
941 case 1: dimm_size -= 3;
942 break;
943 case 2: dimm_size -= 4;
944 break;
945 case 4: dimm_size -= 5;
946 break;
947 default:
948 dimm_size = -1; /* flag invalid value */
949 }
950 if (dimm_size >= 0) {
951 dimm_size = (1 << dimm_size) *
952 (s->sm_ddr4.ddr4_package_ranks + 1); /* log.ranks/DIMM */
953 if (s->sm_ddr4.ddr4_signal_loading == 2) {
954 dimm_size *= (s->sm_ddr4.ddr4_diecount + 1);
955 }
956 }
957
958 /*
959 * Note that the ddr4_xxx_ftb fields are actually signed offsets from
960 * the corresponding mtb value, so we might have to subtract 256!
961 */
962 #define __DDR4_VALUE(field) ((s->sm_ddr4.ddr4_##field##_mtb * 125 + \
963 s->sm_ddr4.ddr4_##field##_ftb) - \
964 ((s->sm_ddr4.ddr4_##field##_ftb > 127)?256:0))
965 /*
966 * For now, the only value for mtb is 0 = 125ps, and ftb = 1ps
967 * so we don't need to figure out the time-base units - just
968 * hard-code them for now.
969 */
970 cycle_time = __DDR4_VALUE(tCKAVGmin);
971 decode_size_speed(self, node, dimm_size, cycle_time, 2,
972 1 << (s->sm_ddr4.ddr4_primary_bus_width + 3),
973 TRUE, "PC4", 0);
974
975 ranks = s->sm_ddr4.ddr4_package_ranks + 1;
976 aprint_verbose_dev(self,
977 "%d rows, %d cols, %d ranks%s, %d banks/group, %d bank groups\n",
978 s->sm_ddr4.ddr4_rows + 12, s->sm_ddr4.ddr4_cols + 9,
979 ranks, (ranks > 1) ? ((s->sm_ddr4.ddr4_rank_mix == 1)
980 ? " (asymmetric)" : " (symmetric)") : "",
981 1 << (2 + s->sm_ddr4.ddr4_logbanks),
982 1 << s->sm_ddr4.ddr4_bankgroups);
983
984 aprint_verbose_dev(self, "%d.%03dns cycle time\n",
985 cycle_time / 1000, cycle_time % 1000);
986
987 tAA_clocks = __DDR4_VALUE(tAAmin) * 1000 / cycle_time;
988 tRCD_clocks = __DDR4_VALUE(tRCDmin) * 1000 / cycle_time;
989 tRP_clocks = __DDR4_VALUE(tRPmin) * 1000 / cycle_time;
990 tRAS_clocks = (s->sm_ddr4.ddr4_tRASmin_msb * 256 +
991 s->sm_ddr4.ddr4_tRASmin_lsb) * 125 * 1000 / cycle_time;
992
993 /*
994 * Per JEDEC spec, rounding is done by taking the time value, dividing
995 * by the cycle time, subtracting .010 from the result, and then
996 * rounded up to the nearest integer. Unfortunately, none of their
997 * examples say what to do when the result of the subtraction is already
998 * an integer. For now, assume that we still round up (so an interval
999 * of exactly 12.010 clock cycles will be printed as 13).
1000 */
1001 #define __DDR4_ROUND(value) ((value - 10) / 1000 + 1)
1002
1003 aprint_verbose_dev(self, LATENCY, __DDR4_ROUND(tAA_clocks),
1004 __DDR4_ROUND(tRCD_clocks),
1005 __DDR4_ROUND(tRP_clocks),
1006 __DDR4_ROUND(tRAS_clocks));
1007
1008 #undef __DDR4_VALUE
1009 #undef __DDR4_ROUND
1010 }
Cache object: ad10d35a9426f8761e913fb4d3d41d03
|