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