158d0ba57SCatalin Marinas /* 258d0ba57SCatalin Marinas * Based on arch/arm/include/asm/tlb.h 358d0ba57SCatalin Marinas * 458d0ba57SCatalin Marinas * Copyright (C) 2002 Russell King 558d0ba57SCatalin Marinas * Copyright (C) 2012 ARM Ltd. 658d0ba57SCatalin Marinas * 758d0ba57SCatalin Marinas * This program is free software; you can redistribute it and/or modify 858d0ba57SCatalin Marinas * it under the terms of the GNU General Public License version 2 as 958d0ba57SCatalin Marinas * published by the Free Software Foundation. 1058d0ba57SCatalin Marinas * 1158d0ba57SCatalin Marinas * This program is distributed in the hope that it will be useful, 1258d0ba57SCatalin Marinas * but WITHOUT ANY WARRANTY; without even the implied warranty of 1358d0ba57SCatalin Marinas * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1458d0ba57SCatalin Marinas * GNU General Public License for more details. 1558d0ba57SCatalin Marinas * 1658d0ba57SCatalin Marinas * You should have received a copy of the GNU General Public License 1758d0ba57SCatalin Marinas * along with this program. If not, see <http://www.gnu.org/licenses/>. 1858d0ba57SCatalin Marinas */ 1958d0ba57SCatalin Marinas #ifndef __ASM_TLB_H 2058d0ba57SCatalin Marinas #define __ASM_TLB_H 2158d0ba57SCatalin Marinas 225e5f6dc1SSteve Capper #include <linux/pagemap.h> 235e5f6dc1SSteve Capper #include <linux/swap.h> 245e5f6dc1SSteve Capper 255e5f6dc1SSteve Capper #ifdef CONFIG_HAVE_RCU_TABLE_FREE 265e5f6dc1SSteve Capper 275e5f6dc1SSteve Capper #define tlb_remove_entry(tlb, entry) tlb_remove_table(tlb, entry) 285e5f6dc1SSteve Capper static inline void __tlb_remove_table(void *_table) 295e5f6dc1SSteve Capper { 305e5f6dc1SSteve Capper free_page_and_swap_cache((struct page *)_table); 315e5f6dc1SSteve Capper } 325e5f6dc1SSteve Capper #else 335e5f6dc1SSteve Capper #define tlb_remove_entry(tlb, entry) tlb_remove_page(tlb, entry) 345e5f6dc1SSteve Capper #endif /* CONFIG_HAVE_RCU_TABLE_FREE */ 355e5f6dc1SSteve Capper 36fb7332a9SWill Deacon #include <asm-generic/tlb.h> 37fb7332a9SWill Deacon 3858d0ba57SCatalin Marinas static inline void tlb_flush(struct mmu_gather *tlb) 3958d0ba57SCatalin Marinas { 40020c1427SCatalin Marinas if (tlb->fullmm) { 4158d0ba57SCatalin Marinas flush_tlb_mm(tlb->mm); 42fb7332a9SWill Deacon } else { 43020c1427SCatalin Marinas struct vm_area_struct vma = { .vm_mm = tlb->mm, }; 44020c1427SCatalin Marinas flush_tlb_range(&vma, tlb->start, tlb->end); 4558d0ba57SCatalin Marinas } 4658d0ba57SCatalin Marinas } 4758d0ba57SCatalin Marinas 4858d0ba57SCatalin Marinas static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, 4958d0ba57SCatalin Marinas unsigned long addr) 5058d0ba57SCatalin Marinas { 5158d0ba57SCatalin Marinas pgtable_page_dtor(pte); 525e5f6dc1SSteve Capper tlb_remove_entry(tlb, pte); 5358d0ba57SCatalin Marinas } 5458d0ba57SCatalin Marinas 55abe669d7SCatalin Marinas #if CONFIG_ARM64_PGTABLE_LEVELS > 2 5658d0ba57SCatalin Marinas static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, 5758d0ba57SCatalin Marinas unsigned long addr) 5858d0ba57SCatalin Marinas { 595e5f6dc1SSteve Capper tlb_remove_entry(tlb, virt_to_page(pmdp)); 6058d0ba57SCatalin Marinas } 6158d0ba57SCatalin Marinas #endif 6258d0ba57SCatalin Marinas 63abe669d7SCatalin Marinas #if CONFIG_ARM64_PGTABLE_LEVELS > 3 64c79b954bSJungseok Lee static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pudp, 65c79b954bSJungseok Lee unsigned long addr) 66c79b954bSJungseok Lee { 675e5f6dc1SSteve Capper tlb_remove_entry(tlb, virt_to_page(pudp)); 68c79b954bSJungseok Lee } 69c79b954bSJungseok Lee #endif 70c79b954bSJungseok Lee 7158d0ba57SCatalin Marinas #endif 72