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 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SYS_RAIDCFG_SPI_H
28 #define	_SYS_RAIDCFG_SPI_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #include <sys/types.h>
33 
34 #ifdef	__cplusplus
35 extern "C" {
36 #endif
37 
38 /*
39  * Controller capabilities
40  */
41 #define	RAID_CAP_RAID0		1
42 #define	RAID_CAP_RAID1		1 << 1
43 #define	RAID_CAP_RAID1E		1 << 2
44 #define	RAID_CAP_RAID5		1 << 3
45 #define	RAID_CAP_RAID10		1 << 4
46 #define	RAID_CAP_RAID50		1 << 5
47 #define	RAID_CAP_G_HSP		1 << 6
48 #define	RAID_CAP_L_HSP		1 << 7
49 #define	RAID_CAP_DISK_TRANS	1 << 8
50 #define	RAID_CAP_FULL_DISK_ONLY	1 << 9
51 #define	RAID_CAP_SMART_ALLOC	1 << 10
52 #define	RAID_CAP_ARRAY_ALIGN	1 << 11
53 
54 /*
55  * General constants
56  */
57 #define	OBJ_SEPARATOR_BEGIN	-1
58 #define	OBJ_SEPARATOR_END	-2
59 
60 #define	OBJ_ATTR_NONE		-1
61 
62 /*
63  * Array RAID level definition
64  */
65 #define	RAID_LEVEL_0		1
66 #define	RAID_LEVEL_1		2
67 #define	RAID_LEVEL_1E		3
68 #define	RAID_LEVEL_5		4
69 #define	RAID_LEVEL_10		5
70 #define	RAID_LEVEL_50		6
71 
72 /*
73  * Array cache write policy
74  */
75 #define	CACHE_WR_OFF		0
76 #define	CACHE_WR_ON		1
77 
78 /*
79  * Array cache read policy
80  */
81 #define	CACHE_RD_OFF		0
82 #define	CACHE_RD_ON		1
83 
84 /*
85  * Array activation action
86  */
87 #define	ARRAY_ACT_ACTIVATE	0
88 
89 /*
90  * Array status
91  */
92 #define	ARRAY_STATE_OPTIMAL	0
93 #define	ARRAY_STATE_DEGRADED	1
94 #define	ARRAY_STATE_FAILED	2
95 #define	ARRAY_STATE_MISSING	3
96 
97 /*
98  * Array activation state
99  */
100 #define	ARRAY_STATE_INACTIVATE	0x8000
101 
102 /*
103  * Disk state
104  */
105 #define	DISK_STATE_GOOD		0
106 #define	DISK_STATE_FAILED	1
107 
108 /*
109  * Array part state
110  */
111 #define	ARRAYPART_STATE_GOOD	0
112 #define	ARRAYPART_STATE_MISSED	1
113 
114 /*
115  * Disk segment state
116  */
117 #define	DISKSEG_STATE_GOOD	1
118 #define	DISKSEG_STATE_RESERVED	1 << 1
119 #define	DISKSEG_STATE_DEAD	1 << 2
120 #define	DISKSEG_STATE_NORMAL	1 << 3
121 
122 /*
123  * Controller connection type
124  */
125 #define	TYPE_UNKNOWN		0
126 #define	TYPE_SCSI		1
127 #define	TYPE_SAS		2
128 
129 #define	RAID_TASK_SUSPEND	0
130 #define	RAID_TASK_RESUME	1
131 #define	RAID_TASK_TERMINATE	2
132 
133 #define	HSP_TYPE_GLOBAL		0
134 #define	HSP_TYPE_LOCAL		1
135 
136 /*
137  * Sub-command of set attribute
138  */
139 #define	SET_CACHE_WR_PLY	0
140 #define	SET_CACHE_RD_PLY	1
141 #define	SET_ACTIVATION_PLY	2
142 
143 /*
144  * Sub-commands for act method of object
145  */
146 #define	ACT_CONTROLLER_OPEN	0
147 #define	ACT_CONTROLLER_CLOSE	1
148 #define	ACT_CONTROLLER_FLASH_FW	2
149 
150 /*
151  * Some definitions
152  */
153 #define	CONTROLLER_FW_LEN	32
154 #define	CONTROLLER_TYPE_LEN	32
155 
156 #define	DISK_VENDER_LEN		8
157 #define	DISK_PRODUCT_LEN	16
158 #define	DISK_REV_LEN		4
159 
160 #define	RDCFG_PLUGIN_V1		0x10000
161 #define	CFGDIR		"/dev/cfg"
162 #define	MAX_PATH_LEN		255
163 
164 /*
165  * Mininum array part size: 256M
166  */
167 #define	ARRAYPART_MIN_SIZE	(uint64_t)(1 << 28)
168 
169 /*
170  * Return code
171  */
172 #define	SUCCESS			0
173 #define	STD_IOCTL		-1
174 #define	ERR_DRIVER_NOT_FOUND	-2
175 #define	ERR_DRIVER_OPEN		-3
176 #define	ERR_DRIVER_LOCK		-4
177 #define	ERR_DRIVER_CLOSED	-5
178 #define	ERR_DRIVER_ACROSS	-6
179 #define	ERR_ARRAY_LEVEL		-7
180 #define	ERR_ARRAY_SIZE		-8
181 #define	ERR_ARRAY_STRIPE_SIZE	-9
182 #define	ERR_ARRAY_CACHE_POLICY	-10
183 #define	ERR_ARRAY_IN_USE	-11
184 #define	ERR_ARRAY_TASK		-12
185 #define	ERR_ARRAY_CONFIG	-13
186 #define	ERR_ARRAY_DISKNUM	-14
187 #define	ERR_ARRAY_LAYOUT	-15
188 #define	ERR_ARRAY_AMOUNT	-16
189 #define	ERR_DISK_STATE		-17
190 #define	ERR_DISK_SPACE		-18
191 #define	ERR_DISK_SEG_AMOUNT	-19
192 #define	ERR_DISK_NOT_EMPTY	-20
193 #define	ERR_DISK_TASK		-21
194 #define	ERR_TASK_STATE		-22
195 #define	ERR_OP_ILLEGAL		-23
196 #define	ERR_OP_NO_IMPL		-24
197 #define	ERR_OP_FAILED		-25
198 #define	ERR_DEVICE_NOENT	-26
199 #define	ERR_DEVICE_TYPE		-27
200 #define	ERR_DEVICE_DUP		-28
201 #define	ERR_DEVICE_OVERFLOW	-29
202 #define	ERR_DEVICE_UNCLEAN	-30
203 #define	ERR_DEVICE_INVALID	-31
204 #define	ERR_NOMEM		-32
205 #define	ERR_PRIV		-33
206 #define	ERR_PLUGIN		-34
207 
208 /*
209  * Raid object types
210  */
211 typedef enum {
212 	OBJ_TYPE_SYSTEM,
213 	OBJ_TYPE_CONTROLLER,
214 	OBJ_TYPE_ARRAY,
215 	OBJ_TYPE_DISK,
216 	OBJ_TYPE_HSP,
217 	OBJ_TYPE_ARRAY_PART,
218 	OBJ_TYPE_DISK_SEG,
219 	OBJ_TYPE_TASK,
220 	OBJ_TYPE_PROP,
221 	OBJ_TYPE_ALL
222 } raid_obj_type_id_t;
223 
224 /*
225  * Task functions
226  */
227 typedef enum {
228 	TASK_FUNC_UNKNOWN,
229 	TASK_FUNC_INIT,
230 	TASK_FUNC_BUILD,
231 	TASK_FUNC_VERIFY
232 } raidtask_func_t;
233 
234 /*
235  * Task state
236  */
237 typedef enum {
238 	TASK_STATE_UNKNOWN,
239 	TASK_STATE_TERMINATED,
240 	TASK_STATE_FAILED,
241 	TASK_STATE_DONE,
242 	TASK_STATE_RUNNING,
243 	TASK_STATE_SUSPENDED
244 } raidtask_state_t;
245 
246 /*
247  * Properties
248  */
249 typedef	enum {
250 	PROP_GUID
251 } property_type_t;
252 
253 /*
254  * Attributes of all RAID objects
255  */
256 typedef union {
257 	uint64_t	reserved[3];
258 	struct {
259 		uint64_t	target_id;
260 		uint64_t	lun;
261 	} idl;
262 } array_tag_t;
263 
264 typedef union {
265 	struct {
266 		uint64_t bus;
267 		uint64_t target_id;
268 		uint64_t lun;
269 	} cidl;
270 } disk_tag_t;
271 
272 typedef struct {
273 	uint32_t	controller_id;
274 	uint32_t	max_array_num;
275 	uint32_t	max_seg_per_disk;
276 	uint32_t	connection_type;
277 	uint64_t	capability;
278 	char		fw_version[CONTROLLER_FW_LEN];
279 	char		controller_type[CONTROLLER_TYPE_LEN];
280 } controller_attr_t;
281 
282 typedef struct {
283 	uint32_t	array_id;
284 	uint32_t	state;
285 	array_tag_t	tag;
286 	uint64_t	capacity;
287 	uint32_t	raid_level;
288 	uint32_t	stripe_size;
289 	uint32_t	write_policy;
290 	uint32_t	read_policy;
291 } array_attr_t;
292 
293 typedef struct {
294 	uint32_t	disk_id;
295 	uint32_t	state;
296 	disk_tag_t	tag;
297 	uint64_t	capacity;
298 	char		vendorid[DISK_VENDER_LEN];
299 	char		productid[DISK_PRODUCT_LEN];
300 	char		revision[DISK_REV_LEN];
301 } disk_attr_t;
302 
303 typedef struct {
304 	uint32_t	associated_id;
305 	uint32_t	type;
306 } hsp_attr_t;
307 
308 typedef struct {
309 	uint32_t	disk_id;
310 	uint32_t	state;
311 	uint64_t	offset;
312 	uint64_t	size;
313 } arraypart_attr_t;
314 
315 typedef struct {
316 	uint32_t	seq_no;
317 	uint32_t	state;
318 	uint64_t	offset;
319 	uint64_t	size;
320 } diskseg_attr_t;
321 
322 typedef struct {
323 	uint32_t	task_id;
324 	uint32_t	task_func;
325 	uint32_t	task_state;
326 	uint32_t	progress;
327 } task_attr_t;
328 
329 typedef struct {
330 	uint32_t	prop_id;
331 	uint32_t	prop_size;
332 	property_type_t	prop_type;
333 	char		prop[1];
334 } property_attr_t;
335 
336 typedef struct {
337 	uint32_t	array_id;
338 	uint32_t	disk_id;
339 } hsp_relation_t;
340 
341 /*
342  * Structure used to register plug-in modules
343  */
344 typedef	struct raid_lib_type {
345 	uint32_t version;
346 	struct raid_lib_type *next;
347 	void	*lib_handle;
348 	const char	*name;
349 
350 	int (*open_controller)(uint32_t, char **);
351 	int (*close_controller)(uint32_t, char **);
352 	int (*compnum)(uint32_t, uint32_t, raid_obj_type_id_t,
353 		raid_obj_type_id_t);
354 	int (*complist)(uint32_t, uint32_t, raid_obj_type_id_t,
355 		raid_obj_type_id_t, int, void *);
356 	int (*get_attr)(uint32_t, uint32_t, uint32_t, raid_obj_type_id_t,
357 		void *);
358 	int (*set_attr)(uint32_t, uint32_t, uint32_t, uint32_t *, char **);
359 	int (*array_create)(uint32_t, array_attr_t *, int,
360 		arraypart_attr_t *, char **);
361 	int (*array_delete)(uint32_t, uint32_t, char **);
362 	int (*hsp_bind)(uint32_t, uint32_t, hsp_relation_t *, char **);
363 	int (*hsp_unbind)(uint32_t, uint32_t, hsp_relation_t *, char **);
364 	int (*flash_fw)(uint32_t, char *, uint32_t, char **);
365 } raid_lib_t;
366 
367 #ifdef	__cplusplus
368 }
369 #endif
370 
371 #endif	/* _SYS_RAIDCFG_SPI_H */
372