162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _SPARC_PGALLOC_H 362306a36Sopenharmony_ci#define _SPARC_PGALLOC_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/kernel.h> 662306a36Sopenharmony_ci#include <linux/sched.h> 762306a36Sopenharmony_ci#include <linux/pgtable.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <asm/pgtsrmmu.h> 1062306a36Sopenharmony_ci#include <asm/vaddrs.h> 1162306a36Sopenharmony_ci#include <asm/page.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistruct page; 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_civoid *srmmu_get_nocache(int size, int align); 1662306a36Sopenharmony_civoid srmmu_free_nocache(void *addr, int size); 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ciextern struct resource sparc_iomap; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cipgd_t *get_pgd_fast(void); 2162306a36Sopenharmony_cistatic inline void free_pgd_fast(pgd_t *pgd) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci srmmu_free_nocache(pgd, SRMMU_PGD_TABLE_SIZE); 2462306a36Sopenharmony_ci} 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define pgd_free(mm, pgd) free_pgd_fast(pgd) 2762306a36Sopenharmony_ci#define pgd_alloc(mm) get_pgd_fast() 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic inline void pud_set(pud_t * pudp, pmd_t * pmdp) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci unsigned long pa = __nocache_pa(pmdp); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci set_pte((pte_t *)pudp, __pte((SRMMU_ET_PTD | (pa >> 4)))); 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define pud_populate(MM, PGD, PMD) pud_set(PGD, PMD) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic inline pmd_t *pmd_alloc_one(struct mm_struct *mm, 3962306a36Sopenharmony_ci unsigned long address) 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci return srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE, 4262306a36Sopenharmony_ci SRMMU_PMD_TABLE_SIZE); 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic inline void free_pmd_fast(pmd_t * pmd) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci srmmu_free_nocache(pmd, SRMMU_PMD_TABLE_SIZE); 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#define pmd_free(mm, pmd) free_pmd_fast(pmd) 5162306a36Sopenharmony_ci#define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define pmd_populate(mm, pmd, pte) pmd_set(pmd, pte) 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_civoid pmd_set(pmd_t *pmdp, pte_t *ptep); 5662306a36Sopenharmony_ci#define pmd_populate_kernel pmd_populate 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cipgtable_t pte_alloc_one(struct mm_struct *mm); 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci return srmmu_get_nocache(SRMMU_PTE_TABLE_SIZE, 6362306a36Sopenharmony_ci SRMMU_PTE_TABLE_SIZE); 6462306a36Sopenharmony_ci} 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistatic inline void free_pte_fast(pte_t *pte) 6862306a36Sopenharmony_ci{ 6962306a36Sopenharmony_ci srmmu_free_nocache(pte, SRMMU_PTE_TABLE_SIZE); 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define pte_free_kernel(mm, pte) free_pte_fast(pte) 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_civoid pte_free(struct mm_struct * mm, pgtable_t pte); 7562306a36Sopenharmony_ci#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte) 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#endif /* _SPARC_PGALLOC_H */ 78