Annotation of sys/dev/ic/twereg.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: twereg.h,v 1.8 2007/04/10 17:47:55 miod Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2000 Michael Shalayeff
! 5: * All rights reserved.
! 6: *
! 7: * Redistribution and use in source and binary forms, with or without
! 8: * modification, are permitted provided that the following conditions
! 9: * are met:
! 10: * 1. Redistributions of source code must retain the above copyright
! 11: * notice, this list of conditions and the following disclaimer.
! 12: * 2. Redistributions in binary form must reproduce the above copyright
! 13: * notice, this list of conditions and the following disclaimer in the
! 14: * documentation and/or other materials provided with the distribution.
! 15: *
! 16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 19: * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
! 20: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! 21: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
! 22: * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 23: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
! 24: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
! 25: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
! 26: * THE POSSIBILITY OF SUCH DAMAGE.
! 27: */
! 28: /*
! 29: * most of the meaning for registers were taken from
! 30: * freebsd driver, which in turn got 'em from linux.
! 31: * it seems those got 'em from windows driver, in turn.
! 32: */
! 33:
! 34:
! 35: /* general parameters */
! 36: #define TWE_MAX_UNITS 16
! 37: #define TWE_MAXOFFSETS 62
! 38: #define TWE_MAXCMDS 255
! 39: #define TWE_SECTOR_SIZE 512
! 40: #define TWE_ALIGN 512
! 41: #define TWE_MAXFER (TWE_MAXOFFSETS * PAGE_SIZE)
! 42:
! 43: /* registers */
! 44: #define TWE_CONTROL 0x00
! 45: #define TWE_CTRL_CHOSTI 0x00080000 /* clear host int */
! 46: #define TWE_CTRL_CATTNI 0x00040000 /* clear attention int */
! 47: #define TWE_CTRL_MCMDI 0x00020000 /* mask cmd int */
! 48: #define TWE_CTRL_MRDYI 0x00010000 /* mask ready int */
! 49: #define TWE_CTRL_ECMDI 0x00008000 /* enable cmd int */
! 50: #define TWE_CTRL_ERDYI 0x00004000 /* enable ready int */
! 51: #define TWE_CTRL_CERR 0x00000200 /* clear error status */
! 52: #define TWE_CTRL_SRST 0x00000100 /* soft reset */
! 53: #define TWE_CTRL_EINT 0x00000080 /* enable ints */
! 54: #define TWE_CTRL_MINT 0x00000040 /* mask ints */
! 55: #define TWE_CTRL_HOSTI 0x00000020 /* generate host int */
! 56: #define TWE_STATUS 0x04
! 57: #define TWE_STAT_MAJV 0xf0000000
! 58: #define TWE_MAJV(st) (((st) >> 28) & 0xf)
! 59: #define TWE_STAT_MINV 0x0f000000
! 60: #define TWE_MINV(st) (((st) >> 24) & 0xf)
! 61: #define TWE_STAT_PCIPAR 0x00800000
! 62: #define TWE_STAT_QUEUEE 0x00400000
! 63: #define TWE_STAT_CPUERR 0x00200000
! 64: #define TWE_STAT_PCIABR 0x00100000
! 65: #define TWE_STAT_HOSTI 0x00080000
! 66: #define TWE_STAT_ATTNI 0x00040000
! 67: #define TWE_STAT_CMDI 0x00020000
! 68: #define TWE_STAT_RDYI 0x00010000
! 69: #define TWE_STAT_CQF 0x00008000 /* cmd queue full */
! 70: #define TWE_STAT_RQE 0x00004000 /* ready queue empty */
! 71: #define TWE_STAT_CPURDY 0x00002000 /* cpu ready */
! 72: #define TWE_STAT_CQR 0x00001000 /* cmd queue ready */
! 73: #define TWE_STAT_FLAGS 0x00fff000 /* mask out other stuff */
! 74: #define TWE_STAT_BITS "\020\015cqr\016cpurdy\017rqe\20cqf" \
! 75: "\021rdyi\022cmdi\023attni\024hosti\025pciabr\026cpuerr\027queuee\030pcipar"
! 76:
! 77: #define TWE_COMMANDQUEUE 0x08
! 78: /*
! 79: * the segs offset is encoded into upper 3 bits of the opcode.
! 80: * i bet other bits mean something too
! 81: * upper 8 bits is the command size in 32bit words.
! 82: */
! 83: #define TWE_CMD_NOP 0x0200
! 84: #define TWE_CMD_INIT 0x0301
! 85: #define TWE_CMD_READ 0x0362
! 86: #define TWE_CMD_WRITE 0x0363
! 87: #define TWE_CMD_RDVRFY 0x0364
! 88: #define TWE_CMD_VERIFY 0x0365
! 89: #define TWE_CMD_ZRFUNIT 0x0208
! 90: #define TWE_CMD_RPLUNIT 0x0209
! 91: #define TWE_CMD_HOTSWAP 0x020a
! 92: #define TWE_CMD_SETATA 0x020c
! 93: #define TWE_CMD_FLUSH 0x020e
! 94: #define TWE_CMD_ABORT 0x020f
! 95: #define TWE_CMD_QSTAT 0x0210
! 96: #define TWE_CMD_GPARAM 0x0252
! 97: #define TWE_CMD_SPARAM 0x0253
! 98: #define TWE_CMD_NEWUNIT 0x0214
! 99: #define TWE_CMD_DELUNIT 0x0215
! 100: #define TWE_CMD_RBLUNIT 0x0217 /* rebuild */
! 101: #define TWE_CMD_SECINF 0x021a
! 102: #define TWE_CMD_AEN 0x021c
! 103: #define TWE_CMD_CMDPK 0x021d
! 104: #define TWE_READYQUEUE 0x0c
! 105: #define TWE_READYID(u) (((u) >> 4) & 0xff)
! 106:
! 107: /*
! 108: * From 3ware's documentation:
! 109: *
! 110: * All parameters maintained by the controller are grouped into related
! 111: * tables. Tables are are accessed indirectly via get and set parameter
! 112: * commands. To access a specific parameter in a table, the table ID and
! 113: * parameter index are used to uniquely identify a parameter. Table
! 114: * 0xffff is the directory table and provides a list of the table IDs and
! 115: * sizes of all other tables. Index zero in each table specifies the
! 116: * entire table, and index one specifies the size of the table. An entire
! 117: * table can be read or set by using index zero.
! 118: */
! 119:
! 120: /* get/set param table ids */
! 121: #define TWE_PARAM_ALL 0x000 /* everything */
! 122: #define TWE_PARAM_DSUM 0x002 /* drive summary */
! 123: #define TWE_PARAM_UC 0x003 /* unit config */
! 124: #define TWE_PARAM_DC 0x200 /* + 15 -- drive config (doc says 0x100) */
! 125: #define TWE_PARAM_UI 0x300 /* + 16 -- unit information */
! 126: #define TWE_PARAM_AEN 0x401
! 127: #define TWE_PARAM_VER 0x402 /* version info */
! 128: #define TWE_PARAM_CTRL 0x403 /* controller info */
! 129: #define TWE_PARAM_FTRS 0x404 /* features */
! 130: #define TWE_PARAM_DIR 0xffff /* param table directory */
! 131:
! 132: #define TWE_AEN_QEMPTY 0x0000
! 133: #define TWE_AEN_SRST 0x0001 /* soft reset */
! 134: #define TWE_AEN_DMIRROR 0x0002 /* degraded mirror */
! 135: #define TWE_AEN_CERROR 0x0003 /* controller error */
! 136: #define TWE_AEN_RBFAIL 0x0004 /* rebuild failed */
! 137: #define TWE_AEN_RBDONE 0x0005 /* rebuild done */
! 138: #define TWE_AEN_ILLUN 0x0006 /* incompatible unit */
! 139: #define TWE_AEN_INDONE 0x0007 /* init done */
! 140: #define TWE_AEN_DSHUT 0x0008 /* unclean shutdown */
! 141: #define TWE_AEN_APORT 0x0009 /* aport timeout */
! 142: #define TWE_AEN_DRVERR 0x000a /* drive error */
! 143: #define TWE_AEN_RBSTART 0x000b /* rebuild start */
! 144: #define TWE_AEN_ISTART 0x000c /* init started */
! 145: #define TWE_AEN_TUN 0x0015 /* table undefined */
! 146: /* TWE_AEN_ 0x0000 * dunno what this is (yet) */
! 147: #define TWE_AEN_QFULL 0x00ff
! 148:
! 149: #pragma pack(1)
! 150:
! 151: /* struct definitions */
! 152: struct twe_param {
! 153: u_int16_t table_id;
! 154: u_int8_t param_id;
! 155: u_int8_t param_size;
! 156: u_int8_t data[1];
! 157: };
! 158:
! 159: struct twe_segs {
! 160: u_int32_t twes_addr;
! 161: u_int32_t twes_len;
! 162: };
! 163:
! 164: struct twe_cmd {
! 165: u_int16_t cmd_op;
! 166: u_int8_t cmd_index;
! 167: u_int8_t cmd_unit_host;
! 168: #define TWE_UNITHOST(u, h) (((u) & 0xf) | ((h) << 4))
! 169: u_int8_t cmd_status;
! 170: u_int8_t cmd_flags;
! 171: #define TWE_FLAGS_CACHEDISABLE 0x01
! 172: union {
! 173: struct {
! 174: u_int16_t count;
! 175: u_int32_t lba;
! 176: struct twe_segs segs[TWE_MAXOFFSETS];
! 177: u_int32_t pad;
! 178: } _cmd_io;
! 179: #define cmd_io _._cmd_io
! 180: struct {
! 181: u_int16_t count;
! 182: struct twe_segs segs[TWE_MAXOFFSETS];
! 183: } _cmd_param;
! 184: #define cmd_param _._cmd_param
! 185: struct {
! 186: u_int16_t msgcr;
! 187: u_int32_t rdy_q_ptr;
! 188: } _cmd_init;
! 189: #define cmd_init _._cmd_init
! 190: struct {
! 191: u_int8_t action;
! 192: #define TWE_HSWAP_REMOVE 0
! 193: #define TWE_HSWAP_ADDCBOD 1
! 194: #define TWE_HSWAP_ADDSPARE 2
! 195: u_int8_t port;
! 196: } _cmd_aport;
! 197: #define cmd_hswap _._cmd_hswap
! 198: struct {
! 199: u_int8_t feature;
! 200: #define TWE_ATA_WCE 0x02
! 201: #define TWE_ATA_NWCE 0x82
! 202: u_int8_t mode;
! 203: u_int16_t units;
! 204: u_int16_t persist;
! 205: } _cmd_ata;
! 206: #define cmd_ata _._cmd_ata
! 207: u_int16_t cmd_status;
! 208: struct {
! 209: u_int8_t action;
! 210: #define TWE_REBUILD_NOP 0
! 211: #define TWE_REBUILD_STOP 2
! 212: #define TWE_REBUILD_START 4
! 213: #define TWE_REBUILD_STARTU 5
! 214: #define TWE_REBUILD_CS 0x80
! 215: u_int8_t subunit; /* raid10 lu rebuild */
! 216: } _cmd_rebuild;
! 217: #define cmd_rebuild _._cmd_rebuild
! 218: } _;
! 219: }; /* 512 bytes */
! 220:
! 221: #pragma pack()
CVSweb