162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef __ASM_CSKY_PGALLOC_H 462306a36Sopenharmony_ci#define __ASM_CSKY_PGALLOC_H 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/highmem.h> 762306a36Sopenharmony_ci#include <linux/mm.h> 862306a36Sopenharmony_ci#include <linux/sched.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define __HAVE_ARCH_PTE_ALLOC_ONE_KERNEL 1162306a36Sopenharmony_ci#include <asm-generic/pgalloc.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistatic inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, 1462306a36Sopenharmony_ci pte_t *pte) 1562306a36Sopenharmony_ci{ 1662306a36Sopenharmony_ci set_pmd(pmd, __pmd(__pa(pte))); 1762306a36Sopenharmony_ci} 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, 2062306a36Sopenharmony_ci pgtable_t pte) 2162306a36Sopenharmony_ci{ 2262306a36Sopenharmony_ci set_pmd(pmd, __pmd(__pa(page_address(pte)))); 2362306a36Sopenharmony_ci} 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ciextern void pgd_init(unsigned long *p); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci pte_t *pte; 3062306a36Sopenharmony_ci unsigned long i; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci pte = (pte_t *) __get_free_page(GFP_KERNEL); 3362306a36Sopenharmony_ci if (!pte) 3462306a36Sopenharmony_ci return NULL; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci for (i = 0; i < PAGE_SIZE/sizeof(pte_t); i++) 3762306a36Sopenharmony_ci (pte + i)->pte_low = _PAGE_GLOBAL; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci return pte; 4062306a36Sopenharmony_ci} 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistatic inline pgd_t *pgd_alloc(struct mm_struct *mm) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci pgd_t *ret; 4562306a36Sopenharmony_ci pgd_t *init; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci ret = (pgd_t *) __get_free_page(GFP_KERNEL); 4862306a36Sopenharmony_ci if (ret) { 4962306a36Sopenharmony_ci init = pgd_offset(&init_mm, 0UL); 5062306a36Sopenharmony_ci pgd_init((unsigned long *)ret); 5162306a36Sopenharmony_ci memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD, 5262306a36Sopenharmony_ci (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); 5362306a36Sopenharmony_ci /* prevent out of order excute */ 5462306a36Sopenharmony_ci smp_mb(); 5562306a36Sopenharmony_ci#ifdef CONFIG_CPU_NEED_TLBSYNC 5662306a36Sopenharmony_ci dcache_wb_range((unsigned int)ret, 5762306a36Sopenharmony_ci (unsigned int)(ret + PTRS_PER_PGD)); 5862306a36Sopenharmony_ci#endif 5962306a36Sopenharmony_ci } 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci return ret; 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci#define __pte_free_tlb(tlb, pte, address) \ 6562306a36Sopenharmony_cido { \ 6662306a36Sopenharmony_ci pagetable_pte_dtor(page_ptdesc(pte)); \ 6762306a36Sopenharmony_ci tlb_remove_page_ptdesc(tlb, page_ptdesc(pte)); \ 6862306a36Sopenharmony_ci} while (0) 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ciextern void pagetable_init(void); 7162306a36Sopenharmony_ciextern void mmu_init(unsigned long min_pfn, unsigned long max_pfn); 7262306a36Sopenharmony_ciextern void pre_trap_init(void); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#endif /* __ASM_CSKY_PGALLOC_H */ 75