Commit 2b9d1c050d291693f257c98605028325f8146c84
Exists in
master
and in
13 other branches
Merge branch 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm
Pull arm fixes from Russell King: "A number of fixes for the PJ4/iwmmxt changes which arm-soc forced me to take during the merge window. This stuff should have been better tested and sorted out *before* the merge window" * 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm: ARM: 8042/1: iwmmxt: allow to build iWMMXt on Marvell PJ4B ARM: 8041/1: pj4: fix cpu_is_pj4 check ARM: 8040/1: pj4: properly detect existence of iWMMXt coprocessor ARM: 8039/1: pj4: enable iWMMXt only if CONFIG_IWMMXT is set ARM: 8038/1: iwmmxt: explicitly check for supported architectures
Showing 5 changed files Side-by-side Diff
arch/arm/Kconfig
... | ... | @@ -1111,9 +1111,9 @@ |
1111 | 1111 | default 8 |
1112 | 1112 | |
1113 | 1113 | config IWMMXT |
1114 | - bool "Enable iWMMXt support" if !CPU_PJ4 | |
1115 | - depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 | |
1116 | - default y if PXA27x || PXA3xx || ARCH_MMP || CPU_PJ4 | |
1114 | + bool "Enable iWMMXt support" | |
1115 | + depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 || CPU_PJ4B | |
1116 | + default y if PXA27x || PXA3xx || ARCH_MMP || CPU_PJ4 || CPU_PJ4B | |
1117 | 1117 | help |
1118 | 1118 | Enable support for iWMMXt context switching at run time if |
1119 | 1119 | running on a CPU that supports it. |
arch/arm/include/asm/cputype.h
... | ... | @@ -222,23 +222,23 @@ |
222 | 222 | #endif |
223 | 223 | |
224 | 224 | /* |
225 | - * Marvell's PJ4 core is based on V7 version. It has some modification | |
226 | - * for coprocessor setting. For this reason, we need a way to distinguish | |
227 | - * it. | |
225 | + * Marvell's PJ4 and PJ4B cores are based on V7 version, | |
226 | + * but require a specical sequence for enabling coprocessors. | |
227 | + * For this reason, we need a way to distinguish them. | |
228 | 228 | */ |
229 | -#ifndef CONFIG_CPU_PJ4 | |
230 | -#define cpu_is_pj4() 0 | |
231 | -#else | |
229 | +#if defined(CONFIG_CPU_PJ4) || defined(CONFIG_CPU_PJ4B) | |
232 | 230 | static inline int cpu_is_pj4(void) |
233 | 231 | { |
234 | 232 | unsigned int id; |
235 | 233 | |
236 | 234 | id = read_cpuid_id(); |
237 | - if ((id & 0xfffffff0) == 0x562f5840) | |
235 | + if ((id & 0xff0fff00) == 0x560f5800) | |
238 | 236 | return 1; |
239 | 237 | |
240 | 238 | return 0; |
241 | 239 | } |
240 | +#else | |
241 | +#define cpu_is_pj4() 0 | |
242 | 242 | #endif |
243 | 243 | #endif |
arch/arm/kernel/Makefile
... | ... | @@ -79,6 +79,7 @@ |
79 | 79 | obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o |
80 | 80 | obj-$(CONFIG_CPU_MOHAWK) += xscale-cp0.o |
81 | 81 | obj-$(CONFIG_CPU_PJ4) += pj4-cp0.o |
82 | +obj-$(CONFIG_CPU_PJ4B) += pj4-cp0.o | |
82 | 83 | obj-$(CONFIG_IWMMXT) += iwmmxt.o |
83 | 84 | obj-$(CONFIG_PERF_EVENTS) += perf_regs.o |
84 | 85 | obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o perf_event_cpu.o |
arch/arm/kernel/iwmmxt.S
... | ... | @@ -19,12 +19,16 @@ |
19 | 19 | #include <asm/thread_info.h> |
20 | 20 | #include <asm/asm-offsets.h> |
21 | 21 | |
22 | -#if defined(CONFIG_CPU_PJ4) | |
22 | +#if defined(CONFIG_CPU_PJ4) || defined(CONFIG_CPU_PJ4B) | |
23 | 23 | #define PJ4(code...) code |
24 | 24 | #define XSC(code...) |
25 | -#else | |
25 | +#elif defined(CONFIG_CPU_MOHAWK) || \ | |
26 | + defined(CONFIG_CPU_XSC3) || \ | |
27 | + defined(CONFIG_CPU_XSCALE) | |
26 | 28 | #define PJ4(code...) |
27 | 29 | #define XSC(code...) code |
30 | +#else | |
31 | +#error "Unsupported iWMMXt architecture" | |
28 | 32 | #endif |
29 | 33 | |
30 | 34 | #define MMX_WR0 (0x00) |
arch/arm/kernel/pj4-cp0.c
... | ... | @@ -45,7 +45,7 @@ |
45 | 45 | return NOTIFY_DONE; |
46 | 46 | } |
47 | 47 | |
48 | -static struct notifier_block iwmmxt_notifier_block = { | |
48 | +static struct notifier_block __maybe_unused iwmmxt_notifier_block = { | |
49 | 49 | .notifier_call = iwmmxt_do, |
50 | 50 | }; |
51 | 51 | |
52 | 52 | |
53 | 53 | |
54 | 54 | |
55 | 55 | |
56 | 56 | |
... | ... | @@ -72,24 +72,60 @@ |
72 | 72 | : "=r" (temp) : "r" (value)); |
73 | 73 | } |
74 | 74 | |
75 | +static int __init pj4_get_iwmmxt_version(void) | |
76 | +{ | |
77 | + u32 cp_access, wcid; | |
75 | 78 | |
79 | + cp_access = pj4_cp_access_read(); | |
80 | + pj4_cp_access_write(cp_access | 0xf); | |
81 | + | |
82 | + /* check if coprocessor 0 and 1 are available */ | |
83 | + if ((pj4_cp_access_read() & 0xf) != 0xf) { | |
84 | + pj4_cp_access_write(cp_access); | |
85 | + return -ENODEV; | |
86 | + } | |
87 | + | |
88 | + /* read iWMMXt coprocessor id register p1, c0 */ | |
89 | + __asm__ __volatile__ ("mrc p1, 0, %0, c0, c0, 0\n" : "=r" (wcid)); | |
90 | + | |
91 | + pj4_cp_access_write(cp_access); | |
92 | + | |
93 | + /* iWMMXt v1 */ | |
94 | + if ((wcid & 0xffffff00) == 0x56051000) | |
95 | + return 1; | |
96 | + /* iWMMXt v2 */ | |
97 | + if ((wcid & 0xffffff00) == 0x56052000) | |
98 | + return 2; | |
99 | + | |
100 | + return -EINVAL; | |
101 | +} | |
102 | + | |
76 | 103 | /* |
77 | 104 | * Disable CP0/CP1 on boot, and let call_fpe() and the iWMMXt lazy |
78 | 105 | * switch code handle iWMMXt context switching. |
79 | 106 | */ |
80 | 107 | static int __init pj4_cp0_init(void) |
81 | 108 | { |
82 | - u32 cp_access; | |
109 | + u32 __maybe_unused cp_access; | |
110 | + int vers; | |
83 | 111 | |
84 | 112 | if (!cpu_is_pj4()) |
85 | 113 | return 0; |
86 | 114 | |
115 | + vers = pj4_get_iwmmxt_version(); | |
116 | + if (vers < 0) | |
117 | + return 0; | |
118 | + | |
119 | +#ifndef CONFIG_IWMMXT | |
120 | + pr_info("PJ4 iWMMXt coprocessor detected, but kernel support is missing.\n"); | |
121 | +#else | |
87 | 122 | cp_access = pj4_cp_access_read() & ~0xf; |
88 | 123 | pj4_cp_access_write(cp_access); |
89 | 124 | |
90 | - printk(KERN_INFO "PJ4 iWMMXt coprocessor enabled.\n"); | |
125 | + pr_info("PJ4 iWMMXt v%d coprocessor enabled.\n", vers); | |
91 | 126 | elf_hwcap |= HWCAP_IWMMXT; |
92 | 127 | thread_register_notifier(&iwmmxt_notifier_block); |
128 | +#endif | |
93 | 129 | |
94 | 130 | return 0; |
95 | 131 | } |