summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/common/ipc_func_ids.h1
-rwxr-xr-xsrc/occ_405/main.c31
-rw-r--r--src/occ_gpe0/firdata/firData.c154
-rw-r--r--src/occ_gpe0/firdata/fir_data_collect.c2
-rw-r--r--src/occ_gpe0/firdata/homerData_common.h1
-rw-r--r--src/occ_gpe0/firdata/native.c4
-rw-r--r--src/occ_gpe0/firdata/pnorData_common.h2
-rw-r--r--src/occ_gpe0/firdata/scom_util.c83
-rw-r--r--src/occ_gpe0/gpe_util.c30
-rw-r--r--src/occ_gpe0/ipc_func_tables.c3
-rw-r--r--src/ppe/pk/ppe42/pkppe42files.mk1
-rw-r--r--src/ppe/pk/ppe42/ppe42_string.c345
-rw-r--r--src/ppe/pk/ppe42/ppe42_string.h67
-rw-r--r--src/ppe/pk/trace/pk_trace.h2
14 files changed, 614 insertions, 112 deletions
diff --git a/src/common/ipc_func_ids.h b/src/common/ipc_func_ids.h
index ef0ae31..40842be 100644
--- a/src/common/ipc_func_ids.h
+++ b/src/common/ipc_func_ids.h
@@ -59,6 +59,7 @@ IPC_FUNCIDS_TABLE_START
IPC_FUNC_ID(IPC_ST_SCOM_OPERATION)
IPC_FUNC_ID(IPC_ST_GPE0_NOP)
IPC_FUNC_ID(IPC_ST_GET_NEST_DTS_FUNCID)
+ IPC_FUNC_ID(IPC_ST_FIR_COLLECTION)
IPC_FUNCIDS_ST_END(OCCHW_INST_ID_GPE0)
//Functions that are only supported by GPE1 should be defined here
diff --git a/src/occ_405/main.c b/src/occ_405/main.c
index 9ebccc5..0298ab4 100755
--- a/src/occ_405/main.c
+++ b/src/occ_405/main.c
@@ -152,6 +152,9 @@ SSX_IRQ_FAST2FULL(pmc_hw_error_fast, pmc_hw_error_isr);
FIR_HEAP_BUFFER(uint8_t G_fir_heap[FIR_HEAP_SECTION_SIZE]);
FIR_PARMS_BUFFER(uint8_t G_fir_data_parms[FIR_PARMS_SECTION_SIZE]);
uint32_t G_fir_master = FIR_OCC_NOT_FIR_MASTER;
+bool G_fir_collection_request_created = FALSE;
+GPE_BUFFER(ipc_scom_op_t G_scom_op);
+GpeRequest G_fir_collection_request;
/*
* Function Specification
@@ -1687,6 +1690,8 @@ void Main_thread_routine(void *private)
dcache_flush(g_trac_err_buffer, TRACE_BUFFER_SIZE);
static bool L_fir_collection_completed = FALSE;
+ uint32_t l_rc = 0;
+
// Look for FIR collection flag and status
if (G_fir_collection_required && !L_fir_collection_completed)
{
@@ -1695,12 +1700,29 @@ void Main_thread_routine(void *private)
// FIR collection
if (OCC_IS_FIR_MASTER())
{
-// fir_data_collect();
- L_fir_collection_completed = TRUE;
+ //Need to schedule a task on GPE to start fir collection
+ if(!G_fir_collection_request_created) //Only need to create request once
+ {
+ TRAC_IMP("fir data collection: creating gpe request");
+ l_rc = gpe_request_create(&G_fir_collection_request,//Request
+ &G_async_gpe_queue0, //Queue
+ IPC_ST_FIR_COLLECTION, //Function ID
+ NULL, //GPE arguments
+ SSX_SECONDS(5), //Timeout
+ NULL, //Callback function
+ NULL, //Callback args
+ ASYNC_REQUEST_BLOCKING); //Options
+ if(l_rc == 0)
+ {
+ G_fir_collection_request_created = TRUE;
+ TRAC_IMP("fir data collection: scheduling gpe request");
+ gpe_request_schedule(&G_fir_collection_request);
+ L_fir_collection_completed = TRUE;
+ G_fir_collection_required = FALSE;
+ }
+ }
}
- TRAC_IMP("fir data collection done");
- G_fir_collection_required = FALSE;
// Error reporting is skipped while FIR collection is required so we
// don't get reset in flight. If anyone is listening send the
// error alert now.
@@ -1710,6 +1732,7 @@ void Main_thread_routine(void *private)
{
notify_host(INTR_REASON_HTMGT_SERVICE_REQUIRED);
}
+ TRAC_IMP("fir data collection done");
}
if( l_ssxrc == SSX_OK)
diff --git a/src/occ_gpe0/firdata/firData.c b/src/occ_gpe0/firdata/firData.c
index f124ad3..04ae81d 100644
--- a/src/occ_gpe0/firdata/firData.c
+++ b/src/occ_gpe0/firdata/firData.c
@@ -81,6 +81,7 @@ typedef struct
} FirData_existBits_t;
+
/* Uncomment for additional debug traces */
#if 0
#define DEBUG_PRD_CHKSTOP_ANALYSIS
@@ -98,7 +99,6 @@ bool FirData_addDataToPnor( FirData_t * io_fd, void * i_data,
uint32_t i_dataSize )
{
bool full = (io_fd->maxPBufSize < io_fd->pBufSize + i_dataSize);
-
if ( full )
{
/* Indicate the PNOR data is full. */
@@ -107,7 +107,13 @@ bool FirData_addDataToPnor( FirData_t * io_fd, void * i_data,
else
{
/* Copy data to PNOR buffer. */
- memcpy( &io_fd->pBuf[io_fd->pBufSize], i_data, i_dataSize );
+ uint8_t* l_destPtr = (uint8_t*)(&io_fd->pBuf[io_fd->pBufSize]);
+ uint8_t* l_srcPtr = (uint8_t*)(i_data);
+ int i;
+ for (i = 0; i < i_dataSize; i++)
+ {
+ l_destPtr[i] = l_srcPtr[i];
+ }
io_fd->pBufSize += i_dataSize;
}
@@ -132,12 +138,17 @@ bool FirData_addRegToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
bool full = false;
int32_t rc = 0;
- PNOR_Reg_t reg = { i_addr, 0 };
+ PNOR_Reg_t reg = { 0, i_addr };
*o_nonZero = false;
do
{
+#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
+ TRAC_ERR( "[FirData_addRegToPnor] t=0x%x p=0x%x u=0x%x scom addr=0x%08x",
+ (uint32_t)i_sTrgt.type, (uint32_t)i_sTrgt.procPos,
+ (uint32_t)i_sTrgt.procUnitPos, (uint32_t)i_addr);
+#endif
rc = SCOM_getScom( i_sTrgt, i_addr, &(reg.val) );
if ( SUCCESS != rc )
{
@@ -152,8 +163,14 @@ bool FirData_addRegToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
break;
}
+
if ( 0 == reg.val ) break; // Skip zero value registers.
+#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
+ TRAC_IMP("addRegToPnor: got scom value, addr=0x%08X value=0x%08X %08X",
+ i_addr, (uint32_t)(reg.val>>32), reg.val);
+#endif
+
full = FirData_addDataToPnor( io_fd, &reg, sizeof(reg) );
if ( full ) break;
@@ -165,9 +182,7 @@ bool FirData_addRegToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
} while (0);
#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
- TRAC_INFO(" addToPnor: Type:%d Pos:%d Unit:%d Addr:%X Full:%d",
- i_sTrgt.type, i_sTrgt.procPos, i_sTrgt.procUnitPos,
- i_addr, full );
+ TRAC_IMP(" FirData_addRegToPnor completed for some target ");
#endif
return full;
@@ -198,6 +213,11 @@ bool FirData_addIdRegToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
do
{
+#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
+ TRAC_ERR( "[FirData_addIdRegToPnor] t=0x%x p=0x%x u=0x%x scom addr=0x%08x",
+ (uint32_t)i_sTrgt.type, (uint32_t)i_sTrgt.procPos,
+ (uint32_t)i_sTrgt.procUnitPos, (uint32_t)i_addr);
+#endif
rc = SCOM_getIdScom( i_sTrgt, i_addr, &(reg.val) );
if ( SUCCESS != rc )
{
@@ -206,8 +226,14 @@ bool FirData_addIdRegToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
break;
}
+
if ( 0 == reg.val ) break; // Skip zero value registers.
+#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
+ TRAC_IMP("addRegToPnor: got scom value, addr=0x%08X %08X value=0x%08X",
+ (uint32_t)(i_addr>>32), i_addr, (uint32_t)reg.val);
+#endif
+
full = FirData_addDataToPnor( io_fd, &reg, sizeof(reg) );
if ( full ) break;
@@ -264,6 +290,7 @@ bool FirData_addGlblsToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
full = FirData_addRegToPnor( io_fd, io_pTrgt, i_sTrgt, addr,
&nonZero );
+
if ( full ) break;
if ( nonZero ) l_isAnyNonZero = true;
@@ -281,12 +308,12 @@ bool FirData_addGlblsToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
for ( i = 0; i < cnt; i++ )
{
#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
- TRAC_INFO(" addGlblsToPnor In/Array: chipType:%X::%X trgType:%X::%X"
- " regType:%X::%X ecLevel %X::%X",
- i_chipStruct->chipType, l_ecAddrtPtr->chipType,
- t, l_ecAddrtPtr->trgtType,
- REG_GLBL, l_ecAddrtPtr->regType,
- i_chipStruct->chipEcLevel, l_ecAddrtPtr->ddLevel );
+ TRAC_IMP(" addGlblsToPnor In/Array: chipType:%X::%X trgType:%X::%X",
+ (uint32_t)i_chipStruct->chipType, (uint32_t)l_ecAddrtPtr->chipType,
+ (uint32_t)t, (uint32_t)l_ecAddrtPtr->trgtType);
+ TRAC_IMP("addGlblsToPnor: regType:%X::%X ecLevel %X::%X",
+ (uint32_t)REG_GLBL, (uint32_t)l_ecAddrtPtr->regType,
+ (uint32_t)i_chipStruct->chipEcLevel, (uint32_t)l_ecAddrtPtr->ddLevel);
#endif
/** Need same chipType (nimbus,cumulus,etc..), same target type, */
@@ -393,12 +420,12 @@ bool FirData_addFirsToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
for ( i = 0; i < cnt; i++ )
{
#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
- TRAC_INFO(" addFirsToPnor In/Array: chipType:%X::%X trgType:%X::%X"
- " regType:%X::%X ecLevel %X::%X",
- i_chipStruct->chipType, l_ecAddrtPtr->chipType,
- t, l_ecAddrtPtr->trgtType,
- REG_GLBL, l_ecAddrtPtr->regType,
- i_chipStruct->chipEcLevel, l_ecAddrtPtr->ddLevel );
+ TRAC_IMP(" addFirsToPnor In/Array: chipType:%X::%X trgType:%X::%X",
+ (uint32_t)i_chipStruct->chipType, (uint32_t)l_ecAddrtPtr->chipType,
+ (uint32_t)t, (uint32_t)l_ecAddrtPtr->trgtType);
+ TRAC_IMP("regType:%X::%X ecLevel %X::%X",
+ (uint32_t)REG_FIR, (uint32_t)l_ecAddrtPtr->regType,
+ (uint32_t)i_chipStruct->chipEcLevel, (uint32_t)l_ecAddrtPtr->ddLevel);
#endif
/** Need same chipType (nimbus,cumulus,etc..), same target type, */
@@ -408,6 +435,7 @@ bool FirData_addFirsToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
(l_ecAddrtPtr->regType == REG_FIR) &&
(l_ecAddrtPtr->ddLevel == i_chipStruct->chipEcLevel)
)
+
{ /* address is right justified in 64 bits */
addr = (uint32_t)(l_ecAddrtPtr->address);
nonZero = false;
@@ -487,10 +515,10 @@ bool FirData_addRegsToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
for ( i = 0; i < cnt; i++ )
{
#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
- TRAC_INFO(" addRegsToPnor In/Array: chipType:%X::%X trgType:%X::%X"
- " regType:%X::%X ecLevel %X::%X",
+ TRAC_IMP(" addRegsToPnor In/Array: chipType:%X::%X trgType:%X::%X",
i_chipStruct->chipType, l_ecAddrtPtr->chipType,
- t, l_ecAddrtPtr->trgtType,
+ t, l_ecAddrtPtr->trgtType);
+ TRAC_IMP(" regType:%X::%X ecLevel %X::%X",
REG_GLBL, l_ecAddrtPtr->regType,
i_chipStruct->chipEcLevel, l_ecAddrtPtr->ddLevel );
#endif
@@ -584,10 +612,10 @@ bool FirData_addIdFirsToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
for ( i = 0; i < cnt; i++ )
{
#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
- TRAC_INFO(" addIdFirsToPnor In/Array: chipType:%X::%X trgType:%X::%X"
- " regType:%X::%X ecLevel %X::%X",
+ TRAC_IMP(" addIdFirsToPnor In/Array: chipType:%X::%X trgType:%X::%X",
i_chipStruct->chipType, l_ecAddrtPtr->chipType,
- t, l_ecAddrtPtr->trgtType,
+ t, l_ecAddrtPtr->trgtType);
+ TRAC_IMP(" regType:%X::%X ecLevel %X::%X",
REG_GLBL, l_ecAddrtPtr->regType,
i_chipStruct->chipEcLevel, l_ecAddrtPtr->ddLevel );
#endif
@@ -680,10 +708,10 @@ bool FirData_addIdRegsToPnor( FirData_t * io_fd, PNOR_Trgt_t * io_pTrgt,
for ( i = 0; i < cnt; i++ )
{
#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
- TRAC_IMP(" addIdRegsToPnor In/Array: chipType:%X::%X trgType:%X::%X"
- " regType:%X::%X ecLevel %X::%X",
+ TRAC_IMP(" addIdRegsToPnor In/Array: chipType:%X::%X trgType:%X::%X",
i_chipStruct->chipType, l_ecAddrtPtr->chipType,
- t, l_ecAddrtPtr->trgtType,
+ t, l_ecAddrtPtr->trgtType);
+ TRAC_IMP(" regType:%X::%X ecLevel %X::%X",
REG_GLBL, l_ecAddrtPtr->regType,
i_chipStruct->chipEcLevel, l_ecAddrtPtr->ddLevel );
#endif
@@ -728,11 +756,17 @@ bool FirData_addTrgtToPnor( FirData_t * io_fd, SCOM_Trgt_t i_sTrgt,
bool * o_noAttn, HOMER_Chip_t *i_chipStruct )
{
bool full = false;
-
PNOR_Trgt_t * pTrgt = (PNOR_Trgt_t *)(&io_fd->pBuf[io_fd->pBufSize]);
- PNOR_Trgt_t tmp_pTrgt = PNOR_getTrgt( i_sTrgt.type, i_sTrgt.procPos,
- i_sTrgt.procUnitPos );
+
+ /* may be able to remove PNOR_getTrgt function */
+ /* had some issue with local var return in diff function so take out */
+ /* init to zero */
+ PNOR_Trgt_t tmp_pTrgt; memset( &tmp_pTrgt, 0x00, sizeof(tmp_pTrgt) );
+
+ tmp_pTrgt.trgtType = i_sTrgt.type;
+ tmp_pTrgt.chipPos = i_sTrgt.procPos,
+ tmp_pTrgt.unitPos = i_sTrgt.procUnitPos;
*o_noAttn = false; /* Must be false if there are no global regs. */
@@ -743,6 +777,7 @@ bool FirData_addTrgtToPnor( FirData_t * io_fd, SCOM_Trgt_t i_sTrgt,
{
/* Add the target info to PNOR. */
full = FirData_addDataToPnor( io_fd, &tmp_pTrgt, sizeof(tmp_pTrgt) );
+
if ( full ) break;
/* Update the number of targets in the PNOR data. */
@@ -804,15 +839,13 @@ void FirData_addTrgtsToPnor( FirData_t * io_fd )
memset(&l_existBits, 0x00, sizeof(FirData_existBits_t) );
/* Point past HOMER header to first chiplet info */
- /* The HOMER_Data_t struct may have some padding added after the struct
- * to ensure the HOMER_Chip_t structs are 4-byte word aligned. */
+ /* The HOMER_Data_t struct may have some padding added after the struct */
+ /* to ensure the HOMER_Chip_t structs are 4-byte word aligned. */
uint32_t sz_word = sizeof(uint32_t);
uint32_t pad = (sz_word - (sizeof(HOMER_Data_t) % sz_word)) % sz_word;
uint8_t *l_bytePtr = io_fd->hBuf + sizeof(HOMER_Data_t) + pad;
HOMER_Chip_t *l_chipPtr = NULL;
- TRAC_IMP("AddTgtsMain:numChips:%d", (uint32_t)io_fd->hData->chipCount);
-
/* Iterate ALL CHIPs */
for ( p = 0; p < io_fd->hData->chipCount; p++ )
{
@@ -822,9 +855,6 @@ void FirData_addTrgtsToPnor( FirData_t * io_fd )
fsi = l_chipPtr->fsiBaseAddr;
p = l_chipPtr->chipPos;
- TRAC_IMP( " AddTgtsMain:ChipType:%d ChipNumber:%d",
- l_chipPtr->chipType, p );
-
/* Is this a PROC or Centaur chip ? */
if ( (HOMER_CHIP_NIMBUS == l_chipPtr->chipType) ||
(HOMER_CHIP_CUMULUS == l_chipPtr->chipType) )
@@ -907,13 +937,18 @@ void FirData_addTrgtsToPnor( FirData_t * io_fd )
l_bytePtr += sizeof(HOMER_ChipCumulus_t);
} /* else if cumulus */
-// TRAC_IMP("Masks XBUS:%X OBUS:%X EC:%X EQ:%X EX:%X CAPP:%X PEC:%X PHB:%X",
-// (uint32_t)l_existBits.xbusMask, (uint32_t)l_existBits.obusMask, (uint32_t)l_existBits.ecMask,
-// (uint32_t)l_existBits.eqMask, (uint32_t)l_existBits.exMask, (uint32_t)l_existBits.cappMask,
-// (uint32_t)l_existBits.pecMask, (uint32_t)l_existBits.phbMask);
-// TRAC_IMP("Masks MCBIST:%X MCS:%X MCA:%X",
-// (uint32_t)l_existBits.mcbist_mc_Mask, (uint32_t) l_existBits.mcs_mi_Mask,
-// (uint32_t)l_existBits.mca_dmi_Mask);
+
+#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
+ TRAC_IMP(" Masks XBUS:%X OBUS:%X ",
+ l_existBits.xbusMask, l_existBits.obusMask);
+ TRAC_IMP(" Masks EC:%X EQ:%X EX:%X",
+ l_existBits.ecMask, l_existBits.eqMask, l_existBits.exMask);
+ TRAC_IMP(" Masks CAPP:%X PEC:%X PHB:%X",l_existBits.cappMask,
+ l_existBits.pecMask, l_existBits.phbMask );
+ TRAC_IMP(" Masks MCBIST:%X MCS:%X MCA:%X",
+ l_existBits.mcbist_mc_Mask, l_existBits.mcs_mi_Mask,
+ l_existBits.mca_dmi_Mask );
+#endif
/* Add this PROC to the PNOR. */
sTrgt = SCOM_Trgt_getTrgt(TRGT_PROC, p, 0, fsi, isM);
@@ -1124,7 +1159,7 @@ void FirData_addTrgtsToPnor( FirData_t * io_fd )
}
if ( full ) break;
-
+ break; //@TODO remove when 2 proc support is in place
} /* if processor chip type */
else if (HOMER_CHIP_CENTAUR == l_chipPtr->chipType)
{
@@ -1197,8 +1232,6 @@ int32_t FirData_init( FirData_t * io_fd,
uint8_t * reglist = NULL;
- PNOR_Data_t pData = PNOR_getData();
-
do
{
/* Init the struct. */
@@ -1235,6 +1268,10 @@ int32_t FirData_init( FirData_t * io_fd,
io_fd->maxPBufSize = sz_pnoNoEcc;
/* Initialize the PNOR header data. */
+ PNOR_Data_t pData;
+ memset( &pData, 0x00, sizeof(pData) ); /* init to zero */
+ pData.header = PNOR_FIR2;
+
full = FirData_addDataToPnor( io_fd, &pData, sizeof(pData) );
if ( full )
{
@@ -1262,8 +1299,8 @@ int32_t FirData_init( FirData_t * io_fd,
/* Homer buffer. */
if ( io_fd->maxHBufSize - sz_hData < curIdx )
{
- TRAC_ERR( FUNC"HOMER list size %d is larger than HOMER data "
- "buffer %d", (uint32_t)curIdx, (uint32_t)(io_fd->maxHBufSize - sz_hData ));
+ TRAC_ERR( "HOMER list size %d is larger than HOMER data buffer %d",
+ curIdx, (io_fd->maxHBufSize - sz_hData ));
rc = FAIL;
break;
}
@@ -1324,6 +1361,7 @@ int32_t FirData_init( FirData_t * io_fd,
} while (0);
+ TRAC_IMP("FirData_init done");
return rc;
@@ -1352,6 +1390,17 @@ int32_t FirData_captureCsFirData( uint8_t * i_hBuf, uint32_t i_hBufSize,
break;
}
+#ifdef DEBUG_PRD_CHKSTOP_ANALYSIS
+ TRAC_IMP("going to print all pointers from fd");
+ TRAC_IMP("hBuf:0x%08X, maxHbufSize:0x%08X, hData:0x%08X",
+ (uint32_t)(fd.hBuf), (uint32_t)(fd.maxHBufSize), (uint32_t)(fd.hData));
+ TRAC_IMP("pBuf:0x%08X, maxPBufSize:0x%08X, pData:0x%08X, pBufSize:0x%08X",
+ (uint32_t)(fd.pBuf), (uint32_t)(fd.maxPBufSize), (uint32_t)(fd.pData),
+ (uint32_t)(fd.pBufSize));
+ TRAC_IMP("hPtrs:0x%08X, ecDepRegs:0x%08X", (uint32_t)(fd.hPtrs),
+ (uint32_t)(fd.ecDepReg));
+#endif
+
/* Check for valid HOMER data. */
if ( HOMER_FIR2 != fd.hData->header )
{
@@ -1360,24 +1409,21 @@ int32_t FirData_captureCsFirData( uint8_t * i_hBuf, uint32_t i_hBufSize,
break; /* nothing to analyze. */
}
- /* Start adding register data to PNOR for each target. */
FirData_addTrgtsToPnor( &fd );
/* Write Buffer to PNOR */
-/* TODO: enable when function is supported.
- rc = PNOR_writeFirData( fd.hData->pnorInfo, fd.pBuf, fd.pBufSize );
+ //rc = PNOR_writeFirData( fd.hData->pnorInfo, fd.pBuf, fd.pBufSize );
if ( SUCCESS != rc )
{
TRAC_ERR( FUNC"Failed to process FIR data" );
break;
}
-*/
} while (0);
if ( SUCCESS != rc )
{
- TRAC_ERR( FUNC"Failed: i_hBuf=%08x, i_hBufSize=0x%08x, i_pBuf=%08x, "
+ TRAC_ERR( "Failed: i_hBuf=%p, i_hBufSize=0x%08x, i_pBuf=%p, "
"i_pBufSize=%08x", (uint32_t)i_hBuf, (uint32_t)i_hBufSize,
(uint32_t)i_pBuf, (uint32_t)i_pBufSize );
}
diff --git a/src/occ_gpe0/firdata/fir_data_collect.c b/src/occ_gpe0/firdata/fir_data_collect.c
index d4e1b5e..cf1de9d 100644
--- a/src/occ_gpe0/firdata/fir_data_collect.c
+++ b/src/occ_gpe0/firdata/fir_data_collect.c
@@ -48,7 +48,7 @@ void fir_data_collect(void)
// Homer data section and size
uint8_t *l_hBuf = (uint8_t*) G_gpe_shared_data->fir_params_buffer_ptr;
- uint32_t l_hBufSize = HOMER_FIR_PARM_SIZE;
+ uint32_t l_hBufSize = FIR_PARMS_SECTION_SIZE;
// PNOR working buffer in SRAM and size
uint8_t *l_pBuf = (uint8_t*) G_gpe_shared_data->fir_heap_buffer_ptr;
diff --git a/src/occ_gpe0/firdata/homerData_common.h b/src/occ_gpe0/firdata/homerData_common.h
index 66aa53a..23ee7ed 100644
--- a/src/occ_gpe0/firdata/homerData_common.h
+++ b/src/occ_gpe0/firdata/homerData_common.h
@@ -163,6 +163,7 @@ typedef struct __attribute__((packed))
/* NOTE: This structure is 4-byte word aligned. */
typedef struct __attribute__((packed))
{
+
uint32_t chipType : 4; /** See HOMER_ChipType_t. */
uint32_t trgtType : 6; /** See TrgtType_t. */
uint32_t regType : 4; /** See RegType_t. */
diff --git a/src/occ_gpe0/firdata/native.c b/src/occ_gpe0/firdata/native.c
index 0a57867..337c97b 100644
--- a/src/occ_gpe0/firdata/native.c
+++ b/src/occ_gpe0/firdata/native.c
@@ -42,7 +42,7 @@ int32_t xscom_read( uint32_t i_address, uint64_t * o_data )
//P9 SCOM logic requires a target. However, if we're here, then it doesn't
//matter which target we pass in, so long as isMaster is true. This will
//allow to take the branch of code that schedules GPE scom job. See
- //src/occ_405/firdata/scom_util.c for more info.
+ //src/occ_gpe0/firdata/scom_util.c for more info.
SCOM_Trgt_t l_tempTarget;
l_tempTarget.type = TRGT_PROC;
l_tempTarget.isMaster = TRUE;
@@ -64,7 +64,7 @@ int32_t xscom_write( uint32_t i_address, uint64_t i_data )
//P9 SCOM logic requires a target. However, if we're here, then it doesn't
//matter which target we pass in, so long as isMaster is true. This will
//allow to take the branch of code that schedules GPE scom job. See
- //src/occ_405/firdata/scom_util.c for more info.
+ //src/occ_gpe0/firdata/scom_util.c for more info.
SCOM_Trgt_t l_tempTarget;
l_tempTarget.type = TRGT_PROC;
l_tempTarget.isMaster = TRUE;
diff --git a/src/occ_gpe0/firdata/pnorData_common.h b/src/occ_gpe0/firdata/pnorData_common.h
index 3037e39..8ec238c 100644
--- a/src/occ_gpe0/firdata/pnorData_common.h
+++ b/src/occ_gpe0/firdata/pnorData_common.h
@@ -144,8 +144,8 @@ static inline PNOR_Trgt_t PNOR_getTrgt( uint32_t i_trgtType, uint32_t i_chipPos,
/* NOTE: This structure is 4-byte word aligned. */
typedef struct __attribute__((packed))
{
- uint32_t addr; /** 32-bit address */
uint64_t val; /** 64-bit value */
+ uint32_t addr; /** 32-bit address */
} PNOR_Reg_t;
diff --git a/src/occ_gpe0/firdata/scom_util.c b/src/occ_gpe0/firdata/scom_util.c
index 491c213..5f5656a 100644
--- a/src/occ_gpe0/firdata/scom_util.c
+++ b/src/occ_gpe0/firdata/scom_util.c
@@ -30,8 +30,7 @@
#include <scom_util.h>
#include "scom_addr_util.h"
#include <sbe_fifo.h>
-
-bool G_request_created = FALSE;
+#include <ppe42_scom.h>
enum {
/*FSI addresses are byte offsets, so need to multiply by 4
@@ -340,47 +339,6 @@ int32_t translate_addr( SCOM_Trgt_t i_trgt, uint64_t i_addr, uint64_t * o_addr )
}
/**
- * @brief Performs a getscom operation with no address translation.
- * @param i_chip Chip to SCOM.
- * @param i_addr Address to SCOM.
- * @param o_val Returned value.
- * @return Non-SUCCESS if an internal function fails. SUCCESS otherwise.
- */
-int32_t getscomraw( SCOM_Trgt_t i_chip, uint32_t i_addr, uint64_t * o_val )
-{
- int32_t l_rc = SUCCESS;
-
- //Use SBE FIFO if it's a slave proc
- if(!i_chip.isMaster)
- {
- return getFifoScom(&i_chip, i_addr, o_val);
- }
- *o_val = 0;
- l_rc = FAIL;
-
- return l_rc;
-}
-
-/**
- * @brief Perform a putscom operation with no address translation.
- * @param i_chip Chip to SCOM.
- * @param i_addr Address to SCOM.
- * @param i_val Value to write.
- * @return Non-SUCCESS if an internal function fails. SUCCESS otherwise.
- */
-int32_t putscomraw( SCOM_Trgt_t i_chip, uint32_t i_addr, uint64_t i_val )
-{
- int32_t l_rc = SUCCESS;
-
- //Use SBE FIFO if it's a slave proc
- if(!i_chip.isMaster)
- {
- return putFifoScom(&i_chip, i_addr, i_val);
- }
- return l_rc;
-}
-
-/**
* @brief Executes standard getscom.
* @param i_trgt Chip to SCOM.
* @param i_addr Address to SCOM.
@@ -399,8 +357,15 @@ int32_t SCOM_getScom( SCOM_Trgt_t i_trgt, uint32_t i_addr, uint64_t * o_val )
rc = translate_addr( i_trgt, i_addr, &trans_addr );
if ( SUCCESS == rc )
{
- /* Do the SCOM. */
- rc = getscomraw( chip_targ, trans_addr, o_val );
+ //Use SBE FIFO if it's a slave proc
+ if(!chip_targ.isMaster)
+ {
+ return getFifoScom(&chip_targ, trans_addr, o_val);
+ }
+ else
+ {
+ rc = getscom_abs(trans_addr, o_val);
+ }
}
return rc;
@@ -447,7 +412,14 @@ int32_t SCOM_getIdScom( SCOM_Trgt_t i_trgt, uint64_t i_addr, uint32_t * o_val )
data_buffer |= 0x8000000000000000;
/* perform write before the read with the new */
- rc = putscomraw( i_trgt, phys_addr, data_buffer );
+ if(!chip_targ.isMaster)
+ {
+ rc = putFifoScom(&chip_targ, phys_addr, data_buffer);
+ }
+ else
+ {
+ rc = putscom_abs(phys_addr, data_buffer);
+ }
if ( SUCCESS != rc ) return rc;
// Loop on read until we see done, error, or we timeout
@@ -457,7 +429,15 @@ int32_t SCOM_getIdScom( SCOM_Trgt_t i_trgt, uint64_t i_addr, uint32_t * o_val )
{
/* Now perform the op requested using the passed in */
/* IO_Buffer to pass the read data back to caller. */
- rc = getscomraw( chip_targ, phys_addr, &(scomout.data64) );
+ //Use SBE FIFO if it's a slave proc
+ if(!chip_targ.isMaster)
+ {
+ rc = getFifoScom(&chip_targ, trans_addr, &(scomout.data64));
+ }
+ else
+ {
+ rc = getscom_abs(trans_addr, &(scomout.data64));
+ }
if ( SUCCESS != rc ) return rc;
/* Check for PIB error. */
@@ -512,7 +492,14 @@ int32_t SCOM_putScom( SCOM_Trgt_t i_trgt, uint32_t i_addr, uint64_t i_val )
if ( SUCCESS == l_rc )
{
/* Do the SCOM. */
- l_rc = putscomraw( l_chip_targ, l_trans_addr, i_val );
+ if(!l_chip_targ.isMaster)
+ {
+ return putFifoScom(&l_chip_targ, i_addr, i_val);
+ }
+ else
+ {
+ l_rc = putscom_abs(l_trans_addr, i_val);
+ }
}
return l_rc;
diff --git a/src/occ_gpe0/gpe_util.c b/src/occ_gpe0/gpe_util.c
index 61ee5e9..c97baa1 100644
--- a/src/occ_gpe0/gpe_util.c
+++ b/src/occ_gpe0/gpe_util.c
@@ -28,6 +28,9 @@
#include "pss_constants.h"
#include "gpe_util.h"
#include "gpe_export.h"
+#include <fir_data_collect.h>
+#include <scom_util.h>
+
#define SPIPSS_P2S_ONGOING_MASK 0x8000000000000000
/*
@@ -216,6 +219,33 @@ void ipc_scom_operation(ipc_msg_t* cmd, void* arg)
}
/*
+ * Function Specification
+ *
+ * Name: ipc_fir_collection
+ *
+ * Description: Does a getscom or putscom for the 405
+ *
+ * End Function Specification
+ */
+void ipc_fir_collection(ipc_msg_t* cmd, void* arg)
+{
+ int l_rc;
+ PK_TRACE("ipc_fir_collection: starting fir_data_collect");
+
+ fir_data_collect();
+
+ // send back a response, IPC success even if ffdc/rc are non zeros
+ l_rc = ipc_send_rsp(cmd, IPC_RC_SUCCESS);
+ if(l_rc)
+ {
+ PK_TRACE("ipc_fir_collection: Failed to send response back. Halting GPE0", l_rc);
+ pk_halt();
+ }
+
+ PK_TRACE("ipc_fir_collection: fir_data_collect finished");
+}
+
+/*
* Function Specification:
*
* Name: gpe0_nop
diff --git a/src/occ_gpe0/ipc_func_tables.c b/src/occ_gpe0/ipc_func_tables.c
index d5085ff..91644c5 100644
--- a/src/occ_gpe0/ipc_func_tables.c
+++ b/src/occ_gpe0/ipc_func_tables.c
@@ -36,6 +36,7 @@ void gpe_get_core_data(ipc_msg_t* cmd, void* arg);
void gpe_get_nest_dts(ipc_msg_t* cmd, void* arg);
void ipc_scom_operation(ipc_msg_t* cmd, void* arg);
+void ipc_fir_collection(ipc_msg_t* cmd, void* arg);
void gpe0_nop(ipc_msg_t* cmd, void* arg);
@@ -71,7 +72,7 @@ IPC_HANDLER(gpe_get_core_data, 0) // 6 - IPC_ST_GET_CORE_DATA_FUNCID
IPC_HANDLER(ipc_scom_operation, 0) // 7 - IPC_ST_SCOM_OPERATION
IPC_HANDLER(gpe0_nop, 0) // 8 - IPC_ST_GPE0_NOP
IPC_HANDLER(gpe_get_nest_dts, 0) // 9 - IPC_ST_GET_NEST_DTS_FUNCID
-IPC_HANDLER_DEFAULT // 10
+IPC_HANDLER(ipc_fir_collection, 0) // 10 - IPC_ST_FIR_COLLECTION
IPC_HANDLER_DEFAULT // 11
IPC_HANDLER_DEFAULT // 12
IPC_HANDLER_DEFAULT // 13
diff --git a/src/ppe/pk/ppe42/pkppe42files.mk b/src/ppe/pk/ppe42/pkppe42files.mk
index 1097f0f..55c5c4d 100644
--- a/src/ppe/pk/ppe42/pkppe42files.mk
+++ b/src/ppe/pk/ppe42/pkppe42files.mk
@@ -41,6 +41,7 @@ PPE42-C-SOURCES = ppe42_core.c \
ppe42_irq_core.c\
ppe42_gcc.c\
ppe42_scom.c\
+ ppe42_string.c\
eabi.c\
math.c
diff --git a/src/ppe/pk/ppe42/ppe42_string.c b/src/ppe/pk/ppe42/ppe42_string.c
new file mode 100644
index 0000000..1573b9f
--- /dev/null
+++ b/src/ppe/pk/ppe42/ppe42_string.c
@@ -0,0 +1,345 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: chips/p9/procedures/ppe/pk/ppe42/ppe42_string.c $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* EKB Project */
+/* */
+/* COPYRIGHT 2016 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+// Note: this code does not compile under the ppc2ppe backend.
+// It emits illegal ppe42 asm instructions.
+// __PPE42__ is set by the ppe42 compiler
+#ifdef __PPE42__
+
+#include <ppe42_string.h>
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+void* memset(void* vdest, int ch, size_t len)
+{
+ uint32_t addr = (uint32_t)vdest;
+
+ while(len && (addr & 0x7)) // not 8 byte aligned
+ {
+ uint8_t* p = (uint8_t*)addr;
+ *p = ch;
+ ++addr;
+ --len;
+ }
+
+ if(len >= sizeof(uint64_t))
+ {
+ uint64_t lch = ch & 0xff;
+ lch |= lch << 8;
+ lch |= lch << 16;
+ lch |= lch << 32;
+
+ while(len >= sizeof(uint64_t))
+ {
+ uint64_t* p = (uint64_t*)addr;
+ *p = lch;
+ len -= sizeof(uint64_t);
+ addr += sizeof(uint64_t);
+ }
+ }
+
+ while(len)
+ {
+ uint8_t* p = (uint8_t*)addr;
+ *p = ch;
+ ++addr;
+ --len;
+ }
+
+ return vdest;
+}
+
+
+void* memcpy(void* vdest, const void* vsrc, size_t len)
+{
+
+ // Loop, copying 4 bytes
+ long* ldest = (long*)vdest;
+ const long* lsrc = (const long*)vsrc;
+
+ while (len >= sizeof(long))
+ {
+ *ldest++ = *lsrc++;
+ len -= sizeof(long);
+ }
+
+ // Loop, copying 1 byte
+ char* cdest = (char*)ldest;
+ const char* csrc = (const char*)lsrc;
+ size_t i = 0;
+
+ for (; i < len; ++i)
+ {
+ cdest[i] = csrc[i];
+ }
+
+ return vdest;
+}
+
+void* memmove(void* vdest, const void* vsrc, size_t len)
+{
+ // Copy first-to-last
+ if (vdest <= vsrc)
+ {
+ return memcpy(vdest, vsrc, len);
+ }
+
+ // Copy last-to-first (TO_DO: optimize)
+ char* dest = (char*)(vdest);
+ const char* src = (const char*)(vsrc);
+ size_t i = len;
+
+ for (; i > 0;)
+ {
+ --i;
+ dest[i] = src[i];
+ }
+
+ return vdest;
+}
+
+int memcmp(const void* p1, const void* p2, size_t len)
+{
+ const char* c1 = (const char*)(p1);
+ const char* c2 = (const char*)(p2);
+
+ size_t i = 0;
+
+ for (; i < len; ++i)
+ {
+ long n = (long)(c1[i]) - (long)(c2[i]);
+
+ if (n != 0)
+ {
+ return n;
+ }
+ }
+
+ return 0;
+}
+
+void* memmem(const void* haystack, size_t haystacklen,
+ const void* needle, size_t needlelen)
+{
+ const void* result = NULL;
+
+ if (haystacklen >= needlelen)
+ {
+ const char* c_haystack = (const char*)(haystack);
+ const char* c_needle = (const char*)(needle);
+ bool match = false;
+
+ size_t i = 0;
+
+ for (; i <= (haystacklen - needlelen); i++)
+ {
+ match = true;
+
+ size_t j = 0;
+
+ for (; j < needlelen; j++)
+ {
+ if (*(c_haystack + i + j) != *(c_needle + j))
+ {
+ match = false;
+ break;
+ }
+ }
+
+ if (match)
+ {
+ result = (c_haystack + i);
+ break;
+ }
+ }
+ }
+
+ return (void*)(result);
+}
+
+
+char* strcpy(char* d, const char* s)
+{
+ char* d1 = d;
+
+ do
+ {
+ *d1 = *s;
+
+ if (*s == '\0')
+ {
+ return d;
+ }
+
+ d1++;
+ s++;
+ }
+ while(1);
+}
+
+char* strncpy(char* d, const char* s, size_t l)
+{
+ char* d1 = d;
+ size_t len = 0;
+
+ do
+ {
+ if (len++ >= l)
+ {
+ break;
+ }
+
+ *d1 = *s;
+
+ if (*s == '\0')
+ {
+ break;
+ }
+
+ d1++;
+ s++;
+ }
+ while(1);
+
+ // pad the remainder
+ while( len < l )
+ {
+ d1[len++] = '\0';
+ }
+
+ return d;
+}
+
+int strcmp(const char* a, const char* b)
+{
+ while((*a != '\0') && (*b != '\0'))
+ {
+ if (*a == *b)
+ {
+ a++;
+ b++;
+ }
+ else
+ {
+ return (*a > *b) ? 1 : -1;
+ }
+ }
+
+ if (*a == *b)
+ {
+ return 0;
+ }
+
+ if (*a == '\0')
+ {
+ return -1;
+ }
+ else
+ {
+ return 1;
+ }
+}
+
+size_t strlen(const char* a)
+{
+ size_t length = 0;
+
+ while(*a++)
+ {
+ length++;
+ }
+
+ return length;
+}
+
+size_t strnlen(const char* s, size_t n)
+{
+ size_t length = 0;
+
+ while((length < n) && (*s++))
+ {
+ length++;
+ }
+
+ return length;
+}
+
+char* strcat(char* d, const char* s)
+{
+ char* _d = d;
+
+ while(*_d)
+ {
+ _d++;
+ }
+
+ while(*s)
+ {
+ *_d = *s;
+ _d++;
+ s++;
+ }
+
+ *_d = '\0';
+
+ return d;
+}
+
+char* strncat(char* d, const char* s, size_t n)
+{
+ char* _d = d;
+
+ while(*_d)
+ {
+ _d++;
+ }
+
+ while((*s) && (0 != n))
+ {
+ *_d = *s;
+ _d++;
+ s++;
+ n--;
+ }
+
+ *_d = '\0';
+
+ return d;
+}
+
+
+char* strchr(const char* s, int c)
+{
+ while((*s != '\0') && (*s != c))
+ {
+ s++;
+ }
+
+ if (*s == c)
+ {
+ return (char*)s;
+ }
+
+ return NULL;
+}
+#ifdef __cplusplus
+};
+#endif
+#endif
diff --git a/src/ppe/pk/ppe42/ppe42_string.h b/src/ppe/pk/ppe42/ppe42_string.h
new file mode 100644
index 0000000..2be664d
--- /dev/null
+++ b/src/ppe/pk/ppe42/ppe42_string.h
@@ -0,0 +1,67 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: chips/p9/procedures/ppe/pk/ppe42/ppe42_string.h $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* EKB Project */
+/* */
+/* COPYRIGHT 2016 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* IBM_PROLOG_END_TAG */
+#ifndef __STRING_H
+#define __STRING_H
+
+#include <stdint.h>
+typedef uint32_t size_t;
+
+#ifndef NULL
+ #ifdef __cplusplus
+ #define NULL 0
+ #else
+ #define NULL ((void*)0)
+ #endif
+#endif
+
+#ifndef __cplusplus
+ typedef int bool;
+ #define false 0
+ #define true 1
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+void* memset(void* s, int c, size_t n) __attribute__ ((weak));
+// void bzero(void *vdest, size_t len); USE memset
+void* memcpy(void* dest, const void* src, size_t num) __attribute__ ((weak));
+void* memmove(void* vdest, const void* vsrc, size_t len) __attribute__ ((weak));
+int memcmp(const void* p1, const void* p2, size_t len) __attribute__((weak, pure));
+void* memmem(const void* haystack, size_t haystacklen,
+ const void* needle, size_t needlelen) __attribute__((weak, pure));
+
+char* strcpy(char* d, const char* s) __attribute__ ((weak));
+char* strncpy(char* d, const char* s, size_t l) __attribute__ ((weak));
+int strcmp(const char* s1, const char* s2) __attribute__((weak, pure));
+size_t strlen(const char* s1) __attribute__((weak, pure));
+size_t strnlen(const char* s1, size_t n) __attribute__((weak, pure));
+
+char* strcat(char* d, const char* s) __attribute__ ((weak));
+char* strncat(char* d, const char* s, size_t n) __attribute__ ((weak));
+
+char* strchr(const char* s, int c) __attribute__((weak, pure));
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/src/ppe/pk/trace/pk_trace.h b/src/ppe/pk/trace/pk_trace.h
index b93029a..49f6871 100644
--- a/src/ppe/pk/trace/pk_trace.h
+++ b/src/ppe/pk/trace/pk_trace.h
@@ -34,7 +34,7 @@
#define PK_TRACE_VERSION 2
#ifndef PK_TRACE_SZ
-#define PK_TRACE_SZ 256
+#define PK_TRACE_SZ 4096 //@pragupta_todo -- only for debug
#endif
//Fail compilation if size is not a power of 2
OpenPOWER on IntegriCloud