blob: 5b768fc2388e1e298ebdccc3074534804f8a49a4 [file] [log] [blame]
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -07001/*
2 * Copyright (C) 2004-2006 Atmel Corporation
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8#ifndef __ASM_AVR32_PGALLOC_H
9#define __ASM_AVR32_PGALLOC_H
10
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070011#include <linux/mm.h>
Haavard Skinnemoencfd23e92008-01-14 22:15:05 +010012#include <linux/sched.h>
13#include <linux/slab.h>
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070014
Haavard Skinnemoencfd23e92008-01-14 22:15:05 +010015static inline void pmd_populate_kernel(struct mm_struct *mm,
16 pmd_t *pmd, pte_t *pte)
17{
18 set_pmd(pmd, __pmd((unsigned long)pte));
19}
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070020
Haavard Skinnemoencfd23e92008-01-14 22:15:05 +010021static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
Martin Schwidefsky2f569af2008-02-08 04:22:04 -080022 pgtable_t pte)
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070023{
Haavard Skinnemoencfd23e92008-01-14 22:15:05 +010024 set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070025}
Martin Schwidefsky2f569af2008-02-08 04:22:04 -080026#define pmd_pgtable(pmd) pmd_page(pmd)
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070027
28/*
29 * Allocate and free page tables
30 */
Haavard Skinnemoencfd23e92008-01-14 22:15:05 +010031static inline pgd_t *pgd_alloc(struct mm_struct *mm)
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070032{
Mariusz Kozlowski5221b342007-07-31 23:41:00 +020033 return kcalloc(USER_PTRS_PER_PGD, sizeof(pgd_t), GFP_KERNEL);
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070034}
35
Benjamin Herrenschmidt5e541972008-02-04 22:29:14 -080036static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070037{
38 kfree(pgd);
39}
40
41static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
42 unsigned long address)
43{
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070044 pte_t *pte;
45
Haavard Skinnemoene7f3bac2007-08-03 13:29:01 +020046 pte = (pte_t *)get_zeroed_page(GFP_KERNEL | __GFP_REPEAT);
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070047
48 return pte;
49}
50
51static inline struct page *pte_alloc_one(struct mm_struct *mm,
52 unsigned long address)
53{
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070054 struct page *pte;
55
Haavard Skinnemoene7f3bac2007-08-03 13:29:01 +020056 pte = alloc_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
Martin Schwidefsky2f569af2008-02-08 04:22:04 -080057 if (!pte)
58 return NULL;
59 pgtable_page_ctor(pte);
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070060 return pte;
61}
62
Benjamin Herrenschmidt5e541972008-02-04 22:29:14 -080063static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070064{
65 free_page((unsigned long)pte);
66}
67
Martin Schwidefsky2f569af2008-02-08 04:22:04 -080068static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070069{
Martin Schwidefsky2f569af2008-02-08 04:22:04 -080070 pgtable_page_dtor(pte);
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070071 __free_page(pte);
72}
73
Martin Schwidefsky2f569af2008-02-08 04:22:04 -080074#define __pte_free_tlb(tlb,pte) \
75do { \
76 pgtable_page_dtor(pte); \
77 tlb_remove_page((tlb), pte); \
78} while (0)
Haavard Skinnemoen5f97f7f2006-09-25 23:32:13 -070079
80#define check_pgt_cache() do { } while(0)
81
82#endif /* __ASM_AVR32_PGALLOC_H */