hash-4k.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. #define H_PAGE_F_GIX_SHIFT 53
  19. #define H_PAGE_F_SECOND _RPAGE_RPN44 /* HPTE is in 2ndary HPTEG */
  20. #define H_PAGE_F_GIX (_RPAGE_RPN43 | _RPAGE_RPN42 | _RPAGE_RPN41)
  21. #define H_PAGE_BUSY _RPAGE_RSV1 /* software: PTE & hash are busy */
  22. #define H_PAGE_HASHPTE _RPAGE_RSV2 /* software: PTE & hash are busy */
  23. /* PTE flags to conserve for HPTE identification */
  24. #define _PAGE_HPTEFLAGS (H_PAGE_BUSY | H_PAGE_HASHPTE | \
  25. H_PAGE_F_SECOND | H_PAGE_F_GIX)
  26. /*
  27. * Not supported by 4k linux page size
  28. */
  29. #define H_PAGE_4K_PFN 0x0
  30. #define H_PAGE_THP_HUGE 0x0
  31. #define H_PAGE_COMBO 0x0
  32. #define H_PTE_FRAG_NR 0
  33. #define H_PTE_FRAG_SIZE_SHIFT 0
  34. /*
  35. * On all 4K setups, remap_4k_pfn() equates to remap_pfn_range()
  36. */
  37. #define remap_4k_pfn(vma, addr, pfn, prot) \
  38. remap_pfn_range((vma), (addr), (pfn), PAGE_SIZE, (prot))
  39. #ifdef CONFIG_HUGETLB_PAGE
  40. static inline int hash__hugepd_ok(hugepd_t hpd)
  41. {
  42. unsigned long hpdval = hpd_val(hpd);
  43. /*
  44. * if it is not a pte and have hugepd shift mask
  45. * set, then it is a hugepd directory pointer
  46. */
  47. if (!(hpdval & _PAGE_PTE) &&
  48. ((hpdval & HUGEPD_SHIFT_MASK) != 0))
  49. return true;
  50. return false;
  51. }
  52. #endif
  53. /*
  54. * 4K PTE format is different from 64K PTE format. Saving the hash_slot is just
  55. * a matter of returning the PTE bits that need to be modified. On 64K PTE,
  56. * things are a little more involved and hence needs many more parameters to
  57. * accomplish the same. However we want to abstract this out from the caller by
  58. * keeping the prototype consistent across the two formats.
  59. */
  60. static inline unsigned long pte_set_hidx(pte_t *ptep, real_pte_t rpte,
  61. unsigned int subpg_index, unsigned long hidx,
  62. int offset)
  63. {
  64. return (hidx << H_PAGE_F_GIX_SHIFT) &
  65. (H_PAGE_F_SECOND | H_PAGE_F_GIX);
  66. }
  67. #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  68. static inline char *get_hpte_slot_array(pmd_t *pmdp)
  69. {
  70. BUG();
  71. return NULL;
  72. }
  73. static inline unsigned int hpte_valid(unsigned char *hpte_slot_array, int index)
  74. {
  75. BUG();
  76. return 0;
  77. }
  78. static inline unsigned int hpte_hash_index(unsigned char *hpte_slot_array,
  79. int index)
  80. {
  81. BUG();
  82. return 0;
  83. }
  84. static inline void mark_hpte_slot_valid(unsigned char *hpte_slot_array,
  85. unsigned int index, unsigned int hidx)
  86. {
  87. BUG();
  88. }
  89. static inline int hash__pmd_trans_huge(pmd_t pmd)
  90. {
  91. return 0;
  92. }
  93. static inline int hash__pmd_same(pmd_t pmd_a, pmd_t pmd_b)
  94. {
  95. BUG();
  96. return 0;
  97. }
  98. static inline pmd_t hash__pmd_mkhuge(pmd_t pmd)
  99. {
  100. BUG();
  101. return pmd;
  102. }
  103. extern unsigned long hash__pmd_hugepage_update(struct mm_struct *mm,
  104. unsigned long addr, pmd_t *pmdp,
  105. unsigned long clr, unsigned long set);
  106. extern pmd_t hash__pmdp_collapse_flush(struct vm_area_struct *vma,
  107. unsigned long address, pmd_t *pmdp);
  108. extern void hash__pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp,
  109. pgtable_t pgtable);
  110. extern pgtable_t hash__pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);
  111. extern pmd_t hash__pmdp_huge_get_and_clear(struct mm_struct *mm,
  112. unsigned long addr, pmd_t *pmdp);
  113. extern int hash__has_transparent_hugepage(void);
  114. #endif
  115. #endif /* !__ASSEMBLY__ */
  116. #endif /* _ASM_POWERPC_BOOK3S_64_HASH_4K_H */