diff options
author | Brian Bakke <bbakke@us.ibm.com> | 2018-05-22 11:30:26 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2018-06-07 13:37:46 -0400 |
commit | e364f91be1727019dd594c57d496e5ce43e8f5f0 (patch) | |
tree | 3515d4777d5ca4705fc232b02110d6c480151eff /src/usr/intr/intrrp.C | |
parent | 0c6d58230e615000dee1a1940bf4bc84ad5c1798 (diff) | |
download | talos-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.C | 47 |
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; |