summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaja Das <rajadas2@in.ibm.com>2018-05-29 00:31:05 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-07-20 13:14:05 -0500
commit9f49d11b83bfbc8c626474262ccaac4560ba0947 (patch)
tree9430e7b70f22af56be9bacd269a1b611f1c8421e
parent529bf938bf0ee224f01ed8a2c28fe74729042fd1 (diff)
downloadtalos-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.h1
-rw-r--r--src/include/usr/sbeio/sbeioif.H1
-rw-r--r--src/include/usr/vmmconst.h18
-rw-r--r--src/usr/runtime/populate_hbruntime.C43
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;
}
OpenPOWER on IntegriCloud