summaryrefslogtreecommitdiffstats
path: root/src/usr/fsiscom
diff options
context:
space:
mode:
authorDan Crowell <dcrowell@us.ibm.com>2012-01-09 10:29:43 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-01-09 15:50:49 -0600
commitcecc38a1b5782b5ddaa351d37e064200d407c8fb (patch)
treeb77d1efe61ae159e589984209b7be10bcb5fc4dd /src/usr/fsiscom
parent0700cb28c8c52a9cc675db648adddcf822af8652 (diff)
downloadtalos-hostboot-cecc38a1b5782b5ddaa351d37e064200d407c8fb.tar.gz
talos-hostboot-cecc38a1b5782b5ddaa351d37e064200d407c8fb.zip
Switching FSI Scom Driver over to use a separate attribute mutex
for each chip versus a single global mutex. RTC Story 4389 Also stuck in a quick fix for Issue 4493 at the same time. Verified against VENICE model with a Centaur. Change-Id: I62fc2c979315b60594104550f8095aa80996c40f Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/599 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/fsiscom')
-rw-r--r--src/usr/fsiscom/fsiscom.C17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/usr/fsiscom/fsiscom.C b/src/usr/fsiscom/fsiscom.C
index a09e52835..a88210a7f 100644
--- a/src/usr/fsiscom/fsiscom.C
+++ b/src/usr/fsiscom/fsiscom.C
@@ -32,8 +32,6 @@
#include "fsiscom.H"
//Globals/Constants
-// @todo - change to target-specific MUTEX so devices can be accessed in parallel.
-static mutex_t g_fsiScomMutex = MUTEX_INITIALIZER;
// Trace definition
trace_desc_t* g_trac_fsiscom = NULL;
@@ -76,6 +74,7 @@ errlHndl_t fsiScomPerformOp(DeviceFW::OperationType i_opType,
uint32_t l_status = 0;
bool need_unlock = false;
size_t op_size = sizeof(uint32_t);
+ mutex_t* l_mutex = NULL;
do{
@@ -123,6 +122,8 @@ errlHndl_t fsiScomPerformOp(DeviceFW::OperationType i_opType,
l_command = static_cast<uint32_t>(l_scomAddr & 0x000000007FFFFFFF);
+ // use the chip-specific mutex attribute
+ l_mutex = i_target->getHbMutexAttr<TARGETING::ATTR_FSI_SCOM_MUTEX>();
if(i_opType == DeviceFW::WRITE)
{
@@ -132,7 +133,7 @@ errlHndl_t fsiScomPerformOp(DeviceFW::OperationType i_opType,
// atomic section >>
- mutex_lock(&g_fsiScomMutex);
+ mutex_lock(l_mutex);
need_unlock = true;
@@ -184,7 +185,7 @@ errlHndl_t fsiScomPerformOp(DeviceFW::OperationType i_opType,
// atomic section <<
need_unlock = false;
- mutex_unlock(&g_fsiScomMutex);
+ mutex_unlock(l_mutex);
//bits 17-19 indicates PCB/PIB error
if(l_status & 0x00007000)
@@ -219,7 +220,7 @@ errlHndl_t fsiScomPerformOp(DeviceFW::OperationType i_opType,
TRACUCOMP( g_trac_fsiscom, "fsiScomPerformOp: Read(l_scomAddr=0x%.8X)", l_scomAddr);
// atomic section >>
- mutex_lock(&g_fsiScomMutex);
+ mutex_lock(l_mutex);
need_unlock = true;
@@ -295,7 +296,7 @@ errlHndl_t fsiScomPerformOp(DeviceFW::OperationType i_opType,
// atomic section <<
need_unlock = false;
- mutex_unlock(&g_fsiScomMutex);
+ mutex_unlock(l_mutex);
TRACUCOMP( g_trac_fsiscom, "fsiScomPerformOp: Read: l_scomAddr=0x%X, l_data0=0x%X, l_data1=0x%X", l_scomAddr, scratchData.data32_0, scratchData.data32_1);
@@ -327,9 +328,9 @@ errlHndl_t fsiScomPerformOp(DeviceFW::OperationType i_opType,
}while(0);
- if( need_unlock )
+ if( need_unlock && l_mutex )
{
- mutex_unlock(&g_fsiScomMutex);
+ mutex_unlock(l_mutex);
}
OpenPOWER on IntegriCloud