diff options
Diffstat (limited to 'src/usr/intr')
-rw-r--r-- | src/usr/intr/intrrp.C | 53 | ||||
-rw-r--r-- | src/usr/intr/intrrp.H | 16 |
2 files changed, 69 insertions, 0 deletions
diff --git a/src/usr/intr/intrrp.C b/src/usr/intr/intrrp.C index a898c2cf0..f54577f98 100644 --- a/src/usr/intr/intrrp.C +++ b/src/usr/intr/intrrp.C @@ -1615,6 +1615,13 @@ errlHndl_t IntrRp::setCommonInterruptBARs(intr_hdlr_t * i_proc, do { + l_err = setFspBAR(i_proc, i_enable); + if(l_err) + { + TRACFCOMP(g_trac_intr, "Error setting FSP BAR"); + break; + } + l_err = setPsiHbBAR(i_proc, i_enable); if (l_err) { @@ -3232,6 +3239,52 @@ errlHndl_t INTR::disableExternalInterrupts() return err; } +errlHndl_t IntrRp::setFspBAR( + const intr_hdlr_t* const i_pProcIntrHdlr, + const bool i_enable) +{ + errlHndl_t pError = nullptr; + + do + { + + if (!i_enable) + { + // Noop on disable + break; + } + + assert(i_pProcIntrHdlr != nullptr,"BUG! Input interrupt handler pointer " + "was nullptr"); + auto * const pProc = i_pProcIntrHdlr->proc; + assert(pProc != nullptr,"BUG! proc target was nullptr"); + + uint64_t fspBAR = + pProc->getAttr<TARGETING::ATTR_FSP_BASE_ADDR>(); + + const size_t expSize = sizeof(fspBAR); + auto size = expSize; + pError = deviceWrite( + pProc, + &fspBAR, + size, + DEVICE_SCOM_ADDRESS(PU_PSI_BRIDGE_FSP_BAR_REG)); + if(pError) + { + TRACFCOMP(g_trac_intr,ERR_MRK "Failed writing %d bytes of FSP BAR " + "address value (0x%016llX) to FSP BAR register for proc 0x%08X", + expSize,fspBAR,get_huid(pProc)); + break; + } + + assert(size == expSize,"Actual SCOM write size (%d) does not match " + "expected SCOM write size (%d)",size,expSize); + + } while(0); + + return pError; +} + errlHndl_t IntrRp::setPsiHbBAR(intr_hdlr_t *i_proc, bool i_enable) { errlHndl_t l_err = NULL; diff --git a/src/usr/intr/intrrp.H b/src/usr/intr/intrrp.H index f211e3347..12fb453f2 100644 --- a/src/usr/intr/intrrp.H +++ b/src/usr/intr/intrrp.H @@ -596,6 +596,22 @@ namespace INTR errlHndl_t handlePsuInterrupt(ext_intr_t i_type, intr_hdlr_t* i_proc, PIR_t& i_pir); + /** + * @brief Set the FSP BAR + * + * @param[in] i_pProcIntrHdlr Pointer to processor interrupt + * handler structure; must not be nullptr or function will + * assert. Referenced proc target must also not be nullptr, or + * same consequence. + * @param[in] i_enable Whether to enable/disable the BAR (disable + * request is no-op for this BAR) + * + * @return errlHndl_t Error log handle on failure, nullptr on + * success + */ + errlHndl_t setFspBAR( + const intr_hdlr_t* i_pProcIntrHdlr, + bool i_enable); /** * Set the PSI Host Bridge BAR scom register |