summaryrefslogtreecommitdiff
path: root/arch/arc
diff options
context:
space:
mode:
authorYuriy Kolerov <yuriy.kolerov@synopsys.com>2017-01-31 14:45:24 +0300
committerVineet Gupta <vgupta@synopsys.com>2017-02-06 20:37:57 +0300
commitbe568e78dbb35383fdfd0563fd0cfbbff1bc42d0 (patch)
tree229b345bd67a0f444d801b6ab2544ba98e4d4c2c /arch/arc
parent179cf194e6d153fb6daeca811253502d5c84e4c8 (diff)
downloadlinux-be568e78dbb35383fdfd0563fd0cfbbff1bc42d0.tar.xz
ARCv2: intc: Set default priority for all core interrupts
After reset all interrupts in the core interrupt controller has the highest priority P0. If the platform supports Fast IRQs and has more than 1 banks of registers then CPU automatically switch banks of registers when P0 interrupt comes. The problem is that the kernel expects that by default switching of banks is not used by all interrupts. It is necessary to set a default nonzero priority for all available interrupts to avoid undefined behaviour. Signed-off-by: Yuriy Kolerov <yuriy.kolerov@synopsys.com> Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Diffstat (limited to 'arch/arc')
-rw-r--r--arch/arc/kernel/intc-arcv2.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/arc/kernel/intc-arcv2.c b/arch/arc/kernel/intc-arcv2.c
index 4d3166f9bbc9..f928795fd07a 100644
--- a/arch/arc/kernel/intc-arcv2.c
+++ b/arch/arc/kernel/intc-arcv2.c
@@ -32,7 +32,7 @@ struct bcr_irq_arcv2 {
*/
void arc_init_IRQ(void)
{
- unsigned int tmp, irq_prio;
+ unsigned int tmp, irq_prio, i;
struct bcr_irq_arcv2 irq_bcr;
struct aux_irq_ctrl {
@@ -71,6 +71,16 @@ void arc_init_IRQ(void)
irq_prio + 1, ARCV2_IRQ_DEF_PRIO,
irq_bcr.firq ? " FIRQ (not used)":"");
+ /*
+ * Set a default priority for all available interrupts to prevent
+ * switching of register banks if Fast IRQ and multiple register banks
+ * are supported by CPU.
+ */
+ for (i = NR_EXCEPTIONS; i < irq_bcr.irqs + NR_EXCEPTIONS; i++) {
+ write_aux_reg(AUX_IRQ_SELECT, i);
+ write_aux_reg(AUX_IRQ_PRIORITY, ARCV2_IRQ_DEF_PRIO);
+ }
+
/* setup status32, don't enable intr yet as kernel doesn't want */
tmp = read_aux_reg(ARC_REG_STATUS32);
tmp |= STATUS_AD_MASK | (ARCV2_IRQ_DEF_PRIO << 1);