1*80c94ecdSKeith M Wesolowski /* 2*80c94ecdSKeith M Wesolowski * This file and its contents are supplied under the terms of the 3*80c94ecdSKeith M Wesolowski * Common Development and Distribution License ("CDDL"), version 1.0. 4*80c94ecdSKeith M Wesolowski * You may only use this file in accordance with the terms of version 5*80c94ecdSKeith M Wesolowski * 1.0 of the CDDL. 6*80c94ecdSKeith M Wesolowski * 7*80c94ecdSKeith M Wesolowski * A full copy of the text of the CDDL should have accompanied this 8*80c94ecdSKeith M Wesolowski * source. A copy of the CDDL is also available via the Internet at 9*80c94ecdSKeith M Wesolowski * http://www.illumos.org/license/CDDL. 10*80c94ecdSKeith M Wesolowski */ 11*80c94ecdSKeith M Wesolowski 12*80c94ecdSKeith M Wesolowski /* 13*80c94ecdSKeith M Wesolowski * Copyright (C) 2013 Hewlett-Packard Development Company, L.P. 14*80c94ecdSKeith M Wesolowski */ 15*80c94ecdSKeith M Wesolowski 16*80c94ecdSKeith M Wesolowski #ifndef _CPQARY3_CISS_H 17*80c94ecdSKeith M Wesolowski #define _CPQARY3_CISS_H 18*80c94ecdSKeith M Wesolowski 19*80c94ecdSKeith M Wesolowski #ifdef __cplusplus 20*80c94ecdSKeith M Wesolowski extern "C" { 21*80c94ecdSKeith M Wesolowski #endif 22*80c94ecdSKeith M Wesolowski 23*80c94ecdSKeith M Wesolowski #define CISS_VERSION "1.00" 24*80c94ecdSKeith M Wesolowski 25*80c94ecdSKeith M Wesolowski /* General Boundary Defintions */ 26*80c94ecdSKeith M Wesolowski #define CISS_INIT_TIME 90 /* Driver Defined Value */ 27*80c94ecdSKeith M Wesolowski /* Duration to Wait for the */ 28*80c94ecdSKeith M Wesolowski /* controller initialization */ 29*80c94ecdSKeith M Wesolowski #define CISS_SENSEINFOBYTES 256 /* Note that this value may vary */ 30*80c94ecdSKeith M Wesolowski /* between host implementations */ 31*80c94ecdSKeith M Wesolowski #define CISS_MAXSGENTRIES 64 32*80c94ecdSKeith M Wesolowski #define CISS_MAXREPLYQS 256 33*80c94ecdSKeith M Wesolowski 34*80c94ecdSKeith M Wesolowski /* Command Status Value */ 35*80c94ecdSKeith M Wesolowski #define CISS_CMD_SUCCESS 0x00 36*80c94ecdSKeith M Wesolowski #define CISS_CMD_TARGET_STATUS 0x01 37*80c94ecdSKeith M Wesolowski #define CISS_CMD_DATA_UNDERRUN 0x02 38*80c94ecdSKeith M Wesolowski #define CISS_CMD_DATA_OVERRUN 0x03 39*80c94ecdSKeith M Wesolowski #define CISS_CMD_INVALID 0x04 40*80c94ecdSKeith M Wesolowski #define CISS_CMD_PROTOCOL_ERR 0x05 41*80c94ecdSKeith M Wesolowski #define CISS_CMD_HARDWARE_ERR 0x06 42*80c94ecdSKeith M Wesolowski #define CISS_CMD_CONNECTION_LOST 0x07 43*80c94ecdSKeith M Wesolowski #define CISS_CMD_ABORTED 0x08 44*80c94ecdSKeith M Wesolowski #define CISS_CMD_ABORT_FAILED 0x09 45*80c94ecdSKeith M Wesolowski #define CISS_CMD_UNSOLICITED_ABORT 0x0A 46*80c94ecdSKeith M Wesolowski #define CISS_CMD_TIMEOUT 0x0B 47*80c94ecdSKeith M Wesolowski #define CISS_CMD_UNABORTABLE 0x0C 48*80c94ecdSKeith M Wesolowski 49*80c94ecdSKeith M Wesolowski /* Transfer Direction */ 50*80c94ecdSKeith M Wesolowski #define CISS_XFER_NONE 0x00 51*80c94ecdSKeith M Wesolowski #define CISS_XFER_WRITE 0x01 52*80c94ecdSKeith M Wesolowski #define CISS_XFER_READ 0x02 53*80c94ecdSKeith M Wesolowski #define CISS_XFER_RSVD 0x03 54*80c94ecdSKeith M Wesolowski 55*80c94ecdSKeith M Wesolowski #define CISS_ATTR_UNTAGGED 0x00 56*80c94ecdSKeith M Wesolowski #define CISS_ATTR_SIMPLE 0x04 57*80c94ecdSKeith M Wesolowski #define CISS_ATTR_HEADOFQUEUE 0x05 58*80c94ecdSKeith M Wesolowski #define CISS_ATTR_ORDERED 0x06 59*80c94ecdSKeith M Wesolowski 60*80c94ecdSKeith M Wesolowski /* CDB Type */ 61*80c94ecdSKeith M Wesolowski #define CISS_TYPE_CMD 0x00 62*80c94ecdSKeith M Wesolowski #define CISS_TYPE_MSG 0x01 63*80c94ecdSKeith M Wesolowski 64*80c94ecdSKeith M Wesolowski /* Config Space Register Offsetsp */ 65*80c94ecdSKeith M Wesolowski #define CFG_VENDORID 0x00 66*80c94ecdSKeith M Wesolowski #define CFG_DEVICEID 0x02 67*80c94ecdSKeith M Wesolowski #define CFG_I2OBAR 0x10 68*80c94ecdSKeith M Wesolowski #define CFG_MEM1BAR 0x14 69*80c94ecdSKeith M Wesolowski 70*80c94ecdSKeith M Wesolowski /* I2O Space Register Offsets */ 71*80c94ecdSKeith M Wesolowski #define I2O_IBDB_SET 0x20 72*80c94ecdSKeith M Wesolowski #define I2O_IBDB_CLEAR 0x70 73*80c94ecdSKeith M Wesolowski #define I2O_INT_STATUS 0x30 74*80c94ecdSKeith M Wesolowski #define I2O_INT_MASK 0x34 75*80c94ecdSKeith M Wesolowski #define I2O_IBPOST_Q 0x40 76*80c94ecdSKeith M Wesolowski #define I2O_OBPOST_Q 0x44 77*80c94ecdSKeith M Wesolowski #define I2O_OBDB_STATUS 0x9C 78*80c94ecdSKeith M Wesolowski #define I2O_OBDB_CLEAR 0xA0 79*80c94ecdSKeith M Wesolowski #define I2O_CTLR_INIT 0xB0 /* not available in CISS specs */ 80*80c94ecdSKeith M Wesolowski 81*80c94ecdSKeith M Wesolowski /* Configuration Table */ 82*80c94ecdSKeith M Wesolowski #define CFGTBL_CHANGE_REQ 0x00000001l 83*80c94ecdSKeith M Wesolowski #define CFGTBL_ACC_CMDS 0x00000001l 84*80c94ecdSKeith M Wesolowski 85*80c94ecdSKeith M Wesolowski /* Transport Method */ 86*80c94ecdSKeith M Wesolowski #define CFGTBL_XPORT_SIMPLE 0x00000002l 87*80c94ecdSKeith M Wesolowski #define CFGTBL_XPORT_PERFORMANT 0x00000004l 88*80c94ecdSKeith M Wesolowski #define CFGTBL_XPORT_MEMQ 0x00000008l 89*80c94ecdSKeith M Wesolowski 90*80c94ecdSKeith M Wesolowski #define CPQARY3_SIMPLE CFGTBL_XPORT_SIMPLE 91*80c94ecdSKeith M Wesolowski #define CPQARY3_PERFORMANT CFGTBL_XPORT_PERFORMANT 92*80c94ecdSKeith M Wesolowski 93*80c94ecdSKeith M Wesolowski /* not being used currently */ 94*80c94ecdSKeith M Wesolowski #define CFGTBL_BusType_Ultra2 0x00000001l 95*80c94ecdSKeith M Wesolowski #define CFGTBL_BusType_Ultra3 0x00000002l 96*80c94ecdSKeith M Wesolowski #define CFGTBL_BusType_Fibre1G 0x00000100l 97*80c94ecdSKeith M Wesolowski #define CFGTBL_BusType_Fibre2G 0x00000200l 98*80c94ecdSKeith M Wesolowski 99*80c94ecdSKeith M Wesolowski /* for hard reset of the controller */ 100*80c94ecdSKeith M Wesolowski #define CISS_POWER_OFF 0x03 /* Self Defined */ 101*80c94ecdSKeith M Wesolowski #define CISS_POWER_ON 0x00 /* Self Defined */ 102*80c94ecdSKeith M Wesolowski #define CISS_POWER_REG_OFFSET 0xF4 /* Self Defined */ 103*80c94ecdSKeith M Wesolowski 104*80c94ecdSKeith M Wesolowski #define CT_CFG_OFFSET 0xB4 105*80c94ecdSKeith M Wesolowski #define CT_MEM_OFFSET 0xB8 106*80c94ecdSKeith M Wesolowski 107*80c94ecdSKeith M Wesolowski /* 108*80c94ecdSKeith M Wesolowski * STRUCTURES 109*80c94ecdSKeith M Wesolowski * Command List Structure 110*80c94ecdSKeith M Wesolowski */ 111*80c94ecdSKeith M Wesolowski 112*80c94ecdSKeith M Wesolowski #pragma pack(1) 113*80c94ecdSKeith M Wesolowski 114*80c94ecdSKeith M Wesolowski typedef uint64_t QWORD; 115*80c94ecdSKeith M Wesolowski 116*80c94ecdSKeith M Wesolowski /* 117*80c94ecdSKeith M Wesolowski * Structure for Tag field in the controller command structure 118*80c94ecdSKeith M Wesolowski * Bit 0 : Unused 119*80c94ecdSKeith M Wesolowski * Bit 1 : If set, signifies an error in processing of the command 120*80c94ecdSKeith M Wesolowski * Bits 2 & 3 : Used by this driver to signify a host of situations 121*80c94ecdSKeith M Wesolowski * Bits 4-31 : Used by driver to fill in tag and then used by controller 122*80c94ecdSKeith M Wesolowski * Bits 32-63 : Reserved 123*80c94ecdSKeith M Wesolowski */ 124*80c94ecdSKeith M Wesolowski #define CISS_CMD_ERROR 0x2 125*80c94ecdSKeith M Wesolowski typedef struct cpqary3_tag { 126*80c94ecdSKeith M Wesolowski uint32_t reserved:1; 127*80c94ecdSKeith M Wesolowski uint32_t drvinfo_n_err:3; 128*80c94ecdSKeith M Wesolowski uint32_t tag_value:28; 129*80c94ecdSKeith M Wesolowski uint32_t unused; 130*80c94ecdSKeith M Wesolowski } cpqary3_tag_t; 131*80c94ecdSKeith M Wesolowski 132*80c94ecdSKeith M Wesolowski typedef union _SCSI3Addr_t { 133*80c94ecdSKeith M Wesolowski struct { 134*80c94ecdSKeith M Wesolowski uint8_t Bus:6; 135*80c94ecdSKeith M Wesolowski uint8_t Mode:2; 136*80c94ecdSKeith M Wesolowski uint8_t Dev; 137*80c94ecdSKeith M Wesolowski } PeripDev; 138*80c94ecdSKeith M Wesolowski struct { 139*80c94ecdSKeith M Wesolowski uint8_t DevMSB:6; 140*80c94ecdSKeith M Wesolowski uint8_t Mode:2; 141*80c94ecdSKeith M Wesolowski uint8_t DevLSB; 142*80c94ecdSKeith M Wesolowski } LogDev; 143*80c94ecdSKeith M Wesolowski struct { 144*80c94ecdSKeith M Wesolowski uint8_t Targ:6; 145*80c94ecdSKeith M Wesolowski uint8_t Mode:2; 146*80c94ecdSKeith M Wesolowski uint8_t Dev:5; 147*80c94ecdSKeith M Wesolowski uint8_t Bus:3; 148*80c94ecdSKeith M Wesolowski } LogUnit; 149*80c94ecdSKeith M Wesolowski } SCSI3Addr_t; 150*80c94ecdSKeith M Wesolowski 151*80c94ecdSKeith M Wesolowski typedef struct _PhysDevAddr_t { 152*80c94ecdSKeith M Wesolowski uint32_t TargetId:24; 153*80c94ecdSKeith M Wesolowski uint32_t Bus:6; 154*80c94ecdSKeith M Wesolowski uint32_t Mode:2; 155*80c94ecdSKeith M Wesolowski SCSI3Addr_t Target[2]; 156*80c94ecdSKeith M Wesolowski } PhysDevAddr_t; 157*80c94ecdSKeith M Wesolowski 158*80c94ecdSKeith M Wesolowski typedef struct _LogDevAddr_t { 159*80c94ecdSKeith M Wesolowski uint32_t VolId:30; 160*80c94ecdSKeith M Wesolowski uint32_t Mode:2; 161*80c94ecdSKeith M Wesolowski uint8_t reserved[4]; 162*80c94ecdSKeith M Wesolowski } LogDevAddr_t; 163*80c94ecdSKeith M Wesolowski 164*80c94ecdSKeith M Wesolowski typedef union _LUNAddr_t { 165*80c94ecdSKeith M Wesolowski uint8_t LunAddrBytes[8]; 166*80c94ecdSKeith M Wesolowski SCSI3Addr_t SCSI3Lun[4]; 167*80c94ecdSKeith M Wesolowski PhysDevAddr_t PhysDev; 168*80c94ecdSKeith M Wesolowski LogDevAddr_t LogDev; 169*80c94ecdSKeith M Wesolowski } LUNAddr_t; 170*80c94ecdSKeith M Wesolowski 171*80c94ecdSKeith M Wesolowski typedef struct _CommandListHeader_t { 172*80c94ecdSKeith M Wesolowski uint8_t ReplyQueue; 173*80c94ecdSKeith M Wesolowski uint8_t SGList; 174*80c94ecdSKeith M Wesolowski uint16_t SGTotal; 175*80c94ecdSKeith M Wesolowski cpqary3_tag_t Tag; 176*80c94ecdSKeith M Wesolowski LUNAddr_t LUN; /* 20 */ 177*80c94ecdSKeith M Wesolowski } CommandListHeader_t; 178*80c94ecdSKeith M Wesolowski 179*80c94ecdSKeith M Wesolowski typedef struct _RequestBlock_t { 180*80c94ecdSKeith M Wesolowski uint8_t CDBLen; 181*80c94ecdSKeith M Wesolowski struct { 182*80c94ecdSKeith M Wesolowski uint8_t Type:3; 183*80c94ecdSKeith M Wesolowski uint8_t Attribute:3; 184*80c94ecdSKeith M Wesolowski uint8_t Direction:2; 185*80c94ecdSKeith M Wesolowski } Type; 186*80c94ecdSKeith M Wesolowski uint16_t Timeout; 187*80c94ecdSKeith M Wesolowski uint8_t CDB[16]; /* 20 */ 188*80c94ecdSKeith M Wesolowski } RequestBlock_t; 189*80c94ecdSKeith M Wesolowski 190*80c94ecdSKeith M Wesolowski typedef struct _ErrDescriptor_t { 191*80c94ecdSKeith M Wesolowski QWORD Addr; 192*80c94ecdSKeith M Wesolowski uint32_t Len; /* 12 */ 193*80c94ecdSKeith M Wesolowski } ErrDescriptor_t; 194*80c94ecdSKeith M Wesolowski 195*80c94ecdSKeith M Wesolowski typedef struct _SGDescriptor_t { 196*80c94ecdSKeith M Wesolowski QWORD Addr; 197*80c94ecdSKeith M Wesolowski uint32_t Len; 198*80c94ecdSKeith M Wesolowski uint32_t Ext; /* 16 */ 199*80c94ecdSKeith M Wesolowski } SGDescriptor_t; 200*80c94ecdSKeith M Wesolowski 201*80c94ecdSKeith M Wesolowski typedef struct _CommandList_t { 202*80c94ecdSKeith M Wesolowski CommandListHeader_t Header; /* 20 */ 203*80c94ecdSKeith M Wesolowski RequestBlock_t Request; /* 20, 40 */ 204*80c94ecdSKeith M Wesolowski ErrDescriptor_t ErrDesc; /* 12, 52 */ 205*80c94ecdSKeith M Wesolowski SGDescriptor_t SG[CISS_MAXSGENTRIES]; /* 16*SG_MAXENTRIES=512, 564 */ 206*80c94ecdSKeith M Wesolowski } CommandList_t; 207*80c94ecdSKeith M Wesolowski 208*80c94ecdSKeith M Wesolowski typedef union _MoreErrInfo_t { 209*80c94ecdSKeith M Wesolowski struct { 210*80c94ecdSKeith M Wesolowski uint8_t Reserved[3]; 211*80c94ecdSKeith M Wesolowski uint8_t Type; 212*80c94ecdSKeith M Wesolowski uint32_t ErrorInfo; 213*80c94ecdSKeith M Wesolowski } Common_Info; 214*80c94ecdSKeith M Wesolowski struct { 215*80c94ecdSKeith M Wesolowski uint8_t Reserved[2]; 216*80c94ecdSKeith M Wesolowski uint8_t offense_size; 217*80c94ecdSKeith M Wesolowski uint8_t offense_num; 218*80c94ecdSKeith M Wesolowski uint32_t offense_value; 219*80c94ecdSKeith M Wesolowski } Invalid_Cmd; 220*80c94ecdSKeith M Wesolowski } MoreErrInfo_t; 221*80c94ecdSKeith M Wesolowski 222*80c94ecdSKeith M Wesolowski typedef struct _ErrorInfo_t { 223*80c94ecdSKeith M Wesolowski uint8_t ScsiStatus; 224*80c94ecdSKeith M Wesolowski uint8_t SenseLen; 225*80c94ecdSKeith M Wesolowski uint16_t CommandStatus; 226*80c94ecdSKeith M Wesolowski uint32_t ResidualCnt; 227*80c94ecdSKeith M Wesolowski MoreErrInfo_t MoreErrInfo; 228*80c94ecdSKeith M Wesolowski uint8_t SenseInfo[CISS_SENSEINFOBYTES]; /* 256 + 24 = 280 */ 229*80c94ecdSKeith M Wesolowski } ErrorInfo_t; 230*80c94ecdSKeith M Wesolowski 231*80c94ecdSKeith M Wesolowski /* Configuration Table Structure */ 232*80c94ecdSKeith M Wesolowski typedef struct _HostWrite_t { 233*80c94ecdSKeith M Wesolowski uint32_t TransportRequest; 234*80c94ecdSKeith M Wesolowski uint32_t Upper32Addr; 235*80c94ecdSKeith M Wesolowski uint32_t CoalIntDelay; 236*80c94ecdSKeith M Wesolowski uint32_t CoalIntCount; 237*80c94ecdSKeith M Wesolowski } HostWrite_t; 238*80c94ecdSKeith M Wesolowski 239*80c94ecdSKeith M Wesolowski typedef struct _CfgTable_t { 240*80c94ecdSKeith M Wesolowski uint8_t Signature[4]; 241*80c94ecdSKeith M Wesolowski uint32_t SpecValence; 242*80c94ecdSKeith M Wesolowski uint32_t TransportSupport; 243*80c94ecdSKeith M Wesolowski uint32_t TransportActive; 244*80c94ecdSKeith M Wesolowski HostWrite_t HostWrite; 245*80c94ecdSKeith M Wesolowski uint32_t CmdsOutMax; 246*80c94ecdSKeith M Wesolowski uint32_t BusTypes; 247*80c94ecdSKeith M Wesolowski uint32_t TransportMethodOffset; 248*80c94ecdSKeith M Wesolowski uint8_t ServerName[16]; 249*80c94ecdSKeith M Wesolowski uint32_t HeartBeat; 250*80c94ecdSKeith M Wesolowski /* PERF */ 251*80c94ecdSKeith M Wesolowski uint32_t HostDrvrSupport; /* 0x40 offset from cfg table */ 252*80c94ecdSKeith M Wesolowski uint32_t MaxSGElements; /* 0x44 offset from cfg table */ 253*80c94ecdSKeith M Wesolowski uint32_t MaxLunSupport; /* 0x48 offset from cfg table */ 254*80c94ecdSKeith M Wesolowski uint32_t MaxPhyDevSupport; /* 0x4C offset from cfg table */ 255*80c94ecdSKeith M Wesolowski uint32_t MaxPhyDrvPerLun; /* 0x50 offset from cfg table */ 256*80c94ecdSKeith M Wesolowski uint32_t MaxPerfModeCmdsOutMax; /* 0x54 offset from cfg table */ 257*80c94ecdSKeith M Wesolowski uint32_t MaxBlockFetchCount; /* 0x58 offset from cfg table */ 258*80c94ecdSKeith M Wesolowski /* PERF */ 259*80c94ecdSKeith M Wesolowski } CfgTable_t; 260*80c94ecdSKeith M Wesolowski 261*80c94ecdSKeith M Wesolowski typedef struct _CfgTrans_Perf_t { 262*80c94ecdSKeith M Wesolowski uint32_t BlockFetchCnt[8]; 263*80c94ecdSKeith M Wesolowski uint32_t ReplyQSize; 264*80c94ecdSKeith M Wesolowski uint32_t ReplyQCount; 265*80c94ecdSKeith M Wesolowski uint32_t ReplyQCntrAddrLow32; 266*80c94ecdSKeith M Wesolowski uint32_t ReplyQCntrAddrHigh32; 267*80c94ecdSKeith M Wesolowski uint32_t ReplyQAddr0Low32; 268*80c94ecdSKeith M Wesolowski uint32_t ReplyQAddr0High32; 269*80c94ecdSKeith M Wesolowski } CfgTrans_Perf_t; 270*80c94ecdSKeith M Wesolowski 271*80c94ecdSKeith M Wesolowski typedef struct _CfgTrans_MemQ_t { 272*80c94ecdSKeith M Wesolowski uint32_t BlockFetchCnt[8]; 273*80c94ecdSKeith M Wesolowski uint32_t CmdQSize; 274*80c94ecdSKeith M Wesolowski uint32_t CmdQOffset; 275*80c94ecdSKeith M Wesolowski uint32_t ReplyQSize; 276*80c94ecdSKeith M Wesolowski uint32_t ReplyQCount; 277*80c94ecdSKeith M Wesolowski QWORD ReplyQCntrAddr; 278*80c94ecdSKeith M Wesolowski QWORD ReplyQAddr[CISS_MAXREPLYQS]; 279*80c94ecdSKeith M Wesolowski } CfgTrans_MemQ_t; 280*80c94ecdSKeith M Wesolowski 281*80c94ecdSKeith M Wesolowski typedef union _CfgTrans_t { 282*80c94ecdSKeith M Wesolowski CfgTrans_Perf_t *Perf; 283*80c94ecdSKeith M Wesolowski CfgTrans_MemQ_t *MemQ; 284*80c94ecdSKeith M Wesolowski } CfgTrans_t; 285*80c94ecdSKeith M Wesolowski 286*80c94ecdSKeith M Wesolowski #define CPQARY3_REPLYQ_INIT_CYCLIC_IND 0x1 287*80c94ecdSKeith M Wesolowski typedef struct cpqary3_drvr_replyq { 288*80c94ecdSKeith M Wesolowski uchar_t cyclic_indicator; 289*80c94ecdSKeith M Wesolowski uchar_t simple_cyclic_indicator; 290*80c94ecdSKeith M Wesolowski caddr_t replyq_start_addr; 291*80c94ecdSKeith M Wesolowski uint32_t replyq_start_paddr; 292*80c94ecdSKeith M Wesolowski uint32_t *replyq_headptr; 293*80c94ecdSKeith M Wesolowski uint32_t *replyq_simple_ptr; 294*80c94ecdSKeith M Wesolowski uint32_t index; 295*80c94ecdSKeith M Wesolowski uint32_t simple_index; 296*80c94ecdSKeith M Wesolowski uint32_t max_index; 297*80c94ecdSKeith M Wesolowski } cpqary3_drvr_replyq_t; 298*80c94ecdSKeith M Wesolowski 299*80c94ecdSKeith M Wesolowski #pragma pack() 300*80c94ecdSKeith M Wesolowski 301*80c94ecdSKeith M Wesolowski #ifdef __cplusplus 302*80c94ecdSKeith M Wesolowski } 303*80c94ecdSKeith M Wesolowski #endif 304*80c94ecdSKeith M Wesolowski 305*80c94ecdSKeith M Wesolowski #endif /* _CPQARY3_CISS_H */ 306