Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARC: SMP failed to boot due to missing IVT setup

Commit 05b016ecf5e7a "ARC: Setup Vector Table Base in early boot" moved
the Interrupt vector Table setup out of arc_init_IRQ() which is called
for all CPUs, to entry point of boot cpu only, breaking booting of others.

Fix by adding the same to entry point of non-boot CPUs too.

read_arc_build_cfg_regs() printing IVT Base Register didn't help the
casue since it prints a synthetic value if zero which is totally bogus,
so fix that to print the exact Register.

[vgupta: Remove the now stale comment from header of arc_init_IRQ and
also added the commentary for halt-on-reset]

Cc: Gilad Ben-Yossef <gilad@benyossef.com>
Cc: Cc: <stable@vger.kernel.org> #3.11
Signed-off-by: Noam Camus <noamc@ezchip.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Noam Camus and committed by
Linus Torvalds
c3567f8a d5d04bb4

+5 -5
-1
arch/arc/include/asm/sections.h
··· 11 11 12 12 #include <asm-generic/sections.h> 13 13 14 - extern char _int_vec_base_lds[]; 15 14 extern char __arc_dccm_base[]; 16 15 extern char __dtb_start[]; 17 16
+5
arch/arc/kernel/head.S
··· 34 34 ; IDENTITY Reg [ 3 2 1 0 ] 35 35 ; (cpu-id) ^^^ => Zero for UP ARC700 36 36 ; => #Core-ID if SMP (Master 0) 37 + ; Note that non-boot CPUs might not land here if halt-on-reset and 38 + ; instead breath life from @first_lines_of_secondary, but we still 39 + ; need to make sure only boot cpu takes this path. 37 40 GET_CPU_ID r5 38 41 cmp r5, 0 39 42 jnz arc_platform_smp_wait_to_boot ··· 100 97 .globl first_lines_of_secondary 101 98 102 99 first_lines_of_secondary: 100 + 101 + sr @_int_vec_base_lds, [AUX_INTR_VEC_BASE] 103 102 104 103 ; setup per-cpu idle task as "current" on this CPU 105 104 ld r0, [@secondary_idle_tsk]
-1
arch/arc/kernel/irq.c
··· 24 24 * -Needed for each CPU (hence not foldable into init_IRQ) 25 25 * 26 26 * what it does ? 27 - * -setup Vector Table Base Reg - in case Linux not linked at 0x8000_0000 28 27 * -Disable all IRQs (on CPU side) 29 28 * -Optionally, setup the High priority Interrupts as Level 2 IRQs 30 29 */
-3
arch/arc/kernel/setup.c
··· 47 47 READ_BCR(AUX_IDENTITY, cpu->core); 48 48 49 49 cpu->timers = read_aux_reg(ARC_REG_TIMERS_BCR); 50 - 51 50 cpu->vec_base = read_aux_reg(AUX_INTR_VEC_BASE); 52 - if (cpu->vec_base == 0) 53 - cpu->vec_base = (unsigned int)_int_vec_base_lds; 54 51 55 52 READ_BCR(ARC_REG_D_UNCACH_BCR, uncached_space); 56 53 cpu->uncached_base = uncached_space.start << 24;