spdmemvar.h revision 1.1 1 1.1 pgoyette /* $NetBSD: spdmemvar.h,v 1.1 2010/03/24 00:31:41 pgoyette Exp $ */
2 1.1 pgoyette
3 1.1 pgoyette /*
4 1.1 pgoyette * Copyright (c) 2007 Paul Goyette
5 1.1 pgoyette * Copyright (c) 2007 Tobias Nygren
6 1.1 pgoyette * All rights reserved.
7 1.1 pgoyette *
8 1.1 pgoyette * Redistribution and use in source and binary forms, with or without
9 1.1 pgoyette * modification, are permitted provided that the following conditions
10 1.1 pgoyette * are met:
11 1.1 pgoyette * 1. Redistributions of source code must retain the above copyright
12 1.1 pgoyette * notice, this list of conditions and the following disclaimer.
13 1.1 pgoyette * 2. Redistributions in binary form must reproduce the above copyright
14 1.1 pgoyette * notice, this list of conditions and the following disclaimer in the
15 1.1 pgoyette * documentation and/or other materials provided with the distribution.
16 1.1 pgoyette * 3. The name of the author may not be used to endorse or promote products
17 1.1 pgoyette * derived from this software without specific prior written permission.
18 1.1 pgoyette *
19 1.1 pgoyette * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS
20 1.1 pgoyette * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 pgoyette * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 pgoyette * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 pgoyette * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 pgoyette * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 pgoyette * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 pgoyette * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 pgoyette * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 pgoyette * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 pgoyette * POSSIBILITY OF SUCH DAMAGE.
30 1.1 pgoyette */
31 1.1 pgoyette
32 1.1 pgoyette /*
33 1.1 pgoyette * This information is extracted from JEDEC standard SPD4_01 (www.jedec.org)
34 1.1 pgoyette */
35 1.1 pgoyette
36 1.1 pgoyette #if BYTE_ORDER == BIG_ENDIAN
37 1.1 pgoyette #define SPD_BITFIELD(a, b, c, d) d; c; b; a
38 1.1 pgoyette #else
39 1.1 pgoyette #define SPD_BITFIELD(a, b, c, d) a; b; c; d
40 1.1 pgoyette #endif
41 1.1 pgoyette
42 1.1 pgoyette struct spdmem_fpm { /* FPM and EDO DIMMS */
43 1.1 pgoyette uint8_t fpm_rows;
44 1.1 pgoyette uint8_t fpm_cols;
45 1.1 pgoyette uint8_t fpm_banks;
46 1.1 pgoyette uint16_t fpm_datawidth; /* endian-sensitive */
47 1.1 pgoyette uint8_t fpm_voltage;
48 1.1 pgoyette uint8_t fpm_tRAC;
49 1.1 pgoyette uint8_t fpm_tCAC;
50 1.1 pgoyette uint8_t fpm_config;
51 1.1 pgoyette SPD_BITFIELD( \
52 1.1 pgoyette uint8_t fpm_refresh:7, \
53 1.1 pgoyette uint8_t fpm_selfrefresh:1, , \
54 1.1 pgoyette );
55 1.1 pgoyette uint8_t fpm_dram_dramwidth;
56 1.1 pgoyette uint8_t fpm_dram_eccwidth;
57 1.1 pgoyette uint8_t fpm_unused2[17];
58 1.1 pgoyette uint8_t fpm_superset;
59 1.1 pgoyette uint8_t fpm_unused3[30];
60 1.1 pgoyette uint8_t fpm_cksum;
61 1.1 pgoyette } __packed;
62 1.1 pgoyette
63 1.1 pgoyette struct spdmem_sdram { /* PC66/PC100/PC133 SDRAM */
64 1.1 pgoyette SPD_BITFIELD( \
65 1.1 pgoyette uint8_t sdr_rows:4, \
66 1.1 pgoyette uint8_t sdr_rows2:4, , \
67 1.1 pgoyette );
68 1.1 pgoyette SPD_BITFIELD( \
69 1.1 pgoyette uint8_t sdr_cols:4, \
70 1.1 pgoyette uint8_t sdr_cols2:4, , \
71 1.1 pgoyette );
72 1.1 pgoyette uint8_t sdr_banks;
73 1.1 pgoyette uint16_t sdr_datawidth; /* endian-sensitive */
74 1.1 pgoyette uint8_t sdr_voltage;
75 1.1 pgoyette SPD_BITFIELD( \
76 1.1 pgoyette uint8_t sdr_cycle_tenths:4, \
77 1.1 pgoyette uint8_t sdr_cycle_whole:4, , \
78 1.1 pgoyette );
79 1.1 pgoyette SPD_BITFIELD(
80 1.1 pgoyette uint8_t sdr_tAC_tenths:4, \
81 1.1 pgoyette uint8_t sdr_tAC_whole:4, , \
82 1.1 pgoyette );
83 1.1 pgoyette uint8_t sdr_config;
84 1.1 pgoyette SPD_BITFIELD( \
85 1.1 pgoyette uint8_t sdr_refresh:7, \
86 1.1 pgoyette uint8_t sdr_selfrefresh:1, , \
87 1.1 pgoyette );
88 1.1 pgoyette SPD_BITFIELD( \
89 1.1 pgoyette uint8_t sdr_dramwidth:7, \
90 1.1 pgoyette uint8_t sdr_dram_asym_bank2:1, ,\
91 1.1 pgoyette );
92 1.1 pgoyette SPD_BITFIELD( \
93 1.1 pgoyette uint8_t sdr_eccwidth:7, \
94 1.1 pgoyette uint8_t sdr_ecc_asym_bank2:1, , \
95 1.1 pgoyette );
96 1.1 pgoyette uint8_t sdr_min_clk_delay;
97 1.1 pgoyette SPD_BITFIELD( \
98 1.1 pgoyette uint8_t sdr_burstlengths:4, \
99 1.1 pgoyette uint8_t sdr_unused1:4, , \
100 1.1 pgoyette );
101 1.1 pgoyette uint8_t sdr_banks_per_chip;
102 1.1 pgoyette uint8_t sdr_tCAS;
103 1.1 pgoyette uint8_t sdr_tCS;
104 1.1 pgoyette uint8_t sdr_tWE;
105 1.1 pgoyette uint8_t sdr_mod_attrs;
106 1.1 pgoyette uint8_t sdr_dev_attrs;
107 1.1 pgoyette uint8_t sdr_min_cc_1;
108 1.1 pgoyette uint8_t sdr_max_tAC_1;
109 1.1 pgoyette uint8_t sdr_min_cc_2;
110 1.1 pgoyette uint8_t sdr_max_tAC_2;
111 1.1 pgoyette uint8_t sdr_tRP;
112 1.1 pgoyette uint8_t sdr_tRRD;
113 1.1 pgoyette uint8_t sdr_tRCD;
114 1.1 pgoyette uint8_t sdr_tRAS;
115 1.1 pgoyette uint8_t sdr_module_rank_density;
116 1.1 pgoyette uint8_t sdr_tIS;
117 1.1 pgoyette #define sdr_superset sdr_tIS
118 1.1 pgoyette uint8_t sdr_tIH;
119 1.1 pgoyette uint8_t sdr_tDS;
120 1.1 pgoyette uint8_t sdr_tDH;
121 1.1 pgoyette uint8_t sdr_unused2[5];
122 1.1 pgoyette uint8_t sdr_tRC;
123 1.1 pgoyette uint8_t sdr_unused3[18];
124 1.1 pgoyette uint8_t sdr_esdram;
125 1.1 pgoyette uint8_t sdr_super_tech;
126 1.1 pgoyette uint8_t sdr_spdrev;
127 1.1 pgoyette uint8_t sdr_cksum;
128 1.1 pgoyette } __packed;
129 1.1 pgoyette
130 1.1 pgoyette struct spdmem_rom {
131 1.1 pgoyette uint8_t rom_rows;
132 1.1 pgoyette uint8_t rom_cols;
133 1.1 pgoyette uint8_t rom_banks;
134 1.1 pgoyette uint16_t rom_datawidth; /* endian-sensitive */
135 1.1 pgoyette uint8_t rom_voltage;
136 1.1 pgoyette uint16_t rom_tAA; /* endian-sensitive */
137 1.1 pgoyette uint8_t rom_config;
138 1.1 pgoyette uint8_t rom_unused1;
139 1.1 pgoyette uint8_t rom_tPA;
140 1.1 pgoyette uint8_t rom_tOE;
141 1.1 pgoyette uint16_t rom_tCE; /* endian-sensitive */
142 1.1 pgoyette uint8_t rom_burstlength;
143 1.1 pgoyette uint8_t rom_unused2[14];
144 1.1 pgoyette uint8_t rom_superset[31];
145 1.1 pgoyette uint8_t rom_cksum;
146 1.1 pgoyette } __packed;
147 1.1 pgoyette
148 1.1 pgoyette
149 1.1 pgoyette struct spdmem_ddr { /* Dual Data Rate SDRAM */
150 1.1 pgoyette SPD_BITFIELD( \
151 1.1 pgoyette uint8_t ddr_rows:4, \
152 1.1 pgoyette uint8_t ddr_rows2:4, , \
153 1.1 pgoyette );
154 1.1 pgoyette SPD_BITFIELD( \
155 1.1 pgoyette uint8_t ddr_cols:4, \
156 1.1 pgoyette uint8_t ddr_cols2:4, , \
157 1.1 pgoyette );
158 1.1 pgoyette uint8_t ddr_ranks;
159 1.1 pgoyette uint16_t ddr_datawidth; /* endian-sensitive */
160 1.1 pgoyette uint8_t ddr_voltage;
161 1.1 pgoyette SPD_BITFIELD( \
162 1.1 pgoyette uint8_t ddr_cycle_tenths:4, \
163 1.1 pgoyette uint8_t ddr_cycle_whole:4, , \
164 1.1 pgoyette );
165 1.1 pgoyette SPD_BITFIELD( \
166 1.1 pgoyette uint8_t ddr_tAC_hundredths:4, \
167 1.1 pgoyette uint8_t ddr_tAC_tenths:4, , \
168 1.1 pgoyette );
169 1.1 pgoyette uint8_t ddr_config;
170 1.1 pgoyette SPD_BITFIELD( \
171 1.1 pgoyette uint8_t ddr_refresh:7, \
172 1.1 pgoyette uint8_t ddr_selfrefresh:1, , \
173 1.1 pgoyette );
174 1.1 pgoyette SPD_BITFIELD( \
175 1.1 pgoyette uint8_t ddr_dramwidth:7, \
176 1.1 pgoyette uint8_t ddr_dram_asym_bank2:1, ,\
177 1.1 pgoyette );
178 1.1 pgoyette SPD_BITFIELD( \
179 1.1 pgoyette uint8_t ddr_eccwidth:7, \
180 1.1 pgoyette uint8_t ddr_ecc_asym_bank2:1, , \
181 1.1 pgoyette );
182 1.1 pgoyette uint8_t ddr_min_clk_delay;
183 1.1 pgoyette SPD_BITFIELD( \
184 1.1 pgoyette uint8_t ddr_burstlengths:4, \
185 1.1 pgoyette uint8_t ddr_unused1:4, , \
186 1.1 pgoyette );
187 1.1 pgoyette uint8_t ddr_banks_per_chip;
188 1.1 pgoyette uint8_t ddr_tCAS;
189 1.1 pgoyette uint8_t ddr_tCS;
190 1.1 pgoyette uint8_t ddr_tWE;
191 1.1 pgoyette uint8_t ddr_mod_attrs;
192 1.1 pgoyette uint8_t ddr_dev_attrs;
193 1.1 pgoyette uint8_t ddr_min_cc_05;
194 1.1 pgoyette uint8_t ddr_max_tAC_05;
195 1.1 pgoyette uint8_t ddr_min_cc_1;
196 1.1 pgoyette uint8_t ddr_max_tAC_1;
197 1.1 pgoyette uint8_t ddr_tRP;
198 1.1 pgoyette uint8_t ddr_tRRD;
199 1.1 pgoyette uint8_t ddr_tRCD;
200 1.1 pgoyette uint8_t ddr_tRAS;
201 1.1 pgoyette uint8_t ddr_module_rank_density;
202 1.1 pgoyette uint8_t ddr_tIS;
203 1.1 pgoyette #define ddr_superset ddr_tIS
204 1.1 pgoyette uint8_t ddr_tIH;
205 1.1 pgoyette uint8_t ddr_tDS;
206 1.1 pgoyette uint8_t ddr_tDH;
207 1.1 pgoyette uint8_t ddr_unused2[5];
208 1.1 pgoyette uint8_t ddr_tRC;
209 1.1 pgoyette uint8_t ddr_tRFC;
210 1.1 pgoyette uint8_t ddr_tCK;
211 1.1 pgoyette uint8_t ddr_tDQSQ;
212 1.1 pgoyette uint8_t ddr_tQHS;
213 1.1 pgoyette uint8_t ddr_unused3;
214 1.1 pgoyette uint8_t ddr_height;
215 1.1 pgoyette uint8_t ddr_unused4[15];
216 1.1 pgoyette uint8_t ddr_cksum;
217 1.1 pgoyette } __packed;
218 1.1 pgoyette
219 1.1 pgoyette struct spdmem_ddr2 { /* Dual Data Rate 2 SDRAM */
220 1.1 pgoyette SPD_BITFIELD( \
221 1.1 pgoyette uint8_t ddr2_rows:5, \
222 1.1 pgoyette uint8_t ddr2_unused1:3, , \
223 1.1 pgoyette );
224 1.1 pgoyette SPD_BITFIELD( \
225 1.1 pgoyette uint8_t ddr2_cols:4, \
226 1.1 pgoyette uint8_t ddr2_unused2:4, , \
227 1.1 pgoyette );
228 1.1 pgoyette SPD_BITFIELD( \
229 1.1 pgoyette uint8_t ddr2_ranks:3,
230 1.1 pgoyette uint8_t ddr2_cardoncard:1, \
231 1.1 pgoyette uint8_t ddr2_package:1, \
232 1.1 pgoyette uint8_t ddr2_height:3 \
233 1.1 pgoyette );
234 1.1 pgoyette uint8_t ddr2_datawidth;
235 1.1 pgoyette uint8_t ddr2_unused3;
236 1.1 pgoyette uint8_t ddr2_voltage;
237 1.1 pgoyette SPD_BITFIELD( \
238 1.1 pgoyette uint8_t ddr2_cycle_frac:4, \
239 1.1 pgoyette uint8_t ddr2_cycle_whole:4, , \
240 1.1 pgoyette );
241 1.1 pgoyette SPD_BITFIELD( \
242 1.1 pgoyette uint8_t ddr2_tAC_hundredths:4, \
243 1.1 pgoyette uint8_t ddr2_tAC_tenths:4, , \
244 1.1 pgoyette );
245 1.1 pgoyette uint8_t ddr2_config;
246 1.1 pgoyette SPD_BITFIELD( \
247 1.1 pgoyette uint8_t ddr2_refresh:7, \
248 1.1 pgoyette uint8_t ddr2_selfrefresh:1, , \
249 1.1 pgoyette );
250 1.1 pgoyette uint8_t ddr2_dramwidth;
251 1.1 pgoyette uint8_t ddr2_eccwidth;
252 1.1 pgoyette uint8_t ddr2_unused4;
253 1.1 pgoyette SPD_BITFIELD( \
254 1.1 pgoyette uint8_t ddr2_burstlengths:4, \
255 1.1 pgoyette uint8_t ddr2_unused5:4, , \
256 1.1 pgoyette );
257 1.1 pgoyette uint8_t ddr2_banks_per_chip;
258 1.1 pgoyette uint8_t ddr2_tCAS;
259 1.1 pgoyette uint8_t ddr2_mechanical;
260 1.1 pgoyette uint8_t ddr2_dimm_type;
261 1.1 pgoyette uint8_t ddr2_mod_attrs;
262 1.1 pgoyette uint8_t ddr2_dev_attrs;
263 1.1 pgoyette uint8_t ddr2_min_cc_1;
264 1.1 pgoyette uint8_t ddr2_max_tAC_1;
265 1.1 pgoyette uint8_t ddr2_min_cc_2;
266 1.1 pgoyette uint8_t ddr2_max_tAC_2;
267 1.1 pgoyette uint8_t ddr2_tRP;
268 1.1 pgoyette uint8_t ddr2_tRRD;
269 1.1 pgoyette uint8_t ddr2_tRCD;
270 1.1 pgoyette uint8_t ddr2_tRAS;
271 1.1 pgoyette uint8_t ddr2_module_rank_density;
272 1.1 pgoyette uint8_t ddr2_tIS;
273 1.1 pgoyette uint8_t ddr2_tIH;
274 1.1 pgoyette uint8_t ddr2_tDS;
275 1.1 pgoyette uint8_t ddr2_tDH;
276 1.1 pgoyette uint8_t ddr2_tWR;
277 1.1 pgoyette uint8_t ddr2_tWTR;
278 1.1 pgoyette uint8_t ddr2_tRTP;
279 1.1 pgoyette uint8_t ddr2_probe;
280 1.1 pgoyette uint8_t ddr2_extensions;
281 1.1 pgoyette uint8_t ddr2_tRC;
282 1.1 pgoyette uint8_t ddr2_tRFC;
283 1.1 pgoyette uint8_t ddr2_tCK;
284 1.1 pgoyette uint8_t ddr2_tDQSQ;
285 1.1 pgoyette uint8_t ddr2_tQHS;
286 1.1 pgoyette uint8_t ddr2_pll_relock;
287 1.1 pgoyette uint8_t ddr2_Tcasemax;
288 1.1 pgoyette uint8_t ddr2_Psi_TA_DRAM;
289 1.1 pgoyette uint8_t ddr2_dt0;
290 1.1 pgoyette uint8_t ddr2_dt2NQ;
291 1.1 pgoyette uint8_t ddr2_dr2P;
292 1.1 pgoyette uint8_t ddr2_dt3N;
293 1.1 pgoyette uint8_t ddr2_dt3Pfast;
294 1.1 pgoyette uint8_t ddr2_dt3Pslow;
295 1.1 pgoyette uint8_t ddr2_dt4R_4R4W_mode;
296 1.1 pgoyette uint8_t ddr2_dt5B;
297 1.1 pgoyette uint8_t ddr2_dt7;
298 1.1 pgoyette uint8_t ddr2_Psi_TA_PLL;
299 1.1 pgoyette uint8_t ddr2_Psi_TA_Reg;
300 1.1 pgoyette uint8_t ddr2_dt_PLL_Active;
301 1.1 pgoyette uint8_t ddr2_dt_Reg_Active;
302 1.1 pgoyette uint8_t ddr2_spdrev;
303 1.1 pgoyette uint8_t ddr2_cksum;
304 1.1 pgoyette } __packed;
305 1.1 pgoyette
306 1.1 pgoyette struct spdmem_fbdimm { /* Fully-buffered DIMM */
307 1.1 pgoyette SPD_BITFIELD( \
308 1.1 pgoyette uint8_t fbdimm_ps1_voltage:4, \
309 1.1 pgoyette uint8_t fbdimm_ps2_voltage:4, , \
310 1.1 pgoyette );
311 1.1 pgoyette SPD_BITFIELD( \
312 1.1 pgoyette uint8_t fbdimm_banks:2, \
313 1.1 pgoyette uint8_t fbdimm_cols:3, \
314 1.1 pgoyette uint8_t fbdimm_rows:3, \
315 1.1 pgoyette );
316 1.1 pgoyette SPD_BITFIELD( \
317 1.1 pgoyette uint8_t fbdimm_thick:3, \
318 1.1 pgoyette uint8_t fbdimm_height:3, \
319 1.1 pgoyette uint8_t fbdimm_unused1:2, \
320 1.1 pgoyette );
321 1.1 pgoyette uint8_t fbdimm_mod_type;
322 1.1 pgoyette SPD_BITFIELD( \
323 1.1 pgoyette uint8_t fbdimm_dev_width:3, \
324 1.1 pgoyette uint8_t fbdimm_ranks:3, \
325 1.1 pgoyette uint8_t fbdimm_unused2:2, \
326 1.1 pgoyette );
327 1.1 pgoyette SPD_BITFIELD( \
328 1.1 pgoyette uint8_t fbdimm_ftb_divisor:4, \
329 1.1 pgoyette uint8_t fbdimm_ftp_dividend:4, ,\
330 1.1 pgoyette );
331 1.1 pgoyette uint8_t fbdimm_mtb_dividend;
332 1.1 pgoyette uint8_t fbdimm_mtb_divisor;
333 1.1 pgoyette uint8_t fbdimm_tCKmin;
334 1.1 pgoyette uint8_t fbdimm_tCKmax;
335 1.1 pgoyette uint8_t fbdimm_tCAS;
336 1.1 pgoyette uint8_t fbdimm_tAAmin;
337 1.1 pgoyette SPD_BITFIELD( \
338 1.1 pgoyette uint8_t fbdimm_tWR_min:4, \
339 1.1 pgoyette uint8_t fbdimm_WR_range:4, , \
340 1.1 pgoyette );
341 1.1 pgoyette uint8_t fbdimm_tWR;
342 1.1 pgoyette SPD_BITFIELD( \
343 1.1 pgoyette uint8_t fbdimm_tWL_min:4, \
344 1.1 pgoyette uint8_t fbdimm_tWL_range:4, , \
345 1.1 pgoyette );
346 1.1 pgoyette SPD_BITFIELD( \
347 1.1 pgoyette uint8_t fbdimm_tAL_min:4, \
348 1.1 pgoyette uint8_t fbdimm_tAL_range:4, , \
349 1.1 pgoyette );
350 1.1 pgoyette uint8_t fbdimm_tRCDmin;
351 1.1 pgoyette uint8_t fbdimm_tRRDmin;
352 1.1 pgoyette uint8_t fbdimm_tRPmin;
353 1.1 pgoyette SPD_BITFIELD( \
354 1.1 pgoyette uint8_t fbdimm_tRAS_msb:4, \
355 1.1 pgoyette uint8_t fbdimm_tRC_msb:4, , \
356 1.1 pgoyette );
357 1.1 pgoyette uint8_t fbdimm_tRAS_lsb;
358 1.1 pgoyette uint8_t fbdimm_tRC_lsb;
359 1.1 pgoyette uint16_t fbdimm_tRFC; /* endian-sensitive */
360 1.1 pgoyette uint8_t fbdimm_tWTR;
361 1.1 pgoyette uint8_t fbdimm_tRTP;
362 1.1 pgoyette SPD_BITFIELD( \
363 1.1 pgoyette uint8_t fbdimm_burst_4:1, \
364 1.1 pgoyette uint8_t fbdimm_burst_8:1, \
365 1.1 pgoyette uint8_t fbdimm_unused3:6, \
366 1.1 pgoyette );
367 1.1 pgoyette uint8_t fbdimm_terms;
368 1.1 pgoyette uint8_t fbdimm_drivers;
369 1.1 pgoyette uint8_t fbdimm_tREFI;
370 1.1 pgoyette uint8_t fbdimm_Tcasemax;
371 1.1 pgoyette uint8_t fbdimm_Psi_TA_SDRAM;
372 1.1 pgoyette uint8_t fbdimm_DT0;
373 1.1 pgoyette uint8_t fbdimm_DT2N_DT2Q;
374 1.1 pgoyette uint8_t fbdimm_DT2P;
375 1.1 pgoyette uint8_t fbdimm_DT3N;
376 1.1 pgoyette uint8_t fbdimm_DT4R_DT4R4W;
377 1.1 pgoyette uint8_t fbdimm_DT5B;
378 1.1 pgoyette uint8_t fbdimm_DT7;
379 1.1 pgoyette uint8_t fbdimm_unused4[84];
380 1.1 pgoyette uint16_t fbdimm_crc;
381 1.1 pgoyette } __packed;
382 1.1 pgoyette
383 1.1 pgoyette struct spdmem_rambus { /* Direct Rambus DRAM */
384 1.1 pgoyette SPD_BITFIELD( \
385 1.1 pgoyette uint8_t rdr_rows:4, \
386 1.1 pgoyette uint8_t rdr_cols:4, , \
387 1.1 pgoyette );
388 1.1 pgoyette } __packed;
389 1.1 pgoyette
390 1.1 pgoyette struct spdmem_ddr3 { /* Dual Data Rate 3 SDRAM */
391 1.1 pgoyette uint8_t ddr3_mod_type;
392 1.1 pgoyette SPD_BITFIELD( \
393 1.1 pgoyette /* chipsize is offset by 28: 0 = 256M, 1 = 512M, ... */ \
394 1.1 pgoyette uint8_t ddr3_chipsize:4, \
395 1.1 pgoyette /* logbanks is offset by 3 */ \
396 1.1 pgoyette uint8_t ddr3_logbanks:3, \
397 1.1 pgoyette uint8_t ddr3_unused1:1, \
398 1.1 pgoyette );
399 1.1 pgoyette /* cols is offset by 9, rows offset by 12 */
400 1.1 pgoyette SPD_BITFIELD( \
401 1.1 pgoyette uint8_t ddr3_cols:3, \
402 1.1 pgoyette uint8_t ddr3_rows:5, , \
403 1.1 pgoyette );
404 1.1 pgoyette SPD_BITFIELD( \
405 1.1 pgoyette uint8_t ddr3_NOT15V:1, \
406 1.1 pgoyette uint8_t ddr3_135V:1, \
407 1.1 pgoyette uint8_t ddr3_12XV:1, \
408 1.1 pgoyette uint8_t ddr3_unused2:5 \
409 1.1 pgoyette );
410 1.1 pgoyette /* chipwidth in bits offset by 2: 0 = X4, 1 = X8, 2 = X16 */
411 1.1 pgoyette /* physbanks is offset by 1 */
412 1.1 pgoyette SPD_BITFIELD( \
413 1.1 pgoyette uint8_t ddr3_chipwidth:3, \
414 1.1 pgoyette uint8_t ddr3_physbanks:5, , \
415 1.1 pgoyette );
416 1.1 pgoyette /* datawidth in bits offset by 3: 1 = 16b, 2 = 32b, 3 = 64b */
417 1.1 pgoyette SPD_BITFIELD( \
418 1.1 pgoyette uint8_t ddr3_datawidth:3, \
419 1.1 pgoyette uint8_t ddr3_hasECC:2, \
420 1.1 pgoyette uint8_t ddr3_unused2a:3 , \
421 1.1 pgoyette );
422 1.1 pgoyette /* Fine time base, in pico-seconds */
423 1.1 pgoyette SPD_BITFIELD( \
424 1.1 pgoyette uint8_t ddr3_ftb_divisor:4, \
425 1.1 pgoyette uint8_t ddr3_ftb_dividend:4, , \
426 1.1 pgoyette );
427 1.1 pgoyette uint8_t ddr3_mtb_dividend; /* 0x0108 = 0.1250ns */
428 1.1 pgoyette uint8_t ddr3_mtb_divisor; /* 0x010f = 0.0625ns */
429 1.1 pgoyette uint8_t ddr3_tCKmin; /* in terms of mtb */
430 1.1 pgoyette uint8_t ddr3_unused3;
431 1.1 pgoyette uint16_t ddr3_CAS_sup; /* Bit 0 ==> CAS 4 cycles */
432 1.1 pgoyette uint8_t ddr3_tAAmin; /* in terms of mtb */
433 1.1 pgoyette uint8_t ddr3_tWRmin;
434 1.1 pgoyette uint8_t ddr3_tRCDmin;
435 1.1 pgoyette uint8_t ddr3_tRRDmin;
436 1.1 pgoyette uint8_t ddr3_tRPmin;
437 1.1 pgoyette SPD_BITFIELD( \
438 1.1 pgoyette uint8_t ddr3_tRAS_msb:4, \
439 1.1 pgoyette uint8_t ddr3_tRC_msb:4, , \
440 1.1 pgoyette );
441 1.1 pgoyette uint8_t ddr3_tRAS_lsb;
442 1.1 pgoyette uint8_t ddr3_tRC_lsb;
443 1.1 pgoyette uint8_t ddr3_tRFCmin_lsb;
444 1.1 pgoyette uint8_t ddr3_tRFCmin_msb;
445 1.1 pgoyette uint8_t ddr3_tWTRmin;
446 1.1 pgoyette uint8_t ddr3_tRTPmin;
447 1.1 pgoyette SPD_BITFIELD( \
448 1.1 pgoyette uint8_t ddr3_tFAW_msb:4, , , \
449 1.1 pgoyette );
450 1.1 pgoyette uint8_t ddr3_tFAW_lsb;
451 1.1 pgoyette uint8_t ddr3_output_drvrs;
452 1.1 pgoyette SPD_BITFIELD( \
453 1.1 pgoyette uint8_t ddr3_ext_temp_range:1, \
454 1.1 pgoyette uint8_t ddr3_ext_temp_2x_refresh:1, \
455 1.1 pgoyette uint8_t ddr3_asr_refresh:1, \
456 1.1 pgoyette /* Bit 4 indicates on-die thermal sensor */
457 1.1 pgoyette /* Bit 7 indicates Partial-Array Self-Refresh (PASR) */
458 1.1 pgoyette uint8_t ddr3_unused7:5 \
459 1.1 pgoyette );
460 1.1 pgoyette SPD_BITFIELD( \
461 1.1 pgoyette uint8_t ddr3_therm_sensor_acc:7,\
462 1.1 pgoyette uint8_t ddr3_has_therm_sensor:1, , \
463 1.1 pgoyette );
464 1.1 pgoyette SPD_BITFIELD( \
465 1.1 pgoyette uint8_t ddr3_non_std_devtype:7, \
466 1.1 pgoyette uint8_t ddr3_std_device:1, , \
467 1.1 pgoyette );
468 1.1 pgoyette uint8_t ddr3_unused4[26];
469 1.1 pgoyette uint8_t ddr3_mod_height;
470 1.1 pgoyette uint8_t ddr3_mod_thickness;
471 1.1 pgoyette uint8_t ddr3_ref_card;
472 1.1 pgoyette uint8_t ddr3_mapping;
473 1.1 pgoyette uint8_t ddr3_unused5[53];
474 1.1 pgoyette uint8_t ddr3_mfgID_lsb;
475 1.1 pgoyette uint8_t ddr3_mfgID_msb;
476 1.1 pgoyette uint8_t ddr3_mfgloc;
477 1.1 pgoyette uint8_t ddr3_mfg_year;
478 1.1 pgoyette uint8_t ddr3_mfg_week;
479 1.1 pgoyette uint8_t ddr3_serial[4];
480 1.1 pgoyette uint16_t ddr3_crc;
481 1.1 pgoyette } __packed;
482 1.1 pgoyette
483 1.1 pgoyette struct spdmem {
484 1.1 pgoyette uint8_t sm_len;
485 1.1 pgoyette uint8_t sm_size;
486 1.1 pgoyette uint8_t sm_type;
487 1.1 pgoyette union {
488 1.1 pgoyette struct spdmem_fbdimm u1_fbd;
489 1.1 pgoyette struct spdmem_fpm u1_fpm;
490 1.1 pgoyette struct spdmem_ddr u1_ddr;
491 1.1 pgoyette struct spdmem_ddr2 u1_ddr2;
492 1.1 pgoyette struct spdmem_sdram u1_sdr;
493 1.1 pgoyette struct spdmem_rambus u1_rdr;
494 1.1 pgoyette struct spdmem_rom u1_rom;
495 1.1 pgoyette struct spdmem_ddr3 u1_ddr3;
496 1.1 pgoyette } sm_u1;
497 1.1 pgoyette uint8_t sm_extension[128];
498 1.1 pgoyette } __packed;
499 1.1 pgoyette #define sm_fbd sm_u1.u1_fbd
500 1.1 pgoyette #define sm_fpm sm_u1.u1_fpm
501 1.1 pgoyette #define sm_ddr sm_u1.u1_ddr
502 1.1 pgoyette #define sm_ddr2 sm_u1.u1_ddr2
503 1.1 pgoyette #define sm_rdr sm_u1.u1_rdr
504 1.1 pgoyette #define sm_rom sm_u1.u1_rom
505 1.1 pgoyette #define sm_ddr3 sm_u1.u1_ddr3
506 1.1 pgoyette #define sm_sdr sm_u1.u1_sdr
507 1.1 pgoyette
508 1.1 pgoyette /* some fields are in the same place for all memory types */
509 1.1 pgoyette
510 1.1 pgoyette #define sm_cksum sm_fpm.fpm_cksum
511 1.1 pgoyette #define sm_config sm_fpm.fpm_config
512 1.1 pgoyette #define sm_voltage sm_fpm.fpm_voltage
513 1.1 pgoyette #define sm_refresh sm_fpm.fpm_refresh
514 1.1 pgoyette #define sm_selfrefresh sm_fpm.fpm_selfrefresh
515 1.1 pgoyette
516 1.1 pgoyette #define SPDMEM_TYPE_MAXLEN 16
517 1.1 pgoyette
518 1.1 pgoyette struct spdmem_softc {
519 1.1 pgoyette uint8_t (*sc_read)(struct spdmem_softc *, uint8_t);
520 1.1 pgoyette struct spdmem sc_spd_data;
521 1.1 pgoyette char sc_type[SPDMEM_TYPE_MAXLEN];
522 1.1 pgoyette };
523 1.1 pgoyette
524 1.1 pgoyette int spdmem_common_probe(struct spdmem_softc *);
525 1.1 pgoyette void spdmem_common_attach(struct spdmem_softc *, device_t);
526