]>
Commit | Line | Data |
---|---|---|
50acfb2b | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
07037db5 PD |
2 | /* |
3 | * Copyright (C) 2012 Regents of the University of California | |
07037db5 PD |
4 | */ |
5 | ||
6 | #ifndef _ASM_RISCV_PGTABLE_64_H | |
7 | #define _ASM_RISCV_PGTABLE_64_H | |
8 | ||
9 | #include <linux/const.h> | |
10 | ||
11 | #define PGDIR_SHIFT 30 | |
12 | /* Size of region mapped by a page global directory */ | |
13 | #define PGDIR_SIZE (_AC(1, UL) << PGDIR_SHIFT) | |
14 | #define PGDIR_MASK (~(PGDIR_SIZE - 1)) | |
15 | ||
16 | #define PMD_SHIFT 21 | |
17 | /* Size of region mapped by a page middle directory */ | |
18 | #define PMD_SIZE (_AC(1, UL) << PMD_SHIFT) | |
19 | #define PMD_MASK (~(PMD_SIZE - 1)) | |
20 | ||
21 | /* Page Middle Directory entry */ | |
22 | typedef struct { | |
23 | unsigned long pmd; | |
24 | } pmd_t; | |
25 | ||
26 | #define pmd_val(x) ((x).pmd) | |
27 | #define __pmd(x) ((pmd_t) { (x) }) | |
28 | ||
29 | #define PTRS_PER_PMD (PAGE_SIZE / sizeof(pmd_t)) | |
30 | ||
31 | static inline int pud_present(pud_t pud) | |
32 | { | |
33 | return (pud_val(pud) & _PAGE_PRESENT); | |
34 | } | |
35 | ||
36 | static inline int pud_none(pud_t pud) | |
37 | { | |
38 | return (pud_val(pud) == 0); | |
39 | } | |
40 | ||
41 | static inline int pud_bad(pud_t pud) | |
42 | { | |
43 | return !pud_present(pud); | |
44 | } | |
45 | ||
af6513ea SP |
46 | #define pud_leaf pud_leaf |
47 | static inline int pud_leaf(pud_t pud) | |
48 | { | |
f5397c3e | 49 | return pud_present(pud) && (pud_val(pud) & _PAGE_LEAF); |
af6513ea SP |
50 | } |
51 | ||
07037db5 PD |
52 | static inline void set_pud(pud_t *pudp, pud_t pud) |
53 | { | |
54 | *pudp = pud; | |
55 | } | |
56 | ||
57 | static inline void pud_clear(pud_t *pudp) | |
58 | { | |
59 | set_pud(pudp, __pud(0)); | |
60 | } | |
61 | ||
9cf6fa24 | 62 | static inline pmd_t *pud_pgtable(pud_t pud) |
07037db5 | 63 | { |
9cf6fa24 | 64 | return (pmd_t *)pfn_to_virt(pud_val(pud) >> _PAGE_PFN_SHIFT); |
07037db5 PD |
65 | } |
66 | ||
8ad8b727 NH |
67 | static inline struct page *pud_page(pud_t pud) |
68 | { | |
69 | return pfn_to_page(pud_val(pud) >> _PAGE_PFN_SHIFT); | |
70 | } | |
71 | ||
07037db5 PD |
72 | static inline pmd_t pfn_pmd(unsigned long pfn, pgprot_t prot) |
73 | { | |
74 | return __pmd((pfn << _PAGE_PFN_SHIFT) | pgprot_val(prot)); | |
75 | } | |
76 | ||
671f9a3e AP |
77 | static inline unsigned long _pmd_pfn(pmd_t pmd) |
78 | { | |
79 | return pmd_val(pmd) >> _PAGE_PFN_SHIFT; | |
80 | } | |
81 | ||
9eb4fcff NS |
82 | #define mk_pmd(page, prot) pfn_pmd(page_to_pfn(page), prot) |
83 | ||
07037db5 PD |
84 | #define pmd_ERROR(e) \ |
85 | pr_err("%s:%d: bad pmd %016lx.\n", __FILE__, __LINE__, pmd_val(e)) | |
86 | ||
87 | #endif /* _ASM_RISCV_PGTABLE_64_H */ |