hash-4k.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_POWERPC_BOOK3S_64_HASH_4K_H
  3. #define _ASM_POWERPC_BOOK3S_64_HASH_4K_H
  4. /*
  5. * Entries per page directory level. The PTE level must use a 64b record
  6. * for each page table entry. The PMD and PGD level use a 32b record for
  7. * each entry by assuming that each entry is page aligned.
  8. */
  9. #define H_PTE_INDEX_SIZE 9
  10. #define H_PMD_INDEX_SIZE 7
  11. #define H_PUD_INDEX_SIZE 9
  12. #define H_PGD_INDEX_SIZE 9
  13. #ifndef __ASSEMBLY__
  14. #define H_PTE_TABLE_SIZE (sizeof(pte_t) << H_PTE_INDEX_SIZE)
  15. #define H_PMD_TABLE_SIZE (sizeof(pmd_t) << H_PMD_INDEX_SIZE)
  16. #define H_PUD_TABLE_SIZE (sizeof(pud_t) << H_PUD_INDEX_SIZE)
  17. #define H_PGD_TABLE_SIZE (sizeof(pgd_t) << H_PGD_INDEX_SIZE)
  18. /* PTE flags to conserve for HPTE identification */
  19. #define _PAGE_HPTEFLAGS (H_PAGE_BUSY | H_PAGE_HASHPTE | \
  20. H_PAGE_F_SECOND | H_PAGE_F_GIX)
  21. /*
  22. * Not supported by 4k linux page size
  23. */
  24. #define H_PAGE_4K_PFN 0x0
  25. #define H_PAGE_THP_HUGE 0x0
  26. #define H_PAGE_COMBO 0x0
  27. #define H_PTE_FRAG_NR 0
  28. #define H_PTE_FRAG_SIZE_SHIFT 0
  29. /*
  30. * On all 4K setups, remap_4k_pfn() equates to remap_pfn_range()
  31. */
  32. #define remap_4k_pfn(vma, addr, pfn, prot) \
  33. remap_pfn_range((vma), (addr), (pfn), PAGE_SIZE, (prot))
  34. #ifdef CONFIG_HUGETLB_PAGE
  35. static inline int hash__hugepd_ok(hugepd_t hpd)
  36. {
  37. unsigned long hpdval = hpd_val(hpd);
  38. /*
  39. * if it is not a pte and have hugepd shift mask
  40. * set, then it is a hugepd directory pointer
  41. */
  42. if (!(hpdval & _PAGE_PTE) &&
  43. ((hpdval & HUGEPD_SHIFT_MASK) != 0))
  44. return true;
  45. return false;
  46. }
  47. #endif
  48. #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  49. static inline char *get_hpte_slot_array(pmd_t *pmdp)
  50. {
  51. BUG();
  52. return NULL;
  53. }
  54. static inline unsigned int hpte_valid(unsigned char *hpte_slot_array, int index)
  55. {
  56. BUG();
  57. return 0;
  58. }
  59. static inline unsigned int hpte_hash_index(unsigned char *hpte_slot_array,
  60. int index)
  61. {
  62. BUG();
  63. return 0;
  64. }
  65. static inline void mark_hpte_slot_valid(unsigned char *hpte_slot_array,
  66. unsigned int index, unsigned int hidx)
  67. {
  68. BUG();
  69. }
  70. static inline int hash__pmd_trans_huge(pmd_t pmd)
  71. {
  72. return 0;
  73. }
  74. static inline int hash__pmd_same(pmd_t pmd_a, pmd_t pmd_b)
  75. {
  76. BUG();
  77. return 0;
  78. }
  79. static inline pmd_t hash__pmd_mkhuge(pmd_t pmd)
  80. {
  81. BUG();
  82. return pmd;
  83. }
  84. extern unsigned long hash__pmd_hugepage_update(struct mm_struct *mm,
  85. unsigned long addr, pmd_t *pmdp,
  86. unsigned long clr, unsigned long set);
  87. extern pmd_t hash__pmdp_collapse_flush(struct vm_area_struct *vma,
  88. unsigned long address, pmd_t *pmdp);
  89. extern void hash__pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp,
  90. pgtable_t pgtable);
  91. extern pgtable_t hash__pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);
  92. extern pmd_t hash__pmdp_huge_get_and_clear(struct mm_struct *mm,
  93. unsigned long addr, pmd_t *pmdp);
  94. extern int hash__has_transparent_hugepage(void);
  95. #endif
  96. #endif /* !__ASSEMBLY__ */
  97. #endif /* _ASM_POWERPC_BOOK3S_64_HASH_4K_H */