/*******************************************************************************
*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 mpidebug.h
* \brief The file defines the debug constants and structures
*
*/
/*******************************************************************************/
#ifndef __MPIDEBUG_H__
#define __MPIDEBUG_H__
/*******************************************************************************/
#define MPI_DEBUG_TRACE_BUFFER_MAX 1024
#define MPI_DEBUG_TRACE_OB_IOMB_SIZE 128 /* 64 */
#define MPI_DEBUG_TRACE_IB_IOMB_SIZE 128 /* 64 */
#define MPI_DEBUG_TRACE_IBQ 1
#define MPI_DEBUG_TRACE_OBQ 0
#define MPI_DEBUG_TRACE_QNUM_ERROR 100 /* Added to Qnumber to indicate error */
typedef struct mpiObDebugTraceEntry_s
{
bit64 Time;
bit32 QNum;
bit32 pici;
void * pEntry;
bit32 Iomb[MPI_DEBUG_TRACE_OB_IOMB_SIZE/4];
} mpiDebugObTraceEntry_t;
typedef struct mpiIbDebugTraceEntry_s
{
bit64 Time;
bit32 QNum;
bit32 pici;
void * pEntry;
bit32 Iomb[MPI_DEBUG_TRACE_IB_IOMB_SIZE/4];
} mpiDebugIbTraceEntry_t;
typedef struct mpiIbDebugTrace_s
{
bit32 Idx;
bit32 Pad;
mpiDebugIbTraceEntry_t Data[MPI_DEBUG_TRACE_BUFFER_MAX];
} mpiDebugIbTrace_t;
typedef struct mpiObDebugTrace_s
{
bit32 Idx;
bit32 Pad;
mpiDebugObTraceEntry_t Data[MPI_DEBUG_TRACE_BUFFER_MAX];
} mpiDebugObTrace_t;
void mpiTraceInit(void);
void mpiTraceAdd(bit32 q,bit32 pici,bit32 ib, void *iomb, bit32 numBytes);
#endif /* __MPIDEBUG_H__ */
/********************************************************************
** File that contains debug-specific APIs ( driver tracing etc )
*********************************************************************/
#ifndef __SPCDEBUG_H__
#define __SPCDEBUG_H__
/*
** console and trace levels
*/
#define hpDBG_ALWAYS 0x0000ffff
#define hpDBG_IOMB 0x00000040
#define hpDBG_REGISTERS 0x00000020
#define hpDBG_TICK_INT 0x00000010
#define hpDBG_SCREAM 0x00000008
#define hpDBG_VERY_LOUD 0x00000004
#define hpDBG_LOUD 0x00000002
#define hpDBG_ERROR 0x00000001
#define hpDBG_NEVER 0x00000000
#define smTraceDestBuffer 0x00000001
#define smTraceDestRegister 0x00000002
#define smTraceDestDebugger 0x00000004
#define siTraceDestMask (smTraceDestBuffer | \
smTraceDestRegister | \
smTraceDestDebugger)
/* Trace buffer will continuously */
/* trace and wrap-around on itself */
/* when it reaches the end */
#define hpDBG_TraceBufferWrapAround 0x80000000
/* This features enables logging of trace time */
/* stamps. Only certain key routines use this */
/* feature because it tends to clog up the trace */
/* buffer. */
#define hpDBG_TraceBufferUseTimeStamp 0x40000000
/* This features enables logging of trace sequential */
/* stamps. Only certain key routines use this */
/* feature because it tends to clog up the trace */
/* buffer. */
#define hpDBG_TraceBufferUseSequenceStamp 0x20000000
/* Trace IDs of various state machines */
#define fiTraceSmChip 'C'
#define fiTraceSmPort 'P'
#define fiTraceSmLogin 'L'
#define fiTraceSmXchg 'X'
#define fiTraceSmFabr 'F'
#define fiTraceDiscFab 'D'
#define fiTraceDiscLoop 'M'
#define fiTraceFc2 'A'
#define fiTraceTgtState 'S'
#define fiTraceIniState 'I'
/* Trace IDs of various queues */
#define fiSfsFreeList 'Z'
#define fiSestFreeList 'W'
#define fiOsSfsFreeList 'G'
#define fiLgnFreeList 'K'
#define fiPortalFreeList 'l'
#define fiBusyList 'N'
#define fiOsSfsAllocList 'B'
#define fiTimerList 'V'
#define fiSfsWaitForRspList 'I'
#define fiLgnBusyList 'J'
#define fiPortalBusyList 'g'
#define fiWait4ErqList 'o'
#define fiXchgAbortList 'U'
#define fiXchgWaitList 'b'
/* not used right now */
#define fiSfsDeferFreeList 'q'
#define fiDeferBusyList 'm'
#define fiInvalidList 'X'
#define fiInvalidatedList 'a'
#define fiTmpXchList 'n'
#define TMP_TRACE_BUFF_SIZE 32
#define FC_TRACE_LINE_SIZE 70
/******************************************************************************/
/* Macro Conventions: we are assuming that the macros will be called inside */
/* a function that already has a workable saRoot variable */
/******************************************************************************/
/******************************************************************************/
/* fiTraceState : ==> _!n_ _ss: XXXXXXXX _se: XXXXXXXX */
/* statemachine --^ currentstate--^ triggerevent--^ */
/* NOTE: shorthand forms available as macros below. */
/******************************************************************************/
#ifdef SA_ENABLE_TRACE_FUNCTIONS
void siResetTraceBuffer(agsaRoot_t *agRoot);
void siTraceFuncEnter(agsaRoot_t *agRoot, bit32 mask, bit32 fileid, char *funcid);
GLOBAL void siTraceFuncExit( agsaRoot_t *agRoot, bit32 mask, char fileid, char * funcid, char exitId );
void siTrace(agsaRoot_t *agRoot, bit32 mask, char *uId, bit32 value, bit32 dataSizeInBits);
void siTrace64(agsaRoot_t *agRoot, bit32 mask, char *uId, bit64 value, bit32 dataSizeInBits);
bit32 siGetCurrentTraceIndex(agsaRoot_t *agRoot);
void siTraceListRemove(agsaRoot_t *agRoot, bit32 mask, char listId, bitptr exchangeId);
void siTraceListAdd(agsaRoot_t *agRoot, bit32 mask, char listId, bitptr exchangeId);
void siTraceState(agsaRoot_t *agRoot, bit32 mask, bit32 statemachine, bit32 currentstate, bit32 triggerevent);
#define smTraceState(L,S,C,T) siTraceState(agRoot,L,S,C,T)
#define smTraceChipState(L,C,T) siTraceState(agRoot,L,fiTraceSmChip,C,T)
#define smTraceFabricState(L,C,T) siTraceState(agRoot,L,fiTraceSmFabr,C,T)
#define smTracePortState(L,C,T) siTraceState(agRoot,L,fiTraceSmPort,C,T)
#define smTraceLoginState(L,C,T) siTraceState(agRoot,L,fiTraceSmLogin,C,T)
#define smTraceXchgState(L,C,T) siTraceState(agRoot,L,fiTraceSmXchg,C,T)
#define smTraceDiscFabState(L,C,T) siTraceState(agRoot,L,fiTraceDiscFab,C,T)
#define smTraceDiscLoopState(L,C,T) siTraceState(agRoot,L,fiTraceDiscLoop,C,T)
#define smTraceFc2State(L,C,T) siTraceState(agRoot,L,fiTraceFc2,C,T)
#define smTraceScsiTgtState(L,C,T) siTraceState(agRoot,L,fiTraceTgtState,C,T)
#define smTraceScsiIniState(L,C,T) siTraceState(agRoot,L,fiTraceIniState,C,T)
#define smResetTraceBuffer(L) siResetTraceBuffer(L)
#define smTraceFuncEnter(L,I) siTraceFuncEnter(agRoot,L,siTraceFileID,I)
#define smTraceFuncExit(L,S,I) siTraceFuncExit(agRoot,L,siTraceFileID,I,S)
#define smGetCurrentTraceIndex(L) siGetCurrentTraceIndex(L)
#define smTraceListRemove(R,L,I,V) siTraceListRemove(R,L,I,V)
#define smTraceListAdd(R,L,I,V) siTraceListAdd(R,L,I,V)
#define smTrace(L,I,V) \
/*lint -e506 */ \
/*lint -e774 */ \
if (sizeof(V) == 8) {siTrace64(agRoot,L,I,(bit64)V,64);} \
else {siTrace(agRoot,L,I,(bit32)V,32);} \
/*lint +e506 */ \
/*lint +e774 */
#else
#define siTraceState(agRoot,L,fiTraceSmXchg,C,T)
#define smTraceState(L,S,C,T)
#define smTraceChipState(L,C,T)
#define smTraceFabricState(L,C,T)
#define smTracePortState(L,C,T)
#define smTraceLoginState(L,C,T)
#define smTraceXchgState(L,C,T)
#define smTraceDiscFabState(L,C,T)
#define smTraceDiscLoopState(L,C,T)
#define smTraceFc2State(L,C,T)
#define smTraceScsiTgtState(L,C,T)
#define smTraceScsiIniState(L,C,T)
#define smResetTraceBuffer(agRoot)
#define smTraceFuncEnter(L,I)
#define smTraceFuncExit(L,S,I)
#define smGetCurrentTraceIndex(L)
#define smTraceListRemove(L,I,V)
#define smTraceListAdd(L,I,V)
#define smTrace(L,I,V)
#endif
struct hpTraceBufferParms_s {
bit32 TraceCompiled;
bit32 BufferSize;
bit32 CurrentTraceIndexWrapCount;
bit32 CurrentIndex;
bit32 TraceWrap;
bit8 * pTrace;
bit32 * pCurrentTraceIndex;
bit32 * pTraceIndexWrapCount;
bit32 * pTraceMask;
};
typedef struct hpTraceBufferParms_s
hpTraceBufferParms_t;
#ifdef SA_ENABLE_TRACE_FUNCTIONS
GLOBAL void siTraceGetInfo(agsaRoot_t *agRoot, hpTraceBufferParms_t * pBParms);
#define smTraceGetInfo(R,P) siTraceGetInfo(R,P)
#else
#define smTraceGetInfo(R,P)
#endif
void siEnableTracing ( agsaRoot_t *agRoot );
#ifdef SA_ENABLE_TRACE_FUNCTIONS
GLOBAL void siTraceSetMask(agsaRoot_t *agRoot, bit32 TraceMask );
#define smTraceSetMask(R,P) siTraceSetMask(R,P)
#else
#define smTraceSetMask(R,P)
#endif /* SA_ENABLE_TRACE_FUNCTIONS */
#endif /* #ifndef __SPCDEBUG_H__ */