ostiapi.h revision 285809
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 51osGLOBAL 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 65osGLOBAL void ostiPortEvent( 66 tiRoot_t *tiRoot, 67 tiPortEvent_t eventType, 68 bit32 status, 69 void *pParm 70 ); 71 72osGLOBAL bit32 ostiTimeStamp( tiRoot_t *tiRoot); 73osGLOBAL bit64 ostiTimeStamp64( tiRoot_t *tiRoot); 74 75osGLOBAL FORCEINLINE bit32 ostiChipConfigReadBit32( 76 tiRoot_t *tiRoot, 77 bit32 chipConfigOffset 78 ); 79 80osGLOBAL FORCEINLINE void ostiChipConfigWriteBit32( 81 tiRoot_t *tiRoot, 82 bit32 chipConfigOffset, 83 bit32 chipConfigValue 84 ); 85 86osGLOBAL FORCEINLINE bit32 ostiChipReadBit32( 87 tiRoot_t *tiRoot, 88 bit32 chipOffset 89 ); 90 91osGLOBAL FORCEINLINE void ostiChipWriteBit32( 92 tiRoot_t *tiRoot, 93 bit32 chipOffset, 94 bit32 chipValue 95 ); 96 97osGLOBAL FORCEINLINE bit8 ostiChipReadBit8( 98 tiRoot_t *tiRoot, 99 bit32 chipOffset 100 ); 101 102osGLOBAL FORCEINLINE void ostiChipWriteBit8( 103 tiRoot_t *tiRoot, 104 bit32 chipOffset, 105 bit8 chipValue 106 ); 107 108osGLOBAL void ostiFlashReadBlock( 109 tiRoot_t *tiRoot, 110 bit32 flashOffset, 111 void *buffer, 112 bit32 bufferLen 113 ); 114 115osGLOBAL FORCEINLINE 116tiDeviceHandle_t* 117ostiGetDevHandleFromSasAddr( 118 tiRoot_t *root, 119 unsigned char *sas_addr 120); 121 122osGLOBAL FORCEINLINE void ostidisableEncryption(tiRoot_t *root); 123 124osGLOBAL FORCEINLINE void ostiSingleThreadedEnter( 125 tiRoot_t *tiRoot, 126 bit32 queueId 127 ); 128 129osGLOBAL FORCEINLINE void ostiSingleThreadedLeave( 130 tiRoot_t *tiRoot, 131 bit32 queueId 132 ); 133 134 135osGLOBAL bit32 ostiNumOfLUNIOCTLreq(tiRoot_t *root, 136 void *param1, 137 void *param2, 138 void **tiRequestBody, 139 tiIORequest_t **tiIORequest 140 ); 141 142#ifdef PERF_COUNT 143osGLOBAL void ostiEnter(tiRoot_t *ptiRoot, bit32 layer, int io); 144osGLOBAL 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 156osGLOBAL void ostiStallThread( 157 tiRoot_t *tiRoot, 158 bit32 microseconds 159 ); 160 161osGLOBAL FORCEINLINE bit8 162ostiBitScanForward( 163 tiRoot_t *root, 164 bit32 *Index, 165 bit32 Mask 166 ); 167 168#ifdef LINUX_VERSION_CODE 169 170osGLOBAL sbit32 171ostiAtomicIncrement( 172 tiRoot_t *root, 173 sbit32 volatile *Addend 174 ); 175 176osGLOBAL sbit32 177ostiAtomicDecrement( 178 tiRoot_t *root, 179 sbit32 volatile *Addend 180 ); 181 182 183osGLOBAL sbit32 184ostiAtomicBitClear( 185 tiRoot_t *root, 186 sbit32 volatile *Destination, 187 sbit32 Value 188 ); 189 190osGLOBAL sbit32 191ostiAtomicBitSet( 192 tiRoot_t *root, 193 sbit32 volatile *Destination, 194 sbit32 Value 195 ); 196 197osGLOBAL sbit32 198ostiAtomicExchange( 199 tiRoot_t *root, 200 sbit32 volatile *Target, 201 sbit32 Value 202 ); 203 204#else 205 206osGLOBAL FORCEINLINE sbit32 207ostiInterlockedIncrement( 208 tiRoot_t *root, 209 sbit32 volatile *Addend 210 ); 211 212osGLOBAL FORCEINLINE sbit32 213ostiInterlockedDecrement( 214 tiRoot_t *root, 215 sbit32 volatile *Addend 216 ); 217 218 219osGLOBAL FORCEINLINE sbit32 220ostiInterlockedAnd( 221 tiRoot_t *root, 222 sbit32 volatile *Destination, 223 sbit32 Value 224 ); 225 226osGLOBAL FORCEINLINE sbit32 227ostiInterlockedOr( 228 tiRoot_t *root, 229 sbit32 volatile *Destination, 230 sbit32 Value 231 ); 232 233osGLOBAL FORCEINLINE sbit32 234ostiInterlockedExchange( 235 tiRoot_t *root, 236 sbit32 volatile *Target, 237 sbit32 Value 238 ); 239#endif /*LINUX_VERSION_CODE*/ 240 241osGLOBAL 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 252osGLOBAL bit32 ostiFreeMemory( 253 tiRoot_t *tiRoot, 254 void *osDMAHandle, 255 bit32 allocLength 256 ); 257 258osGLOBAL FORCEINLINE void ostiCacheFlush( 259 tiRoot_t *tiRoot, 260 void *osMemHandle, 261 void *virtPtr, 262 bit32 length 263 ); 264 265osGLOBAL FORCEINLINE void ostiCacheInvalidate( 266 tiRoot_t *tiRoot, 267 void *osMemHandle, 268 void *virtPtr, 269 bit32 length 270 ); 271 272osGLOBAL 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 */ 282osGLOBAL void 283ostiInterruptEnable( 284 tiRoot_t *ptiRoot, 285 bit32 channelNum 286 ); 287 288osGLOBAL void 289ostiInterruptDisable( 290 tiRoot_t *ptiRoot, 291 bit32 channelNum 292 ); 293 294osGLOBAL FORCEINLINE bit32 295ostiChipReadBit32Ext( 296 tiRoot_t *tiRoot, 297 bit32 busBaseNumber, 298 bit32 chipOffset 299 ); 300 301osGLOBAL FORCEINLINE void 302ostiChipWriteBit32Ext( 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 */ 317osGLOBAL 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 326osGLOBAL tiDeviceHandle_t* 327ostiMapToDevHandle(tiRoot_t *root, 328 bit8 pathId, 329 bit8 targetId, 330 bit8 LUN 331 ); 332osGLOBAL bit32 ostiSendResetDeviceIoctl(tiRoot_t *root, 333 void *pccb, 334 bit8 pathId, 335 bit8 targetId, 336 bit8 lun, 337 unsigned long resetType 338 ); 339 340osGLOBAL void 341ostiGetSenseKeyCount(tiRoot_t *root, 342 bit32 fIsClear, 343 void *SenseKeyCount, 344 bit32 length 345 ); 346 347osGLOBAL void 348ostiGetSCSIStatusCount(tiRoot_t *root, 349 bit32 fIsClear, 350 void *ScsiStatusCount, 351 bit32 length 352 ); 353 354osGLOBAL bit32 355ostiSetDeviceQueueDepth(tiRoot_t *tiRoot, 356 tiIORequest_t *tiIORequest, 357 bit32 QueueDepth 358 ); 359 360 361#ifdef FAST_IO_TEST 362typedef void (*ostiFastSSPCb_t)(tiRoot_t *ptiRoot, 363 void *arg, 364 tiIOStatus_t IOStatus, 365 bit32 statusDetail); 366 367void osti_FastIOCb(tiRoot_t *ptiRoot, 368 void *arg, 369 tiIOStatus_t IOStatus, 370 bit32 statusDetail); 371#endif 372 373osGLOBAL void 374ostiInitiatorSMPCompleted(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 */ 383osGLOBAL 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 */ 396osGLOBAL void ostiIOCTLClearSignal ( 397 tiRoot_t *tiRoot, 398 void **agParam1, 399 void **agParam2, 400 void **agParam3 401 ); 402 403osGLOBAL void ostiIOCTLWaitForSignal ( 404 tiRoot_t *tigRoot, 405 void *agParam1, 406 void *agParam2, 407 void *agParam3 408 ); 409 410osGLOBAL void ostiIOCTLSetSignal ( 411 tiRoot_t *tiRoot, 412 void *agParam1, 413 void *agParam2, 414 void *agParam3 415 ); 416 417osGLOBAL void ostiIOCTLWaitForComplete ( 418 tiRoot_t *tigRoot, 419 void *agParam1, 420 void *agParam2, 421 void *agParam3 422 ); 423 424osGLOBAL void ostiIOCTLComplete ( 425 tiRoot_t *tiRoot, 426 void *agParam1, 427 void *agParam2, 428 void *agParam3 429 ); 430 431/***************************************************************************** 432 * Target specific Callbacks 433 *****************************************************************************/ 434 435osGLOBAL 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 443osGLOBAL void ostiNextDataPhase( 444 tiRoot_t *tiRoot, 445 tiIORequest_t *tiIORequest); 446 447osGLOBAL 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 455osGLOBAL void ostiTargetIOCompleted( 456 tiRoot_t *tiRoot, 457 tiIORequest_t *tiIORequest, 458 tiIOStatus_t status 459 ); 460 461osGLOBAL 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 470osGLOBAL void ostiTargetIOError( 471 tiRoot_t *tiRoot, 472 tiIORequest_t *tiIORequest, 473 tiIOStatus_t status, 474 bit32 statusDetail 475 ); 476 477osGLOBAL void ostiTargetTmCompleted( 478 tiRoot_t *tiRoot, 479 tiIORequest_t *tiTmRequest, 480 tiIOStatus_t status, 481 bit32 statusDetail 482 ); 483 484osGLOBAL void ostiPCI_TRIGGER( tiRoot_t *tiRoot ); 485 486 487#endif /* OSTIAPI_H */ 488