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_alloc_one_fast(mm, address) ({ BUG(); ((pmd_t *)1); })
32 #define pmd_alloc_one(mm, address) ({ BUG(); ((pmd_t *)2); })
34 #define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \
35 (unsigned long)(page_address(page)))
37 #define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte))
39 #define pmd_pgtable(pmd) pmd_page(pmd)
41 static inline void __pte_free_tlb(struct mmu_gather
*tlb
, pgtable_t page
,
42 unsigned long address
)
44 pgtable_pte_page_dtor(page
);
48 #define __pmd_free_tlb(tlb, pmd, address) do { } while (0)
50 static inline struct page
*pte_alloc_one(struct mm_struct
*mm
)
52 struct page
*page
= alloc_pages(GFP_DMA
, 0);
57 if (!pgtable_pte_page_ctor(page
)) {
65 __flush_page_to_ram(pte
);
66 flush_tlb_kernel_page(pte
);
74 static inline void pte_free(struct mm_struct
*mm
, struct page
*page
)
76 pgtable_pte_page_dtor(page
);
81 * In our implementation, each pgd entry contains 1 pmd that is never allocated
82 * or freed. pgd_present is always 1, so this should never be called. -NL
84 #define pmd_free(mm, pmd) BUG()
86 static inline void pgd_free(struct mm_struct
*mm
, pgd_t
*pgd
)
88 free_page((unsigned long) pgd
);
91 static inline pgd_t
*pgd_alloc(struct mm_struct
*mm
)
95 new_pgd
= (pgd_t
*)__get_free_page(GFP_DMA
| __GFP_NOWARN
);
98 memcpy(new_pgd
, swapper_pg_dir
, PAGE_SIZE
);
99 memset(new_pgd
, 0, PAGE_OFFSET
>> PGDIR_SHIFT
);
103 #define pgd_populate(mm, pmd, pte) BUG()
105 #endif /* M68K_MCF_PGALLOC_H */