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 2014 Garrett D'Amore <garrett@damore.org>
24  *
25  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
26  * Use is subject to license terms.
27  */
28 
29 #ifndef	_SYS_HOTPLUG_HPCTRL_H
30 #define	_SYS_HOTPLUG_HPCTRL_H
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 #define	HPC_SLOT_TYPE_PCIE	0x4		/* PCI Express slot */
116 
117 /* bit definitions in slot_capabilities field for PCI or cPCI bus slots */
118 #define	HPC_SLOT_64BITS		0x0001	/* slot is a 64bit slot */
119 #define	HPC_SLOT_TEST		0x0002	/* testing capability on the slot */
120 
121 /* slot_flags definitions */
122 #define	HPC_SLOT_NO_AUTO_ENABLE	0x1	/* No auto-enable on registration */
123 #define	HPC_SLOT_CREATE_DEVLINK	0x2	/* create device link under /dev/cfg */
124 
125 /*
126  * xxx_op_control command definitions.
127  *
128  * 	Command (request)	   arg			Descritpion
129  *	-----------------	   ---			-----------
130  *	HPC_CTRL_GET_LED_STATE	   hpc_led_info *	Get state of an LED.
131  *	HPC_CTRL_SET_LED_STATE	   hpc_led_info *	Set state of an LED.
132  *	HPC_CTRL_GET_SLOT_STATE	   hpc_slot_state_t *	Get the slot state.
133  *	HPC_CTRL_DEV_CONFIGURED	   NULL 		Board is configured.
134  *	HPC_CTRL_DEV_UNCONFIGURED  NULL 		Board is unconfigured.
135  *	HPC_CTRL_DEV_CONFIG_FAILURE NULL	Board Configuration Failed
136  *	HPC_CTRL_DEV_UNCONFIG_FAILURE NULL	Board Unconfiguration Failed
137  *	HPC_CTRL_GET_BOARD_TYPE    hpc_board_type_t *	Get board type info.
138  *	HPC_CTRL_DISABLE_AUTOCFG   NULL			Disable auto config-
139  *							uration for this slot.
140  *	HPC_CTRL_ENABLE_AUTOCFG    NULL			Enable auto config-
141  *							uration for this slot.
142  *	HPC_CTRL_DISABLE_SLOT	   NULL			Disable the slot for
143  *							hot plug operations.
144  *	HPC_CTRL_ENABLE_SLOT	   NULL			ReEnable the slot for
145  *							hot plug operations.
146  */
147 #define	HPC_CTRL_GET_LED_STATE		0x1
148 #define	HPC_CTRL_SET_LED_STATE		0x2
149 #define	HPC_CTRL_GET_SLOT_STATE		0x3
150 #define	HPC_CTRL_DEV_CONFIGURED		0x4
151 #define	HPC_CTRL_DEV_UNCONFIGURED	0x5
152 #define	HPC_CTRL_GET_BOARD_TYPE		0x6
153 #define	HPC_CTRL_DISABLE_AUTOCFG	0x7
154 #define	HPC_CTRL_ENABLE_AUTOCFG		0x8
155 #define	HPC_CTRL_DISABLE_SLOT		0x9
156 #define	HPC_CTRL_ENABLE_SLOT		0xa
157 #define	HPC_CTRL_DISABLE_ENUM		0xb
158 #define	HPC_CTRL_ENABLE_ENUM		0xc
159 #define	HPC_CTRL_DEV_CONFIG_FAILURE	0xd
160 #define	HPC_CTRL_DEV_UNCONFIG_FAILURE	0xe
161 #define	HPC_CTRL_DEV_CONFIG_START	0xf
162 #define	HPC_CTRL_DEV_UNCONFIG_START	0x10
163 
164 /*
165  * type definitions for led information.
166  *
167  * Note: ATTN/ACTIVE leds are platform specific and they may not be
168  *	 available on all platforms.
169  */
170 typedef enum { HPC_FAULT_LED, HPC_POWER_LED, HPC_ATTN_LED,
171 	HPC_ACTIVE_LED} hpc_led_t;
172 
173 typedef enum { HPC_LED_OFF, HPC_LED_ON, HPC_LED_BLINK } hpc_led_state_t;
174 
175 typedef struct hpc_led_info {
176 	hpc_led_t	led;	/* led id: HPC_POWER_LED, HPC_FAULT_LED, ... */
177 	hpc_led_state_t	state;	/* led state: HPC_LED_ON, HPC_LED_OFF, ... */
178 } hpc_led_info_t;
179 
180 /*
181  * type definition for slot state.
182  *
183  *	HPC_SLOT_EMPTY		Slot has no card present.
184  *	HPC_SLOT_CONNECTED	Card is present in the slot and it is
185  *				connected to the bus.
186  *	HPC_SLOT_DISCONNECTED	Card is present in the slot and it is
187  *				disconnected from the bus.
188  *	HPC_SLOT_UNKNOWN	If the HPC driver can not figure out
189  *				the receptacle state. This is possible
190  *				on Compact PCI Hot Swap platform.
191  */
192 typedef enum { HPC_SLOT_EMPTY, HPC_SLOT_DISCONNECTED,
193 	HPC_SLOT_CONNECTED, HPC_SLOT_UNKNOWN } hpc_slot_state_t;
194 
195 /*
196  * type definition for board type.
197  *
198  *	HPC_BOARD_UNKNOWN	Board is either not present or unknown.
199  *	HPC_BOARD_PCI_HOTPLUG	PCI or PCIe adapter.
200  *	HPC_BOARD_CPCI_NON_HS	Non Hot Swap cPCI board.
201  *	HPC_BOARD_CPCI_BASIC_HS	Basic Hot Swap cPCI board.
202  *	HPC_BOARD_CPCI_FULL_HS	Full Hot Swap cPCI board.
203  *	HPC_BOARD_CPCI_HS	Indicates if HSC driver can not determine
204  *				the type of Hot Swap board.
205  */
206 typedef enum { HPC_BOARD_UNKNOWN, HPC_BOARD_PCI_HOTPLUG,
207 	HPC_BOARD_CPCI_NON_HS, HPC_BOARD_CPCI_BASIC_HS,
208 	HPC_BOARD_CPCI_FULL_HS, HPC_BOARD_CPCI_HS } hpc_board_type_t;
209 
210 /*
211  * Event type definitions (for hpc_event_notify() interface).
212  *
213  *	Event			   Descritpion
214  *	-----			   -----------
215  *	HPC_EVENT_SLOT_INSERTION   Card is inserted in the slot.
216  *	HPC_EVENT_SLOT_REMOVAL	   Card is removed from the slot.
217  *	HPC_EVENT_SLOT_POWER_ON	   Slot is powered ON.
218  *	HPC_EVENT_SLOT_POWER_OFF   Slot is powered OFF.
219  *	HPC_EVENT_SLOT_LATCH_OPEN  LATCH on the slot is open.
220  *	HPC_EVENT_SLOT_LATCH_SHUT  LATCH on the slot is shut.
221  *	HPC_EVENT_SLOT_ENUM	   ENUM# signal is generated on the bus
222  *				   and it may be generated from this slot.
223  *	HPC_EVENT_SLOT_NOT_HEALTHY HEALTHY# signal is lost on this slot.
224  *	HPC_EVENT_SLOT_HEALTHY_OK  HEALTHY# signal on this slot is OK now.
225  *	HPC_EVENT_SLOT_CONFIGURE   Configure the occupant in the slot.
226  *	HPC_EVENT_SLOT_UNCONFIGURE Unconfigure the occupant in the slot.
227  */
228 #define	HPC_EVENT_SLOT_INSERTION	0x00000001
229 #define	HPC_EVENT_SLOT_REMOVAL		0x00000002
230 #define	HPC_EVENT_SLOT_POWER_ON		0x00000004
231 #define	HPC_EVENT_SLOT_POWER_OFF	0x00000008
232 #define	HPC_EVENT_SLOT_LATCH_OPEN	0x00000010
233 #define	HPC_EVENT_SLOT_LATCH_SHUT	0x00000020
234 #define	HPC_EVENT_SLOT_ENUM		0x00000040
235 #define	HPC_EVENT_SLOT_NOT_HEALTHY	0x00000080
236 #define	HPC_EVENT_SLOT_HEALTHY_OK	0x00000100
237 #define	HPC_EVENT_SLOT_CONFIGURE	0x00000200
238 #define	HPC_EVENT_SLOT_UNCONFIGURE	0x00000400
239 #define	HPC_EVENT_SLOT_BLUE_LED_ON	0x00000800
240 #define	HPC_EVENT_SLOT_BLUE_LED_OFF	0x00001000
241 #define	HPC_EVENT_CLEAR_ENUM		0x00002000
242 #define	HPC_EVENT_PROCESS_ENUM		0x00004000
243 #define	HPC_EVENT_ENABLE_ENUM		0x00008000
244 #define	HPC_EVENT_DISABLE_ENUM		0x00010000
245 #define	HPC_EVENT_BUS_ENUM		HPC_EVENT_SLOT_ENUM
246 #define	HPC_EVENT_SLOT_ATTN		0x00020000
247 #define	HPC_EVENT_SLOT_POWER_FAULT  	0x00040000
248 
249 /*
250  * return values for errors from HPS framework interfaces.
251  */
252 #define	HPC_SUCCESS			0x0
253 #define	HPC_ERR_INVALID			0x1	/* invalid arguments */
254 #define	HPC_ERR_SLOT_NOTREGISTERED	0x2	/* slot is not registered */
255 #define	HPC_ERR_SLOT_DUPLICATE		0x3	/* slot is already registered */
256 #define	HPC_ERR_BUS_NOTREGISTERED	0x4	/* slot is not registered */
257 #define	HPC_ERR_BUS_DUPLICATE		0x5	/* slot is already registered */
258 #define	HPC_ERR_NOTSUPPORTED		0x6	/* operation not supported */
259 #define	HPC_ERR_FAILED			0x7	/* operation failed */
260 
261 /* return values for event notifications */
262 #define	HPC_EVENT_CLAIMED		0x10	/* HPC event is claimed */
263 #define	HPC_EVENT_UNCLAIMED		-1	/* HPC event is not claimed */
264 
265 /* definitions for slot (un)registration events */
266 #define	HPC_SLOT_ONLINE		1	/* slot is registered */
267 #define	HPC_SLOT_OFFLINE	2	/* slot is unregistered */
268 
269 /*
270  * function prototype definitions for interfaces between HPC driver
271  * and Hot Plug Services framework.
272  */
273 extern int hpc_slot_register(dev_info_t *dip, char *bus_path,
274 	hpc_slot_info_t *slot_info, hpc_slot_t *slot_hdl,
275 	hpc_slot_ops_t *slot_ops, caddr_t ops_arg, uint_t flags);
276 extern int hpc_slot_unregister(hpc_slot_t *slot_hdl);
277 extern struct hpc_slot_ops *hpc_alloc_slot_ops(int sleepflag);
278 extern void hpc_free_slot_ops(hpc_slot_ops_t *ops);
279 extern int hpc_slot_event_notify(hpc_slot_t slot_hdl, uint_t event,
280 	uint_t flags);
281 extern boolean_t hpc_bus_registered(hpc_slot_t slot_hdl);
282 
283 /*
284  * *****************************************************************
285  * Implementation specific data structures and definitons. These are
286  * the private interfaces between cfgadm plug-in and the PCI nexus
287  * driver.
288  * *****************************************************************
289  */
290 
291 /*
292  * Data structure used for DEVCTL_AP_CONTROL ioctl on the AP.
293  */
294 struct hpc_control_data {
295 	uint_t	cmd;		/* HPC_CTRL_* command */
296 	void	*data;		/* pointer to data that is exchanged */
297 };
298 
299 struct hpc_control32_data {
300 	uint_t	  cmd;		/* HPC_CTRL_* command */
301 	caddr32_t data;		/* pointer to data that is exchanged */
302 };
303 
304 /* misc. control commands for DEVCTL_AP_CONTROL ioctl interface */
305 #define	HPC_CTRL_GET_SLOT_INFO	0x100
306 #define	HPC_CTRL_GET_CARD_INFO	0x101
307 
308 /* card information structure to get data from the PCI config header */
309 typedef struct hpc_card_info {
310 	uint8_t	prog_class;	/* PCI_CONF_PROGCLASS byte */
311 	uint8_t	base_class;	/* PCI_CONF_BASCLASS byte */
312 	uint8_t	sub_class;	/* PCI_CONF_SUBCLASS byte */
313 	uint8_t	header_type;	/* PCI_CONF_HEADER byte */
314 } hpc_card_info_t;
315 
316 /* Slot occupant information structure */
317 #define	HPC_MAX_OCCUPANTS	128
318 typedef struct hpc_occupant_info {
319 	int	i;
320 	char	*id[HPC_MAX_OCCUPANTS];
321 } hpc_occupant_info_t;
322 
323 #ifdef	__cplusplus
324 }
325 #endif
326 
327 #endif	/* _SYS_HOTPLUG_HPCTRL_H */
328