diff options
author | Paul Mundt <lethal@linux-sh.org> | 2009-06-19 03:00:00 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2009-06-23 04:30:17 -0400 |
commit | 2eb2a4368273e123d2716a704c86f3130aa14c22 (patch) | |
tree | c76ee858fd5a17a983cd37e6881ebcfef3ab9cc7 | |
parent | b29fa1fbc210a51103c7a16af44df42cadce0361 (diff) |
sh: SH7786 SMP support.
SH7786 is roughly identical to SH-X3 proto SMP, though there are only 2
CPUs. This just wraps in to the existing SH-X3 SMP code with some minor
changes for SH7786, including wiring up the IPIs properly, enabling
IRQ_PER_CPU, and so forth.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
-rw-r--r-- | arch/sh/Kconfig | 7 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/Makefile | 6 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/setup-sh7786.c | 29 |
3 files changed, 18 insertions, 24 deletions
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 09c0aef31d03..eff0f2352c93 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -71,6 +71,9 @@ config GENERIC_HARDIRQS_NO__DO_IRQ | |||
71 | config GENERIC_IRQ_PROBE | 71 | config GENERIC_IRQ_PROBE |
72 | def_bool y | 72 | def_bool y |
73 | 73 | ||
74 | config IRQ_PER_CPU | ||
75 | def_bool y | ||
76 | |||
74 | config GENERIC_GPIO | 77 | config GENERIC_GPIO |
75 | def_bool n | 78 | def_bool n |
76 | 79 | ||
@@ -414,6 +417,8 @@ config CPU_SUBTYPE_SH7786 | |||
414 | select CPU_HAS_PTEAEX | 417 | select CPU_HAS_PTEAEX |
415 | select ARCH_SPARSEMEM_ENABLE | 418 | select ARCH_SPARSEMEM_ENABLE |
416 | select SYS_SUPPORTS_NUMA | 419 | select SYS_SUPPORTS_NUMA |
420 | select SYS_SUPPORTS_SMP | ||
421 | select GENERIC_CLOCKEVENTS_BROADCAST if SMP | ||
417 | 422 | ||
418 | config CPU_SUBTYPE_SHX3 | 423 | config CPU_SUBTYPE_SHX3 |
419 | bool "Support SH-X3 processor" | 424 | bool "Support SH-X3 processor" |
@@ -651,7 +656,7 @@ config NR_CPUS | |||
651 | int "Maximum number of CPUs (2-32)" | 656 | int "Maximum number of CPUs (2-32)" |
652 | range 2 32 | 657 | range 2 32 |
653 | depends on SMP | 658 | depends on SMP |
654 | default "4" if CPU_SHX3 | 659 | default "4" if CPU_SUBTYPE_SHX3 |
655 | default "2" | 660 | default "2" |
656 | help | 661 | help |
657 | This allows you to specify the maximum number of CPUs which this | 662 | This allows you to specify the maximum number of CPUs which this |
diff --git a/arch/sh/kernel/cpu/sh4a/Makefile b/arch/sh/kernel/cpu/sh4a/Makefile index 96ea09ca8cc1..ebdd391d5f42 100644 --- a/arch/sh/kernel/cpu/sh4a/Makefile +++ b/arch/sh/kernel/cpu/sh4a/Makefile | |||
@@ -16,7 +16,7 @@ obj-$(CONFIG_CPU_SUBTYPE_SH7366) += setup-sh7366.o | |||
16 | obj-$(CONFIG_CPU_SUBTYPE_SHX3) += setup-shx3.o | 16 | obj-$(CONFIG_CPU_SUBTYPE_SHX3) += setup-shx3.o |
17 | 17 | ||
18 | # SMP setup | 18 | # SMP setup |
19 | smp-$(CONFIG_CPU_SUBTYPE_SHX3) := smp-shx3.o | 19 | smp-$(CONFIG_CPU_SHX3) := smp-shx3.o |
20 | 20 | ||
21 | # Primary on-chip clocks (common) | 21 | # Primary on-chip clocks (common) |
22 | clock-$(CONFIG_CPU_SUBTYPE_SH7763) := clock-sh7763.o | 22 | clock-$(CONFIG_CPU_SUBTYPE_SH7763) := clock-sh7763.o |
@@ -38,6 +38,6 @@ pinmux-$(CONFIG_CPU_SUBTYPE_SH7724) := pinmux-sh7724.o | |||
38 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7785) := pinmux-sh7785.o | 38 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7785) := pinmux-sh7785.o |
39 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7786) := pinmux-sh7786.o | 39 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7786) := pinmux-sh7786.o |
40 | 40 | ||
41 | obj-y += $(clock-y) | 41 | obj-y += $(clock-y) |
42 | obj-$(CONFIG_SMP) += $(smp-y) | 42 | obj-$(CONFIG_SMP) += $(smp-y) |
43 | obj-$(CONFIG_GENERIC_GPIO) += $(pinmux-y) | 43 | obj-$(CONFIG_GENERIC_GPIO) += $(pinmux-y) |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c index 93e0d2c017e8..b70049470a0b 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c | |||
@@ -595,9 +595,8 @@ enum { | |||
595 | HSPI, | 595 | HSPI, |
596 | GPIO0, GPIO1, | 596 | GPIO0, GPIO1, |
597 | Thermal, | 597 | Thermal, |
598 | INTC0, INTC1, INTC2, INTC3, INTC4, INTC5, INTC6, INTC7, | 598 | INTICI0, INTICI1, INTICI2, INTICI3, |
599 | 599 | INTICI4, INTICI5, INTICI6, INTICI7, | |
600 | /* interrupt groups */ | ||
601 | }; | 600 | }; |
602 | 601 | ||
603 | static struct intc_vect vectors[] __initdata = { | 602 | static struct intc_vect vectors[] __initdata = { |
@@ -638,10 +637,12 @@ static struct intc_vect vectors[] __initdata = { | |||
638 | INTC_VECT(HSPI, 0xe80), | 637 | INTC_VECT(HSPI, 0xe80), |
639 | INTC_VECT(GPIO0, 0xea0), INTC_VECT(GPIO1, 0xec0), | 638 | INTC_VECT(GPIO0, 0xea0), INTC_VECT(GPIO1, 0xec0), |
640 | INTC_VECT(Thermal, 0xee0), | 639 | INTC_VECT(Thermal, 0xee0), |
640 | INTC_VECT(INTICI0, 0xf00), INTC_VECT(INTICI1, 0xf20), | ||
641 | INTC_VECT(INTICI2, 0xf40), INTC_VECT(INTICI3, 0xf60), | ||
642 | INTC_VECT(INTICI4, 0xf80), INTC_VECT(INTICI5, 0xfa0), | ||
643 | INTC_VECT(INTICI6, 0xfc0), INTC_VECT(INTICI7, 0xfe0), | ||
641 | }; | 644 | }; |
642 | 645 | ||
643 | /* FIXME: Main CPU support only now */ | ||
644 | #if 1 /* Main CPU */ | ||
645 | #define CnINTMSK0 0xfe410030 | 646 | #define CnINTMSK0 0xfe410030 |
646 | #define CnINTMSK1 0xfe410040 | 647 | #define CnINTMSK1 0xfe410040 |
647 | #define CnINTMSKCLR0 0xfe410050 | 648 | #define CnINTMSKCLR0 0xfe410050 |
@@ -654,21 +655,6 @@ static struct intc_vect vectors[] __initdata = { | |||
654 | #define CnINT2MSKCR1 0xfe410a34 | 655 | #define CnINT2MSKCR1 0xfe410a34 |
655 | #define CnINT2MSKCR2 0xfe410a38 | 656 | #define CnINT2MSKCR2 0xfe410a38 |
656 | #define CnINT2MSKCR3 0xfe410a3c | 657 | #define CnINT2MSKCR3 0xfe410a3c |
657 | #else /* Sub CPU */ | ||
658 | #define CnINTMSK0 0xfe410034 | ||
659 | #define CnINTMSK1 0xfe410044 | ||
660 | #define CnINTMSKCLR0 0xfe410054 | ||
661 | #define CnINTMSKCLR1 0xfe410064 | ||
662 | #define CnINT2MSKR0 0xfe410b20 | ||
663 | #define CnINT2MSKR1 0xfe410b24 | ||
664 | #define CnINT2MSKR2 0xfe410b28 | ||
665 | #define CnINT2MSKR3 0xfe410b2c | ||
666 | #define CnINT2MSKCR0 0xfe410b30 | ||
667 | #define CnINT2MSKCR1 0xfe410b34 | ||
668 | #define CnINT2MSKCR2 0xfe410b38 | ||
669 | #define CnINT2MSKCR3 0xfe410b3c | ||
670 | #endif | ||
671 | |||
672 | #define INTMSK2 0xfe410068 | 658 | #define INTMSK2 0xfe410068 |
673 | #define INTMSKCLR2 0xfe41006c | 659 | #define INTMSKCLR2 0xfe41006c |
674 | 660 | ||
@@ -753,6 +739,9 @@ static struct intc_prio_reg prio_registers[] __initdata = { | |||
753 | GPIO1, Thermal } }, | 739 | GPIO1, Thermal } }, |
754 | { 0xfe41085c, 0, 32, 8, /* INT2PRI23 */ { 0, 0, 0, 0 } }, | 740 | { 0xfe41085c, 0, 32, 8, /* INT2PRI23 */ { 0, 0, 0, 0 } }, |
755 | { 0xfe410860, 0, 32, 8, /* INT2PRI24 */ { 0, 0, 0, 0 } }, | 741 | { 0xfe410860, 0, 32, 8, /* INT2PRI24 */ { 0, 0, 0, 0 } }, |
742 | { 0xfe410090, 0xfe4100a0, 32, 4, /* CnICIPRI / CnICIPRICLR */ | ||
743 | { INTICI7, INTICI6, INTICI5, INTICI4, | ||
744 | INTICI3, INTICI2, INTICI1, INTICI0 }, INTC_SMP(4, 2) }, | ||
756 | }; | 745 | }; |
757 | 746 | ||
758 | static DECLARE_INTC_DESC(intc_desc, "sh7786", vectors, NULL, | 747 | static DECLARE_INTC_DESC(intc_desc, "sh7786", vectors, NULL, |