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 (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _NV_SGPIO_H
28 #define	_NV_SGPIO_H
29 
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 /*
36  * SGPIO Command Timeout (2000ms, in nsecs)
37  */
38 #define	NV_SGP_CMD_TIMEOUT	2000000000
39 
40 /*
41  * SGPIO Configuration Space Offsets
42  */
43 #define	SGPIO_CSRP	0x58
44 #define	SGPIO_CBP	0x5c
45 
46 
47 /*
48  * SGPIO Command/Status Register
49  */
50 
51 /* Command field - write-only */
52 #define	SGPIO_CSR_CMD_MASK	0x000000e0
53 #define	SGPIO_CSR_CMD_SHFT	5
54 #define	SGPIO_CSR_CMD_SET(y)	(((y) << SGPIO_CSR_CMD_SHFT) & \
55 				    SGPIO_CSR_CMD_MASK)
56 
57 /* Command field values */
58 #define	SGPIO_CMD_RESET		0x0
59 #define	SGPIO_CMD_READ_PARAMS	0x1
60 #define	SGPIO_CMD_READ_DATA	0x2
61 #define	SGPIO_CMD_WRITE_DATA	0x3
62 
63 /* Command Status field - read-only */
64 #define	SGPIO_CSR_CSTAT_MASK	0x00000018
65 #define	SGPIO_CSR_CSTAT_SHFT	3
66 #define	SGPIO_CSR_CSTAT(x)	(((x) & SGPIO_CSR_CSTAT_MASK) >> \
67 				    SGPIO_CSR_CSTAT_SHFT)
68 
69 /* Command Status field values */
70 #define	SGPIO_CMD_OK		0x0
71 #define	SGPIO_CMD_ACTIVE	0x1
72 #define	SGPIO_CMD_ERROR		0x2
73 
74 /* Sequence field - read-only */
75 #define	SGPIO_CSR_SEQ_MASK	0x00000004
76 #define	SGPIO_CSR_SEQ_SHFT	2
77 #define	SGPIO_CSR_SEQ(x)	(((x) & SGPIO_CSR_SEQ_MASK) >> \
78 				    SGPIO_CSR_SEQ_SHFT)
79 
80 /* SGPIO Status field - read-only */
81 #define	SGPIO_CSR_SSTAT_MASK	0x00000003
82 #define	SGPIO_CSR_SSTAT_SHFT	0
83 #define	SGPIO_CSR_SSTAT(x)	(((x) & SGPIO_CSR_SSTAT_MASK) >> \
84 				    SGPIO_CSR_SSTAT_SHFT)
85 
86 /* SGPIO Status field values */
87 #define	SGPIO_STATE_RESET	0x0
88 #define	SGPIO_STATE_OPERATIONAL	0x1
89 #define	SGPIO_STATE_ERROR	0x2
90 
91 
92 /*
93  * SGPIO Control Block
94  * This is not the entire control block.  It stops at the last register
95  * that could possibly be used.
96  */
97 typedef struct nv_sgp_cb {
98 #if defined(__amd64)
99 	uint64_t	sgpio_sr;	/* Scratch Register 0-1 */
100 #else
101 	uint32_t	sgpio_sr;	/* Scratch Register 0-1 */
102 	uint32_t	sgpio_sr1;	/* Scratch Register 0-1 */
103 #endif
104 	uint32_t	sgpio_nvcr;	/* NVIDIA Configuration Register */
105 	uint32_t	sgpio_cr0;	/* Configuration Register 0 */
106 	uint32_t	sgpio_cr1;	/* Configuration Register 1 */
107 	uint32_t	rsrd;
108 	uint32_t	sgpio_gptxcr;	/* General Purpose Transmit */
109 					/* Configuration Register */
110 	uint32_t	sgpio_gprxcr;	/* General Purpose Receive */
111 					/* Configuration Register */
112 	uint32_t	sgpio0_tr;	/* SGPIO 0 Transmit Register */
113 	uint32_t	sgpio1_tr;	/* SGPIO 1 Transmit Register */
114 } nv_sgp_cb_t;
115 
116 
117 /*
118  * NVIDIA Configuration Register (SGPIO_NVCR)
119  * Contains read-only configuration fields that are unique to NVIDIA's
120  * implementation of SGPIO and therefore not defined in SFF8485.
121  */
122 
123 /* Initiator Count */
124 #define	SGP_NVCR_INIT_CNT_MASK	0x0000000f
125 #define	SGP_NVCR_INIT_CNT_SHFT	0
126 #define	SGP_NVCR_INIT_CNT(x)	(((x) & SGP_NVCR_INIT_CNT_MASK) >> \
127 				    SGP_NVCR_INIT_CNT_SHFT)
128 
129 /* fixed value */
130 #define	SGPIO_NVCR_INIT_CNT_VAL	0x2
131 
132 /* Command Block Size */
133 #define	SGP_NVCR_CB_SIZE_MASK	0x0000ff00
134 #define	SGP_NVCR_CB_SIZE_SHFT	8
135 #define	SGP_NVCR_CB_SIZE(x)	(((x) & SGP_NVCR_CB_SIZE_MASK) >> \
136 				    SGP_NVCR_CB_SIZE_SHFT)
137 
138 /* Command Block Version */
139 #define	SGP_NVCR_CB_VERS_MASK	0x00ff0000
140 #define	SGP_NVCR_CB_VERS_SHFT	16
141 #define	SGP_NVCR_CB_VERS(x)	(((x) & SGP_NVCR_CB_VERS_MASK) >> \
142 				    SGP_NVCR_CB_VERS_SHFT)
143 
144 /* current version value */
145 #define	SGP_NVCR_CB_VERSION	0
146 
147 
148 /*
149  * SGPIO Configuration Register 0 (SGPIO_CR0)
150  */
151 
152 /* Version */
153 #define	SGP_CR0_VERS_MASK	0x00000f00
154 #define	SGP_CR0_VERS_SHFT	8
155 #define	SGP_CR0_VERS(x)		(((x) & SGP_CR0_VERS_MASK) >> \
156 				    SGP_CR0_VERS_SHFT)
157 
158 /* fixed value */
159 #define	SGP_CR0_VERSION		0
160 
161 /* Enable - write-only */
162 #define	SGP_CR0_ENABLE_MASK	0x00800000
163 
164 /* CFG Register Count */
165 #define	SGP_CR0_CFG_RC_MASK	0x00700000
166 #define	SGP_CR0_CFG_RC_SHFT	20
167 #define	SGP_CR0_CFG_RC(x)	(((x) & SGP_CR0_CFG_RC_MASK) >> \
168 				    SGP_CR0_CFG_RC_SHFT)
169 
170 /* fixed value */
171 #define	SGPIO_CR_GP_REG_COUNT	0x1
172 
173 /* GP Register Count */
174 #define	SGP_CR0_GP_RC_MASK	0x000f0000
175 #define	SGP_CR0_GP_RC_SHFT	16
176 #define	SGP_CR0_GP_RC(x)	(((x) & SGP_CR0_GP_RC_MASK) >> \
177 				    SGP_CR0_GP_RC_SHFT)
178 
179 /* fixed value */
180 #define	SGPIO_CR_CFG_REG_COUNT	0x2
181 
182 /* Supported Drive Count */
183 #define	SGP_CR0_DRV_CNT_MASK	0xff000000
184 #define	SGP_CR0_DRV_CNT_SHFT	24
185 #define	SGP_CR0_DRV_CNT(x)	(((x) & SGP_CR0_DRV_CNT_MASK) >> \
186 				    SGP_CR0_DRV_CNT_SHFT)
187 
188 /* fixed value */
189 #define	SGPIO_DRV_CNT_VALUE	4
190 
191 /*
192  * SGPIO Configuration Register 1 (SGPIO_CR1)
193  */
194 
195 #ifdef SGPIO_BLINK
196 /*
197  * NVIDIA documents these Blink Generator Rate values.  However,
198  * setting up the LEDs to use these Blink Generators does not result
199  * in blinking LEDs.
200  */
201 
202 /* Blink Generator Rate B */
203 #define	SGPIO_CR1_BGR_B_MASK	0x0000f000
204 #define	SGPIO_CR1_BGR_B_SHFT	12
205 #define	SGPIO_CR1_BGR_B_SET(y)	((y) << SGPIO_CR1_BGR_B_SHFT) & \
206 				    SGPIO_CR1_BGR_B_MASK)
207 
208 /* Blink Generator Rate A */
209 #define	SGPIO_CR1_BGR_A_MASK	0x00000f00
210 #define	SGPIO_CR1_BGR_A_SHFT	8
211 #define	SGPIO_CR1_BGR_A_SET(y)	((y) << SGPIO_CR1_BGR_A_SHFT) & \
212 				    SGPIO_CR1_BGR_A_MASK)
213 
214 /* Blink Generator Rate values */
215 #define	SGPIO_BLK_1_8		0x0	/* 1/8 seconds */
216 #define	SGPIO_BLK_2_8		0x1	/* 2/8 seconds */
217 #define	SGPIO_BLK_3_8		0x2	/* 3/8 seconds */
218 #define	SGPIO_BLK_4_8		0x3	/* 4/8 seconds */
219 #define	SGPIO_BLK_5_8		0x4	/* 5/8 seconds */
220 #define	SGPIO_BLK_6_8		0x5	/* 6/8 seconds */
221 #define	SGPIO_BLK_7_8		0x6	/* 7/8 seconds */
222 #define	SGPIO_BLK_8_8		0x7	/* 8/8 seconds */
223 #define	SGPIO_BLK_9_8		0x8	/* 9/8 seconds */
224 #define	SGPIO_BLK_10_8		0x9	/* 10/8 seconds */
225 #define	SGPIO_BLK_11_8		0xa	/* 11/8 seconds */
226 #define	SGPIO_BLK_12_8		0xb	/* 12/8 seconds */
227 #define	SGPIO_BLK_13_8		0xc	/* 13/8 seconds */
228 #define	SGPIO_BLK_14_8		0xd	/* 14/8 seconds */
229 #define	SGPIO_BLK_15_8		0xe	/* 15/8 seconds */
230 #define	SGPIO_BLK_16_8		0xf	/* 16/8 seconds */
231 #endif	/* SGPIO_BLINK */
232 
233 /*
234  * SGPIO 0 Transmit Register (SGPIO_0_TR)
235  */
236 
237 /* Drive x Activity/Locate/Error */
238 #define	SGPIO0_TR_DRV_SET(y, a)	(((y) & 0xff) << ((3 - (a)) * 8))
239 #define	SGPIO0_TR_DRV_CLR(a)	~(0xff << ((3 - (a)) * 8))
240 #define	SGPIO0_TR_DRV(x, a)	(((x) >> ((3 - (a)) * 8)) & 0xff)
241 #define	TR_ACTIVE_MASK_ALL	0xe0e0e0e0
242 #define	TR_LOCATE_MASK_ALL	0x18181818
243 #define	TR_ERROR_MASK_ALL	0x07070707
244 
245 /* Drive x Activity */
246 #define	TR_ACTIVE_MASK		0xe0
247 #define	TR_ACTIVE_SHFT		5
248 #define	TR_ACTIVE_SET(y)	(((y) << TR_ACTIVE_SHFT) & TR_ACTIVE_MASK)
249 #define	TR_ACTIVE(x)		(((x) & TR_ACTIVE_MASK) >> TR_ACTIVE_SHFT)
250 
251 /* Drive x Activity values */
252 #define	TR_ACTIVE_DISABLE	0x0	/* Disable activity indicator */
253 #define	TR_ACTIVE_ENABLE	0x1	/* Enable activity indicator */
254 #ifdef SGPIO_BLINK
255 #define	TR_ACTIVE_BLINK_A_ON	0x2	/* Select blink generator A, 50% */
256 					/* duty cycle, on for the first */
257 					/* half-cycle, off for the second */
258 					/* half. */
259 #define	TR_ACTIVE_BLINK_A_OFF	0x3	/* Select blink generator A, 50% */
260 					/* duty cycle, off for the first */
261 					/* half-cycle, on for the second */
262 					/* half. */
263 #define	TR_ACTIVE_BLINK_B_ON	0x6	/* Select blink generator B, 50% */
264 					/* duty cycle, on for the first */
265 					/* half-cycle, off for the second */
266 					/* half. */
267 #define	TR_ACTIVE_BLINK_B_OFF	0x7	/* Select blink generator B, 50% */
268 					/* duty cycle, off for the first */
269 					/* half-cycle, on for the second */
270 					/* half. */
271 #endif	/* SGPIO_BLINK */
272 
273 /* Drive x Locate */
274 #define	TR_LOCATE_MASK		0x18
275 #define	TR_LOCATE_SHFT		3
276 #define	TR_LOCATE_SET(y)	(((y) << TR_LOCATE_SHFT) & TR_LOCATE_MASK)
277 #define	TR_LOCATE(x)		(((x) & TR_LOCATE_MASK) >> TR_LOCATE_SHFT)
278 
279 /* Drive x Locate values */
280 #define	TR_LOCATE_DISABLE	0x0	/* Disable locate indicator */
281 #define	TR_LOCATE_ENABLE	0x1	/* Enable locate indicator */
282 #ifdef SGPIO_BLINK
283 #define	TR_LOCATE_BLINK_ON	0x2	/* Select blink generator A, 50% */
284 					/* duty cycle, on for the first */
285 					/* half-cycle, off for the second */
286 					/* half. */
287 #define	TR_LOCATE_BLINK_OFF	0x3	/* Select blink generator A, 50% */
288 					/* duty cycle, off for the first */
289 					/* half-cycle, on for the second */
290 					/* half. */
291 #endif	/* SGPIO_BLINK */
292 
293 /* Drive x Error */
294 #define	TR_ERROR_MASK		0x07
295 #define	TR_ERROR_SHFT		0
296 #define	TR_ERROR_SET(y)		(((y) << TR_ERROR_SHFT) & TR_ERROR_MASK)
297 #define	TR_ERROR(x)		(((x) & TR_ERROR_MASK) >> TR_ERROR_SHFT)
298 
299 /* Drive x Error values */
300 #define	TR_ERROR_DISABLE	0x0	/* Disable error indicator */
301 #define	TR_ERROR_ENABLE		0x1	/* Enable error indicator */
302 #ifdef SGPIO_BLINK
303 #define	TR_ERROR_BLINK_A_ON	0x2	/* Select blink generator A, 50% */
304 					/* duty cycle, on for the first */
305 					/* half-cycle, off for the second */
306 					/* half for error indicator. */
307 #define	TR_ERROR_BLINK_A_OFF	0x3	/* Select blink generator A, 50% */
308 					/* duty cycle, off for the first */
309 					/* half-cycle, on for the second */
310 					/* half for error indicator. */
311 #define	TR_ERROR_BLINK_B_ON	0x6	/* Select blink generator B, 50% */
312 					/* duty cycle, on for the first */
313 					/* half-cycle, off for the second */
314 					/* half for error indicator. */
315 #define	TR_ERROR_BLINK_B_OFF	0x7	/* Select blink generator B, 50% */
316 					/* duty cycle, off for the first */
317 					/* half-cycle, on for the second */
318 					/* half for error indicator. */
319 #endif	/* SGPIO_BLINK */
320 
321 /*
322  * SGPIO 1 Transmit Register (SGPIO_1_TR)
323  */
324 
325 /* Drive x Activity/Locate/Error */
326 #define	SGPIO1_TR_DRV_SET(y, a)	(((y) & 0xff) << ((7 - (a)) * 8))
327 #define	SGPIO1_TR_DRV_CLR(a)	~(0xff << ((7 - (a)) * 8))
328 #define	SGPIO1_TR_DRV(x, a)	(((x) >> ((7 - (a)) * 8)) & 0xff)
329 
330 #ifdef	__cplusplus
331 }
332 #endif
333 
334 #endif /* _NV_SGPIO_H */
335