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