/*******************************************************************************
*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved. 
*
*Redistribution and use in source and binary forms, with or without modification, are permitted provided 
*that the following conditions are met: 
*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
*following disclaimer. 
*2. Redistributions in binary form must reproduce the above copyright notice, 
*this list of conditions and the following disclaimer in the documentation and/or other materials provided
*with the distribution. 
*
*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 
*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
* $FreeBSD$
*
********************************************************************************/
/*******************************************************************************/
/*! \file saapi.h
 *  \brief The file defines the declaration of tSDK APIs
 *
 *
 *
 *
 */
/******************************************************************************/

#ifndef  __SSDKAPI_H__
#define __SSDKAPI_H__

/********************************************************************************
 *                             SA LL Function Declaration                       *
 ********************************************************************************/

/***************************************************************************
 * Definition of interrupt related functions start                         *
 ***************************************************************************/


GLOBAL bit32 FORCEINLINE saDelayedInterruptHandler(
                              agsaRoot_t  *agRoot,
                              bit32       interruptVectorIndex,
                              bit32       count
                              );

GLOBAL bit32 FORCEINLINE saInterruptHandler(
                              agsaRoot_t  *agRoot,
                              bit32       interruptVectorIndex
                              );

GLOBAL void saSystemInterruptsActive(
                              agsaRoot_t  *agRoot,
                              agBOOLEAN     sysIntsActive
                              );

GLOBAL FORCEINLINE void saSystemInterruptsEnable(
                              agsaRoot_t  *agRoot,
                              bit32       interruptVectorIndex
                              );
/***************************************************************************
 * Definition of interrupt related functions end                           *
 ***************************************************************************/


/***************************************************************************
 * Definition of timer related functions start                             *
 ***************************************************************************/
GLOBAL void saTimerTick(agsaRoot_t  *agRoot);
/***************************************************************************
 * Definition of timer related functions end                               *
 ***************************************************************************/

/***************************************************************************
 * Definition of initialization related functions start                    *
 ***************************************************************************/
GLOBAL void saGetRequirements(
                              agsaRoot_t              *agRoot,
                              agsaSwConfig_t          *swConfig,
                              agsaMemoryRequirement_t *memoryRequirement,
                              bit32                   *usecsPerTick,
                              bit32                   *maxNumLocks
                              );

GLOBAL bit32 saInitialize(
                          agsaRoot_t                  *agRoot,
                          agsaMemoryRequirement_t     *memoryAllocated,
                          agsaHwConfig_t              *hwConfig,
                          agsaSwConfig_t              *swConfig,
                          bit32                       usecsPerTick
                          );
/***************************************************************************
 * Definition of initialization related functions end                      *
 ***************************************************************************/

/***************************************************************************
 * Definition of hardware related functions start                          *
 ***************************************************************************/
GLOBAL void saHwReset(
                      agsaRoot_t  *agRoot,
                      bit32       resetType,
                      bit32       resetParm
                      );

GLOBAL void saHwShutdown(agsaRoot_t *agRoot);

/***************************************************************************
 * Definition of hardware related functions end                            *
 ***************************************************************************/

/***************************************************************************
 * Definition of phy related functions start                               *
 ***************************************************************************/
GLOBAL bit32 saPhyStart(
                        agsaRoot_t          *agRoot,
                        agsaContext_t       *agContext,
                        bit32               queueNum,
                        bit32               phyId,
                        agsaPhyConfig_t     *agPhyConfig,
                        agsaSASIdentify_t   *agSASIdentify
                        );

GLOBAL bit32 saPhyStop(
                      agsaRoot_t            *agRoot,
                      agsaContext_t         *agContext,
                      bit32                 queueNum,
                      bit32                 phyId
                      );


GLOBAL bit32 saLocalPhyControl(
                      agsaRoot_t             *agRoot,
                      agsaContext_t          *agContext,
                      bit32                   queueNum,
                      bit32                   phyId,
                      bit32                   phyOperation,
                      ossaLocalPhyControlCB_t agCB
                      );

GLOBAL bit32 saGetPhyProfile(
                      agsaRoot_t               *agRoot,
                      agsaContext_t            *agContext,
                      bit32                    queueNum,
                      bit32                    ppc,
                      bit32                    phyID
                      );

