diff options
author | Bill Hoffa <wghoffa@us.ibm.com> | 2016-04-14 16:50:25 -0500 |
---|---|---|
committer | Matthew A. Ploetz <maploetz@us.ibm.com> | 2016-04-27 07:08:43 -0400 |
commit | fe4b8365d29937d01302bd3fb79b3a6d9284eb13 (patch) | |
tree | da62aed68812e5ff886566fedf3fb82d3dc779b9 /src/usr/intr/intrrp.C | |
parent | 76febbb5c230f1231be719831f84923fb802cb95 (diff) | |
download | talos-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/intrrp.C')
-rw-r--r-- | src/usr/intr/intrrp.C | 30 |
1 files changed, 28 insertions, 2 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); } |