1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SPD_DATA_H
28 #define	_SPD_DATA_H
29 
30 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 #include <stddef.h>
35 #include <sys/types.h>
36 
37 size_t get_sp_sec_hdr(void *sec_hdr, size_t sec_hdr_len);
38 size_t get_sp_seg_hdr(void *seg_hdr, size_t seg_hdr_len);
39 int get_spd_data(int fd, char *spd_data, size_t ctr_len, off_t ctr_offset);
40 int cvrt_dim_data(const char *spd_data, size_t spd_data_len,
41     uchar_t **sp_seg_ptr, size_t *sp_seg_len);
42 
43 enum spd_memtype {
44 	SPDMEM_RESERVED = 0,
45 	SPDMEM_FPM_DRAM,
46 	SPDMEM_EDO,
47 	SPDMEM_PIPE,
48 	SPDMEM_SDRAM,
49 	SPDMEM_ROM,
50 	SPDMEM_SGRAM_DDR,
51 	SPDMEM_SDRAM_DDR,
52 	SPDMEM_DDR2_SDRAM
53 };
54 
55 typedef struct {
56 	uchar_t		spd_len;	/* bytes written by manufacturer */
57 	uchar_t		spd_max_len;	/* total available prom space */
58 	uchar_t		memory_type;	/* e.g. SDRAM DDR = 0x07 */
59 	uchar_t		n_rows;		/* row address bits */
60 	uchar_t		n_cols;		/* column address bits */
61 	uchar_t		n_mod_rows;	/* number of module rows */
62 	uchar_t		ls_data_width;	/* e.g. 72 bits */
63 	uchar_t		ms_data_width;
64 	uchar_t		vddq_if;	/* e.g. SSTL 2.5V = 0x04 */
65 	uchar_t		cycle_time25;	/* cycle time at CAS latency 2.5 */
66 	uchar_t		access_time25;
67 	uchar_t		config;		/* e.g. ECC = 0x02 */
68 	uchar_t		refresh;	/* e.g. 7.8uS & self refresh = 0x82 */
69 	uchar_t		primary_width;
70 	uchar_t		err_chk_width;
71 	uchar_t		tCCD;
72 	uchar_t		burst_lengths;	/* e.g. 2,4,8 = 0x0e */
73 	uchar_t		n_banks;
74 	uchar_t		cas_lat;
75 	uchar_t		cs_lat;
76 	uchar_t		we_lat;
77 	uchar_t		mod_attrs;
78 	uchar_t		dev_attrs;
79 	uchar_t		cycle_time20;	/* cycle time at CAS latency 2.0 */
80 	uchar_t		access_time20;
81 	uchar_t		cycle_time15;
82 	uchar_t		access_time15;
83 	uchar_t		tRP;
84 	uchar_t		tRRD;
85 	uchar_t		tRCD;
86 	uchar_t		tRAS;
87 	uchar_t		mod_row_density;
88 	uchar_t		addr_ip_setup;
89 	uchar_t		addr_ip_hold;
90 	uchar_t		data_ip_setup;
91 	uchar_t		data_ip_hold;
92 	uchar_t		superset[62 - 36];
93 	uchar_t		spd_rev;
94 	uchar_t		chksum_0_62;
95 	uchar_t		jedec[8];
96 	uchar_t		manu_loc;
97 	uchar_t		manu_part_no[91 - 73];
98 	uchar_t		manu_rev_pcb;
99 	uchar_t		manu_rev_comp;
100 	uchar_t		manu_year;
101 	uchar_t		manu_week;
102 	uchar_t		asmb_serial_no[4];
103 	uchar_t		manu_specific[128 - 99];
104 } spd_data_t;
105 
106 /*
107  * sample section and SP segment headers
108  */
109 #define	SP_SEC_HDR	\
110 	{ 0x08, 0x00, 0x01, 0x00,  0x33, 0x01 }
111 
112 #define	SP_SEG_HDR	\
113 	{ 'S', 'P', 0x00, 0x00,  0x41, 0xb6, 0x00, 0x00,  0x00, 0x8d }
114 
115 /*
116  * sample SP segment
117  */
118 #define	SP_DATA	{ \
119 	0xc1, 0x08, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00,  \
120 	0x00, 0x00, 0xf0, 0x00,   0xfb, 0x00, 0x00, 0x00,  \
121 	0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, \
122 	0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, \
123 	0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, \
124 	0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, \
125 	0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, \
126 	0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, \
127 	0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, \
128 	0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00,  \
129 	0x0c, 0x00, 0x00, 0x00,   0x00 }
130 
131 /*
132  * offsets of records in SP_DATA
133  */
134 #define	DIMM_CAP_OFF	2
135 #define	SPD_R_OFF	13
136 
137 /*
138  * offsets of certain fields within SPD-R record
139  */
140 #define	DATA_WIDTH	6
141 #define	MANUF_ID	64
142 #define	MANUF_LOC	66
143 #define	MANUF_YEAR	87
144 #define	MANUF_WEEK	89
145 /* length of complete SPD-R record */
146 #define	SPD_R_LEN	123
147 
148 #ifdef	__cplusplus
149 }
150 #endif
151 
152 #endif	/* _SPD_DATA_H */
153