xref: /openbmc/linux/arch/arm/mm/tlb-v6.S (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1d2912cb1SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds/*
31da177e4SLinus Torvalds *  linux/arch/arm/mm/tlb-v6.S
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds *  Copyright (C) 1997-2002 Russell King
61da177e4SLinus Torvalds *
71da177e4SLinus Torvalds *  ARM architecture version 6 TLB handling functions.
81da177e4SLinus Torvalds *  These assume a split I/D TLB.
91da177e4SLinus Torvalds */
10991da17eSTim Abbott#include <linux/init.h>
111da177e4SLinus Torvalds#include <linux/linkage.h>
12e6ae744dSSam Ravnborg#include <asm/asm-offsets.h>
136ebbf2ceSRussell King#include <asm/assembler.h>
141da177e4SLinus Torvalds#include <asm/page.h>
151da177e4SLinus Torvalds#include <asm/tlbflush.h>
161da177e4SLinus Torvalds#include "proc-macros.S"
171da177e4SLinus Torvalds
181da177e4SLinus Torvalds#define HARVARD_TLB
191da177e4SLinus Torvalds
20*a2faac39SNick Desaulniers.arch armv6
21*a2faac39SNick Desaulniers
221da177e4SLinus Torvalds/*
231da177e4SLinus Torvalds *	v6wbi_flush_user_tlb_range(start, end, vma)
241da177e4SLinus Torvalds *
251da177e4SLinus Torvalds *	Invalidate a range of TLB entries in the specified address space.
261da177e4SLinus Torvalds *
271da177e4SLinus Torvalds *	- start - start address (may not be aligned)
281da177e4SLinus Torvalds *	- end   - end address (exclusive, may not be aligned)
295673a60bSChen Li *	- vma   - vm_area_struct describing address range
301da177e4SLinus Torvalds *
311da177e4SLinus Torvalds *	It is assumed that:
321da177e4SLinus Torvalds *	- the "Invalidate single entry" instruction will invalidate
331da177e4SLinus Torvalds *	  both the I and the D TLBs on Harvard-style TLBs
341da177e4SLinus Torvalds */
351da177e4SLinus TorvaldsENTRY(v6wbi_flush_user_tlb_range)
361da177e4SLinus Torvalds	vma_vm_mm r3, r2			@ get vma->vm_mm
371da177e4SLinus Torvalds	mov	ip, #0
381da177e4SLinus Torvalds	mmid	r3, r3				@ get vm_mm->context.id
391da177e4SLinus Torvalds	mcr	p15, 0, ip, c7, c10, 4		@ drain write buffer
401da177e4SLinus Torvalds	mov	r0, r0, lsr #PAGE_SHIFT		@ align address
411da177e4SLinus Torvalds	mov	r1, r1, lsr #PAGE_SHIFT
421da177e4SLinus Torvalds	asid	r3, r3				@ mask ASID
431da177e4SLinus Torvalds	orr	r0, r3, r0, lsl #PAGE_SHIFT	@ Create initial MVA
441da177e4SLinus Torvalds	mov	r1, r1, lsl #PAGE_SHIFT
451da177e4SLinus Torvalds	vma_vm_flags r2, r2			@ get vma->vm_flags
461da177e4SLinus Torvalds1:
471da177e4SLinus Torvalds#ifdef HARVARD_TLB
481da177e4SLinus Torvalds	mcr	p15, 0, r0, c8, c6, 1		@ TLB invalidate D MVA (was 1)
491da177e4SLinus Torvalds	tst	r2, #VM_EXEC			@ Executable area ?
501da177e4SLinus Torvalds	mcrne	p15, 0, r0, c8, c5, 1		@ TLB invalidate I MVA (was 1)
511da177e4SLinus Torvalds#else
521da177e4SLinus Torvalds	mcr	p15, 0, r0, c8, c7, 1		@ TLB invalidate MVA (was 1)
531da177e4SLinus Torvalds#endif
541da177e4SLinus Torvalds	add	r0, r0, #PAGE_SZ
551da177e4SLinus Torvalds	cmp	r0, r1
561da177e4SLinus Torvalds	blo	1b
57e6a5d66fSCatalin Marinas	mcr	p15, 0, ip, c7, c10, 4		@ data synchronization barrier
586ebbf2ceSRussell King	ret	lr
591da177e4SLinus Torvalds
601da177e4SLinus Torvalds/*
611da177e4SLinus Torvalds *	v6wbi_flush_kern_tlb_range(start,end)
621da177e4SLinus Torvalds *
631da177e4SLinus Torvalds *	Invalidate a range of kernel TLB entries
641da177e4SLinus Torvalds *
651da177e4SLinus Torvalds *	- start - start address (may not be aligned)
661da177e4SLinus Torvalds *	- end   - end address (exclusive, may not be aligned)
671da177e4SLinus Torvalds */
681da177e4SLinus TorvaldsENTRY(v6wbi_flush_kern_tlb_range)
691da177e4SLinus Torvalds	mov	r2, #0
701da177e4SLinus Torvalds	mcr	p15, 0, r2, c7, c10, 4		@ drain write buffer
711da177e4SLinus Torvalds	mov	r0, r0, lsr #PAGE_SHIFT		@ align address
721da177e4SLinus Torvalds	mov	r1, r1, lsr #PAGE_SHIFT
731da177e4SLinus Torvalds	mov	r0, r0, lsl #PAGE_SHIFT
741da177e4SLinus Torvalds	mov	r1, r1, lsl #PAGE_SHIFT
751da177e4SLinus Torvalds1:
761da177e4SLinus Torvalds#ifdef HARVARD_TLB
771da177e4SLinus Torvalds	mcr	p15, 0, r0, c8, c6, 1		@ TLB invalidate D MVA
781da177e4SLinus Torvalds	mcr	p15, 0, r0, c8, c5, 1		@ TLB invalidate I MVA
791da177e4SLinus Torvalds#else
801da177e4SLinus Torvalds	mcr	p15, 0, r0, c8, c7, 1		@ TLB invalidate MVA
811da177e4SLinus Torvalds#endif
821da177e4SLinus Torvalds	add	r0, r0, #PAGE_SZ
831da177e4SLinus Torvalds	cmp	r0, r1
841da177e4SLinus Torvalds	blo	1b
856a0e2430SCatalin Marinas	mcr	p15, 0, r2, c7, c10, 4		@ data synchronization barrier
864348810aSRussell King	mcr	p15, 0, r2, c7, c5, 4		@ prefetch flush (isb)
876ebbf2ceSRussell King	ret	lr
881da177e4SLinus Torvalds
89991da17eSTim Abbott	__INIT
901da177e4SLinus Torvalds
913b7f39faSDave Martin	/* define struct cpu_tlb_fns (see <asm/tlbflush.h> and proc-macros.S) */
923b7f39faSDave Martin	define_tlb_functions v6wbi, v6wbi_tlb_flags
93