GLOBAL bit32 saSetPhyProfile (
                      agsaRoot_t               *agRoot,
                      agsaContext_t            *agContext,
                      bit32                    queueNum,
                      bit32                    ppc,
                      bit32                    length,
                      void                     *buffer,
                      bit32                    phyID
                      );

GLOBAL bit32 saHwEventAck(
                      agsaRoot_t        *agRoot,
                      agsaContext_t     *agContext,
                      bit32              queueNum,
                      agsaEventSource_t *eventSource,
                      bit32              param0,
                      bit32              param1
                      );


/***************************************************************************
 * Definition of phy related functions end                                 *
 ***************************************************************************/

/***************************************************************************
 * Definition of discovery related functions start                         *
 ***************************************************************************/
GLOBAL bit32 saDiscover(
                        agsaRoot_t          *agRoot,
                        agsaPortContext_t   *agPortContext,
                        bit32               type,
                        bit32               option
                        );
/***************************************************************************
 * Definition of discovery related functions end                           *
 ***************************************************************************/

/***************************************************************************
 * Definition of frame related functions start                             *
 ***************************************************************************/
GLOBAL bit32 saFrameReadBit32(
                        agsaRoot_t          *agRoot,
                        agsaFrameHandle_t   agFrame,
                        bit32               frameOffset
                        );

GLOBAL void saFrameReadBlock(
                        agsaRoot_t          *agRoot,
                        agsaFrameHandle_t   agFrame,
                        bit32               frameOffset,
                        void                *frameBuffer,
                        bit32               frameBufLen
                        );
/***************************************************************************
 * Definition of frame related functions end                               *
 ***************************************************************************/

/***************************************************************************
 * Definition of SATA related functions start                              *
 ***************************************************************************/
GLOBAL bit32 saSATAStart(
                        agsaRoot_t                  *agRoot,
                        agsaIORequest_t             *agIORequest,
                        bit32                       queueNum,
                        agsaDevHandle_t             *agDevHandle,
                        bit32                       agRequestType,
                        agsaSATAInitiatorRequest_t  *agSATAReq,
                        bit8                        agTag,
                        ossaSATACompletedCB_t       agCB
                        );

GLOBAL bit32 saSATAAbort(
                        agsaRoot_t                  *agRoot,
                        agsaIORequest_t             *agIORequest,
                        bit32                       queueNum,
                        agsaDevHandle_t             *agDevHandle,
                        bit32                       flag,
                        void                        *abortParam,
                        ossaGenericAbortCB_t        agCB
                        );

/***************************************************************************
 * Definition of SATA related functions end                                *
 ***************************************************************************/

/***************************************************************************
 * Definition of SAS related functions start                               *
 ***************************************************************************/

GLOBAL bit32 saSendSMPIoctl(
						agsaRoot_t                *agRoot,
						agsaDevHandle_t           *agDevHandle,
						bit32                      queueNum,
						agsaSMPFrame_t            *pSMPFrame,  
						ossaSMPCompletedCB_t       agCB
						);

GLOBAL bit32 saSMPStart(
                        agsaRoot_t                *agRoot,
                        agsaIORequest_t           *agIORequest,
                        bit32                     queueNum,
                        agsaDevHandle_t           *agDevHandle,
                        bit32                     agRequestType,
                        agsaSASRequestBody_t      *agRequestBody,
                        ossaSMPCompletedCB_t      agCB
                        );

GLOBAL bit32 saSMPAbort(
                        agsaRoot_t                *agRoot,
                        agsaIORequest_t           *agIORequest,
                        bit32                     queueNum,
                        agsaDevHandle_t           *agDevHandle,
                        bit32                     flag,
                        void                      *abortParam,
                        ossaGenericAbortCB_t      agCB
                        );

GLOBAL bit32 saSSPStart(
                        agsaRoot_t                *agRoot,
                        agsaIORequest_t           *agIORequest,
                        bit32                     queueNum,
                        agsaDevHandle_t           *agDevHandle,
                        bit32                     agRequestType,
                        agsaSASRequestBody_t      *agRequestBody,
                        agsaIORequest_t           *agTMRequest,
                        ossaSSPCompletedCB_t      agCB
                        );

#ifdef FAST_IO_TEST
GLOBAL void *saFastSSPPrepare(
                        void                 *ioHandle,
                        agsaFastCommand_t    *fc,
                        ossaSSPCompletedCB_t cb,
                        void                 *cbArg);

