diff options
author | Mahesh Salgaonkar | 2014-07-29 15:10:07 +0200 |
---|---|---|
committer | Benjamin Herrenschmidt | 2014-08-05 08:33:52 +0200 |
commit | 0ef95b411e73d8789100d017c02c1329c5055802 (patch) | |
tree | 2438351ab90d8423ffe63bf49e1036a7d83a7950 /arch/powerpc/platforms/powernv/opal.c | |
parent | powerpc/book3s: Add basic infrastructure to handle HMI in Linux. (diff) | |
download | kernel-qcow2-linux-0ef95b411e73d8789100d017c02c1329c5055802.tar.gz kernel-qcow2-linux-0ef95b411e73d8789100d017c02c1329c5055802.tar.xz kernel-qcow2-linux-0ef95b411e73d8789100d017c02c1329c5055802.zip |
powerpc/powernv: Invoke opal call to handle hmi.
When we hit the HMI in Linux, invoke opal call to handle/recover from HMI
errors in real mode and then in virtual mode during check_irq_replay()
invoke opal_poll_events()/opal_do_notifier() to retrieve HMI event from
OPAL and act accordingly.
Now that we are ready to handle HMI interrupt directly in linux, remove
the HMI interrupt registration with firmware.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/platforms/powernv/opal.c')
-rw-r--r-- | arch/powerpc/platforms/powernv/opal.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index d20d69921376..f0a01a46a57d 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -194,9 +194,6 @@ static int __init opal_register_exception_handlers(void) * fwnmi area at 0x7000 to provide the glue space to OPAL */ glue = 0x7000; - opal_register_exception_handler(OPAL_HYPERVISOR_MAINTENANCE_HANDLER, - 0, glue); - glue += 128; opal_register_exception_handler(OPAL_SOFTPATCH_HANDLER, 0, glue); #endif @@ -517,15 +514,41 @@ int opal_machine_check(struct pt_regs *regs) /* Early hmi handler called in real mode. */ int opal_hmi_exception_early(struct pt_regs *regs) { - /* TODO: Call opal hmi handler. */ + s64 rc; + + /* + * call opal hmi handler. Pass paca address as token. + * The return value OPAL_SUCCESS is an indication that there is + * an HMI event generated waiting to pull by Linux. + */ + rc = opal_handle_hmi(); + if (rc == OPAL_SUCCESS) { + local_paca->hmi_event_available = 1; + return 1; + } return 0; } /* HMI exception handler called in virtual mode during check_irq_replay. */ int opal_handle_hmi_exception(struct pt_regs *regs) { - /* TODO: Retrive and print HMI event from OPAL. */ - return 0; + s64 rc; + __be64 evt = 0; + + /* + * Check if HMI event is available. + * if Yes, then call opal_poll_events to pull opal messages and + * process them. + */ + if (!local_paca->hmi_event_available) + return 0; + + local_paca->hmi_event_available = 0; + rc = opal_poll_events(&evt); + if (rc == OPAL_SUCCESS && evt) + opal_do_notifier(be64_to_cpu(evt)); + + return 1; } static uint64_t find_recovery_address(uint64_t nip) |