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