pgtable-bits.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  4. */
  5. #ifndef _ASM_PGTABLE_BITS_H
  6. #define _ASM_PGTABLE_BITS_H
  7. /* Page table bits */
  8. #ifdef CONFIG_32BIT
  9. #define _PAGE_VALID_SHIFT 0
  10. #define _PAGE_ACCESSED_SHIFT 0 /* Reuse Valid for Accessed */
  11. #define _PAGE_DIRTY_SHIFT 1
  12. #define _PAGE_PLV_SHIFT 2 /* 2~3, two bits */
  13. #define _CACHE_SHIFT 4 /* 4~5, two bits */
  14. #define _PAGE_GLOBAL_SHIFT 6
  15. #define _PAGE_HUGE_SHIFT 6 /* HUGE is a PMD bit */
  16. #define _PAGE_PRESENT_SHIFT 7
  17. #define _PAGE_PFN_SHIFT 8
  18. #define _PAGE_HGLOBAL_SHIFT 12 /* HGlobal is a PMD bit */
  19. #define _PAGE_SWP_EXCLUSIVE_SHIFT 13
  20. #define _PAGE_PFN_END_SHIFT 28
  21. #define _PAGE_WRITE_SHIFT 29
  22. #define _PAGE_MODIFIED_SHIFT 30
  23. #define _PAGE_PRESENT_INVALID_SHIFT 31
  24. #endif
  25. #ifdef CONFIG_64BIT
  26. #define _PAGE_VALID_SHIFT 0
  27. #define _PAGE_ACCESSED_SHIFT 0 /* Reuse Valid for Accessed */
  28. #define _PAGE_DIRTY_SHIFT 1
  29. #define _PAGE_PLV_SHIFT 2 /* 2~3, two bits */
  30. #define _CACHE_SHIFT 4 /* 4~5, two bits */
  31. #define _PAGE_GLOBAL_SHIFT 6
  32. #define _PAGE_HUGE_SHIFT 6 /* HUGE is a PMD bit */
  33. #define _PAGE_PRESENT_SHIFT 7
  34. #define _PAGE_WRITE_SHIFT 8
  35. #define _PAGE_MODIFIED_SHIFT 9
  36. #define _PAGE_PROTNONE_SHIFT 10
  37. #define _PAGE_SPECIAL_SHIFT 11
  38. #define _PAGE_PFN_SHIFT 12
  39. #define _PAGE_HGLOBAL_SHIFT 12 /* HGlobal is a PMD bit */
  40. #define _PAGE_SWP_EXCLUSIVE_SHIFT 23
  41. #define _PAGE_PFN_END_SHIFT 48
  42. #define _PAGE_PRESENT_INVALID_SHIFT 60
  43. #define _PAGE_NO_READ_SHIFT 61
  44. #define _PAGE_NO_EXEC_SHIFT 62
  45. #define _PAGE_RPLV_SHIFT 63
  46. #endif
  47. /* Used by software */
  48. #define _PAGE_PRESENT (_ULCAST_(1) << _PAGE_PRESENT_SHIFT)
  49. #define _PAGE_PRESENT_INVALID (_ULCAST_(1) << _PAGE_PRESENT_INVALID_SHIFT)
  50. #define _PAGE_WRITE (_ULCAST_(1) << _PAGE_WRITE_SHIFT)
  51. #define _PAGE_ACCESSED (_ULCAST_(1) << _PAGE_ACCESSED_SHIFT)
  52. #define _PAGE_MODIFIED (_ULCAST_(1) << _PAGE_MODIFIED_SHIFT)
  53. #ifdef CONFIG_32BIT
  54. #define _PAGE_PROTNONE 0
  55. #define _PAGE_SPECIAL 0
  56. #else
  57. #define _PAGE_PROTNONE (_ULCAST_(1) << _PAGE_PROTNONE_SHIFT)
  58. #define _PAGE_SPECIAL (_ULCAST_(1) << _PAGE_SPECIAL_SHIFT)
  59. #endif
  60. /* We borrow bit 13/23 to store the exclusive marker in swap PTEs. */
  61. #define _PAGE_SWP_EXCLUSIVE (_ULCAST_(1) << _PAGE_SWP_EXCLUSIVE_SHIFT)
  62. /* Used by TLB hardware (placed in EntryLo*) */
  63. #define _PAGE_VALID (_ULCAST_(1) << _PAGE_VALID_SHIFT)
  64. #define _PAGE_DIRTY (_ULCAST_(1) << _PAGE_DIRTY_SHIFT)
  65. #define _PAGE_PLV (_ULCAST_(3) << _PAGE_PLV_SHIFT)
  66. #define _PAGE_GLOBAL (_ULCAST_(1) << _PAGE_GLOBAL_SHIFT)
  67. #define _PAGE_HUGE (_ULCAST_(1) << _PAGE_HUGE_SHIFT)
  68. #define _PAGE_HGLOBAL (_ULCAST_(1) << _PAGE_HGLOBAL_SHIFT)
  69. #ifdef CONFIG_32BIT
  70. #define _PAGE_NO_READ 0
  71. #define _PAGE_NO_EXEC 0
  72. #define _PAGE_RPLV 0
  73. #else
  74. #define _PAGE_NO_READ (_ULCAST_(1) << _PAGE_NO_READ_SHIFT)
  75. #define _PAGE_NO_EXEC (_ULCAST_(1) << _PAGE_NO_EXEC_SHIFT)
  76. #define _PAGE_RPLV (_ULCAST_(1) << _PAGE_RPLV_SHIFT)
  77. #endif
  78. #define _CACHE_MASK (_ULCAST_(3) << _CACHE_SHIFT)
  79. #define PFN_PTE_SHIFT (PAGE_SHIFT - 12 + _PAGE_PFN_SHIFT)
  80. #define _PAGE_USER (PLV_USER << _PAGE_PLV_SHIFT)
  81. #define _PAGE_KERN (PLV_KERN << _PAGE_PLV_SHIFT)
  82. #define _PFN_MASK (~((_ULCAST_(1) << (PFN_PTE_SHIFT)) - 1) & \
  83. ((_ULCAST_(1) << (_PAGE_PFN_END_SHIFT)) - 1))
  84. /*
  85. * Cache attributes
  86. */
  87. #ifndef _CACHE_SUC
  88. #define _CACHE_SUC (0<<_CACHE_SHIFT) /* Strong-ordered UnCached */
  89. #endif
  90. #ifndef _CACHE_CC
  91. #define _CACHE_CC (1<<_CACHE_SHIFT) /* Coherent Cached */
  92. #endif
  93. #ifndef _CACHE_WUC
  94. #define _CACHE_WUC (2<<_CACHE_SHIFT) /* Weak-ordered UnCached */
  95. #endif
  96. #define __READABLE (_PAGE_VALID)
  97. #define __WRITEABLE (_PAGE_DIRTY | _PAGE_WRITE)
  98. #define _PAGE_CHG_MASK (_PAGE_MODIFIED | _PAGE_SPECIAL | _PFN_MASK | _CACHE_MASK | _PAGE_PLV)
  99. #define _HPAGE_CHG_MASK (_PAGE_MODIFIED | _PAGE_SPECIAL | _PFN_MASK | _CACHE_MASK | _PAGE_PLV | _PAGE_HUGE)
  100. #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_NO_READ | \
  101. _PAGE_USER | _CACHE_CC)
  102. #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_WRITE | \
  103. _PAGE_USER | _CACHE_CC)
  104. #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | _CACHE_CC)
  105. #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
  106. _PAGE_GLOBAL | _PAGE_KERN | _CACHE_CC)
  107. #define PAGE_KERNEL_SUC __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
  108. _PAGE_GLOBAL | _PAGE_KERN | _CACHE_SUC)
  109. #define PAGE_KERNEL_WUC __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | \
  110. _PAGE_GLOBAL | _PAGE_KERN | _CACHE_WUC)
  111. #ifndef __ASSEMBLER__
  112. #define _PAGE_IOREMAP pgprot_val(PAGE_KERNEL_SUC)
  113. #define pgprot_nx pgprot_nx
  114. static inline pgprot_t pgprot_nx(pgprot_t _prot)
  115. {
  116. return __pgprot(pgprot_val(_prot) | _PAGE_NO_EXEC);
  117. }
  118. #define pgprot_noncached pgprot_noncached
  119. static inline pgprot_t pgprot_noncached(pgprot_t _prot)
  120. {
  121. unsigned long prot = pgprot_val(_prot);
  122. prot = (prot & ~_CACHE_MASK) | _CACHE_SUC;
  123. return __pgprot(prot);
  124. }
  125. extern bool wc_enabled;
  126. #define pgprot_writecombine pgprot_writecombine
  127. static inline pgprot_t pgprot_writecombine(pgprot_t _prot)
  128. {
  129. unsigned long prot = pgprot_val(_prot);
  130. prot = (prot & ~_CACHE_MASK) | (wc_enabled ? _CACHE_WUC : _CACHE_SUC);
  131. return __pgprot(prot);
  132. }
  133. #endif /* !__ASSEMBLER__ */
  134. #endif /* _ASM_PGTABLE_BITS_H */