GLOBAL bit32 saFastSSPSend(void    *ioHandle);
GLOBAL bit32 saFastSSPCancel(void  *ioHandle);
#endif

GLOBAL bit32 saSSPAbort(
                        agsaRoot_t                *agRoot,
                        agsaIORequest_t           *agIORequest,
                        bit32                     queueNum,
                        agsaDevHandle_t           *agDevHandle,
                        bit32                     flag,
                        void                      *abortParam,
                        ossaGenericAbortCB_t      agCB
                        );

GLOBAL void saGetDifErrorDetails(
                        agsaRoot_t                *agRoot,
                        agsaIORequest_t           *agIORequest,
                        agsaDifDetails_t          *difDetails
                        );

GLOBAL bit32 saRegisterEventCallback(
                        agsaRoot_t                *agRoot,
                        bit32                     eventSourceType,
                        ossaGenericCB_t           callbackPtr
                        );

/***************************************************************************
 * Definition of SAS related functions end                                 *
 ***************************************************************************/

/***************************************************************************
 * Definition of Device related functions start                            *
 ***************************************************************************/
GLOBAL bit32 saRegisterNewDevice(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum,
                        agsaDeviceInfo_t          *agDeviceInfo,
                        agsaPortContext_t         *agPortContext,
                        bit16                     hostAssignedDeviceId
                        );

GLOBAL bit32 saDeregisterDeviceHandle(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        agsaDevHandle_t           *agDevHandle,
                        bit32                     queueNum
                        );

GLOBAL bit32 saGetDeviceHandles(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum,
                        agsaPortContext_t         *agPortContext,
                        bit32                     flags,
                        agsaDevHandle_t           *agDev[],
                        bit32                     skipCount,
                        bit32                     maxDevs
                        );

GLOBAL bit32 saGetDeviceInfo(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     option,
                        bit32                     queueNum,
                        agsaDevHandle_t           *agDevHandle
                        );

GLOBAL bit32 saGetDeviceState(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum,
                        agsaDevHandle_t           *agDevHandle
                        );

GLOBAL bit32 saSetDeviceInfo(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum ,
                        agsaDevHandle_t           *agDevHandle,
                        bit32                     option,
                        bit32                     param,
                        ossaSetDeviceInfoCB_t   agCB
                        );

GLOBAL bit32 saSetDeviceState(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum,
                        agsaDevHandle_t           *agDevHandle,
                        bit32                     newDeviceState
                        );

/***************************************************************************
 * Definition of Device related functions end                              *
 ***************************************************************************/

/***************************************************************************
 * Definition of Misc related functions start                              *
 ***************************************************************************/
GLOBAL bit32 saFwFlashUpdate(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum,
                        agsaUpdateFwFlash_t       *flashUpdateInfo
                        );

GLOBAL bit32 saFlashExtExecute (
                        agsaRoot_t            *agRoot,
                        agsaContext_t         *agContext,
                        bit32                 queueNum,
                        agsaFlashExtExecute_t *agFlashExtExe
                        );

#ifdef SPC_ENABLE_PROFILE
GLOBAL bit32 saFwProfile(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum,
                        agsaFwProfile_t           *fwProfileInfo
                        );
#endif

GLOBAL bit32 saEchoCommand(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum,
                        void                      *echoPayload
                        );

GLOBAL bit32 saGetControllerInfo(
                        agsaRoot_t                *agRoot,
                        agsaControllerInfo_t      *controllerInfo
                        );

GLOBAL bit32 saGetControllerStatus(
                          agsaRoot_t              *agRoot,
                          agsaControllerStatus_t  *controllerStatus
                        );

GLOBAL bit32 saGetControllerEventLogInfo(
                        agsaRoot_t                 *agRoot,
                          agsaControllerEventLog_t *eventLogInfo
                        );

GLOBAL bit32 saGpioEventSetup(
                        agsaRoot_t                 *agRoot,
                        agsaContext_t              *agContext,
                        bit32                      queueNum,
                        agsaGpioEventSetupInfo_t   *gpioEventSetupInfo
                        );

GLOBAL bit32 saGpioPinSetup(
                        agsaRoot_t                 *agRoot,
                        agsaContext_t              *agContext,
                        bit32                      queueNum,
                        agsaGpioPinSetupInfo_t     *gpioPinSetupInfo
                        );

