summaryrefslogtreecommitdiffstats
path: root/arch/arc/kernel/intc-compact.c
diff options
context:
space:
mode:
authorAlexey Brodkin <abrodkin@synopsys.com>2017-08-29 00:03:58 +0200
committerLinus Torvalds <torvalds@linux-foundation.org>2017-08-29 01:11:15 +0200
commite8206d2baa41a4c7cf4590929f8819f8309b564d (patch)
treea1e22d334fca7cc712a96d57ac62089ec00235b2 /arch/arc/kernel/intc-compact.c
parentfs/select: Fix memory corruption in compat_get_fd_set() (diff)
downloadlinux-e8206d2baa41a4c7cf4590929f8819f8309b564d.tar.xz
linux-e8206d2baa41a4c7cf4590929f8819f8309b564d.zip
ARCv2: SMP: Mask only private-per-core IRQ lines on boot at core intc
Recent commit a8ec3ee861b6 "arc: Mask individual IRQ lines during core INTC init" breaks interrupt handling on ARCv2 SMP systems. That commit masked all interrupts at onset, as some controllers on some boards (customer as well as internal), would assert interrutps early before any handlers were installed. For SMP systems, the masking was done at each cpu's core-intc. Later, when the IRQ was actually requested, it was unmasked, but only on the requesting cpu. For "common" interrupts, which were wired up from the 2nd level IDU intc, this was as issue as they needed to be enabled on ALL the cpus (given that IDU IRQs are by default served Round Robin across cpus) So fix that by NOT masking "common" interrupts at core-intc, but instead at the 2nd level IDU intc (latter already being done in idu_of_init()) Fixes: a8ec3ee861b6 ("arc: Mask individual IRQ lines during core INTC init") Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com> [vgupta: reworked changelog, removed the extraneous idu_irq_mask_raw()] Signed-off-by: Vineet Gupta <vgupta@synopsys.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/arc/kernel/intc-compact.c')
-rw-r--r--arch/arc/kernel/intc-compact.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/arc/kernel/intc-compact.c b/arch/arc/kernel/intc-compact.c
index cef388025adf..47b421fa0147 100644
--- a/arch/arc/kernel/intc-compact.c
+++ b/arch/arc/kernel/intc-compact.c
@@ -27,7 +27,7 @@
*/
void arc_init_IRQ(void)
{
- int level_mask = 0, i;
+ unsigned int level_mask = 0, i;
/* Is timer high priority Interrupt (Level2 in ARCompact jargon) */
level_mask |= IS_ENABLED(CONFIG_ARC_COMPACT_IRQ_LEVELS) << TIMER0_IRQ;