summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/usr/intr/intrrp.C33
-rw-r--r--src/usr/intr/intrrp.H2
2 files changed, 35 insertions, 0 deletions
diff --git a/src/usr/intr/intrrp.C b/src/usr/intr/intrrp.C
index 9f418691b..8448ae158 100644
--- a/src/usr/intr/intrrp.C
+++ b/src/usr/intr/intrrp.C
@@ -544,6 +544,39 @@ errlHndl_t IntrRp::resetIntUnit(intr_hdlr_t* i_proc)
TRACFCOMP(g_trac_intr, "Error resetting XIVE INT unit");
break;
}
+
+ //Additional settings for fused mode
+ //Needed because the HW XIVE reset clears too much HW state
+ if (is_fused_mode())
+ {
+ //Do a Read-Modify-Write on INT Thread Context Register
+ //setting the FUSED_CORE_EN bit as the 'modify' part
+ uint64_t l_int_tctxt_reg = 0x0;
+ l_err = deviceRead(procTarget,
+ &l_int_tctxt_reg,
+ size,
+ DEVICE_SCOM_ADDRESS(PU_INT_TCTXT_CFG));
+
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_intr, "Error reading the INT_TCTXT_CFG(%lx) scom register",
+ PU_INT_TCTXT_CFG);
+ break;
+ }
+
+ l_int_tctxt_reg |= INT_TCTXT_CFG_FUSE_CORE_EN;
+
+ l_err = deviceWrite(procTarget,
+ &l_int_tctxt_reg,
+ size,
+ DEVICE_SCOM_ADDRESS(PU_INT_TCTXT_CFG));
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_intr, "Error writing %lx the INT_TCTXT_CFG(%lx) scom register",
+ l_int_tctxt_reg, PU_INT_TCTXT_CFG );
+ break;
+ }
+ }
}
else
{
diff --git a/src/usr/intr/intrrp.H b/src/usr/intr/intrrp.H
index b7be87bab..db6669989 100644
--- a/src/usr/intr/intrrp.H
+++ b/src/usr/intr/intrrp.H
@@ -213,6 +213,8 @@ namespace INTR
PSI_BRIDGE_INTP_STATUS_CTL_RESET = 0x4000000000000000ULL,
PSI_BRIDGE_INTP_STATUS_CTL_DISABLE_PSI = 0x1000000000000000ULL,
+ INT_TCTXT_CFG_FUSE_CORE_EN = 0x0800000000000000,
+
XIVE_RESET_INT_CQ_RST_CTL_SCOM_ADDR = 0x05013023,
XIVE_RESET_POWERBUS_QUIESCE_ENABLE = 0x4000000000000000,
XIVE_RESET_POWERBUS_QUIESCE_TIMEOUT = 1000000, //1 millisecond
OpenPOWER on IntegriCloud