diff options
author | Christian Geddes <crgeddes@us.ibm.com> | 2018-07-26 16:35:08 -0500 |
---|---|---|
committer | Christian R. Geddes <crgeddes@us.ibm.com> | 2018-07-27 13:40:36 -0500 |
commit | 10ccdde9f0637c7fb1c01c8f8ceaa9e7dcc44191 (patch) | |
tree | b59c9b33102e670af3c6722a404addb2f18a64c9 | |
parent | 3b48d9e5a62c322d044955334c6349dc8b955cc5 (diff) | |
download | blackbird-hostboot-10ccdde9f0637c7fb1c01c8f8ceaa9e7dcc44191.tar.gz blackbird-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>
-rw-r--r-- | src/usr/intr/intrrp.C | 20 |
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 *> |