summaryrefslogtreecommitdiffstats
path: root/src/usr/intr
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/intr')
-rw-r--r--src/usr/intr/intrrp.C53
-rw-r--r--src/usr/intr/intrrp.H16
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
OpenPOWER on IntegriCloud