diff options
author | Raja Das <rajadas2@in.ibm.com> | 2018-05-29 00:31:05 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2018-07-20 13:14:05 -0500 |
commit | 9f49d11b83bfbc8c626474262ccaac4560ba0947 (patch) | |
tree | 9430e7b70f22af56be9bacd269a1b611f1c8421e | |
parent | 529bf938bf0ee224f01ed8a2c28fe74729042fd1 (diff) | |
download | talos-hostboot-9f49d11b83bfbc8c626474262ccaac4560ba0947.tar.gz talos-hostboot-9f49d11b83bfbc8c626474262ccaac4560ba0947.zip |
[ARCH_REG 2] Enable architected register data reserve in the host
Keep a reserve space for each proc where sbe can dump all the
architected register state data, which host will use to build the
hdat in mpipl path. Host will pass on this address to each SBE in
the stash after calculating the respective offset basis the proc.
Change-Id: Ia78c2ecaaa8967c1aac13913272ce6f2ea427b5d
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/59534
Tested-by: Jenkins Server <pfd-jenkins+hostboot@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>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
-rw-r--r-- | src/include/runtime/interface.h | 1 | ||||
-rw-r--r-- | src/include/usr/sbeio/sbeioif.H | 1 | ||||
-rw-r--r-- | src/include/usr/vmmconst.h | 18 | ||||
-rw-r--r-- | src/usr/runtime/populate_hbruntime.C | 43 |
4 files changed, 59 insertions, 4 deletions
diff --git a/src/include/runtime/interface.h b/src/include/runtime/interface.h index 3d5cba1f4..de00eb271 100644 --- a/src/include/runtime/interface.h +++ b/src/include/runtime/interface.h @@ -151,6 +151,7 @@ enum HbrtRcPiberr_t #define HBRT_RSVD_MEM__SBE_FFDC "ibm,sbe-ffdc" #define HBRT_RSVD_MEM__SECUREBOOT "ibm,secure-crypt-algo-code" #define HBRT_RSVD_MEM__DATA "ibm,hbrt-data" +#define HBRT_RSVD_MEM__ARCH_REG "ibm,arch-reg-data" // Aligned reserved memory size for Opal #define HBRT_RSVD_MEM_OPAL_ALIGN 64*KILOBYTE diff --git a/src/include/usr/sbeio/sbeioif.H b/src/include/usr/sbeio/sbeioif.H index 9376f7b22..1da44c646 100644 --- a/src/include/usr/sbeio/sbeioif.H +++ b/src/include/usr/sbeio/sbeioif.H @@ -45,6 +45,7 @@ namespace SBEIO // reusing this could break backwards // compatibility RELOC_PAYLOAD_ADDR = 0x03, + ARCH_REG_DATA_ADDR = 0x04, //On SBE side struct is defaulted so that //Keys are 0xFF and Vals are 0xFFFFFFFFFFFFFFFF //So a key w/ FF means its empty or at its default val diff --git a/src/include/usr/vmmconst.h b/src/include/usr/vmmconst.h index 177802bab..3cf33e96f 100644 --- a/src/include/usr/vmmconst.h +++ b/src/include/usr/vmmconst.h @@ -177,14 +177,26 @@ enum BlockPriority #define VMM_ALL_HOMER_OCC_MEMORY_SIZE \ (VMM_OCC_COMMON_SIZE + VMM_HOMER_REGION_SIZE) +/** Memory for Architected state (max 4 procs - 256KB Each) **/ +#define VMM_ARCH_REG_DATA_START_OFFSET VMM_OCC_COMMON_END_OFFSET +#define VMM_ARCH_REG_DATA_PER_PROC_SIZE_IN_KB 256 +#define VMM_ARCH_REG_DATA_PER_PROC_SIZE \ + ( VMM_ARCH_REG_DATA_PER_PROC_SIZE_IN_KB*KILOBYTE ) +#define VMM_ARCH_REG_DATA_SIZE_ALL_PROC_IN_MB 1 +#define VMM_ARCH_REG_DATA_SIZE_ALL_PROC \ + ( VMM_ARCH_REG_DATA_SIZE_ALL_PROC_IN_MB*MEGABYTE ) +#define VMM_ARCH_REG_DATA_END_OFFSET \ + ( VMM_ARCH_REG_DATA_START_OFFSET + VMM_ARCH_REG_DATA_SIZE_ALL_PROC ) +/** End offset for the Architected region is 217MB **/ + /** Memory for attribute data */ -#define VMM_ATTR_DATA_START_OFFSET VMM_OCC_COMMON_END_OFFSET +#define VMM_ATTR_DATA_START_OFFSET VMM_ARCH_REG_DATA_END_OFFSET #define VMM_ATTR_DATA_SIZE (1*MEGABYTE) -/** End of Attr Area = 217MB */ +/** End of Attr Area = 218MB */ /** Memory for hostboot data Table of Contents */ #define VMM_HB_DATA_TOC_START_OFFSET \ - (VMM_ATTR_DATA_START_OFFSET + VMM_ATTR_DATA_SIZE) /* currently 217MB */ + (VMM_ATTR_DATA_START_OFFSET + VMM_ATTR_DATA_SIZE) /* currently 218MB */ /** Variable Attribute overrides and Attributes memory here **/ diff --git a/src/usr/runtime/populate_hbruntime.C b/src/usr/runtime/populate_hbruntime.C index 625669b56..5b887022c 100644 --- a/src/usr/runtime/populate_hbruntime.C +++ b/src/usr/runtime/populate_hbruntime.C @@ -1121,6 +1121,7 @@ errlHndl_t populate_HbRsvMem(uint64_t i_nodeId, bool i_master_node) // -----HOMER_N---------- // -----...-------------- // -----HOMER_0---------- + // -----Arch_dump_area--- // -----HB Data --------- // -- VPD // -- ATTR Data @@ -1162,6 +1163,46 @@ errlHndl_t populate_HbRsvMem(uint64_t i_nodeId, bool i_master_node) break; } + //////////////////////////////////////////////////////////////////// + // Set the Architected Reserve area in OPAL and pass it down to SBE + uint64_t l_memBase = l_topMemAddr - + VMM_ARCH_REG_DATA_SIZE_ALL_PROC - VMM_ALL_HOMER_OCC_MEMORY_SIZE; + l_elog = setNextHbRsvMemEntry(HDAT::RHB_TYPE_HBRT, + i_nodeId, + l_memBase, + VMM_ARCH_REG_DATA_SIZE_ALL_PROC, + HBRT_RSVD_MEM__ARCH_REG); + if(l_elog) + { + break; + } + // Loop through all functional Procs + for (const auto & l_procChip: l_procChips) + { + uint32_t l_procNum = + l_procChip->getAttr<TARGETING::ATTR_POSITION>(); + l_homerAddr = l_memBase + + (l_procNum * VMM_ARCH_REG_DATA_PER_PROC_SIZE); + + //Pass start address down to SBE via chipop + l_elog = SBEIO::sendPsuStashKeyAddrRequest( + SBEIO::ARCH_REG_DATA_ADDR, + l_homerAddr, + l_procChip); + if (l_elog) + { + TRACFCOMP( g_trac_runtime, "sendPsuStashKeyAddrRequest " + "failed for target: %x",TARGETING::get_huid(l_procChip)); + break; + } + } + + if(l_elog) + { + break; + } + //////////////////////////////////////////////////////////////////// + #ifdef CONFIG_START_OCC_DURING_BOOT /////////////////////////////////////////////////// // OCC Common entry @@ -1208,7 +1249,7 @@ errlHndl_t populate_HbRsvMem(uint64_t i_nodeId, bool i_master_node) else if(TARGETING::is_sapphire_load()) { l_endAddr = l_topMemAddr - - VMM_ALL_HOMER_OCC_MEMORY_SIZE; + VMM_ALL_HOMER_OCC_MEMORY_SIZE - VMM_ARCH_REG_DATA_SIZE_ALL_PROC; startAddressValid = false; } |