#include <sys/cdefs.h>
#include <dev/pms/config.h>
#include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
#ifdef MPI_DEBUG_TRACE_ENABLE
#ifdef OSLAYER_USE_HI_RES_TIMER
unsigned __int64
GetHiResTimeStamp(void);
#endif
mpiDebugObTrace_t obTraceData;
mpiDebugIbTrace_t ibTraceData;
void mpiTraceInit(void)
{
SA_DBG1(("mpiTraceInit:obTraceData @ %p\n",&obTraceData ));
SA_DBG1(("mpiTraceInit:ibTraceData @ %p\n",&ibTraceData ));
SA_DBG1(("mpiTraceInit: num enties %d Ib Iomb size %d Ob Iomb size %d\n",
MPI_DEBUG_TRACE_BUFFER_MAX,
MPI_DEBUG_TRACE_IB_IOMB_SIZE,
MPI_DEBUG_TRACE_OB_IOMB_SIZE ));
si_memset(&obTraceData, 0, sizeof(obTraceData));
si_memset(&ibTraceData, 0, sizeof(ibTraceData));
}
void mpiTraceAdd( bit32 q,bit32 pici,bit32 ib, void *iomb, bit32 numBytes)
{
bit32 curIdx;
mpiDebugIbTraceEntry_t *curIbTrace;
mpiDebugObTraceEntry_t *curObTrace;
mpiDebugIbTrace_t * ibTrace = &ibTraceData;
mpiDebugObTrace_t * obTrace = &obTraceData;
if (ib)
{
if(ibTrace->Idx >= MPI_DEBUG_TRACE_BUFFER_MAX)
{
ibTrace->Idx = 0;
}
curIdx = ibTrace->Idx;
curIbTrace = &ibTrace->Data[curIdx];
curIbTrace->pEntry = iomb;
curIbTrace->QNum = q;
curIbTrace->pici = pici;
#ifdef OSLAYER_USE_HI_RES_TIMER
#ifdef SA_64BIT_TIMESTAMP
curIbTrace->Time = ossaTimeStamp64(agNULL);
#else
curIbTrace->Time = ossaTimeStamp(agNULL);
#endif
#else
curIbTrace->Time = 0;
#endif
si_memcpy(curIbTrace->Iomb, iomb, MIN(numBytes, MPI_DEBUG_TRACE_IB_IOMB_SIZE));
ibTrace->Idx++;
}
else
{
if(obTrace->Idx >= MPI_DEBUG_TRACE_BUFFER_MAX )
{
obTrace->Idx = 0;
}
curIdx = obTrace->Idx;
curObTrace = &obTrace->Data[curIdx];
curObTrace->pEntry = iomb;
curObTrace->QNum = q;
curObTrace->pici = pici;
#ifdef OSLAYER_USE_HI_RES_TIMER
#ifdef SA_64BIT_TIMESTAMP
curObTrace->Time = ossaTimeStamp64(agNULL);
#else
curObTrace->Time = ossaTimeStamp(agNULL);
#endif
#else
curObTrace->Time = 0;
#endif
si_memcpy(curObTrace->Iomb, iomb, MIN(numBytes, MPI_DEBUG_TRACE_OB_IOMB_SIZE));
obTrace->Idx++;
}
return;
}
#endif
#ifdef SA_ENABLE_TRACE_FUNCTIONS
void siEnableTracing (agsaRoot_t *agRoot)
{
agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
agsaSwConfig_t *swC = &saRoot->swConfig;
bit32 count;
OS_ASSERT(saRoot != NULL, "");
if( saRoot->TraceBlockReInit != 0)
{
return;
}
for (count = 0; count < 10; count++)
{
saRoot->traceBuffLookup[count] = (bit8)('0' + count);
}
for (count = 0; count < 6; count++)
{
saRoot->traceBuffLookup[(bitptr)count + 10] = (bit8)('a' + count);
}
saRoot->TraceDestination = swC->TraceDestination;
saRoot->TraceMask = swC->TraceMask;
saRoot->CurrentTraceIndexWrapCount = 0;
saRoot->CurrentTraceIndex = 0;
saRoot->TraceBlockReInit = 1;
SA_DBG1(("siEnableTracing: \n" ));
SA_DBG1 ((" length = %08x\n", saRoot->TraceBufferLength ));
SA_DBG1 ((" virt = %p\n", saRoot->TraceBuffer ));
SA_DBG1 ((" traceMask = %08x @ %p\n", saRoot->TraceMask, &saRoot->TraceMask));
SA_DBG1 ((" last trace entry @ %p\n", &saRoot->CurrentTraceIndex));
SA_DBG1 ((" TraceWrapAround = %x\n", saRoot->TraceMask & hpDBG_TraceBufferWrapAround ? 1 : 0));
SA_DBG1 ((" da %p l %x\n",saRoot->TraceBuffer ,saRoot->TraceBufferLength));
#ifdef SA_PRINTOUT_IN_WINDBG
#ifndef DBG
DbgPrint("siTraceEnable: \n" );
DbgPrint(" length = %08x\n", saRoot->TraceBufferLength );
DbgPrint(" virt = %p\n", saRoot->TraceBuffer );
DbgPrint(" last trace entry @ %p\n", &saRoot->CurrentTraceIndex);
DbgPrint(" traceMask = %08x @ %p\n", saRoot->TraceMask, &saRoot->TraceMask);
DbgPrint(" da %p l %x\n",saRoot->TraceBuffer ,saRoot->TraceBufferLength);
#endif
#endif
for (count = 0; count < saRoot->TraceBufferLength; count++)
{
saRoot->TraceBuffer[count] = (bit8)' ';
}
}
#define IF_DO_TRACE \
if ( (saRoot != NULL) && \
(saRoot->TraceDestination & siTraceDestMask) && \
(mask & saRoot->TraceMask) ) \
#define TRACE_ENTER_LOCK
#define TRACE_LEAVE_LOCK
#define BUFFER_WRAP_CHECK \
if( (saRoot->CurrentTraceIndex + TMP_TRACE_BUFF_SIZE) \
>= saRoot->TraceBufferLength ) \
{ \
\
if( saRoot->TraceMask & hpDBG_TraceBufferWrapAround ) \
{ \
\
for( i = saRoot->CurrentTraceIndex; \
i < saRoot->TraceBufferLength; i++ ) \
{ \
saRoot->TraceBuffer[i] = (bit8)' '; \
} \
\
saRoot->CurrentTraceIndex = 0; \
saRoot->CurrentTraceIndexWrapCount++; \
} \
else \
{ \
\
return; \
} \
}
#define LOCAL_OS_LOG_DEBUG_STRING(H,S) \
osLogDebugString(H,hpDBG_ALWAYS,(char *)(S))
#define copyHex(bit32Val, bitSize) \
{ \
bit32 nibbleLen = bitSize / 4; \
bit32 scratch = 0; \
for( i = 0; i < nibbleLen; i++ ) \
{ \
bPtr[pos++] = \
saRoot->traceBuffLookup[0xf & (bit32Val >> ((bitSize - 4) - (i << 2)))]; \
i++; \
bPtr[pos++] = \
saRoot->traceBuffLookup[0xf & (bit32Val >> ((bitSize - 4) - (i << 2)))]; \
\
if( !scratch \
&& (bPtr[pos-2] == '0') \
&& (bPtr[pos-1] == '0') ) \
{ \
pos -= 2; \
continue; \
} \
else \
{ \
scratch = 1; \
} \
} \
if( scratch == 0 ) \
{ \
\
\
bPtr[pos++] = '0'; \
bPtr[pos++] = '0'; \
} \
}
#define TRACE_OTHER_DEST \
{ \
bit32 bitptrscratch; \
if( saRoot->TraceDestination & smTraceDestDebugger ) \
{ \
bPtr[pos++] = (bit8)'\n'; \
bPtr[pos++] = (bit8)0; \
LOCAL_OS_LOG_DEBUG_STRING(hpRoot, (char *)bPtr); \
} \
if( saRoot->TraceDestination & smTraceDestRegister ) \
{ \
while( (pos & 0x3) != 0x3 ) \
{ \
bPtr[pos++] = (bit8)' '; \
} \
bPtr[pos] = ' '; \
for( i = 0; i < pos; i = i + 4 ) \
{ \
bitptrscratch = bPtr[i+0]; \
bitptrscratch <<= 8; \
bitptrscratch |= bPtr[i+1]; \
bitptrscratch <<= 8; \
bitptrscratch |= bPtr[i+2]; \
bitptrscratch <<= 8; \
bitptrscratch |= bPtr[i+3]; \
osChipRegWrite(hpRoot, \
FC_rFMReceivedALPA, (bit32)bitptrscratch ); \
} \
} \
}
GLOBAL bit32 siGetCurrentTraceIndex(agsaRoot_t *agRoot)
{
agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
return(saRoot->CurrentTraceIndex);
}
GLOBAL void siResetTraceBuffer(agsaRoot_t *agRoot)
{
bit32 count;
agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
saRoot->CurrentTraceIndex = 0;
for ( count = 0; count < saRoot->TraceBufferLength; count++ )
{
saRoot->TraceBuffer[count] = (bit8)' ';
}
}
#define TMP_TRACE_BUFF_SIZE 32
GLOBAL void siTraceFuncEnter( agsaRoot_t *agRoot,
bit32 mask,
bit32 fileid,
char * funcid)
{
agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
bitptr i;
bit8 tmpB[TMP_TRACE_BUFF_SIZE];
bit8 *bPtr;
bit8 pos = 0;
IF_DO_TRACE
{
TRACE_ENTER_LOCK
if ( saRoot->TraceDestination & smTraceDestBuffer )
{
BUFFER_WRAP_CHECK
bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
}
else
{
bPtr = tmpB;
}
bPtr[pos++] = (bit8)'[';
#ifndef FC_DO_NOT_INCLUDE_FILE_NAME_TAGS_IN_ENTER_EXIT_TRACE
bPtr[pos++] = (bit8)fileid;
#endif
for ( i=0; i<4; i++ )
{
if ( funcid[i] == 0 )
{
break;
}
bPtr[pos++] = (bit8)funcid[i];
}
bPtr[pos++] = ' ';
if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
{
bPtr[pos++] = '\r';
bPtr[pos++] = '\n';
saRoot->traceLineFeedCnt = 0;
}
saRoot->CurrentTraceIndex += pos;
TRACE_LEAVE_LOCK
}
return;
}
GLOBAL void siTraceFuncExit( agsaRoot_t *agRoot, bit32 mask, char fileid, char * funcid, char exitId )
{
bitptr i;
bit8 tmpB[TMP_TRACE_BUFF_SIZE];
bit8 *bPtr;
bit8 pos = 0;
agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
IF_DO_TRACE
{
TRACE_ENTER_LOCK
if ( saRoot->TraceDestination & smTraceDestBuffer )
{
BUFFER_WRAP_CHECK
bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
}
else
{
bPtr = tmpB;
}
#ifndef FC_DO_NOT_INCLUDE_FILE_NAME_TAGS_IN_ENTER_EXIT_TRACE
bPtr[pos++] = (bit8)fileid;
#endif
for ( i=0; i<4; i++ )
{
if ( funcid[i] == 0 )
{
break;
}
bPtr[pos++] = (bit8)funcid[i];
}
bPtr[pos++] = (bit8)exitId;
bPtr[pos++] = (bit8)']';
bPtr[pos++] = (bit8)' ';
if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
{
bPtr[pos++] = '\r';
bPtr[pos++] = '\n';
saRoot->traceLineFeedCnt = 0;
}
saRoot->CurrentTraceIndex += pos;
TRACE_LEAVE_LOCK
}
return;
}
GLOBAL void siTraceListRemove(agsaRoot_t *agRoot,
bit32 mask,
char listId,
bitptr exchangeId)
{
agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
bitptr i;
bit8 tmpB[TMP_TRACE_BUFF_SIZE];
bit8 *bPtr;
bit8 pos = 0;
IF_DO_TRACE
{
TRACE_ENTER_LOCK
if ( saRoot->TraceDestination & smTraceDestBuffer )
{
BUFFER_WRAP_CHECK
bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
}
else
{
bPtr = tmpB;
}
bPtr[pos++] = (bit8)'<';
bPtr[pos++] = (bit8)listId;
copyHex(exchangeId, 32);
bPtr[pos++] = (bit8)' ';
if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
{
bPtr[pos++] = '\r';
bPtr[pos++] = '\n';
saRoot->traceLineFeedCnt = 0;
}
saRoot->CurrentTraceIndex += pos;
TRACE_LEAVE_LOCK
}
return;
}
GLOBAL void siTraceListAdd(agsaRoot_t *agRoot,
bit32 mask,
char listId,
bitptr exchangeId)
{
agsaLLRoot_t *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
bitptr i;
bit8 tmpB[TMP_TRACE_BUFF_SIZE];
bit8 *bPtr;
bit8 pos = 0;
IF_DO_TRACE
{
if ( saRoot->TraceDestination & smTraceDestBuffer )
{
BUFFER_WRAP_CHECK
bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
}
else
{
bPtr = tmpB;
}
bPtr[pos++] = (bit8)'>';
bPtr[pos++] = (bit8)listId;
copyHex(exchangeId, 32);
bPtr[pos++] = (bit8)' ';
if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
{
bPtr[pos++] = '\r';
bPtr[pos++] = '\n';
saRoot->traceLineFeedCnt = 0;
}
saRoot->CurrentTraceIndex += pos;
}
return;
}
GLOBAL void siTrace64(agsaRoot_t *agRoot,
bit32 mask,
char * uId,
bit64 value,
bit32 dataSizeInBits)
{
agsaLLRoot_t *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
bitptr i;
bit8 tmpB[TMP_TRACE_BUFF_SIZE];
bit8 *bPtr;
bit8 pos = 0;
IF_DO_TRACE
{
if ( saRoot->TraceDestination & smTraceDestBuffer )
{
BUFFER_WRAP_CHECK
bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
}
else
{
bPtr = tmpB;
}
bPtr[pos++] = (bit8)'"';
bPtr[pos++] = (bit8)uId[0];
bPtr[pos++] = (bit8)uId[1];
bPtr[pos++] = (bit8)':';
copyHex(value, dataSizeInBits);
bPtr[pos++] = (bit8)' ';
if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
{
bPtr[pos++] = '\r';
bPtr[pos++] = '\n';
saRoot->traceLineFeedCnt = 0;
}
saRoot->CurrentTraceIndex += pos;
}
return;
}
GLOBAL void siTrace( agsaRoot_t *agRoot,
bit32 mask,
char * uId,
bit32 value,
bit32 dataSizeInBits)
{
agsaLLRoot_t *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
bitptr i;
bit8 tmpB[TMP_TRACE_BUFF_SIZE];
bit8 *bPtr;
bit8 pos = 0;
IF_DO_TRACE
{
if ( saRoot->TraceDestination & smTraceDestBuffer )
{
BUFFER_WRAP_CHECK
bPtr = &saRoot->TraceBuffer[saRoot->CurrentTraceIndex];
}
else
{
bPtr = tmpB;
}
bPtr[pos++] = (bit8)'"';
bPtr[pos++] = (bit8)uId[0];
bPtr[pos++] = (bit8)uId[1];
bPtr[pos++] = (bit8)':';
copyHex(value, dataSizeInBits);
bPtr[pos++] = (bit8)' ';
if ( saRoot->traceLineFeedCnt > FC_TRACE_LINE_SIZE )
{
bPtr[pos++] = '\r';
bPtr[pos++] = '\n';
saRoot->traceLineFeedCnt = 0;
}
saRoot->CurrentTraceIndex += pos;
}
return;
}
GLOBAL void siTraceGetInfo(agsaRoot_t *agRoot, hpTraceBufferParms_t * pBParms)
{
agsaLLRoot_t *saRoot = (agsaLLRoot_t *)agRoot->sdkData;
pBParms->TraceCompiled = TRUE;
pBParms->TraceWrap = saRoot->TraceMask & 0x80000000;
pBParms->CurrentTraceIndexWrapCount = saRoot->CurrentTraceIndexWrapCount;
pBParms->BufferSize = saRoot->TraceBufferLength;
pBParms->CurrentIndex = saRoot->CurrentTraceIndex;
pBParms->pTrace = saRoot->TraceBuffer;
pBParms->pTraceIndexWrapCount = &saRoot->CurrentTraceIndexWrapCount;
pBParms->pTraceMask = &saRoot->TraceMask;
pBParms->pCurrentTraceIndex = &saRoot->CurrentTraceIndex;
}
GLOBAL void siTraceSetMask(agsaRoot_t *agRoot, bit32 TraceMask )
{
agsaLLRoot_t *saRoot = (agsaLLRoot_t *)agRoot->sdkData;
saRoot->TraceMask = TraceMask;
}
#endif