xref: /titanic_52/usr/src/uts/common/sys/hotplug/hpctrl.h (revision bdfc6d18da790deeec2e0eb09c625902defe2498)
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	_SYS_HOTPLUG_HPCTRL_H
28 #define	_SYS_HOTPLUG_HPCTRL_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 /*
33  * ****************************************************************
34  * Hot Plug Controller interfaces for PCI and CompactPCI platforms.
35  * ****************************************************************
36  */
37 #include <sys/types.h>
38 
39 #ifdef	__cplusplus
40 extern "C" {
41 #endif
42 
43 /*
44  * Type definition for slot handle. This is an opaque pointer
45  * created by the HPS framework.
46  */
47 typedef void *hpc_slot_t;
48 
49 #define	HPC_SLOT_OPS_VERSION	0
50 
51 /*
52  * slot operations structure definition.
53  *
54  *	Function		Description
55  *	--------		-----------
56  *	xxx_op_connect		CONNECT the slot to the bus to enable
57  *				access to the adapter.
58  *	xxx_op_disconnect	DISCONNECT the slot from the bus. For PCI,
59  *				this disables the power to the slot.
60  *	xxx_op_insert		Prepare the slot for card insertion. This
61  *				may not be applicable for all bus types.
62  *	xxx_op_remove		Prepare the slot for card removal. This
63  *				may not be applicable for all bus types.
64  *	xxx_op_control		Perform misc. commands to control the
65  *				LEDs, get status information, etc.
66  */
67 typedef struct hpc_slot_ops {
68 	int	hpc_version;			/* HPC_SLOT_OPS_VERSION */
69 	int	(*hpc_op_connect)(caddr_t ops_arg, hpc_slot_t slot_hdl,
70 			void *data, uint_t flags);
71 	int	(*hpc_op_disconnect)(caddr_t ops_arg, hpc_slot_t slot_hdl,
72 			void *data, uint_t flags);
73 	int	(*hpc_op_insert)(caddr_t ops_arg, hpc_slot_t slot_hdl,
74 			void *data, uint_t flags);
75 	int	(*hpc_op_remove)(caddr_t ops_arg, hpc_slot_t slot_hdl,
76 			void *data, uint_t flags);
77 	int	(*hpc_op_control)(caddr_t ops_arg, hpc_slot_t slot_hdl,
78 			int request, caddr_t arg);
79 } hpc_slot_ops_t;
80 
81 #define	HPC_SLOT_INFO_VERSION	1
82 #define	PCI_SLOT_NAME_LEN	256
83 /*
84  * Slot information structure.
85  */
86 typedef struct hpc_slot_info {
87 	uint16_t	version;		/* HPC_SLOT_INFO_VERSION */
88 	uint16_t	slot_type;		/* slot type: PCI, ... */
89 	uint16_t	slot_flags;
90 	union {
91 	    /* pci bus slot */
92 	    struct pci_slot_info {
93 		uint16_t	device_number;		/* PCI device number */
94 		uint16_t	slot_capabilities;	/* 64bit, etc. */
95 		char		slot_logical_name[PCI_SLOT_NAME_LEN];
96 	    } pci;
97 	    struct sbd_slot_info {
98 		int		slot_num;
99 	    } sbd;
100 	    /* other bus types go here... */
101 	} slot;
102 } hpc_slot_info_t;
103 
104 /* short names for bus specific fields in hpc_slot_info structure */
105 #define	pci_dev_num		slot.pci.device_number
106 #define	pci_slot_name		slot.pci.slot_logical_name
107 #define	pci_slot_capabilities	slot.pci.slot_capabilities
108 
109 #define	sbd_slot_num		slot.sbd.slot_num
110 
111 /* slot_type definitions */
112 #define	HPC_SLOT_TYPE_PCI	0x1		/* PCI bus slot */
113 #define	HPC_SLOT_TYPE_CPCI	0x2		/* Compact PCI bus slot */
114 #define	HPC_SLOT_TYPE_SBD	0x3		/* System bus slot */
115 
116 /* bit definitions in slot_capabilities field for PCI or cPCI bus slots */
117 #define	HPC_SLOT_64BITS		0x0001	/* slot is a 64bit slot */
118 #define	HPC_SLOT_TEST		0x0002	/* testing capability on the slot */
119 
120 /* slot_flags definitions */
121 #define	HPC_SLOT_NO_AUTO_ENABLE	0x1	/* No auto-enable on registration */
122 #define	HPC_SLOT_CREATE_DEVLINK	0x2	/* create device link under /dev/cfg */
123 
124 /*
125  * xxx_op_control command definitions.
126  *
127  * 	Command (request)	   arg			Descritpion
128  *	-----------------	   ---			-----------
129  *	HPC_CTRL_GET_LED_STATE	   hpc_led_info *	Get state of an LED.
130  *	HPC_CTRL_SET_LED_STATE	   hpc_led_info *	Set state of an LED.
131  *	HPC_CTRL_GET_SLOT_STATE	   hpc_slot_state_t *	Get the slot state.
132  *	HPC_CTRL_DEV_CONFIGURED	   NULL 		Board is configured.
133  *	HPC_CTRL_DEV_UNCONFIGURED  NULL 		Board is unconfigured.
134  *	HPC_CTRL_DEV_CONFIG_FAILURE NULL	Board Configuration Failed
135  *	HPC_CTRL_DEV_UNCONFIG_FAILURE NULL	Board Unconfiguration Failed
136  *	HPC_CTRL_GET_BOARD_TYPE    hpc_board_type_t *	Get board type info.
137  *	HPC_CTRL_DISABLE_AUTOCFG   NULL			Disable auto config-
138  *							uration for this slot.
139  *	HPC_CTRL_ENABLE_AUTOCFG    NULL			Enable auto config-
140  *							uration for this slot.
141  *	HPC_CTRL_DISABLE_SLOT	   NULL			Disable the slot for
142  *							hot plug operations.
143  *	HPC_CTRL_ENABLE_SLOT	   NULL			ReEnable the slot for
144  *							hot plug operations.
145  */
146 #define	HPC_CTRL_GET_LED_STATE		0x1
147 #define	HPC_CTRL_SET_LED_STATE		0x2
148 #define	HPC_CTRL_GET_SLOT_STATE		0x3
149 #define	HPC_CTRL_DEV_CONFIGURED		0x4
150 #define	HPC_CTRL_DEV_UNCONFIGURED	0x5
151 #define	HPC_CTRL_GET_BOARD_TYPE		0x6
152 #define	HPC_CTRL_DISABLE_AUTOCFG	0x7
153 #define	HPC_CTRL_ENABLE_AUTOCFG		0x8
154 #define	HPC_CTRL_DISABLE_SLOT		0x9
155 #define	HPC_CTRL_ENABLE_SLOT		0xa
156 #define	HPC_CTRL_DISABLE_ENUM		0xb
157 #define	HPC_CTRL_ENABLE_ENUM		0xc
158 #define	HPC_CTRL_DEV_CONFIG_FAILURE	0xd
159 #define	HPC_CTRL_DEV_UNCONFIG_FAILURE	0xe
160 #define	HPC_CTRL_DEV_CONFIG_START	0xf
161 #define	HPC_CTRL_DEV_UNCONFIG_START	0x10
162 
163 /*
164  * type definitions for led information.
165  *
166  * Note: ATTN/ACTIVE leds are platform specific and they may not be
167  *	 available on all platforms.
168  */
169 typedef enum { HPC_FAULT_LED, HPC_POWER_LED, HPC_ATTN_LED,
170 	HPC_ACTIVE_LED} hpc_led_t;
171 
172 typedef enum { HPC_LED_OFF, HPC_LED_ON, HPC_LED_BLINK } hpc_led_state_t;
173 
174 typedef struct hpc_led_info {
175 	hpc_led_t	led;	/* led id: HPC_POWER_LED, HPC_FAULT_LED, ... */
176 	hpc_led_state_t	state;	/* led state: HPC_LED_ON, HPC_LED_OFF, ... */
177 } hpc_led_info_t;
178 
179 /*
180  * type definition for slot state.
181  *
182  *	HPC_SLOT_EMPTY		Slot has no card present.
183  *	HPC_SLOT_CONNECTED	Card is present in the slot and it is
184  *				connected to the bus.
185  *	HPC_SLOT_DISCONNECTED	Card is present in the slot and it is
186  *				disconnected from the bus.
187  *	HPC_SLOT_UNKNOWN	If the HPC driver can not figure out
188  *				the receptacle state. This is possible
189  *				on Compact PCI Hot Swap platform.
190  */
191 typedef enum { HPC_SLOT_EMPTY, HPC_SLOT_DISCONNECTED,
192 	HPC_SLOT_CONNECTED, HPC_SLOT_UNKNOWN } hpc_slot_state_t;
193 
194 /*
195  * type definition for board type.
196  *
197  *	HPC_BOARD_UNKNOWN	Board is either not present or unknown.
198  *	HPC_BOARD_PCI_HOTPLUG	PCI bus adapter.
199  *	HPC_BOARD_CPCI_NON_HS	Non Hot Swap cPCI board.
200  *	HPC_BOARD_CPCI_BASIC_HS	Basic Hot Swap cPCI board.
201  *	HPC_BOARD_CPCI_FULL_HS	Full Hot Swap cPCI board.
202  *	HPC_BOARD_CPCI_HS	Indicates if HSC driver can not determine
203  *				the type of Hot Swap board.
204  */
205 typedef enum { HPC_BOARD_UNKNOWN, HPC_BOARD_PCI_HOTPLUG,
206 	HPC_BOARD_CPCI_NON_HS, HPC_BOARD_CPCI_BASIC_HS,
207 	HPC_BOARD_CPCI_FULL_HS, HPC_BOARD_CPCI_HS } hpc_board_type_t;
208 
209 /*
210  * Event type definitions (for hpc_event_notify() interface).
211  *
212  *	Event			   Descritpion
213  *	-----			   -----------
214  *	HPC_EVENT_SLOT_INSERTION   Card is inserted in the slot.
215  *	HPC_EVENT_SLOT_REMOVAL	   Card is removed from the slot.
216  *	HPC_EVENT_SLOT_POWER_ON	   Slot is powered ON.
217  *	HPC_EVENT_SLOT_POWER_OFF   Slot is powered OFF.
218  *	HPC_EVENT_SLOT_LATCH_OPEN  LATCH on the slot is open.
219  *	HPC_EVENT_SLOT_LATCH_SHUT  LATCH on the slot is shut.
220  *	HPC_EVENT_SLOT_ENUM	   ENUM# signal is generated on the bus
221  *				   and it may be generated from this slot.
222  *	HPC_EVENT_SLOT_NOT_HEALTHY HEALTHY# signal is lost on this slot.
223  *	HPC_EVENT_SLOT_HEALTHY_OK  HEALTHY# signal on this slot is OK now.
224  *	HPC_EVENT_SLOT_CONFIGURE   Configure the occupant in the slot.
225  *	HPC_EVENT_SLOT_UNCONFIGURE Unconfigure the occupant in the slot.
226  */
227 #define	HPC_EVENT_SLOT_INSERTION	0x00000001
228 #define	HPC_EVENT_SLOT_REMOVAL		0x00000002
229 #define	HPC_EVENT_SLOT_POWER_ON		0x00000004
230 #define	HPC_EVENT_SLOT_POWER_OFF	0x00000008
231 #define	HPC_EVENT_SLOT_LATCH_OPEN	0x00000010
232 #define	HPC_EVENT_SLOT_LATCH_SHUT	0x00000020
233 #define	HPC_EVENT_SLOT_ENUM		0x00000040
234 #define	HPC_EVENT_SLOT_NOT_HEALTHY	0x00000080
235 #define	HPC_EVENT_SLOT_HEALTHY_OK	0x00000100
236 #define	HPC_EVENT_SLOT_CONFIGURE	0x00000200
237 #define	HPC_EVENT_SLOT_UNCONFIGURE	0x00000400
238 #define	HPC_EVENT_SLOT_BLUE_LED_ON	0x00000800
239 #define	HPC_EVENT_SLOT_BLUE_LED_OFF	0x00001000
240 #define	HPC_EVENT_CLEAR_ENUM		0x00002000
241 #define	HPC_EVENT_PROCESS_ENUM		0x00004000
242 #define	HPC_EVENT_ENABLE_ENUM		0x00008000
243 #define	HPC_EVENT_DISABLE_ENUM		0x00010000
244 #define	HPC_EVENT_BUS_ENUM		HPC_EVENT_SLOT_ENUM
245 
246 /*
247  * return values for errors from HPS framework interfaces.
248  */
249 #define	HPC_SUCCESS			0x0
250 #define	HPC_ERR_INVALID			0x1	/* invalid arguments */
251 #define	HPC_ERR_SLOT_NOTREGISTERED	0x2	/* slot is not registered */
252 #define	HPC_ERR_SLOT_DUPLICATE		0x3	/* slot is already registered */
253 #define	HPC_ERR_BUS_NOTREGISTERED	0x4	/* slot is not registered */
254 #define	HPC_ERR_BUS_DUPLICATE		0x5	/* slot is already registered */
255 #define	HPC_ERR_NOTSUPPORTED		0x6	/* operation not supported */
256 #define	HPC_ERR_FAILED			0x7	/* operation failed */
257 
258 /* return values for event notifications */
259 #define	HPC_EVENT_CLAIMED		0x10	/* HPC event is claimed */
260 #define	HPC_EVENT_UNCLAIMED		-1	/* HPC event is not claimed */
261 
262 /* definitions for slot (un)registration events */
263 #define	HPC_SLOT_ONLINE		1	/* slot is registered */
264 #define	HPC_SLOT_OFFLINE	2	/* slot is unregistered */
265 
266 /*
267  * function prototype definitions for interfaces between HPC driver
268  * and Hot Plug Services framework.
269  */
270 #ifdef	__STDC__
271 extern int hpc_slot_register(dev_info_t *dip, char *bus_path,
272 	hpc_slot_info_t *slot_info, hpc_slot_t *slot_hdl,
273 	hpc_slot_ops_t *slot_ops, caddr_t ops_arg, uint_t flags);
274 extern int hpc_slot_unregister(hpc_slot_t *slot_hdl);
275 extern struct hpc_slot_ops *hpc_alloc_slot_ops(int sleepflag);
276 extern void hpc_free_slot_ops(hpc_slot_ops_t *ops);
277 extern int hpc_slot_event_notify(hpc_slot_t slot_hdl, uint_t event,
278 	uint_t flags);
279 extern boolean_t hpc_bus_registered(hpc_slot_t slot_hdl);
280 #else
281 extern int hpc_slot_register();
282 extern int hpc_slot_unregister();
283 extern struct hpc_slot_ops *hpc_alloc_slot_ops();
284 extern void hpc_free_slot_ops();
285 extern int hpc_slot_event_notify();
286 extern boolean_t hpc_bus_registered();
287 #endif	/* __STDC__ */
288 
289 /*
290  * *****************************************************************
291  * Implementation specific data structures and definitons. These are
292  * the private interfaces between cfgadm plug-in and the PCI nexus
293  * driver.
294  * *****************************************************************
295  */
296 
297 /*
298  * Data structure used for DEVCTL_AP_CONTROL ioctl on the AP.
299  */
300 struct hpc_control_data {
301 	uint_t	cmd;		/* HPC_CTRL_* command */
302 	void	*data;		/* pointer to data that is exchanged */
303 };
304 
305 struct hpc_control32_data {
306 	uint_t	  cmd;		/* HPC_CTRL_* command */
307 	caddr32_t data;		/* pointer to data that is exchanged */
308 };
309 
310 /* misc. control commands for DEVCTL_AP_CONTROL ioctl interface */
311 #define	HPC_CTRL_GET_SLOT_INFO	0x100
312 #define	HPC_CTRL_GET_CARD_INFO	0x101
313 
314 /* card information structure to get data from the PCI config header */
315 typedef struct hpc_card_info {
316 	uint8_t	prog_class;	/* PCI_CONF_PROGCLASS byte */
317 	uint8_t	base_class;	/* PCI_CONF_BASCLASS byte */
318 	uint8_t	sub_class;	/* PCI_CONF_SUBCLASS byte */
319 	uint8_t	header_type;	/* PCI_CONF_HEADER byte */
320 } hpc_card_info_t;
321 
322 /* Slot occupant information structure */
323 #define	HPC_MAX_OCCUPANTS	128
324 typedef struct hpc_occupant_info {
325 	int	i;
326 	char	*id[HPC_MAX_OCCUPANTS];
327 } hpc_occupant_info_t;
328 
329 #ifdef	__cplusplus
330 }
331 #endif
332 
333 #endif	/* _SYS_HOTPLUG_HPCTRL_H */
334