Add patch for IPOLL interrupt workaround
diff --git a/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch b/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch
new file mode 100644
index 0000000..eb8d12a
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch
@@ -0,0 +1,141 @@
+From d2bdfed735f6c5e69b606f0251aba131fec4275d Mon Sep 17 00:00:00 2001
+From: Brian Stegmiller <bjs@us.ibm.com>
+Date: Thu, 14 May 2015 13:47:36 -0500
+Subject: [PATCH] ATTN: IPOLL interrupt workaround
+
+Circumvents issue where interrupts happen before OPAL is ready
+to handle them
+
+Change-Id: I3d378cd03dac51aaa5b2f77e8940eb63f170016b
+Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/17795
+Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
+Tested-by: Jenkins Server
+---
+ src/usr/diag/attn/common/attnsvc_common.C | 83 +++++++++++++++++++++++++++++--
+ 1 file changed, 79 insertions(+), 4 deletions(-)
+
+diff --git a/src/usr/diag/attn/common/attnsvc_common.C b/src/usr/diag/attn/common/attnsvc_common.C
+index c56b8a8..5067438 100644
+--- a/src/usr/diag/attn/common/attnsvc_common.C
++++ b/src/usr/diag/attn/common/attnsvc_common.C
+@@ -43,6 +43,13 @@ using namespace ERRORLOG;
+ 
+ namespace ATTN
+ {
++const uint64_t MCIFIRACT0     = 0x02011846;
++const uint64_t MCIFIRACT1     = 0x02011847;
++
++const uint64_t MCIFIRMASK     = 0x02011843;
++const uint64_t MCIFIRMASK_AND = 0x02011844;
++const uint64_t MCIFIRMASK_OR  = 0x02011845;
++
+ 
+ void getPbGp2Mask(uint64_t i_pos, void * i_data)
+ {
+@@ -104,11 +111,11 @@ errlHndl_t ServiceCommon::configureInterrupts(
+         ConfigureMode i_mode)
+ {
+     errlHndl_t err = NULL;
+-
+-    TargetHandleList procs;
++    TargetHandleList  procs;
+     getTargetService().getAllChips(procs, TYPE_PROC);
+     TargetHandleList::iterator it = procs.begin();
+ 
++
+     while(it != procs.end())
+     {
+         uint64_t mask = 0;
+@@ -172,12 +179,10 @@ errlHndl_t ServiceCommon::configureInterrupts(
+ 
+         #ifndef __HOSTBOOT_RUNTIME
+         // enable attentions in ipoll mask
+-
+         mask = HostMask::nonHost();
+         mask |= HostMask::host();
+ 
+         // this doesn't have an and/or reg for some reason...
+-
+         err = modifyScom(*it,
+                          IPOLL::address,
+                          i_mode == UP ? ~mask : mask,
+@@ -187,6 +192,76 @@ errlHndl_t ServiceCommon::configureInterrupts(
+         {
+             break;
+         }
++
++        #else  // HOSTBOOT_RUNTIME
++
++        if (i_mode == UP)
++        {
++            HwasState         l_functional;
++            uint64_t          l_mciAct0 = 0;
++            uint64_t          l_mciAct1 = 0;
++            uint64_t          l_mciBitMask = 0;
++            TargetHandleList  l_mcsList;
++            // Get list of MCS units associated with this proc
++            getTargetService().getMcsList( *it, l_mcsList );
++
++            // We need to set/clear mask bits in the MCIFIRs that
++            // are associated with host attentions.  This should
++            // cause interrupts to re-occur if they had happened
++            // prior to starting the opal-prd application.
++            TargetHandleList::iterator  l_mcsIt = l_mcsList.begin();
++
++            while(l_mcsIt != l_mcsList.end())
++            {
++                // Make sure functional prior to using
++                if (!((*l_mcsIt)->tryGetAttr<ATTR_HWAS_STATE>(l_functional)))
++                {
++                    // Can't tell if functional so skip this MCS
++                    break;
++                }
++
++                if ( !(l_functional.functional) )
++                {
++                    // Not functional MCS so skip it
++                    break;
++                }
++
++                // Read ACTION registers to see if HOST ATTN
++                err = getScom(*l_mcsIt, MCIFIRACT0, l_mciAct0);
++
++                if (NULL == err)
++                {
++                    err = getScom(*l_mcsIt, MCIFIRACT1, l_mciAct1);
++                }
++
++                if (NULL == err)
++                {
++                    // Create bit mask we will use to write to MCIFIR
++                    // (ACT0=1, ACT1=0) indicate bits we want
++                    l_mciBitMask = l_mciAct0 & ~l_mciAct1;
++                    // Set mask bits
++                    err = putScom(*l_mcsIt, MCIFIRMASK_OR, l_mciBitMask);
++                }
++
++                if (NULL == err)
++                {
++                    // Clear mask bits
++                    err = putScom(*l_mcsIt, MCIFIRMASK_AND, ~l_mciBitMask);
++                }
++
++                // Commit any failure we had and move to next MCS unit
++                if (NULL != err)
++                {
++                    errlCommit(err, ATTN_COMP_ID);
++                }
++
++                l_mcsIt++;
++
++            } // end while on MCS units
++
++            l_mcsList.clear();
++        } // end if UP MODE -- enabling
++
+         #endif //__HOSTBOOT_RUNTIME
+ 
+         ++it;
+-- 
+1.8.2.2
+