pgalloc.h 1.9 KB
Newer Older
H
Haavard Skinnemoen 已提交
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * Copyright (C) 2004-2006 Atmel Corporation
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#ifndef __ASM_AVR32_PGALLOC_H
#define __ASM_AVR32_PGALLOC_H

#include <linux/mm.h>

13 14 15 16 17
static inline void pmd_populate_kernel(struct mm_struct *mm,
				       pmd_t *pmd, pte_t *pte)
{
	set_pmd(pmd, __pmd((unsigned long)pte));
}
H
Haavard Skinnemoen 已提交
18

19
static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
20
				    pgtable_t pte)
H
Haavard Skinnemoen 已提交
21
{
22
	set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
H
Haavard Skinnemoen 已提交
23
}
24
#define pmd_pgtable(pmd) pmd_page(pmd)
H
Haavard Skinnemoen 已提交
25 26 27 28

/*
 * Allocate and free page tables
 */
29
static inline pgd_t *pgd_alloc(struct mm_struct *mm)
H
Haavard Skinnemoen 已提交
30
{
31 32 33 34 35 36 37 38 39
	pgd_t *pgd;

	pgd = (pgd_t *)get_zeroed_page(GFP_KERNEL | __GFP_REPEAT);
	if (likely(pgd))
		memcpy(pgd + USER_PTRS_PER_PGD,
			swapper_pg_dir + USER_PTRS_PER_PGD,
			(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));

	return pgd;
H
Haavard Skinnemoen 已提交
40 41
}

42
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
H
Haavard Skinnemoen 已提交
43
{
44
	free_page((unsigned long)pgd);
H
Haavard Skinnemoen 已提交
45 46 47 48 49 50 51
}

static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
					  unsigned long address)
{
	pte_t *pte;

52
	pte = (pte_t *)get_zeroed_page(GFP_KERNEL | __GFP_REPEAT);
H
Haavard Skinnemoen 已提交
53 54 55 56 57 58 59 60 61

	return pte;
}

static inline struct page *pte_alloc_one(struct mm_struct *mm,
					 unsigned long address)
{
	struct page *pte;

62
	pte = alloc_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
63 64 65
	if (!pte)
		return NULL;
	pgtable_page_ctor(pte);
H
Haavard Skinnemoen 已提交
66 67 68
	return pte;
}

69
static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
H
Haavard Skinnemoen 已提交
70 71 72 73
{
	free_page((unsigned long)pte);
}

74
static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
H
Haavard Skinnemoen 已提交
75
{
76
	pgtable_page_dtor(pte);
H
Haavard Skinnemoen 已提交
77 78 79
	__free_page(pte);
}

80 81 82 83 84
#define __pte_free_tlb(tlb,pte)				\
do {							\
	pgtable_page_dtor(pte);				\
	tlb_remove_page((tlb), pte);			\
} while (0)
H
Haavard Skinnemoen 已提交
85 86 87 88

#define check_pgt_cache() do { } while(0)

#endif /* __ASM_AVR32_PGALLOC_H */