summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/usr/intr/intrrp.C11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/usr/intr/intrrp.C b/src/usr/intr/intrrp.C
index de32b60cb..212aa4ea2 100644
--- a/src/usr/intr/intrrp.C
+++ b/src/usr/intr/intrrp.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2011,2016 */
+/* Contributors Listed Below - COPYRIGHT 2011,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -477,6 +477,12 @@ errlHndl_t IntrRp::disableInterrupts(intr_hdlr_t *i_proc)
l_psihb_ptr->psihbcr =
(l_psihb_ptr->psihbcr & ~PSI_BRIDGE_INTP_STATUS_CTL_DISABLE_PSI);
+ //The XIVE HW is expecting these MMIO accesses to come from the
+ // core/thread they were setup (master core, thread 0)
+ // These functions will ensure this code executes there
+ task_affinity_pin();
+ task_affinity_migrate_to_master();
+
//Pull thread context to register - View Section 4.4.4.15 of the
// XIVE spec. Doing a 1b MMIO read will clear the cams VT bit.
volatile uint8_t * l_pull_thread_ptr = (uint8_t *)iv_xiveTmBar1Address;
@@ -490,6 +496,9 @@ errlHndl_t IntrRp::disableInterrupts(intr_hdlr_t *i_proc)
sync();
TRACFCOMP(g_trac_intr, INFO_MRK"LSI Mode inactive (cams_vt)");
+ //MMIO Complete, rest of code can run on any thread
+ task_affinity_unpin();
+
// Unset Physical Thread Enable register in the PC space for the master
// core - Simply reset both regs.
uint64_t * l_ic_ptr = i_proc->xiveIcBarAddr;
OpenPOWER on IntegriCloud