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