summaryrefslogtreecommitdiffstats
path: root/src/usr/isteps/istep15/proc_set_pba_homer_bar.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/isteps/istep15/proc_set_pba_homer_bar.C')
-rw-r--r--src/usr/isteps/istep15/proc_set_pba_homer_bar.C78
1 files changed, 76 insertions, 2 deletions
diff --git a/src/usr/isteps/istep15/proc_set_pba_homer_bar.C b/src/usr/isteps/istep15/proc_set_pba_homer_bar.C
index 0173b1a15..5c02af9df 100644
--- a/src/usr/isteps/istep15/proc_set_pba_homer_bar.C
+++ b/src/usr/isteps/istep15/proc_set_pba_homer_bar.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2015,2016 */
+/* Contributors Listed Below - COPYRIGHT 2015,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -46,10 +46,17 @@
#include <return_code.H>
#include <p9_pm_set_homer_bar.H>
+#include <secureboot/smf_utils.H>
+#include <secureboot/smf.H>
+#include <isteps/mem_utils.H>
+#include <util/align.H>
+
+
//Namespaces
using namespace ERRORLOG;
using namespace TARGETING;
using namespace fapi2;
+using namespace ISTEP;
namespace ISTEP_15
{
@@ -62,12 +69,56 @@ void* proc_set_pba_homer_bar (void *io_pArgs)
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_set_pba_homer_bar entry" );
ISTEP_ERROR::IStepError l_StepError;
- errlHndl_t l_errl = NULL;
+ errlHndl_t l_errl = nullptr;
TARGETING::TargetHandleList l_procChips;
+ uint64_t l_smfBase = 0x0;
+ uint64_t l_unsecureHomerAddr = get_top_mem_addr();
+
+
+ //Determine top-level system target
+ TARGETING::Target* l_sys = nullptr;
+ TARGETING::targetService().getTopLevelTarget(l_sys);
+ assert(l_sys != nullptr, "Top level target was nullptr!");
+
+ //Because the way P9N/P9C are init'ed for backwards HB / SBE
+ //compatibility (SMF never enabled -- thus unsecure homer to
+ //secure homer sc2 (system call to Ultravisor) doesn't work) during istep 15
+ //need to "trick" hostboot into placing HOMER into normal memory @
+ //HRMOR. When HB goes through istep 16 it will enter UV
+ //mode if SMF is enabled, and then when PM complex is restarted
+ //in istep 21, HOMER is moved to right spot
+ if(SECUREBOOT::SMF::isSmfEnabled())
+ {
+ l_smfBase = get_top_homer_mem_addr();
+ assert(l_smfBase != 0,
+ "proc_set_pba_homer_bar: Top of SMF memory was 0!");
+ if(is_sapphire_load())
+ {
+ l_smfBase -= VMM_ALL_HOMER_OCC_MEMORY_SIZE;
+ // Unsecure HOMER address is used in istep21 to place the
+ // unsecure part of the HOMER image outside of SMF memory.
+ // Unsecure HOMER goes to the top of unsecure
+ // memory (2MB aligned); we need to subtract the size of the
+ // unsecure HOMER and align the resulting address to arrive
+ // at the correct location.
+ l_unsecureHomerAddr = ALIGN_DOWN_X(l_unsecureHomerAddr -
+ MAX_UNSECURE_HOMER_SIZE,
+ 2 * MEGABYTE);
+ }
+ assert(l_unsecureHomerAddr != 0,
+ "proc_set_pba_homer_bar: Unsecure HOMER addr was 0!");
+
+ //Since we have the HOMER location defined, set the
+ // OCC common attribute to be used later by pm code
+ l_sys->setAttr<TARGETING::ATTR_OCC_COMMON_AREA_PHYS_ADDR>
+ (l_smfBase + VMM_HOMER_REGION_SIZE);
+ }
//Use targeting code to get a list of all processors
getAllChips( l_procChips, TARGETING::TYPE_PROC );
+
+
//Loop through all of the procs and call the HWP on each one
for (const auto & l_procChip: l_procChips)
{
@@ -92,6 +143,29 @@ void* proc_set_pba_homer_bar (void *io_pArgs)
l_StepError.addErrorDetails( l_errl );
errlCommit( l_errl, HWPF_COMP_ID );
}
+
+ if(SECUREBOOT::SMF::isSmfEnabled())
+ {
+ //Set correct SMF value used later in istep 21
+ // calculate size and location of the HCODE output buffer
+ uint32_t l_procNum =
+ l_procChip->getAttr<TARGETING::ATTR_POSITION>();
+ uint64_t l_procOffsetAddr = l_procNum * VMM_HOMER_INSTANCE_SIZE;
+
+ l_procChip->setAttr<TARGETING::ATTR_HOMER_PHYS_ADDR>
+ (l_smfBase + l_procOffsetAddr);
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "Update %.8X HOMER from 0x%.16llX to 0x%.16llX for SMF",
+ TARGETING::get_huid(l_procChip), homerAddr,
+ (l_smfBase + l_procOffsetAddr));
+
+ l_procChip->setAttr<TARGETING::ATTR_UNSECURE_HOMER_ADDRESS>
+ (l_unsecureHomerAddr);
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "proc_set_pba_homer_bar: unsecure HOMER addr = 0x%.16llX",
+ l_unsecureHomerAddr);
+ }
+
}
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_proc_set_pba_homer_bar exit" );
OpenPOWER on IntegriCloud