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 */