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 DISK_ID(c, id, l) ((c) << 7 | (l) << 4 | (id)) 149 #define BUS(disk_id) ((disk_id) >> 7) 150 #define TARGET(disk_id) ((disk_id) & 0xf) 151 #define LUN(disk_id) (((disk_id) >> 4) & 0x7) 152 153 #define ARRAY_ID(id, l) ((l) << 16 | (id)) 154 #define ARRAY_TARGET(array_id) ((array_id) & 0xffff) 155 #define ARRAY_LUN(array_id) ((array_id) >> 16) 156 157 #define RDCFG_PLUGIN_V1 0x10000 158 #define CFGDIR "/dev/cfg" 159 #define MAX_PATH_LEN 255 160 161 /* 162 * Mininum array part size: 256M 163 */ 164 #define ARRAYPART_MIN_SIZE (uint64_t)(1 << 28) 165 166 /* 167 * Return code 168 */ 169 #define SUCCESS 0 170 #define STD_IOCTL -1 171 #define ERR_DRIVER_NOT_FOUND -2 172 #define ERR_DRIVER_OPEN -3 173 #define ERR_DRIVER_LOCK -4 174 #define ERR_DRIVER_CLOSED -5 175 #define ERR_DRIVER_ACROSS -6 176 #define ERR_ARRAY_LEVEL -7 177 #define ERR_ARRAY_SIZE -8 178 #define ERR_ARRAY_STRIPE_SIZE -9 179 #define ERR_ARRAY_CACHE_POLICY -10 180 #define ERR_ARRAY_IN_USE -11 181 #define ERR_ARRAY_TASK -12 182 #define ERR_ARRAY_CONFIG -13 183 #define ERR_ARRAY_DISKNUM -14 184 #define ERR_ARRAY_LAYOUT -15 185 #define ERR_ARRAY_AMOUNT -16 186 #define ERR_DISK_STATE -17 187 #define ERR_DISK_SPACE -18 188 #define ERR_DISK_SEG_AMOUNT -19 189 #define ERR_DISK_NOT_EMPTY -20 190 #define ERR_DISK_TASK -21 191 #define ERR_TASK_STATE -22 192 #define ERR_OP_ILLEGAL -23 193 #define ERR_OP_NO_IMPL -24 194 #define ERR_OP_FAILED -25 195 #define ERR_DEVICE_NOENT -26 196 #define ERR_DEVICE_TYPE -27 197 #define ERR_DEVICE_DUP -28 198 #define ERR_DEVICE_OVERFLOW -29 199 #define ERR_DEVICE_UNCLEAN -30 200 #define ERR_DEVICE_INVALID -31 201 #define ERR_NOMEM -32 202 #define ERR_PRIV -33 203 #define ERR_PLUGIN -34 204 205 /* 206 * Raid object types 207 */ 208 typedef enum { 209 OBJ_TYPE_SYSTEM, 210 OBJ_TYPE_CONTROLLER, 211 OBJ_TYPE_ARRAY, 212 OBJ_TYPE_DISK, 213 OBJ_TYPE_HSP, 214 OBJ_TYPE_ARRAY_PART, 215 OBJ_TYPE_DISK_SEG, 216 OBJ_TYPE_TASK, 217 OBJ_TYPE_ALL 218 } raid_obj_type_id_t; 219 220 /* 221 * Task functions 222 */ 223 typedef enum { 224 TASK_FUNC_UNKNOWN, 225 TASK_FUNC_INIT, 226 TASK_FUNC_BUILD, 227 TASK_FUNC_VERIFY 228 } raidtask_func_t; 229 230 /* 231 * Task state 232 */ 233 typedef enum { 234 TASK_STATE_UNKNOWN, 235 TASK_STATE_TERMINATED, 236 TASK_STATE_FAILED, 237 TASK_STATE_DONE, 238 TASK_STATE_RUNNING, 239 TASK_STATE_SUSPENDED 240 } raidtask_state_t; 241 242 /* 243 * Attributes of all RAID objects 244 */ 245 typedef union { 246 uint64_t reserved[3]; 247 struct { 248 uint64_t target_id; 249 uint64_t lun; 250 } idl; 251 } array_tag_t; 252 253 typedef union { 254 struct { 255 uint64_t bus; 256 uint64_t target_id; 257 uint64_t lun; 258 } cidl; 259 } disk_tag_t; 260 261 typedef struct { 262 uint32_t controller_id; 263 uint32_t max_array_num; 264 uint32_t max_seg_per_disk; 265 uint32_t connection_type; 266 uint64_t capability; 267 char fw_version[CONTROLLER_FW_LEN]; 268 char controller_type[CONTROLLER_TYPE_LEN]; 269 } controller_attr_t; 270 271 typedef struct { 272 uint32_t array_id; 273 uint32_t state; 274 array_tag_t tag; 275 uint64_t capacity; 276 uint32_t raid_level; 277 uint32_t stripe_size; 278 uint32_t write_policy; 279 uint32_t read_policy; 280 } array_attr_t; 281 282 typedef struct { 283 uint32_t disk_id; 284 uint32_t state; 285 disk_tag_t tag; 286 uint64_t capacity; 287 char vendorid[DISK_VENDER_LEN]; 288 char productid[DISK_PRODUCT_LEN]; 289 char revision[DISK_REV_LEN]; 290 } disk_attr_t; 291 292 typedef struct { 293 uint32_t associated_id; 294 uint32_t type; 295 } hsp_attr_t; 296 297 typedef struct { 298 uint32_t disk_id; 299 uint32_t state; 300 uint64_t offset; 301 uint64_t size; 302 } arraypart_attr_t; 303 304 typedef struct { 305 uint32_t seq_no; 306 uint32_t state; 307 uint64_t offset; 308 uint64_t size; 309 } diskseg_attr_t; 310 311 typedef struct { 312 uint32_t task_id; 313 uint32_t task_func; 314 uint32_t task_state; 315 uint32_t progress; 316 } task_attr_t; 317 318 typedef struct { 319 uint32_t array_id; 320 uint32_t disk_id; 321 } hsp_relation_t; 322 323 /* 324 * Structure used to register plug-in modules 325 */ 326 typedef struct raid_lib_type { 327 uint32_t version; 328 struct raid_lib_type *next; 329 void *lib_handle; 330 const char *name; 331 332 int (*open_controller)(uint32_t, char **); 333 int (*close_controller)(uint32_t, char **); 334 int (*compnum)(uint32_t, uint32_t, raid_obj_type_id_t, 335 raid_obj_type_id_t); 336 int (*complist)(uint32_t, uint32_t, raid_obj_type_id_t, 337 raid_obj_type_id_t, int, void *); 338 int (*get_attr)(uint32_t, uint32_t, uint32_t, raid_obj_type_id_t, 339 void *); 340 int (*set_attr)(uint32_t, uint32_t, uint32_t, uint32_t *, char **); 341 int (*array_create)(uint32_t, array_attr_t *, int, 342 arraypart_attr_t *, char **); 343 int (*array_delete)(uint32_t, uint32_t, char **); 344 int (*hsp_bind)(uint32_t, uint32_t, hsp_relation_t *, char **); 345 int (*hsp_unbind)(uint32_t, uint32_t, hsp_relation_t *, char **); 346 int (*flash_fw)(uint32_t, char *, uint32_t, char **); 347 } raid_lib_t; 348 349 #ifdef __cplusplus 350 } 351 #endif 352 353 #endif /* _SYS_RAIDCFG_SPI_H */ 354