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