xref: /freebsd/sys/dev/pms/RefTisa/tisa/api/ostiapi.h (revision d6b92ffa)
1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3 *
4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5 *that the following conditions are met:
6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7 *following disclaimer.
8 *2. Redistributions in binary form must reproduce the above copyright notice,
9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10 *with the distribution.
11 *
12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20 *
21 * $FreeBSD$
22 *
23 ********************************************************************************/
24 /********************************************************************************
25 **
26 ** Version Control Information:
27 **
28 **
29 *******************************************************************************/
30 /********************************************************************************
31 **
32 **   ostiapi.h
33 **
34 **   Abstract:   This module contains function prototype of the Transport
35 **               Independent (TIAPI) OS Callback interface.
36 **
37 ********************************************************************************/
38 
39 #ifndef OSTIAPI_H
40 
41 #define OSTIAPI_H
42 
43 /*
44  * Definition for return status is defined in tiStatus_t in TIDEFS.H
45  */
46 
47 /*****************************************************************************
48  *  Initiator/Target Shared Callbacks
49  *****************************************************************************/
50 
51 osGLOBAL bit32 ostiGetTransportParam(
52                         tiRoot_t    *tiRoot,
53                         char        *key,
54                         char        *subkey1,
55                         char        *subkey2,
56                         char        *subkey3,
57                         char        *subkey4,
58                         char        *subkey5,
59                         char        *valueName,
60                         char        *buffer,
61                         bit32       bufferLen,
62                         bit32       *lenReceived
63                         );
64 
65 osGLOBAL void  ostiPortEvent(
66                         tiRoot_t      *tiRoot,
67                         tiPortEvent_t eventType,
68                         bit32         status,
69                         void          *pParm
70                         );
71 
72 osGLOBAL bit32  ostiTimeStamp( tiRoot_t  *tiRoot);
73 osGLOBAL bit64  ostiTimeStamp64( tiRoot_t  *tiRoot);
74 
75 osGLOBAL FORCEINLINE bit32 ostiChipConfigReadBit32(
76                         tiRoot_t      *tiRoot,
77                         bit32         chipConfigOffset
78                         );
79 
80 osGLOBAL FORCEINLINE void ostiChipConfigWriteBit32(
81                         tiRoot_t      *tiRoot,
82                         bit32         chipConfigOffset,
83                         bit32         chipConfigValue
84                         );
85 
86 osGLOBAL FORCEINLINE bit32 ostiChipReadBit32(
87                         tiRoot_t      *tiRoot,
88                         bit32         chipOffset
89                         );
90 
91 osGLOBAL FORCEINLINE void ostiChipWriteBit32(
92                         tiRoot_t      *tiRoot,
93                         bit32         chipOffset,
94                         bit32         chipValue
95                         );
96 
97 osGLOBAL FORCEINLINE bit8 ostiChipReadBit8(
98                         tiRoot_t      *tiRoot,
99                         bit32         chipOffset
100                         );
101 
102 osGLOBAL FORCEINLINE void ostiChipWriteBit8(
103                         tiRoot_t      *tiRoot,
104                         bit32         chipOffset,
105                         bit8          chipValue
106                         );
107 
108 osGLOBAL void ostiFlashReadBlock(
109                         tiRoot_t      *tiRoot,
110                         bit32         flashOffset,
111                         void          *buffer,
112                         bit32         bufferLen
113                         );
114 
115 osGLOBAL FORCEINLINE
116 tiDeviceHandle_t*
117 ostiGetDevHandleFromSasAddr(
118   tiRoot_t    *root,
119   unsigned char *sas_addr
120 );
121 
122 osGLOBAL FORCEINLINE void ostidisableEncryption(tiRoot_t *root);
123 
124 osGLOBAL FORCEINLINE void ostiSingleThreadedEnter(
125                         tiRoot_t      *tiRoot,
126                         bit32         queueId
127                         );
128 
129 osGLOBAL FORCEINLINE void ostiSingleThreadedLeave(
130                         tiRoot_t      *tiRoot,
131                         bit32         queueId
132                         );
133 
134 
135 osGLOBAL bit32 ostiNumOfLUNIOCTLreq(tiRoot_t           *root,
136 									void               *param1,
137                                     void               *param2,
138                                     void                           **tiRequestBody,
139                                     tiIORequest_t          **tiIORequest
140                                     );
141 
142 #ifdef PERF_COUNT
143 osGLOBAL void ostiEnter(tiRoot_t *ptiRoot, bit32 layer, int io);
144 osGLOBAL void ostiLeave(tiRoot_t *ptiRoot, bit32 layer, int io);
145 #define OSTI_INP_ENTER(root) ostiEnter(root, 2, 0)
146 #define OSTI_INP_LEAVE(root) ostiLeave(root, 2, 0)
147 #define OSTI_OUT_ENTER(root) ostiEnter(root, 2, 1)
148 #define OSTI_OUT_LEAVE(root) ostiLeave(root, 2, 1)
149 #else
150 #define OSTI_INP_ENTER(root)
151 #define OSTI_INP_LEAVE(root)
152 #define OSTI_OUT_ENTER(root)
153 #define OSTI_OUT_LEAVE(root)
154 #endif
155 
156 osGLOBAL void  ostiStallThread(
157                         tiRoot_t      *tiRoot,
158                         bit32         microseconds
159                         );
160 
161 osGLOBAL FORCEINLINE bit8
162 ostiBitScanForward(
163                   tiRoot_t   *root,
164                   bit32      *Index,
165                   bit32       Mask
166                   );
167 
168 #ifdef LINUX_VERSION_CODE
169 
170 osGLOBAL sbit32
171 ostiAtomicIncrement(
172                    tiRoot_t        *root,
173                    sbit32 volatile *Addend
174                    );
175 
176 osGLOBAL sbit32
177 ostiAtomicDecrement(
178                    tiRoot_t        *root,
179                    sbit32 volatile *Addend
180                    );
181 
182 
183 osGLOBAL sbit32
184 ostiAtomicBitClear(
185                    tiRoot_t          *root,
186                    sbit32 volatile   *Destination,
187                    sbit32             Value
188                    );
189 
190 osGLOBAL sbit32
191 ostiAtomicBitSet(
192                    tiRoot_t          *root,
193                    sbit32 volatile   *Destination,
194                    sbit32             Value
195                    );
196 
197 osGLOBAL sbit32
198 ostiAtomicExchange(
199                    tiRoot_t         *root,
200                    sbit32 volatile  *Target,
201                    sbit32            Value
202                    );
203 
204 #else
205 
206 osGLOBAL FORCEINLINE sbit32
207 ostiInterlockedIncrement(
208                    tiRoot_t        *root,
209                    sbit32 volatile *Addend
210                    );
211 
212 osGLOBAL FORCEINLINE sbit32
213 ostiInterlockedDecrement(
214                    tiRoot_t         *root,
215                    sbit32 volatile  *Addend
216                    );
217 
218 
219 osGLOBAL FORCEINLINE sbit32
220 ostiInterlockedAnd(
221                    tiRoot_t         *root,
222                    sbit32 volatile  *Destination,
223                    sbit32            Value
224                    );
225 
226 osGLOBAL FORCEINLINE sbit32
227 ostiInterlockedOr(
228                    tiRoot_t         *root,
229                    sbit32 volatile  *Destination,
230                    sbit32            Value
231                    );
232 
233 osGLOBAL FORCEINLINE sbit32
234 ostiInterlockedExchange(
235                    tiRoot_t        *root,
236                    sbit32 volatile *Target,
237                    sbit32           Value
238                    );
239 #endif /*LINUX_VERSION_CODE*/
240 
241 osGLOBAL bit32 ostiAllocMemory(
242                         tiRoot_t    *tiRoot,
243                         void        **osMemHandle,
244                         void        ** virtPtr,
245                         bit32       * physAddrUpper,
246                         bit32       * physAddrLower,
247                         bit32       alignment,
248                         bit32       allocLength,
249                         agBOOLEAN   isCacheable
250                         );
251 
252 osGLOBAL bit32 ostiFreeMemory(
253                         tiRoot_t    *tiRoot,
254                         void        *osDMAHandle,
255                         bit32       allocLength
256                         );
257 
258 osGLOBAL FORCEINLINE void ostiCacheFlush(
259                         tiRoot_t    *tiRoot,
260                         void        *osMemHandle,
261                         void        *virtPtr,
262                         bit32       length
263                         );
264 
265 osGLOBAL FORCEINLINE void ostiCacheInvalidate(
266                         tiRoot_t    *tiRoot,
267                         void        *osMemHandle,
268                         void        *virtPtr,
269                         bit32       length
270                         );
271 
272 osGLOBAL FORCEINLINE void ostiCachePreFlush(
273                         tiRoot_t    *tiRoot,
274                         void        *osMemHandle,
275                         void        *virtPtr,
276                         bit32       length
277                         );
278 
279 /*
280  *  The following two functions are for SAS/SATA
281  */
282 osGLOBAL void
283 ostiInterruptEnable(
284                         tiRoot_t  *ptiRoot,
285                         bit32     channelNum
286                         );
287 
288 osGLOBAL void
289 ostiInterruptDisable(
290                        tiRoot_t  *ptiRoot,
291                        bit32     channelNum
292                        );
293 
294 osGLOBAL FORCEINLINE bit32
295 ostiChipReadBit32Ext(
296                         tiRoot_t  *tiRoot,
297                         bit32     busBaseNumber,
298                         bit32     chipOffset
299                         );
300 
301 osGLOBAL FORCEINLINE void
302 ostiChipWriteBit32Ext(
303                         tiRoot_t  *tiRoot,
304                         bit32     busBaseNumber,
305                         bit32     chipOffset,
306                         bit32     chipValue
307                         );
308 
309 
310 /*****************************************************************************
311  *  Initiator specific Callbacks
312  *****************************************************************************/
313 
314 /*
315  * Initiator specific IO Completion
316  */
317 osGLOBAL void ostiInitiatorIOCompleted(
318                         tiRoot_t            *tiRoot,
319                         tiIORequest_t       *tiIORequest,
320                         tiIOStatus_t        status,
321                         bit32               statusDetail,
322                         tiSenseData_t       *senseData,
323                         bit32               context
324                         );
325 
326 osGLOBAL tiDeviceHandle_t*
327 ostiMapToDevHandle(tiRoot_t  *root,
328                           bit8      pathId,
329                           bit8      targetId,
330                           bit8      LUN
331                           );
332 osGLOBAL bit32 ostiSendResetDeviceIoctl(tiRoot_t *root,
333 			  void *pccb,
334 			  bit8 pathId,
335   			  bit8 targetId,
336 			  bit8 lun,
337 			  unsigned long resetType
338 			);
339 
340 osGLOBAL void
341 ostiGetSenseKeyCount(tiRoot_t  *root,
342                             bit32      fIsClear,
343                             void      *SenseKeyCount,
344                             bit32      length
345                             );
346 
347 osGLOBAL void
348 ostiGetSCSIStatusCount(tiRoot_t  *root,
349                             bit32      fIsClear,
350                             void      *ScsiStatusCount,
351                             bit32      length
352                             );
353 
354 osGLOBAL bit32
355 ostiSetDeviceQueueDepth(tiRoot_t       *tiRoot,
356                                 tiIORequest_t  *tiIORequest,
357                                 bit32           QueueDepth
358                                 );
359 
360 
361 #ifdef FAST_IO_TEST
362 typedef void (*ostiFastSSPCb_t)(tiRoot_t     *ptiRoot,
363                                  void         *arg,
364                                  tiIOStatus_t IOStatus,
365                                  bit32         statusDetail);
366 
367 void osti_FastIOCb(tiRoot_t     *ptiRoot,
368                    void         *arg,
369                    tiIOStatus_t IOStatus,
370                    bit32        statusDetail);
371 #endif
372 
373 osGLOBAL void
374 ostiInitiatorSMPCompleted(tiRoot_t    *tiRoot,
375                tiIORequest_t  *tiSMPRequest,
376                tiSMPStatus_t  smpStatus,
377                bit32          tiSMPInfoLen,
378                void           *tiFrameHandle,
379                bit32          context);
380 /*
381  * Initiator specific event
382  */
383 osGLOBAL void ostiInitiatorEvent (
384                         tiRoot_t            *tiRoot,
385                         tiPortalContext_t   *portalContext,
386                         tiDeviceHandle_t    *tiDeviceHandle,
387                         tiIntrEventType_t   eventType,
388                         bit32               eventStatus,
389                         void                *parm
390                         );
391 
392 
393 /*
394  * PMC-Sierra IOCTL semaphoring
395  */
396 osGLOBAL void ostiIOCTLClearSignal (
397                         tiRoot_t    *tiRoot,
398                         void        **agParam1,
399                         void        **agParam2,
400                         void        **agParam3
401                         );
402 
403 osGLOBAL void ostiIOCTLWaitForSignal (
404                         tiRoot_t    *tigRoot,
405                         void        *agParam1,
406                         void        *agParam2,
407                         void        *agParam3
408                         );
409 
410 osGLOBAL void ostiIOCTLSetSignal (
411                         tiRoot_t    *tiRoot,
412                         void        *agParam1,
413                         void        *agParam2,
414                         void        *agParam3
415                         );
416 
417 osGLOBAL void ostiIOCTLWaitForComplete (
418                         tiRoot_t    *tigRoot,
419                         void        *agParam1,
420                         void        *agParam2,
421                         void        *agParam3
422                         );
423 
424 osGLOBAL void ostiIOCTLComplete (
425                         tiRoot_t    *tiRoot,
426                         void        *agParam1,
427                         void        *agParam2,
428                         void        *agParam3
429                         );
430 
431 /*****************************************************************************
432  *  Target specific Callbacks
433  *****************************************************************************/
434 
435 osGLOBAL void ostiProcessScsiReq(
436                         tiRoot_t            *tiRoot,
437                         tiTargetScsiCmnd_t  *tiTgtScsiCmnd,
438                         void                *agFrameHandle,
439                         bit32               immDataLength,
440                         tiIORequest_t       *tiIORequest,
441                         tiDeviceHandle_t    *tiDeviceHandle);
442 
443 osGLOBAL void ostiNextDataPhase(
444                         tiRoot_t          *tiRoot,
445                         tiIORequest_t     *tiIORequest);
446 
447 osGLOBAL void ostiTaskManagement (
448                         tiRoot_t          *tiRoot,
449                         bit32             task,
450                         bit8              *scsiLun,
451                         tiIORequest_t     *refTiIORequest,
452                         tiIORequest_t     *tiTMRequest,
453                         tiDeviceHandle_t  *tiDeviceHandle);
454 
455 osGLOBAL void ostiTargetIOCompleted(
456                         tiRoot_t          *tiRoot,
457                         tiIORequest_t     *tiIORequest,
458                         tiIOStatus_t      status
459                         );
460 
461 osGLOBAL bit32 ostiTargetEvent (
462                         tiRoot_t          *tiRoot,
463                         tiPortalContext_t *portalContext,
464                         tiDeviceHandle_t  *tiDeviceHandle,
465                         tiTgtEventType_t  eventType,
466                         bit32             eventStatus,
467                         void              *parm
468                         );
469 
470 osGLOBAL void ostiTargetIOError(
471                         tiRoot_t          *tiRoot,
472                         tiIORequest_t     *tiIORequest,
473                         tiIOStatus_t      status,
474                         bit32             statusDetail
475                         );
476 
477 osGLOBAL void ostiTargetTmCompleted(
478                         tiRoot_t          *tiRoot,
479                         tiIORequest_t     *tiTmRequest,
480                         tiIOStatus_t      status,
481                         bit32             statusDetail
482                         );
483 
484 osGLOBAL void ostiPCI_TRIGGER( tiRoot_t *tiRoot );
485 
486 
487 #endif  /* OSTIAPI_H */
488