Merge branch 'swp' (early part) into for-next
This commit is contained in:
commit
c89c3a6acb
|
@ -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)
|
||||||
#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 @@
|
||||||
#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 = {
|
||||||
*/
|
*/
|
||||||
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
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue