diff options
| -rw-r--r-- | arch/arm/Kconfig | 3 | ||||
| -rw-r--r-- | arch/arm/include/asm/cp15.h | 16 | ||||
| -rw-r--r-- | arch/arm/include/asm/cputype.h | 61 | ||||
| -rw-r--r-- | arch/arm/include/asm/glue-df.h | 20 | ||||
| -rw-r--r-- | arch/arm/kernel/head-common.S | 9 | ||||
| -rw-r--r-- | arch/arm/kernel/head-nommu.S | 8 | ||||
| -rw-r--r-- | arch/arm/kernel/setup.c | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/smp_scu.c | 2 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/id.c | 4 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap-smp.c | 2 | ||||
| -rw-r--r-- | arch/arm/mm/Kconfig | 9 | ||||
| -rw-r--r-- | arch/arm/mm/alignment.c | 2 | ||||
| -rw-r--r-- | arch/arm/mm/mmu.c | 17 |
13 files changed, 115 insertions, 40 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 5b714695b01b..dedf02b6f322 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -1684,8 +1684,9 @@ config SCHED_HRTICK | |||
| 1684 | def_bool HIGH_RES_TIMERS | 1684 | def_bool HIGH_RES_TIMERS |
| 1685 | 1685 | ||
| 1686 | config THUMB2_KERNEL | 1686 | config THUMB2_KERNEL |
| 1687 | bool "Compile the kernel in Thumb-2 mode" | 1687 | bool "Compile the kernel in Thumb-2 mode" if !CPU_THUMBONLY |
| 1688 | depends on CPU_V7 && !CPU_V6 && !CPU_V6K | 1688 | depends on CPU_V7 && !CPU_V6 && !CPU_V6K |
| 1689 | default y if CPU_THUMBONLY | ||
| 1689 | select AEABI | 1690 | select AEABI |
| 1690 | select ARM_ASM_UNIFIED | 1691 | select ARM_ASM_UNIFIED |
| 1691 | select ARM_UNWIND | 1692 | select ARM_UNWIND |
diff --git a/arch/arm/include/asm/cp15.h b/arch/arm/include/asm/cp15.h index 5ef4d8015a60..1f3262e99d81 100644 --- a/arch/arm/include/asm/cp15.h +++ b/arch/arm/include/asm/cp15.h | |||
| @@ -42,6 +42,8 @@ | |||
| 42 | #define vectors_high() (0) | 42 | #define vectors_high() (0) |
| 43 | #endif | 43 | #endif |
| 44 | 44 | ||
| 45 | #ifdef CONFIG_CPU_CP15 | ||
| 46 | |||
| 45 | extern unsigned long cr_no_alignment; /* defined in entry-armv.S */ | 47 | extern unsigned long cr_no_alignment; /* defined in entry-armv.S */ |
| 46 | extern unsigned long cr_alignment; /* defined in entry-armv.S */ | 48 | extern unsigned long cr_alignment; /* defined in entry-armv.S */ |
| 47 | 49 | ||
| @@ -82,6 +84,18 @@ static inline void set_copro_access(unsigned int val) | |||
| 82 | isb(); | 84 | isb(); |
| 83 | } | 85 | } |
| 84 | 86 | ||
| 85 | #endif | 87 | #else /* ifdef CONFIG_CPU_CP15 */ |
| 88 | |||
| 89 | /* | ||
| 90 | * cr_alignment and cr_no_alignment are tightly coupled to cp15 (at least in the | ||
| 91 | * minds of the developers). Yielding 0 for machines without a cp15 (and making | ||
| 92 | * it read-only) is fine for most cases and saves quite some #ifdeffery. | ||
| 93 | */ | ||
| 94 | #define cr_no_alignment UL(0) | ||
| 95 | #define cr_alignment UL(0) | ||
| 96 | |||
| 97 | #endif /* ifdef CONFIG_CPU_CP15 / else */ | ||
| 98 | |||
| 99 | #endif /* ifndef __ASSEMBLY__ */ | ||
| 86 | 100 | ||
| 87 | #endif | 101 | #endif |
diff --git a/arch/arm/include/asm/cputype.h b/arch/arm/include/asm/cputype.h index ad41ec2471e8..7652712d1d14 100644 --- a/arch/arm/include/asm/cputype.h +++ b/arch/arm/include/asm/cputype.h | |||
| @@ -38,6 +38,24 @@ | |||
| 38 | #define MPIDR_AFFINITY_LEVEL(mpidr, level) \ | 38 | #define MPIDR_AFFINITY_LEVEL(mpidr, level) \ |
| 39 | ((mpidr >> (MPIDR_LEVEL_BITS * level)) & MPIDR_LEVEL_MASK) | 39 | ((mpidr >> (MPIDR_LEVEL_BITS * level)) & MPIDR_LEVEL_MASK) |
| 40 | 40 | ||
| 41 | #define ARM_CPU_IMP_ARM 0x41 | ||
| 42 | #define ARM_CPU_IMP_INTEL 0x69 | ||
| 43 | |||
| 44 | #define ARM_CPU_PART_ARM1136 0xB360 | ||
| 45 | #define ARM_CPU_PART_ARM1156 0xB560 | ||
| 46 | #define ARM_CPU_PART_ARM1176 0xB760 | ||
| 47 | #define ARM_CPU_PART_ARM11MPCORE 0xB020 | ||
| 48 | #define ARM_CPU_PART_CORTEX_A8 0xC080 | ||
| 49 | #define ARM_CPU_PART_CORTEX_A9 0xC090 | ||
| 50 | #define ARM_CPU_PART_CORTEX_A5 0xC050 | ||
| 51 | #define ARM_CPU_PART_CORTEX_A15 0xC0F0 | ||
| 52 | #define ARM_CPU_PART_CORTEX_A7 0xC070 | ||
| 53 | |||
| 54 | #define ARM_CPU_XSCALE_ARCH_MASK 0xe000 | ||
| 55 | #define ARM_CPU_XSCALE_ARCH_V1 0x2000 | ||
| 56 | #define ARM_CPU_XSCALE_ARCH_V2 0x4000 | ||
| 57 | #define ARM_CPU_XSCALE_ARCH_V3 0x6000 | ||
| 58 | |||
| 41 | extern unsigned int processor_id; | 59 | extern unsigned int processor_id; |
| 42 | 60 | ||
| 43 | #ifdef CONFIG_CPU_CP15 | 61 | #ifdef CONFIG_CPU_CP15 |
| @@ -50,6 +68,7 @@ extern unsigned int processor_id; | |||
| 50 | : "cc"); \ | 68 | : "cc"); \ |
| 51 | __val; \ | 69 | __val; \ |
| 52 | }) | 70 | }) |
| 71 | |||
| 53 | #define read_cpuid_ext(ext_reg) \ | 72 | #define read_cpuid_ext(ext_reg) \ |
| 54 | ({ \ | 73 | ({ \ |
| 55 | unsigned int __val; \ | 74 | unsigned int __val; \ |
| @@ -59,29 +78,24 @@ extern unsigned int processor_id; | |||
| 59 | : "cc"); \ | 78 | : "cc"); \ |
| 60 | __val; \ | 79 | __val; \ |
| 61 | }) | 80 | }) |
| 62 | #else | ||
| 63 | #define read_cpuid(reg) (processor_id) | ||
| 64 | #define read_cpuid_ext(reg) 0 | ||
| 65 | #endif | ||
| 66 | 81 | ||
| 67 | #define ARM_CPU_IMP_ARM 0x41 | 82 | #else /* ifdef CONFIG_CPU_CP15 */ |
| 68 | #define ARM_CPU_IMP_INTEL 0x69 | ||
| 69 | 83 | ||
| 70 | #define ARM_CPU_PART_ARM1136 0xB360 | 84 | /* |
| 71 | #define ARM_CPU_PART_ARM1156 0xB560 | 85 | * read_cpuid and read_cpuid_ext should only ever be called on machines that |
| 72 | #define ARM_CPU_PART_ARM1176 0xB760 | 86 | * have cp15 so warn on other usages. |
| 73 | #define ARM_CPU_PART_ARM11MPCORE 0xB020 | 87 | */ |
| 74 | #define ARM_CPU_PART_CORTEX_A8 0xC080 | 88 | #define read_cpuid(reg) \ |
| 75 | #define ARM_CPU_PART_CORTEX_A9 0xC090 | 89 | ({ \ |
| 76 | #define ARM_CPU_PART_CORTEX_A5 0xC050 | 90 | WARN_ON_ONCE(1); \ |
| 77 | #define ARM_CPU_PART_CORTEX_A15 0xC0F0 | 91 | 0; \ |
| 78 | #define ARM_CPU_PART_CORTEX_A7 0xC070 | 92 | }) |
| 79 | 93 | ||
| 80 | #define ARM_CPU_XSCALE_ARCH_MASK 0xe000 | 94 | #define read_cpuid_ext(reg) read_cpuid(reg) |
| 81 | #define ARM_CPU_XSCALE_ARCH_V1 0x2000 | 95 | |
| 82 | #define ARM_CPU_XSCALE_ARCH_V2 0x4000 | 96 | #endif /* ifdef CONFIG_CPU_CP15 / else */ |
| 83 | #define ARM_CPU_XSCALE_ARCH_V3 0x6000 | ||
| 84 | 97 | ||
| 98 | #ifdef CONFIG_CPU_CP15 | ||
| 85 | /* | 99 | /* |
| 86 | * The CPU ID never changes at run time, so we might as well tell the | 100 | * The CPU ID never changes at run time, so we might as well tell the |
| 87 | * compiler that it's constant. Use this function to read the CPU ID | 101 | * compiler that it's constant. Use this function to read the CPU ID |
| @@ -92,6 +106,15 @@ static inline unsigned int __attribute_const__ read_cpuid_id(void) | |||
| 92 | return read_cpuid(CPUID_ID); | 106 | return read_cpuid(CPUID_ID); |
| 93 | } | 107 | } |
| 94 | 108 | ||
| 109 | #else /* ifdef CONFIG_CPU_CP15 */ | ||
| 110 | |||
| 111 | static inline unsigned int __attribute_const__ read_cpuid_id(void) | ||
| 112 | { | ||
| 113 | return processor_id; | ||
| 114 | } | ||
| 115 | |||
| 116 | #endif /* ifdef CONFIG_CPU_CP15 / else */ | ||
| 117 | |||
| 95 | static inline unsigned int __attribute_const__ read_cpuid_implementor(void) | 118 | static inline unsigned int __attribute_const__ read_cpuid_implementor(void) |
| 96 | { | 119 | { |
| 97 | return (read_cpuid_id() & 0xFF000000) >> 24; | 120 | return (read_cpuid_id() & 0xFF000000) >> 24; |
diff --git a/arch/arm/include/asm/glue-df.h b/arch/arm/include/asm/glue-df.h index 8cacbcda76da..b6e9f2c108b5 100644 --- a/arch/arm/include/asm/glue-df.h +++ b/arch/arm/include/asm/glue-df.h | |||
| @@ -18,12 +18,12 @@ | |||
| 18 | * ================ | 18 | * ================ |
| 19 | * | 19 | * |
| 20 | * We have the following to choose from: | 20 | * We have the following to choose from: |
| 21 | * arm6 - ARM6 style | ||
| 22 | * arm7 - ARM7 style | 21 | * arm7 - ARM7 style |
| 23 | * v4_early - ARMv4 without Thumb early abort handler | 22 | * v4_early - ARMv4 without Thumb early abort handler |
| 24 | * v4t_late - ARMv4 with Thumb late abort handler | 23 | * v4t_late - ARMv4 with Thumb late abort handler |
| 25 | * v4t_early - ARMv4 with Thumb early abort handler | 24 | * v4t_early - ARMv4 with Thumb early abort handler |
| 26 | * v5tej_early - ARMv5 with Thumb and Java early abort handler | 25 | * v5t_early - ARMv5 with Thumb early abort handler |
| 26 | * v5tj_early - ARMv5 with Thumb and Java early abort handler | ||
| 27 | * xscale - ARMv5 with Thumb with Xscale extensions | 27 | * xscale - ARMv5 with Thumb with Xscale extensions |
| 28 | * v6_early - ARMv6 generic early abort handler | 28 | * v6_early - ARMv6 generic early abort handler |
| 29 | * v7_early - ARMv7 generic early abort handler | 29 | * v7_early - ARMv7 generic early abort handler |
| @@ -39,19 +39,19 @@ | |||
| 39 | # endif | 39 | # endif |
| 40 | #endif | 40 | #endif |
| 41 | 41 | ||
| 42 | #ifdef CONFIG_CPU_ABRT_LV4T | 42 | #ifdef CONFIG_CPU_ABRT_EV4 |
| 43 | # ifdef CPU_DABORT_HANDLER | 43 | # ifdef CPU_DABORT_HANDLER |
| 44 | # define MULTI_DABORT 1 | 44 | # define MULTI_DABORT 1 |
| 45 | # else | 45 | # else |
| 46 | # define CPU_DABORT_HANDLER v4t_late_abort | 46 | # define CPU_DABORT_HANDLER v4_early_abort |
| 47 | # endif | 47 | # endif |
| 48 | #endif | 48 | #endif |
| 49 | 49 | ||
| 50 | #ifdef CONFIG_CPU_ABRT_EV4 | 50 | #ifdef CONFIG_CPU_ABRT_LV4T |
| 51 | # ifdef CPU_DABORT_HANDLER | 51 | # ifdef CPU_DABORT_HANDLER |
| 52 | # define MULTI_DABORT 1 | 52 | # define MULTI_DABORT 1 |
| 53 | # else | 53 | # else |
| 54 | # define CPU_DABORT_HANDLER v4_early_abort | 54 | # define CPU_DABORT_HANDLER v4t_late_abort |
| 55 | # endif | 55 | # endif |
| 56 | #endif | 56 | #endif |
| 57 | 57 | ||
| @@ -63,19 +63,19 @@ | |||
| 63 | # endif | 63 | # endif |
| 64 | #endif | 64 | #endif |
| 65 | 65 | ||
| 66 | #ifdef CONFIG_CPU_ABRT_EV5TJ | 66 | #ifdef CONFIG_CPU_ABRT_EV5T |
| 67 | # ifdef CPU_DABORT_HANDLER | 67 | # ifdef CPU_DABORT_HANDLER |
| 68 | # define MULTI_DABORT 1 | 68 | # define MULTI_DABORT 1 |
| 69 | # else | 69 | # else |
| 70 | # define CPU_DABORT_HANDLER v5tj_early_abort | 70 | # define CPU_DABORT_HANDLER v5t_early_abort |
| 71 | # endif | 71 | # endif |
| 72 | #endif | 72 | #endif |
| 73 | 73 | ||
| 74 | #ifdef CONFIG_CPU_ABRT_EV5T | 74 | #ifdef CONFIG_CPU_ABRT_EV5TJ |
| 75 | # ifdef CPU_DABORT_HANDLER | 75 | # ifdef CPU_DABORT_HANDLER |
| 76 | # define MULTI_DABORT 1 | 76 | # define MULTI_DABORT 1 |
| 77 | # else | 77 | # else |
| 78 | # define CPU_DABORT_HANDLER v5t_early_abort | 78 | # define CPU_DABORT_HANDLER v5tj_early_abort |
| 79 | # endif | 79 | # endif |
| 80 | #endif | 80 | #endif |
| 81 | 81 | ||
diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S index 854bd22380d3..5b391a689b47 100644 --- a/arch/arm/kernel/head-common.S +++ b/arch/arm/kernel/head-common.S | |||
| @@ -98,8 +98,9 @@ __mmap_switched: | |||
| 98 | str r9, [r4] @ Save processor ID | 98 | str r9, [r4] @ Save processor ID |
| 99 | str r1, [r5] @ Save machine type | 99 | str r1, [r5] @ Save machine type |
| 100 | str r2, [r6] @ Save atags pointer | 100 | str r2, [r6] @ Save atags pointer |
| 101 | bic r4, r0, #CR_A @ Clear 'A' bit | 101 | cmp r7, #0 |
| 102 | stmia r7, {r0, r4} @ Save control register values | 102 | bicne r4, r0, #CR_A @ Clear 'A' bit |
| 103 | stmneia r7, {r0, r4} @ Save control register values | ||
| 103 | b start_kernel | 104 | b start_kernel |
| 104 | ENDPROC(__mmap_switched) | 105 | ENDPROC(__mmap_switched) |
| 105 | 106 | ||
| @@ -113,7 +114,11 @@ __mmap_switched_data: | |||
| 113 | .long processor_id @ r4 | 114 | .long processor_id @ r4 |
| 114 | .long __machine_arch_type @ r5 | 115 | .long __machine_arch_type @ r5 |
| 115 | .long __atags_pointer @ r6 | 116 | .long __atags_pointer @ r6 |
| 117 | #ifdef CONFIG_CPU_CP15 | ||
| 116 | .long cr_alignment @ r7 | 118 | .long cr_alignment @ r7 |
| 119 | #else | ||
| 120 | .long 0 @ r7 | ||
| 121 | #endif | ||
| 117 | .long init_thread_union + THREAD_START_SP @ sp | 122 | .long init_thread_union + THREAD_START_SP @ sp |
| 118 | .size __mmap_switched_data, . - __mmap_switched_data | 123 | .size __mmap_switched_data, . - __mmap_switched_data |
| 119 | 124 | ||
diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index 2c228a07e58c..6a2e09c952c7 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S | |||
| @@ -32,15 +32,21 @@ | |||
| 32 | * numbers for r1. | 32 | * numbers for r1. |
| 33 | * | 33 | * |
| 34 | */ | 34 | */ |
| 35 | .arm | ||
| 36 | 35 | ||
| 37 | __HEAD | 36 | __HEAD |
| 37 | |||
| 38 | #ifdef CONFIG_CPU_THUMBONLY | ||
| 39 | .thumb | ||
| 40 | ENTRY(stext) | ||
| 41 | #else | ||
| 42 | .arm | ||
| 38 | ENTRY(stext) | 43 | ENTRY(stext) |
| 39 | 44 | ||
| 40 | THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM. | 45 | THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM. |
| 41 | THUMB( bx r9 ) @ If this is a Thumb-2 kernel, | 46 | THUMB( bx r9 ) @ If this is a Thumb-2 kernel, |
| 42 | THUMB( .thumb ) @ switch to Thumb now. | 47 | THUMB( .thumb ) @ switch to Thumb now. |
| 43 | THUMB(1: ) | 48 | THUMB(1: ) |
| 49 | #endif | ||
| 44 | 50 | ||
| 45 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode | 51 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode |
| 46 | @ and irqs disabled | 52 | @ and irqs disabled |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 3f6cbb2e3eda..1cc9e1796415 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
| @@ -291,10 +291,10 @@ static int cpu_has_aliasing_icache(unsigned int arch) | |||
| 291 | 291 | ||
| 292 | static void __init cacheid_init(void) | 292 | static void __init cacheid_init(void) |
| 293 | { | 293 | { |
| 294 | unsigned int cachetype = read_cpuid_cachetype(); | ||
| 295 | unsigned int arch = cpu_architecture(); | 294 | unsigned int arch = cpu_architecture(); |
| 296 | 295 | ||
| 297 | if (arch >= CPU_ARCH_ARMv6) { | 296 | if (arch >= CPU_ARCH_ARMv6) { |
| 297 | unsigned int cachetype = read_cpuid_cachetype(); | ||
| 298 | if ((cachetype & (7 << 29)) == 4 << 29) { | 298 | if ((cachetype & (7 << 29)) == 4 << 29) { |
| 299 | /* ARMv7 register format */ | 299 | /* ARMv7 register format */ |
| 300 | arch = CPU_ARCH_ARMv7; | 300 | arch = CPU_ARCH_ARMv7; |
diff --git a/arch/arm/kernel/smp_scu.c b/arch/arm/kernel/smp_scu.c index 45eac87ed66a..5bc1a63284e3 100644 --- a/arch/arm/kernel/smp_scu.c +++ b/arch/arm/kernel/smp_scu.c | |||
| @@ -41,7 +41,7 @@ void scu_enable(void __iomem *scu_base) | |||
| 41 | 41 | ||
| 42 | #ifdef CONFIG_ARM_ERRATA_764369 | 42 | #ifdef CONFIG_ARM_ERRATA_764369 |
| 43 | /* Cortex-A9 only */ | 43 | /* Cortex-A9 only */ |
| 44 | if ((read_cpuid(CPUID_ID) & 0xff0ffff0) == 0x410fc090) { | 44 | if ((read_cpuid_id() & 0xff0ffff0) == 0x410fc090) { |
| 45 | scu_ctrl = __raw_readl(scu_base + 0x30); | 45 | scu_ctrl = __raw_readl(scu_base + 0x30); |
| 46 | if (!(scu_ctrl & 1)) | 46 | if (!(scu_ctrl & 1)) |
| 47 | __raw_writel(scu_ctrl | 0x1, scu_base + 0x30); | 47 | __raw_writel(scu_ctrl | 0x1, scu_base + 0x30); |
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 8a68f1ec66b9..577298ed5a44 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c | |||
| @@ -300,7 +300,7 @@ void __init omap3xxx_check_revision(void) | |||
| 300 | * If the processor type is Cortex-A8 and the revision is 0x0 | 300 | * If the processor type is Cortex-A8 and the revision is 0x0 |
| 301 | * it means its Cortex r0p0 which is 3430 ES1.0. | 301 | * it means its Cortex r0p0 which is 3430 ES1.0. |
| 302 | */ | 302 | */ |
| 303 | cpuid = read_cpuid(CPUID_ID); | 303 | cpuid = read_cpuid_id(); |
| 304 | if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) { | 304 | if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) { |
| 305 | omap_revision = OMAP3430_REV_ES1_0; | 305 | omap_revision = OMAP3430_REV_ES1_0; |
| 306 | cpu_rev = "1.0"; | 306 | cpu_rev = "1.0"; |
| @@ -460,7 +460,7 @@ void __init omap4xxx_check_revision(void) | |||
| 460 | * Use ARM register to detect the correct ES version | 460 | * Use ARM register to detect the correct ES version |
| 461 | */ | 461 | */ |
| 462 | if (!rev && (hawkeye != 0xb94e) && (hawkeye != 0xb975)) { | 462 | if (!rev && (hawkeye != 0xb94e) && (hawkeye != 0xb975)) { |
| 463 | idcode = read_cpuid(CPUID_ID); | 463 | idcode = read_cpuid_id(); |
| 464 | rev = (idcode & 0xf) - 1; | 464 | rev = (idcode & 0xf) - 1; |
| 465 | } | 465 | } |
| 466 | 466 | ||
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index d9727218dd0a..7f5626d8fd3e 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c | |||
| @@ -209,7 +209,7 @@ static void __init omap4_smp_init_cpus(void) | |||
| 209 | unsigned int i = 0, ncores = 1, cpu_id; | 209 | unsigned int i = 0, ncores = 1, cpu_id; |
| 210 | 210 | ||
| 211 | /* Use ARM cpuid check here, as SoC detection will not work so early */ | 211 | /* Use ARM cpuid check here, as SoC detection will not work so early */ |
| 212 | cpu_id = read_cpuid(CPUID_ID) & CPU_MASK; | 212 | cpu_id = read_cpuid_id() & CPU_MASK; |
| 213 | if (cpu_id == CPU_CORTEX_A9) { | 213 | if (cpu_id == CPU_CORTEX_A9) { |
| 214 | /* | 214 | /* |
| 215 | * Currently we can't call ioremap here because | 215 | * Currently we can't call ioremap here because |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 025d17328730..cb812a13e299 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
| @@ -397,6 +397,13 @@ config CPU_V7 | |||
| 397 | select CPU_PABRT_V7 | 397 | select CPU_PABRT_V7 |
| 398 | select CPU_TLB_V7 if MMU | 398 | select CPU_TLB_V7 if MMU |
| 399 | 399 | ||
| 400 | config CPU_THUMBONLY | ||
| 401 | bool | ||
| 402 | # There are no CPUs available with MMU that don't implement an ARM ISA: | ||
| 403 | depends on !MMU | ||
| 404 | help | ||
| 405 | Select this if your CPU doesn't support the 32 bit ARM instructions. | ||
| 406 | |||
| 400 | # Figure out what processor architecture version we should be using. | 407 | # Figure out what processor architecture version we should be using. |
| 401 | # This defines the compiler instruction set which depends on the machine type. | 408 | # This defines the compiler instruction set which depends on the machine type. |
| 402 | config CPU_32v3 | 409 | config CPU_32v3 |
| @@ -608,7 +615,7 @@ config ARCH_DMA_ADDR_T_64BIT | |||
| 608 | bool | 615 | bool |
| 609 | 616 | ||
| 610 | config ARM_THUMB | 617 | config ARM_THUMB |
| 611 | bool "Support Thumb user binaries" | 618 | bool "Support Thumb user binaries" if !CPU_THUMBONLY |
| 612 | depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V6K || CPU_V7 || CPU_FEROCEON | 619 | depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V6K || CPU_V7 || CPU_FEROCEON |
| 613 | default y | 620 | default y |
| 614 | help | 621 | help |
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index db26e2e543f4..6f4585b89078 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c | |||
| @@ -961,12 +961,14 @@ static int __init alignment_init(void) | |||
| 961 | return -ENOMEM; | 961 | return -ENOMEM; |
| 962 | #endif | 962 | #endif |
| 963 | 963 | ||
| 964 | #ifdef CONFIG_CPU_CP15 | ||
| 964 | if (cpu_is_v6_unaligned()) { | 965 | if (cpu_is_v6_unaligned()) { |
| 965 | cr_alignment &= ~CR_A; | 966 | cr_alignment &= ~CR_A; |
| 966 | cr_no_alignment &= ~CR_A; | 967 | cr_no_alignment &= ~CR_A; |
| 967 | set_cr(cr_alignment); | 968 | set_cr(cr_alignment); |
| 968 | ai_usermode = safe_usermode(ai_usermode, false); | 969 | ai_usermode = safe_usermode(ai_usermode, false); |
| 969 | } | 970 | } |
| 971 | #endif | ||
| 970 | 972 | ||
| 971 | hook_fault_code(FAULT_CODE_ALIGNMENT, do_alignment, SIGBUS, BUS_ADRALN, | 973 | hook_fault_code(FAULT_CODE_ALIGNMENT, do_alignment, SIGBUS, BUS_ADRALN, |
| 972 | "alignment exception"); | 974 | "alignment exception"); |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index e95a996ab78f..c6d45c87540e 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -112,6 +112,7 @@ static struct cachepolicy cache_policies[] __initdata = { | |||
| 112 | } | 112 | } |
| 113 | }; | 113 | }; |
| 114 | 114 | ||
| 115 | #ifdef CONFIG_CPU_CP15 | ||
| 115 | /* | 116 | /* |
| 116 | * These are useful for identifying cache coherency | 117 | * These are useful for identifying cache coherency |
| 117 | * problems by allowing the cache or the cache and | 118 | * problems by allowing the cache or the cache and |
| @@ -210,6 +211,22 @@ void adjust_cr(unsigned long mask, unsigned long set) | |||
| 210 | } | 211 | } |
| 211 | #endif | 212 | #endif |
| 212 | 213 | ||
| 214 | #else /* ifdef CONFIG_CPU_CP15 */ | ||
| 215 | |||
| 216 | static int __init early_cachepolicy(char *p) | ||
| 217 | { | ||
| 218 | pr_warning("cachepolicy kernel parameter not supported without cp15\n"); | ||
| 219 | } | ||
| 220 | early_param("cachepolicy", early_cachepolicy); | ||
| 221 | |||
| 222 | static int __init noalign_setup(char *__unused) | ||
| 223 | { | ||
| 224 | pr_warning("noalign kernel parameter not supported without cp15\n"); | ||
| 225 | } | ||
| 226 | __setup("noalign", noalign_setup); | ||
| 227 | |||
| 228 | #endif /* ifdef CONFIG_CPU_CP15 / else */ | ||
| 229 | |||
| 213 | #define PROT_PTE_DEVICE L_PTE_PRESENT|L_PTE_YOUNG|L_PTE_DIRTY|L_PTE_XN | 230 | #define PROT_PTE_DEVICE L_PTE_PRESENT|L_PTE_YOUNG|L_PTE_DIRTY|L_PTE_XN |
| 214 | #define PROT_SECT_DEVICE PMD_TYPE_SECT|PMD_SECT_AP_WRITE | 231 | #define PROT_SECT_DEVICE PMD_TYPE_SECT|PMD_SECT_AP_WRITE |
| 215 | 232 | ||
