1*4e1bc9a0SAchim Leubner /******************************************************************************* 2*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 3*4e1bc9a0SAchim Leubner * 4*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided 5*4e1bc9a0SAchim Leubner *that the following conditions are met: 6*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 7*4e1bc9a0SAchim Leubner *following disclaimer. 8*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice, 9*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided 10*4e1bc9a0SAchim Leubner *with the distribution. 11*4e1bc9a0SAchim Leubner * 12*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 13*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 16*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 17*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 19*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 20*4e1bc9a0SAchim Leubner * 21*4e1bc9a0SAchim Leubner * 22*4e1bc9a0SAchim Leubner ********************************************************************************/ 23*4e1bc9a0SAchim Leubner /******************************************************************************** 24*4e1bc9a0SAchim Leubner ** 25*4e1bc9a0SAchim Leubner * sm.h 26*4e1bc9a0SAchim Leubner * 27*4e1bc9a0SAchim Leubner * Abstract: This module defines the contants, enum and #define definition used 28*4e1bc9a0SAchim Leubner * by SAT Moduled (SM). 29*4e1bc9a0SAchim Leubner * 30*4e1bc9a0SAchim Leubner ********************************************************************************/ 31*4e1bc9a0SAchim Leubner 32*4e1bc9a0SAchim Leubner #ifndef SM_H 33*4e1bc9a0SAchim Leubner #define SM_H 34*4e1bc9a0SAchim Leubner 35*4e1bc9a0SAchim Leubner /************************************************* 36*4e1bc9a0SAchim Leubner * constants for type field in smMem_t 37*4e1bc9a0SAchim Leubner *************************************************/ 38*4e1bc9a0SAchim Leubner #define SM_CACHED_MEM 0x00 /**< CACHED memory type */ 39*4e1bc9a0SAchim Leubner #define SM_DMA_MEM 0x01 /**< DMA memory type */ 40*4e1bc9a0SAchim Leubner #define SM_CACHED_DMA_MEM 0x02 /**< CACHED DMA memory type */ 41*4e1bc9a0SAchim Leubner 42*4e1bc9a0SAchim Leubner /************************************************* 43*4e1bc9a0SAchim Leubner * constants for API return values 44*4e1bc9a0SAchim Leubner *************************************************/ 45*4e1bc9a0SAchim Leubner typedef enum 46*4e1bc9a0SAchim Leubner { 47*4e1bc9a0SAchim Leubner SM_RC_SUCCESS, 48*4e1bc9a0SAchim Leubner SM_RC_FAILURE, 49*4e1bc9a0SAchim Leubner SM_RC_BUSY, 50*4e1bc9a0SAchim Leubner SM_RC_NODEVICE, 51*4e1bc9a0SAchim Leubner SM_RC_VERSION_INCOMPATIBLE, 52*4e1bc9a0SAchim Leubner SM_RC_VERSION_UNTESTED, 53*4e1bc9a0SAchim Leubner SM_RC_RSV1, 54*4e1bc9a0SAchim Leubner SM_RC_RSV2, 55*4e1bc9a0SAchim Leubner SM_RC_RSV3, 56*4e1bc9a0SAchim Leubner SM_RC_RSV4, 57*4e1bc9a0SAchim Leubner SM_RC_DEVICE_BUSY, /* must be the same as tiDeviceBusy */ 58*4e1bc9a0SAchim Leubner 59*4e1bc9a0SAchim Leubner } smStatus_t; 60*4e1bc9a0SAchim Leubner 61*4e1bc9a0SAchim Leubner typedef enum 62*4e1bc9a0SAchim Leubner { 63*4e1bc9a0SAchim Leubner smIOSuccess, 64*4e1bc9a0SAchim Leubner smIOOverRun, 65*4e1bc9a0SAchim Leubner smIOUnderRun, 66*4e1bc9a0SAchim Leubner smIOFailed, 67*4e1bc9a0SAchim Leubner smIODifError, 68*4e1bc9a0SAchim Leubner smIOEncryptError, 69*4e1bc9a0SAchim Leubner smIORetry, /* open retry timeout */ 70*4e1bc9a0SAchim Leubner smIOSTPResourceBusy, /* stp resource busy */ 71*4e1bc9a0SAchim Leubner } smIOStatus_t; 72*4e1bc9a0SAchim Leubner 73*4e1bc9a0SAchim Leubner typedef enum 74*4e1bc9a0SAchim Leubner { 75*4e1bc9a0SAchim Leubner smDetailBusy, 76*4e1bc9a0SAchim Leubner smDetailNotValid, 77*4e1bc9a0SAchim Leubner smDetailNoLogin, 78*4e1bc9a0SAchim Leubner smDetailAbortLogin, 79*4e1bc9a0SAchim Leubner smDetailAbortReset, 80*4e1bc9a0SAchim Leubner smDetailAborted, 81*4e1bc9a0SAchim Leubner smDetailDifMismatch, 82*4e1bc9a0SAchim Leubner smDetailDifAppTagMismatch, 83*4e1bc9a0SAchim Leubner smDetailDifRefTagMismatch, 84*4e1bc9a0SAchim Leubner smDetailDifCrcMismatch, 85*4e1bc9a0SAchim Leubner smDetailDekKeyCacheMiss, 86*4e1bc9a0SAchim Leubner smDetailCipherModeInvalid, 87*4e1bc9a0SAchim Leubner smDetailDekIVMismatch, 88*4e1bc9a0SAchim Leubner smDetailDekRamInterfaceError, 89*4e1bc9a0SAchim Leubner smDetailDekIndexOutofBounds, 90*4e1bc9a0SAchim Leubner smDetailOtherError 91*4e1bc9a0SAchim Leubner } smIOStatusDetail_t; 92*4e1bc9a0SAchim Leubner 93*4e1bc9a0SAchim Leubner /* 94*4e1bc9a0SAchim Leubner * Data direction for I/O request 95*4e1bc9a0SAchim Leubner */ 96*4e1bc9a0SAchim Leubner typedef enum 97*4e1bc9a0SAchim Leubner { 98*4e1bc9a0SAchim Leubner smDirectionIn = 0x0000, 99*4e1bc9a0SAchim Leubner smDirectionOut = 0x0001 100*4e1bc9a0SAchim Leubner }smDataDirection_t; 101*4e1bc9a0SAchim Leubner 102*4e1bc9a0SAchim Leubner /* 103*4e1bc9a0SAchim Leubner * Event types for tdsmEventCB() 104*4e1bc9a0SAchim Leubner * do not change: Needs to be in sync with TISA API 105*4e1bc9a0SAchim Leubner */ 106*4e1bc9a0SAchim Leubner typedef enum 107*4e1bc9a0SAchim Leubner { 108*4e1bc9a0SAchim Leubner smIntrEventTypeCnxError, 109*4e1bc9a0SAchim Leubner smIntrEventTypeDiscovery, 110*4e1bc9a0SAchim Leubner smIntrEventTypeTransportRecovery, 111*4e1bc9a0SAchim Leubner smIntrEventTypeTaskManagement, 112*4e1bc9a0SAchim Leubner smIntrEventTypeDeviceChange, 113*4e1bc9a0SAchim Leubner smIntrEventTypeLogin, 114*4e1bc9a0SAchim Leubner smIntrEventTypeLocalAbort 115*4e1bc9a0SAchim Leubner } smIntrEventType_t; 116*4e1bc9a0SAchim Leubner 117*4e1bc9a0SAchim Leubner typedef enum 118*4e1bc9a0SAchim Leubner { 119*4e1bc9a0SAchim Leubner smTMOK, 120*4e1bc9a0SAchim Leubner smTMFailed 121*4e1bc9a0SAchim Leubner } smTMEventStatus_t; 122*4e1bc9a0SAchim Leubner 123*4e1bc9a0SAchim Leubner /* 124*4e1bc9a0SAchim Leubner * Flags in smSuperScsiInitiatorRequest_t 125*4e1bc9a0SAchim Leubner */ 126*4e1bc9a0SAchim Leubner #define SM_SCSI_INITIATOR_DIF 0x00000001 127*4e1bc9a0SAchim Leubner #define SM_SCSI_INITIATOR_ENCRYPT 0x00000002 128*4e1bc9a0SAchim Leubner 129*4e1bc9a0SAchim Leubner /* 130*4e1bc9a0SAchim Leubner * Flags in smSuperScsiInitiatorRequest_t 131*4e1bc9a0SAchim Leubner */ 132*4e1bc9a0SAchim Leubner #define SM_SCSI_TARGET_DIF 0x00000001 133*4e1bc9a0SAchim Leubner #define SM_SCSI_TARGET_MIRROR 0x00000002 134*4e1bc9a0SAchim Leubner #define SM_SCSI_TARGET_ENCRYPT 0x00000004 135*4e1bc9a0SAchim Leubner 136*4e1bc9a0SAchim Leubner typedef struct { 137*4e1bc9a0SAchim Leubner void *tdData; 138*4e1bc9a0SAchim Leubner void *smData; 139*4e1bc9a0SAchim Leubner } smContext_t; 140*4e1bc9a0SAchim Leubner 141*4e1bc9a0SAchim Leubner 142*4e1bc9a0SAchim Leubner typedef smContext_t smDeviceHandle_t; 143*4e1bc9a0SAchim Leubner 144*4e1bc9a0SAchim Leubner typedef smContext_t smIORequest_t; 145*4e1bc9a0SAchim Leubner 146*4e1bc9a0SAchim Leubner typedef smContext_t smRoot_t; 147*4e1bc9a0SAchim Leubner 148*4e1bc9a0SAchim Leubner typedef struct 149*4e1bc9a0SAchim Leubner { 150*4e1bc9a0SAchim Leubner bit8 lun[8]; /* logical unit number */ 151*4e1bc9a0SAchim Leubner } smLUN_t; 152*4e1bc9a0SAchim Leubner 153*4e1bc9a0SAchim Leubner typedef struct{ 154*4e1bc9a0SAchim Leubner smLUN_t lun; 155*4e1bc9a0SAchim Leubner bit32 expDataLength; 156*4e1bc9a0SAchim Leubner bit32 taskAttribute; 157*4e1bc9a0SAchim Leubner bit32 crn; 158*4e1bc9a0SAchim Leubner bit8 cdb[16]; 159*4e1bc9a0SAchim Leubner } smIniScsiCmnd_t; 160*4e1bc9a0SAchim Leubner 161*4e1bc9a0SAchim Leubner 162*4e1bc9a0SAchim Leubner 163*4e1bc9a0SAchim Leubner typedef struct{ 164*4e1bc9a0SAchim Leubner void *virtPtr; 165*4e1bc9a0SAchim Leubner void *osHandle; 166*4e1bc9a0SAchim Leubner bit32 physAddrUpper; 167*4e1bc9a0SAchim Leubner bit32 physAddrLower; 168*4e1bc9a0SAchim Leubner bit32 totalLength; 169*4e1bc9a0SAchim Leubner bit32 numElements; 170*4e1bc9a0SAchim Leubner bit32 singleElementLength; 171*4e1bc9a0SAchim Leubner bit32 alignment; 172*4e1bc9a0SAchim Leubner bit32 type; 173*4e1bc9a0SAchim Leubner bit32 reserved; 174*4e1bc9a0SAchim Leubner } smMem_t; 175*4e1bc9a0SAchim Leubner 176*4e1bc9a0SAchim Leubner #define SM_NUM_MEM_CHUNKS 8 177*4e1bc9a0SAchim Leubner 178*4e1bc9a0SAchim Leubner typedef struct{ 179*4e1bc9a0SAchim Leubner bit32 count; 180*4e1bc9a0SAchim Leubner smMem_t smMemory[SM_NUM_MEM_CHUNKS]; 181*4e1bc9a0SAchim Leubner } smMemoryRequirement_t; 182*4e1bc9a0SAchim Leubner 183*4e1bc9a0SAchim Leubner typedef struct{ 184*4e1bc9a0SAchim Leubner bit32 lower; 185*4e1bc9a0SAchim Leubner bit32 upper; 186*4e1bc9a0SAchim Leubner bit32 len; 187*4e1bc9a0SAchim Leubner bit32 type; 188*4e1bc9a0SAchim Leubner } smSgl_t; 189*4e1bc9a0SAchim Leubner 190*4e1bc9a0SAchim Leubner /* 191*4e1bc9a0SAchim Leubner * DIF operation 192*4e1bc9a0SAchim Leubner */ 193*4e1bc9a0SAchim Leubner #define DIF_INSERT 0 194*4e1bc9a0SAchim Leubner #define DIF_VERIFY_FORWARD 1 195*4e1bc9a0SAchim Leubner #define DIF_VERIFY_DELETE 2 196*4e1bc9a0SAchim Leubner #define DIF_VERIFY_REPLACE 3 197*4e1bc9a0SAchim Leubner #define DIF_VERIFY_UDT_REPLACE_CRC 5 198*4e1bc9a0SAchim Leubner #define DIF_REPLACE_UDT_REPLACE_CRC 7 199*4e1bc9a0SAchim Leubner 200*4e1bc9a0SAchim Leubner #define DIF_UDT_SIZE 6 201*4e1bc9a0SAchim Leubner 202*4e1bc9a0SAchim Leubner typedef struct smDif 203*4e1bc9a0SAchim Leubner { 204*4e1bc9a0SAchim Leubner agBOOLEAN enableDIFPerLA; 205*4e1bc9a0SAchim Leubner bit32 flag; 206*4e1bc9a0SAchim Leubner bit16 initialIOSeed; 207*4e1bc9a0SAchim Leubner bit16 reserved; 208*4e1bc9a0SAchim Leubner bit32 DIFPerLAAddrLo; 209*4e1bc9a0SAchim Leubner bit32 DIFPerLAAddrHi; 210*4e1bc9a0SAchim Leubner bit16 DIFPerLARegion0SecCount; 211*4e1bc9a0SAchim Leubner bit16 DIFPerLANumOfRegions; 212*4e1bc9a0SAchim Leubner bit8 udtArray[DIF_UDT_SIZE]; 213*4e1bc9a0SAchim Leubner bit8 udrtArray[DIF_UDT_SIZE]; 214*4e1bc9a0SAchim Leubner } smDif_t; 215*4e1bc9a0SAchim Leubner 216*4e1bc9a0SAchim Leubner typedef struct smEncryptDek { 217*4e1bc9a0SAchim Leubner bit32 dekTable; 218*4e1bc9a0SAchim Leubner bit32 dekIndex; 219*4e1bc9a0SAchim Leubner } smEncryptDek_t; 220*4e1bc9a0SAchim Leubner 221*4e1bc9a0SAchim Leubner typedef struct smEncrypt { 222*4e1bc9a0SAchim Leubner smEncryptDek_t dekInfo; 223*4e1bc9a0SAchim Leubner bit32 kekIndex; 224*4e1bc9a0SAchim Leubner agBOOLEAN keyTagCheck; 225*4e1bc9a0SAchim Leubner agBOOLEAN enableEncryptionPerLA; 226*4e1bc9a0SAchim Leubner bit32 sectorSizeIndex; 227*4e1bc9a0SAchim Leubner bit32 encryptMode; 228*4e1bc9a0SAchim Leubner bit32 keyTag_W0; 229*4e1bc9a0SAchim Leubner bit32 keyTag_W1; 230*4e1bc9a0SAchim Leubner bit32 tweakVal_W0; 231*4e1bc9a0SAchim Leubner bit32 tweakVal_W1; 232*4e1bc9a0SAchim Leubner bit32 tweakVal_W2; 233*4e1bc9a0SAchim Leubner bit32 tweakVal_W3; 234*4e1bc9a0SAchim Leubner bit32 EncryptionPerLAAddrLo; 235*4e1bc9a0SAchim Leubner bit32 EncryptionPerLAAddrHi; 236*4e1bc9a0SAchim Leubner bit16 EncryptionPerLRegion0SecCount; 237*4e1bc9a0SAchim Leubner bit16 reserved; 238*4e1bc9a0SAchim Leubner } smEncrypt_t; 239*4e1bc9a0SAchim Leubner 240*4e1bc9a0SAchim Leubner typedef struct smScsiInitiatorRequest { 241*4e1bc9a0SAchim Leubner void *sglVirtualAddr; 242*4e1bc9a0SAchim Leubner smIniScsiCmnd_t scsiCmnd; 243*4e1bc9a0SAchim Leubner smSgl_t smSgl1; 244*4e1bc9a0SAchim Leubner smDataDirection_t dataDirection; 245*4e1bc9a0SAchim Leubner } smScsiInitiatorRequest_t; 246*4e1bc9a0SAchim Leubner 247*4e1bc9a0SAchim Leubner typedef struct smSuperScsiInitiatorRequest 248*4e1bc9a0SAchim Leubner { 249*4e1bc9a0SAchim Leubner void *sglVirtualAddr; 250*4e1bc9a0SAchim Leubner smIniScsiCmnd_t scsiCmnd; 251*4e1bc9a0SAchim Leubner smSgl_t smSgl1; 252*4e1bc9a0SAchim Leubner smDataDirection_t dataDirection; 253*4e1bc9a0SAchim Leubner bit32 flags; /* 254*4e1bc9a0SAchim Leubner bit 0-1: reserved 255*4e1bc9a0SAchim Leubner bit 2: enable encryption 256*4e1bc9a0SAchim Leubner bit 3: enable dif 257*4e1bc9a0SAchim Leubner bit 4-7: reserved 258*4e1bc9a0SAchim Leubner bit 8-23: DIF SKIP Bytes 259*4e1bc9a0SAchim Leubner bit 24-31: Reserved 260*4e1bc9a0SAchim Leubner */ 261*4e1bc9a0SAchim Leubner smDif_t Dif; 262*4e1bc9a0SAchim Leubner smEncrypt_t Encrypt; 263*4e1bc9a0SAchim Leubner } smSuperScsiInitiatorRequest_t; 264*4e1bc9a0SAchim Leubner 265*4e1bc9a0SAchim Leubner typedef struct{ 266*4e1bc9a0SAchim Leubner void *senseData; 267*4e1bc9a0SAchim Leubner bit8 senseLen; 268*4e1bc9a0SAchim Leubner } smSenseData_t; 269*4e1bc9a0SAchim Leubner 270*4e1bc9a0SAchim Leubner typedef struct{ 271*4e1bc9a0SAchim Leubner bit32 maxActiveIOs; 272*4e1bc9a0SAchim Leubner bit32 numDevHandles; 273*4e1bc9a0SAchim Leubner #ifdef SM_DEBUG 274*4e1bc9a0SAchim Leubner bit32 SMDebugLevel; 275*4e1bc9a0SAchim Leubner #endif 276*4e1bc9a0SAchim Leubner } smSwConfig_t; 277*4e1bc9a0SAchim Leubner 278*4e1bc9a0SAchim Leubner 279*4e1bc9a0SAchim Leubner #define smBOOLEAN bit32 280*4e1bc9a0SAchim Leubner 281*4e1bc9a0SAchim Leubner 282*4e1bc9a0SAchim Leubner 283*4e1bc9a0SAchim Leubner 284*4e1bc9a0SAchim Leubner 285*4e1bc9a0SAchim Leubner 286*4e1bc9a0SAchim Leubner 287*4e1bc9a0SAchim Leubner 288*4e1bc9a0SAchim Leubner 289*4e1bc9a0SAchim Leubner 290*4e1bc9a0SAchim Leubner #endif /* SM_H */ 291*4e1bc9a0SAchim Leubner 292