aboutsummaryrefslogtreecommitdiff
path: root/core/interrupts.c
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2016-07-24 09:27:15 +1000
committerStewart Smith <stewart@linux.vnet.ibm.com>2016-08-22 15:26:51 +1000
commite45a59f89949fc964f83c6f4a73211bd2cbf29d5 (patch)
tree2735b81b5a8da11c1958b919aa28687512f10bdd /core/interrupts.c
parentcb20094d441781ce5859b93709c337da0de50856 (diff)
downloadskiboot-e45a59f89949fc964f83c6f4a73211bd2cbf29d5.zip
skiboot-e45a59f89949fc964f83c6f4a73211bd2cbf29d5.tar.gz
skiboot-e45a59f89949fc964f83c6f4a73211bd2cbf29d5.tar.bz2
interrupts: Ack/fetch interrupts in reset_cpu_icp()
This does a fetch from the XIRR, thus acking any pending interrupt before we clear IPIs and EOI. This mimmics a real sequence better and works around problems on some sims (and possibly hardware) where just raising MFRR won't lower the IRQ line to the CPU. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'core/interrupts.c')
-rw-r--r--core/interrupts.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/core/interrupts.c b/core/interrupts.c
index 30c5bc9..9bef5f5 100644
--- a/core/interrupts.c
+++ b/core/interrupts.c
@@ -240,7 +240,7 @@ void add_opal_interrupts(void)
/*
* This is called at init time (and one fast reboot) to sanitize the
* ICP. We set our priority to 0 to mask all interrupts and make sure
- * no IPI is on the way.
+ * no IPI is on the way. This is also called on wakeup from nap
*/
void reset_cpu_icp(void)
{
@@ -249,6 +249,9 @@ void reset_cpu_icp(void)
if (!icp)
return;
+ /* Dummy fetch */
+ in_be32(icp + ICP_XIRR);
+
/* Clear pending IPIs */
out_8(icp + ICP_MFRR, 0xff);