GLOBAL bit32 saGpioRead(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum
                        );

GLOBAL bit32 saGpioWrite(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum,
                        bit32                     gpioWriteMask,
                        bit32                     gpioWriteValue
                        );

GLOBAL bit32 saSASDiagExecute(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum,
                        agsaSASDiagExecute_t      *diag
                        );

GLOBAL bit32 saSASDiagStartEnd(
                        agsaRoot_t                *agRoot,
                        agsaContext_t             *agContext,
                        bit32                     queueNum,
                        bit32                     phyId,
                        bit32                     operation
                        );

GLOBAL bit32 saGetTimeStamp(
                        agsaRoot_t    *agRoot,
                        agsaContext_t *agContext,
                        bit32         queueNum
                        );

GLOBAL bit32 saPortControl(
                        agsaRoot_t        *agRoot,
                        agsaContext_t     *agContext,
                        bit32             queueNum,
                        agsaPortContext_t *agPortContext,
                        bit32             portOperation,
                        bit32             param0,
                        bit32             param1
                        );

GLOBAL bit32 saGetRegisterDump(
                        agsaRoot_t        *agRoot,
                        agsaContext_t     *agContext,
                        bit32             queueNum,
                        agsaRegDumpInfo_t *regDumpInfo
                        );

GLOBAL bit32 saGetForensicData(
                        agsaRoot_t          *agRoot,
                        agsaContext_t       *agContext,
                        agsaForensicData_t  *forensicData
                        );

bit32 saGetIOErrorStats(
                         agsaRoot_t        *agRoot,
                         agsaContext_t     *agContext,
                         bit32              flag
                         );

bit32 saGetIOEventStats(
                         agsaRoot_t        *agRoot,
                         agsaContext_t     *agContext,
                         bit32              flag
                         );

GLOBAL bit32 saGetNVMDCommand(
                        agsaRoot_t        *agRoot,
                        agsaContext_t     *agContext,
                        bit32             queueNum,
                        agsaNVMDData_t    *NVMDInfo
                        );

GLOBAL bit32 saSetNVMDCommand(
                        agsaRoot_t        *agRoot,
                        agsaContext_t     *agContext,
                        bit32             queueNum,
                        agsaNVMDData_t    *NVMDInfo
                        );

GLOBAL bit32 saReconfigSASParams(
                        agsaRoot_t        *agRoot,
                        agsaContext_t     *agContext,
                        bit32             queueNum ,
                        agsaSASReconfig_t *agSASConfig
                        );

GLOBAL bit32 saSgpio(
                agsaRoot_t              *agRoot,
                agsaContext_t           *agContext,
                bit32                   queueNum,
                agsaSGpioReqResponse_t  *pSGpioReq
                );

GLOBAL bit32 saPCIeDiagExecute(
                        agsaRoot_t             *agRoot,
                        agsaContext_t          *agContext,
                        bit32                   queueNum,
                        agsaPCIeDiagExecute_t  *diag);


GLOBAL bit32 saEncryptSelftestExecute(
                        agsaRoot_t    *agRoot,
                        agsaContext_t *agContext,
                        bit32          queueNum,
                        bit32          type,
                        bit32          length,
                        void          *TestDescriptor);

GLOBAL bit32 saSetOperator(
                  agsaRoot_t     *agRoot,
                  agsaContext_t  *agContext,
                  bit32           queueNum,
                  bit32           flag,
                  void           *cert);

GLOBAL bit32 saGetOperator(
                  agsaRoot_t     *agRoot,
                  agsaContext_t  *agContext,
                  bit32           queueNum,
                  bit32           option,
                  bit32           AddrHi,
                  bit32           AddrLo);

GLOBAL bit32 saOperatorManagement(
                        agsaRoot_t           *agRoot,
                        agsaContext_t        *agContext,
                        bit32                 queueNum,
                        bit32                 flag,
                        bit8                  role,
                        agsaID_t              *id,
                        agsaEncryptKekBlob_t  *kblob);


/***************************************************************************
 * Definition of Misc. related functions end                               *
 ***************************************************************************/

GLOBAL bit32 saSetControllerConfig(
                      agsaRoot_t        *agRoot,
                      bit32             queueNum,
                      bit32             modePage,
                      bit32             length,
                      void              *buffer,
                      agsaContext_t     *agContext
                      );


GLOBAL bit32 saGetControllerConfig(
                      agsaRoot_t        *agRoot,
                      bit32             queueNum,
                      bit32             modePage,
                      bit32             flag0,
                      bit32             flag1,
                      agsaContext_t     *agContext
                      );

GLOBAL bit32 saEncryptDekCacheUpdate(
                     agsaRoot_t        *agRoot,
                     agsaContext_t     *agContext,
                     bit32             queueNum,
                     bit32             kekIndex,
                     bit32             dekTableSelect,
                     bit32             dekAddrHi,
                     bit32             dekAddrLo,
                     bit32             dekIndex,
                     bit32             dekNumberOfEntries,
                     bit32             dekBlobFormat,
                     bit32             dekTableKeyEntrySize
                     );

GLOBAL bit32 saEncryptDekCacheInvalidate(
                    agsaRoot_t         *agRoot,
                    agsaContext_t      *agContext,
                    bit32              queueNum,
                    bit32              dekTable,
                    bit32              dekIndex
                    );

GLOBAL bit32 saEncryptGetMode(
                    agsaRoot_t         *agRoot,
                    agsaContext_t      *agContext,
                    agsaEncryptInfo_t  *encryptInfo
                    );

GLOBAL bit32 saEncryptSetMode (
                      agsaRoot_t        *agRoot,
                      agsaContext_t     *agContext,
                      bit32             queueNum,
                      agsaEncryptInfo_t *mode
                      );

GLOBAL bit32 saEncryptKekInvalidate(
                    agsaRoot_t         *agRoot,
                     agsaContext_t     *agContext,
                    bit32              queueNum,
                    bit32              kekIndex
                    );

GLOBAL bit32 saEncryptKekUpdate(
                    agsaRoot_t         *agRoot,
                    agsaContext_t     *agContext,
                    bit32              queueNum,
                    bit32              flags,
                    bit32              newKekIndex,
                    bit32              wrapperKekIndex,
                    bit32              blobFormat,
                    agsaEncryptKekBlob_t *encryptKekBlob
                    );

#ifdef HIALEAH_ENCRYPTION
GLOBAL bit32 saEncryptHilUpdate(
                    agsaRoot_t         *agRoot,
                    agsaContext_t      *agContext,
                    bit32              queueNum
                    );
#endif /* HIALEAH_ENCRYPTION */

GLOBAL bit32 saGetDFEData(
                          agsaRoot_t    *agRoot,
                          agsaContext_t   *agContext,
                          bit32     queueNum,
                          bit32                 interface,
                          bit32                 laneNumber,
                          bit32                 interations,
                          agsaSgl_t             *agSgl);


GLOBAL bit32 saFatalInterruptHandler(
                          agsaRoot_t  *agRoot,
                          bit32       interruptVectorIndex
  );


GLOBAL bit32 saDIFEncryptionOffloadStart(
                          agsaRoot_t         *agRoot,
                          agsaContext_t      *agContext,
                          bit32               queueNum,
                          bit32               op,
                          agsaDifEncPayload_t *agsaDifEncPayload,
                          ossaDIFEncryptionOffloadStartCB_t agCB);


GLOBAL bit32 saVhistCapture(
                          agsaRoot_t    *agRoot,
                          agsaContext_t *agContext,
                          bit32         queueNum,
                          bit32         Channel,
                          bit32         NumBitLo,
                          bit32         NumBitHi,
                          bit32         PcieAddrLo,
                          bit32         PcieAddrHi,
                          bit32         ByteCount );


GLOBAL void saCountActiveIORequests(  agsaRoot_t              *agRoot);

#ifdef SA_64BIT_TIMESTAMP
osGLOBAL bit64  osTimeStamp64(void);
#endif /* SA_64BIT_TIMESTAMP */

#ifdef SALL_API_TEST
/***************************************************************************
 * Definition of LL Test related API functions start                       *
 ***************************************************************************/
GLOBAL bit32 saGetLLCounters(
                      agsaRoot_t          *agRoot,
                      bit32               counters,
                      agsaLLCountInfo_t   *LLCountInfo
                      );

GLOBAL bit32 saResetLLCounters(
                      agsaRoot_t     *agRoot,
                      bit32          counters
                      );
#endif

#endif  /*__SSDKAPI_H__ */