1*03831d35Sstevel /*
2*03831d35Sstevel  * CDDL HEADER START
3*03831d35Sstevel  *
4*03831d35Sstevel  * The contents of this file are subject to the terms of the
5*03831d35Sstevel  * Common Development and Distribution License (the "License").
6*03831d35Sstevel  * You may not use this file except in compliance with the License.
7*03831d35Sstevel  *
8*03831d35Sstevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*03831d35Sstevel  * or http://www.opensolaris.org/os/licensing.
10*03831d35Sstevel  * See the License for the specific language governing permissions
11*03831d35Sstevel  * and limitations under the License.
12*03831d35Sstevel  *
13*03831d35Sstevel  * When distributing Covered Code, include this CDDL HEADER in each
14*03831d35Sstevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*03831d35Sstevel  * If applicable, add the following below this CDDL HEADER, with the
16*03831d35Sstevel  * fields enclosed by brackets "[]" replaced with your own identifying
17*03831d35Sstevel  * information: Portions Copyright [yyyy] [name of copyright owner]
18*03831d35Sstevel  *
19*03831d35Sstevel  * CDDL HEADER END
20*03831d35Sstevel  */
21*03831d35Sstevel 
22*03831d35Sstevel /*
23*03831d35Sstevel  * Copyright 2001 Sun Microsystems, Inc.  All rights reserved.
24*03831d35Sstevel  * Use is subject to license terms.
25*03831d35Sstevel  */
26*03831d35Sstevel 
27*03831d35Sstevel #ifndef	_SYS_SGHSC_H
28*03831d35Sstevel #define	_SYS_SGHSC_H
29*03831d35Sstevel 
30*03831d35Sstevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*03831d35Sstevel 
32*03831d35Sstevel #ifdef	__cplusplus
33*03831d35Sstevel extern "C" {
34*03831d35Sstevel #endif
35*03831d35Sstevel 
36*03831d35Sstevel /*
37*03831d35Sstevel  * Serengeti CompactPCI Hot Swap Controller Driver header file. This file is
38*03831d35Sstevel  * structured in a following way: common, sghsc data (defines and structures)
39*03831d35Sstevel  * and mailbox related data (defines and structures).
40*03831d35Sstevel  */
41*03831d35Sstevel 
42*03831d35Sstevel #include <sys/hotplug/hpctrl.h>
43*03831d35Sstevel #include <sys/hotplug/hpcsvc.h>
44*03831d35Sstevel #include <sys/sgsbbc_mailbox.h>
45*03831d35Sstevel 
46*03831d35Sstevel /*
47*03831d35Sstevel  * sghsc node path with insert placeholders
48*03831d35Sstevel  */
49*03831d35Sstevel #define	SGHSC_PATH		"/ssm@%x,0/pci@%x,%x00000"
50*03831d35Sstevel 
51*03831d35Sstevel /*
52*03831d35Sstevel  * Mutex short hands
53*03831d35Sstevel  */
54*03831d35Sstevel #define	SGHSC_MUTEX(sghsc) \
55*03831d35Sstevel 	(&sghsc->sghsc_mutex)
56*03831d35Sstevel #define	SGHSC_MUTEX_OWNED(sghsc) \
57*03831d35Sstevel 	mutex_owned(SGHSC_MUTEX(sghsc))
58*03831d35Sstevel #define	SGHSC_MUTEX_ENTER(sghsc) \
59*03831d35Sstevel 	mutex_enter(SGHSC_MUTEX(sghsc))
60*03831d35Sstevel #define	SGHSC_MUTEX_EXIT(sghsc) \
61*03831d35Sstevel 	mutex_exit(SGHSC_MUTEX(sghsc))
62*03831d35Sstevel 
63*03831d35Sstevel #define	SGHSC_SLOT_MUTEX(sghsc, slot_num) \
64*03831d35Sstevel 	(&sghsc->sghsc_slot_table[slot_num]->slot_mutex)
65*03831d35Sstevel #define	SGHSC_SLOT_MUTEX_OWNED(sghsc, slot_num) \
66*03831d35Sstevel 	mutex_owned(SGHSC_SLOT_MUTEX(sghsc, slot_num));
67*03831d35Sstevel #define	SGHSC_SLOT_MUTEX_ENTER(sghsc, slot_num) \
68*03831d35Sstevel 	mutex_enter(SGHSC_SLOT_MUTEX(sghsc, slot_num));
69*03831d35Sstevel #define	SGHSC_SLOT_MUTEX_EXIT(sghsc, slot_num) \
70*03831d35Sstevel 	mutex_exit(SGHSC_SLOT_MUTEX(sghsc, slot_num));
71*03831d35Sstevel 
72*03831d35Sstevel /*
73*03831d35Sstevel  * Misc definitions
74*03831d35Sstevel  */
75*03831d35Sstevel #define	SGHSC_ALL_SLOTS_ENABLE	0x3F
76*03831d35Sstevel #define	SGHSC_SLOT_ENABLE	0x01
77*03831d35Sstevel #define	SGHSC_ALL_SLOTS_DISABLE	0x02
78*03831d35Sstevel #define	SGHSC_SLOT_DISABLE	0x03
79*03831d35Sstevel #define	SGHSC_ALL_LEDS_ENABLE	0x3F3F
80*03831d35Sstevel #define	SGHSC_LED_ENABLE	0x04
81*03831d35Sstevel #define	SGHSC_ALL_LEDS_DISABLE	0x05
82*03831d35Sstevel #define	SGHSC_LED_DISABLE	0x06
83*03831d35Sstevel #define	SGHSC_LED_BLINKING	0x07
84*03831d35Sstevel #define	SGHSC_SLOT_ISOLATE	0x08
85*03831d35Sstevel #define	SGHSC_SLOT_POWER	0x09
86*03831d35Sstevel #define	SGHSC_LED_ENABLE_MASK	0x0000FFFF
87*03831d35Sstevel #define	SGHSC_SAFARI_ID_EVEN	0x3fe
88*03831d35Sstevel 
89*03831d35Sstevel 
90*03831d35Sstevel /* Individual events definitions */
91*03831d35Sstevel #define	SGHSC_EVENT_CARD_INSERT		0x1
92*03831d35Sstevel #define	SGHSC_EVENT_CARD_REMOVE		0x2
93*03831d35Sstevel #define	SGHSC_EVENT_LEVER_ACTION	0x3
94*03831d35Sstevel #define	SGHSC_EVENT_HEALTHY_LOST	0x4
95*03831d35Sstevel #define	SGHSC_EVENT_POWER_ON		0x5
96*03831d35Sstevel #define	SGHSC_EVENT_POWER_OFF		0x6
97*03831d35Sstevel 
98*03831d35Sstevel /* Slot flags */
99*03831d35Sstevel #define	SGHSC_SLOT_AUTO_CFG_EN	0x1
100*03831d35Sstevel #define	SGHSC_SLOT_HEALTHY_LOST	0x2
101*03831d35Sstevel 
102*03831d35Sstevel /* LED definitions */
103*03831d35Sstevel #define	SGHSC_POWER_LED		0x10
104*03831d35Sstevel #define	SGHSC_FAULT_LED		0x20
105*03831d35Sstevel #define	SGHSC_ACTIVE_LED	0x40
106*03831d35Sstevel #define	SGHSC_ATTN_LED		0x80
107*03831d35Sstevel 
108*03831d35Sstevel /* Ring buffer size, has to be power of 2 */
109*03831d35Sstevel #define	SGHSC_RING_BUFFER_SZ	0x10
110*03831d35Sstevel 
111*03831d35Sstevel /*
112*03831d35Sstevel  * Per Hot Swappable Slot info
113*03831d35Sstevel  */
114*03831d35Sstevel typedef struct sghsc_slot {
115*03831d35Sstevel 
116*03831d35Sstevel 	/*
117*03831d35Sstevel 	 * Mutex for each slots for state change
118*03831d35Sstevel 	 */
119*03831d35Sstevel 	kmutex_t		slot_mutex;
120*03831d35Sstevel 
121*03831d35Sstevel 	/*
122*03831d35Sstevel 	 * pathname of bus node
123*03831d35Sstevel 	 */
124*03831d35Sstevel 	char nexus_path[MAXPATHLEN];
125*03831d35Sstevel 
126*03831d35Sstevel 	/*
127*03831d35Sstevel 	 * property, status, cap  for each slot
128*03831d35Sstevel 	 */
129*03831d35Sstevel 	hpc_slot_info_t		slot_info;
130*03831d35Sstevel 	hpc_slot_state_t	slot_status;
131*03831d35Sstevel 	uint32_t		slot_capb;
132*03831d35Sstevel 
133*03831d35Sstevel 	/*
134*03831d35Sstevel 	 * PCI Bus number for each slot
135*03831d35Sstevel 	 */
136*03831d35Sstevel 	uint8_t			pci_device_num;
137*03831d35Sstevel 
138*03831d35Sstevel 	/*
139*03831d35Sstevel 	 * dynamically allocated hpc_slot_ops_t
140*03831d35Sstevel 	 * and register slot handle
141*03831d35Sstevel 	 */
142*03831d35Sstevel 	hpc_slot_ops_t		*slot_ops;
143*03831d35Sstevel 	hpc_slot_t		handle;
144*03831d35Sstevel 
145*03831d35Sstevel 	/*
146*03831d35Sstevel 	 * Leds for each slot are not cached
147*03831d35Sstevel 	 */
148*03831d35Sstevel 
149*03831d35Sstevel 	/*
150*03831d35Sstevel 	 * slot state, flags, board type
151*03831d35Sstevel 	 */
152*03831d35Sstevel 	uint32_t		flags;
153*03831d35Sstevel 	uint32_t		state;
154*03831d35Sstevel 	uint32_t		board_type;
155*03831d35Sstevel 
156*03831d35Sstevel } sghsc_slot_t;
157*03831d35Sstevel 
158*03831d35Sstevel /*
159*03831d35Sstevel  * Per Serenget CompactPCI HSC instance soft state structure
160*03831d35Sstevel  */
161*03831d35Sstevel typedef struct sghsc {
162*03831d35Sstevel 	dev_info_t	*sghsc_dip;
163*03831d35Sstevel 	kmutex_t	sghsc_mutex;
164*03831d35Sstevel 	uint32_t	sghsc_instance;
165*03831d35Sstevel 	uint32_t	sghsc_board;
166*03831d35Sstevel 	uint32_t	sghsc_node_id;
167*03831d35Sstevel 	uint32_t	sghsc_portid;
168*03831d35Sstevel 	uint32_t	sghsc_num_slots;
169*03831d35Sstevel 	uint32_t	sghsc_valid;
170*03831d35Sstevel 	sghsc_slot_t	*sghsc_slot_table;
171*03831d35Sstevel } sghsc_t;
172*03831d35Sstevel 
173*03831d35Sstevel /*
174*03831d35Sstevel  * Slot map descriptor (slot to bus segment mapping)
175*03831d35Sstevel  */
176*03831d35Sstevel typedef struct sdesc {
177*03831d35Sstevel 	uint32_t	agent_delta;
178*03831d35Sstevel 	uint32_t	off;
179*03831d35Sstevel 	uint32_t	pcidev;
180*03831d35Sstevel 	uint32_t	slot_type;
181*03831d35Sstevel } sdesc_t;
182*03831d35Sstevel 
183*03831d35Sstevel /*
184*03831d35Sstevel  * Mailbox related data and structures
185*03831d35Sstevel  */
186*03831d35Sstevel #define	CPCI_GET_SLOT_STATUS		0x5000
187*03831d35Sstevel #define	CPCI_SET_SLOT_FAULT_LED		0x5001
188*03831d35Sstevel #define	CPCI_SET_SLOT_STATUS		0x5002
189*03831d35Sstevel #define	CPCI_SET_SLOT_POWER		0x5003
190*03831d35Sstevel #define	CPCI_GET_NUM_SLOTS		0x5004
191*03831d35Sstevel #define	CPCI_SET_ENUM_CLEARED		0x5005
192*03831d35Sstevel #define	CPCI_BOARD_TYPE			0x5006
193*03831d35Sstevel 
194*03831d35Sstevel /*
195*03831d35Sstevel  * Bit definition for Boat Type
196*03831d35Sstevel  */
197*03831d35Sstevel #define	NO_BOARD_TYPE			0
198*03831d35Sstevel #define	PCI_BOARD			1
199*03831d35Sstevel #define	CPCI_BOARD			2
200*03831d35Sstevel #define	SP_CPCI_BOARD			3
201*03831d35Sstevel #define	WCI_CPCI_BOARD			4
202*03831d35Sstevel #define	WCI_SP_CPCI_BOARD		5
203*03831d35Sstevel 
204*03831d35Sstevel /*
205*03831d35Sstevel  * Shifts definition for CPCI_GET_SLOT_STATUS
206*03831d35Sstevel  */
207*03831d35Sstevel #define	ONE_BIT				1
208*03831d35Sstevel #define	TWO_BITS			3
209*03831d35Sstevel #define	THREE_BITS			7
210*03831d35Sstevel #define	CPCI_STAT_POWER_ON_SHIFT	0
211*03831d35Sstevel #define	CPCI_STAT_LED_POWER_SHIFT	1
212*03831d35Sstevel #define	CPCI_STAT_LED_FAULT_SHIFT	2
213*03831d35Sstevel #define	CPCI_STAT_LED_HP_SHIFT		3
214*03831d35Sstevel #define	CPCI_STAT_SLOT_EMPTY_SHIFT	4
215*03831d35Sstevel #define	CPCI_STAT_HOT_SWAP_STATUS_SHIFT	5
216*03831d35Sstevel #define	CPCI_STAT_HEALTHY_SHIFT		12	/* One bit */
217*03831d35Sstevel #define	CPCI_STAT_RESET_SHIFT		13	/* One bit */
218*03831d35Sstevel 
219*03831d35Sstevel /*
220*03831d35Sstevel  * Bit definition for CPCI_SET_SLOT_STATUS
221*03831d35Sstevel  */
222*03831d35Sstevel #define	CPCI_SET_STATUS_SLOT_RESET	0x00001
223*03831d35Sstevel #define	CPCI_SET_STATUS_SLOT_READY	0x00000
224*03831d35Sstevel /*
225*03831d35Sstevel  * Bit definition for CPCI_SET_SLOT_STATUS_FAULT_LED
226*03831d35Sstevel  */
227*03831d35Sstevel #define	CPCI_SET_FAULT_LED_OFF		0x00000
228*03831d35Sstevel #define	CPCI_SET_FAULT_LED_ON		0x00001
229*03831d35Sstevel #define	CPCI_SET_FAULT_LED_KEEP		0x00002
230*03831d35Sstevel #define	CPCI_SET_FAULT_LED_TOGGLE	0x00003
231*03831d35Sstevel 
232*03831d35Sstevel /*
233*03831d35Sstevel  * Bit definition for CPCI_SET_SLOT_POWER
234*03831d35Sstevel  */
235*03831d35Sstevel #define	CPCI_POWER_OFF	0x0
236*03831d35Sstevel #define	CPCI_POWER_ON	0x1
237*03831d35Sstevel 
238*03831d35Sstevel /*
239*03831d35Sstevel  * Mailbox timeout
240*03831d35Sstevel  */
241*03831d35Sstevel #define	SGHSC_MBX_TIMEOUT		600
242*03831d35Sstevel 
243*03831d35Sstevel /*
244*03831d35Sstevel  * cPCI command codes (internal)
245*03831d35Sstevel  */
246*03831d35Sstevel #define	_SGHSC_CODE			('N' << 16)
247*03831d35Sstevel 
248*03831d35Sstevel #define	SGHSC_GET_SLOT_STATUS		(_SGHSC_CODE | 0x14)
249*03831d35Sstevel #define	SGHSC_SET_SLOT_STATUS_RESET	(_SGHSC_CODE | 0x15)
250*03831d35Sstevel #define	SGHSC_SET_SLOT_STATUS_READY	(_SGHSC_CODE | 0x16)
251*03831d35Sstevel #define	SGHSC_SET_SLOT_FAULT_LED_ON	(_SGHSC_CODE | 0x17)
252*03831d35Sstevel #define	SGHSC_SET_SLOT_FAULT_LED_OFF	(_SGHSC_CODE | 0x18)
253*03831d35Sstevel #define	SGHSC_SET_SLOT_FAULT_LED_KEEP	(_SGHSC_CODE | 0x19)
254*03831d35Sstevel #define	SGHSC_SET_SLOT_FAULT_LED_TOGGLE	(_SGHSC_CODE | 0x1a)
255*03831d35Sstevel #define	SGHSC_SET_SLOT_POWER_OFF	(_SGHSC_CODE | 0x1b)
256*03831d35Sstevel #define	SGHSC_SET_SLOT_POWER_ON		(_SGHSC_CODE | 0x1c)
257*03831d35Sstevel #define	SGHSC_GET_NUM_SLOTS		(_SGHSC_CODE | 0x1d)
258*03831d35Sstevel #define	SGHSC_SET_ENUM_CLEARED		(_SGHSC_CODE | 0x1e)
259*03831d35Sstevel #define	SGHSC_GET_CPCI_BOARD_TYPE	(_SGHSC_CODE | 0x1f)
260*03831d35Sstevel 
261*03831d35Sstevel typedef struct {
262*03831d35Sstevel 	uint32_t	cmd_id;
263*03831d35Sstevel 	uint32_t	node_id;
264*03831d35Sstevel 	uint32_t	board;
265*03831d35Sstevel 	uint32_t	slot;
266*03831d35Sstevel 	uint32_t	info;
267*03831d35Sstevel } bitcmd_info_t;
268*03831d35Sstevel 
269*03831d35Sstevel typedef struct {
270*03831d35Sstevel 	uint32_t	cmd_id;
271*03831d35Sstevel 	uint32_t	result;
272*03831d35Sstevel } bitcmd_resp_t;
273*03831d35Sstevel 
274*03831d35Sstevel typedef enum { SGHSC_RB_EMPTY, SGHSC_RB_FLOAT,
275*03831d35Sstevel 	SGHSC_RB_FULL } sghsc_rb_state_t;
276*03831d35Sstevel 
277*03831d35Sstevel typedef struct sghsc_event {
278*03831d35Sstevel 	int type;
279*03831d35Sstevel 	int node_id;
280*03831d35Sstevel 	int board;
281*03831d35Sstevel 	int slot;
282*03831d35Sstevel 	int info;
283*03831d35Sstevel } sghsc_event_t;
284*03831d35Sstevel 
285*03831d35Sstevel typedef struct sghsc_rb_head {
286*03831d35Sstevel 	sghsc_event_t *buf;
287*03831d35Sstevel 	int put_idx;
288*03831d35Sstevel 	int get_idx;
289*03831d35Sstevel 	int size;
290*03831d35Sstevel 	sghsc_rb_state_t state;
291*03831d35Sstevel } sghsc_rb_head_t;
292*03831d35Sstevel 
293*03831d35Sstevel #ifdef	__cplusplus
294*03831d35Sstevel }
295*03831d35Sstevel #endif
296*03831d35Sstevel 
297*03831d35Sstevel #endif	/* _SYS_SGHSC_H */
298