1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef M68K_MCF_PGALLOC_H
3 #define M68K_MCF_PGALLOC_H
6 #include <asm/tlbflush.h>
8 extern inline void pte_free_kernel(struct mm_struct
*mm
, pte_t
*pte
)
10 free_page((unsigned long) pte
);
13 extern const char bad_pmd_string
[];
15 extern inline pte_t
*pte_alloc_one_kernel(struct mm_struct
*mm
)
17 unsigned long page
= __get_free_page(GFP_DMA
);
22 memset((void *)page
, 0, PAGE_SIZE
);
23 return (pte_t
*) (page
);
26 extern inline pmd_t
*pmd_alloc_kernel(pgd_t
*pgd
, unsigned long address
)
31 #define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \
32 (unsigned long)(page_address(page)))
34 #define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte))
36 #define pmd_pgtable(pmd) pmd_page(pmd)
38 static inline void __pte_free_tlb(struct mmu_gather
*tlb
, pgtable_t page
,
39 unsigned long address
)
41 pgtable_pte_page_dtor(page
);
45 static inline struct page
*pte_alloc_one(struct mm_struct
*mm
)
47 struct page
*page
= alloc_pages(GFP_DMA
, 0);
52 if (!pgtable_pte_page_ctor(page
)) {
60 __flush_page_to_ram(pte
);
61 flush_tlb_kernel_page(pte
);
69 static inline void pte_free(struct mm_struct
*mm
, struct page
*page
)
71 pgtable_pte_page_dtor(page
);
76 * In our implementation, each pgd entry contains 1 pmd that is never allocated
77 * or freed. pgd_present is always 1, so this should never be called. -NL
79 #define pmd_free(mm, pmd) BUG()
81 static inline void pgd_free(struct mm_struct
*mm
, pgd_t
*pgd
)
83 free_page((unsigned long) pgd
);
86 static inline pgd_t
*pgd_alloc(struct mm_struct
*mm
)
90 new_pgd
= (pgd_t
*)__get_free_page(GFP_DMA
| __GFP_NOWARN
);
93 memcpy(new_pgd
, swapper_pg_dir
, PAGE_SIZE
);
94 memset(new_pgd
, 0, PAGE_OFFSET
>> PGDIR_SHIFT
);
98 #endif /* M68K_MCF_PGALLOC_H */