summaryrefslogtreecommitdiffstats
path: root/src/sbefw
diff options
context:
space:
mode:
authorSachin Gupta <sgupta2m@in.ibm.com>2016-10-19 15:13:59 -0500
committerAMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com>2016-10-19 23:47:45 -0400
commit4fd0b4043008eec84068fa106fcb64be1104080f (patch)
treec323a3dfdf9b5d855689ffc31793ef998255c1b6 /src/sbefw
parentc15ebbd7b56b504c8f68de26b268a1682ad5b0d1 (diff)
downloadtalos-sbe-4fd0b4043008eec84068fa106fcb64be1104080f.tar.gz
talos-sbe-4fd0b4043008eec84068fa106fcb64be1104080f.zip
Fix for FIFO empty condition
Change-Id: Ia80e76b141c5f4493f979d3aa81f83ff9dca4850 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/31512 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Dean Sanner <dsanner@us.ibm.com> Reviewed-by: AMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com>
Diffstat (limited to 'src/sbefw')
-rw-r--r--src/sbefw/sbeFifoMsgUtils.C19
-rw-r--r--src/sbefw/sbe_sp_intf.H1
-rw-r--r--src/sbefw/sbefifo.H6
3 files changed, 20 insertions, 6 deletions
diff --git a/src/sbefw/sbeFifoMsgUtils.C b/src/sbefw/sbeFifoMsgUtils.C
index 75489cae..26515077 100644
--- a/src/sbefw/sbeFifoMsgUtils.C
+++ b/src/sbefw/sbeFifoMsgUtils.C
@@ -100,8 +100,8 @@ uint32_t sbeUpFifoDeq_mult (uint32_t &io_len,
}
SBE_DEBUG(SBE_FUNC"sbeUpFifoDeq, "
- "l_data.fifo_data=[0x%08X],",
- l_data.fifo_data);
+ "fifo_data:0x%08X, status:0x%08X",
+ l_data.fifo_data, l_data.status);
// If FIFO reset is requested
if(l_data.statusOrReserved.req_upfifo_reset)
@@ -149,10 +149,19 @@ uint32_t sbeUpFifoDeq_mult (uint32_t &io_len,
break;
}
- // if Upstream FIFO is empty,
- if ( ( l_data.statusOrReserved.fifo_empty) &&
- ( !l_data.statusOrReserved.valid_flag))
+ // Check valid flag
+ if ( !l_data.statusOrReserved.valid_flag )
{
+ if( l_data.statusOrReserved.parity_err )
+ {
+ SBE_ERROR(SBE_FUNC"Parity error while reading FIFO."
+ " FIFO status: 0x%08X");
+ l_rc = SBE_SEC_FIFO_PARITY_ERROR;
+ break;
+ }
+ // We can reach here because FIFO was empty. We can not trust
+ // empty flag because empty flag tells the status of FIFO after
+ // operation not at the time of operation
pk_sleep(PK_MILLISECONDS(FIFO_WAIT_SLEEP_TIME));
continue;
}
diff --git a/src/sbefw/sbe_sp_intf.H b/src/sbefw/sbe_sp_intf.H
index d66b9c8a..f3563f7a 100644
--- a/src/sbefw/sbe_sp_intf.H
+++ b/src/sbefw/sbe_sp_intf.H
@@ -209,6 +209,7 @@ enum sbeSecondaryResponse
SBE_SEC_UNEXPECTED_EOT_EXCESS_DATA = 0x0F,
SBE_SEC_HW_OP_TIMEOUT = 0x10,
SBE_SEC_PCB_PIB_ERR = 0x11,
+ SBE_SEC_FIFO_PARITY_ERROR = 0x12,
};
/**
diff --git a/src/sbefw/sbefifo.H b/src/sbefw/sbefifo.H
index e624f390..6a4332e9 100644
--- a/src/sbefw/sbefifo.H
+++ b/src/sbefw/sbefifo.H
@@ -98,7 +98,11 @@ typedef struct
// The following status field is applicable only for
// upstream FIFO access and will remain reserved for
// downstream FIFO access
- sbe_upfifo_status_t statusOrReserved;
+ union
+ {
+ sbe_upfifo_status_t statusOrReserved;
+ uint32_t status;
+ };
} sbeFifoEntry_t ;
OpenPOWER on IntegriCloud