Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[ARM] 4394/1: ARMv7: Add the TLB range operations

We are currently using the ARMv6 operations but need to duplicate some
of the code because of the introduction of the new CPU barrier
instructions in ARMv7.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

authored by

Catalin Marinas and committed by
Russell King
2ccdd1e7 919a8429

+107 -2
+4 -1
arch/arm/mm/Kconfig
··· 379 379 select CPU_CP15_MMU 380 380 select CPU_HAS_ASID 381 381 select CPU_COPY_V6 if MMU 382 - select CPU_TLB_V6 if MMU 382 + select CPU_TLB_V7 if MMU 383 383 384 384 # Figure out what processor architecture version we should be using. 385 385 # This defines the compiler instruction set which depends on the machine type. ··· 496 496 instruction cache entry. 497 497 498 498 config CPU_TLB_V6 499 + bool 500 + 501 + config CPU_TLB_V7 499 502 bool 500 503 501 504 endif
+1
arch/arm/mm/Makefile
··· 46 46 obj-$(CONFIG_CPU_TLB_V4WB) += tlb-v4wb.o 47 47 obj-$(CONFIG_CPU_TLB_V4WBI) += tlb-v4wbi.o 48 48 obj-$(CONFIG_CPU_TLB_V6) += tlb-v6.o 49 + obj-$(CONFIG_CPU_TLB_V7) += tlb-v7.o 49 50 50 51 obj-$(CONFIG_CPU_ARM610) += proc-arm6_7.o 51 52 obj-$(CONFIG_CPU_ARM710) += proc-arm6_7.o
+1 -1
arch/arm/mm/proc-v7.S
··· 256 256 .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP 257 257 .long cpu_v7_name 258 258 .long v7_processor_functions 259 - .long v6wbi_tlb_fns 259 + .long v7wbi_tlb_fns 260 260 .long v6_user_fns 261 261 .long v7_cache_fns 262 262 .size __v7_proc_info, . - __v7_proc_info
+88
arch/arm/mm/tlb-v7.S
··· 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
+13
include/asm-arm/tlbflush.h
··· 138 138 # define v6wbi_always_flags (-1UL) 139 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 154 #ifndef _TLB 142 155 #error Unknown TLB model 143 156 #endif