From 5be875d40b41d212d02a03643cb4be8fedd6ba5e Mon Sep 17 00:00:00 2001 From: Dean Sanner Date: Tue, 17 Jul 2018 12:07:19 -0500 Subject: 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 Reviewed-by: Daniel M. Crowell Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Tested-by: FSP CI Jenkins Tested-by: Jenkins OP HW Reviewed-by: William G. Hoffa Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/62708 --- src/kernel/ipc.C | 7 ++----- src/kernel/misc.C | 17 +++++++++-------- 2 files changed, 11 insertions(+), 13 deletions(-) (limited to 'src/kernel') 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(&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( + 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(& 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 -- cgit v1.2.1