spdmem.c revision 1.16 1 /* $NetBSD: spdmem.c,v 1.16 2015/12/05 06:54:22 pgoyette 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.16 2015/12/05 06:54:22 pgoyette 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 };
82
83 static const char* const spdmem_ddr4_module_types[] = {
84 "DDR4 Extended",
85 "DDR4 RDIMM",
86 "DDR4 UDIMM",
87 "DDR4 SO-DIMM",
88 "DDR4 Load-Reduced DIMM",
89 "DDR4 Mini-RDIMM",
90 "DDR4 Mini-UDIMM",
91 "DDR4 Reserved",
92 "DDR4 72Bit SO-RDIMM",
93 "DDR4 72Bit SO-UDIMM",
94 "DDR4 Undefined",
95 "DDR4 Reserved",
96 "DDR4 16Bit SO-DIMM",
97 "DDR4 32Bit SO-DIMM",
98 "DDR4 Reserved",
99 "DDR4 Undefined"
100 };
101
102 static const char* const spdmem_superset_types[] = {
103 "unknown",
104 "ESDRAM",
105 "DDR ESDRAM",
106 "PEM EDO",
107 "PEM SDRAM"
108 };
109
110 static const char* const spdmem_voltage_types[] = {
111 "TTL (5V tolerant)",
112 "LvTTL (not 5V tolerant)",
113 "HSTL 1.5V",
114 "SSTL 3.3V",
115 "SSTL 2.5V",
116 "SSTL 1.8V"
117 };
118
119 static const char* const spdmem_refresh_types[] = {
120 "15.625us",
121 "3.9us",
122 "7.8us",
123 "31.3us",
124 "62.5us",
125 "125us"
126 };
127
128 static const char* const spdmem_parity_types[] = {
129 "no parity or ECC",
130 "data parity",
131 "data ECC",
132 "data parity and ECC",
133 "cmd/addr parity",
134 "cmd/addr/data parity",
135 "cmd/addr parity, data ECC",
136 "cmd/addr/data parity, data ECC"
137 };
138
139 int spd_rom_sizes[] = { 0, 128, 256, 384, 512 };
140
141
142 /* Cycle time fractional values (units of .001 ns) for DDR2 SDRAM */
143 static const uint16_t spdmem_cycle_frac[] = {
144 0, 100, 200, 300, 400, 500, 600, 700, 800, 900,
145 250, 333, 667, 750, 999, 999
146 };
147
148 /* Format string for timing info */
149 #define LATENCY "tAA-tRCD-tRP-tRAS: %d-%d-%d-%d\n"
150
151 /* CRC functions used for certain memory types */
152
153 static uint16_t spdcrc16 (struct spdmem_softc *sc, int count)
154 {
155 uint16_t crc;
156 int i, j;
157 uint8_t val;
158 crc = 0;
159 for (j = 0; j <= count; j++) {
160 val = (sc->sc_read)(sc, j);
161 crc = crc ^ val << 8;
162 for (i = 0; i < 8; ++i)
163 if (crc & 0x8000)
164 crc = crc << 1 ^ 0x1021;
165 else
166 crc = crc << 1;
167 }
168 return (crc & 0xFFFF);
169 }
170
171 int
172 spdmem_common_probe(struct spdmem_softc *sc)
173 {
174 int cksum = 0;
175 uint8_t i, val, spd_type;
176 int spd_len, spd_crc_cover;
177 uint16_t crc_calc, crc_spd;
178
179 spd_type = (sc->sc_read)(sc, 2);
180
181 /* For older memory types, validate the checksum over 1st 63 bytes */
182 if (spd_type <= SPDMEM_MEMTYPE_DDR2SDRAM) {
183 for (i = 0; i < 63; i++)
184 cksum += (sc->sc_read)(sc, i);
185
186 val = (sc->sc_read)(sc, 63);
187
188 if (cksum == 0 || (cksum & 0xff) != val) {
189 aprint_debug("spd checksum failed, calc = 0x%02x, "
190 "spd = 0x%02x\n", cksum, val);
191 return 0;
192 } else
193 return 1;
194 }
195
196 /* For DDR3 and FBDIMM, verify the CRC */
197 else if (spd_type <= SPDMEM_MEMTYPE_DDR3SDRAM) {
198 spd_len = (sc->sc_read)(sc, 0);
199 if (spd_len & SPDMEM_SPDCRC_116)
200 spd_crc_cover = 116;
201 else
202 spd_crc_cover = 125;
203 switch (spd_len & SPDMEM_SPDLEN_MASK) {
204 case SPDMEM_SPDLEN_128:
205 spd_len = 128;
206 break;
207 case SPDMEM_SPDLEN_176:
208 spd_len = 176;
209 break;
210 case SPDMEM_SPDLEN_256:
211 spd_len = 256;
212 break;
213 default:
214 return 0;
215 }
216 if (spd_crc_cover > spd_len)
217 return 0;
218 crc_calc = spdcrc16(sc, spd_crc_cover);
219 crc_spd = (sc->sc_read)(sc, 127) << 8;
220 crc_spd |= (sc->sc_read)(sc, 126);
221 if (crc_calc != crc_spd) {
222 aprint_debug("crc16 failed, covers %d bytes, "
223 "calc = 0x%04x, spd = 0x%04x\n",
224 spd_crc_cover, crc_calc, crc_spd);
225 return 0;
226 }
227 return 1;
228 } else if (spd_type == SPDMEM_MEMTYPE_DDR4SDRAM) {
229 spd_len = (sc->sc_read)(sc, 0) & 0x0f;
230 if ((unsigned int)spd_len > __arraycount(spd_rom_sizes))
231 return 0;
232 spd_len = spd_rom_sizes[spd_len];
233 spd_crc_cover=125; /* For byte 0 to 125 */
234 if (spd_crc_cover > spd_len)
235 return 0;
236 crc_calc = spdcrc16(sc, spd_crc_cover);
237 crc_spd = (sc->sc_read)(sc, 127) << 8;
238 crc_spd |= (sc->sc_read)(sc, 126);
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 /*
246 * We probably could also verify the CRC for the other
247 * "pages" of SPD data in blocks 1 and 2, but we'll do
248 * it some other time.
249 */
250 return 1;
251 } else
252 return 0;
253
254 /* For unrecognized memory types, don't match at all */
255 return 0;
256 }
257
258 void
259 spdmem_common_attach(struct spdmem_softc *sc, device_t self)
260 {
261 struct spdmem *s = &(sc->sc_spd_data);
262 const char *type;
263 const char *rambus_rev = "Reserved";
264 int dimm_size;
265 unsigned int i, spd_len, spd_size;
266 const struct sysctlnode *node = NULL;
267
268 s->sm_len = (sc->sc_read)(sc, 0);
269 s->sm_size = (sc->sc_read)(sc, 1);
270 s->sm_type = (sc->sc_read)(sc, 2);
271
272 if (s->sm_type == SPDMEM_MEMTYPE_DDR4SDRAM) {
273 /*
274 * An even newer encoding with one byte holding both
275 * the used-size and capacity values
276 */
277 spd_len = s->sm_len & 0x0f;
278 spd_size = (s->sm_len >> 4) & 0x07;
279
280 spd_len = spd_rom_sizes[spd_len];
281 spd_size *= 512;
282
283 } else if (s->sm_type >= SPDMEM_MEMTYPE_FBDIMM) {
284 /*
285 * FBDIMM and DDR3 (and probably all newer) have a different
286 * encoding of the SPD EEPROM used/total sizes
287 */
288 spd_size = 64 << (s->sm_len & SPDMEM_SPDSIZE_MASK);
289 switch (s->sm_len & SPDMEM_SPDLEN_MASK) {
290 case SPDMEM_SPDLEN_128:
291 spd_len = 128;
292 break;
293 case SPDMEM_SPDLEN_176:
294 spd_len = 176;
295 break;
296 case SPDMEM_SPDLEN_256:
297 spd_len = 256;
298 break;
299 default:
300 spd_len = 64;
301 break;
302 }
303 } else {
304 spd_size = 1 << s->sm_size;
305 spd_len = s->sm_len;
306 if (spd_len < 64)
307 spd_len = 64;
308 }
309 if (spd_len > spd_size)
310 spd_len = spd_size;
311 if (spd_len > sizeof(struct spdmem))
312 spd_len = sizeof(struct spdmem);
313 for (i = 3; i < spd_len; i++)
314 ((uint8_t *)s)[i] = (sc->sc_read)(sc, i);
315
316 /*
317 * Setup our sysctl subtree, hw.spdmemN
318 */
319 sc->sc_sysctl_log = NULL;
320 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, &node,
321 0, CTLTYPE_NODE,
322 device_xname(self), NULL, NULL, 0, NULL, 0,
323 CTL_HW, CTL_CREATE, CTL_EOL);
324 if (node != NULL && spd_len != 0)
325 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
326 0,
327 CTLTYPE_STRUCT, "spd_data",
328 SYSCTL_DESCR("raw spd data"), NULL,
329 0, s, spd_len,
330 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
331
332 /*
333 * Decode and print key SPD contents
334 */
335 if (IS_RAMBUS_TYPE) {
336 if (s->sm_type == SPDMEM_MEMTYPE_RAMBUS)
337 type = "Rambus";
338 else if (s->sm_type == SPDMEM_MEMTYPE_DIRECTRAMBUS)
339 type = "Direct Rambus";
340 else
341 type = "Rambus (unknown)";
342
343 switch (s->sm_len) {
344 case 0:
345 rambus_rev = "Invalid";
346 break;
347 case 1:
348 rambus_rev = "0.7";
349 break;
350 case 2:
351 rambus_rev = "1.0";
352 break;
353 default:
354 rambus_rev = "Reserved";
355 break;
356 }
357 } else {
358 if (s->sm_type < __arraycount(spdmem_basic_types))
359 type = spdmem_basic_types[s->sm_type];
360 else
361 type = "unknown memory type";
362
363 if (s->sm_type == SPDMEM_MEMTYPE_EDO &&
364 s->sm_fpm.fpm_superset == SPDMEM_SUPERSET_EDO_PEM)
365 type = spdmem_superset_types[SPDMEM_SUPERSET_EDO_PEM];
366 if (s->sm_type == SPDMEM_MEMTYPE_SDRAM &&
367 s->sm_sdr.sdr_superset == SPDMEM_SUPERSET_SDRAM_PEM)
368 type = spdmem_superset_types[SPDMEM_SUPERSET_SDRAM_PEM];
369 if (s->sm_type == SPDMEM_MEMTYPE_DDRSDRAM &&
370 s->sm_ddr.ddr_superset == SPDMEM_SUPERSET_DDR_ESDRAM)
371 type =
372 spdmem_superset_types[SPDMEM_SUPERSET_DDR_ESDRAM];
373 if (s->sm_type == SPDMEM_MEMTYPE_SDRAM &&
374 s->sm_sdr.sdr_superset == SPDMEM_SUPERSET_ESDRAM) {
375 type = spdmem_superset_types[SPDMEM_SUPERSET_ESDRAM];
376 }
377 if (s->sm_type == SPDMEM_MEMTYPE_DDR4SDRAM &&
378 s->sm_ddr4.ddr4_mod_type <
379 __arraycount(spdmem_ddr4_module_types)) {
380 type = spdmem_ddr4_module_types[s->sm_ddr4.ddr4_mod_type];
381 }
382 }
383
384 strlcpy(sc->sc_type, type, SPDMEM_TYPE_MAXLEN);
385 if (node != NULL)
386 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
387 0,
388 CTLTYPE_STRING, "mem_type",
389 SYSCTL_DESCR("memory module type"), NULL,
390 0, sc->sc_type, 0,
391 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
392
393 if (IS_RAMBUS_TYPE) {
394 aprint_naive("\n");
395 aprint_normal("\n");
396 aprint_normal_dev(self, "%s, SPD Revision %s", type, rambus_rev);
397 dimm_size = 1 << (s->sm_rdr.rdr_rows + s->sm_rdr.rdr_cols - 13);
398 if (dimm_size >= 1024)
399 aprint_normal(", %dGB\n", dimm_size / 1024);
400 else
401 aprint_normal(", %dMB\n", dimm_size);
402
403 /* No further decode for RAMBUS memory */
404 return;
405 }
406 switch (s->sm_type) {
407 case SPDMEM_MEMTYPE_EDO:
408 case SPDMEM_MEMTYPE_FPM:
409 decode_edofpm(node, self, s);
410 break;
411 case SPDMEM_MEMTYPE_ROM:
412 decode_rom(node, self, s);
413 break;
414 case SPDMEM_MEMTYPE_SDRAM:
415 decode_sdram(node, self, s, spd_len);
416 break;
417 case SPDMEM_MEMTYPE_DDRSDRAM:
418 decode_ddr(node, self, s);
419 break;
420 case SPDMEM_MEMTYPE_DDR2SDRAM:
421 decode_ddr2(node, self, s);
422 break;
423 case SPDMEM_MEMTYPE_DDR3SDRAM:
424 decode_ddr3(node, self, s);
425 break;
426 case SPDMEM_MEMTYPE_FBDIMM:
427 case SPDMEM_MEMTYPE_FBDIMM_PROBE:
428 decode_fbdimm(node, self, s);
429 break;
430 case SPDMEM_MEMTYPE_DDR4SDRAM:
431 decode_ddr4(node, self, s);
432 break;
433 }
434
435 /* Dump SPD */
436 for (i = 0; i < spd_len; i += 16) {
437 unsigned int j, k;
438 aprint_debug_dev(self, "0x%02x:", i);
439 k = (spd_len > (i + 16)) ? i + 16 : spd_len;
440 for (j = i; j < k; j++)
441 aprint_debug(" %02x", ((uint8_t *)s)[j]);
442 aprint_debug("\n");
443 }
444 }
445
446 int
447 spdmem_common_detach(struct spdmem_softc *sc, device_t self)
448 {
449 sysctl_teardown(&sc->sc_sysctl_log);
450
451 return 0;
452 }
453
454 static void
455 decode_size_speed(device_t self, const struct sysctlnode *node,
456 int dimm_size, int cycle_time, int d_clk, int bits,
457 bool round, const char *ddr_type_string, int speed)
458 {
459 int p_clk;
460 struct spdmem_softc *sc = device_private(self);
461
462 if (dimm_size < 1024)
463 aprint_normal("%dMB", dimm_size);
464 else
465 aprint_normal("%dGB", dimm_size / 1024);
466 if (node != NULL)
467 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
468 CTLFLAG_IMMEDIATE,
469 CTLTYPE_INT, "size",
470 SYSCTL_DESCR("module size in MB"), NULL,
471 dimm_size, NULL, 0,
472 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
473
474 if (cycle_time == 0) {
475 aprint_normal("\n");
476 return;
477 }
478
479 /*
480 * Calculate p_clk first, since for DDR3 we need maximum significance.
481 * DDR3 rating is not rounded to a multiple of 100. This results in
482 * cycle_time of 1.5ns displayed as PC3-10666.
483 *
484 * For SDRAM, the speed is provided by the caller so we use it.
485 */
486 d_clk *= 1000 * 1000;
487 if (speed)
488 p_clk = speed;
489 else
490 p_clk = (d_clk * bits) / 8 / cycle_time;
491 d_clk = ((d_clk + cycle_time / 2) ) / cycle_time;
492 if (round) {
493 if ((p_clk % 100) >= 50)
494 p_clk += 50;
495 p_clk -= p_clk % 100;
496 }
497 aprint_normal(", %dMHz (%s-%d)\n",
498 d_clk, ddr_type_string, p_clk);
499 if (node != NULL)
500 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
501 CTLFLAG_IMMEDIATE,
502 CTLTYPE_INT, "speed",
503 SYSCTL_DESCR("memory speed in MHz"),
504 NULL, d_clk, NULL, 0,
505 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
506 }
507
508 static void
509 decode_voltage_refresh(device_t self, struct spdmem *s)
510 {
511 const char *voltage, *refresh;
512
513 if (s->sm_voltage < __arraycount(spdmem_voltage_types))
514 voltage = spdmem_voltage_types[s->sm_voltage];
515 else
516 voltage = "unknown";
517
518 if (s->sm_refresh < __arraycount(spdmem_refresh_types))
519 refresh = spdmem_refresh_types[s->sm_refresh];
520 else
521 refresh = "unknown";
522
523 aprint_verbose_dev(self, "voltage %s, refresh time %s%s\n",
524 voltage, refresh,
525 s->sm_selfrefresh?" (self-refreshing)":"");
526 }
527
528 static void
529 decode_edofpm(const struct sysctlnode *node, device_t self, struct spdmem *s) {
530 aprint_naive("\n");
531 aprint_normal("\n");
532 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
533
534 aprint_normal("\n");
535 aprint_verbose_dev(self,
536 "%d rows, %d cols, %d banks, %dns tRAC, %dns tCAC\n",
537 s->sm_fpm.fpm_rows, s->sm_fpm.fpm_cols, s->sm_fpm.fpm_banks,
538 s->sm_fpm.fpm_tRAC, s->sm_fpm.fpm_tCAC);
539 }
540
541 static void
542 decode_rom(const struct sysctlnode *node, device_t self, struct spdmem *s) {
543 aprint_naive("\n");
544 aprint_normal("\n");
545 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
546
547 aprint_normal("\n");
548 aprint_verbose_dev(self, "%d rows, %d cols, %d banks\n",
549 s->sm_rom.rom_rows, s->sm_rom.rom_cols, s->sm_rom.rom_banks);
550 }
551
552 static void
553 decode_sdram(const struct sysctlnode *node, device_t self, struct spdmem *s,
554 int spd_len) {
555 int dimm_size, cycle_time, bits, tAA, i, speed, freq;
556
557 aprint_naive("\n");
558 aprint_normal("\n");
559 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
560
561 aprint_normal("%s, %s, ",
562 (s->sm_sdr.sdr_mod_attrs & SPDMEM_SDR_MASK_REG)?
563 " (registered)":"",
564 (s->sm_config < __arraycount(spdmem_parity_types))?
565 spdmem_parity_types[s->sm_config]:"invalid parity");
566
567 dimm_size = 1 << (s->sm_sdr.sdr_rows + s->sm_sdr.sdr_cols - 17);
568 dimm_size *= s->sm_sdr.sdr_banks * s->sm_sdr.sdr_banks_per_chip;
569
570 cycle_time = s->sm_sdr.sdr_cycle_whole * 1000 +
571 s->sm_sdr.sdr_cycle_tenths * 100;
572 bits = le16toh(s->sm_sdr.sdr_datawidth);
573 if (s->sm_config == 1 || s->sm_config == 2)
574 bits -= 8;
575
576 /* Calculate speed here - from OpenBSD */
577 if (spd_len >= 128)
578 freq = ((uint8_t *)s)[126];
579 else
580 freq = 0;
581 switch (freq) {
582 /*
583 * Must check cycle time since some PC-133 DIMMs
584 * actually report PC-100
585 */
586 case 100:
587 case 133:
588 if (cycle_time < 8000)
589 speed = 133;
590 else
591 speed = 100;
592 break;
593 case 0x66: /* Legacy DIMMs use _hex_ 66! */
594 default:
595 speed = 66;
596 }
597 decode_size_speed(self, node, dimm_size, cycle_time, 1, bits, FALSE,
598 "PC", speed);
599
600 aprint_verbose_dev(self,
601 "%d rows, %d cols, %d banks, %d banks/chip, %d.%dns cycle time\n",
602 s->sm_sdr.sdr_rows, s->sm_sdr.sdr_cols, s->sm_sdr.sdr_banks,
603 s->sm_sdr.sdr_banks_per_chip, cycle_time/1000,
604 (cycle_time % 1000) / 100);
605
606 tAA = 0;
607 for (i = 0; i < 8; i++)
608 if (s->sm_sdr.sdr_tCAS & (1 << i))
609 tAA = i;
610 tAA++;
611 aprint_verbose_dev(self, LATENCY, tAA, s->sm_sdr.sdr_tRCD,
612 s->sm_sdr.sdr_tRP, s->sm_sdr.sdr_tRAS);
613
614 decode_voltage_refresh(self, s);
615 }
616
617 static void
618 decode_ddr(const struct sysctlnode *node, device_t self, struct spdmem *s) {
619 int dimm_size, cycle_time, bits, tAA, i;
620
621 aprint_naive("\n");
622 aprint_normal("\n");
623 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
624
625 aprint_normal("%s, %s, ",
626 (s->sm_ddr.ddr_mod_attrs & SPDMEM_DDR_MASK_REG)?
627 " (registered)":"",
628 (s->sm_config < __arraycount(spdmem_parity_types))?
629 spdmem_parity_types[s->sm_config]:"invalid parity");
630
631 dimm_size = 1 << (s->sm_ddr.ddr_rows + s->sm_ddr.ddr_cols - 17);
632 dimm_size *= s->sm_ddr.ddr_ranks * s->sm_ddr.ddr_banks_per_chip;
633
634 cycle_time = s->sm_ddr.ddr_cycle_whole * 1000 +
635 spdmem_cycle_frac[s->sm_ddr.ddr_cycle_tenths];
636 bits = le16toh(s->sm_ddr.ddr_datawidth);
637 if (s->sm_config == 1 || s->sm_config == 2)
638 bits -= 8;
639 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
640 "PC", 0);
641
642 aprint_verbose_dev(self,
643 "%d rows, %d cols, %d ranks, %d banks/chip, %d.%dns cycle time\n",
644 s->sm_ddr.ddr_rows, s->sm_ddr.ddr_cols, s->sm_ddr.ddr_ranks,
645 s->sm_ddr.ddr_banks_per_chip, cycle_time/1000,
646 (cycle_time % 1000 + 50) / 100);
647
648 tAA = 0;
649 for (i = 2; i < 8; i++)
650 if (s->sm_ddr.ddr_tCAS & (1 << i))
651 tAA = i;
652 tAA /= 2;
653
654 #define __DDR_ROUND(scale, field) \
655 ((scale * s->sm_ddr.field + cycle_time - 1) / cycle_time)
656
657 aprint_verbose_dev(self, LATENCY, tAA, __DDR_ROUND(250, ddr_tRCD),
658 __DDR_ROUND(250, ddr_tRP), __DDR_ROUND(1000, ddr_tRAS));
659
660 #undef __DDR_ROUND
661
662 decode_voltage_refresh(self, s);
663 }
664
665 static void
666 decode_ddr2(const struct sysctlnode *node, device_t self, struct spdmem *s) {
667 int dimm_size, cycle_time, bits, tAA, i;
668
669 aprint_naive("\n");
670 aprint_normal("\n");
671 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
672
673 aprint_normal("%s, %s, ",
674 (s->sm_ddr2.ddr2_mod_attrs & SPDMEM_DDR2_MASK_REG)?
675 " (registered)":"",
676 (s->sm_config < __arraycount(spdmem_parity_types))?
677 spdmem_parity_types[s->sm_config]:"invalid parity");
678
679 dimm_size = 1 << (s->sm_ddr2.ddr2_rows + s->sm_ddr2.ddr2_cols - 17);
680 dimm_size *= (s->sm_ddr2.ddr2_ranks + 1) *
681 s->sm_ddr2.ddr2_banks_per_chip;
682
683 cycle_time = s->sm_ddr2.ddr2_cycle_whole * 1000 +
684 spdmem_cycle_frac[s->sm_ddr2.ddr2_cycle_frac];
685 bits = s->sm_ddr2.ddr2_datawidth;
686 if ((s->sm_config & 0x03) != 0)
687 bits -= 8;
688 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
689 "PC2", 0);
690
691 aprint_verbose_dev(self,
692 "%d rows, %d cols, %d ranks, %d banks/chip, %d.%02dns cycle time\n",
693 s->sm_ddr2.ddr2_rows, s->sm_ddr2.ddr2_cols,
694 s->sm_ddr2.ddr2_ranks + 1, s->sm_ddr2.ddr2_banks_per_chip,
695 cycle_time / 1000, (cycle_time % 1000 + 5) /10 );
696
697 tAA = 0;
698 for (i = 2; i < 8; i++)
699 if (s->sm_ddr2.ddr2_tCAS & (1 << i))
700 tAA = i;
701
702 #define __DDR2_ROUND(scale, field) \
703 ((scale * s->sm_ddr2.field + cycle_time - 1) / cycle_time)
704
705 aprint_verbose_dev(self, LATENCY, tAA, __DDR2_ROUND(250, ddr2_tRCD),
706 __DDR2_ROUND(250, ddr2_tRP), __DDR2_ROUND(1000, ddr2_tRAS));
707
708 #undef __DDR_ROUND
709
710 decode_voltage_refresh(self, s);
711 }
712
713 static void
714 decode_ddr3(const struct sysctlnode *node, device_t self, struct spdmem *s) {
715 int dimm_size, cycle_time, bits;
716
717 aprint_naive("\n");
718 aprint_normal(": %18s\n", s->sm_ddr3.ddr3_part);
719 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
720
721 if (s->sm_ddr3.ddr3_mod_type ==
722 SPDMEM_DDR3_TYPE_MINI_RDIMM ||
723 s->sm_ddr3.ddr3_mod_type == SPDMEM_DDR3_TYPE_RDIMM)
724 aprint_normal(" (registered)");
725 aprint_normal(", %sECC, %stemp-sensor, ",
726 (s->sm_ddr3.ddr3_hasECC)?"":"no ",
727 (s->sm_ddr3.ddr3_has_therm_sensor)?"":"no ");
728
729 /*
730 * DDR3 size specification is quite different from others
731 *
732 * Module capacity is defined as
733 * Chip_Capacity_in_bits / 8bits-per-byte *
734 * external_bus_width / internal_bus_width
735 * We further divide by 2**20 to get our answer in MB
736 */
737 dimm_size = (s->sm_ddr3.ddr3_chipsize + 28 - 20) - 3 +
738 (s->sm_ddr3.ddr3_datawidth + 3) -
739 (s->sm_ddr3.ddr3_chipwidth + 2);
740 dimm_size = (1 << dimm_size) * (s->sm_ddr3.ddr3_physbanks + 1);
741
742 cycle_time = (1000 * s->sm_ddr3.ddr3_mtb_dividend +
743 (s->sm_ddr3.ddr3_mtb_divisor / 2)) /
744 s->sm_ddr3.ddr3_mtb_divisor;
745 cycle_time *= s->sm_ddr3.ddr3_tCKmin;
746 bits = 1 << (s->sm_ddr3.ddr3_datawidth + 3);
747 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, FALSE,
748 "PC3", 0);
749
750 aprint_verbose_dev(self,
751 "%d rows, %d cols, %d log. banks, %d phys. banks, "
752 "%d.%03dns cycle time\n",
753 s->sm_ddr3.ddr3_rows + 9, s->sm_ddr3.ddr3_cols + 12,
754 1 << (s->sm_ddr3.ddr3_logbanks + 3),
755 s->sm_ddr3.ddr3_physbanks + 1,
756 cycle_time/1000, cycle_time % 1000);
757
758 #define __DDR3_CYCLES(field) (s->sm_ddr3.field / s->sm_ddr3.ddr3_tCKmin)
759
760 aprint_verbose_dev(self, LATENCY, __DDR3_CYCLES(ddr3_tAAmin),
761 __DDR3_CYCLES(ddr3_tRCDmin), __DDR3_CYCLES(ddr3_tRPmin),
762 (s->sm_ddr3.ddr3_tRAS_msb * 256 + s->sm_ddr3.ddr3_tRAS_lsb) /
763 s->sm_ddr3.ddr3_tCKmin);
764
765 #undef __DDR3_CYCLES
766
767 /* For DDR3, Voltage is written in another area */
768 if (!s->sm_ddr3.ddr3_NOT15V || s->sm_ddr3.ddr3_135V
769 || s->sm_ddr3.ddr3_125V) {
770 aprint_verbose("%s:", device_xname(self));
771 if (!s->sm_ddr3.ddr3_NOT15V)
772 aprint_verbose(" 1.5V");
773 if (s->sm_ddr3.ddr3_135V)
774 aprint_verbose(" 1.35V");
775 if (s->sm_ddr3.ddr3_125V)
776 aprint_verbose(" 1.25V");
777 aprint_verbose(" operable\n");
778 }
779 }
780
781 static void
782 decode_fbdimm(const struct sysctlnode *node, device_t self, struct spdmem *s) {
783 int dimm_size, cycle_time, bits;
784
785 aprint_naive("\n");
786 aprint_normal("\n");
787 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
788
789 /*
790 * FB-DIMM module size calculation is very much like DDR3
791 */
792 dimm_size = s->sm_fbd.fbdimm_rows + 12 +
793 s->sm_fbd.fbdimm_cols + 9 - 20 - 3;
794 dimm_size = (1 << dimm_size) * (1 << (s->sm_fbd.fbdimm_banks + 2));
795
796 cycle_time = (1000 * s->sm_fbd.fbdimm_mtb_dividend +
797 (s->sm_fbd.fbdimm_mtb_divisor / 2)) /
798 s->sm_fbd.fbdimm_mtb_divisor;
799 bits = 1 << (s->sm_fbd.fbdimm_dev_width + 2);
800 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
801 "PC2", 0);
802
803 aprint_verbose_dev(self,
804 "%d rows, %d cols, %d banks, %d.%02dns cycle time\n",
805 s->sm_fbd.fbdimm_rows, s->sm_fbd.fbdimm_cols,
806 1 << (s->sm_fbd.fbdimm_banks + 2),
807 cycle_time / 1000, (cycle_time % 1000 + 5) /10 );
808
809 #define __FBDIMM_CYCLES(field) (s->sm_fbd.field / s->sm_fbd.fbdimm_tCKmin)
810
811 aprint_verbose_dev(self, LATENCY, __FBDIMM_CYCLES(fbdimm_tAAmin),
812 __FBDIMM_CYCLES(fbdimm_tRCDmin), __FBDIMM_CYCLES(fbdimm_tRPmin),
813 (s->sm_fbd.fbdimm_tRAS_msb * 256 +
814 s->sm_fbd.fbdimm_tRAS_lsb) /
815 s->sm_fbd.fbdimm_tCKmin);
816
817 #undef __FBDIMM_CYCLES
818
819 decode_voltage_refresh(self, s);
820 }
821
822 static void
823 decode_ddr4(const struct sysctlnode *node, device_t self, struct spdmem *s) {
824 int dimm_size, cycle_time;
825 int tAA_clocks, tRCD_clocks,tRP_clocks, tRAS_clocks;
826
827 aprint_naive("\n");
828 aprint_normal(": %20s\n", s->sm_ddr4.ddr4_part_number);
829 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
830 if (s->sm_ddr4.ddr4_mod_type < __arraycount(spdmem_ddr4_module_types))
831 aprint_normal(" (%s)",
832 spdmem_ddr4_module_types[s->sm_ddr4.ddr4_mod_type]);
833 aprint_normal(", %stemp-sensor, ",
834 (s->sm_ddr4.ddr4_has_therm_sensor)?"":"no ");
835
836 /*
837 * DDR4 size calculation from JEDEC spec
838 *
839 * Module capacity in bytes is defined as
840 * Chip_Capacity_in_bits / 8bits-per-byte *
841 * primary_bus_width / DRAM_width *
842 * logical_ranks_per_DIMM
843 *
844 * logical_ranks_per DIMM equals package_ranks, but multiply
845 * by diecount for 3DS packages
846 *
847 * We further divide by 2**20 to get our answer in MB
848 */
849 dimm_size = (s->sm_ddr4.ddr4_capacity + 28) /* chip_capacity */
850 - 20 /* convert to MB */
851 - 3 /* bits --> bytes */
852 + (s->sm_ddr4.ddr4_primary_bus_width + 3); /* bus width */
853 switch (s->sm_ddr4.ddr4_device_width) { /* DRAM width */
854 case 0: dimm_size -= 2;
855 break;
856 case 1: dimm_size -= 3;
857 break;
858 case 2: dimm_size -= 4;
859 break;
860 case 4: dimm_size -= 5;
861 break;
862 default:
863 dimm_size = -1; /* flag invalid value */
864 }
865 if (dimm_size >=0) {
866 dimm_size = (1 << dimm_size) *
867 (s->sm_ddr4.ddr4_package_ranks + 1); /* log.ranks/DIMM */
868 if (s->sm_ddr4.ddr4_signal_loading == 2) {
869 dimm_size *= s->sm_ddr4.ddr4_diecount;
870 }
871 }
872
873 /*
874 * For now, the only value for mtb is 1 = 125ps, and ftp = 1ps
875 * so we don't need to figure out the time-base units - just
876 * hard-code them for now.
877 */
878 cycle_time = 125 * s->sm_ddr4.ddr4_tCKAVGmin_mtb +
879 s->sm_ddr4.ddr4_tCKAVGmin_ftb;
880 aprint_normal("%d MB, %d.%03dns cycle time (%dMHz)\n", dimm_size,
881 cycle_time/1000, cycle_time % 1000, 1000000 / cycle_time);
882
883 decode_size_speed(self, node, dimm_size, cycle_time, 2,
884 1 << (s->sm_ddr4.ddr4_device_width + 3),
885 TRUE, "PC4", 0);
886
887 aprint_verbose_dev(self,
888 "%d rows, %d cols, %d banks, %d bank groups\n",
889 s->sm_ddr4.ddr4_rows + 9, s->sm_ddr4.ddr4_cols + 12,
890 1 << (2 + s->sm_ddr4.ddr4_logbanks),
891 1 << s->sm_ddr4.ddr4_bankgroups);
892
893 /*
894 * Note that the ddr4_xxx_ftb fields are actually signed offsets from
895 * the corresponding mtb value, so we might have to subtract 256!
896 */
897 #define __DDR4_VALUE(field) (s->sm_ddr4.ddr4_##field##_mtb * 256 + \
898 s->sm_ddr4.ddr4_##field##_ftb) - \
899 ((s->sm_ddr4.ddr4_##field##_ftb > 127)?256:0)
900
901 tAA_clocks = (__DDR4_VALUE(tAAmin) * 1000 ) / cycle_time;
902 tRP_clocks = (__DDR4_VALUE(tRPmin) * 1000 ) / cycle_time;
903 tRCD_clocks = (__DDR4_VALUE(tRCDmin) * 1000 ) / cycle_time;
904 tRAS_clocks = (s->sm_ddr4.ddr4_tRASmin_msb * 256 +
905 s->sm_ddr4.ddr4_tRASmin_lsb) * 125 * 1000 / cycle_time;
906
907 /*
908 * Per JEDEC spec, rounding is done by taking the time value, dividing
909 * by the cycle time, subtracting .010 from the result, and then
910 * rounded up to the nearest integer. Unfortunately, none of their
911 * examples say what to do when the result of the subtraction is already
912 * an integer. For now, assume that we still round up (so an interval
913 * of exactly 12.010 clock cycles will be printed as 13).
914 */
915 #define __DDR4_ROUND(value) ((value - 10) / 1000 + 1)
916
917 aprint_verbose_dev(self, LATENCY, __DDR4_ROUND(tAA_clocks),
918 __DDR4_ROUND(tRP_clocks),
919 __DDR4_ROUND(tRCD_clocks),
920 __DDR4_ROUND(tRAS_clocks));
921
922 #undef __DDR4_VALUE
923 #undef __DDR4_ROUND
924 }
925