linux_old1/arch/powerpc/sysdev/xics
Michael Ellerman 45b21cfeb2 powerpc/powernv: Fix oops on P9 DD1 in cause_ipi()
Recently we merged the native xive support for Power9, and then separately some
reworks for doorbell IPI support. In isolation both series were OK, but the
merged result had a bug in one case.

On P9 DD1 we use pnv_p9_dd1_cause_ipi() which tries to use doorbells, and then
falls back to the interrupt controller. However the fallback is implemented by
calling icp_ops->cause_ipi. But now that xive support is merged we might be
using xive, in which case icp_ops is not initialised, it's a xics specific
structure. This leads to an oops such as:

  Unable to handle kernel paging request for data at address 0x00000028
  Oops: Kernel access of bad area, sig: 11 [#1]
  NIP pnv_p9_dd1_cause_ipi+0x74/0xe0
  LR smp_muxed_ipi_message_pass+0x54/0x70

To fix it, rather than using icp_ops which might be NULL, have both xics and
xive set smp_ops->cause_ipi, and then in the powernv code we save that as
ic_cause_ipi before overriding smp_ops->cause_ipi. For paranoia add a WARN_ON()
to check if somehow smp_ops->cause_ipi is NULL.

Fixes: b866cc2199 ("powerpc: Change the doorbell IPI calling convention")
Tested-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2017-04-26 23:28:12 +10:00
..
Kconfig powerpc/xics: Properly set Edge/Level type and enable resend 2016-08-09 14:50:18 +10:00
Makefile powerpc/xics: Add ICP OPAL backend 2016-07-17 16:42:45 +10:00
icp-hv.c powerpc: Change the doorbell IPI calling convention 2017-04-13 23:34:33 +10:00
icp-native.c powerpc: Change the doorbell IPI calling convention 2017-04-13 23:34:33 +10:00
icp-opal.c powerpc: Change the doorbell IPI calling convention 2017-04-13 23:34:33 +10:00
ics-opal.c powerpc/xics: Properly set Edge/Level type and enable resend 2016-08-09 14:50:18 +10:00
ics-rtas.c powerpc/xics: Properly set Edge/Level type and enable resend 2016-08-09 14:50:18 +10:00
xics-common.c powerpc/powernv: Fix oops on P9 DD1 in cause_ipi() 2017-04-26 23:28:12 +10:00