diff options
| -rw-r--r-- | arch/arm/mm/Kconfig | 5 | ||||
| -rw-r--r-- | arch/arm/mm/Makefile | 1 | ||||
| -rw-r--r-- | arch/arm/mm/proc-v7.S | 2 | ||||
| -rw-r--r-- | arch/arm/mm/tlb-v7.S | 88 | ||||
| -rw-r--r-- | include/asm-arm/tlbflush.h | 13 |
5 files changed, 107 insertions, 2 deletions
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 5f472a8b406a..e7904bc92c73 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
| @@ -379,7 +379,7 @@ config CPU_V7 | |||
| 379 | select CPU_CP15_MMU | 379 | select CPU_CP15_MMU |
| 380 | select CPU_HAS_ASID | 380 | select CPU_HAS_ASID |
| 381 | select CPU_COPY_V6 if MMU | 381 | select CPU_COPY_V6 if MMU |
| 382 | select CPU_TLB_V6 if MMU | 382 | select CPU_TLB_V7 if MMU |
| 383 | 383 | ||
| 384 | # Figure out what processor architecture version we should be using. | 384 | # Figure out what processor architecture version we should be using. |
| 385 | # This defines the compiler instruction set which depends on the machine type. | 385 | # This defines the compiler instruction set which depends on the machine type. |
| @@ -498,6 +498,9 @@ config CPU_TLB_V4WBI | |||
| 498 | config CPU_TLB_V6 | 498 | config CPU_TLB_V6 |
| 499 | bool | 499 | bool |
| 500 | 500 | ||
| 501 | config CPU_TLB_V7 | ||
| 502 | bool | ||
| 503 | |||
| 501 | endif | 504 | endif |
| 502 | 505 | ||
| 503 | config CPU_HAS_ASID | 506 | config CPU_HAS_ASID |
diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile index b5bd335ff14a..762702765fc3 100644 --- a/arch/arm/mm/Makefile +++ b/arch/arm/mm/Makefile | |||
| @@ -46,6 +46,7 @@ obj-$(CONFIG_CPU_TLB_V4WT) += tlb-v4.o | |||
| 46 | obj-$(CONFIG_CPU_TLB_V4WB) += tlb-v4wb.o | 46 | obj-$(CONFIG_CPU_TLB_V4WB) += tlb-v4wb.o |
| 47 | obj-$(CONFIG_CPU_TLB_V4WBI) += tlb-v4wbi.o | 47 | obj-$(CONFIG_CPU_TLB_V4WBI) += tlb-v4wbi.o |
| 48 | obj-$(CONFIG_CPU_TLB_V6) += tlb-v6.o | 48 | obj-$(CONFIG_CPU_TLB_V6) += tlb-v6.o |
| 49 | obj-$(CONFIG_CPU_TLB_V7) += tlb-v7.o | ||
| 49 | 50 | ||
| 50 | obj-$(CONFIG_CPU_ARM610) += proc-arm6_7.o | 51 | obj-$(CONFIG_CPU_ARM610) += proc-arm6_7.o |
| 51 | obj-$(CONFIG_CPU_ARM710) += proc-arm6_7.o | 52 | obj-$(CONFIG_CPU_ARM710) += proc-arm6_7.o |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index dd823dd4a374..718f4782ee8b 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
| @@ -256,7 +256,7 @@ __v7_proc_info: | |||
| 256 | .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP | 256 | .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP |
| 257 | .long cpu_v7_name | 257 | .long cpu_v7_name |
| 258 | .long v7_processor_functions | 258 | .long v7_processor_functions |
| 259 | .long v6wbi_tlb_fns | 259 | .long v7wbi_tlb_fns |
| 260 | .long v6_user_fns | 260 | .long v6_user_fns |
| 261 | .long v7_cache_fns | 261 | .long v7_cache_fns |
| 262 | .size __v7_proc_info, . - __v7_proc_info | 262 | .size __v7_proc_info, . - __v7_proc_info |
diff --git a/arch/arm/mm/tlb-v7.S b/arch/arm/mm/tlb-v7.S new file mode 100644 index 000000000000..b56dda8052f7 --- /dev/null +++ b/arch/arm/mm/tlb-v7.S | |||
| @@ -0,0 +1,88 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/arm/mm/tlb-v7.S | ||
| 3 | * | ||
| 4 | * Copyright (C) 1997-2002 Russell King | ||
| 5 | * Modified for ARMv7 by Catalin Marinas | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | * | ||
| 11 | * ARM architecture version 6 TLB handling functions. | ||
| 12 | * These assume a split I/D TLB. | ||
| 13 | */ | ||
| 14 | #include <linux/linkage.h> | ||
| 15 | #include <asm/asm-offsets.h> | ||
| 16 | #include <asm/page.h> | ||
| 17 | #include <asm/tlbflush.h> | ||
| 18 | #include "proc-macros.S" | ||
| 19 | |||
| 20 | /* | ||
| 21 | * v7wbi_flush_user_tlb_range(start, end, vma) | ||
| 22 | * | ||
| 23 | * Invalidate a range of TLB entries in the specified address space. | ||
| 24 | * | ||
| 25 | * - start - start address (may not be aligned) | ||
| 26 | * - end - end address (exclusive, may not be aligned) | ||
| 27 | * - vma - vma_struct describing address range | ||
| 28 | * | ||
| 29 | * It is assumed that: | ||
| 30 | * - the "Invalidate single entry" instruction will invalidate | ||
| 31 | * both the I and the D TLBs on Harvard-style TLBs | ||
| 32 | */ | ||
| 33 | ENTRY(v7wbi_flush_user_tlb_range) | ||
| 34 | vma_vm_mm r3, r2 @ get vma->vm_mm | ||
| 35 | mmid r3, r3 @ get vm_mm->context.id | ||
| 36 | dsb | ||
| 37 | mov r0, r0, lsr #PAGE_SHIFT @ align address | ||
| 38 | mov r1, r1, lsr #PAGE_SHIFT | ||
| 39 | asid r3, r3 @ mask ASID | ||
| 40 | orr r0, r3, r0, lsl #PAGE_SHIFT @ Create initial MVA | ||
| 41 | mov r1, r1, lsl #PAGE_SHIFT | ||
| 42 | vma_vm_flags r2, r2 @ get vma->vm_flags | ||
| 43 | 1: | ||
| 44 | mcr p15, 0, r0, c8, c6, 1 @ TLB invalidate D MVA (was 1) | ||
| 45 | tst r2, #VM_EXEC @ Executable area ? | ||
| 46 | mcrne p15, 0, r0, c8, c5, 1 @ TLB invalidate I MVA (was 1) | ||
| 47 | add r0, r0, #PAGE_SZ | ||
| 48 | cmp r0, r1 | ||
| 49 | blo 1b | ||
| 50 | mov ip, #0 | ||
| 51 | mcr p15, 0, ip, c7, c5, 6 @ flush BTAC/BTB | ||
| 52 | dsb | ||
| 53 | mov pc, lr | ||
| 54 | |||
| 55 | /* | ||
| 56 | * v7wbi_flush_kern_tlb_range(start,end) | ||
| 57 | * | ||
| 58 | * Invalidate a range of kernel TLB entries | ||
| 59 | * | ||
| 60 | * - start - start address (may not be aligned) | ||
| 61 | * - end - end address (exclusive, may not be aligned) | ||
| 62 | */ | ||
| 63 | ENTRY(v7wbi_flush_kern_tlb_range) | ||
| 64 | dsb | ||
| 65 | mov r0, r0, lsr #PAGE_SHIFT @ align address | ||
| 66 | mov r1, r1, lsr #PAGE_SHIFT | ||
| 67 | mov r0, r0, lsl #PAGE_SHIFT | ||
| 68 | mov r1, r1, lsl #PAGE_SHIFT | ||
| 69 | 1: | ||
| 70 | mcr p15, 0, r0, c8, c6, 1 @ TLB invalidate D MVA | ||
| 71 | mcr p15, 0, r0, c8, c5, 1 @ TLB invalidate I MVA | ||
| 72 | add r0, r0, #PAGE_SZ | ||
| 73 | cmp r0, r1 | ||
| 74 | blo 1b | ||
| 75 | mov r2, #0 | ||
| 76 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | ||
| 77 | dsb | ||
| 78 | isb | ||
| 79 | mov pc, lr | ||
| 80 | |||
| 81 | .section ".text.init", #alloc, #execinstr | ||
| 82 | |||
| 83 | .type v7wbi_tlb_fns, #object | ||
| 84 | ENTRY(v7wbi_tlb_fns) | ||
| 85 | .long v7wbi_flush_user_tlb_range | ||
| 86 | .long v7wbi_flush_kern_tlb_range | ||
| 87 | .long v6wbi_tlb_flags | ||
| 88 | .size v7wbi_tlb_fns, . - v7wbi_tlb_fns | ||
diff --git a/include/asm-arm/tlbflush.h b/include/asm-arm/tlbflush.h index ccd0de010e81..71be4fded7e2 100644 --- a/include/asm-arm/tlbflush.h +++ b/include/asm-arm/tlbflush.h | |||
| @@ -138,6 +138,19 @@ | |||
| 138 | # define v6wbi_always_flags (-1UL) | 138 | # define v6wbi_always_flags (-1UL) |
| 139 | #endif | 139 | #endif |
| 140 | 140 | ||
| 141 | #ifdef CONFIG_CPU_TLB_V7 | ||
| 142 | # define v7wbi_possible_flags v6wbi_tlb_flags | ||
| 143 | # define v7wbi_always_flags v6wbi_tlb_flags | ||
| 144 | # ifdef _TLB | ||
| 145 | # define MULTI_TLB 1 | ||
| 146 | # else | ||
| 147 | # define _TLB v7wbi | ||
| 148 | # endif | ||
| 149 | #else | ||
| 150 | # define v7wbi_possible_flags 0 | ||
| 151 | # define v7wbi_always_flags (-1UL) | ||
| 152 | #endif | ||
| 153 | |||
| 141 | #ifndef _TLB | 154 | #ifndef _TLB |
| 142 | #error Unknown TLB model | 155 | #error Unknown TLB model |
| 143 | #endif | 156 | #endif |
