nv_sgpio.h revision 10336:d12a11a8c2b8
1272343Sngie/*
2272343Sngie * CDDL HEADER START
3272343Sngie *
4272343Sngie * The contents of this file are subject to the terms of the
5272343Sngie * Common Development and Distribution License (the "License").
6272343Sngie * You may not use this file except in compliance with the License.
7272343Sngie *
8272343Sngie * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9272343Sngie * or http://www.opensolaris.org/os/licensing.
10272343Sngie * See the License for the specific language governing permissions
11272343Sngie * and limitations under the License.
12272343Sngie *
13272343Sngie * When distributing Covered Code, include this CDDL HEADER in each
14272343Sngie * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15272343Sngie * If applicable, add the following below this CDDL HEADER, with the
16272343Sngie * fields enclosed by brackets "[]" replaced with your own identifying
17272343Sngie * information: Portions Copyright [yyyy] [name of copyright owner]
18272343Sngie *
19272343Sngie * CDDL HEADER END
20272343Sngie */
21272343Sngie
22272343Sngie/*
23272343Sngie * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24272343Sngie * Use is subject to license terms.
25272343Sngie */
26272343Sngie
27272343Sngie#ifndef _NV_SGPIO_H
28272343Sngie#define	_NV_SGPIO_H
29272343Sngie
30272343Sngie
31272343Sngie#ifdef	__cplusplus
32272343Sngieextern "C" {
33272343Sngie#endif
34272343Sngie
35272343Sngie/*
36272343Sngie * SGPIO Command Timeout (2000ms, in usecs)
37272343Sngie */
38272343Sngie#define	NV_SGP_CMD_TIMEOUT	2000000
39272343Sngie
40272343Sngie/*
41272343Sngie * SGPIO Configuration Space Offsets
42272343Sngie */
43272343Sngie#define	SGPIO_CSRP	0x58
44272343Sngie#define	SGPIO_CBP	0x5c
45272343Sngie
46272343Sngie
47272343Sngie/*
48272343Sngie * SGPIO Command/Status Register
49272343Sngie */
50272343Sngie
51272343Sngie/* Command field - write-only */
52272343Sngie#define	SGPIO_CSR_CMD_MASK	0x000000e0
53272343Sngie#define	SGPIO_CSR_CMD_SHFT	5
54272343Sngie#define	SGPIO_CSR_CMD_SET(y)	(((y) << SGPIO_CSR_CMD_SHFT) & \
55272343Sngie				    SGPIO_CSR_CMD_MASK)
56272343Sngie
57272343Sngie/* Command field values */
58272343Sngie#define	SGPIO_CMD_RESET		0x0
59272343Sngie#define	SGPIO_CMD_READ_PARAMS	0x1
60272343Sngie#define	SGPIO_CMD_READ_DATA	0x2
61272343Sngie#define	SGPIO_CMD_WRITE_DATA	0x3
62272343Sngie
63272343Sngie/* Command Status field - read-only */
64272343Sngie#define	SGPIO_CSR_CSTAT_MASK	0x00000018
65272343Sngie#define	SGPIO_CSR_CSTAT_SHFT	3
66272343Sngie#define	SGPIO_CSR_CSTAT(x)	(((x) & SGPIO_CSR_CSTAT_MASK) >> \
67272343Sngie				    SGPIO_CSR_CSTAT_SHFT)
68272343Sngie
69272343Sngie/* Command Status field values */
70272343Sngie#define	SGPIO_CMD_OK		0x0
71272343Sngie#define	SGPIO_CMD_ACTIVE	0x1
72272343Sngie#define	SGPIO_CMD_ERROR		0x2
73272343Sngie
74272343Sngie/* Sequence field - read-only */
75272343Sngie#define	SGPIO_CSR_SEQ_MASK	0x00000004
76272343Sngie#define	SGPIO_CSR_SEQ_SHFT	2
77272343Sngie#define	SGPIO_CSR_SEQ(x)	(((x) & SGPIO_CSR_SEQ_MASK) >> \
78272343Sngie				    SGPIO_CSR_SEQ_SHFT)
79272343Sngie
80272343Sngie/* SGPIO Status field - read-only */
81272343Sngie#define	SGPIO_CSR_SSTAT_MASK	0x00000003
82272343Sngie#define	SGPIO_CSR_SSTAT_SHFT	0
83272343Sngie#define	SGPIO_CSR_SSTAT(x)	(((x) & SGPIO_CSR_SSTAT_MASK) >> \
84272343Sngie				    SGPIO_CSR_SSTAT_SHFT)
85272343Sngie
86272343Sngie/* SGPIO Status field values */
87272343Sngie#define	SGPIO_STATE_RESET	0x0
88272343Sngie#define	SGPIO_STATE_OPERATIONAL	0x1
89272343Sngie#define	SGPIO_STATE_ERROR	0x2
90272343Sngie
91272343Sngie
92272343Sngie/*
93272343Sngie * SGPIO Control Block
94272343Sngie * This is not the entire control block.  It stops at the last register
95272343Sngie * that could possibly be used.
96272343Sngie */
97272343Sngietypedef struct nv_sgp_cb {
98272343Sngie#if defined(__amd64)
99272343Sngie	uint64_t	sgpio_sr;	/* Scratch Register 0-1 */
100272343Sngie#else
101272343Sngie	uint32_t	sgpio_sr;	/* Scratch Register 0-1 */
102272343Sngie	uint32_t	sgpio_sr1;	/* Scratch Register 0-1 */
103272343Sngie#endif
104272343Sngie	uint32_t	sgpio_nvcr;	/* NVIDIA Configuration Register */
105272343Sngie	uint32_t	sgpio_cr0;	/* Configuration Register 0 */
106272343Sngie	uint32_t	sgpio_cr1;	/* Configuration Register 1 */
107272343Sngie	uint32_t	rsrd;
108272343Sngie	uint32_t	sgpio_gptxcr;	/* General Purpose Transmit */
109272343Sngie					/* Configuration Register */
110272343Sngie	uint32_t	sgpio_gprxcr;	/* General Purpose Receive */
111272343Sngie					/* Configuration Register */
112272343Sngie	uint32_t	sgpio0_tr;	/* SGPIO 0 Transmit Register */
113272343Sngie	uint32_t	sgpio1_tr;	/* SGPIO 1 Transmit Register */
114272343Sngie} nv_sgp_cb_t;
115272343Sngie
116272343Sngie
117272343Sngie/*
118272343Sngie * NVIDIA Configuration Register (SGPIO_NVCR)
119272343Sngie * Contains read-only configuration fields that are unique to NVIDIA's
120272343Sngie * implementation of SGPIO and therefore not defined in SFF8485.
121272343Sngie */
122272343Sngie
123272343Sngie/* Initiator Count */
124272343Sngie#define	SGP_NVCR_INIT_CNT_MASK	0x0000000f
125272343Sngie#define	SGP_NVCR_INIT_CNT_SHFT	0
126272343Sngie#define	SGP_NVCR_INIT_CNT(x)	(((x) & SGP_NVCR_INIT_CNT_MASK) >> \
127272343Sngie				    SGP_NVCR_INIT_CNT_SHFT)
128272343Sngie
129272343Sngie/* fixed value */
130272343Sngie#define	SGPIO_NVCR_INIT_CNT_VAL	0x2
131272343Sngie
132272343Sngie/* Command Block Size */
133272343Sngie#define	SGP_NVCR_CB_SIZE_MASK	0x0000ff00
134272343Sngie#define	SGP_NVCR_CB_SIZE_SHFT	8
135272343Sngie#define	SGP_NVCR_CB_SIZE(x)	(((x) & SGP_NVCR_CB_SIZE_MASK) >> \
136272343Sngie				    SGP_NVCR_CB_SIZE_SHFT)
137272343Sngie
138272343Sngie/* Command Block Version */
139272343Sngie#define	SGP_NVCR_CB_VERS_MASK	0x00ff0000
140272343Sngie#define	SGP_NVCR_CB_VERS_SHFT	16
141272343Sngie#define	SGP_NVCR_CB_VERS(x)	(((x) & SGP_NVCR_CB_VERS_MASK) >> \
142272343Sngie				    SGP_NVCR_CB_VERS_SHFT)
143272343Sngie
144272343Sngie/* current version value */
145272343Sngie#define	SGP_NVCR_CB_VERSION	0
146272343Sngie
147272343Sngie
148272343Sngie/*
149272343Sngie * SGPIO Configuration Register 0 (SGPIO_CR0)
150272343Sngie */
151272343Sngie
152272343Sngie/* Version */
153272343Sngie#define	SGP_CR0_VERS_MASK	0x00000f00
154272343Sngie#define	SGP_CR0_VERS_SHFT	8
155272343Sngie#define	SGP_CR0_VERS(x)		(((x) & SGP_CR0_VERS_MASK) >> \
156272343Sngie				    SGP_CR0_VERS_SHFT)
157272343Sngie
158272343Sngie/* fixed value */
159272343Sngie#define	SGP_CR0_VERSION		0
160272343Sngie
161272343Sngie/* Enable - write-only */
162272343Sngie#define	SGP_CR0_ENABLE_MASK	0x00800000
163272343Sngie
164272343Sngie/* CFG Register Count */
165272343Sngie#define	SGP_CR0_CFG_RC_MASK	0x00700000
166272343Sngie#define	SGP_CR0_CFG_RC_SHFT	20
167272343Sngie#define	SGP_CR0_CFG_RC(x)	(((x) & SGP_CR0_CFG_RC_MASK) >> \
168272343Sngie				    SGP_CR0_CFG_RC_SHFT)
169272343Sngie
170272343Sngie/* fixed value */
171272343Sngie#define	SGPIO_CR_GP_REG_COUNT	0x1
172272343Sngie
173272343Sngie/* GP Register Count */
174272343Sngie#define	SGP_CR0_GP_RC_MASK	0x000f0000
175272343Sngie#define	SGP_CR0_GP_RC_SHFT	16
176272343Sngie#define	SGP_CR0_GP_RC(x)	(((x) & SGP_CR0_GP_RC_MASK) >> \
177272343Sngie				    SGP_CR0_GP_RC_SHFT)
178272343Sngie
179272343Sngie/* fixed value */
180272343Sngie#define	SGPIO_CR_CFG_REG_COUNT	0x2
181272343Sngie
182272343Sngie/* Supported Drive Count */
183272343Sngie#define	SGP_CR0_DRV_CNT_MASK	0xff000000
184272343Sngie#define	SGP_CR0_DRV_CNT_SHFT	24
185272343Sngie#define	SGP_CR0_DRV_CNT(x)	(((x) & SGP_CR0_DRV_CNT_MASK) >> \
186272343Sngie				    SGP_CR0_DRV_CNT_SHFT)
187272343Sngie
188272343Sngie/* fixed value */
189272343Sngie#define	SGPIO_DRV_CNT_VALUE	4
190272343Sngie
191272343Sngie/*
192272343Sngie * SGPIO Configuration Register 1 (SGPIO_CR1)
193272343Sngie */
194272343Sngie
195272343Sngie#ifdef SGPIO_BLINK
196272343Sngie/*
197272343Sngie * NVIDIA documents these Blink Generator Rate values.  However,
198272343Sngie * setting up the LEDs to use these Blink Generators does not result
199272343Sngie * in blinking LEDs.
200272343Sngie */
201272343Sngie
202272343Sngie/* Blink Generator Rate B */
203272343Sngie#define	SGPIO_CR1_BGR_B_MASK	0x0000f000
204272343Sngie#define	SGPIO_CR1_BGR_B_SHFT	12
205272343Sngie#define	SGPIO_CR1_BGR_B_SET(y)	((y) << SGPIO_CR1_BGR_B_SHFT) & \
206272343Sngie				    SGPIO_CR1_BGR_B_MASK)
207272343Sngie
208272343Sngie/* Blink Generator Rate A */
209272343Sngie#define	SGPIO_CR1_BGR_A_MASK	0x00000f00
210272343Sngie#define	SGPIO_CR1_BGR_A_SHFT	8
211272343Sngie#define	SGPIO_CR1_BGR_A_SET(y)	((y) << SGPIO_CR1_BGR_A_SHFT) & \
212272343Sngie				    SGPIO_CR1_BGR_A_MASK)
213272343Sngie
214272343Sngie/* Blink Generator Rate values */
215272343Sngie#define	SGPIO_BLK_1_8		0x0	/* 1/8 seconds */
216272343Sngie#define	SGPIO_BLK_2_8		0x1	/* 2/8 seconds */
217272343Sngie#define	SGPIO_BLK_3_8		0x2	/* 3/8 seconds */
218272343Sngie#define	SGPIO_BLK_4_8		0x3	/* 4/8 seconds */
219272343Sngie#define	SGPIO_BLK_5_8		0x4	/* 5/8 seconds */
220272343Sngie#define	SGPIO_BLK_6_8		0x5	/* 6/8 seconds */
221272343Sngie#define	SGPIO_BLK_7_8		0x6	/* 7/8 seconds */
222272343Sngie#define	SGPIO_BLK_8_8		0x7	/* 8/8 seconds */
223272343Sngie#define	SGPIO_BLK_9_8		0x8	/* 9/8 seconds */
224272343Sngie#define	SGPIO_BLK_10_8		0x9	/* 10/8 seconds */
225272343Sngie#define	SGPIO_BLK_11_8		0xa	/* 11/8 seconds */
226272343Sngie#define	SGPIO_BLK_12_8		0xb	/* 12/8 seconds */
227272343Sngie#define	SGPIO_BLK_13_8		0xc	/* 13/8 seconds */
228272343Sngie#define	SGPIO_BLK_14_8		0xd	/* 14/8 seconds */
229272343Sngie#define	SGPIO_BLK_15_8		0xe	/* 15/8 seconds */
230272343Sngie#define	SGPIO_BLK_16_8		0xf	/* 16/8 seconds */
231272343Sngie#endif	/* SGPIO_BLINK */
232272343Sngie
233272343Sngie/*
234272343Sngie * SGPIO 0 Transmit Register (SGPIO_0_TR)
235272343Sngie */
236272343Sngie
237272343Sngie/* Drive x Activity/Locate/Error */
238272343Sngie#define	SGPIO0_TR_DRV_SET(y, a)	(((y) & 0xff) << ((3 - (a)) * 8))
239272343Sngie#define	SGPIO0_TR_DRV_CLR(a)	~(0xff << ((3 - (a)) * 8))
240272343Sngie#define	SGPIO0_TR_DRV(x, a)	(((x) >> ((3 - (a)) * 8)) & 0xff)
241272343Sngie#define	TR_ACTIVE_MASK_ALL	0xe0e0e0e0
242272343Sngie#define	TR_LOCATE_MASK_ALL	0x18181818
243272343Sngie#define	TR_ERROR_MASK_ALL	0x07070707
244272343Sngie
245272343Sngie/* Drive x Activity */
246272343Sngie#define	TR_ACTIVE_MASK		0xe0
247272343Sngie#define	TR_ACTIVE_SHFT		5
248272343Sngie#define	TR_ACTIVE_SET(y)	(((y) << TR_ACTIVE_SHFT) & TR_ACTIVE_MASK)
249272343Sngie#define	TR_ACTIVE(x)		(((x) & TR_ACTIVE_MASK) >> TR_ACTIVE_SHFT)
250272343Sngie
251272343Sngie/* Drive x Activity values */
252272343Sngie#define	TR_ACTIVE_DISABLE	0x0	/* Disable activity indicator */
253272343Sngie#define	TR_ACTIVE_ENABLE	0x1	/* Enable activity indicator */
254272343Sngie#ifdef SGPIO_BLINK
255272343Sngie#define	TR_ACTIVE_BLINK_A_ON	0x2	/* Select blink generator A, 50% */
256272343Sngie					/* duty cycle, on for the first */
257272343Sngie					/* half-cycle, off for the second */
258272343Sngie					/* half. */
259272343Sngie#define	TR_ACTIVE_BLINK_A_OFF	0x3	/* Select blink generator A, 50% */
260272343Sngie					/* duty cycle, off for the first */
261272343Sngie					/* half-cycle, on for the second */
262272343Sngie					/* half. */
263272343Sngie#define	TR_ACTIVE_BLINK_B_ON	0x6	/* Select blink generator B, 50% */
264272343Sngie					/* duty cycle, on for the first */
265272343Sngie					/* half-cycle, off for the second */
266272343Sngie					/* half. */
267272343Sngie#define	TR_ACTIVE_BLINK_B_OFF	0x7	/* Select blink generator B, 50% */
268272343Sngie					/* duty cycle, off for the first */
269272343Sngie					/* half-cycle, on for the second */
270272343Sngie					/* half. */
271272343Sngie#endif	/* SGPIO_BLINK */
272272343Sngie
273272343Sngie/* Drive x Locate */
274272343Sngie#define	TR_LOCATE_MASK		0x18
275272343Sngie#define	TR_LOCATE_SHFT		3
276272343Sngie#define	TR_LOCATE_SET(y)	(((y) << TR_LOCATE_SHFT) & TR_LOCATE_MASK)
277272343Sngie#define	TR_LOCATE(x)		(((x) & TR_LOCATE_MASK) >> TR_LOCATE_SHFT)
278272343Sngie
279272343Sngie/* Drive x Locate values */
280272343Sngie#define	TR_LOCATE_DISABLE	0x0	/* Disable locate indicator */
281272343Sngie#define	TR_LOCATE_ENABLE	0x1	/* Enable locate indicator */
282272343Sngie#ifdef SGPIO_BLINK
283272343Sngie#define	TR_LOCATE_BLINK_ON	0x2	/* Select blink generator A, 50% */
284272343Sngie					/* duty cycle, on for the first */
285272343Sngie					/* half-cycle, off for the second */
286272343Sngie					/* half. */
287272343Sngie#define	TR_LOCATE_BLINK_OFF	0x3	/* Select blink generator A, 50% */
288272343Sngie					/* duty cycle, off for the first */
289272343Sngie					/* half-cycle, on for the second */
290272343Sngie					/* half. */
291272343Sngie#endif	/* SGPIO_BLINK */
292272343Sngie
293272343Sngie/* Drive x Error */
294272343Sngie#define	TR_ERROR_MASK		0x07
295272343Sngie#define	TR_ERROR_SHFT		0
296272343Sngie#define	TR_ERROR_SET(y)		(((y) << TR_ERROR_SHFT) & TR_ERROR_MASK)
297272343Sngie#define	TR_ERROR(x)		(((x) & TR_ERROR_MASK) >> TR_ERROR_SHFT)
298272343Sngie
299272343Sngie/* Drive x Error values */
300272343Sngie#define	TR_ERROR_DISABLE	0x0	/* Disable error indicator */
301272343Sngie#define	TR_ERROR_ENABLE		0x1	/* Enable error indicator */
302272343Sngie#ifdef SGPIO_BLINK
303272343Sngie#define	TR_ERROR_BLINK_A_ON	0x2	/* Select blink generator A, 50% */
304272343Sngie					/* duty cycle, on for the first */
305272343Sngie					/* half-cycle, off for the second */
306272343Sngie					/* half for error indicator. */
307272343Sngie#define	TR_ERROR_BLINK_A_OFF	0x3	/* Select blink generator A, 50% */
308272343Sngie					/* duty cycle, off for the first */
309272343Sngie					/* half-cycle, on for the second */
310272343Sngie					/* half for error indicator. */
311272343Sngie#define	TR_ERROR_BLINK_B_ON	0x6	/* Select blink generator B, 50% */
312272343Sngie					/* duty cycle, on for the first */
313272343Sngie					/* half-cycle, off for the second */
314272343Sngie					/* half for error indicator. */
315272343Sngie#define	TR_ERROR_BLINK_B_OFF	0x7	/* Select blink generator B, 50% */
316272343Sngie					/* duty cycle, off for the first */
317272343Sngie					/* half-cycle, on for the second */
318272343Sngie					/* half for error indicator. */
319272343Sngie#endif	/* SGPIO_BLINK */
320272343Sngie
321272343Sngie/*
322272343Sngie * SGPIO 1 Transmit Register (SGPIO_1_TR)
323272343Sngie */
324272343Sngie
325272343Sngie/* Drive x Activity/Locate/Error */
326272343Sngie#define	SGPIO1_TR_DRV_SET(y, a)	(((y) & 0xff) << ((7 - (a)) * 8))
327272343Sngie#define	SGPIO1_TR_DRV_CLR(a)	~(0xff << ((7 - (a)) * 8))
328272343Sngie#define	SGPIO1_TR_DRV(x, a)	(((x) >> ((7 - (a)) * 8)) & 0xff)
329272343Sngie
330272343Sngie#ifdef	__cplusplus
331272343Sngie}
332272343Sngie#endif
333272343Sngie
334272343Sngie#endif /* _NV_SGPIO_H */
335272343Sngie