0001
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