1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2a439fe51SSam Ravnborg #ifndef _SPARC_PGALLOC_H 3a439fe51SSam Ravnborg #define _SPARC_PGALLOC_H 4a439fe51SSam Ravnborg 5a439fe51SSam Ravnborg #include <linux/kernel.h> 6a439fe51SSam Ravnborg #include <linux/sched.h> 7a439fe51SSam Ravnborg 8642ea3edSSam Ravnborg #include <asm/pgtsrmmu.h> 9642ea3edSSam Ravnborg #include <asm/pgtable.h> 10642ea3edSSam Ravnborg #include <asm/vaddrs.h> 11642ea3edSSam Ravnborg #include <asm/page.h> 12a439fe51SSam Ravnborg 13a439fe51SSam Ravnborg struct page; 14a439fe51SSam Ravnborg 15f71a2aacSSam Ravnborg void *srmmu_get_nocache(int size, int align); 16f71a2aacSSam Ravnborg void srmmu_free_nocache(void *addr, int size); 17642ea3edSSam Ravnborg 18c31f7651SSam Ravnborg extern struct resource sparc_iomap; 19c31f7651SSam Ravnborg 20642ea3edSSam Ravnborg pgd_t *get_pgd_fast(void); 21642ea3edSSam Ravnborg static inline void free_pgd_fast(pgd_t *pgd) 22642ea3edSSam Ravnborg { 23f71a2aacSSam Ravnborg srmmu_free_nocache(pgd, SRMMU_PGD_TABLE_SIZE); 24642ea3edSSam Ravnborg } 25a439fe51SSam Ravnborg 26a439fe51SSam Ravnborg #define pgd_free(mm, pgd) free_pgd_fast(pgd) 27a439fe51SSam Ravnborg #define pgd_alloc(mm) get_pgd_fast() 28a439fe51SSam Ravnborg 297235db26SMike Rapoport static inline void pud_set(pud_t * pudp, pmd_t * pmdp) 30642ea3edSSam Ravnborg { 316b1cabe8SSam Ravnborg unsigned long pa = __nocache_pa(pmdp); 32642ea3edSSam Ravnborg 337235db26SMike Rapoport set_pte((pte_t *)pudp, __pte((SRMMU_ET_PTD | (pa >> 4)))); 34642ea3edSSam Ravnborg } 35642ea3edSSam Ravnborg 367235db26SMike Rapoport #define pud_populate(MM, PGD, PMD) pud_set(PGD, PMD) 37a439fe51SSam Ravnborg 38642ea3edSSam Ravnborg static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, 39642ea3edSSam Ravnborg unsigned long address) 40642ea3edSSam Ravnborg { 41f71a2aacSSam Ravnborg return srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE, 42642ea3edSSam Ravnborg SRMMU_PMD_TABLE_SIZE); 43642ea3edSSam Ravnborg } 44a439fe51SSam Ravnborg 45642ea3edSSam Ravnborg static inline void free_pmd_fast(pmd_t * pmd) 46642ea3edSSam Ravnborg { 47f71a2aacSSam Ravnborg srmmu_free_nocache(pmd, SRMMU_PMD_TABLE_SIZE); 48642ea3edSSam Ravnborg } 49a439fe51SSam Ravnborg 50a439fe51SSam Ravnborg #define pmd_free(mm, pmd) free_pmd_fast(pmd) 519e1b32caSBenjamin Herrenschmidt #define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd) 52a439fe51SSam Ravnborg 533f407976SWill Deacon #define pmd_populate(mm, pmd, pte) pmd_set(pmd, pte) 543f407976SWill Deacon #define pmd_pgtable(pmd) (pgtable_t)__pmd_page(pmd) 55a439fe51SSam Ravnborg 56642ea3edSSam Ravnborg void pmd_set(pmd_t *pmdp, pte_t *ptep); 573f407976SWill Deacon #define pmd_populate_kernel pmd_populate 58a439fe51SSam Ravnborg 594cf58924SJoel Fernandes (Google) pgtable_t pte_alloc_one(struct mm_struct *mm); 60a439fe51SSam Ravnborg 614cf58924SJoel Fernandes (Google) static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) 62642ea3edSSam Ravnborg { 638e958839SWill Deacon return srmmu_get_nocache(SRMMU_PTE_TABLE_SIZE, 648e958839SWill Deacon SRMMU_PTE_TABLE_SIZE); 65642ea3edSSam Ravnborg } 66642ea3edSSam Ravnborg 67642ea3edSSam Ravnborg 68642ea3edSSam Ravnborg static inline void free_pte_fast(pte_t *pte) 69642ea3edSSam Ravnborg { 708e958839SWill Deacon srmmu_free_nocache(pte, SRMMU_PTE_TABLE_SIZE); 71642ea3edSSam Ravnborg } 72642ea3edSSam Ravnborg 73642ea3edSSam Ravnborg #define pte_free_kernel(mm, pte) free_pte_fast(pte) 74642ea3edSSam Ravnborg 75642ea3edSSam Ravnborg void pte_free(struct mm_struct * mm, pgtable_t pte); 769e1b32caSBenjamin Herrenschmidt #define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte) 77a439fe51SSam Ravnborg 78a439fe51SSam Ravnborg #endif /* _SPARC_PGALLOC_H */ 79