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