spdmem.c revision 1.12 1 /* $NetBSD: spdmem.c,v 1.12 2015/04/01 06:08:39 matt 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.12 2015/04/01 06:08:39 matt 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_fbdimm(const struct sysctlnode *, device_t, struct spdmem *);
59
60 static void decode_size_speed(device_t, const struct sysctlnode *,
61 int, int, int, int, bool, const char *, int);
62 static void decode_voltage_refresh(device_t, struct spdmem *);
63
64 #define IS_RAMBUS_TYPE (s->sm_len < 4)
65
66 static const char* const spdmem_basic_types[] = {
67 "unknown",
68 "FPM",
69 "EDO",
70 "Pipelined Nibble",
71 "SDRAM",
72 "ROM",
73 "DDR SGRAM",
74 "DDR SDRAM",
75 "DDR2 SDRAM",
76 "DDR2 SDRAM FB",
77 "DDR2 SDRAM FB Probe",
78 "DDR3 SDRAM",
79 "DDR4 SDRAM"
80 };
81
82 static const char* const spdmem_superset_types[] = {
83 "unknown",
84 "ESDRAM",
85 "DDR ESDRAM",
86 "PEM EDO",
87 "PEM SDRAM"
88 };
89
90 static const char* const spdmem_voltage_types[] = {
91 "TTL (5V tolerant)",
92 "LvTTL (not 5V tolerant)",
93 "HSTL 1.5V",
94 "SSTL 3.3V",
95 "SSTL 2.5V",
96 "SSTL 1.8V"
97 };
98
99 static const char* const spdmem_refresh_types[] = {
100 "15.625us",
101 "3.9us",
102 "7.8us",
103 "31.3us",
104 "62.5us",
105 "125us"
106 };
107
108 static const char* const spdmem_parity_types[] = {
109 "no parity or ECC",
110 "data parity",
111 "data ECC",
112 "data parity and ECC",
113 "cmd/addr parity",
114 "cmd/addr/data parity",
115 "cmd/addr parity, data ECC",
116 "cmd/addr/data parity, data ECC"
117 };
118
119 /* Cycle time fractional values (units of .001 ns) for DDR2 SDRAM */
120 static const uint16_t spdmem_cycle_frac[] = {
121 0, 100, 200, 300, 400, 500, 600, 700, 800, 900,
122 250, 333, 667, 750, 999, 999
123 };
124
125 /* Format string for timing info */
126 #define LATENCY "tAA-tRCD-tRP-tRAS: %d-%d-%d-%d\n"
127
128 /* CRC functions used for certain memory types */
129
130 static uint16_t spdcrc16 (struct spdmem_softc *sc, int count)
131 {
132 uint16_t crc;
133 int i, j;
134 uint8_t val;
135 crc = 0;
136 for (j = 0; j <= count; j++) {
137 val = (sc->sc_read)(sc, j);
138 crc = crc ^ val << 8;
139 for (i = 0; i < 8; ++i)
140 if (crc & 0x8000)
141 crc = crc << 1 ^ 0x1021;
142 else
143 crc = crc << 1;
144 }
145 return (crc & 0xFFFF);
146 }
147
148 int
149 spdmem_common_probe(struct spdmem_softc *sc)
150 {
151 int cksum = 0;
152 uint8_t i, val, spd_type;
153 int spd_len, spd_crc_cover;
154 uint16_t crc_calc, crc_spd;
155
156 spd_type = (sc->sc_read)(sc, 2);
157
158 /* For older memory types, validate the checksum over 1st 63 bytes */
159 if (spd_type <= SPDMEM_MEMTYPE_DDR2SDRAM) {
160 for (i = 0; i < 63; i++)
161 cksum += (sc->sc_read)(sc, i);
162
163 val = (sc->sc_read)(sc, 63);
164
165 if (cksum == 0 || (cksum & 0xff) != val) {
166 aprint_debug("spd checksum failed, calc = 0x%02x, "
167 "spd = 0x%02x\n", cksum, val);
168 return 0;
169 } else
170 return 1;
171 }
172
173 /* For DDR3 and FBDIMM, verify the CRC */
174 else if (spd_type <= SPDMEM_MEMTYPE_DDR3SDRAM) {
175 spd_len = (sc->sc_read)(sc, 0);
176 if (spd_len & SPDMEM_SPDCRC_116)
177 spd_crc_cover = 116;
178 else
179 spd_crc_cover = 125;
180 switch (spd_len & SPDMEM_SPDLEN_MASK) {
181 case SPDMEM_SPDLEN_128:
182 spd_len = 128;
183 break;
184 case SPDMEM_SPDLEN_176:
185 spd_len = 176;
186 break;
187 case SPDMEM_SPDLEN_256:
188 spd_len = 256;
189 break;
190 default:
191 return 0;
192 }
193 if (spd_crc_cover > spd_len)
194 return 0;
195 crc_calc = spdcrc16(sc, spd_crc_cover);
196 crc_spd = (sc->sc_read)(sc, 127) << 8;
197 crc_spd |= (sc->sc_read)(sc, 126);
198 if (crc_calc != crc_spd) {
199 aprint_debug("crc16 failed, covers %d bytes, "
200 "calc = 0x%04x, spd = 0x%04x\n",
201 spd_crc_cover, crc_calc, crc_spd);
202 return 0;
203 }
204 return 1;
205 }
206
207 /* For unrecognized memory types, don't match at all */
208 return 0;
209 }
210
211 void
212 spdmem_common_attach(struct spdmem_softc *sc, device_t self)
213 {
214 struct spdmem *s = &(sc->sc_spd_data);
215 const char *type;
216 const char *rambus_rev = "Reserved";
217 int dimm_size;
218 unsigned int i, spd_len, spd_size;
219 const struct sysctlnode *node = NULL;
220
221 /*
222 * FBDIMM and DDR3 (and probably all newer) have a different
223 * encoding of the SPD EEPROM used/total sizes
224 */
225 s->sm_len = (sc->sc_read)(sc, 0);
226 s->sm_size = (sc->sc_read)(sc, 1);
227 s->sm_type = (sc->sc_read)(sc, 2);
228
229 if (s->sm_type >= SPDMEM_MEMTYPE_FBDIMM) {
230 spd_size = 64 << (s->sm_len & SPDMEM_SPDSIZE_MASK);
231 switch (s->sm_len & SPDMEM_SPDLEN_MASK) {
232 case SPDMEM_SPDLEN_128:
233 spd_len = 128;
234 break;
235 case SPDMEM_SPDLEN_176:
236 spd_len = 176;
237 break;
238 case SPDMEM_SPDLEN_256:
239 spd_len = 256;
240 break;
241 default:
242 spd_len = 64;
243 break;
244 }
245 } else {
246 spd_size = 1 << s->sm_size;
247 spd_len = s->sm_len;
248 if (spd_len < 64)
249 spd_len = 64;
250 }
251 if (spd_len > spd_size)
252 spd_len = spd_size;
253 if (spd_len > sizeof(struct spdmem))
254 spd_len = sizeof(struct spdmem);
255 for (i = 3; i < spd_len; i++)
256 ((uint8_t *)s)[i] = (sc->sc_read)(sc, i);
257
258 /*
259 * Setup our sysctl subtree, hw.spdmemN
260 */
261 sc->sc_sysctl_log = NULL;
262 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, &node,
263 0, CTLTYPE_NODE,
264 device_xname(self), NULL, NULL, 0, NULL, 0,
265 CTL_HW, CTL_CREATE, CTL_EOL);
266 if (node != NULL && spd_len != 0)
267 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
268 0,
269 CTLTYPE_STRUCT, "spd_data",
270 SYSCTL_DESCR("raw spd data"), NULL,
271 0, s, spd_len,
272 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
273
274 /*
275 * Decode and print key SPD contents
276 */
277 if (IS_RAMBUS_TYPE) {
278 if (s->sm_type == SPDMEM_MEMTYPE_RAMBUS)
279 type = "Rambus";
280 else if (s->sm_type == SPDMEM_MEMTYPE_DIRECTRAMBUS)
281 type = "Direct Rambus";
282 else
283 type = "Rambus (unknown)";
284
285 switch (s->sm_len) {
286 case 0:
287 rambus_rev = "Invalid";
288 break;
289 case 1:
290 rambus_rev = "0.7";
291 break;
292 case 2:
293 rambus_rev = "1.0";
294 break;
295 default:
296 rambus_rev = "Reserved";
297 break;
298 }
299 } else {
300 if (s->sm_type < __arraycount(spdmem_basic_types))
301 type = spdmem_basic_types[s->sm_type];
302 else
303 type = "unknown memory type";
304
305 if (s->sm_type == SPDMEM_MEMTYPE_EDO &&
306 s->sm_fpm.fpm_superset == SPDMEM_SUPERSET_EDO_PEM)
307 type = spdmem_superset_types[SPDMEM_SUPERSET_EDO_PEM];
308 if (s->sm_type == SPDMEM_MEMTYPE_SDRAM &&
309 s->sm_sdr.sdr_superset == SPDMEM_SUPERSET_SDRAM_PEM)
310 type = spdmem_superset_types[SPDMEM_SUPERSET_SDRAM_PEM];
311 if (s->sm_type == SPDMEM_MEMTYPE_DDRSDRAM &&
312 s->sm_ddr.ddr_superset == SPDMEM_SUPERSET_DDR_ESDRAM)
313 type =
314 spdmem_superset_types[SPDMEM_SUPERSET_DDR_ESDRAM];
315 if (s->sm_type == SPDMEM_MEMTYPE_SDRAM &&
316 s->sm_sdr.sdr_superset == SPDMEM_SUPERSET_ESDRAM) {
317 type = spdmem_superset_types[SPDMEM_SUPERSET_ESDRAM];
318 }
319 }
320
321 strlcpy(sc->sc_type, type, SPDMEM_TYPE_MAXLEN);
322 if (node != NULL)
323 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
324 0,
325 CTLTYPE_STRING, "mem_type",
326 SYSCTL_DESCR("memory module type"), NULL,
327 0, sc->sc_type, 0,
328 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
329
330 if (IS_RAMBUS_TYPE) {
331 aprint_naive("\n");
332 aprint_normal("\n");
333 aprint_normal_dev(self, "%s, SPD Revision %s", type, rambus_rev);
334 dimm_size = 1 << (s->sm_rdr.rdr_rows + s->sm_rdr.rdr_cols - 13);
335 if (dimm_size >= 1024)
336 aprint_normal(", %dGB\n", dimm_size / 1024);
337 else
338 aprint_normal(", %dMB\n", dimm_size);
339
340 /* No further decode for RAMBUS memory */
341 return;
342 }
343 switch (s->sm_type) {
344 case SPDMEM_MEMTYPE_EDO:
345 case SPDMEM_MEMTYPE_FPM:
346 decode_edofpm(node, self, s);
347 break;
348 case SPDMEM_MEMTYPE_ROM:
349 decode_rom(node, self, s);
350 break;
351 case SPDMEM_MEMTYPE_SDRAM:
352 decode_sdram(node, self, s, spd_len);
353 break;
354 case SPDMEM_MEMTYPE_DDRSDRAM:
355 decode_ddr(node, self, s);
356 break;
357 case SPDMEM_MEMTYPE_DDR2SDRAM:
358 decode_ddr2(node, self, s);
359 break;
360 case SPDMEM_MEMTYPE_DDR3SDRAM:
361 decode_ddr3(node, self, s);
362 break;
363 case SPDMEM_MEMTYPE_FBDIMM:
364 case SPDMEM_MEMTYPE_FBDIMM_PROBE:
365 decode_fbdimm(node, self, s);
366 break;
367 }
368
369 /* Dump SPD */
370 for (i = 0; i < spd_len; i += 16) {
371 unsigned int j, k;
372 aprint_debug_dev(self, "0x%02x:", i);
373 k = (spd_len > (i + 16)) ? i + 16 : spd_len;
374 for (j = i; j < k; j++)
375 aprint_debug(" %02x", ((uint8_t *)s)[j]);
376 aprint_debug("\n");
377 }
378 }
379
380 int
381 spdmem_common_detach(struct spdmem_softc *sc, device_t self)
382 {
383 sysctl_teardown(&sc->sc_sysctl_log);
384
385 return 0;
386 }
387
388 static void
389 decode_size_speed(device_t self, const struct sysctlnode *node,
390 int dimm_size, int cycle_time, int d_clk, int bits,
391 bool round, const char *ddr_type_string, int speed)
392 {
393 int p_clk;
394 struct spdmem_softc *sc = device_private(self);
395
396 if (dimm_size < 1024)
397 aprint_normal("%dMB", dimm_size);
398 else
399 aprint_normal("%dGB", dimm_size / 1024);
400 if (node != NULL)
401 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
402 CTLFLAG_IMMEDIATE,
403 CTLTYPE_INT, "size",
404 SYSCTL_DESCR("module size in MB"), NULL,
405 dimm_size, NULL, 0,
406 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
407
408 if (cycle_time == 0) {
409 aprint_normal("\n");
410 return;
411 }
412
413 /*
414 * Calculate p_clk first, since for DDR3 we need maximum significance.
415 * DDR3 rating is not rounded to a multiple of 100. This results in
416 * cycle_time of 1.5ns displayed as PC3-10666.
417 *
418 * For SDRAM, the speed is provided by the caller so we use it.
419 */
420 d_clk *= 1000 * 1000;
421 if (speed)
422 p_clk = speed;
423 else
424 p_clk = (d_clk * bits) / 8 / cycle_time;
425 d_clk = ((d_clk + cycle_time / 2) ) / cycle_time;
426 if (round) {
427 if ((p_clk % 100) >= 50)
428 p_clk += 50;
429 p_clk -= p_clk % 100;
430 }
431 aprint_normal(", %dMHz (%s-%d)\n",
432 d_clk, ddr_type_string, p_clk);
433 if (node != NULL)
434 sysctl_createv(&sc->sc_sysctl_log, 0, NULL, NULL,
435 CTLFLAG_IMMEDIATE,
436 CTLTYPE_INT, "speed",
437 SYSCTL_DESCR("memory speed in MHz"),
438 NULL, d_clk, NULL, 0,
439 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
440 }
441
442 static void
443 decode_voltage_refresh(device_t self, struct spdmem *s)
444 {
445 const char *voltage, *refresh;
446
447 if (s->sm_voltage < __arraycount(spdmem_voltage_types))
448 voltage = spdmem_voltage_types[s->sm_voltage];
449 else
450 voltage = "unknown";
451
452 if (s->sm_refresh < __arraycount(spdmem_refresh_types))
453 refresh = spdmem_refresh_types[s->sm_refresh];
454 else
455 refresh = "unknown";
456
457 aprint_verbose_dev(self, "voltage %s, refresh time %s%s\n",
458 voltage, refresh,
459 s->sm_selfrefresh?" (self-refreshing)":"");
460 }
461
462 static void
463 decode_edofpm(const struct sysctlnode *node, device_t self, struct spdmem *s) {
464 aprint_naive("\n");
465 aprint_normal("\n");
466 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
467
468 aprint_normal("\n");
469 aprint_verbose_dev(self,
470 "%d rows, %d cols, %d banks, %dns tRAC, %dns tCAC\n",
471 s->sm_fpm.fpm_rows, s->sm_fpm.fpm_cols, s->sm_fpm.fpm_banks,
472 s->sm_fpm.fpm_tRAC, s->sm_fpm.fpm_tCAC);
473 }
474
475 static void
476 decode_rom(const struct sysctlnode *node, device_t self, struct spdmem *s) {
477 aprint_naive("\n");
478 aprint_normal("\n");
479 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
480
481 aprint_normal("\n");
482 aprint_verbose_dev(self, "%d rows, %d cols, %d banks\n",
483 s->sm_rom.rom_rows, s->sm_rom.rom_cols, s->sm_rom.rom_banks);
484 }
485
486 static void
487 decode_sdram(const struct sysctlnode *node, device_t self, struct spdmem *s,
488 int spd_len) {
489 int dimm_size, cycle_time, bits, tAA, i, speed, freq;
490
491 aprint_naive("\n");
492 aprint_normal("\n");
493 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
494
495 aprint_normal("%s, %s, ",
496 (s->sm_sdr.sdr_mod_attrs & SPDMEM_SDR_MASK_REG)?
497 " (registered)":"",
498 (s->sm_config < __arraycount(spdmem_parity_types))?
499 spdmem_parity_types[s->sm_config]:"invalid parity");
500
501 dimm_size = 1 << (s->sm_sdr.sdr_rows + s->sm_sdr.sdr_cols - 17);
502 dimm_size *= s->sm_sdr.sdr_banks * s->sm_sdr.sdr_banks_per_chip;
503
504 cycle_time = s->sm_sdr.sdr_cycle_whole * 1000 +
505 s->sm_sdr.sdr_cycle_tenths * 100;
506 bits = le16toh(s->sm_sdr.sdr_datawidth);
507 if (s->sm_config == 1 || s->sm_config == 2)
508 bits -= 8;
509
510 /* Calculate speed here - from OpenBSD */
511 if (spd_len >= 128)
512 freq = ((uint8_t *)s)[126];
513 else
514 freq = 0;
515 switch (freq) {
516 /*
517 * Must check cycle time since some PC-133 DIMMs
518 * actually report PC-100
519 */
520 case 100:
521 case 133:
522 if (cycle_time < 8000)
523 speed = 133;
524 else
525 speed = 100;
526 break;
527 case 0x66: /* Legacy DIMMs use _hex_ 66! */
528 default:
529 speed = 66;
530 }
531 decode_size_speed(self, node, dimm_size, cycle_time, 1, bits, FALSE,
532 "PC", speed);
533
534 aprint_verbose_dev(self,
535 "%d rows, %d cols, %d banks, %d banks/chip, %d.%dns cycle time\n",
536 s->sm_sdr.sdr_rows, s->sm_sdr.sdr_cols, s->sm_sdr.sdr_banks,
537 s->sm_sdr.sdr_banks_per_chip, cycle_time/1000,
538 (cycle_time % 1000) / 100);
539
540 tAA = 0;
541 for (i = 0; i < 8; i++)
542 if (s->sm_sdr.sdr_tCAS & (1 << i))
543 tAA = i;
544 tAA++;
545 aprint_verbose_dev(self, LATENCY, tAA, s->sm_sdr.sdr_tRCD,
546 s->sm_sdr.sdr_tRP, s->sm_sdr.sdr_tRAS);
547
548 decode_voltage_refresh(self, s);
549 }
550
551 static void
552 decode_ddr(const struct sysctlnode *node, device_t self, struct spdmem *s) {
553 int dimm_size, cycle_time, bits, tAA, i;
554
555 aprint_naive("\n");
556 aprint_normal("\n");
557 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
558
559 aprint_normal("%s, %s, ",
560 (s->sm_ddr.ddr_mod_attrs & SPDMEM_DDR_MASK_REG)?
561 " (registered)":"",
562 (s->sm_config < __arraycount(spdmem_parity_types))?
563 spdmem_parity_types[s->sm_config]:"invalid parity");
564
565 dimm_size = 1 << (s->sm_ddr.ddr_rows + s->sm_ddr.ddr_cols - 17);
566 dimm_size *= s->sm_ddr.ddr_ranks * s->sm_ddr.ddr_banks_per_chip;
567
568 cycle_time = s->sm_ddr.ddr_cycle_whole * 1000 +
569 spdmem_cycle_frac[s->sm_ddr.ddr_cycle_tenths];
570 bits = le16toh(s->sm_ddr.ddr_datawidth);
571 if (s->sm_config == 1 || s->sm_config == 2)
572 bits -= 8;
573 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
574 "PC", 0);
575
576 aprint_verbose_dev(self,
577 "%d rows, %d cols, %d ranks, %d banks/chip, %d.%dns cycle time\n",
578 s->sm_ddr.ddr_rows, s->sm_ddr.ddr_cols, s->sm_ddr.ddr_ranks,
579 s->sm_ddr.ddr_banks_per_chip, cycle_time/1000,
580 (cycle_time % 1000 + 50) / 100);
581
582 tAA = 0;
583 for (i = 2; i < 8; i++)
584 if (s->sm_ddr.ddr_tCAS & (1 << i))
585 tAA = i;
586 tAA /= 2;
587
588 #define __DDR_ROUND(scale, field) \
589 ((scale * s->sm_ddr.field + cycle_time - 1) / cycle_time)
590
591 aprint_verbose_dev(self, LATENCY, tAA, __DDR_ROUND(250, ddr_tRCD),
592 __DDR_ROUND(250, ddr_tRP), __DDR_ROUND(1000, ddr_tRAS));
593
594 #undef __DDR_ROUND
595
596 decode_voltage_refresh(self, s);
597 }
598
599 static void
600 decode_ddr2(const struct sysctlnode *node, device_t self, struct spdmem *s) {
601 int dimm_size, cycle_time, bits, tAA, i;
602
603 aprint_naive("\n");
604 aprint_normal("\n");
605 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
606
607 aprint_normal("%s, %s, ",
608 (s->sm_ddr2.ddr2_mod_attrs & SPDMEM_DDR2_MASK_REG)?
609 " (registered)":"",
610 (s->sm_config < __arraycount(spdmem_parity_types))?
611 spdmem_parity_types[s->sm_config]:"invalid parity");
612
613 dimm_size = 1 << (s->sm_ddr2.ddr2_rows + s->sm_ddr2.ddr2_cols - 17);
614 dimm_size *= (s->sm_ddr2.ddr2_ranks + 1) *
615 s->sm_ddr2.ddr2_banks_per_chip;
616
617 cycle_time = s->sm_ddr2.ddr2_cycle_whole * 1000 +
618 spdmem_cycle_frac[s->sm_ddr2.ddr2_cycle_frac];
619 bits = s->sm_ddr2.ddr2_datawidth;
620 if ((s->sm_config & 0x03) != 0)
621 bits -= 8;
622 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
623 "PC2", 0);
624
625 aprint_verbose_dev(self,
626 "%d rows, %d cols, %d ranks, %d banks/chip, %d.%02dns cycle time\n",
627 s->sm_ddr2.ddr2_rows, s->sm_ddr2.ddr2_cols,
628 s->sm_ddr2.ddr2_ranks + 1, s->sm_ddr2.ddr2_banks_per_chip,
629 cycle_time / 1000, (cycle_time % 1000 + 5) /10 );
630
631 tAA = 0;
632 for (i = 2; i < 8; i++)
633 if (s->sm_ddr2.ddr2_tCAS & (1 << i))
634 tAA = i;
635
636 #define __DDR2_ROUND(scale, field) \
637 ((scale * s->sm_ddr2.field + cycle_time - 1) / cycle_time)
638
639 aprint_verbose_dev(self, LATENCY, tAA, __DDR2_ROUND(250, ddr2_tRCD),
640 __DDR2_ROUND(250, ddr2_tRP), __DDR2_ROUND(1000, ddr2_tRAS));
641
642 #undef __DDR_ROUND
643
644 decode_voltage_refresh(self, s);
645 }
646
647 static void
648 decode_ddr3(const struct sysctlnode *node, device_t self, struct spdmem *s) {
649 int dimm_size, cycle_time, bits;
650
651 aprint_naive("\n");
652 aprint_normal(": %18s\n", s->sm_ddr3.ddr3_part);
653 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
654
655 if (s->sm_ddr3.ddr3_mod_type ==
656 SPDMEM_DDR3_TYPE_MINI_RDIMM ||
657 s->sm_ddr3.ddr3_mod_type == SPDMEM_DDR3_TYPE_RDIMM)
658 aprint_normal(" (registered)");
659 aprint_normal(", %sECC, %stemp-sensor, ",
660 (s->sm_ddr3.ddr3_hasECC)?"":"no ",
661 (s->sm_ddr3.ddr3_has_therm_sensor)?"":"no ");
662
663 /*
664 * DDR3 size specification is quite different from others
665 *
666 * Module capacity is defined as
667 * Chip_Capacity_in_bits / 8bits-per-byte *
668 * external_bus_width / internal_bus_width
669 * We further divide by 2**20 to get our answer in MB
670 */
671 dimm_size = (s->sm_ddr3.ddr3_chipsize + 28 - 20) - 3 +
672 (s->sm_ddr3.ddr3_datawidth + 3) -
673 (s->sm_ddr3.ddr3_chipwidth + 2);
674 dimm_size = (1 << dimm_size) * (s->sm_ddr3.ddr3_physbanks + 1);
675
676 cycle_time = (1000 * s->sm_ddr3.ddr3_mtb_dividend +
677 (s->sm_ddr3.ddr3_mtb_divisor / 2)) /
678 s->sm_ddr3.ddr3_mtb_divisor;
679 cycle_time *= s->sm_ddr3.ddr3_tCKmin;
680 bits = 1 << (s->sm_ddr3.ddr3_datawidth + 3);
681 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, FALSE,
682 "PC3", 0);
683
684 aprint_verbose_dev(self,
685 "%d rows, %d cols, %d log. banks, %d phys. banks, "
686 "%d.%03dns cycle time\n",
687 s->sm_ddr3.ddr3_rows + 9, s->sm_ddr3.ddr3_cols + 12,
688 1 << (s->sm_ddr3.ddr3_logbanks + 3),
689 s->sm_ddr3.ddr3_physbanks + 1,
690 cycle_time/1000, cycle_time % 1000);
691
692 #define __DDR3_CYCLES(field) (s->sm_ddr3.field / s->sm_ddr3.ddr3_tCKmin)
693
694 aprint_verbose_dev(self, LATENCY, __DDR3_CYCLES(ddr3_tAAmin),
695 __DDR3_CYCLES(ddr3_tRCDmin), __DDR3_CYCLES(ddr3_tRPmin),
696 (s->sm_ddr3.ddr3_tRAS_msb * 256 + s->sm_ddr3.ddr3_tRAS_lsb) /
697 s->sm_ddr3.ddr3_tCKmin);
698
699 #undef __DDR3_CYCLES
700 }
701
702 static void
703 decode_fbdimm(const struct sysctlnode *node, device_t self, struct spdmem *s) {
704 int dimm_size, cycle_time, bits;
705
706 aprint_naive("\n");
707 aprint_normal("\n");
708 aprint_normal_dev(self, "%s", spdmem_basic_types[s->sm_type]);
709
710 /*
711 * FB-DIMM module size calculation is very much like DDR3
712 */
713 dimm_size = s->sm_fbd.fbdimm_rows + 12 +
714 s->sm_fbd.fbdimm_cols + 9 - 20 - 3;
715 dimm_size = (1 << dimm_size) * (1 << (s->sm_fbd.fbdimm_banks + 2));
716
717 cycle_time = (1000 * s->sm_fbd.fbdimm_mtb_dividend +
718 (s->sm_fbd.fbdimm_mtb_divisor / 2)) /
719 s->sm_fbd.fbdimm_mtb_divisor;
720 bits = 1 << (s->sm_fbd.fbdimm_dev_width + 2);
721 decode_size_speed(self, node, dimm_size, cycle_time, 2, bits, TRUE,
722 "PC2", 0);
723
724 aprint_verbose_dev(self,
725 "%d rows, %d cols, %d banks, %d.%02dns cycle time\n",
726 s->sm_fbd.fbdimm_rows, s->sm_fbd.fbdimm_cols,
727 1 << (s->sm_fbd.fbdimm_banks + 2),
728 cycle_time / 1000, (cycle_time % 1000 + 5) /10 );
729
730 #define __FBDIMM_CYCLES(field) (s->sm_fbd.field / s->sm_fbd.fbdimm_tCKmin)
731
732 aprint_verbose_dev(self, LATENCY, __FBDIMM_CYCLES(fbdimm_tAAmin),
733 __FBDIMM_CYCLES(fbdimm_tRCDmin), __FBDIMM_CYCLES(fbdimm_tRPmin),
734 (s->sm_fbd.fbdimm_tRAS_msb * 256 +
735 s->sm_fbd.fbdimm_tRAS_lsb) /
736 s->sm_fbd.fbdimm_tCKmin);
737
738 #undef __FBDIMM_CYCLES
739
740 decode_voltage_refresh(self, s);
741 }
742