blob: 22d968bfe9bb689af8c9034ae458a6d83bf8cb7f [file] [log] [blame]
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_SH_PGALLOC_H
3#define __ASM_SH_PGALLOC_H
4
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00005#include <asm/page.h>
David Brazdil0f672f62019-12-10 10:32:29 +00006#include <asm-generic/pgalloc.h>
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00007
8extern pgd_t *pgd_alloc(struct mm_struct *);
9extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
10
11#if PAGETABLE_LEVELS > 2
12extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
13extern pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address);
14extern void pmd_free(struct mm_struct *mm, pmd_t *pmd);
15#endif
16
17static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
18 pte_t *pte)
19{
20 set_pmd(pmd, __pmd((unsigned long)pte));
21}
22
23static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
24 pgtable_t pte)
25{
26 set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
27}
28#define pmd_pgtable(pmd) pmd_page(pmd)
29
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000030#define __pte_free_tlb(tlb,pte,addr) \
31do { \
David Brazdil0f672f62019-12-10 10:32:29 +000032 pgtable_pte_page_dtor(pte); \
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000033 tlb_remove_page((tlb), (pte)); \
34} while (0)
35
David Brazdil0f672f62019-12-10 10:32:29 +000036#if CONFIG_PGTABLE_LEVELS > 2
37#define __pmd_free_tlb(tlb, pmdp, addr) \
38do { \
39 struct page *page = virt_to_page(pmdp); \
40 pgtable_pmd_page_dtor(page); \
41 tlb_remove_page((tlb), page); \
42} while (0);
43#endif
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000044
45#endif /* __ASM_SH_PGALLOC_H */