summaryrefslogtreecommitdiffstats
path: root/src/usr/intr/intrrp.C
diff options
context:
space:
mode:
authorBrian Bakke <bbakke@us.ibm.com>2018-05-22 11:30:26 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-06-07 13:37:46 -0400
commite364f91be1727019dd594c57d496e5ce43e8f5f0 (patch)
tree3515d4777d5ca4705fc232b02110d6c480151eff /src/usr/intr/intrrp.C
parent0c6d58230e615000dee1a1940bf4bc84ad5c1798 (diff)
downloadtalos-hostboot-e364f91be1727019dd594c57d496e5ce43e8f5f0.tar.gz
talos-hostboot-e364f91be1727019dd594c57d496e5ce43e8f5f0.zip
Fixes to node IPC messaging to handle non-zero base addresses
Current code has each Node calculate each Remote Node's IPC area remote address by performing a fixed format calculation. This change has each Node calculating its IPC area Remote address and posting this value to a local SCOM register. A Node reads a Remote Node's SCOM register to acquire the Remote IPC area address. Change-Id: I25260ce180e0d07e5e81990d4c1f99e249912491 RTC:191463 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/59177 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Prachi Gupta <pragupta@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/intr/intrrp.C')
-rw-r--r--src/usr/intr/intrrp.C47
1 files changed, 40 insertions, 7 deletions
diff --git a/src/usr/intr/intrrp.C b/src/usr/intr/intrrp.C
index fda137259..a7ebde8d5 100644
--- a/src/usr/intr/intrrp.C
+++ b/src/usr/intr/intrrp.C
@@ -359,25 +359,58 @@ errlHndl_t IntrRp::_init()
break;
}
+ // extract the mpipl indicator
+ // will still be 0 if attribute does not exist
uint8_t is_mpipl = 0;
- TARGETING::Target * sys = NULL;
- TARGETING::targetService().getTopLevelTarget(sys);
- if(sys &&
- sys->tryGetAttr<TARGETING::ATTR_IS_MPIPL_HB>(is_mpipl) &&
- is_mpipl)
+ sys->tryGetAttr<TARGETING::ATTR_IS_MPIPL_HB>(is_mpipl);
+
+ // Extract the last values for IPC data Addresses.
+ // will be 00's except for MPIPL, then previous values
+ uint64_t l_ipcDataAddrs[MAX_NODES_PER_SYS];
+ assert((sys->tryGetAttr<TARGETING::ATTR_IPC_NODE_BUFFER_GLOBAL_ADDRESS>
+ (l_ipcDataAddrs)) == true );
+
+ // determine node and
+ // ipc data address as seen by a remote node
+ uint64_t l_thisNode = 0xa5a5; // seed with invalid value(s) to
+ uint64_t l_remoteAddr = 0x5a5a; // catch missing return values
+
+ qryLocalIpcInfo( l_thisNode, l_remoteAddr );
+
+ // validate no change to local if this is an MPIPL
+ if (is_mpipl)
+ {
+ assert( l_ipcDataAddrs[l_thisNode] == l_remoteAddr );
+ }
+
+ // update attribute entry for this node
+ l_ipcDataAddrs[l_thisNode] = l_remoteAddr;
+ sys->setAttr<TARGETING::ATTR_IPC_NODE_BUFFER_GLOBAL_ADDRESS>
+ (l_ipcDataAddrs);
+
+ // shadow the IPC addrs where the IPC msg send can reach them
+ for ( uint64_t i = 0;
+ i < MAX_NODES_PER_SYS;
+ i++ )
+ {
+ uint64_t remoteAddr = l_ipcDataAddrs[i];
+ updateRemoteIpcAddr( i, remoteAddr );
+ }
+
+ if(is_mpipl)
{
TRACFCOMP(g_trac_intr,"Reset interrupt service for MPIPL");
l_err = resetIntpForMpipl();
if(l_err)
{
- TRACFCOMP(g_trac_intr,"Failed to reset interrupt service for MPIPL");
+ TRACFCOMP(g_trac_intr,
+ "Failed to reset interrupt service for MPIPL");
break;
}
}
-
//Disable Incoming PSI Interrupts
TRACDCOMP(g_trac_intr, "IntrRp::_init() Disabling PSI Interrupts");
uint64_t l_disablePsiIntr = PSI_BRIDGE_INTP_STATUS_CTL_DISABLE_PSI;
OpenPOWER on IntegriCloud