blob: 47bf660ca2e3ab9a0650e5e09eb8861604ee7dd2 [file] [log] [blame]
Sam Ravnborgf5e706a2008-07-17 21:55:51 -07001#ifndef _SPARC_PGALLOC_H
2#define _SPARC_PGALLOC_H
3
4#include <linux/kernel.h>
5#include <linux/sched.h>
6
Sam Ravnborg642ea3e2012-05-13 08:40:27 +02007#include <asm/pgtsrmmu.h>
Sam Ravnborgf5e706a2008-07-17 21:55:51 -07008#include <asm/btfixup.h>
Sam Ravnborg642ea3e2012-05-13 08:40:27 +02009#include <asm/pgtable.h>
10#include <asm/vaddrs.h>
11#include <asm/page.h>
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070012
13struct page;
14
15extern struct pgtable_cache_struct {
16 unsigned long *pgd_cache;
17 unsigned long *pte_cache;
18 unsigned long pgtable_cache_sz;
19 unsigned long pgd_cache_sz;
20} pgt_quicklists;
Sam Ravnborg642ea3e2012-05-13 08:40:27 +020021
22unsigned long srmmu_get_nocache(int size, int align);
23void srmmu_free_nocache(unsigned long vaddr, int size);
24
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070025#define pgd_quicklist (pgt_quicklists.pgd_cache)
26#define pmd_quicklist ((unsigned long *)0)
27#define pte_quicklist (pgt_quicklists.pte_cache)
28#define pgtable_cache_size (pgt_quicklists.pgtable_cache_sz)
29#define pgd_cache_size (pgt_quicklists.pgd_cache_sz)
30
Sam Ravnborg37743482012-05-12 08:04:12 +000031#define check_pgt_cache() do { } while (0)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070032
Sam Ravnborg642ea3e2012-05-13 08:40:27 +020033pgd_t *get_pgd_fast(void);
34static inline void free_pgd_fast(pgd_t *pgd)
35{
36 srmmu_free_nocache((unsigned long)pgd, SRMMU_PGD_TABLE_SIZE);
37}
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070038
39#define pgd_free(mm, pgd) free_pgd_fast(pgd)
40#define pgd_alloc(mm) get_pgd_fast()
41
Sam Ravnborg642ea3e2012-05-13 08:40:27 +020042static inline void pgd_set(pgd_t * pgdp, pmd_t * pmdp)
43{
44 unsigned long pa = __nocache_pa((unsigned long)pmdp);
45
46 set_pte((pte_t *)pgdp, (SRMMU_ET_PTD | (pa >> 4)));
47}
48
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070049#define pgd_populate(MM, PGD, PMD) pgd_set(PGD, PMD)
50
Sam Ravnborg642ea3e2012-05-13 08:40:27 +020051static inline pmd_t *pmd_alloc_one(struct mm_struct *mm,
52 unsigned long address)
53{
54 return (pmd_t *)srmmu_get_nocache(SRMMU_PMD_TABLE_SIZE,
55 SRMMU_PMD_TABLE_SIZE);
56}
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070057
Sam Ravnborg642ea3e2012-05-13 08:40:27 +020058static inline void free_pmd_fast(pmd_t * pmd)
59{
60 srmmu_free_nocache((unsigned long)pmd, SRMMU_PMD_TABLE_SIZE);
61}
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070062
Benjamin Herrenschmidt9e1b32c2009-07-22 15:44:28 +100063#define pmd_free(mm, pmd) free_pmd_fast(pmd)
64#define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070065
Sam Ravnborg642ea3e2012-05-13 08:40:27 +020066void pmd_populate(struct mm_struct *mm, pmd_t *pmdp, struct page *ptep);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070067#define pmd_pgtable(pmd) pmd_page(pmd)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070068
Sam Ravnborg642ea3e2012-05-13 08:40:27 +020069void pmd_set(pmd_t *pmdp, pte_t *ptep);
70#define pmd_populate_kernel(MM, PMD, PTE) pmd_set(PMD, PTE)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070071
Sam Ravnborg642ea3e2012-05-13 08:40:27 +020072pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address);
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070073
Sam Ravnborg642ea3e2012-05-13 08:40:27 +020074static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
75 unsigned long address)
76{
77 return (pte_t *)srmmu_get_nocache(PTE_SIZE, PTE_SIZE);
78}
79
80
81static inline void free_pte_fast(pte_t *pte)
82{
83 srmmu_free_nocache((unsigned long)pte, PTE_SIZE);
84}
85
86#define pte_free_kernel(mm, pte) free_pte_fast(pte)
87
88void pte_free(struct mm_struct * mm, pgtable_t pte);
Benjamin Herrenschmidt9e1b32c2009-07-22 15:44:28 +100089#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte)
Sam Ravnborgf5e706a2008-07-17 21:55:51 -070090
91#endif /* _SPARC_PGALLOC_H */