| 1 | /* $NetBSD: icpreg.h,v 1.7 2008/09/08 23:36:54 gmcgarry Exp $ */ |
| 2 | |
| 3 | /*- |
| 4 | * Copyright (c) 2002 The NetBSD Foundation, Inc. |
| 5 | * All rights reserved. |
| 6 | * |
| 7 | * This code is derived from software contributed to The NetBSD Foundation |
| 8 | * by Andrew Doran. |
| 9 | * |
| 10 | * Redistribution and use in source and binary forms, with or without |
| 11 | * modification, are permitted provided that the following conditions |
| 12 | * are met: |
| 13 | * 1. Redistributions of source code must retain the above copyright |
| 14 | * notice, this list of conditions and the following disclaimer. |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in the |
| 17 | * documentation and/or other materials provided with the distribution. |
| 18 | * |
| 19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
| 20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
| 21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
| 23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 29 | * POSSIBILITY OF SUCH DAMAGE. |
| 30 | */ |
| 31 | |
| 32 | /* |
| 33 | * Copyright (c) 1999, 2000 Niklas Hallqvist. All rights reserved. |
| 34 | * |
| 35 | * Redistribution and use in source and binary forms, with or without |
| 36 | * modification, are permitted provided that the following conditions |
| 37 | * are met: |
| 38 | * 1. Redistributions of source code must retain the above copyright |
| 39 | * notice, this list of conditions and the following disclaimer. |
| 40 | * 2. Redistributions in binary form must reproduce the above copyright |
| 41 | * notice, this list of conditions and the following disclaimer in the |
| 42 | * documentation and/or other materials provided with the distribution. |
| 43 | * 3. All advertising materials mentioning features or use of this software |
| 44 | * must display the following acknowledgement: |
| 45 | * This product includes software developed by Niklas Hallqvist. |
| 46 | * 4. The name of the author may not be used to endorse or promote products |
| 47 | * derived from this software without specific prior written permission. |
| 48 | * |
| 49 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
| 50 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| 51 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| 52 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
| 53 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| 54 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 55 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 56 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 57 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 58 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 59 | * |
| 60 | * from OpenBSD: gdtreg.h,v 1.1 2000/02/07 00:33:03 niklas Exp |
| 61 | */ |
| 62 | |
| 63 | #ifndef _IC_ICPREG_H_ |
| 64 | #define _IC_ICPREG_H_ |
| 65 | |
| 66 | #define ICP_MAXBUS 6 /* XXX Why not 5? */ |
| 67 | #define ICP_MAX_LDRIVES 255 /* max logical drive count */ |
| 68 | #define ICP_MAX_HDRIVES 100 /* max host drive count */ |
| 69 | #define ICP_MAXID_FC 127 /* Fibre-channel maximum ID */ |
| 70 | #define ICP_MAXOFFSETS 128 |
| 71 | #define ICP_MAXSG 17 /* Max. s/g elements; actually 128 */ |
| 72 | #define ICP_PROTOCOL_VERSION 1 |
| 73 | #define ICP_LINUX_OS 8 /* Used for cache optimization */ |
| 74 | #define ICP_SCATTER_GATHER 1 /* s/g feature */ |
| 75 | #define ICP_SECS32 0x1f /* round capacity */ |
| 76 | #define ICP_LOCALBOARD 0 /* Board node always 0 */ |
| 77 | #define ICP_MAX_CMDS 124 |
| 78 | #define ICP_SECTOR_SIZE 0x200 /* Always 512 bytes for cache devs */ |
| 79 | #define ICP_MAX_EVENTS 0x100 /* event buffer */ |
| 80 | |
| 81 | /* DPMEM constants */ |
| 82 | #define ICP_MPR_MAGIC 0xc0ffee11 |
| 83 | #define 48 |
| 84 | #define ICP_IC_QUEUE_BYTES 4 |
| 85 | |
| 86 | /* Cache/raw service commands */ |
| 87 | #define ICP_INIT 0 /* service initialization */ |
| 88 | #define ICP_READ 1 /* read command */ |
| 89 | #define ICP_WRITE 2 /* write command */ |
| 90 | #define ICP_INFO 3 /* information about devices */ |
| 91 | #define ICP_FLUSH 4 /* flush dirty cache buffers */ |
| 92 | #define ICP_IOCTL 5 /* ioctl command */ |
| 93 | #define ICP_DEVTYPE 9 /* additional information */ |
| 94 | #define ICP_MOUNT 10 /* mount cache device */ |
| 95 | #define ICP_UNMOUNT 11 /* unmount cache device */ |
| 96 | #define ICP_SET_FEAT 12 /* set features (scatter/gather) */ |
| 97 | #define ICP_GET_FEAT 13 /* get features */ |
| 98 | #define ICP_WRITE_THR 16 /* write through */ |
| 99 | #define ICP_READ_THR 17 /* read through */ |
| 100 | #define ICP_EXT_INFO 18 /* extended info */ |
| 101 | #define ICP_RESET 19 /* controller reset */ |
| 102 | #define ICP_FREEZE_IO 25 /* freeze all IOs */ |
| 103 | #define ICP_UNFREEZE_IO 26 /* unfreeze all IOs */ |
| 104 | |
| 105 | /* Additional raw service commands */ |
| 106 | #define ICP_RESERVE 14 /* reserve device to raw service */ |
| 107 | #define ICP_RELEASE 15 /* release device */ |
| 108 | #define ICP_RESERVE_ALL 16 /* reserve all devices */ |
| 109 | #define ICP_RELEASE_ALL 17 /* release all devices */ |
| 110 | #define ICP_RESET_BUS 18 /* reset bus */ |
| 111 | #define ICP_SCAN_START 19 /* start device scan */ |
| 112 | #define ICP_SCAN_END 20 /* stop device scan */ |
| 113 | |
| 114 | /* IOCTL command defines */ |
| 115 | #define ICP_SCSI_DR_INFO 0x00 /* SCSI drive info */ |
| 116 | #define ICP_SCSI_CHAN_CNT 0x05 /* SCSI channel count */ |
| 117 | #define ICP_SCSI_DR_LIST 0x06 /* SCSI drive list */ |
| 118 | #define ICP_SCSI_DEF_CNT 0x15 /* grown/primary defects */ |
| 119 | #define ICP_DSK_STATISTICS 0x4b /* SCSI disk statistics */ |
| 120 | #define ICP_IOCHAN_DESC 0x5d /* description of IO channel */ |
| 121 | #define ICP_IOCHAN_RAW_DESC 0x5e /* description of raw IO channel */ |
| 122 | |
| 123 | #define ICP_L_CTRL_PATTERN 0x20000000 /* SCSI IOCTL mask */ |
| 124 | #define ICP_ARRAY_INFO 0x12 /* array drive info */ |
| 125 | #define ICP_ARRAY_DRV_LIST 0x0f /* array drive list */ |
| 126 | #define ICP_LA_CTRL_PATTERN 0x10000000 /* array IOCTL mask */ |
| 127 | #define ICP_CACHE_DRV_CNT 0x01 /* cache drive count */ |
| 128 | #define ICP_CACHE_DRV_LIST 0x02 /* cache drive list */ |
| 129 | #define ICP_CACHE_INFO 0x04 /* cache info */ |
| 130 | #define ICP_CACHE_CONFIG 0x05 /* cache configuration */ |
| 131 | #define ICP_CACHE_DRV_INFO 0x07 /* cache drive info */ |
| 132 | #define ICP_BOARD_FEATURES 0x15 /* controller features */ |
| 133 | #define ICP_BOARD_INFO 0x28 /* controller info */ |
| 134 | #define ICP_HOST_GET 0x10001 /* get host drive list */ |
| 135 | #define ICP_IO_CHANNEL 0x20000 /* default IO channel */ |
| 136 | #define ICP_INVALID_CHANNEL 0xffff /* invalid channel */ |
| 137 | |
| 138 | /* Service errors */ |
| 139 | #define ICP_S_MSG_REQUEST 0 /* screen service: async evt message */ |
| 140 | #define ICP_S_OK 1 /* no error */ |
| 141 | #define ICP_S_BSY 7 /* controller busy */ |
| 142 | #define ICP_S_RAW_SCSI 12 /* raw service: target error */ |
| 143 | #define ICP_S_RAW_ILL 0xff /* raw service: illegal */ |
| 144 | #define ICP_S_NO_STATUS 0x1000 /* got no status (driver-generated) */ |
| 145 | |
| 146 | /* Controller services */ |
| 147 | #define ICP_SCSIRAWSERVICE 3 |
| 148 | #define ICP_CACHESERVICE 9 |
| 149 | #define ICP_SCREENSERVICE 11 |
| 150 | |
| 151 | /* Data direction raw service. */ |
| 152 | #define ICP_DATA_IN 0x01000000 |
| 153 | #define ICP_DATA_OUT 0x00000000 |
| 154 | |
| 155 | /* Command queue entries */ |
| 156 | #define ICP_OFFSET 0x00 /* u_int16_t, command offset in the DP RAM */ |
| 157 | #define ICP_SERV_ID 0x02 /* u_int16_t, service */ |
| 158 | #define ICP_COMM_Q_SZ 0x04 |
| 159 | |
| 160 | /* Interface area */ |
| 161 | #define ICP_S_CMD_INDX 0x00 /* u_int8_t, special command */ |
| 162 | #define ICP_S_STATUS 0x01 /* volatile u_int8_t, status special command */ |
| 163 | #define ICP_S_INFO 0x04 /* u_int32_t [4], add. info special command */ |
| 164 | #define ICP_SEMA0 0x14 /* volatile u_int8_t, command semaphore */ |
| 165 | #define ICP_CMD_INDEX 0x18 /* u_int8_t, command number */ |
| 166 | #define ICP_STATUS 0x1c /* volatile u_int16_t, command status */ |
| 167 | #define ICP_SERVICE 0x1e /* u_int16_t, service (for asynch. events) */ |
| 168 | #define ICP_DPR_INFO 0x20 /* u_int32_t [2], additional info */ |
| 169 | #define ICP_COMM_QUEUE 0x28 /* command queue */ |
| 170 | #define ICP_DPR_CMD (0x30 + ICP_MAXOFFSETS * ICP_COMM_Q_SZ) |
| 171 | /* u_int8_t [], commands */ |
| 172 | #define ICP_DPR_IF_SZ ICP_DPR_CMD |
| 173 | |
| 174 | /* Get cache info */ |
| 175 | #define ICP_CINFO_CPAR 0x00 |
| 176 | #define ICP_CINFO_CSTAT 0x0c |
| 177 | |
| 178 | /* Other defines */ |
| 179 | #define ICP_ASYNCINDEX 0 /* command index asynchronous event */ |
| 180 | #define ICP_SPEZINDEX 1 /* command index unknown service */ |
| 181 | |
| 182 | /* I/O channel header */ |
| 183 | struct icp_ioc_version { |
| 184 | u_int32_t iv_version; /* version (~0: newest) */ |
| 185 | u_int8_t iv_listents; /* list entry count */ |
| 186 | u_int8_t iv_firstchan; /* first channel number */ |
| 187 | u_int8_t iv_lastchan; /* last channel number */ |
| 188 | u_int8_t iv_chancount; /* channel count */ |
| 189 | u_int32_t iv_listoffset; /* offset of list[0] */ |
| 190 | } __packed; |
| 191 | |
| 192 | #define ICP_IOC_NEWEST 0xffffffff |
| 193 | |
| 194 | /* Get I/O channel description */ |
| 195 | struct icp_ioc { |
| 196 | u_int32_t io_addr; /* channel address */ |
| 197 | u_int8_t io_type; /* type (SCSI/FCAL) */ |
| 198 | u_int8_t io_localno; /* local number */ |
| 199 | u_int16_t io_features; /* channel features */ |
| 200 | } __packed; |
| 201 | |
| 202 | /* Get raw I/O channel description */ |
| 203 | struct icp_rawioc { |
| 204 | u_int8_t ri_procid; /* processor ID */ |
| 205 | u_int8_t ri_defect; /* defect? */ |
| 206 | u_int16_t ri_padding; |
| 207 | } __packed; |
| 208 | |
| 209 | /* Get SCSI channel count */ |
| 210 | struct icp_getch { |
| 211 | u_int32_t gc_channo; /* channel number */ |
| 212 | u_int32_t gc_drivecnt; /* drive count */ |
| 213 | u_int8_t gc_scsiid; /* SCSI initiator ID */ |
| 214 | u_int8_t gc_scsistate; /* SCSI processor state */ |
| 215 | } __packed; |
| 216 | |
| 217 | /* Cache info/config IOCTL structures */ |
| 218 | struct icp_cpar { |
| 219 | u_int32_t cp_version; /* firmware version */ |
| 220 | u_int16_t cp_state; /* cache state (on/off) */ |
| 221 | u_int16_t cp_strategy; /* cache strategy */ |
| 222 | u_int16_t cp_write_back; /* write back (on/off) */ |
| 223 | u_int16_t cp_block_size; /* cache block size */ |
| 224 | } __packed; |
| 225 | |
| 226 | struct icp_cstat { |
| 227 | u_int32_t cs_size; /* cache size */ |
| 228 | u_int32_t cs_readcnt; /* read counter */ |
| 229 | u_int32_t cs_writecnt; /* write counter */ |
| 230 | u_int32_t cs_trhits; /* track hits */ |
| 231 | u_int32_t cs_sechits; /* sector hits */ |
| 232 | u_int32_t cs_secmiss; /* sector misses */ |
| 233 | } __packed; |
| 234 | |
| 235 | /* Board information. */ |
| 236 | struct icp_binfo { |
| 237 | u_int32_t bi_ser_no; /* serial number */ |
| 238 | u_int8_t bi_oem_id[2]; /* OEM ID */ |
| 239 | u_int16_t bi_ep_flags; /* eprom flags */ |
| 240 | u_int32_t bi_proc_id; /* processor ID */ |
| 241 | u_int32_t bi_memsize; /* memory size (bytes) */ |
| 242 | u_int8_t bi_mem_banks; /* memory banks */ |
| 243 | u_int8_t bi_chan_type; /* channel type */ |
| 244 | u_int8_t bi_chan_count; /* channel count */ |
| 245 | u_int8_t bi_rdongle_pres; /* dongle present */ |
| 246 | u_int32_t bi_epr_fw_ver; /* (eprom) firmware ver */ |
| 247 | u_int32_t bi_upd_fw_ver; /* (update) firmware ver */ |
| 248 | u_int32_t bi_upd_revision; /* update revision */ |
| 249 | char bi_type_string[16]; /* char controller name */ |
| 250 | char bi_raid_string[16]; /* char RAID firmware name */ |
| 251 | u_int8_t bi_update_pres; /* update present? */ |
| 252 | u_int8_t bi_xor_pres; /* XOR engine present */ |
| 253 | u_int8_t bi_prom_type; /* ROM type (eprom/flash) */ |
| 254 | u_int8_t bi_prom_count; /* number of ROM devices */ |
| 255 | u_int32_t bi_dup_pres; /* duplexing module pres? */ |
| 256 | u_int32_t bi_chan_pres; /* # of exp. channels */ |
| 257 | u_int32_t bi_mem_pres; /* memory expansion inst? */ |
| 258 | u_int8_t bi_ft_bus_system; /* fault bus supported? */ |
| 259 | u_int8_t bi_subtype_valid; /* board_subtype valid */ |
| 260 | u_int8_t bi_board_subtype; /* subtype/hardware level */ |
| 261 | u_int8_t bi_rampar_pres; /* RAM parity check hw? */ |
| 262 | } __packed; |
| 263 | |
| 264 | /* Board features. */ |
| 265 | struct icp_bfeat { |
| 266 | u_int8_t bf_chaining; /* chaining supported */ |
| 267 | u_int8_t bf_striping; /* striping (RAID-0) supported */ |
| 268 | u_int8_t bf_mirroring; /* mirroring (RAID-1) supported */ |
| 269 | u_int8_t bf_raid; /* RAID-4/5/10 supported */ |
| 270 | } __packed; |
| 271 | |
| 272 | /* Cache drive information. */ |
| 273 | struct icp_cdevinfo { |
| 274 | char cd_name[8]; |
| 275 | u_int32_t cd_devtype; |
| 276 | u_int32_t cd_ldcnt; |
| 277 | u_int32_t cd_last_error; |
| 278 | u_int8_t cd_initialized; |
| 279 | u_int8_t cd_removable; |
| 280 | u_int8_t cd_write_protected; |
| 281 | u_int8_t cd_flags; |
| 282 | u_int32_t ld_blkcnt; |
| 283 | u_int32_t ld_blksize; |
| 284 | u_int32_t ld_dcnt; |
| 285 | u_int32_t ld_slave; |
| 286 | u_int32_t ld_dtype; |
| 287 | u_int32_t ld_last_error; |
| 288 | char ld_name[8]; |
| 289 | u_int8_t ld_error; |
| 290 | } __packed; |
| 291 | |
| 292 | struct icp_sg { |
| 293 | u_int32_t sg_addr; |
| 294 | u_int32_t sg_len; |
| 295 | } __packed; |
| 296 | |
| 297 | struct icp_cachecmd { |
| 298 | u_int16_t cc_deviceno; |
| 299 | u_int32_t cc_blockno; |
| 300 | u_int32_t cc_blockcnt; |
| 301 | u_int32_t cc_addr; /* ~0 == s/g */ |
| 302 | u_int32_t cc_nsgent; |
| 303 | struct icp_sg cc_sg[ICP_MAXSG]; |
| 304 | } __packed; |
| 305 | |
| 306 | struct icp_ioctlcmd { |
| 307 | u_int16_t ic_bufsize; |
| 308 | u_int32_t ic_subfunc; |
| 309 | u_int32_t ic_channel; |
| 310 | u_int32_t ic_addr; |
| 311 | } __packed; |
| 312 | |
| 313 | struct icp_screencmd { |
| 314 | u_int32_t sc_msghandle; |
| 315 | u_int32_t sc_msgaddr; |
| 316 | } __packed; |
| 317 | |
| 318 | struct icp_rawcmd { |
| 319 | u_int16_t rc_padding0; /* unused */ |
| 320 | u_int32_t rc_direction; /* data direction */ |
| 321 | u_int32_t rc_mdisc_time; /* disc. time (0: none) */ |
| 322 | u_int32_t rc_mcon_time; /* conn. time (0: none) */ |
| 323 | u_int32_t rc_sdata; /* dest address */ |
| 324 | u_int32_t rc_sdlen; /* data length */ |
| 325 | u_int32_t rc_clen; /* CDB length */ |
| 326 | u_int8_t rc_cdb[12]; /* SCSI CDB */ |
| 327 | u_int8_t rc_target; /* target ID */ |
| 328 | u_int8_t rc_lun; /* LUN */ |
| 329 | u_int8_t rc_bus; /* channel */ |
| 330 | u_int8_t rc_priority; /* priority; 0 only */ |
| 331 | u_int32_t rc_sense_len; /* sense length */ |
| 332 | u_int32_t rc_sense_addr; /* sense address */ |
| 333 | u_int32_t rc_padding1; /* unused */ |
| 334 | u_int32_t rc_nsgent; /* s/g element count */ |
| 335 | struct icp_sg rc_sg[ICP_MAXSG]; /* s/g list */ |
| 336 | } __packed; |
| 337 | |
| 338 | struct icp_cmdhdr { |
| 339 | u_int32_t cmd_boardnode; /* always 0 */ |
| 340 | u_int32_t cmd_cmdindex; /* command identifier */ |
| 341 | u_int16_t cmd_opcode; |
| 342 | } __packed; |
| 343 | |
| 344 | struct icp_cmd { |
| 345 | u_int32_t cmd_boardnode; /* always 0 */ |
| 346 | u_int32_t cmd_cmdindex; /* command identifier */ |
| 347 | u_int16_t cmd_opcode; |
| 348 | |
| 349 | union { |
| 350 | struct icp_rawcmd rc; |
| 351 | struct icp_screencmd sc; |
| 352 | struct icp_ioctlcmd ic; |
| 353 | struct icp_cachecmd cc; |
| 354 | } cmd_packet; |
| 355 | } __packed; |
| 356 | |
| 357 | #endif /* !_IC_ICPREG_H_ */ |
| 358 | |