mcf_pgalloc.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef M68K_MCF_PGALLOC_H
  3. #define M68K_MCF_PGALLOC_H
  4. #include <asm/tlb.h>
  5. #include <asm/tlbflush.h>
  6. extern inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  7. {
  8. free_page((unsigned long) pte);
  9. }
  10. extern const char bad_pmd_string[];
  11. extern inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
  12. unsigned long address)
  13. {
  14. unsigned long page = __get_free_page(GFP_DMA);
  15. if (!page)
  16. return NULL;
  17. memset((void *)page, 0, PAGE_SIZE);
  18. return (pte_t *) (page);
  19. }
  20. extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address)
  21. {
  22. return (pmd_t *) pgd;
  23. }
  24. #define pmd_alloc_one_fast(mm, address) ({ BUG(); ((pmd_t *)1); })
  25. #define pmd_alloc_one(mm, address) ({ BUG(); ((pmd_t *)2); })
  26. #define pte_alloc_one_fast(mm, addr) pte_alloc_one(mm, addr)
  27. #define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \
  28. (unsigned long)(page_address(page)))
  29. #define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte))
  30. #define pmd_pgtable(pmd) pmd_page(pmd)
  31. static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page,
  32. unsigned long address)
  33. {
  34. pgtable_page_dtor(page);
  35. __free_page(page);
  36. }
  37. #define __pmd_free_tlb(tlb, pmd, address) do { } while (0)
  38. static inline struct page *pte_alloc_one(struct mm_struct *mm,
  39. unsigned long address)
  40. {
  41. struct page *page = alloc_pages(GFP_DMA, 0);
  42. pte_t *pte;
  43. if (!page)
  44. return NULL;
  45. if (!pgtable_page_ctor(page)) {
  46. __free_page(page);
  47. return NULL;
  48. }
  49. pte = kmap(page);
  50. if (pte) {
  51. clear_page(pte);
  52. __flush_page_to_ram(pte);
  53. flush_tlb_kernel_page(pte);
  54. nocache_page(pte);
  55. }
  56. kunmap(page);
  57. return page;
  58. }
  59. static inline void pte_free(struct mm_struct *mm, struct page *page)
  60. {
  61. pgtable_page_dtor(page);
  62. __free_page(page);
  63. }
  64. /*
  65. * In our implementation, each pgd entry contains 1 pmd that is never allocated
  66. * or freed. pgd_present is always 1, so this should never be called. -NL
  67. */
  68. #define pmd_free(mm, pmd) BUG()
  69. static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
  70. {
  71. free_page((unsigned long) pgd);
  72. }
  73. static inline pgd_t *pgd_alloc(struct mm_struct *mm)
  74. {
  75. pgd_t *new_pgd;
  76. new_pgd = (pgd_t *)__get_free_page(GFP_DMA | __GFP_NOWARN);
  77. if (!new_pgd)
  78. return NULL;
  79. memcpy(new_pgd, swapper_pg_dir, PAGE_SIZE);
  80. memset(new_pgd, 0, PAGE_OFFSET >> PGDIR_SHIFT);
  81. return new_pgd;
  82. }
  83. #define pgd_populate(mm, pmd, pte) BUG()
  84. #endif /* M68K_MCF_PGALLOC_H */