Commit c89c3a6a authored by Russell King's avatar Russell King

Merge branch 'swp' (early part) into for-next

parents 71095615 58171bf2
...@@ -393,19 +393,34 @@ static void __init cpuid_init_hwcaps(void) ...@@ -393,19 +393,34 @@ static void __init cpuid_init_hwcaps(void)
elf_hwcap |= HWCAP_LPAE; elf_hwcap |= HWCAP_LPAE;
} }
static void __init feat_v6_fixup(void) static void __init elf_hwcap_fixup(void)
{ {
int id = read_cpuid_id(); unsigned id = read_cpuid_id();
unsigned sync_prim;
if ((id & 0xff0f0000) != 0x41070000)
return;
/* /*
* HWCAP_TLS is available only on 1136 r1p0 and later, * HWCAP_TLS is available only on 1136 r1p0 and later,
* see also kuser_get_tls_init. * see also kuser_get_tls_init.
*/ */
if ((((id >> 4) & 0xfff) == 0xb36) && (((id >> 20) & 3) == 0)) if (read_cpuid_part() == ARM_CPU_PART_ARM1136 &&
((id >> 20) & 3) == 0) {
elf_hwcap &= ~HWCAP_TLS; elf_hwcap &= ~HWCAP_TLS;
return;
}
/* Verify if CPUID scheme is implemented */
if ((id & 0x000f0000) != 0x000f0000)
return;
/*
* If the CPU supports LDREX/STREX and LDREXB/STREXB,
* avoid advertising SWP; it may not be atomic with
* multiprocessing cores.
*/
sync_prim = ((read_cpuid_ext(CPUID_EXT_ISAR3) >> 8) & 0xf0) |
((read_cpuid_ext(CPUID_EXT_ISAR4) >> 20) & 0x0f);
if (sync_prim >= 0x13)
elf_hwcap &= ~HWCAP_SWP;
} }
/* /*
...@@ -609,7 +624,7 @@ static void __init setup_processor(void) ...@@ -609,7 +624,7 @@ static void __init setup_processor(void)
#endif #endif
erratum_a15_798181_init(); erratum_a15_798181_init();
feat_v6_fixup(); elf_hwcap_fixup();
cacheid_init(); cacheid_init();
cpu_init(); cpu_init();
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/perf_event.h> #include <linux/perf_event.h>
#include <asm/opcodes.h> #include <asm/opcodes.h>
#include <asm/system_info.h>
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
...@@ -266,6 +267,9 @@ static struct undef_hook swp_hook = { ...@@ -266,6 +267,9 @@ static struct undef_hook swp_hook = {
*/ */
static int __init swp_emulation_init(void) static int __init swp_emulation_init(void)
{ {
if (cpu_architecture() < CPU_ARCH_ARMv7)
return 0;
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
if (!proc_create("cpu/swp_emulation", S_IRUGO, NULL, &proc_status_fops)) if (!proc_create("cpu/swp_emulation", S_IRUGO, NULL, &proc_status_fops))
return -ENOMEM; return -ENOMEM;
......
...@@ -669,7 +669,7 @@ config ARM_VIRT_EXT ...@@ -669,7 +669,7 @@ config ARM_VIRT_EXT
details. details.
config SWP_EMULATE config SWP_EMULATE
bool "Emulate SWP/SWPB instructions" bool "Emulate SWP/SWPB instructions" if !SMP
depends on CPU_V7 depends on CPU_V7
default y if SMP default y if SMP
select HAVE_PROC_CPU if PROC_FS select HAVE_PROC_CPU if PROC_FS
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment