armv7_mpu.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
  4. * Author(s): Vikas Manocha, <vikas.manocha@st.com> for STMicroelectronics.
  5. */
  6. #ifndef _ASM_ARMV7_MPU_H
  7. #define _ASM_ARMV7_MPU_H
  8. #ifdef CONFIG_CPU_V7M
  9. #define AP_SHIFT 24
  10. #define XN_SHIFT 28
  11. #define TEX_SHIFT 19
  12. #define S_SHIFT 18
  13. #define C_SHIFT 17
  14. #define B_SHIFT 16
  15. #else /* CONFIG_CPU_V7R */
  16. #define XN_SHIFT 12
  17. #define AP_SHIFT 8
  18. #define TEX_SHIFT 3
  19. #define S_SHIFT 2
  20. #define C_SHIFT 1
  21. #define B_SHIFT 0
  22. #endif /* CONFIG_CPU_V7R */
  23. #define CACHEABLE BIT(C_SHIFT)
  24. #define BUFFERABLE BIT(B_SHIFT)
  25. #define SHAREABLE BIT(S_SHIFT)
  26. #define REGION_SIZE_SHIFT 1
  27. #define ENABLE_REGION BIT(0)
  28. #define DISABLE_REGION 0
  29. enum region_number {
  30. REGION_0 = 0,
  31. REGION_1,
  32. REGION_2,
  33. REGION_3,
  34. REGION_4,
  35. REGION_5,
  36. REGION_6,
  37. REGION_7,
  38. };
  39. enum ap {
  40. NO_ACCESS = 0,
  41. PRIV_RW_USR_NO,
  42. PRIV_RW_USR_RO,
  43. PRIV_RW_USR_RW,
  44. UNPREDICTABLE,
  45. PRIV_RO_USR_NO,
  46. PRIV_RO_USR_RO,
  47. };
  48. enum mr_attr {
  49. STRONG_ORDER = 0,
  50. SHARED_WRITE_BUFFERED,
  51. O_I_WT_NO_WR_ALLOC,
  52. O_I_WB_NO_WR_ALLOC,
  53. O_I_NON_CACHEABLE,
  54. O_I_WB_RD_WR_ALLOC,
  55. DEVICE_NON_SHARED,
  56. };
  57. enum size {
  58. REGION_8MB = 22,
  59. REGION_16MB,
  60. REGION_32MB,
  61. REGION_64MB,
  62. REGION_128MB,
  63. REGION_256MB,
  64. REGION_512MB,
  65. REGION_1GB,
  66. REGION_2GB,
  67. REGION_4GB,
  68. };
  69. enum xn {
  70. XN_DIS = 0,
  71. XN_EN,
  72. };
  73. struct mpu_region_config {
  74. uint32_t start_addr;
  75. enum region_number region_no;
  76. enum xn xn;
  77. enum ap ap;
  78. enum mr_attr mr_attr;
  79. enum size reg_size;
  80. };
  81. void disable_mpu(void);
  82. void enable_mpu(void);
  83. int mpu_enabled(void);
  84. void mpu_config(struct mpu_region_config *reg_config);
  85. void setup_mpu_regions(struct mpu_region_config *rgns, u32 num_rgns);
  86. static inline u32 get_attr_encoding(u32 mr_attr)
  87. {
  88. u32 attr;
  89. switch (mr_attr) {
  90. case STRONG_ORDER:
  91. attr = SHAREABLE;
  92. break;
  93. case SHARED_WRITE_BUFFERED:
  94. attr = BUFFERABLE;
  95. break;
  96. case O_I_WT_NO_WR_ALLOC:
  97. attr = CACHEABLE;
  98. break;
  99. case O_I_WB_NO_WR_ALLOC:
  100. attr = CACHEABLE | BUFFERABLE;
  101. break;
  102. case O_I_NON_CACHEABLE:
  103. attr = 1 << TEX_SHIFT;
  104. break;
  105. case O_I_WB_RD_WR_ALLOC:
  106. attr = (1 << TEX_SHIFT) | CACHEABLE | BUFFERABLE;
  107. break;
  108. case DEVICE_NON_SHARED:
  109. attr = (2 << TEX_SHIFT) | BUFFERABLE;
  110. break;
  111. default:
  112. attr = 0; /* strongly ordered */
  113. break;
  114. };
  115. return attr;
  116. }
  117. #endif /* _ASM_ARMV7_MPU_H */