xref: /illumos-gate/usr/src/uts/common/sys/devctl.h (revision 38603a2034ae521f26661b0a6239028a83026614)
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 (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_SYS_DEVCTL_H
27 #define	_SYS_DEVCTL_H
28 
29 /*
30  * Device control interfaces
31  */
32 #include <sys/types.h>
33 #include <sys/nvpair.h>
34 
35 #ifdef	__cplusplus
36 extern "C" {
37 #endif
38 
39 /*
40  * structure used to pass IOCTL data between the libdevice interfaces
41  * and nexus driver devctl IOCTL interface.
42  *
43  * Applications and nexus drivers may not access the contents of this
44  * structure directly.  Instead, drivers must use the ndi_dc_*(9n)
45  * interfaces, while applications must use the interfaces provided by
46  * libdevice.so.1.
47  */
48 struct devctl_iocdata {
49 	uint_t	cmd;			/* ioctl cmd */
50 	uint_t	flags;			/* command-specific flags */
51 	void	*cpyout_buf;		/* copyout vector */
52 	nvlist_t *nvl_user;		/* application defined attributes */
53 	size_t  nvl_usersz;
54 	char	*c_nodename;		/* child device nodename */
55 	char	*c_unitaddr;		/* child device unit address */
56 };
57 
58 #if defined(_SYSCALL32)
59 /*
60  * Structure to pass/return data from 32-bit program's.
61  */
62 struct devctl_iocdata32 {
63 	uint32_t  cmd;
64 	uint32_t  flags;
65 	caddr32_t cpyout_buf;
66 	caddr32_t nvl_user;
67 	uint32_t  nvl_usersz;
68 	caddr32_t c_nodename;
69 	caddr32_t c_unitaddr;
70 };
71 #endif
72 
73 /*
74  * Limit size of packed application defined attributes (nvl_user) to prevent
75  * user application from requesting excessive kernel memory allocation.
76  */
77 #define	DEVCTL_MAX_NVL_USERSZ	0x10000
78 
79 /*
80  * State of receptacle for an Attachment Point.
81  */
82 typedef enum {
83 	AP_RSTATE_EMPTY,
84 	AP_RSTATE_DISCONNECTED,
85 	AP_RSTATE_CONNECTED
86 } ap_rstate_t;
87 
88 /*
89  * State of occupant for an Attachment Point.
90  */
91 typedef enum {
92 	AP_OSTATE_UNCONFIGURED,
93 	AP_OSTATE_CONFIGURED
94 } ap_ostate_t;
95 
96 /*
97  * condition of an Attachment Point.
98  */
99 typedef enum {
100 	AP_COND_UNKNOWN,
101 	AP_COND_OK,
102 	AP_COND_FAILING,
103 	AP_COND_FAILED,
104 	AP_COND_UNUSABLE
105 } ap_condition_t;
106 
107 /*
108  * structure used to return the state of Attachment Point (AP) thru
109  * devctl_ap_getstate() interface.
110  */
111 
112 typedef struct devctl_ap_state {
113 	ap_rstate_t	ap_rstate; 	/* receptacle state */
114 	ap_ostate_t	ap_ostate;	/* occupant state */
115 	ap_condition_t	ap_condition;	/* condition of AP */
116 	time_t		ap_last_change;
117 	uint32_t	ap_error_code;	/* error code */
118 	uint8_t		ap_in_transition;
119 } devctl_ap_state_t;
120 
121 #if defined(_SYSCALL32)
122 /*
123  * Structure to pass/return data from 32-bit program's.
124  */
125 typedef struct devctl_ap_state32 {
126 	ap_rstate_t	ap_rstate; 	/* receptacle state */
127 	ap_ostate_t	ap_ostate;	/* occupant state */
128 	ap_condition_t	ap_condition;	/* condition of AP */
129 	time32_t	ap_last_change;
130 	uint32_t	ap_error_code;	/* error code */
131 	uint8_t		ap_in_transition;
132 } devctl_ap_state32_t;
133 #endif
134 
135 #define	DEVCTL_IOC		(0xDC << 16)
136 #define	DEVCTL_IOC_MAX		(DEVCTL_IOC | 0xFFFF)
137 #define	DEVCTL_BUS_QUIESCE	(DEVCTL_IOC | 1)
138 #define	DEVCTL_BUS_UNQUIESCE	(DEVCTL_IOC | 2)
139 #define	DEVCTL_BUS_RESETALL	(DEVCTL_IOC | 3)
140 #define	DEVCTL_BUS_RESET	(DEVCTL_IOC | 4)
141 #define	DEVCTL_BUS_GETSTATE	(DEVCTL_IOC | 5)
142 #define	DEVCTL_DEVICE_ONLINE	(DEVCTL_IOC | 6)
143 #define	DEVCTL_DEVICE_OFFLINE	(DEVCTL_IOC | 7)
144 #define	DEVCTL_DEVICE_GETSTATE	(DEVCTL_IOC | 9)
145 #define	DEVCTL_DEVICE_RESET	(DEVCTL_IOC | 10)
146 #define	DEVCTL_BUS_CONFIGURE	(DEVCTL_IOC | 11)
147 #define	DEVCTL_BUS_UNCONFIGURE	(DEVCTL_IOC | 12)
148 #define	DEVCTL_DEVICE_REMOVE	(DEVCTL_IOC | 13)
149 #define	DEVCTL_AP_CONNECT	(DEVCTL_IOC | 14)
150 #define	DEVCTL_AP_DISCONNECT	(DEVCTL_IOC | 15)
151 #define	DEVCTL_AP_INSERT	(DEVCTL_IOC | 16)
152 #define	DEVCTL_AP_REMOVE	(DEVCTL_IOC | 17)
153 #define	DEVCTL_AP_CONFIGURE	(DEVCTL_IOC | 18)
154 #define	DEVCTL_AP_UNCONFIGURE	(DEVCTL_IOC | 19)
155 #define	DEVCTL_AP_GETSTATE	(DEVCTL_IOC | 20)
156 #define	DEVCTL_AP_CONTROL	(DEVCTL_IOC | 21)
157 #define	DEVCTL_BUS_DEV_CREATE	(DEVCTL_IOC | 22)
158 #define	DEVCTL_PM_BUSY_COMP	(DEVCTL_IOC | 23)
159 #define	DEVCTL_PM_IDLE_COMP	(DEVCTL_IOC | 24)
160 #define	DEVCTL_PM_RAISE_PWR	(DEVCTL_IOC | 25)
161 #define	DEVCTL_PM_LOWER_PWR	(DEVCTL_IOC | 26)
162 #define	DEVCTL_PM_CHANGE_PWR_LOW	(DEVCTL_IOC | 27)
163 #define	DEVCTL_PM_CHANGE_PWR_HIGH	(DEVCTL_IOC | 28)
164 #define	DEVCTL_PM_POWER		(DEVCTL_IOC | 29)
165 #define	DEVCTL_PM_PROM_PRINTF	(DEVCTL_IOC | 30)
166 #define	DEVCTL_PM_FAIL_SUSPEND	(DEVCTL_IOC | 31)
167 #define	DEVCTL_PM_PWR_HAS_CHANGED_ON_RESUME	(DEVCTL_IOC | 32)
168 #define	DEVCTL_PM_PUP_WITH_PWR_HAS_CHANGED	(DEVCTL_IOC | 34)
169 #define	DEVCTL_PM_BUSY_COMP_TEST	(DEVCTL_IOC | 35)
170 #define	DEVCTL_PM_BUS_STRICT_TEST	(DEVCTL_IOC | 36)
171 #define	DEVCTL_PM_NO_LOWER_POWER	(DEVCTL_IOC | 37)
172 #define	DEVCTL_PM_BUS_NO_INVOL		(DEVCTL_IOC | 38)
173 #define	DEVCTL_SET_LED		(DEVCTL_IOC | 39)
174 #define	DEVCTL_GET_LED		(DEVCTL_IOC | 40)
175 #define	DEVCTL_NUM_LEDS		(DEVCTL_IOC | 41)
176 
177 
178 /*
179  * is (c) in the range of possible devctl IOCTL commands?
180  */
181 #define	IS_DEVCTL(c) (((c) >= DEVCTL_IOC) && ((c) <= DEVCTL_IOC_MAX))
182 
183 /*
184  * Device and Bus State definitions
185  *
186  * Device state is returned as a set of bit-flags that indicate the current
187  * operational state of a device node.
188  *
189  * Device nodes for leaf devices only contain state information for the
190  * device itself.  Nexus device nodes contain both Bus and Device state
191  * information.
192  *
193  * 	DEVICE_ONLINE  - Device is available for use by the system.  Mutually
194  *                       exclusive with DEVICE_OFFLINE.
195  *
196  *	DEVICE_OFFLINE - Device is unavailable for use by the system.
197  *			 Mutually exclusive with DEVICE_ONLINE and DEVICE_BUSY.
198  *
199  *	DEVICE_DOWN    - Device has been placed in the "DOWN" state by
200  *			 its controlling driver.
201  *
202  *	DEVICE_BUSY    - Device has open instances or nexus has INITALIZED
203  *                       children (nexi).  A device in this state is by
204  *			 definition Online.
205  *
206  * Bus state is returned as a set of bit-flags which indicates the
207  * operational state of a bus associated with the nexus dev_info node.
208  *
209  * 	BUS_ACTIVE     - The bus associated with the device node is Active.
210  *                       I/O requests from child devices attached to the
211  *			 are initiated (or queued for initiation) as they
212  *			 are received.
213  *
214  *	BUS_QUIESCED   - The bus associated with the device node has been
215  *			 Quieced. I/O requests from child devices attached
216  *			 to the bus are held pending until the bus nexus is
217  *			 Unquiesced.
218  *
219  *	BUS_SHUTDOWN   - The bus associated with the device node has been
220  *			 shutdown by the nexus driver.  I/O requests from
221  *			 child devices are returned with an error indicating
222  *			 the requested operation failed.
223  */
224 #define	DEVICE_ONLINE	0x1
225 #define	DEVICE_BUSY	0x2
226 #define	DEVICE_OFFLINE  0x4
227 #define	DEVICE_DOWN	0x8
228 
229 #define	BUS_ACTIVE	0x10
230 #define	BUS_QUIESCED	0x20
231 #define	BUS_SHUTDOWN	0x40
232 
233 #define	DEVICE_STATES_ASCII	"Dev_Online", "Dev_Busy", "Dev_Offline", \
234 	"Dev_Down", "Bus_Active", "Bus_Quiesced", "Bus_Shutdown"
235 
236 #define	DC_DEVI_NODENAME	"ndi_dc.devi_nodename"
237 
238 #define	DEVCTL_CONSTRUCT	0x1
239 #define	DEVCTL_OFFLINE		0x2
240 
241 /*
242  * Drive status LED control
243  */
244 struct dc_led_ctl {
245 	uint32_t	led_number : 16;	/* LED/device number */
246 	uint32_t	led_ctl_active : 1;	/* Control active */
247 	uint32_t	led_type : 9;		/* LED type */
248 	uint32_t	led_state : 6;		/* LED ON/OFF/Blink state */
249 };
250 
251 /* Control active field */
252 #define	DCL_CNTRL_OFF		0	/* Control inactive */
253 #define	DCL_CNTRL_ON		1	/* Control active */
254 
255 /* LED type field */
256 #define	DCL_TYPE_DEVICE_FAIL	1	/* Device FAIL LED type */
257 #define	DCL_TYPE_DEVICE_OK2RM	2	/* Device OK2RM LED type */
258 
259 /* LED state field */
260 #define	DCL_STATE_OFF		0	/* LED state OFF */
261 #define	DCL_STATE_ON		1	/* LED state ON */
262 #define	DCL_STATE_SLOW_BLNK	2	/* LED slow blink */
263 #define	DCL_STATE_FAST_BLNK	3	/* LED fast blink */
264 
265 #ifdef	__cplusplus
266 }
267 #endif
268 
269 #endif	/* _SYS_DEVCTL_H */
270