summaryrefslogtreecommitdiffstats
path: root/src/usr/intr
diff options
context:
space:
mode:
authorBill Hoffa <wghoffa@us.ibm.com>2016-04-14 16:50:25 -0500
committerMatthew A. Ploetz <maploetz@us.ibm.com>2016-04-27 07:08:43 -0400
commitfe4b8365d29937d01302bd3fb79b3a6d9284eb13 (patch)
treeda62aed68812e5ff886566fedf3fb82d3dc779b9 /src/usr/intr
parent76febbb5c230f1231be719831f84923fb802cb95 (diff)
downloadtalos-hostboot-fe4b8365d29937d01302bd3fb79b3a6d9284eb13.tar.gz
talos-hostboot-fe4b8365d29937d01302bd3fb79b3a6d9284eb13.zip
Add INTRP message handling for UNREGISTER_MSG_Q
Change-Id: I9e76c07849331bf1402aeeddd32fdf1dcc26eafc RTC:151604 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/23366 Tested-by: Jenkins Server Reviewed-by: Andrew J. Geissler <andrewg@us.ibm.com> Tested-by: FSP CI Jenkins Reviewed-by: Prachi Gupta <pragupta@us.ibm.com> Reviewed-by: Matthew A. Ploetz <maploetz@us.ibm.com>
Diffstat (limited to 'src/usr/intr')
-rw-r--r--src/usr/intr/intrrp.C30
-rw-r--r--src/usr/intr/intrrp.H3
2 files changed, 30 insertions, 3 deletions
diff --git a/src/usr/intr/intrrp.C b/src/usr/intr/intrrp.C
index 8ce90bcab..196dd4aee 100644
--- a/src/usr/intr/intrrp.C
+++ b/src/usr/intr/intrrp.C
@@ -180,6 +180,7 @@ errlHndl_t IntrRp::_init()
// so unmask those interrupts
l_err = unmaskInterruptSource(LSI_PSU);
+
} while(0);
return l_err;
@@ -590,7 +591,7 @@ void IntrRp::msgHandler()
msg_q_t l_msgQ = reinterpret_cast<msg_q_t>(msg->data[0]);
uint64_t l_type = msg->data[1];
LSIvalue_t l_intr_type = static_cast<LSIvalue_t>
- (l_type & 0xFFFF);
+ (l_type & LSI_SOURCE_MASK);
errlHndl_t err = registerInterruptXISR(l_msgQ, l_type >> 32,
l_intr_type);
@@ -620,7 +621,30 @@ void IntrRp::msgHandler()
}
break;
case MSG_INTR_UNREGISTER_MSGQ:
- //TODO RTC 150260 add functionality
+ {
+ TRACDCOMP(g_trac_intr,
+ "INTR remove registration of interrupt type = 0x%lx",
+ msg->data[0]);
+ LSIvalue_t l_type = static_cast<LSIvalue_t>(msg->data[0]);
+ LSIvalue_t l_intr_type = static_cast<LSIvalue_t>
+ (l_type & LSI_SOURCE_MASK);
+
+ // Mask the interrupt source prior to unregistering
+ errlHndl_t err = maskInterruptSource(l_intr_type);
+ if(err)
+ {
+ TRACFCOMP(g_trac_intr,
+ "IntrRp::msgHandler MSG_INTR_UNREGISTER_MSGQ error"
+ " masking interrupt type: %lx",
+ l_intr_type);
+ errlCommit(err,INTR_COMP_ID);
+ }
+
+ // Unregister for this source and return rc in response
+ msg_q_t msgQ = unregisterInterruptXISR(l_type);
+ msg->data[1] = reinterpret_cast<uint64_t>(msgQ);
+ msg_respond(iv_msgQ, msg);
+ }
break;
case MSG_INTR_ENABLE:
{
@@ -1163,6 +1187,8 @@ msg_q_t IntrRp::unregisterInterruptXISR(ext_intr_t i_xisr)
Registry_t::iterator r = iv_registry.find(i_xisr);
if(r != iv_registry.end())
{
+ TRACFCOMP(g_trac_intr,INFO_MRK "Removing interrupt listener: %lx",
+ i_xisr);
msgQ = r->second.msgQ;
iv_registry.erase(r);
}
diff --git a/src/usr/intr/intrrp.H b/src/usr/intr/intrrp.H
index 23fd8c74c..a5ef9cddc 100644
--- a/src/usr/intr/intrrp.H
+++ b/src/usr/intr/intrrp.H
@@ -165,7 +165,8 @@ namespace INTR
IPI_USR_PRIO = 0x2, //<! IPI priority from USR space
- LSI_INTERRUPT = 0xC000,
+ LSI_SOURCE_MASK = 0xFFFF,
+ LSI_INTERRUPT = 0xC000,
//PSI Host Bridge Constants
PSI_BRIDGE_BAR_SCOM_ADDR = 0x0501290A,
OpenPOWER on IntegriCloud