Commit | Line | Data |
---|---|---|
50acfb2b | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
07037db5 PD |
2 | /* |
3 | * Copyright (C) 2009 Chen Liqin <liqin.chen@sunplusct.com> | |
4 | * Copyright (C) 2012 Regents of the University of California | |
07037db5 PD |
5 | */ |
6 | ||
7 | #ifndef _ASM_RISCV_PGALLOC_H | |
8 | #define _ASM_RISCV_PGALLOC_H | |
9 | ||
10 | #include <linux/mm.h> | |
11 | #include <asm/tlb.h> | |
12 | ||
6bd33e1e | 13 | #ifdef CONFIG_MMU |
1355c31e | 14 | #include <asm-generic/pgalloc.h> |
d1b46fe5 | 15 | |
07037db5 PD |
16 | static inline void pmd_populate_kernel(struct mm_struct *mm, |
17 | pmd_t *pmd, pte_t *pte) | |
18 | { | |
19 | unsigned long pfn = virt_to_pfn(pte); | |
20 | ||
21 | set_pmd(pmd, __pmd((pfn << _PAGE_PFN_SHIFT) | _PAGE_TABLE)); | |
22 | } | |
23 | ||
24 | static inline void pmd_populate(struct mm_struct *mm, | |
25 | pmd_t *pmd, pgtable_t pte) | |
26 | { | |
27 | unsigned long pfn = virt_to_pfn(page_address(pte)); | |
28 | ||
29 | set_pmd(pmd, __pmd((pfn << _PAGE_PFN_SHIFT) | _PAGE_TABLE)); | |
30 | } | |
31 | ||
32 | #ifndef __PAGETABLE_PMD_FOLDED | |
33 | static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) | |
34 | { | |
35 | unsigned long pfn = virt_to_pfn(pmd); | |
36 | ||
37 | set_pud(pud, __pud((pfn << _PAGE_PFN_SHIFT) | _PAGE_TABLE)); | |
38 | } | |
39 | #endif /* __PAGETABLE_PMD_FOLDED */ | |
40 | ||
41 | #define pmd_pgtable(pmd) pmd_page(pmd) | |
42 | ||
43 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) | |
44 | { | |
45 | pgd_t *pgd; | |
46 | ||
47 | pgd = (pgd_t *)__get_free_page(GFP_KERNEL); | |
48 | if (likely(pgd != NULL)) { | |
49 | memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); | |
50 | /* Copy kernel mappings */ | |
51 | memcpy(pgd + USER_PTRS_PER_PGD, | |
52 | init_mm.pgd + USER_PTRS_PER_PGD, | |
53 | (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); | |
54 | } | |
55 | return pgd; | |
56 | } | |
57 | ||
07037db5 PD |
58 | #ifndef __PAGETABLE_PMD_FOLDED |
59 | ||
07037db5 PD |
60 | #define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd) |
61 | ||
62 | #endif /* __PAGETABLE_PMD_FOLDED */ | |
63 | ||
07037db5 PD |
64 | #define __pte_free_tlb(tlb, pte, buf) \ |
65 | do { \ | |
b4ed71f5 | 66 | pgtable_pte_page_dtor(pte); \ |
07037db5 PD |
67 | tlb_remove_page((tlb), pte); \ |
68 | } while (0) | |
6bd33e1e | 69 | #endif /* CONFIG_MMU */ |
07037db5 | 70 | |
07037db5 | 71 | #endif /* _ASM_RISCV_PGALLOC_H */ |