diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2016-07-24 09:27:15 +1000 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2016-08-22 15:26:51 +1000 |
commit | e45a59f89949fc964f83c6f4a73211bd2cbf29d5 (patch) | |
tree | 2735b81b5a8da11c1958b919aa28687512f10bdd /core/interrupts.c | |
parent | cb20094d441781ce5859b93709c337da0de50856 (diff) | |
download | skiboot-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.c | 5 |
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); |