Commit b79f7ed0 authored by Leo Yan's avatar Leo Yan
Browse files

Hikey960: Enable invalid FIQ handling



When some interrupts are configured as group 0 in GICv2, these
interrupts trigger FIQ signal; this results in the Linux kernel panic
by reporting log: "Bad mode in FIQ handler detected on CPU0, code
0x00000000 -- Unknown/Uncategorized".  Unfortunately from kernel side it
has no permission to read the GIC register for group 0 interrupts so we
have no chance to get to know which interrupt is configured as secure
interrupt and cause the kernel panic.

For upper reason, this commit enables FIQ exception handling for
SPD_none case.  If the system has not enabled SPD the FIQ interrupt is
trapped into EL3 and the FIQ handler can report the interrupt number so
we can easily narrow down which FIQ introduce unexpected interrupt.
After enable SPD we can rely on SPD interrupt route model to handle FIQ.
Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
parent c1edcd93
......@@ -16,6 +16,8 @@
#include <gicv2.h>
#include <hi3660.h>
#include <hisi_ipc.h>
#include <interrupt_mgmt.h>
#include <platform.h>
#include <platform_def.h>
#include "hikey960_def.h"
......@@ -167,6 +169,37 @@ void bl31_platform_setup(void)
hisi_ipc_init();
}
#ifdef SPD_none
static uint64_t hikey_debug_fiq_handler(uint32_t id,
uint32_t flags,
void *handle,
void *cookie)
{
int intr, intr_raw;
/* Acknowledge interrupt */
intr_raw = plat_ic_acknowledge_interrupt();
intr = plat_ic_get_interrupt_id(intr_raw);
ERROR("Invalid interrupt: intr=%d\n", intr);
console_flush();
panic();
return 0;
}
#endif
void bl31_plat_runtime_setup(void)
{
#ifdef SPD_none
uint32_t flags;
int32_t rc;
flags = 0;
set_interrupt_rm_flag(flags, NON_SECURE);
rc = register_interrupt_type_handler(INTR_TYPE_S_EL1,
hikey_debug_fiq_handler,
flags);
if (rc != 0)
panic();
#endif
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment