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