diff options
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.C | 78 |
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" ); |