/* SPDX-License-Identifier: GPL-2.0-only */ #ifndef _ASMRISCV_MMU_H_ #define _ASMRISCV_MMU_H_ #include #include #include #include static inline pgd_t *current_pgtable(void) { return (pgd_t *)((csr_read(CSR_SATP) & SATP_PPN) << PAGE_SHIFT); } void mmu_set_range_ptes(pgd_t *pgtable, uintptr_t virt_offset, phys_addr_t phys_start, phys_addr_t phys_end, pgprot_t prot, bool flush); void __mmu_enable(unsigned long satp); void mmu_enable(unsigned long mode, pgd_t *pgtable); void mmu_disable(void); static inline void local_flush_tlb_page(unsigned long addr) { asm volatile("sfence.vma %0" : : "r" (addr) : "memory"); } /* * Get the pte pointer for a virtual address, even if it's not mapped. * Constructs upper levels of the table as necessary. */ pte_t *get_pte(pgd_t *pgtable, uintptr_t vaddr); #endif /* _ASMRISCV_MMU_H_ */