18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * TLB shootdown specifics for powerpc 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2002 Anton Blanchard, IBM Corp. 68c2ecf20Sopenharmony_ci * Copyright (C) 2002 Paul Mackerras, IBM Corp. 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci#ifndef _ASM_POWERPC_TLB_H 98c2ecf20Sopenharmony_ci#define _ASM_POWERPC_TLB_H 108c2ecf20Sopenharmony_ci#ifdef __KERNEL__ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#ifndef __powerpc64__ 138c2ecf20Sopenharmony_ci#include <linux/pgtable.h> 148c2ecf20Sopenharmony_ci#endif 158c2ecf20Sopenharmony_ci#ifndef __powerpc64__ 168c2ecf20Sopenharmony_ci#include <asm/page.h> 178c2ecf20Sopenharmony_ci#include <asm/mmu.h> 188c2ecf20Sopenharmony_ci#endif 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <linux/pagemap.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define tlb_start_vma(tlb, vma) do { } while (0) 238c2ecf20Sopenharmony_ci#define tlb_end_vma(tlb, vma) do { } while (0) 248c2ecf20Sopenharmony_ci#define __tlb_remove_tlb_entry __tlb_remove_tlb_entry 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#define tlb_flush tlb_flush 278c2ecf20Sopenharmony_ciextern void tlb_flush(struct mmu_gather *tlb); 288c2ecf20Sopenharmony_ci/* 298c2ecf20Sopenharmony_ci * book3s: 308c2ecf20Sopenharmony_ci * Hash does not use the linux page-tables, so we can avoid 318c2ecf20Sopenharmony_ci * the TLB invalidate for page-table freeing, Radix otoh does use the 328c2ecf20Sopenharmony_ci * page-tables and needs the TLBI. 338c2ecf20Sopenharmony_ci * 348c2ecf20Sopenharmony_ci * nohash: 358c2ecf20Sopenharmony_ci * We still do TLB invalidate in the __pte_free_tlb routine before we 368c2ecf20Sopenharmony_ci * add the page table pages to mmu gather table batch. 378c2ecf20Sopenharmony_ci */ 388c2ecf20Sopenharmony_ci#define tlb_needs_table_invalidate() radix_enabled() 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci/* Get the generic bits... */ 418c2ecf20Sopenharmony_ci#include <asm-generic/tlb.h> 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ciextern void flush_hash_entry(struct mm_struct *mm, pte_t *ptep, 448c2ecf20Sopenharmony_ci unsigned long address); 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistatic inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, 478c2ecf20Sopenharmony_ci unsigned long address) 488c2ecf20Sopenharmony_ci{ 498c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_32 508c2ecf20Sopenharmony_ci if (pte_val(*ptep) & _PAGE_HASHPTE) 518c2ecf20Sopenharmony_ci flush_hash_entry(tlb->mm, ptep, address); 528c2ecf20Sopenharmony_ci#endif 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP 568c2ecf20Sopenharmony_cistatic inline int mm_is_core_local(struct mm_struct *mm) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci return cpumask_subset(mm_cpumask(mm), 598c2ecf20Sopenharmony_ci topology_sibling_cpumask(smp_processor_id())); 608c2ecf20Sopenharmony_ci} 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_64 638c2ecf20Sopenharmony_cistatic inline int mm_is_thread_local(struct mm_struct *mm) 648c2ecf20Sopenharmony_ci{ 658c2ecf20Sopenharmony_ci if (atomic_read(&mm->context.active_cpus) > 1) 668c2ecf20Sopenharmony_ci return false; 678c2ecf20Sopenharmony_ci return cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm)); 688c2ecf20Sopenharmony_ci} 698c2ecf20Sopenharmony_ci#else /* CONFIG_PPC_BOOK3S_64 */ 708c2ecf20Sopenharmony_cistatic inline int mm_is_thread_local(struct mm_struct *mm) 718c2ecf20Sopenharmony_ci{ 728c2ecf20Sopenharmony_ci return cpumask_equal(mm_cpumask(mm), 738c2ecf20Sopenharmony_ci cpumask_of(smp_processor_id())); 748c2ecf20Sopenharmony_ci} 758c2ecf20Sopenharmony_ci#endif /* !CONFIG_PPC_BOOK3S_64 */ 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci#else /* CONFIG_SMP */ 788c2ecf20Sopenharmony_cistatic inline int mm_is_core_local(struct mm_struct *mm) 798c2ecf20Sopenharmony_ci{ 808c2ecf20Sopenharmony_ci return 1; 818c2ecf20Sopenharmony_ci} 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_cistatic inline int mm_is_thread_local(struct mm_struct *mm) 848c2ecf20Sopenharmony_ci{ 858c2ecf20Sopenharmony_ci return 1; 868c2ecf20Sopenharmony_ci} 878c2ecf20Sopenharmony_ci#endif 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci#endif /* __KERNEL__ */ 908c2ecf20Sopenharmony_ci#endif /* __ASM_POWERPC_TLB_H */ 91