162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  This file contains low-level assembler routines for managing
462306a36Sopenharmony_ci *  the PowerPC 603 tlb invalidation.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <asm/page.h>
862306a36Sopenharmony_ci#include <asm/ppc_asm.h>
962306a36Sopenharmony_ci#include <asm/asm-offsets.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/*
1262306a36Sopenharmony_ci * Flush an entry from the TLB
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci#ifdef CONFIG_SMP
1562306a36Sopenharmony_ci_GLOBAL(_tlbie)
1662306a36Sopenharmony_ci	lwz	r8,TASK_CPU(r2)
1762306a36Sopenharmony_ci	oris	r8,r8,11
1862306a36Sopenharmony_ci	mfmsr	r10
1962306a36Sopenharmony_ci	rlwinm	r0,r10,0,17,15		/* clear bit 16 (MSR_EE) */
2062306a36Sopenharmony_ci	rlwinm	r0,r0,0,28,26		/* clear DR */
2162306a36Sopenharmony_ci	mtmsr	r0
2262306a36Sopenharmony_ci	isync
2362306a36Sopenharmony_ci	lis	r9,mmu_hash_lock@h
2462306a36Sopenharmony_ci	ori	r9,r9,mmu_hash_lock@l
2562306a36Sopenharmony_ci	tophys(r9,r9)
2662306a36Sopenharmony_ci10:	lwarx	r7,0,r9
2762306a36Sopenharmony_ci	cmpwi	0,r7,0
2862306a36Sopenharmony_ci	bne-	10b
2962306a36Sopenharmony_ci	stwcx.	r8,0,r9
3062306a36Sopenharmony_ci	bne-	10b
3162306a36Sopenharmony_ci	eieio
3262306a36Sopenharmony_ci	tlbie	r3
3362306a36Sopenharmony_ci	sync
3462306a36Sopenharmony_ci	TLBSYNC
3562306a36Sopenharmony_ci	li	r0,0
3662306a36Sopenharmony_ci	stw	r0,0(r9)		/* clear mmu_hash_lock */
3762306a36Sopenharmony_ci	mtmsr	r10
3862306a36Sopenharmony_ci	isync
3962306a36Sopenharmony_ci	blr
4062306a36Sopenharmony_ci_ASM_NOKPROBE_SYMBOL(_tlbie)
4162306a36Sopenharmony_ci#endif /* CONFIG_SMP */
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci/*
4462306a36Sopenharmony_ci * Flush the entire TLB. 603/603e only
4562306a36Sopenharmony_ci */
4662306a36Sopenharmony_ci_GLOBAL(_tlbia)
4762306a36Sopenharmony_ci#if defined(CONFIG_SMP)
4862306a36Sopenharmony_ci	lwz	r8,TASK_CPU(r2)
4962306a36Sopenharmony_ci	oris	r8,r8,10
5062306a36Sopenharmony_ci	mfmsr	r10
5162306a36Sopenharmony_ci	rlwinm	r0,r10,0,17,15		/* clear bit 16 (MSR_EE) */
5262306a36Sopenharmony_ci	rlwinm	r0,r0,0,28,26		/* clear DR */
5362306a36Sopenharmony_ci	mtmsr	r0
5462306a36Sopenharmony_ci	isync
5562306a36Sopenharmony_ci	lis	r9,mmu_hash_lock@h
5662306a36Sopenharmony_ci	ori	r9,r9,mmu_hash_lock@l
5762306a36Sopenharmony_ci	tophys(r9,r9)
5862306a36Sopenharmony_ci10:	lwarx	r7,0,r9
5962306a36Sopenharmony_ci	cmpwi	0,r7,0
6062306a36Sopenharmony_ci	bne-	10b
6162306a36Sopenharmony_ci	stwcx.	r8,0,r9
6262306a36Sopenharmony_ci	bne-	10b
6362306a36Sopenharmony_ci#endif /* CONFIG_SMP */
6462306a36Sopenharmony_ci	li	r5, 32
6562306a36Sopenharmony_ci	lis	r4, KERNELBASE@h
6662306a36Sopenharmony_ci	mtctr	r5
6762306a36Sopenharmony_ci	sync
6862306a36Sopenharmony_ci0:	tlbie	r4
6962306a36Sopenharmony_ci	addi	r4, r4, 0x1000
7062306a36Sopenharmony_ci	bdnz	0b
7162306a36Sopenharmony_ci	sync
7262306a36Sopenharmony_ci#ifdef CONFIG_SMP
7362306a36Sopenharmony_ci	TLBSYNC
7462306a36Sopenharmony_ci	li	r0,0
7562306a36Sopenharmony_ci	stw	r0,0(r9)		/* clear mmu_hash_lock */
7662306a36Sopenharmony_ci	mtmsr	r10
7762306a36Sopenharmony_ci	isync
7862306a36Sopenharmony_ci#endif /* CONFIG_SMP */
7962306a36Sopenharmony_ci	blr
8062306a36Sopenharmony_ci_ASM_NOKPROBE_SYMBOL(_tlbia)
81