xref: /openbmc/ipmitool/lib/dimm_spd.c (revision 2d79e69f)
1c18ec02fSPetter Reinholdtsen /*
2c18ec02fSPetter Reinholdtsen  * Copyright (c) 2003 Sun Microsystems, Inc.  All Rights Reserved.
3c18ec02fSPetter Reinholdtsen  *
4c18ec02fSPetter Reinholdtsen  * Redistribution and use in source and binary forms, with or without
5c18ec02fSPetter Reinholdtsen  * modification, are permitted provided that the following conditions
6c18ec02fSPetter Reinholdtsen  * are met:
7c18ec02fSPetter Reinholdtsen  *
8c18ec02fSPetter Reinholdtsen  * Redistribution of source code must retain the above copyright
9c18ec02fSPetter Reinholdtsen  * notice, this list of conditions and the following disclaimer.
10c18ec02fSPetter Reinholdtsen  *
11c18ec02fSPetter Reinholdtsen  * Redistribution in binary form must reproduce the above copyright
12c18ec02fSPetter Reinholdtsen  * notice, this list of conditions and the following disclaimer in the
13c18ec02fSPetter Reinholdtsen  * documentation and/or other materials provided with the distribution.
14c18ec02fSPetter Reinholdtsen  *
15c18ec02fSPetter Reinholdtsen  * Neither the name of Sun Microsystems, Inc. or the names of
16c18ec02fSPetter Reinholdtsen  * contributors may be used to endorse or promote products derived
17c18ec02fSPetter Reinholdtsen  * from this software without specific prior written permission.
18c18ec02fSPetter Reinholdtsen  *
19c18ec02fSPetter Reinholdtsen  * This software is provided "AS IS," without a warranty of any kind.
20c18ec02fSPetter Reinholdtsen  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
21c18ec02fSPetter Reinholdtsen  * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
22c18ec02fSPetter Reinholdtsen  * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
23c18ec02fSPetter Reinholdtsen  * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
24c18ec02fSPetter Reinholdtsen  * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
25c18ec02fSPetter Reinholdtsen  * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.  IN NO EVENT WILL
26c18ec02fSPetter Reinholdtsen  * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
27c18ec02fSPetter Reinholdtsen  * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
28c18ec02fSPetter Reinholdtsen  * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
29c18ec02fSPetter Reinholdtsen  * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
30c18ec02fSPetter Reinholdtsen  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
31c18ec02fSPetter Reinholdtsen  */
32c18ec02fSPetter Reinholdtsen 
33c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi.h>
34c18ec02fSPetter Reinholdtsen #include <ipmitool/log.h>
35c18ec02fSPetter Reinholdtsen #include <ipmitool/helper.h>
36c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_intf.h>
37c18ec02fSPetter Reinholdtsen #include <ipmitool/ipmi_fru.h>
38c18ec02fSPetter Reinholdtsen 
39c18ec02fSPetter Reinholdtsen #include <stdlib.h>
40c18ec02fSPetter Reinholdtsen #include <string.h>
41c18ec02fSPetter Reinholdtsen 
42c18ec02fSPetter Reinholdtsen extern int verbose;
43c18ec02fSPetter Reinholdtsen 
44c18ec02fSPetter Reinholdtsen /*
45c18ec02fSPetter Reinholdtsen  * Also, see ipmi_fru.c.
46c18ec02fSPetter Reinholdtsen  *
47c18ec02fSPetter Reinholdtsen  * Apparently some systems have problems with FRU access greater than 16 bytes
48c18ec02fSPetter Reinholdtsen  * at a time, even when using byte (not word) access.	 In order to ensure we
49c18ec02fSPetter Reinholdtsen  * work with the widest variety of hardware request size is capped at 16 bytes.
50c18ec02fSPetter Reinholdtsen  * Since this may result in slowdowns on some systems with lots of FRU data you
51c18ec02fSPetter Reinholdtsen  * can change this define to enable larger (up to 32 bytes at a time) access.
52c18ec02fSPetter Reinholdtsen  */
53c18ec02fSPetter Reinholdtsen #define FRU_DATA_RQST_SIZE 16;
54c18ec02fSPetter Reinholdtsen 
55c18ec02fSPetter Reinholdtsen const struct valstr spd_memtype_vals[] = {
56c18ec02fSPetter Reinholdtsen 	{ 0x01, "STD FPM DRAM" },
57c18ec02fSPetter Reinholdtsen 	{ 0x02, "EDO" },
58c18ec02fSPetter Reinholdtsen 	{ 0x04, "SDRAM" },
59c18ec02fSPetter Reinholdtsen 	{ 0x05, "ROM" },
60c18ec02fSPetter Reinholdtsen 	{ 0x06, "DDR SGRAM" },
61c18ec02fSPetter Reinholdtsen 	{ 0x07, "DDR SDRAM" },
62c18ec02fSPetter Reinholdtsen 	{ 0x08, "DDR2 SDRAM" },
63c18ec02fSPetter Reinholdtsen 	{ 0x09, "DDR2 SDRAM FB-DIMM" },
64c18ec02fSPetter Reinholdtsen 	{ 0x0A, "DDR2 SDRAM FB-DIMM Probe" },
65c18ec02fSPetter Reinholdtsen 	{ 0x0B, "DDR3 SDRAM" },
66732be1b9SJim Mankovich 	{ 0x0C, "DDR4 SDRAM" },
67c18ec02fSPetter Reinholdtsen 	{ 0x00, NULL },
68c18ec02fSPetter Reinholdtsen };
69c18ec02fSPetter Reinholdtsen 
70c18ec02fSPetter Reinholdtsen const struct valstr ddr3_density_vals[] =
71c18ec02fSPetter Reinholdtsen {
72c18ec02fSPetter Reinholdtsen 	{ 0, "256 Mb" },
73c18ec02fSPetter Reinholdtsen 	{ 1, "512 Mb" },
74c18ec02fSPetter Reinholdtsen 	{ 2, "1 Gb" },
75c18ec02fSPetter Reinholdtsen 	{ 3, "2 Gb" },
76c18ec02fSPetter Reinholdtsen 	{ 4, "4 Gb" },
77c18ec02fSPetter Reinholdtsen 	{ 5, "8 Gb" },
78c18ec02fSPetter Reinholdtsen 	{ 6, "16 Gb" },
79c18ec02fSPetter Reinholdtsen 	{ 0x00, NULL },
80c18ec02fSPetter Reinholdtsen };
81c18ec02fSPetter Reinholdtsen 
82c18ec02fSPetter Reinholdtsen const struct valstr ddr3_banks_vals[] =
83c18ec02fSPetter Reinholdtsen {
84c18ec02fSPetter Reinholdtsen 	{ 0, "3 (8 Banks)" },
85c18ec02fSPetter Reinholdtsen 	{ 1, "4 (16 Banks)" },
86c18ec02fSPetter Reinholdtsen 	{ 2, "5 (32 Banks)" },
87c18ec02fSPetter Reinholdtsen 	{ 3, "6 (64 Banks)" },
88c18ec02fSPetter Reinholdtsen 	{ 0x00, NULL },
89c18ec02fSPetter Reinholdtsen };
90c18ec02fSPetter Reinholdtsen 
9196b19bb6SJim Mankovich 
9296b19bb6SJim Mankovich #define ddr4_ecc_vals ddr3_ecc_vals
93c18ec02fSPetter Reinholdtsen const struct valstr ddr3_ecc_vals[] =
94c18ec02fSPetter Reinholdtsen {
95c18ec02fSPetter Reinholdtsen 	{ 0, "0 bits" },
96c18ec02fSPetter Reinholdtsen 	{ 1, "8 bits" },
97c18ec02fSPetter Reinholdtsen 	{ 0x00, NULL },
98c18ec02fSPetter Reinholdtsen };
99c18ec02fSPetter Reinholdtsen 
10096b19bb6SJim Mankovich const struct valstr ddr4_density_vals[] =
10196b19bb6SJim Mankovich {
10296b19bb6SJim Mankovich 	{ 0, "256 Mb" },
10396b19bb6SJim Mankovich 	{ 1, "512 Mb" },
10496b19bb6SJim Mankovich 	{ 2, "1 Gb" },
10596b19bb6SJim Mankovich 	{ 3, "2 Gb" },
10696b19bb6SJim Mankovich 	{ 4, "4 Gb" },
10796b19bb6SJim Mankovich 	{ 5, "8 Gb" },
10896b19bb6SJim Mankovich 	{ 6, "16 Gb" },
10996b19bb6SJim Mankovich 	{ 7, "32 Gb" },
11096b19bb6SJim Mankovich 	{ 0x00, NULL },
11196b19bb6SJim Mankovich };
11296b19bb6SJim Mankovich 
11396b19bb6SJim Mankovich const struct valstr ddr4_banks_vals[] =
11496b19bb6SJim Mankovich {
11596b19bb6SJim Mankovich 	{ 0, "2 (4 Banks)" },
11696b19bb6SJim Mankovich 	{ 1, "3 (8 Banks)" },
11796b19bb6SJim Mankovich 	{ 0x00, NULL },
11896b19bb6SJim Mankovich };
11996b19bb6SJim Mankovich 
12096b19bb6SJim Mankovich const struct valstr ddr4_bank_groups[] =
12196b19bb6SJim Mankovich {
12296b19bb6SJim Mankovich 	{ 0, "0 (no Bank Groups)" },
12396b19bb6SJim Mankovich 	{ 1, "1 (2 Bank Groups)" },
12496b19bb6SJim Mankovich 	{ 2, "2 (4 Bank Groups)" },
12596b19bb6SJim Mankovich 	{ 0x00, NULL },
12696b19bb6SJim Mankovich };
12796b19bb6SJim Mankovich 
12896b19bb6SJim Mankovich const struct valstr ddr4_package_type[] =
12996b19bb6SJim Mankovich {
13096b19bb6SJim Mankovich 	{ 0, "Monolithic DRAM Device" },
13196b19bb6SJim Mankovich 	{ 1, "Non-Monolithic Device" },
13296b19bb6SJim Mankovich 	{ 0x00, NULL },
13396b19bb6SJim Mankovich };
13496b19bb6SJim Mankovich 
13596b19bb6SJim Mankovich const struct valstr ddr4_technology_type[] =
13696b19bb6SJim Mankovich {
13796b19bb6SJim Mankovich 	{ 0, "Extended module type, see byte 15" },
13896b19bb6SJim Mankovich 	{ 1, "RDIMM" },
13996b19bb6SJim Mankovich 	{ 2, "UDIMM" },
14096b19bb6SJim Mankovich 	{ 3, "SO-DIMM" },
14196b19bb6SJim Mankovich 	{ 4, "LRDIMM" },
14296b19bb6SJim Mankovich 	{ 5, "Mini-RDIMM" },
14396b19bb6SJim Mankovich 	{ 6, "Mini-UDIMM" },
14496b19bb6SJim Mankovich 	{ 7, "7 - Reserved" },
14596b19bb6SJim Mankovich 	{ 8, "72b-SO-RDIMM" },
14696b19bb6SJim Mankovich 	{ 9, "72b-SO-UDIMM" },
14796b19bb6SJim Mankovich 	{ 10, "10 - Reserved" },
14896b19bb6SJim Mankovich 	{ 11, "11 - Reserved" },
14996b19bb6SJim Mankovich 	{ 12, "16b-SO-DIMM" },
15096b19bb6SJim Mankovich 	{ 13, "32b-SO-DIMM" },
15196b19bb6SJim Mankovich 	{ 14, "14 - Reserved" },
15296b19bb6SJim Mankovich 	{ 15, "No base memory present" },
15396b19bb6SJim Mankovich 	{ 0x00, NULL },
15496b19bb6SJim Mankovich };
15596b19bb6SJim Mankovich 
156c18ec02fSPetter Reinholdtsen const struct valstr spd_config_vals[] = {
157c18ec02fSPetter Reinholdtsen 	{ 0x00, "None" },
158c18ec02fSPetter Reinholdtsen 	{ 0x01, "Parity" },
159c18ec02fSPetter Reinholdtsen 	{ 0x02, "ECC" },
160c18ec02fSPetter Reinholdtsen 	{ 0x04, "Addr Cmd Parity" },
161c18ec02fSPetter Reinholdtsen 	{ 0x00, NULL },
162c18ec02fSPetter Reinholdtsen };
163c18ec02fSPetter Reinholdtsen 
164c18ec02fSPetter Reinholdtsen const struct valstr spd_voltage_vals[] = {
165c18ec02fSPetter Reinholdtsen 	{ 0x00, "5.0V TTL" },
166c18ec02fSPetter Reinholdtsen 	{ 0x01, "LVTTL" },
167c18ec02fSPetter Reinholdtsen 	{ 0x02, "HSTL 1.5V" },
168c18ec02fSPetter Reinholdtsen 	{ 0x03, "SSTL 3.3V" },
169c18ec02fSPetter Reinholdtsen 	{ 0x04, "SSTL 2.5V" },
170c18ec02fSPetter Reinholdtsen 	{ 0x05, "SSTL 1.8V" },
171c18ec02fSPetter Reinholdtsen 	{ 0x00, NULL },
172c18ec02fSPetter Reinholdtsen };
173c18ec02fSPetter Reinholdtsen 
174c18ec02fSPetter Reinholdtsen /*
175c18ec02fSPetter Reinholdtsen  * JEDEC Standard Manufacturers Identification Code
176c18ec02fSPetter Reinholdtsen  * publication JEP106N, December 2003
177c18ec02fSPetter Reinholdtsen  */
178c18ec02fSPetter Reinholdtsen 
179c18ec02fSPetter Reinholdtsen const struct valstr jedec_id1_vals[] = {
180c18ec02fSPetter Reinholdtsen 	{ 0x01, "AMD" },
181c18ec02fSPetter Reinholdtsen 	{ 0x02, "AMI" },
182c18ec02fSPetter Reinholdtsen 	{ 0x83, "Fairchild" },
183c18ec02fSPetter Reinholdtsen 	{ 0x04, "Fujitsu" },
184c18ec02fSPetter Reinholdtsen 	{ 0x85, "GTE" },
185c18ec02fSPetter Reinholdtsen 	{ 0x86, "Harris" },
186c18ec02fSPetter Reinholdtsen 	{ 0x07, "Hitachi" },
187c18ec02fSPetter Reinholdtsen 	{ 0x08, "Inmos" },
188c18ec02fSPetter Reinholdtsen 	{ 0x89, "Intel" },
189c18ec02fSPetter Reinholdtsen 	{ 0x8a, "I.T.T." },
190c18ec02fSPetter Reinholdtsen 	{ 0x0b, "Intersil" },
191c18ec02fSPetter Reinholdtsen 	{ 0x8c, "Monolithic Memories" },
192c18ec02fSPetter Reinholdtsen 	{ 0x0d, "Mostek" },
193c18ec02fSPetter Reinholdtsen 	{ 0x0e, "Motorola" },
194c18ec02fSPetter Reinholdtsen 	{ 0x8f, "National" },
195c18ec02fSPetter Reinholdtsen 	{ 0x10, "NEC" },
196c18ec02fSPetter Reinholdtsen 	{ 0x91, "RCA" },
197c18ec02fSPetter Reinholdtsen 	{ 0x92, "Raytheon" },
198c18ec02fSPetter Reinholdtsen 	{ 0x13, "Conexant (Rockwell)" },
199c18ec02fSPetter Reinholdtsen 	{ 0x94, "Seeq" },
200c18ec02fSPetter Reinholdtsen 	{ 0x15, "Philips Semi. (Signetics)" },
201c18ec02fSPetter Reinholdtsen 	{ 0x16, "Synertek" },
202c18ec02fSPetter Reinholdtsen 	{ 0x97, "Texas Instruments" },
203c18ec02fSPetter Reinholdtsen 	{ 0x98, "Toshiba" },
204c18ec02fSPetter Reinholdtsen 	{ 0x19, "Xicor" },
205c18ec02fSPetter Reinholdtsen 	{ 0x1a, "Zilog" },
206c18ec02fSPetter Reinholdtsen 	{ 0x9b, "Eurotechnique" },
207c18ec02fSPetter Reinholdtsen 	{ 0x1c, "Mitsubishi" },
208c18ec02fSPetter Reinholdtsen 	{ 0x9d, "Lucent (AT&T)" },
209c18ec02fSPetter Reinholdtsen 	{ 0x9e, "Exel" },
210c18ec02fSPetter Reinholdtsen 	{ 0x1f, "Atmel" },
211c18ec02fSPetter Reinholdtsen 	{ 0x20, "SGS/Thomson" },
212c18ec02fSPetter Reinholdtsen 	{ 0xa1, "Lattice Semi." },
213c18ec02fSPetter Reinholdtsen 	{ 0xa2, "NCR" },
214c18ec02fSPetter Reinholdtsen 	{ 0x23, "Wafer Scale Integration" },
215c18ec02fSPetter Reinholdtsen 	{ 0xa4, "IBM" },
216c18ec02fSPetter Reinholdtsen 	{ 0x25, "Tristar" },
217c18ec02fSPetter Reinholdtsen 	{ 0x26, "Visic" },
218c18ec02fSPetter Reinholdtsen 	{ 0xa7, "Intl. CMOS Technology" },
219c18ec02fSPetter Reinholdtsen 	{ 0xa8, "SSSI" },
220c18ec02fSPetter Reinholdtsen 	{ 0x29, "Microchip Technology" },
221c18ec02fSPetter Reinholdtsen 	{ 0x2a, "Ricoh Ltd." },
222c18ec02fSPetter Reinholdtsen 	{ 0xab, "VLSI" },
223c18ec02fSPetter Reinholdtsen 	{ 0x2c, "Micron Technology" },
224c18ec02fSPetter Reinholdtsen 	{ 0xad, "Hyundai Electronics" },
225c18ec02fSPetter Reinholdtsen 	{ 0xae, "OKI Semiconductor" },
226c18ec02fSPetter Reinholdtsen 	{ 0x2f, "ACTEL" },
227c18ec02fSPetter Reinholdtsen 	{ 0xb0, "Sharp" },
228c18ec02fSPetter Reinholdtsen 	{ 0x31, "Catalyst" },
229c18ec02fSPetter Reinholdtsen 	{ 0x32, "Panasonic" },
230c18ec02fSPetter Reinholdtsen 	{ 0xb3, "IDT" },
231c18ec02fSPetter Reinholdtsen 	{ 0x34, "Cypress" },
232c18ec02fSPetter Reinholdtsen 	{ 0xb5, "DEC" },
233c18ec02fSPetter Reinholdtsen 	{ 0xb6, "LSI Logic" },
234c18ec02fSPetter Reinholdtsen 	{ 0x37, "Zarlink" },
235c18ec02fSPetter Reinholdtsen 	{ 0x38, "UTMC" },
236c18ec02fSPetter Reinholdtsen 	{ 0xb9, "Thinking Machine" },
237c18ec02fSPetter Reinholdtsen 	{ 0xba, "Thomson CSF" },
238c18ec02fSPetter Reinholdtsen 	{ 0x3b, "Integrated CMOS(Vertex)" },
239c18ec02fSPetter Reinholdtsen 	{ 0xbc, "Honeywell" },
240c18ec02fSPetter Reinholdtsen 	{ 0x3d, "Tektronix" },
241c18ec02fSPetter Reinholdtsen 	{ 0x3e, "Sun Microsystems" },
242c18ec02fSPetter Reinholdtsen 	{ 0xbf, "SST" },
243c18ec02fSPetter Reinholdtsen 	{ 0x40, "MOSEL" },
244c18ec02fSPetter Reinholdtsen 	{ 0xc1, "Infineon" },
245c18ec02fSPetter Reinholdtsen 	{ 0xc2, "Macronix" },
246c18ec02fSPetter Reinholdtsen 	{ 0x43, "Xerox" },
247c18ec02fSPetter Reinholdtsen 	{ 0xc4, "Plus Logic" },
248c18ec02fSPetter Reinholdtsen 	{ 0x45, "SunDisk" },
249c18ec02fSPetter Reinholdtsen 	{ 0x46, "Elan Circuit Tech." },
250c18ec02fSPetter Reinholdtsen 	{ 0xc7, "European Silicon Str." },
251c18ec02fSPetter Reinholdtsen 	{ 0xc8, "Apple Computer" },
252c18ec02fSPetter Reinholdtsen 	{ 0xc9, "Xilinx" },
253c18ec02fSPetter Reinholdtsen 	{ 0x4a, "Compaq" },
254c18ec02fSPetter Reinholdtsen 	{ 0xcb, "Protocol Engines" },
255c18ec02fSPetter Reinholdtsen 	{ 0x4c, "SCI" },
256c18ec02fSPetter Reinholdtsen 	{ 0xcd, "Seiko Instruments" },
257c18ec02fSPetter Reinholdtsen 	{ 0xce, "Samsung" },
258c18ec02fSPetter Reinholdtsen 	{ 0x4f, "I3 Design System" },
259c18ec02fSPetter Reinholdtsen 	{ 0xd0, "Klic" },
260c18ec02fSPetter Reinholdtsen 	{ 0x51, "Crosspoint Solutions" },
261c18ec02fSPetter Reinholdtsen 	{ 0x52, "Alliance Semiconductor" },
262c18ec02fSPetter Reinholdtsen 	{ 0xd3, "Tandem" },
263c18ec02fSPetter Reinholdtsen 	{ 0x54, "Hewlett-Packard" },
264c18ec02fSPetter Reinholdtsen 	{ 0xd5, "Intg. Silicon Solutions" },
265c18ec02fSPetter Reinholdtsen 	{ 0xd6, "Brooktree" },
266c18ec02fSPetter Reinholdtsen 	{ 0x57, "New Media" },
267c18ec02fSPetter Reinholdtsen 	{ 0x58, "MHS Electronic" },
268c18ec02fSPetter Reinholdtsen 	{ 0xd9, "Performance Semi." },
269c18ec02fSPetter Reinholdtsen 	{ 0xda, "Winbond Electronic" },
270c18ec02fSPetter Reinholdtsen 	{ 0x5b, "Kawasaki Steel" },
271c18ec02fSPetter Reinholdtsen 	{ 0xdc, "Bright Micro" },
272c18ec02fSPetter Reinholdtsen 	{ 0x5d, "TECMAR" },
273c18ec02fSPetter Reinholdtsen 	{ 0x5e, "Exar" },
274c18ec02fSPetter Reinholdtsen 	{ 0xdf, "PCMCIA" },
275c18ec02fSPetter Reinholdtsen 	{ 0xe0, "LG Semiconductor" },
276c18ec02fSPetter Reinholdtsen 	{ 0x61, "Northern Telecom" },
277c18ec02fSPetter Reinholdtsen 	{ 0x62, "Sanyo" },
278c18ec02fSPetter Reinholdtsen 	{ 0xe3, "Array Microsystems" },
279c18ec02fSPetter Reinholdtsen 	{ 0x64, "Crystal Semiconductor" },
280c18ec02fSPetter Reinholdtsen 	{ 0xe5, "Analog Devices" },
281c18ec02fSPetter Reinholdtsen 	{ 0xe6, "PMC-Sierra" },
282c18ec02fSPetter Reinholdtsen 	{ 0x67, "Asparix" },
283c18ec02fSPetter Reinholdtsen 	{ 0x68, "Convex Computer" },
284c18ec02fSPetter Reinholdtsen 	{ 0xe9, "Quality Semiconductor" },
285c18ec02fSPetter Reinholdtsen 	{ 0xea, "Nimbus Technology" },
286c18ec02fSPetter Reinholdtsen 	{ 0x6b, "Transwitch" },
287c18ec02fSPetter Reinholdtsen 	{ 0xec, "Micronas (ITT Intermetall)" },
288c18ec02fSPetter Reinholdtsen 	{ 0x6d, "Cannon" },
289c18ec02fSPetter Reinholdtsen 	{ 0x6e, "Altera" },
290c18ec02fSPetter Reinholdtsen 	{ 0xef, "NEXCOM" },
291c18ec02fSPetter Reinholdtsen 	{ 0x70, "QUALCOMM" },
292c18ec02fSPetter Reinholdtsen 	{ 0xf1, "Sony" },
293c18ec02fSPetter Reinholdtsen 	{ 0xf2, "Cray Research" },
294c18ec02fSPetter Reinholdtsen 	{ 0x73, "AMS (Austria Micro)" },
295c18ec02fSPetter Reinholdtsen 	{ 0xf4, "Vitesse" },
296c18ec02fSPetter Reinholdtsen 	{ 0x75, "Aster Electronics" },
297c18ec02fSPetter Reinholdtsen 	{ 0x76, "Bay Networks (Synoptic)" },
298c18ec02fSPetter Reinholdtsen 	{ 0xf7, "Zentrum" },
299c18ec02fSPetter Reinholdtsen 	{ 0xf8, "TRW" },
300c18ec02fSPetter Reinholdtsen 	{ 0x79, "Thesys" },
301c18ec02fSPetter Reinholdtsen 	{ 0x7a, "Solbourne Computer" },
302c18ec02fSPetter Reinholdtsen 	{ 0xfb, "Allied-Signal" },
303c18ec02fSPetter Reinholdtsen 	{ 0x7c, "Dialog" },
304c18ec02fSPetter Reinholdtsen 	{ 0xfd, "Media Vision" },
305c18ec02fSPetter Reinholdtsen 	{ 0xfe, "Level One Communication" },
306c18ec02fSPetter Reinholdtsen 	{ 0x00, NULL },
307c18ec02fSPetter Reinholdtsen };
308c18ec02fSPetter Reinholdtsen 
309c18ec02fSPetter Reinholdtsen const struct valstr jedec_id2_vals[] = {
310c18ec02fSPetter Reinholdtsen 	{ 0x01, "Cirrus Logic" },
311c18ec02fSPetter Reinholdtsen 	{ 0x02, "National Instruments" },
312c18ec02fSPetter Reinholdtsen 	{ 0x83, "ILC Data Device" },
313c18ec02fSPetter Reinholdtsen 	{ 0x04, "Alcatel Mietec" },
314c18ec02fSPetter Reinholdtsen 	{ 0x85, "Micro Linear" },
315c18ec02fSPetter Reinholdtsen 	{ 0x86, "Univ. of NC" },
316c18ec02fSPetter Reinholdtsen 	{ 0x07, "JTAG Technologies" },
317c18ec02fSPetter Reinholdtsen 	{ 0x08, "Loral" },
318c18ec02fSPetter Reinholdtsen 	{ 0x89, "Nchip" },
319c18ec02fSPetter Reinholdtsen 	{ 0x8A, "Galileo Tech" },
320c18ec02fSPetter Reinholdtsen 	{ 0x0B, "Bestlink Systems" },
321c18ec02fSPetter Reinholdtsen 	{ 0x8C, "Graychip" },
322c18ec02fSPetter Reinholdtsen 	{ 0x0D, "GENNUM" },
323c18ec02fSPetter Reinholdtsen 	{ 0x0E, "VideoLogic" },
324c18ec02fSPetter Reinholdtsen 	{ 0x8F, "Robert Bosch" },
325c18ec02fSPetter Reinholdtsen 	{ 0x10, "Chip Express" },
326c18ec02fSPetter Reinholdtsen 	{ 0x91, "DATARAM" },
327c18ec02fSPetter Reinholdtsen 	{ 0x92, "United Microelec Corp." },
328c18ec02fSPetter Reinholdtsen 	{ 0x13, "TCSI" },
329c18ec02fSPetter Reinholdtsen 	{ 0x94, "Smart Modular" },
330c18ec02fSPetter Reinholdtsen 	{ 0x15, "Hughes Aircraft" },
331c18ec02fSPetter Reinholdtsen 	{ 0x16, "Lanstar Semiconductor" },
332c18ec02fSPetter Reinholdtsen 	{ 0x97, "Qlogic" },
333c18ec02fSPetter Reinholdtsen 	{ 0x98, "Kingston" },
334c18ec02fSPetter Reinholdtsen 	{ 0x19, "Music Semi" },
335c18ec02fSPetter Reinholdtsen 	{ 0x1A, "Ericsson Components" },
336c18ec02fSPetter Reinholdtsen 	{ 0x9B, "SpaSE" },
337c18ec02fSPetter Reinholdtsen 	{ 0x1C, "Eon Silicon Devices" },
338c18ec02fSPetter Reinholdtsen 	{ 0x9D, "Programmable Micro Corp" },
339c18ec02fSPetter Reinholdtsen 	{ 0x9E, "DoD" },
340c18ec02fSPetter Reinholdtsen 	{ 0x1F, "Integ. Memories Tech." },
341c18ec02fSPetter Reinholdtsen 	{ 0x20, "Corollary Inc." },
342c18ec02fSPetter Reinholdtsen 	{ 0xA1, "Dallas Semiconductor" },
343c18ec02fSPetter Reinholdtsen 	{ 0xA2, "Omnivision" },
344c18ec02fSPetter Reinholdtsen 	{ 0x23, "EIV(Switzerland)" },
345c18ec02fSPetter Reinholdtsen 	{ 0xA4, "Novatel Wireless" },
346c18ec02fSPetter Reinholdtsen 	{ 0x25, "Zarlink (formerly Mitel)" },
347c18ec02fSPetter Reinholdtsen 	{ 0x26, "Clearpoint" },
348c18ec02fSPetter Reinholdtsen 	{ 0xA7, "Cabletron" },
349c18ec02fSPetter Reinholdtsen 	{ 0xA8, "Silicon Technology" },
350c18ec02fSPetter Reinholdtsen 	{ 0x29, "Vanguard" },
351c18ec02fSPetter Reinholdtsen 	{ 0x2A, "Hagiwara Sys-Com" },
352c18ec02fSPetter Reinholdtsen 	{ 0xAB, "Vantis" },
353c18ec02fSPetter Reinholdtsen 	{ 0x2C, "Celestica" },
354c18ec02fSPetter Reinholdtsen 	{ 0xAD, "Century" },
355c18ec02fSPetter Reinholdtsen 	{ 0xAE, "Hal Computers" },
356c18ec02fSPetter Reinholdtsen 	{ 0x2F, "Rohm Company Ltd." },
357c18ec02fSPetter Reinholdtsen 	{ 0xB0, "Juniper Networks" },
358c18ec02fSPetter Reinholdtsen 	{ 0x31, "Libit Signal Processing" },
359c18ec02fSPetter Reinholdtsen 	{ 0x32, "Enhanced Memories Inc." },
360c18ec02fSPetter Reinholdtsen 	{ 0xB3, "Tundra Semiconductor" },
361c18ec02fSPetter Reinholdtsen 	{ 0x34, "Adaptec Inc." },
362c18ec02fSPetter Reinholdtsen 	{ 0xB5, "LightSpeed Semi." },
363c18ec02fSPetter Reinholdtsen 	{ 0xB6, "ZSP Corp." },
364c18ec02fSPetter Reinholdtsen 	{ 0x37, "AMIC Technology" },
365c18ec02fSPetter Reinholdtsen 	{ 0x38, "Adobe Systems" },
366c18ec02fSPetter Reinholdtsen 	{ 0xB9, "Dynachip" },
367c18ec02fSPetter Reinholdtsen 	{ 0xBA, "PNY Electronics" },
368c18ec02fSPetter Reinholdtsen 	{ 0x3B, "Newport Digital" },
369c18ec02fSPetter Reinholdtsen 	{ 0xBC, "MMC Networks" },
370c18ec02fSPetter Reinholdtsen 	{ 0x3D, "T Square" },
371c18ec02fSPetter Reinholdtsen 	{ 0x3E, "Seiko Epson" },
372c18ec02fSPetter Reinholdtsen 	{ 0xBF, "Broadcom" },
373c18ec02fSPetter Reinholdtsen 	{ 0x40, "Viking Components" },
374c18ec02fSPetter Reinholdtsen 	{ 0xC1, "V3 Semiconductor" },
375c18ec02fSPetter Reinholdtsen 	{ 0xC2, "Flextronics (formerly Orbit)" },
376c18ec02fSPetter Reinholdtsen 	{ 0x43, "Suwa Electronics" },
377c18ec02fSPetter Reinholdtsen 	{ 0xC4, "Transmeta" },
378c18ec02fSPetter Reinholdtsen 	{ 0x45, "Micron CMS" },
379c18ec02fSPetter Reinholdtsen 	{ 0x46, "American Computer & Digital Components Inc" },
380c18ec02fSPetter Reinholdtsen 	{ 0xC7, "Enhance 3000 Inc" },
381c18ec02fSPetter Reinholdtsen 	{ 0xC8, "Tower Semiconductor" },
382c18ec02fSPetter Reinholdtsen 	{ 0x49, "CPU Design" },
383c18ec02fSPetter Reinholdtsen 	{ 0x4A, "Price Point" },
384c18ec02fSPetter Reinholdtsen 	{ 0xCB, "Maxim Integrated Product" },
385c18ec02fSPetter Reinholdtsen 	{ 0x4C, "Tellabs" },
386c18ec02fSPetter Reinholdtsen 	{ 0xCD, "Centaur Technology" },
387c18ec02fSPetter Reinholdtsen 	{ 0xCE, "Unigen Corporation" },
388c18ec02fSPetter Reinholdtsen 	{ 0x4F, "Transcend Information" },
389c18ec02fSPetter Reinholdtsen 	{ 0xD0, "Memory Card Technology" },
390c18ec02fSPetter Reinholdtsen 	{ 0x51, "CKD Corporation Ltd." },
391c18ec02fSPetter Reinholdtsen 	{ 0x52, "Capital Instruments, Inc." },
392c18ec02fSPetter Reinholdtsen 	{ 0xD3, "Aica Kogyo, Ltd." },
393c18ec02fSPetter Reinholdtsen 	{ 0x54, "Linvex Technology" },
394c18ec02fSPetter Reinholdtsen 	{ 0xD5, "MSC Vertriebs GmbH" },
395c18ec02fSPetter Reinholdtsen 	{ 0xD6, "AKM Company, Ltd." },
396c18ec02fSPetter Reinholdtsen 	{ 0x57, "Dynamem, Inc." },
397c18ec02fSPetter Reinholdtsen 	{ 0x58, "NERA ASA" },
398c18ec02fSPetter Reinholdtsen 	{ 0xD9, "GSI Technology" },
399c18ec02fSPetter Reinholdtsen 	{ 0xDA, "Dane-Elec (C Memory)" },
400c18ec02fSPetter Reinholdtsen 	{ 0x5B, "Acorn Computers" },
401c18ec02fSPetter Reinholdtsen 	{ 0xDC, "Lara Technology" },
402c18ec02fSPetter Reinholdtsen 	{ 0x5D, "Oak Technology, Inc." },
403c18ec02fSPetter Reinholdtsen 	{ 0x5E, "Itec Memory" },
404c18ec02fSPetter Reinholdtsen 	{ 0xDF, "Tanisys Technology" },
405c18ec02fSPetter Reinholdtsen 	{ 0xE0, "Truevision" },
406c18ec02fSPetter Reinholdtsen 	{ 0x61, "Wintec Industries" },
407c18ec02fSPetter Reinholdtsen 	{ 0x62, "Super PC Memory" },
408c18ec02fSPetter Reinholdtsen 	{ 0xE3, "MGV Memory" },
409c18ec02fSPetter Reinholdtsen 	{ 0x64, "Galvantech" },
410c18ec02fSPetter Reinholdtsen 	{ 0xE5, "Gadzoox Nteworks" },
411c18ec02fSPetter Reinholdtsen 	{ 0xE6, "Multi Dimensional Cons." },
412c18ec02fSPetter Reinholdtsen 	{ 0x67, "GateField" },
413c18ec02fSPetter Reinholdtsen 	{ 0x68, "Integrated Memory System" },
414c18ec02fSPetter Reinholdtsen 	{ 0xE9, "Triscend" },
415c18ec02fSPetter Reinholdtsen 	{ 0xEA, "XaQti" },
416c18ec02fSPetter Reinholdtsen 	{ 0x6B, "Goldenram" },
417c18ec02fSPetter Reinholdtsen 	{ 0xEC, "Clear Logic" },
418c18ec02fSPetter Reinholdtsen 	{ 0x6D, "Cimaron Communications" },
419c18ec02fSPetter Reinholdtsen 	{ 0x6E, "Nippon Steel Semi. Corp." },
420c18ec02fSPetter Reinholdtsen 	{ 0xEF, "Advantage Memory" },
421c18ec02fSPetter Reinholdtsen 	{ 0x70, "AMCC" },
422c18ec02fSPetter Reinholdtsen 	{ 0xF1, "LeCroy" },
423c18ec02fSPetter Reinholdtsen 	{ 0xF2, "Yamaha Corporation" },
424c18ec02fSPetter Reinholdtsen 	{ 0x73, "Digital Microwave" },
425c18ec02fSPetter Reinholdtsen 	{ 0xF4, "NetLogic Microsystems" },
426c18ec02fSPetter Reinholdtsen 	{ 0x75, "MIMOS Semiconductor" },
427c18ec02fSPetter Reinholdtsen 	{ 0x76, "Advanced Fibre" },
428c18ec02fSPetter Reinholdtsen 	{ 0xF7, "BF Goodrich Data." },
429c18ec02fSPetter Reinholdtsen 	{ 0xF8, "Epigram" },
430c18ec02fSPetter Reinholdtsen 	{ 0x79, "Acbel Polytech Inc." },
431c18ec02fSPetter Reinholdtsen 	{ 0x7A, "Apacer Technology" },
432c18ec02fSPetter Reinholdtsen 	{ 0xFB, "Admor Memory" },
433c18ec02fSPetter Reinholdtsen 	{ 0x7C, "FOXCONN" },
434c18ec02fSPetter Reinholdtsen 	{ 0xFD, "Quadratics Superconductor" },
435c18ec02fSPetter Reinholdtsen 	{ 0xFE, "3COM" },
436c18ec02fSPetter Reinholdtsen 	{ 0x00, NULL },
437c18ec02fSPetter Reinholdtsen };
438c18ec02fSPetter Reinholdtsen 
439c18ec02fSPetter Reinholdtsen const struct valstr jedec_id3_vals[] = {
440c18ec02fSPetter Reinholdtsen 	{ 0x01, "Camintonn Corporation" },
441c18ec02fSPetter Reinholdtsen 	{ 0x02, "ISOA Incorporated" },
442c18ec02fSPetter Reinholdtsen 	{ 0x83, "Agate Semiconductor" },
443c18ec02fSPetter Reinholdtsen 	{ 0x04, "ADMtek Incorporated" },
444c18ec02fSPetter Reinholdtsen 	{ 0x85, "HYPERTEC" },
445c18ec02fSPetter Reinholdtsen 	{ 0x86, "Adhoc Technologies" },
446c18ec02fSPetter Reinholdtsen 	{ 0x07, "MOSAID Technologies" },
447c18ec02fSPetter Reinholdtsen 	{ 0x08, "Ardent Technologies" },
448c18ec02fSPetter Reinholdtsen 	{ 0x89, "Switchcore" },
449c18ec02fSPetter Reinholdtsen 	{ 0x8A, "Cisco Systems, Inc." },
450c18ec02fSPetter Reinholdtsen 	{ 0x0B, "Allayer Technologies" },
451c18ec02fSPetter Reinholdtsen 	{ 0x8C, "WorkX AG" },
452c18ec02fSPetter Reinholdtsen 	{ 0x0D, "Oasis Semiconductor" },
453c18ec02fSPetter Reinholdtsen 	{ 0x0E, "Novanet Semiconductor" },
454c18ec02fSPetter Reinholdtsen 	{ 0x8F, "E-M Solutions" },
455c18ec02fSPetter Reinholdtsen 	{ 0x10, "Power General" },
456c18ec02fSPetter Reinholdtsen 	{ 0x91, "Advanced Hardware Arch." },
457c18ec02fSPetter Reinholdtsen 	{ 0x92, "Inova Semiconductors GmbH" },
458c18ec02fSPetter Reinholdtsen 	{ 0x13, "Telocity" },
459c18ec02fSPetter Reinholdtsen 	{ 0x94, "Delkin Devices" },
460c18ec02fSPetter Reinholdtsen 	{ 0x15, "Symagery Microsystems" },
461c18ec02fSPetter Reinholdtsen 	{ 0x16, "C-Port Corporation" },
462c18ec02fSPetter Reinholdtsen 	{ 0x97, "SiberCore Technologies" },
463c18ec02fSPetter Reinholdtsen 	{ 0x98, "Southland Microsystems" },
464c18ec02fSPetter Reinholdtsen 	{ 0x19, "Malleable Technologies" },
465c18ec02fSPetter Reinholdtsen 	{ 0x1A, "Kendin Communications" },
466c18ec02fSPetter Reinholdtsen 	{ 0x9B, "Great Technology Microcomputer" },
467c18ec02fSPetter Reinholdtsen 	{ 0x1C, "Sanmina Corporation" },
468c18ec02fSPetter Reinholdtsen 	{ 0x9D, "HADCO Corporation" },
469c18ec02fSPetter Reinholdtsen 	{ 0x9E, "Corsair" },
470c18ec02fSPetter Reinholdtsen 	{ 0x1F, "Actrans System Inc." },
471c18ec02fSPetter Reinholdtsen 	{ 0x20, "ALPHA Technologies" },
472c18ec02fSPetter Reinholdtsen 	{ 0xA1, "Cygnal Integrated Products Incorporated" },
473c18ec02fSPetter Reinholdtsen 	{ 0xA2, "Artesyn Technologies" },
474c18ec02fSPetter Reinholdtsen 	{ 0x23, "Align Manufacturing" },
475c18ec02fSPetter Reinholdtsen 	{ 0xA4, "Peregrine Semiconductor" },
476c18ec02fSPetter Reinholdtsen 	{ 0x25, "Chameleon Systems" },
477c18ec02fSPetter Reinholdtsen 	{ 0x26, "Aplus Flash Technology" },
478c18ec02fSPetter Reinholdtsen 	{ 0xA7, "MIPS Technologies" },
479c18ec02fSPetter Reinholdtsen 	{ 0xA8, "Chrysalis ITS" },
480c18ec02fSPetter Reinholdtsen 	{ 0x29, "ADTEC Corporation" },
481c18ec02fSPetter Reinholdtsen 	{ 0x2A, "Kentron Technologies" },
482c18ec02fSPetter Reinholdtsen 	{ 0xAB, "Win Technologies" },
483c18ec02fSPetter Reinholdtsen 	{ 0x2C, "ASIC Designs Inc" },
484c18ec02fSPetter Reinholdtsen 	{ 0xAD, "Extreme Packet Devices" },
485c18ec02fSPetter Reinholdtsen 	{ 0xAE, "RF Micro Devices" },
486c18ec02fSPetter Reinholdtsen 	{ 0x2F, "Siemens AG" },
487c18ec02fSPetter Reinholdtsen 	{ 0xB0, "Sarnoff Corporation" },
488c18ec02fSPetter Reinholdtsen 	{ 0x31, "Itautec Philco SA" },
489c18ec02fSPetter Reinholdtsen 	{ 0x32, "Radiata Inc." },
490c18ec02fSPetter Reinholdtsen 	{ 0xB3, "Benchmark Elect. (AVEX)" },
491c18ec02fSPetter Reinholdtsen 	{ 0x34, "Legend" },
492c18ec02fSPetter Reinholdtsen 	{ 0xB5, "SpecTek Incorporated" },
493c18ec02fSPetter Reinholdtsen 	{ 0xB6, "Hi/fn" },
494c18ec02fSPetter Reinholdtsen 	{ 0x37, "Enikia Incorporated" },
495c18ec02fSPetter Reinholdtsen 	{ 0x38, "SwitchOn Networks" },
496c18ec02fSPetter Reinholdtsen 	{ 0xB9, "AANetcom Incorporated" },
497c18ec02fSPetter Reinholdtsen 	{ 0xBA, "Micro Memory Bank" },
498c18ec02fSPetter Reinholdtsen 	{ 0x3B, "ESS Technology" },
499c18ec02fSPetter Reinholdtsen 	{ 0xBC, "Virata Corporation" },
500c18ec02fSPetter Reinholdtsen 	{ 0x3D, "Excess Bandwidth" },
501c18ec02fSPetter Reinholdtsen 	{ 0x3E, "West Bay Semiconductor" },
502c18ec02fSPetter Reinholdtsen 	{ 0xBF, "DSP Group" },
503c18ec02fSPetter Reinholdtsen 	{ 0x40, "Newport Communications" },
504c18ec02fSPetter Reinholdtsen 	{ 0xC1, "Chip2Chip Incorporated" },
505c18ec02fSPetter Reinholdtsen 	{ 0xC2, "Phobos Corporation" },
506c18ec02fSPetter Reinholdtsen 	{ 0x43, "Intellitech Corporation" },
507c18ec02fSPetter Reinholdtsen 	{ 0xC4, "Nordic VLSI ASA" },
508c18ec02fSPetter Reinholdtsen 	{ 0x45, "Ishoni Networks" },
509c18ec02fSPetter Reinholdtsen 	{ 0x46, "Silicon Spice" },
510c18ec02fSPetter Reinholdtsen 	{ 0xC7, "Alchemy Semiconductor" },
511c18ec02fSPetter Reinholdtsen 	{ 0xC8, "Agilent Technologies" },
512c18ec02fSPetter Reinholdtsen 	{ 0x49, "Centillium Communications" },
513c18ec02fSPetter Reinholdtsen 	{ 0x4A, "W.L. Gore" },
514c18ec02fSPetter Reinholdtsen 	{ 0xCB, "HanBit Electronics" },
515c18ec02fSPetter Reinholdtsen 	{ 0x4C, "GlobeSpan" },
516c18ec02fSPetter Reinholdtsen         { 0xCD, "Element 14" },
517c18ec02fSPetter Reinholdtsen 	{ 0xCE, "Pycon" },
518c18ec02fSPetter Reinholdtsen 	{ 0x4F, "Saifun Semiconductors" },
519c18ec02fSPetter Reinholdtsen 	{ 0xD0, "Sibyte, Incorporated" },
520c18ec02fSPetter Reinholdtsen 	{ 0x51, "MetaLink Technologies" },
521c18ec02fSPetter Reinholdtsen 	{ 0x52, "Feiya Technology" },
522c18ec02fSPetter Reinholdtsen 	{ 0xD3, "I & C Technology" },
523c18ec02fSPetter Reinholdtsen 	{ 0x54, "Shikatronics" },
524c18ec02fSPetter Reinholdtsen 	{ 0xD5, "Elektrobit" },
525c18ec02fSPetter Reinholdtsen 	{ 0xD6, "Megic" },
526c18ec02fSPetter Reinholdtsen 	{ 0x57, "Com-Tier" },
527c18ec02fSPetter Reinholdtsen 	{ 0x58, "Malaysia Micro Solutions" },
528c18ec02fSPetter Reinholdtsen 	{ 0xD9, "Hyperchip" },
529c18ec02fSPetter Reinholdtsen 	{ 0xDA, "Gemstone Communications" },
530c18ec02fSPetter Reinholdtsen 	{ 0x5B, "Anadyne Microelectronics" },
531c18ec02fSPetter Reinholdtsen 	{ 0xDC, "3ParData" },
532c18ec02fSPetter Reinholdtsen 	{ 0x5D, "Mellanox Technologies" },
533c18ec02fSPetter Reinholdtsen 	{ 0x5E, "Tenx Technologies" },
534c18ec02fSPetter Reinholdtsen 	{ 0xDF, "Helix AG" },
535c18ec02fSPetter Reinholdtsen 	{ 0xE0, "Domosys" },
536c18ec02fSPetter Reinholdtsen 	{ 0x61, "Skyup Technology" },
537c18ec02fSPetter Reinholdtsen 	{ 0x62, "HiNT Corporation" },
538c18ec02fSPetter Reinholdtsen 	{ 0xE3, "Chiaro" },
539c18ec02fSPetter Reinholdtsen 	{ 0x64, "MCI Computer GMBH" },
540c18ec02fSPetter Reinholdtsen 	{ 0xE5, "Exbit Technology A/S" },
541c18ec02fSPetter Reinholdtsen 	{ 0xE6, "Integrated Technology Express" },
542c18ec02fSPetter Reinholdtsen 	{ 0x67, "AVED Memory" },
543c18ec02fSPetter Reinholdtsen 	{ 0x68, "Legerity" },
544c18ec02fSPetter Reinholdtsen 	{ 0xE9, "Jasmine Networks" },
545c18ec02fSPetter Reinholdtsen 	{ 0xEA, "Caspian Networks" },
546c18ec02fSPetter Reinholdtsen 	{ 0x6B, "nCUBE" },
547c18ec02fSPetter Reinholdtsen 	{ 0xEC, "Silicon Access Networks" },
548c18ec02fSPetter Reinholdtsen 	{ 0x6D, "FDK Corporation" },
549c18ec02fSPetter Reinholdtsen 	{ 0x6E, "High Bandwidth Access" },
550c18ec02fSPetter Reinholdtsen 	{ 0xEF, "MultiLink Technology" },
551c18ec02fSPetter Reinholdtsen 	{ 0x70, "BRECIS" },
552c18ec02fSPetter Reinholdtsen 	{ 0xF1, "World Wide Packets" },
553c18ec02fSPetter Reinholdtsen 	{ 0xF2, "APW" },
554c18ec02fSPetter Reinholdtsen 	{ 0x73, "Chicory Systems" },
555c18ec02fSPetter Reinholdtsen 	{ 0xF4, "Xstream Logic" },
556c18ec02fSPetter Reinholdtsen 	{ 0x75, "Fast-Chip" },
557c18ec02fSPetter Reinholdtsen 	{ 0x76, "Zucotto Wireless" },
558c18ec02fSPetter Reinholdtsen 	{ 0xF7, "Realchip" },
559c18ec02fSPetter Reinholdtsen 	{ 0xF8, "Galaxy Power" },
560c18ec02fSPetter Reinholdtsen 	{ 0x79, "eSilicon" },
561c18ec02fSPetter Reinholdtsen 	{ 0x7A, "Morphics Technology" },
562c18ec02fSPetter Reinholdtsen 	{ 0xFB, "Accelerant Networks" },
563c18ec02fSPetter Reinholdtsen 	{ 0x7C, "Silicon Wave" },
564c18ec02fSPetter Reinholdtsen 	{ 0xFD, "SandCraft" },
565c18ec02fSPetter Reinholdtsen 	{ 0xFE, "Elpida" },
566c18ec02fSPetter Reinholdtsen 	{ 0x00, NULL },
567c18ec02fSPetter Reinholdtsen };
568c18ec02fSPetter Reinholdtsen 
569c18ec02fSPetter Reinholdtsen const struct valstr jedec_id4_vals[] = {
570c18ec02fSPetter Reinholdtsen 	{ 0x01, "Solectron" },
571c18ec02fSPetter Reinholdtsen 	{ 0x02, "Optosys Technologies" },
572c18ec02fSPetter Reinholdtsen 	{ 0x83, "Buffalo (Formerly Melco)" },
573c18ec02fSPetter Reinholdtsen 	{ 0x04, "TriMedia Technologies" },
574c18ec02fSPetter Reinholdtsen 	{ 0x85, "Cyan Technologies" },
575c18ec02fSPetter Reinholdtsen 	{ 0x86, "Global Locate" },
576c18ec02fSPetter Reinholdtsen 	{ 0x07, "Optillion" },
577c18ec02fSPetter Reinholdtsen 	{ 0x08, "Terago Communications" },
578c18ec02fSPetter Reinholdtsen 	{ 0x89, "Ikanos Communications" },
579c18ec02fSPetter Reinholdtsen 	{ 0x8A, "Princeton Technology" },
580c18ec02fSPetter Reinholdtsen 	{ 0x0B, "Nanya Technology" },
581c18ec02fSPetter Reinholdtsen 	{ 0x8C, "Elite Flash Storage" },
582c18ec02fSPetter Reinholdtsen 	{ 0x0D, "Mysticom" },
583c18ec02fSPetter Reinholdtsen 	{ 0x0E, "LightSand Communications" },
584c18ec02fSPetter Reinholdtsen 	{ 0x8F, "ATI Technologies" },
585c18ec02fSPetter Reinholdtsen 	{ 0x10, "Agere Systems" },
586c18ec02fSPetter Reinholdtsen 	{ 0x91, "NeoMagic" },
587c18ec02fSPetter Reinholdtsen 	{ 0x92, "AuroraNetics" },
588c18ec02fSPetter Reinholdtsen 	{ 0x13, "Golden Empire" },
589c18ec02fSPetter Reinholdtsen 	{ 0x94, "Muskin" },
590c18ec02fSPetter Reinholdtsen 	{ 0x15, "Tioga Technologies" },
591c18ec02fSPetter Reinholdtsen 	{ 0x16, "Netlist" },
592c18ec02fSPetter Reinholdtsen 	{ 0x97, "TeraLogic" },
593c18ec02fSPetter Reinholdtsen 	{ 0x98, "Cicada Semiconductor" },
594c18ec02fSPetter Reinholdtsen 	{ 0x19, "Centon Electronics" },
595c18ec02fSPetter Reinholdtsen 	{ 0x1A, "Tyco Electronics" },
596c18ec02fSPetter Reinholdtsen 	{ 0x9B, "Magis Works" },
597c18ec02fSPetter Reinholdtsen 	{ 0x1C, "Zettacom" },
598c18ec02fSPetter Reinholdtsen 	{ 0x9D, "Cogency Semiconductor" },
599c18ec02fSPetter Reinholdtsen 	{ 0x9E, "Chipcon AS" },
600c18ec02fSPetter Reinholdtsen 	{ 0x1F, "Aspex Technology" },
601c18ec02fSPetter Reinholdtsen 	{ 0x20, "F5 Networks" },
602c18ec02fSPetter Reinholdtsen 	{ 0xA1, "Programmable Silicon Solutions" },
603c18ec02fSPetter Reinholdtsen 	{ 0xA2, "ChipWrights" },
604c18ec02fSPetter Reinholdtsen 	{ 0x23, "Acorn Networks" },
605c18ec02fSPetter Reinholdtsen 	{ 0xA4, "Quicklogic" },
606c18ec02fSPetter Reinholdtsen 	{ 0x25, "Kingmax Semiconductor" },
607c18ec02fSPetter Reinholdtsen 	{ 0x26, "BOPS" },
608c18ec02fSPetter Reinholdtsen 	{ 0xA7, "Flasys" },
609c18ec02fSPetter Reinholdtsen 	{ 0xA8, "BitBlitz Communications" },
610c18ec02fSPetter Reinholdtsen 	{ 0x29, "eMemory Technology" },
611c18ec02fSPetter Reinholdtsen 	{ 0x2A, "Procket Networks" },
612c18ec02fSPetter Reinholdtsen 	{ 0xAB, "Purple Ray" },
613c18ec02fSPetter Reinholdtsen 	{ 0x2C, "Trebia Networks" },
614c18ec02fSPetter Reinholdtsen 	{ 0xAD, "Delta Electronics" },
615c18ec02fSPetter Reinholdtsen 	{ 0xAE, "Onex Communications" },
616c18ec02fSPetter Reinholdtsen 	{ 0x2F, "Ample Communications" },
617c18ec02fSPetter Reinholdtsen 	{ 0xB0, "Memory Experts Intl" },
618c18ec02fSPetter Reinholdtsen 	{ 0x31, "Astute Networks" },
619c18ec02fSPetter Reinholdtsen 	{ 0x32, "Azanda Network Devices" },
620c18ec02fSPetter Reinholdtsen 	{ 0xB3, "Dibcom" },
621c18ec02fSPetter Reinholdtsen 	{ 0x34, "Tekmos" },
622c18ec02fSPetter Reinholdtsen 	{ 0xB5, "API NetWorks" },
623c18ec02fSPetter Reinholdtsen 	{ 0xB6, "Bay Microsystems" },
624c18ec02fSPetter Reinholdtsen 	{ 0x37, "Firecron Ltd" },
625c18ec02fSPetter Reinholdtsen 	{ 0x38, "Resonext Communications" },
626c18ec02fSPetter Reinholdtsen 	{ 0xB9, "Tachys Technologies" },
627c18ec02fSPetter Reinholdtsen 	{ 0xBA, "Equator Technology" },
628c18ec02fSPetter Reinholdtsen 	{ 0x3B, "Concept Computer" },
629c18ec02fSPetter Reinholdtsen 	{ 0xBC, "SILCOM" },
630c18ec02fSPetter Reinholdtsen 	{ 0x3D, "3Dlabs" },
631c18ec02fSPetter Reinholdtsen 	{ 0x3E, "ct Magazine" },
632c18ec02fSPetter Reinholdtsen 	{ 0xBF, "Sanera Systems" },
633c18ec02fSPetter Reinholdtsen 	{ 0x40, "Silicon Packets" },
634c18ec02fSPetter Reinholdtsen 	{ 0xC1, "Viasystems Group" },
635c18ec02fSPetter Reinholdtsen 	{ 0xC2, "Simtek" },
636c18ec02fSPetter Reinholdtsen 	{ 0x43, "Semicon Devices Singapore" },
637c18ec02fSPetter Reinholdtsen 	{ 0xC4, "Satron Handelsges" },
638c18ec02fSPetter Reinholdtsen 	{ 0x45, "Improv Systems" },
639c18ec02fSPetter Reinholdtsen 	{ 0x46, "INDUSYS GmbH" },
640c18ec02fSPetter Reinholdtsen 	{ 0xC7, "Corrent" },
641c18ec02fSPetter Reinholdtsen 	{ 0xC8, "Infrant Technologies" },
642c18ec02fSPetter Reinholdtsen 	{ 0x49, "Ritek Corp" },
643c18ec02fSPetter Reinholdtsen 	{ 0x4A, "empowerTel Networks" },
644c18ec02fSPetter Reinholdtsen 	{ 0xCB, "Hypertec" },
645c18ec02fSPetter Reinholdtsen 	{ 0x4C, "Cavium Networks" },
646c18ec02fSPetter Reinholdtsen 	{ 0xCD, "PLX Technology" },
647c18ec02fSPetter Reinholdtsen 	{ 0xCE, "Massana Design" },
648c18ec02fSPetter Reinholdtsen 	{ 0x4F, "Intrinsity" },
649c18ec02fSPetter Reinholdtsen 	{ 0xD0, "Valence Semiconductor" },
650c18ec02fSPetter Reinholdtsen 	{ 0x51, "Terawave Communications" },
651c18ec02fSPetter Reinholdtsen 	{ 0x52, "IceFyre Semiconductor" },
652c18ec02fSPetter Reinholdtsen 	{ 0xD3, "Primarion" },
653c18ec02fSPetter Reinholdtsen 	{ 0x54, "Picochip Designs Ltd" },
654c18ec02fSPetter Reinholdtsen 	{ 0xD5, "Silverback Systems" },
655c18ec02fSPetter Reinholdtsen 	{ 0xD6, "Jade Star Technologies" },
656c18ec02fSPetter Reinholdtsen 	{ 0x57, "Pijnenburg Securealink" },
657c18ec02fSPetter Reinholdtsen 	{ 0x58, "MemorySolutioN" },
658c18ec02fSPetter Reinholdtsen 	{ 0xD9, "Cambridge Silicon Radio" },
659c18ec02fSPetter Reinholdtsen 	{ 0xDA, "Swissbit" },
660c18ec02fSPetter Reinholdtsen 	{ 0x5B, "Nazomi Communications" },
661c18ec02fSPetter Reinholdtsen 	{ 0xDC, "eWave System" },
662c18ec02fSPetter Reinholdtsen 	{ 0x5D, "Rockwell Collins" },
663c18ec02fSPetter Reinholdtsen 	{ 0x5E, "PAION" },
664c18ec02fSPetter Reinholdtsen 	{ 0xDF, "Alphamosaic Ltd" },
665c18ec02fSPetter Reinholdtsen 	{ 0xE0, "Sandburst" },
666c18ec02fSPetter Reinholdtsen 	{ 0x61, "SiCon Video" },
667c18ec02fSPetter Reinholdtsen 	{ 0x62, "NanoAmp Solutions" },
668c18ec02fSPetter Reinholdtsen 	{ 0xE3, "Ericsson Technology" },
669c18ec02fSPetter Reinholdtsen 	{ 0x64, "PrairieComm" },
670c18ec02fSPetter Reinholdtsen 	{ 0xE5, "Mitac International" },
671c18ec02fSPetter Reinholdtsen 	{ 0xE6, "Layer N Networks" },
672c18ec02fSPetter Reinholdtsen 	{ 0x67, "Atsana Semiconductor" },
673c18ec02fSPetter Reinholdtsen 	{ 0x68, "Allegro Networks" },
674c18ec02fSPetter Reinholdtsen 	{ 0xE9, "Marvell Semiconductors" },
675c18ec02fSPetter Reinholdtsen 	{ 0xEA, "Netergy Microelectronic" },
676c18ec02fSPetter Reinholdtsen 	{ 0x6B, "NVIDIA" },
677c18ec02fSPetter Reinholdtsen 	{ 0xEC, "Internet Machines" },
678c18ec02fSPetter Reinholdtsen 	{ 0x6D, "Peak Electronics" },
679c18ec02fSPetter Reinholdtsen 	{ 0xEF, "Accton Technology" },
680c18ec02fSPetter Reinholdtsen 	{ 0x70, "Teradiant Networks" },
681c18ec02fSPetter Reinholdtsen 	{ 0xF1, "Europe Technologies" },
682c18ec02fSPetter Reinholdtsen 	{ 0xF2, "Cortina Systems" },
683c18ec02fSPetter Reinholdtsen 	{ 0x73, "RAM Components" },
684c18ec02fSPetter Reinholdtsen 	{ 0xF4, "Raqia Networks" },
685c18ec02fSPetter Reinholdtsen 	{ 0x75, "ClearSpeed" },
686c18ec02fSPetter Reinholdtsen 	{ 0x76, "Matsushita Battery" },
687c18ec02fSPetter Reinholdtsen 	{ 0xF7, "Xelerated" },
688c18ec02fSPetter Reinholdtsen 	{ 0xF8, "SimpleTech" },
689c18ec02fSPetter Reinholdtsen 	{ 0x79, "Utron Technology" },
690c18ec02fSPetter Reinholdtsen 	{ 0x7A, "Astec International" },
691c18ec02fSPetter Reinholdtsen 	{ 0xFB, "AVM gmbH" },
692c18ec02fSPetter Reinholdtsen 	{ 0x7C, "Redux Communications" },
693c18ec02fSPetter Reinholdtsen 	{ 0xFD, "Dot Hill Systems" },
694c18ec02fSPetter Reinholdtsen 	{ 0xFE, "TeraChip" },
695c18ec02fSPetter Reinholdtsen 	{ 0x00, NULL },
696c18ec02fSPetter Reinholdtsen };
697c18ec02fSPetter Reinholdtsen 
698c18ec02fSPetter Reinholdtsen const struct valstr jedec_id5_vals[] = {
699c18ec02fSPetter Reinholdtsen 	{ 0x01, "T-RAM Incorporated" },
700c18ec02fSPetter Reinholdtsen 	{ 0x02, "Innovics Wireless" },
701c18ec02fSPetter Reinholdtsen 	{ 0x83, "Teknovus" },
702c18ec02fSPetter Reinholdtsen 	{ 0x04, "KeyEye Communications" },
703c18ec02fSPetter Reinholdtsen 	{ 0x85, "Runcom Technologies" },
704c18ec02fSPetter Reinholdtsen 	{ 0x86, "RedSwitch" },
705c18ec02fSPetter Reinholdtsen 	{ 0x07, "Dotcast" },
706c18ec02fSPetter Reinholdtsen 	{ 0x08, "Silicon Mountain Memory" },
707c18ec02fSPetter Reinholdtsen 	{ 0x89, "Signia Technologies" },
708c18ec02fSPetter Reinholdtsen 	{ 0x8A, "Pixim" },
709c18ec02fSPetter Reinholdtsen 	{ 0x0B, "Galazar Networks" },
710c18ec02fSPetter Reinholdtsen 	{ 0x8C, "White Electronic Designs" },
711c18ec02fSPetter Reinholdtsen 	{ 0x0D, "Patriot Scientific" },
712c18ec02fSPetter Reinholdtsen 	{ 0x0E, "Neoaxiom Corporation" },
713c18ec02fSPetter Reinholdtsen 	{ 0x8F, "3Y Power Technology" },
714c18ec02fSPetter Reinholdtsen 	{ 0x10, "Europe Technologies" },
715c18ec02fSPetter Reinholdtsen 	{ 0x91, "Potentia Power Systems" },
716c18ec02fSPetter Reinholdtsen 	{ 0x92, "C-guys Incorporated" },
717c18ec02fSPetter Reinholdtsen 	{ 0x13, "Digital Communications Technology Incorporated" },
718c18ec02fSPetter Reinholdtsen 	{ 0x94, "Silicon-Based Technology" },
719c18ec02fSPetter Reinholdtsen 	{ 0x15, "Fulcrum Microsystems" },
720c18ec02fSPetter Reinholdtsen 	{ 0x16, "Positivo Informatica Ltd" },
721c18ec02fSPetter Reinholdtsen 	{ 0x97, "XIOtech Corporation" },
722c18ec02fSPetter Reinholdtsen 	{ 0x98, "PortalPlayer" },
723c18ec02fSPetter Reinholdtsen 	{ 0x19, "Zhiying Software" },
724c18ec02fSPetter Reinholdtsen 	{ 0x1A, "Direct2Data" },
725c18ec02fSPetter Reinholdtsen 	{ 0x9B, "Phonex Broadband" },
726c18ec02fSPetter Reinholdtsen 	{ 0x1C, "Skyworks Solutions" },
727c18ec02fSPetter Reinholdtsen 	{ 0x9D, "Entropic Communications" },
728c18ec02fSPetter Reinholdtsen 	{ 0x9E, "Pacific Force Technology" },
729c18ec02fSPetter Reinholdtsen 	{ 0x1F, "Zensys A/S" },
730c18ec02fSPetter Reinholdtsen 	{ 0x20, "Legend Silicon Corp." },
731c18ec02fSPetter Reinholdtsen 	{ 0xA1, "sci-worx GmbH" },
732c18ec02fSPetter Reinholdtsen 	{ 0xA2, "Oasis Silicon Systems" },
733c18ec02fSPetter Reinholdtsen 	{ 0x23, "Renesas Technology" },
734c18ec02fSPetter Reinholdtsen 	{ 0xA4, "Raza Microelectronics" },
735c18ec02fSPetter Reinholdtsen 	{ 0x25, "Phyworks" },
736c18ec02fSPetter Reinholdtsen 	{ 0x26, "MediaTek" },
737c18ec02fSPetter Reinholdtsen 	{ 0xA7, "Non-cents Productions" },
738c18ec02fSPetter Reinholdtsen 	{ 0xA8, "US Modular" },
739c18ec02fSPetter Reinholdtsen 	{ 0x29, "Wintegra Ltd" },
740c18ec02fSPetter Reinholdtsen 	{ 0x2A, "Mathstar" },
741c18ec02fSPetter Reinholdtsen 	{ 0xAB, "StarCore" },
742c18ec02fSPetter Reinholdtsen 	{ 0x2C, "Oplus Technologies" },
743c18ec02fSPetter Reinholdtsen 	{ 0xAD, "Mindspeed" },
744c18ec02fSPetter Reinholdtsen 	{ 0xAE, "Just Young Computer" },
745c18ec02fSPetter Reinholdtsen 	{ 0x2F, "Radia Communications" },
746c18ec02fSPetter Reinholdtsen 	{ 0xB0, "OCZ" },
747c18ec02fSPetter Reinholdtsen 	{ 0x31, "Emuzed" },
748c18ec02fSPetter Reinholdtsen 	{ 0x32, "LOGIC Devices" },
749c18ec02fSPetter Reinholdtsen 	{ 0xB3, "Inphi Corporation" },
750c18ec02fSPetter Reinholdtsen 	{ 0x34, "Quake Technologies" },
751c18ec02fSPetter Reinholdtsen 	{ 0xB5, "Vixel" },
752c18ec02fSPetter Reinholdtsen 	{ 0xB6, "SolusTek" },
753c18ec02fSPetter Reinholdtsen 	{ 0x37, "Kongsberg Maritime" },
754c18ec02fSPetter Reinholdtsen 	{ 0x38, "Faraday Technology" },
755c18ec02fSPetter Reinholdtsen 	{ 0xB9, "Altium Ltd." },
756c18ec02fSPetter Reinholdtsen 	{ 0xBA, "Insyte" },
757c18ec02fSPetter Reinholdtsen 	{ 0x3B, "ARM Ltd." },
758c18ec02fSPetter Reinholdtsen 	{ 0xBC, "DigiVision" },
759c18ec02fSPetter Reinholdtsen 	{ 0x3D, "Vativ Technologies" },
760c18ec02fSPetter Reinholdtsen 	{ 0x3E, "Endicott Interconnect Technologies" },
761c18ec02fSPetter Reinholdtsen 	{ 0xBF, "Pericom" },
762c18ec02fSPetter Reinholdtsen 	{ 0x40, "Bandspeed" },
763c18ec02fSPetter Reinholdtsen 	{ 0xC1, "LeWiz Communications" },
764c18ec02fSPetter Reinholdtsen 	{ 0xC2, "CPU Technology" },
765c18ec02fSPetter Reinholdtsen 	{ 0x43, "Ramaxel Technology" },
766c18ec02fSPetter Reinholdtsen 	{ 0xC4, "DSP Group" },
767c18ec02fSPetter Reinholdtsen 	{ 0x45, "Axis Communications" },
768c18ec02fSPetter Reinholdtsen 	{ 0x46, "Legacy Electronics" },
769c18ec02fSPetter Reinholdtsen 	{ 0xC7, "Chrontel" },
770c18ec02fSPetter Reinholdtsen 	{ 0xC8, "Powerchip Semiconductor" },
771c18ec02fSPetter Reinholdtsen 	{ 0x49, "MobilEye Technologies" },
772c18ec02fSPetter Reinholdtsen 	{ 0x4A, "Excel Semiconductor" },
773c18ec02fSPetter Reinholdtsen 	{ 0xCB, "A-DATA Technology" },
774c18ec02fSPetter Reinholdtsen 	{ 0x4C, "VirtualDigm" },
775c18ec02fSPetter Reinholdtsen 	{ 0x00, NULL },
776c18ec02fSPetter Reinholdtsen };
777c18ec02fSPetter Reinholdtsen 
778c18ec02fSPetter Reinholdtsen int
ipmi_spd_print(uint8_t * spd_data,int len)779c18ec02fSPetter Reinholdtsen ipmi_spd_print(uint8_t *spd_data, int len)
780c18ec02fSPetter Reinholdtsen {
78102e4a036SZdenek Styblik 	int k = 0;
78202e4a036SZdenek Styblik 	int ii = 0;
783c18ec02fSPetter Reinholdtsen 
784c18ec02fSPetter Reinholdtsen 	if (len < 92)
785c18ec02fSPetter Reinholdtsen 		return -1; /* we need first 91 bytes to do our thing */
786c18ec02fSPetter Reinholdtsen 
787c18ec02fSPetter Reinholdtsen 	printf(" Memory Type           : %s\n",
788c18ec02fSPetter Reinholdtsen 	       val2str(spd_data[2], spd_memtype_vals));
789c18ec02fSPetter Reinholdtsen 
790c18ec02fSPetter Reinholdtsen 	if (spd_data[2] == 0x0B)	/* DDR3 SDRAM */
791c18ec02fSPetter Reinholdtsen 	{
792c18ec02fSPetter Reinholdtsen 		int iPN;
793c18ec02fSPetter Reinholdtsen 		char *pchPN = spd_data+128;
794c18ec02fSPetter Reinholdtsen 		int sdram_cap = 0;
795c18ec02fSPetter Reinholdtsen 		int pri_bus_width = 0;
796c18ec02fSPetter Reinholdtsen 		int sdram_width = 0;
797c18ec02fSPetter Reinholdtsen 		int ranks = 0;
798c18ec02fSPetter Reinholdtsen 		int mem_size = 0;
799c18ec02fSPetter Reinholdtsen 
800c18ec02fSPetter Reinholdtsen 		if (len < 148)
801c18ec02fSPetter Reinholdtsen 			return -1; /* we need first 91 bytes to do our thing */
802c18ec02fSPetter Reinholdtsen 
803c18ec02fSPetter Reinholdtsen 
804c18ec02fSPetter Reinholdtsen 		sdram_cap = ldexp(256,(spd_data[4]&15));
805c18ec02fSPetter Reinholdtsen 		pri_bus_width = ldexp(8,(spd_data[8]&7));
806c18ec02fSPetter Reinholdtsen 		sdram_width = ldexp(4,(spd_data[7]&7));
807c18ec02fSPetter Reinholdtsen 		ranks = ldexp(1,((spd_data[7]&0x3F)>>3));
808c18ec02fSPetter Reinholdtsen 		mem_size = (sdram_cap/8) * (pri_bus_width/sdram_width) * ranks;
809c18ec02fSPetter Reinholdtsen 		printf(" SDRAM Capacity        : %d MB\n", sdram_cap );
810c18ec02fSPetter Reinholdtsen 		printf(" Memory Banks          : %s\n", val2str(spd_data[4]>>4, ddr3_banks_vals));
811c18ec02fSPetter Reinholdtsen 		printf(" Primary Bus Width     : %d bits\n", pri_bus_width );
812c18ec02fSPetter Reinholdtsen 		printf(" SDRAM Device Width    : %d bits\n", sdram_width );
813c18ec02fSPetter Reinholdtsen 		printf(" Number of Ranks       : %d\n", ranks );
814c18ec02fSPetter Reinholdtsen 		printf(" Memory size           : %d MB\n", mem_size );
815c18ec02fSPetter Reinholdtsen 
816c18ec02fSPetter Reinholdtsen 		/* printf(" Memory Density        : %s\n", val2str(spd_data[4]&15, ddr3_density_vals)); */
817c18ec02fSPetter Reinholdtsen 		printf(" 1.5 V Nominal Op      : %s\n", (((spd_data[6]&1) != 0) ? "No":"Yes" ) );
818c18ec02fSPetter Reinholdtsen 		printf(" 1.35 V Nominal Op     : %s\n", (((spd_data[6]&2) != 0) ? "No":"Yes" ) );
819c18ec02fSPetter Reinholdtsen 		printf(" 1.2X V Nominal Op     : %s\n", (((spd_data[6]&4) != 0) ? "No":"Yes" ) );
820c18ec02fSPetter Reinholdtsen 		printf(" Error Detect/Cor      : %s\n", val2str(spd_data[8]>>3, ddr3_ecc_vals));
821c18ec02fSPetter Reinholdtsen 
822c18ec02fSPetter Reinholdtsen 		printf(" Manufacturer          : ");
823c18ec02fSPetter Reinholdtsen 		switch (spd_data[117]&127)
824c18ec02fSPetter Reinholdtsen 		{
825c18ec02fSPetter Reinholdtsen 		case	0:
826c18ec02fSPetter Reinholdtsen 			printf("%s\n", val2str(spd_data[118], jedec_id1_vals));
827c18ec02fSPetter Reinholdtsen 			break;
828c18ec02fSPetter Reinholdtsen 
829c18ec02fSPetter Reinholdtsen 		case	1:
830c18ec02fSPetter Reinholdtsen 			printf("%s\n", val2str(spd_data[118], jedec_id2_vals));
831c18ec02fSPetter Reinholdtsen 			break;
832c18ec02fSPetter Reinholdtsen 
833c18ec02fSPetter Reinholdtsen 		case	2:
834c18ec02fSPetter Reinholdtsen 			printf("%s\n", val2str(spd_data[118], jedec_id3_vals));
835c18ec02fSPetter Reinholdtsen 			break;
836c18ec02fSPetter Reinholdtsen 
837c18ec02fSPetter Reinholdtsen 		case	3:
838c18ec02fSPetter Reinholdtsen 			printf("%s\n", val2str(spd_data[118], jedec_id4_vals));
839c18ec02fSPetter Reinholdtsen 			break;
840c18ec02fSPetter Reinholdtsen 
841c18ec02fSPetter Reinholdtsen 		case	4:
842c18ec02fSPetter Reinholdtsen 			printf("%s\n", val2str(spd_data[118], jedec_id5_vals));
843c18ec02fSPetter Reinholdtsen 			break;
844c18ec02fSPetter Reinholdtsen 
845c18ec02fSPetter Reinholdtsen 		default:
846c18ec02fSPetter Reinholdtsen 			printf("%s\n", "JEDEC JEP106 update required" );
847c18ec02fSPetter Reinholdtsen 
848c18ec02fSPetter Reinholdtsen 		}
849c18ec02fSPetter Reinholdtsen 
850c18ec02fSPetter Reinholdtsen 		printf(" Manufacture Date      : year %c%c week %c%c\n",
851c18ec02fSPetter Reinholdtsen 		'0'+(spd_data[120]>>4), '0'+(spd_data[120]&15), '0'+(spd_data[121]>>4), '0'+(spd_data[121]&15) );
852c18ec02fSPetter Reinholdtsen 
853c18ec02fSPetter Reinholdtsen 		printf(" Serial Number         : %02x%02x%02x%02x\n",
854c18ec02fSPetter Reinholdtsen 		spd_data[122], spd_data[123], spd_data[124], spd_data[125]);
855c18ec02fSPetter Reinholdtsen 
856c18ec02fSPetter Reinholdtsen 		printf(" Part Number           : ");
857c18ec02fSPetter Reinholdtsen 		for (iPN=0; iPN < 19; iPN++)
858c18ec02fSPetter Reinholdtsen 		{
859c18ec02fSPetter Reinholdtsen 			printf( "%c", *pchPN++ );
860c18ec02fSPetter Reinholdtsen 		}
861c18ec02fSPetter Reinholdtsen 		printf("\n");
86296b19bb6SJim Mankovich 	} else if (spd_data[2] == 0x0C)	/* DDR4 SDRAM */
86396b19bb6SJim Mankovich 	{
86496b19bb6SJim Mankovich 		int i;
86596b19bb6SJim Mankovich 		int sdram_cap = 0;
86696b19bb6SJim Mankovich 		int pri_bus_width = 0;
86796b19bb6SJim Mankovich 		int sdram_width = 0;
86896b19bb6SJim Mankovich 		int mem_size = 0;
86996b19bb6SJim Mankovich 		int lrank_dimm;
870104a7176SZdenek Styblik 		uint32_t year;
871104a7176SZdenek Styblik 		uint32_t week;
87296b19bb6SJim Mankovich 
8739811f79eSJim Mankovich 		if (len < 348)
8749811f79eSJim Mankovich 			return -1;
87596b19bb6SJim Mankovich 
87696b19bb6SJim Mankovich 		/* "Logical rank" referes to the individually addressable die
87796b19bb6SJim Mankovich 		 * in a 3DS stack and has no meaning for monolithic or
87896b19bb6SJim Mankovich 		 * multi-load stacked SDRAMs; however, for the purposes of
87996b19bb6SJim Mankovich 		 * calculating the capacity of the module, one should treat
88096b19bb6SJim Mankovich 		 * monolithic and multi-load stack SDRAMs as having one logical
88196b19bb6SJim Mankovich 		 * rank per package rank.
88296b19bb6SJim Mankovich 		 */
88396b19bb6SJim Mankovich 		lrank_dimm = (spd_data[12]>>3&0x3) + 1; /* Number of Package Ranks per DIMM */
8849811f79eSJim Mankovich 		if ((spd_data[6] & 0x3) == 0x2) { /* 3DS package Type */
88596b19bb6SJim Mankovich 			lrank_dimm *= ((spd_data[6]>>4)&0x3) + 1; /* Die Count */
88696b19bb6SJim Mankovich 		}
88796b19bb6SJim Mankovich 		sdram_cap = ldexp(256,(spd_data[4]&15));
88896b19bb6SJim Mankovich 		pri_bus_width = ldexp(8,(spd_data[13]&7));
88996b19bb6SJim Mankovich 		sdram_width = ldexp(4,(spd_data[12]&7));
89096b19bb6SJim Mankovich 		mem_size = (sdram_cap/8) * (pri_bus_width/sdram_width) * lrank_dimm;
89196b19bb6SJim Mankovich 		printf(" SDRAM Package Type    : %s\n", val2str((spd_data[6]>>7), ddr4_package_type));
89296b19bb6SJim Mankovich 		printf(" Technology            : %s\n", val2str((spd_data[3]&15), ddr4_technology_type));
89396b19bb6SJim Mankovich 		printf(" SDRAM Die Count       : %d\n", ((spd_data[6]>>4) & 3)+1);
89496b19bb6SJim Mankovich 		printf(" SDRAM Capacity        : %d Mb\n", sdram_cap );
89596b19bb6SJim Mankovich 		printf(" Memory Bank Group     : %s\n", val2str((spd_data[4]>>6 & 0x3), ddr4_bank_groups));
89696b19bb6SJim Mankovich 		printf(" Memory Banks          : %s\n", val2str((spd_data[4]>>4 & 0x3), ddr4_banks_vals));
89796b19bb6SJim Mankovich 		printf(" Primary Bus Width     : %d bits\n", pri_bus_width );
89896b19bb6SJim Mankovich 		printf(" SDRAM Device Width    : %d bits\n", sdram_width );
89996b19bb6SJim Mankovich 		printf(" Logical Rank per DIMM : %d\n", lrank_dimm );
90096b19bb6SJim Mankovich 		printf(" Memory size           : %d MB\n", mem_size );
90196b19bb6SJim Mankovich 
90296b19bb6SJim Mankovich 		printf(" Memory Density        : %s\n", val2str(spd_data[4]&15, ddr4_density_vals));
90396b19bb6SJim Mankovich 		printf(" 1.2 V Nominal Op      : %s\n", (((spd_data[11]&3) != 3) ? "No":"Yes" ) );
90496b19bb6SJim Mankovich 		printf(" TBD1 V Nominal Op     : %s\n", (((spd_data[11]>>2&3) != 3) ? "No":"Yes" ) );
90596b19bb6SJim Mankovich 		printf(" TBD2 V Nominal Op     : %s\n", (((spd_data[11]>>4&3) != 3) ? "No":"Yes" ) );
90696b19bb6SJim Mankovich 		printf(" Error Detect/Cor      : %s\n", val2str(spd_data[13]>>3, ddr4_ecc_vals));
90796b19bb6SJim Mankovich 
90896b19bb6SJim Mankovich 		printf(" Manufacturer          : ");
90996b19bb6SJim Mankovich 		switch (spd_data[320]&127)
91096b19bb6SJim Mankovich 		{
91196b19bb6SJim Mankovich 		case	0:
91296b19bb6SJim Mankovich 			printf("%s\n", val2str(spd_data[321], jedec_id1_vals));
91396b19bb6SJim Mankovich 			break;
91496b19bb6SJim Mankovich 
91596b19bb6SJim Mankovich 		case	1:
91696b19bb6SJim Mankovich 			printf("%s\n", val2str(spd_data[321], jedec_id2_vals));
91796b19bb6SJim Mankovich 			break;
91896b19bb6SJim Mankovich 
91996b19bb6SJim Mankovich 		case	2:
92096b19bb6SJim Mankovich 			printf("%s\n", val2str(spd_data[321], jedec_id3_vals));
92196b19bb6SJim Mankovich 			break;
92296b19bb6SJim Mankovich 
92396b19bb6SJim Mankovich 		case	3:
92496b19bb6SJim Mankovich 			printf("%s\n", val2str(spd_data[321], jedec_id4_vals));
92596b19bb6SJim Mankovich 			break;
92696b19bb6SJim Mankovich 
92796b19bb6SJim Mankovich 		case	4:
92896b19bb6SJim Mankovich 			printf("%s\n", val2str(spd_data[321], jedec_id5_vals));
92996b19bb6SJim Mankovich 			break;
93096b19bb6SJim Mankovich 
93196b19bb6SJim Mankovich 		default:
93296b19bb6SJim Mankovich 			printf("%s\n", "JEDEC JEP106 update required");
93396b19bb6SJim Mankovich 
93496b19bb6SJim Mankovich 		}
93596b19bb6SJim Mankovich 
936*bcb96209SZdenek Styblik 		year = ((spd_data[323] >> 4) * 10) + (spd_data[323] & 15);
937*bcb96209SZdenek Styblik 		week = ((spd_data[324]>>4) * 10) + (spd_data[324] & 15);
93896b19bb6SJim Mankovich 		printf(" Manufacture Date      : year %4d week %2d\n",
93996b19bb6SJim Mankovich 		       2000 + year, week);
94096b19bb6SJim Mankovich 
94196b19bb6SJim Mankovich 		printf(" Serial Number         : %02x%02x%02x%02x\n",
94296b19bb6SJim Mankovich 		spd_data[325], spd_data[326], spd_data[327], spd_data[328]);
94396b19bb6SJim Mankovich 
94496b19bb6SJim Mankovich 		printf(" Part Number           : ");
94596b19bb6SJim Mankovich 		for (i=329; i <= 348; i++)
94696b19bb6SJim Mankovich 		{
94796b19bb6SJim Mankovich 			printf( "%c", spd_data[i]);
94896b19bb6SJim Mankovich 		}
94996b19bb6SJim Mankovich 		printf("\n");
950c18ec02fSPetter Reinholdtsen 	}
951c18ec02fSPetter Reinholdtsen 	else
952c18ec02fSPetter Reinholdtsen 	{
953d9acbc4cSZdenek Styblik 		if (len < 100) {
954d9acbc4cSZdenek Styblik 			return (-1);
955d9acbc4cSZdenek Styblik 		}
95602e4a036SZdenek Styblik 		ii = (spd_data[3] & 0x0f) + (spd_data[4] & 0x0f) - 17;
95702e4a036SZdenek Styblik 		k = ((spd_data[5] & 0x7) + 1) * spd_data[17];
95802e4a036SZdenek Styblik 
95902e4a036SZdenek Styblik 		if(ii > 0 && ii <= 12 && k > 0) {
96002e4a036SZdenek Styblik 			printf(" Memory Size           : %d MB\n", ((1 << ii) * k));
96102e4a036SZdenek Styblik 		} else {
96202e4a036SZdenek Styblik 			printf(" Memory Size    INVALID: %d, %d, %d, %d\n", spd_data[3],
96302e4a036SZdenek Styblik 					spd_data[4], spd_data[5], spd_data[17]);
96402e4a036SZdenek Styblik 		}
965c18ec02fSPetter Reinholdtsen 		printf(" Voltage Intf          : %s\n",
966c18ec02fSPetter Reinholdtsen 		val2str(spd_data[8], spd_voltage_vals));
967c18ec02fSPetter Reinholdtsen 		printf(" Error Detect/Cor      : %s\n",
968c18ec02fSPetter Reinholdtsen 		val2str(spd_data[11], spd_config_vals));
969c18ec02fSPetter Reinholdtsen 
970c18ec02fSPetter Reinholdtsen 		/* handle jedec table bank continuation values */
971c18ec02fSPetter Reinholdtsen 		printf(" Manufacturer          : ");
972c18ec02fSPetter Reinholdtsen 		if (spd_data[64] != 0x7f)
973c18ec02fSPetter Reinholdtsen 			printf("%s\n",
974c18ec02fSPetter Reinholdtsen 			val2str(spd_data[64], jedec_id1_vals));
975c18ec02fSPetter Reinholdtsen 		else {
976c18ec02fSPetter Reinholdtsen 			if (spd_data[65] != 0x7f)
977c18ec02fSPetter Reinholdtsen 				printf("%s\n",
978c18ec02fSPetter Reinholdtsen 				val2str(spd_data[65], jedec_id2_vals));
979c18ec02fSPetter Reinholdtsen 			else {
980c18ec02fSPetter Reinholdtsen 				if (spd_data[66] != 0x7f)
981c18ec02fSPetter Reinholdtsen 					printf("%s\n",
982c18ec02fSPetter Reinholdtsen 					val2str(spd_data[66], jedec_id3_vals));
983c18ec02fSPetter Reinholdtsen 				else {
984c18ec02fSPetter Reinholdtsen 					if (spd_data[67] != 0x7f)
985c18ec02fSPetter Reinholdtsen 						printf("%s\n",
986c18ec02fSPetter Reinholdtsen 						val2str(spd_data[67],
987c18ec02fSPetter Reinholdtsen 							jedec_id4_vals));
988c18ec02fSPetter Reinholdtsen 					else
989c18ec02fSPetter Reinholdtsen 						printf("%s\n",
990c18ec02fSPetter Reinholdtsen 						val2str(spd_data[68],
991c18ec02fSPetter Reinholdtsen 							jedec_id5_vals));
992c18ec02fSPetter Reinholdtsen 				}
993c18ec02fSPetter Reinholdtsen 			}
994c18ec02fSPetter Reinholdtsen 		}
995c18ec02fSPetter Reinholdtsen 
996c18ec02fSPetter Reinholdtsen 		if (spd_data[73]) {
997c18ec02fSPetter Reinholdtsen 			char part[19];
998c18ec02fSPetter Reinholdtsen 			memcpy(part, spd_data+73, 18);
999c18ec02fSPetter Reinholdtsen 			part[18] = 0;
1000c18ec02fSPetter Reinholdtsen 			printf(" Part Number           : %s\n", part);
1001c18ec02fSPetter Reinholdtsen 		}
1002c18ec02fSPetter Reinholdtsen 
1003c18ec02fSPetter Reinholdtsen 		printf(" Serial Number         : %02x%02x%02x%02x\n",
1004c18ec02fSPetter Reinholdtsen 		spd_data[95], spd_data[96], spd_data[97], spd_data[98]);
1005c18ec02fSPetter Reinholdtsen 	}
1006c18ec02fSPetter Reinholdtsen 
1007c18ec02fSPetter Reinholdtsen 	if (verbose) {
1008c18ec02fSPetter Reinholdtsen 		printf("\n");
1009c18ec02fSPetter Reinholdtsen 		printbuf(spd_data, len, "SPD DATA");
1010c18ec02fSPetter Reinholdtsen 	}
1011c18ec02fSPetter Reinholdtsen 
1012c18ec02fSPetter Reinholdtsen 	return 0;
1013c18ec02fSPetter Reinholdtsen }
1014c18ec02fSPetter Reinholdtsen 
1015c18ec02fSPetter Reinholdtsen int
ipmi_spd_print_fru(struct ipmi_intf * intf,uint8_t id)1016c18ec02fSPetter Reinholdtsen ipmi_spd_print_fru(struct ipmi_intf * intf, uint8_t id)
1017c18ec02fSPetter Reinholdtsen {
1018c18ec02fSPetter Reinholdtsen 	struct ipmi_rs * rsp;
1019c18ec02fSPetter Reinholdtsen 	struct ipmi_rq req;
1020c18ec02fSPetter Reinholdtsen 	struct fru_info fru;
102196b19bb6SJim Mankovich 	uint8_t *spd_data, msg_data[4];
1022c18ec02fSPetter Reinholdtsen 	int len, offset;
1023c18ec02fSPetter Reinholdtsen 
1024c18ec02fSPetter Reinholdtsen 	msg_data[0] = id;
1025c18ec02fSPetter Reinholdtsen 
1026c18ec02fSPetter Reinholdtsen 	memset(&req, 0, sizeof(req));
1027c18ec02fSPetter Reinholdtsen 	req.msg.netfn = IPMI_NETFN_STORAGE;
1028c18ec02fSPetter Reinholdtsen 	req.msg.cmd = GET_FRU_INFO;
1029c18ec02fSPetter Reinholdtsen 	req.msg.data = msg_data;
1030c18ec02fSPetter Reinholdtsen 	req.msg.data_len = 1;
1031c18ec02fSPetter Reinholdtsen 
1032c18ec02fSPetter Reinholdtsen 	rsp = intf->sendrecv(intf, &req);
1033c18ec02fSPetter Reinholdtsen 	if (rsp == NULL) {
1034c18ec02fSPetter Reinholdtsen 		printf(" Device not present (No Response)\n");
1035c18ec02fSPetter Reinholdtsen 		return -1;
1036c18ec02fSPetter Reinholdtsen 	}
1037c18ec02fSPetter Reinholdtsen 	if (rsp->ccode > 0) {
1038c18ec02fSPetter Reinholdtsen 		printf(" Device not present (%s)\n",
1039c18ec02fSPetter Reinholdtsen 		       val2str(rsp->ccode, completion_code_vals));
1040c18ec02fSPetter Reinholdtsen 		return -1;
1041c18ec02fSPetter Reinholdtsen 	}
1042c18ec02fSPetter Reinholdtsen 
1043c18ec02fSPetter Reinholdtsen 	fru.size = (rsp->data[1] << 8) | rsp->data[0];
1044c18ec02fSPetter Reinholdtsen 	fru.access = rsp->data[2] & 0x1;
1045c18ec02fSPetter Reinholdtsen 
1046c18ec02fSPetter Reinholdtsen 	lprintf(LOG_DEBUG, "fru.size = %d bytes (accessed by %s)",
1047c18ec02fSPetter Reinholdtsen 		fru.size, fru.access ? "words" : "bytes");
1048c18ec02fSPetter Reinholdtsen 
104996b19bb6SJim Mankovich 
1050c18ec02fSPetter Reinholdtsen 	if (fru.size < 1) {
1051c18ec02fSPetter Reinholdtsen 		lprintf(LOG_ERR, " Invalid FRU size %d", fru.size);
1052c18ec02fSPetter Reinholdtsen 		return -1;
1053c18ec02fSPetter Reinholdtsen 	}
1054c18ec02fSPetter Reinholdtsen 
105596b19bb6SJim Mankovich         spd_data = malloc(fru.size);
105696b19bb6SJim Mankovich 
105796b19bb6SJim Mankovich         if (spd_data == NULL) {
105896b19bb6SJim Mankovich 		printf(" Unable to malloc memory for spd array of size=%d\n",
105996b19bb6SJim Mankovich 		       fru.size);
106096b19bb6SJim Mankovich 		return -1;
106196b19bb6SJim Mankovich         }
106296b19bb6SJim Mankovich 
1063c18ec02fSPetter Reinholdtsen 	memset(&req, 0, sizeof(req));
1064c18ec02fSPetter Reinholdtsen 	req.msg.netfn = IPMI_NETFN_STORAGE;
1065c18ec02fSPetter Reinholdtsen 	req.msg.cmd = GET_FRU_DATA;
1066c18ec02fSPetter Reinholdtsen 	req.msg.data = msg_data;
1067c18ec02fSPetter Reinholdtsen 	req.msg.data_len = 4;
1068c18ec02fSPetter Reinholdtsen 
1069c18ec02fSPetter Reinholdtsen 	offset = 0;
107096b19bb6SJim Mankovich 	memset(spd_data, 0, fru.size);
1071c18ec02fSPetter Reinholdtsen 	do {
1072c18ec02fSPetter Reinholdtsen 		msg_data[0] = id;
107396b19bb6SJim Mankovich 		msg_data[1] = offset & 0xFF;
107496b19bb6SJim Mankovich 		msg_data[2] = offset >> 8;
1075c18ec02fSPetter Reinholdtsen 		msg_data[3] = FRU_DATA_RQST_SIZE;
1076c18ec02fSPetter Reinholdtsen 
1077c18ec02fSPetter Reinholdtsen 		rsp = intf->sendrecv(intf, &req);
1078c18ec02fSPetter Reinholdtsen 		if (rsp == NULL) {
1079c18ec02fSPetter Reinholdtsen 			printf(" Device not present (No Response)\n");
108096b19bb6SJim Mankovich                         free(spd_data);
108196b19bb6SJim Mankovich                         spd_data = NULL;
1082c18ec02fSPetter Reinholdtsen 			return -1;
1083c18ec02fSPetter Reinholdtsen 		}
1084c18ec02fSPetter Reinholdtsen 		if (rsp->ccode > 0) {
1085c18ec02fSPetter Reinholdtsen 			printf(" Device not present (%s)\n",
1086c18ec02fSPetter Reinholdtsen 			       val2str(rsp->ccode, completion_code_vals));
1087c18ec02fSPetter Reinholdtsen 
108896b19bb6SJim Mankovich                         free(spd_data);
108996b19bb6SJim Mankovich                         spd_data = NULL;
1090c18ec02fSPetter Reinholdtsen 			/* Timeouts are acceptable. No DIMM in the socket */
1091c18ec02fSPetter Reinholdtsen 			if (rsp->ccode == 0xc3)
1092c18ec02fSPetter Reinholdtsen 				return 1;
1093c18ec02fSPetter Reinholdtsen 
1094c18ec02fSPetter Reinholdtsen 			return -1;
1095c18ec02fSPetter Reinholdtsen 		}
1096c18ec02fSPetter Reinholdtsen 
1097c18ec02fSPetter Reinholdtsen 		len = rsp->data[0];
1098c18ec02fSPetter Reinholdtsen 		memcpy(&spd_data[offset], rsp->data + 1, len);
1099c18ec02fSPetter Reinholdtsen 		offset += len;
1100c18ec02fSPetter Reinholdtsen 	} while (offset < fru.size);
1101c18ec02fSPetter Reinholdtsen 
1102c18ec02fSPetter Reinholdtsen 	/* now print spd info */
1103c18ec02fSPetter Reinholdtsen 	ipmi_spd_print(spd_data, offset);
110496b19bb6SJim Mankovich         free(spd_data);
110596b19bb6SJim Mankovich         spd_data = NULL;
1106c18ec02fSPetter Reinholdtsen 
1107c18ec02fSPetter Reinholdtsen 	return 0;
1108c18ec02fSPetter Reinholdtsen }
1109