xref: /freebsd/sys/dev/pms/RefTisa/sat/api/sm.h (revision 2ff63af9b88c7413b7d71715b5532625752a248e)
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