18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _SPARC_PGALLOC_H 38c2ecf20Sopenharmony_ci#define _SPARC_PGALLOC_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <linux/kernel.h> 68c2ecf20Sopenharmony_ci#include <linux/sched.h> 78c2ecf20Sopenharmony_ci#include <linux/pgtable.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <asm/pgtsrmmu.h> 108c2ecf20Sopenharmony_ci#include <asm/vaddrs.h> 118c2ecf20Sopenharmony_ci#include <asm/page.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cistruct page; 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_civoid *srmmu_get_nocache(int size, int align); 168c2ecf20Sopenharmony_civoid srmmu_free_nocache(void *addr, int size); 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ciextern struct resource sparc_iomap; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cipgd_t *get_pgd_fast(void); 218c2ecf20Sopenharmony_cistatic inline void free_pgd_fast(pgd_t *pgd) 228c2ecf20Sopenharmony_ci{ 238c2ecf20Sopenharmony_ci srmmu_free_nocache(pgd, SRMMU_PGD_TABLE_SIZE); 248c2ecf20Sopenharmony_ci} 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#define pgd_free(mm, pgd) free_pgd_fast(pgd) 278c2ecf20Sopenharmony_ci#define pgd_alloc(mm) get_pgd_fast() 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic inline void pud_set(pud_t * pudp, pmd_t * pmdp) 308c2ecf20Sopenharmony_ci{ 318c2ecf20Sopenharmony_ci unsigned long pa = __nocache_pa(pmdp); 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci set_pte((pte_t *)pudp, __pte((SRMMU_ET_PTD | (pa >> 4)))); 348c2ecf20Sopenharmony_ci} 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#define pud_populate(MM, PGD, PMD) pud_set(PGD, PMD) 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_cistatic inline pmd_t *pmd_alloc_one(struct mm_struct *mm, 398c2ecf20Sopenharmony_ci unsigned long address) 408c2ecf20Sopenharmony_ci{ 418c2ecf20Sopenharmony_ci return srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE, 428c2ecf20Sopenharmony_ci SRMMU_PMD_TABLE_SIZE); 438c2ecf20Sopenharmony_ci} 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistatic inline void free_pmd_fast(pmd_t * pmd) 468c2ecf20Sopenharmony_ci{ 478c2ecf20Sopenharmony_ci srmmu_free_nocache(pmd, SRMMU_PMD_TABLE_SIZE); 488c2ecf20Sopenharmony_ci} 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci#define pmd_free(mm, pmd) free_pmd_fast(pmd) 518c2ecf20Sopenharmony_ci#define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd) 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci#define pmd_populate(mm, pmd, pte) pmd_set(pmd, pte) 548c2ecf20Sopenharmony_ci#define pmd_pgtable(pmd) (pgtable_t)__pmd_page(pmd) 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_civoid pmd_set(pmd_t *pmdp, pte_t *ptep); 578c2ecf20Sopenharmony_ci#define pmd_populate_kernel pmd_populate 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cipgtable_t pte_alloc_one(struct mm_struct *mm); 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cistatic inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) 628c2ecf20Sopenharmony_ci{ 638c2ecf20Sopenharmony_ci return srmmu_get_nocache(SRMMU_PTE_TABLE_SIZE, 648c2ecf20Sopenharmony_ci SRMMU_PTE_TABLE_SIZE); 658c2ecf20Sopenharmony_ci} 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cistatic inline void free_pte_fast(pte_t *pte) 698c2ecf20Sopenharmony_ci{ 708c2ecf20Sopenharmony_ci srmmu_free_nocache(pte, SRMMU_PTE_TABLE_SIZE); 718c2ecf20Sopenharmony_ci} 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci#define pte_free_kernel(mm, pte) free_pte_fast(pte) 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_civoid pte_free(struct mm_struct * mm, pgtable_t pte); 768c2ecf20Sopenharmony_ci#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte) 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci#endif /* _SPARC_PGALLOC_H */ 79