summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDean Sanner <dsanner@us.ibm.com>2018-07-17 12:07:19 -0500
committerWilliam G. Hoffa <wghoffa@us.ibm.com>2018-07-18 10:02:02 -0400
commit5be875d40b41d212d02a03643cb4be8fedd6ba5e (patch)
tree13eff2a1a7b0988de3e52ecd41ac6bfd9dc41ab5 /src
parent5be7d802291e05b36678ad86449e5fdcdb340f7d (diff)
downloadtalos-hostboot-5be875d40b41d212d02a03643cb4be8fedd6ba5e.tar.gz
talos-hostboot-5be875d40b41d212d02a03643cb4be8fedd6ba5e.zip
Handle inter-node HRMOR correctly on 3/4 nodes
Recent changes to direclty use HRMOR for calculating addresses broke 3 and 4 node configs. This commit removes the multiplication of _nodal_ HRMOR * group id (since the _nodal_ HRMOR mechanism now factors that in). It also uses the IPC addresses to handle start payload, so math/constants are not used to find master node. Change-Id: I919783bc60b5e4914c58f80752881fcb15649e95 CQ:SW438196 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/62659 Reviewed-by: Thi N. Tran <thi@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/62708
Diffstat (limited to 'src')
-rw-r--r--src/kernel/ipc.C7
-rw-r--r--src/kernel/misc.C17
-rw-r--r--src/usr/intr/intrrp.C6
3 files changed, 14 insertions, 16 deletions
diff --git a/src/kernel/ipc.C b/src/kernel/ipc.C
index 42eebf92d..63035b80b 100644
--- a/src/kernel/ipc.C
+++ b/src/kernel/ipc.C
@@ -124,13 +124,10 @@ int KernelIpc::qryLocalIpcInfo(uint64_t * i_pONode, uint64_t * i_pOAddr)
uint64_t l_localNode = getPIR()/KERNEL_MAX_SUPPORTED_CPUS_PER_NODE;
uint64_t l_localAddr = reinterpret_cast<uint64_t>(&ipc_data_area);
- uint64_t l_hrmorOffset = (getHRMOR() -
- (l_localNode * (ipc_data_area.hrmor_base)));
- uint64_t l_remoteHrmor =
- ((ipc_data_area.hrmor_base * l_localNode) + l_hrmorOffset);
+ uint64_t l_hrmor = getHRMOR();
uint64_t l_oAddr = (( l_localAddr +
- l_remoteHrmor ) |
+ l_hrmor ) |
0x8000000000000000ul);
*i_pONode = l_localNode;
diff --git a/src/kernel/misc.C b/src/kernel/misc.C
index f6aa69bda..9f21fe75b 100644
--- a/src/kernel/misc.C
+++ b/src/kernel/misc.C
@@ -153,16 +153,17 @@ namespace KernelMisc
uint64_t local_master_pir = 0xfffffffffffffffful;
// Find the start_payload_data_area on the master node
- uint64_t hrmor_base = KernelIpc::ipc_data_area.hrmor_base;
+ // Use IPC address of master node to find the necessary
+ // Address
+ uint64_t master_node_IPC =
+ reinterpret_cast<uint64_t>(
+ KernelIpc::ipc_data_area.remote_ipc_data_addr[
+ g_masterHBInstance]);
- uint64_t this_hb_instance =
- l_lowestPIR/KERNEL_MAX_SUPPORTED_CPUS_PER_NODE;
+ uint64_t l_localAddrIPC =
+ reinterpret_cast<uint64_t>(& KernelIpc::ipc_data_area);
- uint64_t hrmor_offset =
- getHRMOR() - (this_hb_instance * hrmor_base);
-
- uint64_t dest_hrmor =
- (g_masterHBInstance * hrmor_base) + hrmor_offset;
+ uint64_t dest_hrmor = master_node_IPC - l_localAddrIPC;
uint64_t start_payload_data_area_address =
reinterpret_cast<uint64_t>
diff --git a/src/usr/intr/intrrp.C b/src/usr/intr/intrrp.C
index d92c27f13..964aaea9c 100644
--- a/src/usr/intr/intrrp.C
+++ b/src/usr/intr/intrrp.C
@@ -2449,7 +2449,7 @@ errlHndl_t IntrRp::syncNodes(intr_mpipl_sync_t i_sync_type)
uint64_t hrmorBase = KernelIpc::ipc_data_area.hrmor_base;
void * node_info_ptr =
- reinterpret_cast<void *>((iv_masterCpu.groupId * hrmorBase) +
+ reinterpret_cast<void *>(hrmorBase +
VMM_INTERNODE_PRESERVED_MEMORY_ADDR);
internode_info_t * this_node_info =
@@ -2570,7 +2570,7 @@ errlHndl_t IntrRp::initializeMpiplSyncArea()
errlHndl_t err = NULL;
uint64_t hrmorBase = KernelIpc::ipc_data_area.hrmor_base;
void * node_info_ptr =
- reinterpret_cast<void *>((iv_masterCpu.groupId * hrmorBase) +
+ reinterpret_cast<void *>(hrmorBase +
VMM_INTERNODE_PRESERVED_MEMORY_ADDR);
internode_info_t * this_node_info =
@@ -2630,7 +2630,7 @@ errlHndl_t IntrRp::addHbNodeToMpiplSyncArea(uint64_t i_hbNode)
errlHndl_t err = NULL;
uint64_t hrmorBase = KernelIpc::ipc_data_area.hrmor_base;
void * node_info_ptr =
- reinterpret_cast<void *>((iv_masterCpu.groupId * hrmorBase) +
+ reinterpret_cast<void *>(hrmorBase +
VMM_INTERNODE_PRESERVED_MEMORY_ADDR);
internode_info_t * this_node_info =
OpenPOWER on IntegriCloud