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