summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Geddes <crgeddes@us.ibm.com>2018-07-26 16:35:08 -0500
committerChristian R. Geddes <crgeddes@us.ibm.com>2018-07-27 13:40:36 -0500
commit10ccdde9f0637c7fb1c01c8f8ceaa9e7dcc44191 (patch)
treeb59c9b33102e670af3c6722a404addb2f18a64c9 /src
parent3b48d9e5a62c322d044955334c6349dc8b955cc5 (diff)
downloadtalos-hostboot-10ccdde9f0637c7fb1c01c8f8ceaa9e7dcc44191.tar.gz
talos-hostboot-10ccdde9f0637c7fb1c01c8f8ceaa9e7dcc44191.zip
Lookup remote node's HRMOR value save from prev boot during MPIPL
When getting the interrp initialized for the MPIPL boot we need to look up the remote node's hrmor value that each node stored away in the ipc_data_area_t of each node. Previously the code was relying on all of the HRMORs to be evenly laid out in intervals of the master node's hrmor. This calculation is no longer valid, we must look up the value stored on the previous boot. Change-Id: I6f059ba14ef759ffd2d033f60bfa3e2a25d3a88b CQ: SW439088 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/63399 Reviewed-by: Michael Baiocchi <mbaiocch@us.ibm.com> Reviewed-by: Roland Veloz <rveloz@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@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: Christian R. Geddes <crgeddes@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/usr/intr/intrrp.C20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/usr/intr/intrrp.C b/src/usr/intr/intrrp.C
index ec9d7396f..896bbe4ec 100644
--- a/src/usr/intr/intrrp.C
+++ b/src/usr/intr/intrrp.C
@@ -57,6 +57,7 @@
#include <p9_misc_scom_addresses.H>
#include <p9n2_misc_scom_addresses_fld.H>
#include <util/utilmbox_scratch.H>
+#include <util/align.H>
#include <errl/errludprintk.H>
using namespace INTR;
@@ -2486,9 +2487,26 @@ errlHndl_t IntrRp::syncNodes(intr_mpipl_sync_t i_sync_type)
}
else if(this_node_info->exist[node])
{
+ // Read the remote ipc address for this node and store it as an integer
+ uint64_t l_remote_ipc_addr =
+ reinterpret_cast<uint64_t>(KernelIpc::ipc_data_area.remote_ipc_data_addr[node]);
+
+ // perform a block map to get a page aligned vaddr that contains the info we want
+ void* l_pageAlignedPtr = mm_block_map(reinterpret_cast<void *>(ALIGN_PAGE_DOWN(l_remote_ipc_addr)),
+ ALIGN_PAGE(sizeof(KernelIpc::ipc_data_area_t) + PAGE_SIZE));
+
+ KernelIpc::ipc_data_area_t * l_node_ipc_data_area =
+ reinterpret_cast<KernelIpc::ipc_data_area_t *>(
+ reinterpret_cast<uint64_t>(l_pageAlignedPtr) +
+ (l_remote_ipc_addr % PAGE_SIZE) );
+
+ hrmorBase = l_node_ipc_data_area->hrmor_base;
+
+ mm_block_unmap(reinterpret_cast<void *>(ALIGN_PAGE_DOWN(l_remote_ipc_addr)));
+
node_info_ptr =
reinterpret_cast<void *>
- ((node*hrmorBase)+VMM_INTERNODE_PRESERVED_MEMORY_ADDR);
+ ((hrmorBase)+VMM_INTERNODE_PRESERVED_MEMORY_ADDR);
internode_info_t * node_info =
reinterpret_cast<internode_info_t *>
OpenPOWER on IntegriCloud