Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _SPARC_PGALLOC_H
0003 #define _SPARC_PGALLOC_H
0004 
0005 #include <linux/kernel.h>
0006 #include <linux/sched.h>
0007 #include <linux/pgtable.h>
0008 
0009 #include <asm/pgtsrmmu.h>
0010 #include <asm/vaddrs.h>
0011 #include <asm/page.h>
0012 
0013 struct page;
0014 
0015 void *srmmu_get_nocache(int size, int align);
0016 void srmmu_free_nocache(void *addr, int size);
0017 
0018 extern struct resource sparc_iomap;
0019 
0020 pgd_t *get_pgd_fast(void);
0021 static inline void free_pgd_fast(pgd_t *pgd)
0022 {
0023     srmmu_free_nocache(pgd, SRMMU_PGD_TABLE_SIZE);
0024 }
0025 
0026 #define pgd_free(mm, pgd)   free_pgd_fast(pgd)
0027 #define pgd_alloc(mm)   get_pgd_fast()
0028 
0029 static inline void pud_set(pud_t * pudp, pmd_t * pmdp)
0030 {
0031     unsigned long pa = __nocache_pa(pmdp);
0032 
0033     set_pte((pte_t *)pudp, __pte((SRMMU_ET_PTD | (pa >> 4))));
0034 }
0035 
0036 #define pud_populate(MM, PGD, PMD)      pud_set(PGD, PMD)
0037 
0038 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm,
0039                    unsigned long address)
0040 {
0041     return srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE,
0042                  SRMMU_PMD_TABLE_SIZE);
0043 }
0044 
0045 static inline void free_pmd_fast(pmd_t * pmd)
0046 {
0047     srmmu_free_nocache(pmd, SRMMU_PMD_TABLE_SIZE);
0048 }
0049 
0050 #define pmd_free(mm, pmd)       free_pmd_fast(pmd)
0051 #define __pmd_free_tlb(tlb, pmd, addr)  pmd_free((tlb)->mm, pmd)
0052 
0053 #define pmd_populate(mm, pmd, pte)  pmd_set(pmd, pte)
0054 
0055 void pmd_set(pmd_t *pmdp, pte_t *ptep);
0056 #define pmd_populate_kernel     pmd_populate
0057 
0058 pgtable_t pte_alloc_one(struct mm_struct *mm);
0059 
0060 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
0061 {
0062     return srmmu_get_nocache(SRMMU_PTE_TABLE_SIZE,
0063                  SRMMU_PTE_TABLE_SIZE);
0064 }
0065 
0066 
0067 static inline void free_pte_fast(pte_t *pte)
0068 {
0069     srmmu_free_nocache(pte, SRMMU_PTE_TABLE_SIZE);
0070 }
0071 
0072 #define pte_free_kernel(mm, pte)    free_pte_fast(pte)
0073 
0074 void pte_free(struct mm_struct * mm, pgtable_t pte);
0075 #define __pte_free_tlb(tlb, pte, addr)  pte_free((tlb)->mm, pte)
0076 
0077 #endif /* _SPARC_PGALLOC_H */