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