Tue Apr 14 17:39:28 2020 UTC ()
Pull up following revision(s) (requested by msaitoh in ticket #1528):

	sys/dev/ic/spdmemvar.h: revision 1.15
	sys/dev/ic/spdmemvar.h: revision 1.16
	sys/dev/ic/spdmem.c: revision 1.31
	sys/dev/ic/spdmem.c: revision 1.32
	sys/dev/ic/spdmem.c: revision 1.33
	sys/dev/ic/spdmem.c: revision 1.34
	sys/dev/ic/spdmem.c: revision 1.35

Fix spelling of symeti^Hric

  Print DDR3's row and column correctly.

KNF. No functional change.

- Define some new parameters of DDR3 SPD ROM.
- Use fine timebase parameters for time calculation on DDR3. This change
   makes PC3-XXXX value more correctly on newer DDR3.

Calculate DDR3's tRAS correctly.

  Fix unused area size found by pgoyette@.


(martin)
diff -r1.24.6.2 -r1.24.6.3 src/sys/dev/ic/spdmem.c
diff -r1.13.6.1 -r1.13.6.2 src/sys/dev/ic/spdmemvar.h

cvs diff -r1.24.6.2 -r1.24.6.3 src/sys/dev/ic/spdmem.c (switch to unified diff)

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

cvs diff -r1.13.6.1 -r1.13.6.2 src/sys/dev/ic/spdmemvar.h (switch to unified diff)

--- src/sys/dev/ic/spdmemvar.h 2019/01/03 11:23:54 1.13.6.1
+++ src/sys/dev/ic/spdmemvar.h 2020/04/14 17:39:28 1.13.6.2
@@ -1,907 +1,914 @@ @@ -1,907 +1,914 @@
1/* $NetBSD: spdmemvar.h,v 1.13.6.1 2019/01/03 11:23:54 martin Exp $ */ 1/* $NetBSD: spdmemvar.h,v 1.13.6.2 2020/04/14 17:39:28 martin Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2007 Paul Goyette 4 * Copyright (c) 2007 Paul Goyette
5 * Copyright (c) 2007 Tobias Nygren 5 * Copyright (c) 2007 Tobias Nygren
6 * All rights reserved. 6 * All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 9 * modification, are permitted provided that the following conditions
10 * are met: 10 * are met:
11 * 1. Redistributions of source code must retain the above copyright 11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer. 12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright 13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the 14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution. 15 * documentation and/or other materials provided with the distribution.
16 * 3. The name of the author may not be used to endorse or promote products 16 * 3. The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission. 17 * derived from this software without specific prior written permission.
18 * 18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE. 29 * POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 31
32/* 32/*
33 * This information is extracted from JEDEC standard SPD4_01 (www.jedec.org) 33 * This information is extracted from JEDEC standard SPD4_01 (www.jedec.org)
34 */ 34 */
35 35
36#if BYTE_ORDER == BIG_ENDIAN 36#if BYTE_ORDER == BIG_ENDIAN
37#define SPD_BITFIELD(a, b, c, d) d; c; b; a 37#define SPD_BITFIELD(a, b, c, d) d; c; b; a
38#else 38#else
39#define SPD_BITFIELD(a, b, c, d) a; b; c; d 39#define SPD_BITFIELD(a, b, c, d) a; b; c; d
40#endif 40#endif
41 41
42 /* 42 /*
43 * NOTE 43 * NOTE
44 * 44 *
45 * Fields with "offsets" are field widths, measured in bits, 45 * Fields with "offsets" are field widths, measured in bits,
46 * with "offset" additional bits. Thus, a field with value 46 * with "offset" additional bits. Thus, a field with value
47 * of 2 with an offset of 14 defines a field with total width 47 * of 2 with an offset of 14 defines a field with total width
48 * of 16 bits. 48 * of 16 bits.
49 */ 49 */
50 50
51struct spdmem_fpm { /* FPM and EDO DIMMS */ 51struct spdmem_fpm { /* FPM and EDO DIMMS */
52 uint8_t fpm_len; 52 uint8_t fpm_len;
53 uint8_t fpm_size; 53 uint8_t fpm_size;
54 uint8_t fpm_type; 54 uint8_t fpm_type;
55 uint8_t fpm_rows; 55 uint8_t fpm_rows;
56 uint8_t fpm_cols; 56 uint8_t fpm_cols;
57 uint8_t fpm_banks; 57 uint8_t fpm_banks;
58 uint16_t fpm_datawidth; /* endian-sensitive */ 58 uint16_t fpm_datawidth; /* endian-sensitive */
59 uint8_t fpm_voltage; 59 uint8_t fpm_voltage;
60 uint8_t fpm_tRAC; 60 uint8_t fpm_tRAC;
61 uint8_t fpm_tCAC; 61 uint8_t fpm_tCAC;
62 uint8_t fpm_config; 62 uint8_t fpm_config;
63 SPD_BITFIELD( \ 63 SPD_BITFIELD( \
64 uint8_t fpm_refresh:7, \ 64 uint8_t fpm_refresh:7, \
65 uint8_t fpm_selfrefresh:1, , \ 65 uint8_t fpm_selfrefresh:1, , \
66 ); 66 );
67 uint8_t fpm_dram_dramwidth; 67 uint8_t fpm_dram_dramwidth;
68 uint8_t fpm_dram_eccwidth; 68 uint8_t fpm_dram_eccwidth;
69 uint8_t fpm_unused2[17]; 69 uint8_t fpm_unused2[17];
70 uint8_t fpm_superset; 70 uint8_t fpm_superset;
71 uint8_t fpm_unused3[30]; 71 uint8_t fpm_unused3[30];
72 uint8_t fpm_cksum; 72 uint8_t fpm_cksum;
73} __packed; 73} __packed;
74 74
75struct spdmem_sdram { /* PC66/PC100/PC133 SDRAM */ 75struct spdmem_sdram { /* PC66/PC100/PC133 SDRAM */
76 uint8_t sdr_len; 76 uint8_t sdr_len;
77 uint8_t sdr_size; 77 uint8_t sdr_size;
78 uint8_t sdr_type; 78 uint8_t sdr_type;
79 SPD_BITFIELD( \ 79 SPD_BITFIELD( \
80 uint8_t sdr_rows:4, \ 80 uint8_t sdr_rows:4, \
81 uint8_t sdr_rows2:4, , \ 81 uint8_t sdr_rows2:4, , \
82 ); 82 );
83 SPD_BITFIELD( \ 83 SPD_BITFIELD( \
84 uint8_t sdr_cols:4, \ 84 uint8_t sdr_cols:4, \
85 uint8_t sdr_cols2:4, , \ 85 uint8_t sdr_cols2:4, , \
86 ); 86 );
87 uint8_t sdr_banks; 87 uint8_t sdr_banks;
88 uint16_t sdr_datawidth; /* endian-sensitive */ 88 uint16_t sdr_datawidth; /* endian-sensitive */
89 uint8_t sdr_voltage; 89 uint8_t sdr_voltage;
90 SPD_BITFIELD( \ 90 SPD_BITFIELD( \
91 uint8_t sdr_cycle_tenths:4, \ 91 uint8_t sdr_cycle_tenths:4, \
92 uint8_t sdr_cycle_whole:4, , \ 92 uint8_t sdr_cycle_whole:4, , \
93 ); 93 );
94 SPD_BITFIELD( 94 SPD_BITFIELD(
95 uint8_t sdr_tAC_tenths:4, \ 95 uint8_t sdr_tAC_tenths:4, \
96 uint8_t sdr_tAC_whole:4, , \ 96 uint8_t sdr_tAC_whole:4, , \
97 ); 97 );
98 uint8_t sdr_config; 98 uint8_t sdr_config;
99 SPD_BITFIELD( \ 99 SPD_BITFIELD( \
100 uint8_t sdr_refresh:7, \ 100 uint8_t sdr_refresh:7, \
101 uint8_t sdr_selfrefresh:1, , \ 101 uint8_t sdr_selfrefresh:1, , \
102 ); 102 );
103 SPD_BITFIELD( \ 103 SPD_BITFIELD( \
104 uint8_t sdr_dramwidth:7, \ 104 uint8_t sdr_dramwidth:7, \
105 uint8_t sdr_dram_asym_bank2:1, ,\ 105 uint8_t sdr_dram_asym_bank2:1, ,\
106 ); 106 );
107 SPD_BITFIELD( \ 107 SPD_BITFIELD( \
108 uint8_t sdr_eccwidth:7, \ 108 uint8_t sdr_eccwidth:7, \
109 uint8_t sdr_ecc_asym_bank2:1, , \ 109 uint8_t sdr_ecc_asym_bank2:1, , \
110 ); 110 );
111 uint8_t sdr_min_clk_delay; 111 uint8_t sdr_min_clk_delay;
112 SPD_BITFIELD( \ 112 SPD_BITFIELD( \
113 uint8_t sdr_burstlengths:4, \ 113 uint8_t sdr_burstlengths:4, \
114 uint8_t sdr_unused1:4, , \ 114 uint8_t sdr_unused1:4, , \
115 ); 115 );
116 uint8_t sdr_banks_per_chip; 116 uint8_t sdr_banks_per_chip;
117 uint8_t sdr_tCAS; 117 uint8_t sdr_tCAS;
118 uint8_t sdr_tCS; 118 uint8_t sdr_tCS;
119 uint8_t sdr_tWE; 119 uint8_t sdr_tWE;
120 uint8_t sdr_mod_attrs; 120 uint8_t sdr_mod_attrs;
121 uint8_t sdr_dev_attrs; 121 uint8_t sdr_dev_attrs;
122 uint8_t sdr_min_cc_1; 122 uint8_t sdr_min_cc_1;
123 uint8_t sdr_max_tAC_1; 123 uint8_t sdr_max_tAC_1;
124 uint8_t sdr_min_cc_2; 124 uint8_t sdr_min_cc_2;
125 uint8_t sdr_max_tAC_2; 125 uint8_t sdr_max_tAC_2;
126 uint8_t sdr_tRP; 126 uint8_t sdr_tRP;
127 uint8_t sdr_tRRD; 127 uint8_t sdr_tRRD;
128 uint8_t sdr_tRCD; 128 uint8_t sdr_tRCD;
129 uint8_t sdr_tRAS; 129 uint8_t sdr_tRAS;
130 uint8_t sdr_module_rank_density; 130 uint8_t sdr_module_rank_density;
131 uint8_t sdr_tIS; 131 uint8_t sdr_tIS;
132#define sdr_superset sdr_tIS 132#define sdr_superset sdr_tIS
133 uint8_t sdr_tIH; 133 uint8_t sdr_tIH;
134 uint8_t sdr_tDS; 134 uint8_t sdr_tDS;
135 uint8_t sdr_tDH; 135 uint8_t sdr_tDH;
136 uint8_t sdr_unused2[5]; 136 uint8_t sdr_unused2[5];
137 uint8_t sdr_tRC; 137 uint8_t sdr_tRC;
138 uint8_t sdr_unused3[18]; 138 uint8_t sdr_unused3[18];
139 uint8_t sdr_esdram; 139 uint8_t sdr_esdram;
140 uint8_t sdr_super_tech; 140 uint8_t sdr_super_tech;
141 uint8_t sdr_spdrev; 141 uint8_t sdr_spdrev;
142 uint8_t sdr_cksum; 142 uint8_t sdr_cksum;
143} __packed; 143} __packed;
144 144
145struct spdmem_rom { 145struct spdmem_rom {
146 uint8_t rom_len; 146 uint8_t rom_len;
147 uint8_t rom_size; 147 uint8_t rom_size;
148 uint8_t rom_type; 148 uint8_t rom_type;
149 uint8_t rom_rows; 149 uint8_t rom_rows;
150 uint8_t rom_cols; 150 uint8_t rom_cols;
151 uint8_t rom_banks; 151 uint8_t rom_banks;
152 uint16_t rom_datawidth; /* endian-sensitive */ 152 uint16_t rom_datawidth; /* endian-sensitive */
153 uint8_t rom_voltage; 153 uint8_t rom_voltage;
154 uint16_t rom_tAA; /* endian-sensitive */ 154 uint16_t rom_tAA; /* endian-sensitive */
155 uint8_t rom_config; 155 uint8_t rom_config;
156 uint8_t rom_unused1; 156 uint8_t rom_unused1;
157 uint8_t rom_tPA; 157 uint8_t rom_tPA;
158 uint8_t rom_tOE; 158 uint8_t rom_tOE;
159 uint16_t rom_tCE; /* endian-sensitive */ 159 uint16_t rom_tCE; /* endian-sensitive */
160 uint8_t rom_burstlength; 160 uint8_t rom_burstlength;
161 uint8_t rom_unused2[14]; 161 uint8_t rom_unused2[14];
162 uint8_t rom_superset[31]; 162 uint8_t rom_superset[31];
163 uint8_t rom_cksum; 163 uint8_t rom_cksum;
164} __packed; 164} __packed;
165 165
166 166
167struct spdmem_ddr { /* Dual Data Rate SDRAM */ 167struct spdmem_ddr { /* Dual Data Rate SDRAM */
168 uint8_t ddr_len; 168 uint8_t ddr_len;
169 uint8_t ddr_size; 169 uint8_t ddr_size;
170 uint8_t ddr_type; 170 uint8_t ddr_type;
171 SPD_BITFIELD( \ 171 SPD_BITFIELD( \
172 uint8_t ddr_rows:4, \ 172 uint8_t ddr_rows:4, \
173 uint8_t ddr_rows2:4, , \ 173 uint8_t ddr_rows2:4, , \
174 ); 174 );
175 SPD_BITFIELD( \ 175 SPD_BITFIELD( \
176 uint8_t ddr_cols:4, \ 176 uint8_t ddr_cols:4, \
177 uint8_t ddr_cols2:4, , \ 177 uint8_t ddr_cols2:4, , \
178 ); 178 );
179 uint8_t ddr_ranks; 179 uint8_t ddr_ranks;
180 uint16_t ddr_datawidth; /* endian-sensitive */ 180 uint16_t ddr_datawidth; /* endian-sensitive */
181 uint8_t ddr_voltage; 181 uint8_t ddr_voltage;
182 SPD_BITFIELD( \ 182 SPD_BITFIELD( \
183 uint8_t ddr_cycle_tenths:4, \ 183 uint8_t ddr_cycle_tenths:4, \
184 uint8_t ddr_cycle_whole:4, , \ 184 uint8_t ddr_cycle_whole:4, , \
185 ); 185 );
186 SPD_BITFIELD( \ 186 SPD_BITFIELD( \
187 uint8_t ddr_tAC_hundredths:4, \ 187 uint8_t ddr_tAC_hundredths:4, \
188 uint8_t ddr_tAC_tenths:4, , \ 188 uint8_t ddr_tAC_tenths:4, , \
189 ); 189 );
190 uint8_t ddr_config; 190 uint8_t ddr_config;
191 SPD_BITFIELD( \ 191 SPD_BITFIELD( \
192 uint8_t ddr_refresh:7, \ 192 uint8_t ddr_refresh:7, \
193 uint8_t ddr_selfrefresh:1, , \ 193 uint8_t ddr_selfrefresh:1, , \
194 ); 194 );
195 SPD_BITFIELD( \ 195 SPD_BITFIELD( \
196 uint8_t ddr_dramwidth:7, \ 196 uint8_t ddr_dramwidth:7, \
197 uint8_t ddr_dram_asym_bank2:1, ,\ 197 uint8_t ddr_dram_asym_bank2:1, ,\
198 ); 198 );
199 SPD_BITFIELD( \ 199 SPD_BITFIELD( \
200 uint8_t ddr_eccwidth:7, \ 200 uint8_t ddr_eccwidth:7, \
201 uint8_t ddr_ecc_asym_bank2:1, , \ 201 uint8_t ddr_ecc_asym_bank2:1, , \
202 ); 202 );
203 uint8_t ddr_min_clk_delay; 203 uint8_t ddr_min_clk_delay;
204 SPD_BITFIELD( \ 204 SPD_BITFIELD( \
205 uint8_t ddr_burstlengths:4, \ 205 uint8_t ddr_burstlengths:4, \
206 uint8_t ddr_unused1:4, , \ 206 uint8_t ddr_unused1:4, , \
207 ); 207 );
208 uint8_t ddr_banks_per_chip; 208 uint8_t ddr_banks_per_chip;
209 uint8_t ddr_tCAS; 209 uint8_t ddr_tCAS;
210 uint8_t ddr_tCS; 210 uint8_t ddr_tCS;
211 uint8_t ddr_tWE; 211 uint8_t ddr_tWE;
212 uint8_t ddr_mod_attrs; 212 uint8_t ddr_mod_attrs;
213 uint8_t ddr_dev_attrs; 213 uint8_t ddr_dev_attrs;
214 uint8_t ddr_min_cc_05; 214 uint8_t ddr_min_cc_05;
215 uint8_t ddr_max_tAC_05; 215 uint8_t ddr_max_tAC_05;
216 uint8_t ddr_min_cc_1; 216 uint8_t ddr_min_cc_1;
217 uint8_t ddr_max_tAC_1; 217 uint8_t ddr_max_tAC_1;
218 uint8_t ddr_tRP; 218 uint8_t ddr_tRP;
219 uint8_t ddr_tRRD; 219 uint8_t ddr_tRRD;
220 uint8_t ddr_tRCD; 220 uint8_t ddr_tRCD;
221 uint8_t ddr_tRAS; 221 uint8_t ddr_tRAS;
222 uint8_t ddr_module_rank_density; 222 uint8_t ddr_module_rank_density;
223 uint8_t ddr_tIS; 223 uint8_t ddr_tIS;
224#define ddr_superset ddr_tIS 224#define ddr_superset ddr_tIS
225 uint8_t ddr_tIH; 225 uint8_t ddr_tIH;
226 uint8_t ddr_tDS; 226 uint8_t ddr_tDS;
227 uint8_t ddr_tDH; 227 uint8_t ddr_tDH;
228 uint8_t ddr_unused2[5]; 228 uint8_t ddr_unused2[5];
229 uint8_t ddr_tRC; 229 uint8_t ddr_tRC;
230 uint8_t ddr_tRFC; 230 uint8_t ddr_tRFC;
231 uint8_t ddr_tCK; 231 uint8_t ddr_tCK;
232 uint8_t ddr_tDQSQ; 232 uint8_t ddr_tDQSQ;
233 uint8_t ddr_tQHS; 233 uint8_t ddr_tQHS;
234 uint8_t ddr_unused3; 234 uint8_t ddr_unused3;
235 uint8_t ddr_height; 235 uint8_t ddr_height;
236 uint8_t ddr_unused4[15]; 236 uint8_t ddr_unused4[15];
237 uint8_t ddr_cksum; 237 uint8_t ddr_cksum;
238} __packed; 238} __packed;
239 239
240struct spdmem_ddr2 { /* Dual Data Rate 2 SDRAM */ 240struct spdmem_ddr2 { /* Dual Data Rate 2 SDRAM */
241 uint8_t ddr2_len; 241 uint8_t ddr2_len;
242 uint8_t ddr2_size; 242 uint8_t ddr2_size;
243 uint8_t ddr2_type; 243 uint8_t ddr2_type;
244 SPD_BITFIELD( \ 244 SPD_BITFIELD( \
245 uint8_t ddr2_rows:5, \ 245 uint8_t ddr2_rows:5, \
246 uint8_t ddr2_unused1:3, , \ 246 uint8_t ddr2_unused1:3, , \
247 ); 247 );
248 SPD_BITFIELD( \ 248 SPD_BITFIELD( \
249 uint8_t ddr2_cols:4, \ 249 uint8_t ddr2_cols:4, \
250 uint8_t ddr2_unused2:4, , \ 250 uint8_t ddr2_unused2:4, , \
251 ); 251 );
252 SPD_BITFIELD( \ 252 SPD_BITFIELD( \
253 uint8_t ddr2_ranks:3, 253 uint8_t ddr2_ranks:3,
254 uint8_t ddr2_cardoncard:1, \ 254 uint8_t ddr2_cardoncard:1, \
255 uint8_t ddr2_package:1, \ 255 uint8_t ddr2_package:1, \
256 uint8_t ddr2_height:3 \ 256 uint8_t ddr2_height:3 \
257 ); 257 );
258 uint8_t ddr2_datawidth; 258 uint8_t ddr2_datawidth;
259 uint8_t ddr2_unused3; 259 uint8_t ddr2_unused3;
260 uint8_t ddr2_voltage; 260 uint8_t ddr2_voltage;
261 SPD_BITFIELD( \ 261 SPD_BITFIELD( \
262 uint8_t ddr2_cycle_frac:4, \ 262 uint8_t ddr2_cycle_frac:4, \
263 uint8_t ddr2_cycle_whole:4, , \ 263 uint8_t ddr2_cycle_whole:4, , \
264 ); 264 );
265 SPD_BITFIELD( \ 265 SPD_BITFIELD( \
266 uint8_t ddr2_tAC_hundredths:4, \ 266 uint8_t ddr2_tAC_hundredths:4, \
267 uint8_t ddr2_tAC_tenths:4, , \ 267 uint8_t ddr2_tAC_tenths:4, , \
268 ); 268 );
269 uint8_t ddr2_config; 269 uint8_t ddr2_config;
270 SPD_BITFIELD( \ 270 SPD_BITFIELD( \
271 uint8_t ddr2_refresh:7, \ 271 uint8_t ddr2_refresh:7, \
272 uint8_t ddr2_selfrefresh:1, , \ 272 uint8_t ddr2_selfrefresh:1, , \
273 ); 273 );
274 uint8_t ddr2_dramwidth; 274 uint8_t ddr2_dramwidth;
275 uint8_t ddr2_eccwidth; 275 uint8_t ddr2_eccwidth;
276 uint8_t ddr2_unused4; 276 uint8_t ddr2_unused4;
277 SPD_BITFIELD( \ 277 SPD_BITFIELD( \
278 uint8_t ddr2_burstlengths:4, \ 278 uint8_t ddr2_burstlengths:4, \
279 uint8_t ddr2_unused5:4, , \ 279 uint8_t ddr2_unused5:4, , \
280 ); 280 );
281 uint8_t ddr2_banks_per_chip; 281 uint8_t ddr2_banks_per_chip;
282 uint8_t ddr2_tCAS; 282 uint8_t ddr2_tCAS;
283 uint8_t ddr2_mechanical; 283 uint8_t ddr2_mechanical;
284 uint8_t ddr2_dimm_type; 284 uint8_t ddr2_dimm_type;
285 uint8_t ddr2_mod_attrs; 285 uint8_t ddr2_mod_attrs;
286 uint8_t ddr2_dev_attrs; 286 uint8_t ddr2_dev_attrs;
287 uint8_t ddr2_min_cc_1; 287 uint8_t ddr2_min_cc_1;
288 uint8_t ddr2_max_tAC_1; 288 uint8_t ddr2_max_tAC_1;
289 uint8_t ddr2_min_cc_2; 289 uint8_t ddr2_min_cc_2;
290 uint8_t ddr2_max_tAC_2; 290 uint8_t ddr2_max_tAC_2;
291 uint8_t ddr2_tRP; 291 uint8_t ddr2_tRP;
292 uint8_t ddr2_tRRD; 292 uint8_t ddr2_tRRD;
293 uint8_t ddr2_tRCD; 293 uint8_t ddr2_tRCD;
294 uint8_t ddr2_tRAS; 294 uint8_t ddr2_tRAS;
295 uint8_t ddr2_module_rank_density; 295 uint8_t ddr2_module_rank_density;
296 uint8_t ddr2_tIS; 296 uint8_t ddr2_tIS;
297 uint8_t ddr2_tIH; 297 uint8_t ddr2_tIH;
298 uint8_t ddr2_tDS; 298 uint8_t ddr2_tDS;
299 uint8_t ddr2_tDH; 299 uint8_t ddr2_tDH;
300 uint8_t ddr2_tWR; 300 uint8_t ddr2_tWR;
301 uint8_t ddr2_tWTR; 301 uint8_t ddr2_tWTR;
302 uint8_t ddr2_tRTP; 302 uint8_t ddr2_tRTP;
303 uint8_t ddr2_probe; 303 uint8_t ddr2_probe;
304 uint8_t ddr2_extensions; 304 uint8_t ddr2_extensions;
305 uint8_t ddr2_tRC; 305 uint8_t ddr2_tRC;
306 uint8_t ddr2_tRFC; 306 uint8_t ddr2_tRFC;
307 uint8_t ddr2_tCK; 307 uint8_t ddr2_tCK;
308 uint8_t ddr2_tDQSQ; 308 uint8_t ddr2_tDQSQ;
309 uint8_t ddr2_tQHS; 309 uint8_t ddr2_tQHS;
310 uint8_t ddr2_pll_relock; 310 uint8_t ddr2_pll_relock;
311 uint8_t ddr2_Tcasemax; 311 uint8_t ddr2_Tcasemax;
312 uint8_t ddr2_Psi_TA_DRAM; 312 uint8_t ddr2_Psi_TA_DRAM;
313 uint8_t ddr2_dt0; 313 uint8_t ddr2_dt0;
314 uint8_t ddr2_dt2NQ; 314 uint8_t ddr2_dt2NQ;
315 uint8_t ddr2_dr2P; 315 uint8_t ddr2_dr2P;
316 uint8_t ddr2_dt3N; 316 uint8_t ddr2_dt3N;
317 uint8_t ddr2_dt3Pfast; 317 uint8_t ddr2_dt3Pfast;
318 uint8_t ddr2_dt3Pslow; 318 uint8_t ddr2_dt3Pslow;
319 uint8_t ddr2_dt4R_4R4W_mode; 319 uint8_t ddr2_dt4R_4R4W_mode;
320 uint8_t ddr2_dt5B; 320 uint8_t ddr2_dt5B;
321 uint8_t ddr2_dt7; 321 uint8_t ddr2_dt7;
322 uint8_t ddr2_Psi_TA_PLL; 322 uint8_t ddr2_Psi_TA_PLL;
323 uint8_t ddr2_Psi_TA_Reg; 323 uint8_t ddr2_Psi_TA_Reg;
324 uint8_t ddr2_dt_PLL_Active; 324 uint8_t ddr2_dt_PLL_Active;
325 uint8_t ddr2_dt_Reg_Active; 325 uint8_t ddr2_dt_Reg_Active;
326 uint8_t ddr2_spdrev; 326 uint8_t ddr2_spdrev;
327 uint8_t ddr2_cksum; 327 uint8_t ddr2_cksum;
328} __packed; 328} __packed;
329 329
330struct spdmem_fbdimm { /* Fully-buffered DIMM */ 330struct spdmem_fbdimm { /* Fully-buffered DIMM */
331 uint8_t fbdimm_len; 331 uint8_t fbdimm_len;
332 uint8_t fbdimm_size; 332 uint8_t fbdimm_size;
333 uint8_t fbdimm_type; 333 uint8_t fbdimm_type;
334 SPD_BITFIELD( \ 334 SPD_BITFIELD( \
335 uint8_t fbdimm_ps1_voltage:4, \ 335 uint8_t fbdimm_ps1_voltage:4, \
336 uint8_t fbdimm_ps2_voltage:4, , \ 336 uint8_t fbdimm_ps2_voltage:4, , \
337 ); 337 );
338 SPD_BITFIELD( \ 338 SPD_BITFIELD( \
339 uint8_t fbdimm_banks:2, \ 339 uint8_t fbdimm_banks:2, \
340 uint8_t fbdimm_cols:3, \ 340 uint8_t fbdimm_cols:3, \
341 uint8_t fbdimm_rows:3, \ 341 uint8_t fbdimm_rows:3, \
342 ); 342 );
343 SPD_BITFIELD( \ 343 SPD_BITFIELD( \
344 uint8_t fbdimm_thick:3, \ 344 uint8_t fbdimm_thick:3, \
345 uint8_t fbdimm_height:3, \ 345 uint8_t fbdimm_height:3, \
346 uint8_t fbdimm_unused1:2, \ 346 uint8_t fbdimm_unused1:2, \
347 ); 347 );
348 uint8_t fbdimm_mod_type; 348 uint8_t fbdimm_mod_type;
349 SPD_BITFIELD( \ 349 SPD_BITFIELD( \
350 uint8_t fbdimm_dev_width:3, \ 350 uint8_t fbdimm_dev_width:3, \
351 uint8_t fbdimm_ranks:3, \ 351 uint8_t fbdimm_ranks:3, \
352 uint8_t fbdimm_unused2:2, \ 352 uint8_t fbdimm_unused2:2, \
353 ); 353 );
354 SPD_BITFIELD( \ 354 SPD_BITFIELD( \
355 uint8_t fbdimm_ftb_divisor:4, \ 355 uint8_t fbdimm_ftb_divisor:4, \
356 uint8_t fbdimm_ftb_dividend:4, ,\ 356 uint8_t fbdimm_ftb_dividend:4, ,\
357 ); 357 );
358 uint8_t fbdimm_mtb_dividend; 358 uint8_t fbdimm_mtb_dividend;
359 uint8_t fbdimm_mtb_divisor; 359 uint8_t fbdimm_mtb_divisor;
360 uint8_t fbdimm_tCKmin; 360 uint8_t fbdimm_tCKmin;
361 uint8_t fbdimm_tCKmax; 361 uint8_t fbdimm_tCKmax;
362 uint8_t fbdimm_tCAS; 362 uint8_t fbdimm_tCAS;
363 uint8_t fbdimm_tAAmin; 363 uint8_t fbdimm_tAAmin;
364 SPD_BITFIELD( \ 364 SPD_BITFIELD( \
365 uint8_t fbdimm_tWR_min:4, \ 365 uint8_t fbdimm_tWR_min:4, \
366 uint8_t fbdimm_WR_range:4, , \ 366 uint8_t fbdimm_WR_range:4, , \
367 ); 367 );
368 uint8_t fbdimm_tWR; 368 uint8_t fbdimm_tWR;
369 SPD_BITFIELD( \ 369 SPD_BITFIELD( \
370 uint8_t fbdimm_tWL_min:4, \ 370 uint8_t fbdimm_tWL_min:4, \
371 uint8_t fbdimm_tWL_range:4, , \ 371 uint8_t fbdimm_tWL_range:4, , \
372 ); 372 );
373 SPD_BITFIELD( \ 373 SPD_BITFIELD( \
374 uint8_t fbdimm_tAL_min:4, \ 374 uint8_t fbdimm_tAL_min:4, \
375 uint8_t fbdimm_tAL_range:4, , \ 375 uint8_t fbdimm_tAL_range:4, , \
376 ); 376 );
377 uint8_t fbdimm_tRCDmin; 377 uint8_t fbdimm_tRCDmin;
378 uint8_t fbdimm_tRRDmin; 378 uint8_t fbdimm_tRRDmin;
379 uint8_t fbdimm_tRPmin; 379 uint8_t fbdimm_tRPmin;
380 SPD_BITFIELD( \ 380 SPD_BITFIELD( \
381 uint8_t fbdimm_tRAS_msb:4, \ 381 uint8_t fbdimm_tRAS_msb:4, \
382 uint8_t fbdimm_tRC_msb:4, , \ 382 uint8_t fbdimm_tRC_msb:4, , \
383 ); 383 );
384 uint8_t fbdimm_tRAS_lsb; 384 uint8_t fbdimm_tRAS_lsb;
385 uint8_t fbdimm_tRC_lsb; 385 uint8_t fbdimm_tRC_lsb;
386 uint16_t fbdimm_tRFC; /* endian-sensitive */ 386 uint16_t fbdimm_tRFC; /* endian-sensitive */
387 uint8_t fbdimm_tWTR; 387 uint8_t fbdimm_tWTR;
388 uint8_t fbdimm_tRTP; 388 uint8_t fbdimm_tRTP;
389 SPD_BITFIELD( \ 389 SPD_BITFIELD( \
390 uint8_t fbdimm_burst_4:1, \ 390 uint8_t fbdimm_burst_4:1, \
391 uint8_t fbdimm_burst_8:1, \ 391 uint8_t fbdimm_burst_8:1, \
392 uint8_t fbdimm_unused3:6, \ 392 uint8_t fbdimm_unused3:6, \
393 ); 393 );
394 uint8_t fbdimm_terms; 394 uint8_t fbdimm_terms;
395 uint8_t fbdimm_drivers; 395 uint8_t fbdimm_drivers;
396 uint8_t fbdimm_tREFI; 396 uint8_t fbdimm_tREFI;
397 uint8_t fbdimm_Tcasemax; 397 uint8_t fbdimm_Tcasemax;
398 uint8_t fbdimm_Psi_TA_SDRAM; 398 uint8_t fbdimm_Psi_TA_SDRAM;
399 uint8_t fbdimm_DT0; 399 uint8_t fbdimm_DT0;
400 uint8_t fbdimm_DT2N_DT2Q; 400 uint8_t fbdimm_DT2N_DT2Q;
401 uint8_t fbdimm_DT2P; 401 uint8_t fbdimm_DT2P;
402 uint8_t fbdimm_DT3N; 402 uint8_t fbdimm_DT3N;
403 uint8_t fbdimm_DT4R_DT4R4W; 403 uint8_t fbdimm_DT4R_DT4R4W;
404 uint8_t fbdimm_DT5B; 404 uint8_t fbdimm_DT5B;
405 uint8_t fbdimm_DT7; 405 uint8_t fbdimm_DT7;
406 uint8_t fbdimm_unused4[84]; 406 uint8_t fbdimm_unused4[84];
407 uint16_t fbdimm_crc; 407 uint16_t fbdimm_crc;
408} __packed; 408} __packed;
409 409
410struct spdmem_rambus { /* Direct Rambus DRAM */ 410struct spdmem_rambus { /* Direct Rambus DRAM */
411 uint8_t rdr_len; 411 uint8_t rdr_len;
412 uint8_t rdr_size; 412 uint8_t rdr_size;
413 uint8_t rdr_type; 413 uint8_t rdr_type;
414 SPD_BITFIELD( \ 414 SPD_BITFIELD( \
415 uint8_t rdr_rows:4, \ 415 uint8_t rdr_rows:4, \
416 uint8_t rdr_cols:4, , \ 416 uint8_t rdr_cols:4, , \
417 ); 417 );
418} __packed; 418} __packed;
419 419
420struct spdmem_ddr3 { /* Dual Data Rate 3 SDRAM */ 420struct spdmem_ddr3 { /* Dual Data Rate 3 SDRAM */
421 SPD_BITFIELD( \ 421 SPD_BITFIELD( \
422 uint8_t ddr3_ROM_used:4, \ 422 uint8_t ddr3_ROM_used:4, \
423 uint8_t ddr3_ROM_size:3, \ 423 uint8_t ddr3_ROM_size:3, \
424 uint8_t ddr3_crccover:1, \ 424 uint8_t ddr3_crccover:1, \
425 ); 425 );
426 uint8_t ddr3_romrev; 426 uint8_t ddr3_romrev;
427 uint8_t ddr3_type; 427 uint8_t ddr3_type;
428 uint8_t ddr3_mod_type; 428 uint8_t ddr3_mod_type;
429 SPD_BITFIELD( \ 429 SPD_BITFIELD( \
430 /* chipsize is offset by 28: 0 = 256M, 1 = 512M, ... */ \ 430 /* chipsize is offset by 28: 0 = 256M, 1 = 512M, ... */ \
431 uint8_t ddr3_chipsize:4, \ 431 uint8_t ddr3_chipsize:4, \
432 /* logbanks is offset by 3 */ \ 432 /* logbanks is offset by 3 */ \
433 uint8_t ddr3_logbanks:3, \ 433 uint8_t ddr3_logbanks:3, \
434 uint8_t ddr3_unused1:1, \ 434 uint8_t ddr3_unused1:1, \
435 ); 435 );
436 /* cols is offset by 9, rows offset by 12 */ 436 /* cols is offset by 9, rows offset by 12 */
437 SPD_BITFIELD( \ 437 SPD_BITFIELD( \
438 uint8_t ddr3_cols:3, \ 438 uint8_t ddr3_cols:3, \
439 uint8_t ddr3_rows:5, , \ 439 uint8_t ddr3_rows:5, , \
440 ); 440 );
441 SPD_BITFIELD( \ 441 SPD_BITFIELD( \
442 uint8_t ddr3_NOT15V:1, \ 442 uint8_t ddr3_NOT15V:1, \
443 uint8_t ddr3_135V:1, \ 443 uint8_t ddr3_135V:1, \
444 uint8_t ddr3_125V:1, \ 444 uint8_t ddr3_125V:1, \
445 uint8_t ddr3_unused2:5 \ 445 uint8_t ddr3_unused2:5 \
446 ); 446 );
447 /* chipwidth in bits offset by 2: 0 = X4, 1 = X8, 2 = X16 */ 447 /* chipwidth in bits offset by 2: 0 = X4, 1 = X8, 2 = X16 */
448 /* physbanks is offset by 1 */ 448 /* physbanks is offset by 1 */
449 SPD_BITFIELD( \ 449 SPD_BITFIELD( \
450 uint8_t ddr3_chipwidth:3, \ 450 uint8_t ddr3_chipwidth:3, \
451 uint8_t ddr3_physbanks:5, , \ 451 uint8_t ddr3_physbanks:5, , \
452 ); 452 );
453 /* datawidth in bits offset by 3: 1 = 16b, 2 = 32b, 3 = 64b */ 453 /* datawidth in bits offset by 3: 1 = 16b, 2 = 32b, 3 = 64b */
454 SPD_BITFIELD( \ 454 SPD_BITFIELD( \
455 uint8_t ddr3_datawidth:3, \ 455 uint8_t ddr3_datawidth:3, \
456 uint8_t ddr3_hasECC:2, \ 456 uint8_t ddr3_hasECC:2, \
457 uint8_t ddr3_unused2a:3 , \ 457 uint8_t ddr3_unused2a:3 , \
458 ); 458 );
459 /* Fine time base, in pico-seconds */ 459 /* Fine time base, in pico-seconds */
460 SPD_BITFIELD( \ 460 SPD_BITFIELD( \
461 uint8_t ddr3_ftb_divisor:4, \ 461 uint8_t ddr3_ftb_divisor:4, \
462 uint8_t ddr3_ftb_dividend:4, , \ 462 uint8_t ddr3_ftb_dividend:4, , \
463 ); 463 );
464 uint8_t ddr3_mtb_dividend; /* 0x0108 = 0.1250ns */ 464 uint8_t ddr3_mtb_dividend; /* 0x0108 = 0.1250ns */
465 uint8_t ddr3_mtb_divisor; /* 0x010f = 0.0625ns */ 465 uint8_t ddr3_mtb_divisor; /* 0x010f = 0.0625ns */
466 uint8_t ddr3_tCKmin; /* in terms of mtb */ 466 uint8_t ddr3_tCKmin_mtb;
467 uint8_t ddr3_unused3; 467 uint8_t ddr3_unused3;
468 uint16_t ddr3_CAS_sup; /* Bit 0 ==> CAS 4 cycles */ 468 uint16_t ddr3_CAS_sup; /* Bit 0 ==> CAS 4 cycles */
469 uint8_t ddr3_tAAmin; /* in terms of mtb */ 469 uint8_t ddr3_tAAmin_mtb;
470 uint8_t ddr3_tWRmin; 470 uint8_t ddr3_tWRmin;
471 uint8_t ddr3_tRCDmin; 471 uint8_t ddr3_tRCDmin_mtb;
472 uint8_t ddr3_tRRDmin; 472 uint8_t ddr3_tRRDmin;
473 uint8_t ddr3_tRPmin; 473 uint8_t ddr3_tRPmin_mtb;
474 SPD_BITFIELD( \ 474 SPD_BITFIELD( \
475 uint8_t ddr3_tRAS_msb:4, \ 475 uint8_t ddr3_tRAS_msb:4, \
476 uint8_t ddr3_tRC_msb:4, , \ 476 uint8_t ddr3_tRCmin_mtb_msb:4, , \
477 ); 477 );
478 uint8_t ddr3_tRAS_lsb; 478 uint8_t ddr3_tRAS_lsb;
479 uint8_t ddr3_tRC_lsb; 479 uint8_t ddr3_tRCmin_mtb_lsb;
480 uint8_t ddr3_tRFCmin_lsb; 480 uint8_t ddr3_tRFCmin_lsb;
481 uint8_t ddr3_tRFCmin_msb; 481 uint8_t ddr3_tRFCmin_msb;
482 uint8_t ddr3_tWTRmin; 482 uint8_t ddr3_tWTRmin;
483 uint8_t ddr3_tRTPmin; 483 uint8_t ddr3_tRTPmin;
484 SPD_BITFIELD( \ 484 SPD_BITFIELD( \
485 uint8_t ddr3_tFAW_msb:4, , , \ 485 uint8_t ddr3_tFAW_msb:4, , , \
486 ); 486 );
487 uint8_t ddr3_tFAW_lsb; 487 uint8_t ddr3_tFAW_lsb;
488 uint8_t ddr3_output_drvrs; 488 uint8_t ddr3_output_drvrs;
489 SPD_BITFIELD( \ 489 SPD_BITFIELD( \
490 uint8_t ddr3_ext_temp_range:1, \ 490 uint8_t ddr3_ext_temp_range:1, \
491 uint8_t ddr3_ext_temp_2x_refresh:1, \ 491 uint8_t ddr3_ext_temp_2x_refresh:1, \
492 uint8_t ddr3_asr_refresh:1, \ 492 uint8_t ddr3_asr_refresh:1, \
493 /* Bit 4 indicates on-die thermal sensor */ 493 /* Bit 4 indicates on-die thermal sensor */
494 /* Bit 7 indicates Partial-Array Self-Refresh (PASR) */ 494 /* Bit 7 indicates Partial-Array Self-Refresh (PASR) */
495 uint8_t ddr3_unused7:5 \ 495 uint8_t ddr3_unused7:5 \
496 ); 496 );
497 SPD_BITFIELD( \ 497 SPD_BITFIELD( \
498 uint8_t ddr3_therm_sensor_acc:7,\ 498 uint8_t ddr3_therm_sensor_acc:7,\
499 uint8_t ddr3_has_therm_sensor:1, , \ 499 uint8_t ddr3_has_therm_sensor:1, , \
500 ); 500 );
501 SPD_BITFIELD( \ 501 SPD_BITFIELD( \
502 uint8_t ddr3_non_std_devtype:7, \ 502 uint8_t ddr3_non_std_devtype:7, \
503 uint8_t ddr3_std_device:1, , \ 503 uint8_t ddr3_std_device:1, , \
504 ); 504 );
505 uint8_t ddr3_unused4[26]; 505 uint8_t ddr3_tCKmin_ftb;
 506 uint8_t ddr3_tAAmin_ftb;
 507 uint8_t ddr3_tRCDmin_ftb;
 508 uint8_t ddr3_tRPmin_ftb;
 509 uint8_t ddr3_tRCmin_ftb;
 510 uint8_t ddr3_unused4[2];
 511 uint8_t ddr3_MAC;
 512 uint8_t ddr3_unused4a[18];
506 uint8_t ddr3_mod_height; 513 uint8_t ddr3_mod_height;
507 uint8_t ddr3_mod_thickness; 514 uint8_t ddr3_mod_thickness;
508 uint8_t ddr3_ref_card; 515 uint8_t ddr3_ref_card;
509 uint8_t ddr3_mapping; 516 uint8_t ddr3_mapping;
510 uint8_t ddr3_unused5[53]; 517 uint8_t ddr3_unused5[53];
511 uint8_t ddr3_mfgID_lsb; 518 uint8_t ddr3_mfgID_lsb;
512 uint8_t ddr3_mfgID_msb; 519 uint8_t ddr3_mfgID_msb;
513 uint8_t ddr3_mfgloc; 520 uint8_t ddr3_mfgloc;
514 uint8_t ddr3_mfg_year; 521 uint8_t ddr3_mfg_year;
515 uint8_t ddr3_mfg_week; 522 uint8_t ddr3_mfg_week;
516 uint8_t ddr3_serial[4]; 523 uint8_t ddr3_serial[4];
517 uint16_t ddr3_crc; 524 uint16_t ddr3_crc;
518 uint8_t ddr3_part[18]; 525 uint8_t ddr3_part[18];
519 uint8_t ddr3_rev[2]; 526 uint8_t ddr3_rev[2];
520 uint8_t ddr3_dram_mfgID_lsb; 527 uint8_t ddr3_dram_mfgID_lsb;
521 uint8_t ddr3_dram_mfgID_msb; 528 uint8_t ddr3_dram_mfgID_msb;
522 uint8_t ddr3_vendor[26]; 529 uint8_t ddr3_vendor[26];
523} __packed; 530} __packed;
524 531
525/* DDR4 info from JEDEC Standard No. 21-C, Annex L - 4.1.2.12 */ 532/* DDR4 info from JEDEC Standard No. 21-C, Annex L - 4.1.2.12 */
526 533
527/* Module-type specific bytes - bytes 0x080 thru 0x0ff */ 534/* Module-type specific bytes - bytes 0x080 thru 0x0ff */
528 535
529struct spdmem_ddr4_mod_unbuffered { 536struct spdmem_ddr4_mod_unbuffered {
530 SPD_BITFIELD( \ 537 SPD_BITFIELD( \
531 uint8_t ddr4_unbuf_mod_height:4, \ 538 uint8_t ddr4_unbuf_mod_height:4, \
532 uint8_t ddr4_unbuf_card_ext:4, , \ 539 uint8_t ddr4_unbuf_card_ext:4, , \
533 ); 540 );
534 SPD_BITFIELD( \ 541 SPD_BITFIELD( \
535 uint8_t ddr4_unbuf_max_thick_front:4, \ 542 uint8_t ddr4_unbuf_max_thick_front:4, \
536 uint8_t ddr4_unbuf_max_thick_back:4, , \ 543 uint8_t ddr4_unbuf_max_thick_back:4, , \
537 ); 544 );
538 SPD_BITFIELD( \ 545 SPD_BITFIELD( \
539 uint8_t ddr4_unbuf_refcard:5, \ 546 uint8_t ddr4_unbuf_refcard:5, \
540 uint8_t ddr4_unbuf_refcard_rev:2, \ 547 uint8_t ddr4_unbuf_refcard_rev:2, \
541 uint8_t ddr4_unbuf_refcard_ext:1, \ 548 uint8_t ddr4_unbuf_refcard_ext:1, \
542 ); 549 );
543 SPD_BITFIELD( \ 550 SPD_BITFIELD( \
544 uint8_t ddr4_unbuf_mirror_mapping:1, \ 551 uint8_t ddr4_unbuf_mirror_mapping:1, \
545 uint8_t ddr4_unbuf_unused1:7, , \ 552 uint8_t ddr4_unbuf_unused1:7, , \
546 ); 553 );
547 uint8_t ddr4_unbuf_unused2[122]; 554 uint8_t ddr4_unbuf_unused2[122];
548 uint8_t ddr4_unbuf_crc[2]; 555 uint8_t ddr4_unbuf_crc[2];
549} __packed; 556} __packed;
550 557
551struct spdmem_ddr4_mod_registered { 558struct spdmem_ddr4_mod_registered {
552 SPD_BITFIELD( \ 559 SPD_BITFIELD( \
553 uint8_t ddr4_reg_mod_height:4, \ 560 uint8_t ddr4_reg_mod_height:4, \
554 uint8_t ddr4_reg_card_ext:4, , \ 561 uint8_t ddr4_reg_card_ext:4, , \
555 ); 562 );
556 SPD_BITFIELD( \ 563 SPD_BITFIELD( \
557 uint8_t ddr4_reg_max_thick_front:4, \ 564 uint8_t ddr4_reg_max_thick_front:4, \
558 uint8_t ddr4_reg_max_thick_back:4, , \ 565 uint8_t ddr4_reg_max_thick_back:4, , \
559 ); 566 );
560 SPD_BITFIELD( \ 567 SPD_BITFIELD( \
561 uint8_t ddr4_reg_refcard:5, \ 568 uint8_t ddr4_reg_refcard:5, \
562 uint8_t ddr4_reg_refcard_rev:2, \ 569 uint8_t ddr4_reg_refcard_rev:2, \
563 uint8_t ddr4_reg_refcard_ext:1, \ 570 uint8_t ddr4_reg_refcard_ext:1, \
564 ); 571 );
565 SPD_BITFIELD( \ 572 SPD_BITFIELD( \
566 uint8_t ddr4_reg_regcnt:2, \ 573 uint8_t ddr4_reg_regcnt:2, \
567 uint8_t ddr4_reg_dram_rows:2, \ 574 uint8_t ddr4_reg_dram_rows:2, \
568 uint8_t ddr4_reg_unused1:4, \ 575 uint8_t ddr4_reg_unused1:4, \
569 ); 576 );
570 SPD_BITFIELD( \ 577 SPD_BITFIELD( \
571 uint8_t ddr4_reg_heat_spread_char:7, \ 578 uint8_t ddr4_reg_heat_spread_char:7, \
572 uint8_t ddr4_reg_heat_spread_exist:1, , \ 579 uint8_t ddr4_reg_heat_spread_exist:1, , \
573 ); 580 );
574 uint8_t ddr4_reg_mfg_id_lsb; 581 uint8_t ddr4_reg_mfg_id_lsb;
575 uint8_t ddr4_reg_mfg_id_msb; 582 uint8_t ddr4_reg_mfg_id_msb;
576 uint8_t ddr4_reg_revision; 583 uint8_t ddr4_reg_revision;
577 SPD_BITFIELD( \ 584 SPD_BITFIELD( \
578 uint8_t ddr4_reg_mirror_mapping:1, \ 585 uint8_t ddr4_reg_mirror_mapping:1, \
579 uint8_t ddr4_reg_unused2:7, , \ 586 uint8_t ddr4_reg_unused2:7, , \
580 ); 587 );
581 SPD_BITFIELD( \ 588 SPD_BITFIELD( \
582 uint8_t ddr4_reg_output_drive_CKE:2, \ 589 uint8_t ddr4_reg_output_drive_CKE:2, \
583 uint8_t ddr4_reg_output_drive_ODT:2, \ 590 uint8_t ddr4_reg_output_drive_ODT:2, \
584 uint8_t ddr4_reg_output_drive_CmdAddr:2,\ 591 uint8_t ddr4_reg_output_drive_CmdAddr:2,\
585 uint8_t ddr4_reg_output_drive_chipsel:2 \ 592 uint8_t ddr4_reg_output_drive_chipsel:2 \
586 ); 593 );
587 SPD_BITFIELD( \ 594 SPD_BITFIELD( \
588 uint8_t ddr4_reg_output_drive_CK_Y0Y2:2,\ 595 uint8_t ddr4_reg_output_drive_CK_Y0Y2:2,\
589 uint8_t ddr4_reg_output_drive_CK_Y1Y3:2,\ 596 uint8_t ddr4_reg_output_drive_CK_Y1Y3:2,\
590 uint8_t ddr4_reg_unused3:4, \ 597 uint8_t ddr4_reg_unused3:4, \
591 ); 598 );
592 uint8_t ddr4_reg_unused4[115]; 599 uint8_t ddr4_reg_unused4[115];
593 uint8_t ddr4_reg_crc[2]; 600 uint8_t ddr4_reg_crc[2];
594} __packed; 601} __packed;
595 602
596struct spdmem_ddr4_mod_reduced_load { 603struct spdmem_ddr4_mod_reduced_load {
597 SPD_BITFIELD( \ 604 SPD_BITFIELD( \
598 uint8_t ddr4_rload_mod_height:4, \ 605 uint8_t ddr4_rload_mod_height:4, \
599 uint8_t ddr4_rload_card_ext:4, , \ 606 uint8_t ddr4_rload_card_ext:4, , \
600 ); 607 );
601 SPD_BITFIELD( \ 608 SPD_BITFIELD( \
602 uint8_t ddr4_rload_max_thick_front:4, \ 609 uint8_t ddr4_rload_max_thick_front:4, \
603 uint8_t ddr4_rload_max_thick_back:4, , \ 610 uint8_t ddr4_rload_max_thick_back:4, , \
604 ); 611 );
605 SPD_BITFIELD( \ 612 SPD_BITFIELD( \
606 uint8_t ddr4_rload_refcard:5, \ 613 uint8_t ddr4_rload_refcard:5, \
607 uint8_t ddr4_rload_refcard_rev:2, \ 614 uint8_t ddr4_rload_refcard_rev:2, \
608 uint8_t ddr4_rload_refcard_ext:1, \ 615 uint8_t ddr4_rload_refcard_ext:1, \
609 ); 616 );
610 SPD_BITFIELD( \ 617 SPD_BITFIELD( \
611 uint8_t ddr4_rload_regcnt:2, \ 618 uint8_t ddr4_rload_regcnt:2, \
612 uint8_t ddr4_rload_dram_rows:2, \ 619 uint8_t ddr4_rload_dram_rows:2, \
613 uint8_t ddr4_rload_unused1:4, \ 620 uint8_t ddr4_rload_unused1:4, \
614 ); 621 );
615 SPD_BITFIELD( \ 622 SPD_BITFIELD( \
616 uint8_t ddr4_rload_unused2:7, \ 623 uint8_t ddr4_rload_unused2:7, \
617 uint8_t ddr4_rload_heat_spread_exist:1, , \ 624 uint8_t ddr4_rload_heat_spread_exist:1, , \
618 ); 625 );
619 uint8_t ddr4_rload_reg_mfg_id_lsb; 626 uint8_t ddr4_rload_reg_mfg_id_lsb;
620 uint8_t ddr4_rload_reg_mfg_id_msb; 627 uint8_t ddr4_rload_reg_mfg_id_msb;
621 uint8_t ddr4_rload_reg_revision; 628 uint8_t ddr4_rload_reg_revision;
622 SPD_BITFIELD( \ 629 SPD_BITFIELD( \
623 uint8_t ddr4_rload_reg_mirror_mapping:1,\ 630 uint8_t ddr4_rload_reg_mirror_mapping:1,\
624 uint8_t ddr4_rload_unused3:7, , \ 631 uint8_t ddr4_rload_unused3:7, , \
625 ); 632 );
626 SPD_BITFIELD( \ 633 SPD_BITFIELD( \
627 uint8_t ddr4_rload_output_drive_CKE:2, \ 634 uint8_t ddr4_rload_output_drive_CKE:2, \
628 uint8_t ddr4_rload_output_drive_ODT:2, \ 635 uint8_t ddr4_rload_output_drive_ODT:2, \
629 uint8_t ddr4_rload_output_drive_CmdAddr:2, \ 636 uint8_t ddr4_rload_output_drive_CmdAddr:2, \
630 uint8_t ddr4_rload_output_drive_chipsel:2 \ 637 uint8_t ddr4_rload_output_drive_chipsel:2 \
631 ); 638 );
632 SPD_BITFIELD( \ 639 SPD_BITFIELD( \
633 uint8_t ddr4_rload_output_drive_CK_Y0Y2:2, \ 640 uint8_t ddr4_rload_output_drive_CK_Y0Y2:2, \
634 uint8_t ddr4_rload_output_drive_CK_Y1Y3:2, \ 641 uint8_t ddr4_rload_output_drive_CK_Y1Y3:2, \
635 uint8_t ddr4_rload_unused4:4, \ 642 uint8_t ddr4_rload_unused4:4, \
636 ); 643 );
637 uint8_t ddr4_rload_dbuff_revision; 644 uint8_t ddr4_rload_dbuff_revision;
638 SPD_BITFIELD( \ 645 SPD_BITFIELD( \
639 uint8_t ddr4_rload_VrefDQ_0:6, \ 646 uint8_t ddr4_rload_VrefDQ_0:6, \
640 uint8_t ddr4_rload_unused5:2, , \ 647 uint8_t ddr4_rload_unused5:2, , \
641 ); 648 );
642 SPD_BITFIELD( \ 649 SPD_BITFIELD( \
643 uint8_t ddr4_rload_VrefDQ_1:6, \ 650 uint8_t ddr4_rload_VrefDQ_1:6, \
644 uint8_t ddr4_rload_unused6:2, , \ 651 uint8_t ddr4_rload_unused6:2, , \
645 ); 652 );
646 SPD_BITFIELD( \ 653 SPD_BITFIELD( \
647 uint8_t ddr4_rload_VrefDQ_2:6, \ 654 uint8_t ddr4_rload_VrefDQ_2:6, \
648 uint8_t ddr4_rload_unused7:2, , \ 655 uint8_t ddr4_rload_unused7:2, , \
649 ); 656 );
650 SPD_BITFIELD( \ 657 SPD_BITFIELD( \
651 uint8_t ddr4_rload_VrefDQ_3:6, \ 658 uint8_t ddr4_rload_VrefDQ_3:6, \
652 uint8_t ddr4_rload_unused8:2, , \ 659 uint8_t ddr4_rload_unused8:2, , \
653 ); 660 );
654 SPD_BITFIELD( \ 661 SPD_BITFIELD( \
655 uint8_t ddr4_rload_VrefDQ_buffer:6, \ 662 uint8_t ddr4_rload_VrefDQ_buffer:6, \
656 uint8_t ddr4_rload_unused9:2, , \ 663 uint8_t ddr4_rload_unused9:2, , \
657 ); 664 );
658 SPD_BITFIELD( \ 665 SPD_BITFIELD( \
659 uint8_t ddr4_rload_MDQ_Read_Term_Str_1866:3, \ 666 uint8_t ddr4_rload_MDQ_Read_Term_Str_1866:3, \
660 uint8_t ddr4_rload_unused10:1, \ 667 uint8_t ddr4_rload_unused10:1, \
661 uint8_t ddr4_rload_MDQ_Drive_Str_1866:3, \ 668 uint8_t ddr4_rload_MDQ_Drive_Str_1866:3, \
662 uint8_t ddr4_rload_unused11:1 \ 669 uint8_t ddr4_rload_unused11:1 \
663 ); 670 );
664 SPD_BITFIELD( \ 671 SPD_BITFIELD( \
665 uint8_t ddr4_rload_MDQ_Read_Term_Str_2400:3, \ 672 uint8_t ddr4_rload_MDQ_Read_Term_Str_2400:3, \
666 uint8_t ddr4_rload_unused12:1, \ 673 uint8_t ddr4_rload_unused12:1, \
667 uint8_t ddr4_rload_MDQ_Drive_Str_2400:3, \ 674 uint8_t ddr4_rload_MDQ_Drive_Str_2400:3, \
668 uint8_t ddr4_rload_unused13:1 \ 675 uint8_t ddr4_rload_unused13:1 \
669 ); 676 );
670 SPD_BITFIELD( \ 677 SPD_BITFIELD( \
671 uint8_t ddr4_rload_MDQ_Read_Term_Str_3200:3, \ 678 uint8_t ddr4_rload_MDQ_Read_Term_Str_3200:3, \
672 uint8_t ddr4_rload_unused14:1, \ 679 uint8_t ddr4_rload_unused14:1, \
673 uint8_t ddr4_rload_MDQ_Drive_Str_3200:3, \ 680 uint8_t ddr4_rload_MDQ_Drive_Str_3200:3, \
674 uint8_t ddr4_rload_unused15:1 \ 681 uint8_t ddr4_rload_unused15:1 \
675 ); 682 );
676 SPD_BITFIELD( \ 683 SPD_BITFIELD( \
677 uint8_t ddr4_rload_DRAM_Drive_Str_1866:2, \ 684 uint8_t ddr4_rload_DRAM_Drive_Str_1866:2, \
678 uint8_t ddr4_rload_DRAM_Drive_Str_2400:2, \ 685 uint8_t ddr4_rload_DRAM_Drive_Str_2400:2, \
679 uint8_t ddr4_rload_DRAM_Drive_Str_3200:2, \ 686 uint8_t ddr4_rload_DRAM_Drive_Str_3200:2, \
680 uint8_t ddr4_rload_unused16:2 \ 687 uint8_t ddr4_rload_unused16:2 \
681 ); 688 );
682 SPD_BITFIELD( \ 689 SPD_BITFIELD( \
683 uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_1866:3, \ 690 uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_1866:3, \
684 uint8_t ddr4_rload_DRAM_ODT_RTT_WR_1866:3, \ 691 uint8_t ddr4_rload_DRAM_ODT_RTT_WR_1866:3, \
685 uint8_t ddr4_rload_unused17:2, \ 692 uint8_t ddr4_rload_unused17:2, \
686 ); 693 );
687 SPD_BITFIELD( \ 694 SPD_BITFIELD( \
688 uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_2400:3, \ 695 uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_2400:3, \
689 uint8_t ddr4_rload_DRAM_ODT_RTT_WR_2400:3, \ 696 uint8_t ddr4_rload_DRAM_ODT_RTT_WR_2400:3, \
690 uint8_t ddr4_rload_unused18:2, \ 697 uint8_t ddr4_rload_unused18:2, \
691 ); 698 );
692 SPD_BITFIELD( \ 699 SPD_BITFIELD( \
693 uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_3200:3, \ 700 uint8_t ddr4_rload_DRAM_ODT_RTT_NOM_3200:3, \
694 uint8_t ddr4_rload_DRAM_ODT_RTT_WR_3200:3, \ 701 uint8_t ddr4_rload_DRAM_ODT_RTT_WR_3200:3, \
695 uint8_t ddr4_rload_unused19:2, \ 702 uint8_t ddr4_rload_unused19:2, \
696 ); 703 );
697 SPD_BITFIELD( \ 704 SPD_BITFIELD( \
698 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_1866:3, \ 705 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_1866:3, \
699 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_1866:3, \ 706 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_1866:3, \
700 uint8_t ddr4_rload_unused20:2, \ 707 uint8_t ddr4_rload_unused20:2, \
701 ); 708 );
702 SPD_BITFIELD( \ 709 SPD_BITFIELD( \
703 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_2400:3, \ 710 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_2400:3, \
704 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_2400:3, \ 711 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_2400:3, \
705 uint8_t ddr4_rload_unused21:2, \ 712 uint8_t ddr4_rload_unused21:2, \
706 ); 713 );
707 SPD_BITFIELD( \ 714 SPD_BITFIELD( \
708 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_3200:3, \ 715 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_01_3200:3, \
709 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_3200:3, \ 716 uint8_t ddr4_rload_DRAM_ODT_RTT_PARK_23_3200:3, \
710 uint8_t ddr4_rload_unused22:2, \ 717 uint8_t ddr4_rload_unused22:2, \
711 ); 718 );
712 uint8_t ddr4_rload_unused23[99]; 719 uint8_t ddr4_rload_unused23[99];
713 uint8_t ddr4_rload_crc[2]; 720 uint8_t ddr4_rload_crc[2];
714} __packed; 721} __packed;
715 722
716struct spdmem_ddr4 { /* Dual Data Rate 4 SDRAM */ 723struct spdmem_ddr4 { /* Dual Data Rate 4 SDRAM */
717 SPD_BITFIELD( \ 724 SPD_BITFIELD( \
718 uint8_t ddr4_ROM_used:4, \ 725 uint8_t ddr4_ROM_used:4, \
719 uint8_t ddr4_ROM_size:3, \ 726 uint8_t ddr4_ROM_size:3, \
720 uint8_t ddr4_unused0:1, \ 727 uint8_t ddr4_unused0:1, \
721 ); 728 );
722 uint8_t ddr4_romrev; 729 uint8_t ddr4_romrev;
723 uint8_t ddr4_type; 730 uint8_t ddr4_type;
724 SPD_BITFIELD( \ 731 SPD_BITFIELD( \
725 uint8_t ddr4_mod_type:4, \ 732 uint8_t ddr4_mod_type:4, \
726 uint8_t ddr4_hybrid_media:3, \ 733 uint8_t ddr4_hybrid_media:3, \
727 uint8_t ddr4_hybrid:1, \ 734 uint8_t ddr4_hybrid:1, \
728 ); 735 );
729 SPD_BITFIELD( \ 736 SPD_BITFIELD( \
730 /* capacity is offset by 28: 0 = 256M, 1 = 512M, ... */ \ 737 /* capacity is offset by 28: 0 = 256M, 1 = 512M, ... */ \
731 uint8_t ddr4_capacity:4, \ 738 uint8_t ddr4_capacity:4, \
732 /* logbanks is offset by 2 */ \ 739 /* logbanks is offset by 2 */ \
733 uint8_t ddr4_logbanks:2, \ 740 uint8_t ddr4_logbanks:2, \
734 /* bankgroups is offset by 0 */ 741 /* bankgroups is offset by 0 */
735 uint8_t ddr4_bankgroups:2, \ 742 uint8_t ddr4_bankgroups:2, \
736 ); 743 );
737 /* cols is offset by 9, rows offset by 12 */ 744 /* cols is offset by 9, rows offset by 12 */
738 SPD_BITFIELD( \ 745 SPD_BITFIELD( \
739 uint8_t ddr4_cols:3, \ 746 uint8_t ddr4_cols:3, \
740 uint8_t ddr4_rows:3, \ 747 uint8_t ddr4_rows:3, \
741 uint8_t ddr4_unused2:2, \ 748 uint8_t ddr4_unused2:2, \
742 ); 749 );
743 SPD_BITFIELD( \ 750 SPD_BITFIELD( \
744 uint8_t ddr4_signal_loading:2, \ 751 uint8_t ddr4_signal_loading:2, \
745 uint8_t ddr4_unused3:2, \ 752 uint8_t ddr4_unused3:2, \
746 uint8_t ddr4_diecount:3, \ 753 uint8_t ddr4_diecount:3, \
747 uint8_t ddr4_non_monolithic:1 \ 754 uint8_t ddr4_non_monolithic:1 \
748 ); 755 );
749 SPD_BITFIELD( \ 756 SPD_BITFIELD( \
750 uint8_t ddr4_max_activate_count:4, \ 757 uint8_t ddr4_max_activate_count:4, \
751 uint8_t ddr4_max_activate_window:2, \ 758 uint8_t ddr4_max_activate_window:2, \
752 uint8_t ddr4_unused4:2, \ 759 uint8_t ddr4_unused4:2, \
753 ); 760 );
754 uint8_t ddr4_unused5; /* SDRAM Thermal & Refresh Options */ 761 uint8_t ddr4_unused5; /* SDRAM Thermal & Refresh Options */
755 SPD_BITFIELD( \ 762 SPD_BITFIELD( \
756 uint8_t ddr4_unused6:6, \ 763 uint8_t ddr4_unused6:6, \
757 uint8_t ddr4_ppr_support:2, , /* post package repair */ \ 764 uint8_t ddr4_ppr_support:2, , /* post package repair */ \
758 ); 765 );
759 uint8_t ddr4_unused7; 766 uint8_t ddr4_unused7;
760 SPD_BITFIELD( \ 767 SPD_BITFIELD( \
761 uint8_t ddr4_dram_vdd_12:2, \ 768 uint8_t ddr4_dram_vdd_12:2, \
762 uint8_t ddr4_dram_vdd_tbd1:2, \ 769 uint8_t ddr4_dram_vdd_tbd1:2, \
763 uint8_t ddr4_dram_vdd_tbd2:2, \ 770 uint8_t ddr4_dram_vdd_tbd2:2, \
764 uint8_t ddr4_unused8:2 \ 771 uint8_t ddr4_unused8:2 \
765 ); 772 );
766 SPD_BITFIELD( \ 773 SPD_BITFIELD( \
767 /* device width is 0=4, 1=8, 2=16, or 4=32 bits */ \ 774 /* device width is 0=4, 1=8, 2=16, or 4=32 bits */ \
768 uint8_t ddr4_device_width:3, \ 775 uint8_t ddr4_device_width:3, \
769 /* number of package ranks is field value plus 1 */ \ 776 /* number of package ranks is field value plus 1 */ \
770 uint8_t ddr4_package_ranks:3, \ 777 uint8_t ddr4_package_ranks:3, \
771 uint8_t ddr4_rank_mix:1, \ 778 uint8_t ddr4_rank_mix:1, \
772 uint8_t ddr4_unused9:1 \ 779 uint8_t ddr4_unused9:1 \
773 ); 780 );
774 SPD_BITFIELD( \ 781 SPD_BITFIELD( \
775 /* primary width is offset by 3, extension is offset by 2 */ \ 782 /* primary width is offset by 3, extension is offset by 2 */ \
776 uint8_t ddr4_primary_bus_width:3, \ 783 uint8_t ddr4_primary_bus_width:3, \
777 uint8_t ddr4_bus_width_extension:2, \ 784 uint8_t ddr4_bus_width_extension:2, \
778 uint8_t ddr4_unused10:3, \ 785 uint8_t ddr4_unused10:3, \
779 ); 786 );
780 SPD_BITFIELD( \ 787 SPD_BITFIELD( \
781 uint8_t ddr4_unused11:7, \ 788 uint8_t ddr4_unused11:7, \
782 uint8_t ddr4_has_therm_sensor:1, , \ 789 uint8_t ddr4_has_therm_sensor:1, , \
783 ); 790 );
784 SPD_BITFIELD( \ 791 SPD_BITFIELD( \
785 uint8_t ddr4_ext_mod_type:4, \ 792 uint8_t ddr4_ext_mod_type:4, \
786 uint8_t ddr4_unused12:4, , \ 793 uint8_t ddr4_unused12:4, , \
787 ); 794 );
788 uint8_t ddr4_unused13; 795 uint8_t ddr4_unused13;
789 SPD_BITFIELD( \ 796 SPD_BITFIELD( \
790 /* units = 1ps (10**-12sec) */ \ 797 /* units = 1ps (10**-12sec) */ \
791 uint8_t ddr4_fine_timebase:2, \ 798 uint8_t ddr4_fine_timebase:2, \
792 /* units = 125ps */ \ 799 /* units = 125ps */ \
793 uint8_t ddr4_medium_timebase:2, , \ 800 uint8_t ddr4_medium_timebase:2, , \
794 ); 801 );
795 uint8_t ddr4_tCKAVGmin_mtb; 802 uint8_t ddr4_tCKAVGmin_mtb;
796 uint8_t ddr4_tCKAVGmax_mtb; 803 uint8_t ddr4_tCKAVGmax_mtb;
797 /* Bit 0 of CAS_supported[0 corresponds to CL=7 */ 804 /* Bit 0 of CAS_supported[0 corresponds to CL=7 */
798 uint8_t ddr4_CAS_supported[4]; 805 uint8_t ddr4_CAS_supported[4];
799 uint8_t ddr4_tAAmin_mtb; 806 uint8_t ddr4_tAAmin_mtb;
800 uint8_t ddr4_tRCDmin_mtb; 807 uint8_t ddr4_tRCDmin_mtb;
801 uint8_t ddr4_tRPmin_mtb; 808 uint8_t ddr4_tRPmin_mtb;
802 SPD_BITFIELD( \ 809 SPD_BITFIELD( \
803 uint8_t ddr4_tRASmin_msb:4, \ 810 uint8_t ddr4_tRASmin_msb:4, \
804 uint8_t ddr4_tRCmin_mtb_msb:4, , \ 811 uint8_t ddr4_tRCmin_mtb_msb:4, , \
805 ); 812 );
806 uint8_t ddr4_tRASmin_lsb; 813 uint8_t ddr4_tRASmin_lsb;
807 uint8_t ddr4_tRCmin_mtb_lsb; 814 uint8_t ddr4_tRCmin_mtb_lsb;
808 uint8_t ddr4_tRFC1min_lsb; 815 uint8_t ddr4_tRFC1min_lsb;
809 uint8_t ddr4_tRFC1min_msb; 816 uint8_t ddr4_tRFC1min_msb;
810 uint8_t ddr4_tRFC2min_lsb; 817 uint8_t ddr4_tRFC2min_lsb;
811 uint8_t ddr4_tRFC2min_msb; 818 uint8_t ddr4_tRFC2min_msb;
812 uint8_t ddr4_tRFC4min_lsb; 819 uint8_t ddr4_tRFC4min_lsb;
813 uint8_t ddr4_tRFC4min_msb; 820 uint8_t ddr4_tRFC4min_msb;
814 SPD_BITFIELD( \ 821 SPD_BITFIELD( \
815 uint8_t ddr4_tFAW_mtb_msb:4, \ 822 uint8_t ddr4_tFAW_mtb_msb:4, \
816 uint8_t ddr4_unused14:4, , \ 823 uint8_t ddr4_unused14:4, , \
817 ); 824 );
818 uint8_t ddr4_tFAWmin_mtb_lsb; 825 uint8_t ddr4_tFAWmin_mtb_lsb;
819 uint8_t ddr4_tRRD_Smin_mtb; 826 uint8_t ddr4_tRRD_Smin_mtb;
820 uint8_t ddr4_tRRD_Lmin_mtb; 827 uint8_t ddr4_tRRD_Lmin_mtb;
821 uint8_t ddr4_tCCD_Lmin_mtb; 828 uint8_t ddr4_tCCD_Lmin_mtb;
822 uint8_t ddr4_tWR_min_msb; 829 uint8_t ddr4_tWR_min_msb;
823 uint8_t ddr4_tWR_min_mtb; 830 uint8_t ddr4_tWR_min_mtb;
824 uint8_t ddr4_tWTR_min; 831 uint8_t ddr4_tWTR_min;
825 uint8_t ddr4_tWTR_Smin_mtb; 832 uint8_t ddr4_tWTR_Smin_mtb;
826 uint8_t ddr4_tWTR_Lmin_mtb; 833 uint8_t ddr4_tWTR_Lmin_mtb;
827 uint8_t ddr4_unused15[14]; 834 uint8_t ddr4_unused15[14];
828 uint8_t ddr4_connector_map[18]; 835 uint8_t ddr4_connector_map[18];
829 uint8_t ddr4_unused16[39]; 836 uint8_t ddr4_unused16[39];
830 uint8_t ddr4_tCCD_Lmin_ftb; 837 uint8_t ddr4_tCCD_Lmin_ftb;
831 uint8_t ddr4_tRRD_Lmin_ftb; 838 uint8_t ddr4_tRRD_Lmin_ftb;
832 uint8_t ddr4_tRRD_Smin_ftb; 839 uint8_t ddr4_tRRD_Smin_ftb;
833 uint8_t ddr4_tRCmin_ftb; 840 uint8_t ddr4_tRCmin_ftb;
834 uint8_t ddr4_tRPmin_ftb; 841 uint8_t ddr4_tRPmin_ftb;
835 uint8_t ddr4_tRCDmin_ftb; 842 uint8_t ddr4_tRCDmin_ftb;
836 uint8_t ddr4_tAAmin_ftb; 843 uint8_t ddr4_tAAmin_ftb;
837 uint8_t ddr4_tCKAVGmax_ftb; 844 uint8_t ddr4_tCKAVGmax_ftb;
838 uint8_t ddr4_tCKAVGmin_ftb; 845 uint8_t ddr4_tCKAVGmin_ftb;
839 uint16_t ddr4_crc; 846 uint16_t ddr4_crc;
840 union { 847 union {
841 struct spdmem_ddr4_mod_unbuffered u2_unbuf; 848 struct spdmem_ddr4_mod_unbuffered u2_unbuf;
842 struct spdmem_ddr4_mod_registered u2_reg; 849 struct spdmem_ddr4_mod_registered u2_reg;
843 struct spdmem_ddr4_mod_reduced_load u2_red_load; 850 struct spdmem_ddr4_mod_reduced_load u2_red_load;
844 } ddr4_u2; 851 } ddr4_u2;
845 uint8_t ddr4_unused17[64]; 852 uint8_t ddr4_unused17[64];
846 uint8_t ddr4_module_mfg_lsb; 853 uint8_t ddr4_module_mfg_lsb;
847 uint8_t ddr4_module_mfg_msb; 854 uint8_t ddr4_module_mfg_msb;
848 uint8_t ddr4_module_mfg_loc; 855 uint8_t ddr4_module_mfg_loc;
849 uint8_t ddr4_module_mfg_year; 856 uint8_t ddr4_module_mfg_year;
850 uint8_t ddr4_module_mfg_week; 857 uint8_t ddr4_module_mfg_week;
851 uint8_t ddr4_serial_number[4]; 858 uint8_t ddr4_serial_number[4];
852 uint8_t ddr4_part_number[20]; 859 uint8_t ddr4_part_number[20];
853 uint8_t ddr4_revision_code; 860 uint8_t ddr4_revision_code;
854 uint8_t ddr4_dram_mfgID_lsb; 861 uint8_t ddr4_dram_mfgID_lsb;
855 uint8_t ddr4_dram_mfgID_msb; 862 uint8_t ddr4_dram_mfgID_msb;
856 uint8_t ddr4_dram_stepping; 863 uint8_t ddr4_dram_stepping;
857 uint8_t ddr4_mfg_specific_data[29]; 864 uint8_t ddr4_mfg_specific_data[29];
858 uint8_t ddr4_unused18[2]; 865 uint8_t ddr4_unused18[2];
859 uint8_t ddr4_user_data[128]; 866 uint8_t ddr4_user_data[128];
860} __packed; 867} __packed;
861 868
862struct spdmem { 869struct spdmem {
863 union { 870 union {
864 struct spdmem_fbdimm u1_fbd; 871 struct spdmem_fbdimm u1_fbd;
865 struct spdmem_fpm u1_fpm; 872 struct spdmem_fpm u1_fpm;
866 struct spdmem_ddr u1_ddr; 873 struct spdmem_ddr u1_ddr;
867 struct spdmem_ddr2 u1_ddr2; 874 struct spdmem_ddr2 u1_ddr2;
868 struct spdmem_sdram u1_sdr; 875 struct spdmem_sdram u1_sdr;
869 struct spdmem_rambus u1_rdr; 876 struct spdmem_rambus u1_rdr;
870 struct spdmem_rom u1_rom; 877 struct spdmem_rom u1_rom;
871 struct spdmem_ddr3 u1_ddr3; 878 struct spdmem_ddr3 u1_ddr3;
872 struct spdmem_ddr4 u1_ddr4; 879 struct spdmem_ddr4 u1_ddr4;
873 } sm_u1; 880 } sm_u1;
874} __packed; 881} __packed;
875#define sm_fbd sm_u1.u1_fbd 882#define sm_fbd sm_u1.u1_fbd
876#define sm_fpm sm_u1.u1_fpm 883#define sm_fpm sm_u1.u1_fpm
877#define sm_ddr sm_u1.u1_ddr 884#define sm_ddr sm_u1.u1_ddr
878#define sm_ddr2 sm_u1.u1_ddr2 885#define sm_ddr2 sm_u1.u1_ddr2
879#define sm_rdr sm_u1.u1_rdr 886#define sm_rdr sm_u1.u1_rdr
880#define sm_rom sm_u1.u1_rom 887#define sm_rom sm_u1.u1_rom
881#define sm_ddr3 sm_u1.u1_ddr3 888#define sm_ddr3 sm_u1.u1_ddr3
882#define sm_sdr sm_u1.u1_sdr 889#define sm_sdr sm_u1.u1_sdr
883#define sm_ddr4 sm_u1.u1_ddr4 890#define sm_ddr4 sm_u1.u1_ddr4
884 891
885/* some fields are in the same place for all memory types */ 892/* some fields are in the same place for all memory types */
886 893
887#define sm_len sm_fpm.fpm_len 894#define sm_len sm_fpm.fpm_len
888#define sm_size sm_fpm.fpm_size 895#define sm_size sm_fpm.fpm_size
889#define sm_type sm_fpm.fpm_type 896#define sm_type sm_fpm.fpm_type
890#define sm_cksum sm_fpm.fpm_cksum 897#define sm_cksum sm_fpm.fpm_cksum
891#define sm_config sm_fpm.fpm_config 898#define sm_config sm_fpm.fpm_config
892#define sm_voltage sm_fpm.fpm_voltage 899#define sm_voltage sm_fpm.fpm_voltage
893#define sm_refresh sm_fpm.fpm_refresh 900#define sm_refresh sm_fpm.fpm_refresh
894#define sm_selfrefresh sm_fpm.fpm_selfrefresh 901#define sm_selfrefresh sm_fpm.fpm_selfrefresh
895 902
896#define SPDMEM_TYPE_MAXLEN 40 903#define SPDMEM_TYPE_MAXLEN 40
897 904
898struct spdmem_softc { 905struct spdmem_softc {
899 int (*sc_read)(struct spdmem_softc *, uint16_t, uint8_t *); 906 int (*sc_read)(struct spdmem_softc *, uint16_t, uint8_t *);
900 struct spdmem sc_spd_data; 907 struct spdmem sc_spd_data;
901 struct sysctllog *sc_sysctl_log; 908 struct sysctllog *sc_sysctl_log;
902 char sc_type[SPDMEM_TYPE_MAXLEN]; 909 char sc_type[SPDMEM_TYPE_MAXLEN];
903}; 910};
904 911
905int spdmem_common_probe(struct spdmem_softc *); 912int spdmem_common_probe(struct spdmem_softc *);
906void spdmem_common_attach(struct spdmem_softc *, device_t); 913void spdmem_common_attach(struct spdmem_softc *, device_t);
907int spdmem_common_detach(struct spdmem_softc *, device_t); 914int spdmem_common_detach(struct spdmem_softc *, device_t);