Skip to content

Commit

Permalink
INTRP HW Workaround for Clockgating Issue
Browse files Browse the repository at this point in the history
  - The issue occurs because the slave procs route their interrupts
    to the master proc, which forces the LSI Interrupt event over the
    PSIHB. However, the master is still using the local wire for its
    LSI Interrupt events. There is a situation where undesirable
    hw behavior can occur because of this (dropped/missed interrupts)

  - This workaround will set the ESB Notification Register on the
    master proc, which will force the lsi interrupts over the PSIHB
    and not the local wire.

Change-Id: If595f62d268b6ac504f714b7e50e452b9f926015
CQ: SW441117
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/74719
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
  • Loading branch information
wghoffa authored and dcrowell77 committed Mar 27, 2019
1 parent a5d11b4 commit 2620abc
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 9 deletions.
22 changes: 16 additions & 6 deletions src/usr/intr/intrrp.C
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2011,2018 */
/* Contributors Listed Below - COPYRIGHT 2011,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -234,8 +234,8 @@ errlHndl_t IntrRp::resetIntpForMpipl()
{
if (*targ_itr != iv_masterHdlr)
{
TRACDCOMP(g_trac_intr, "IntrRp::resetIntpForMpipl() Setting up Slave Proc Interrupt Routing for proc %lx", get_huid((*targ_itr)->proc));
enableSlaveProcInterruptRouting(*targ_itr);
TRACDCOMP(g_trac_intr, "IntrRp::resetIntpForMpipl() Setting up LSI Interrupt Routing for proc %lx", get_huid((*targ_itr)->proc));
routeLSIInterrupts(*targ_itr);
}
}

Expand Down Expand Up @@ -528,6 +528,11 @@ errlHndl_t IntrRp::_init()
break;
}

//Route LSI interrupt events over PSIHB instead of local wire
// This is a HW Bug Workaround for slaves using the PSIHB and
// the master using the local wire
routeLSIInterrupts(l_procIntrHdlr);

enableLsiInterrupts();
}
else
Expand All @@ -542,6 +547,11 @@ errlHndl_t IntrRp::_init()
break;
}

//Route LSI interrupt events over PSIHB instead of local wire
// This is a HW Bug Workaround for slaves using the PSIHB and
// the master using the local wire
routeLSIInterrupts(l_procIntrHdlr);

enableLsiInterrupts();

TRACFCOMP(g_trac_intr, "IntrRp::_init() Enabling PSIHB Interrupts");
Expand Down Expand Up @@ -987,7 +997,7 @@ errlHndl_t IntrRp::enableInterrupts(intr_hdlr_t *i_proc)
return err;
}

void IntrRp::enableSlaveProcInterruptRouting(intr_hdlr_t *i_proc)
void IntrRp::routeLSIInterrupts(intr_hdlr_t *i_proc)
{
PSIHB_SW_INTERFACES_t * l_psihb_ptr = i_proc->psiHbBaseAddr;

Expand Down Expand Up @@ -3562,9 +3572,9 @@ errlHndl_t INTR::IntrRp::enableSlaveProcInterrupts(TARGETING::Target * i_target)
break;
}

//Setup the PSIHB interrupt routing to route interrupts from nom-master
//Setup the PSIHB interrupt routing to route interrupts from non-master
// proc back to master proc
enableSlaveProcInterruptRouting(l_procIntrHdlr);
routeLSIInterrupts(l_procIntrHdlr);

} while(0);

Expand Down
10 changes: 7 additions & 3 deletions src/usr/intr/intrrp.H
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2011,2018 */
/* Contributors Listed Below - COPYRIGHT 2011,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -739,11 +739,15 @@ namespace INTR

/**
* Set correct PSIHB Regs to route + enable LSI interrupts from
* non-master proc to correct address on master proc
* any proc to correct address on master proc.
*
* This is used on the master proc as a workaround for a HW bug
* involving lsi triggers on the local wire. This forces the lsi
* trigger over the PSIHB working around the HW issue
* @param[in] i_proc, the proc intrp handler
* @return void
*/
void enableSlaveProcInterruptRouting(intr_hdlr_t* i_proc);
void routeLSIInterrupts(intr_hdlr_t* i_proc);

/**
* Initialize the IRSCReg to enable PSI to present interrupts
Expand Down

0 comments on commit 2620abc

Please sign in to comment.