cache_hal.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <sys/param.h>
  7. #include <stdint.h>
  8. #include "sdkconfig.h"
  9. #include "esp_err.h"
  10. #include "esp_attr.h"
  11. #include "hal/assert.h"
  12. #include "hal/cache_hal.h"
  13. #include "hal/cache_types.h"
  14. #include "hal/cache_ll.h"
  15. #include "hal/mmu_hal.h"
  16. #include "hal/mmu_ll.h"
  17. #include "soc/soc_caps.h"
  18. #include "rom/cache.h"
  19. /*------------------------------------------------------------------------------
  20. * Unified Cache Control
  21. * See cache_hal.h for more info about these HAL APIs
  22. * This file is in internal RAM.
  23. * Now this file doesn't compile on ESP32
  24. *----------------------------------------------------------------------------*/
  25. /**
  26. * To know if autoload is enabled or not.
  27. *
  28. * We should have a unified flag for this aim, then we don't need to call following 2 functions
  29. * to know the flag.
  30. *
  31. * Suggest ROM keeping this flag value to BIT(2). Then we can replace following lines to:
  32. * #define DATA_AUTOLOAD_FLAG BIT(2)
  33. * #define INST_AUTOLOAD_FLAG BIT(2)
  34. */
  35. #if CONFIG_IDF_TARGET_ESP32P4 //TODO: IDF-7516
  36. #define DATA_AUTOLOAD_FLAG Cache_Disable_L2_Cache()
  37. #define INST_AUTOLOAD_FLAG Cache_Disable_L2_Cache()
  38. #else
  39. #define DATA_AUTOLOAD_FLAG Cache_Disable_ICache()
  40. #define INST_AUTOLOAD_FLAG Cache_Disable_ICache()
  41. #endif
  42. /**
  43. * Necessary hal contexts, could be maintained by upper layer in the future
  44. */
  45. typedef struct {
  46. uint32_t data_autoload_flag;
  47. uint32_t inst_autoload_flag;
  48. #if CACHE_LL_ENABLE_DISABLE_STATE_SW
  49. // There's no register indicating if cache is enabled on these chips, use sw flag to save this state.
  50. volatile bool cache_enabled;
  51. #endif
  52. } cache_hal_context_t;
  53. static cache_hal_context_t ctx;
  54. void cache_hal_init(void)
  55. {
  56. #if SOC_SHARED_IDCACHE_SUPPORTED
  57. ctx.data_autoload_flag = INST_AUTOLOAD_FLAG;
  58. #if CONFIG_IDF_TARGET_ESP32P4
  59. Cache_Enable_L2_Cache(ctx.data_autoload_flag);
  60. #else
  61. Cache_Enable_ICache(ctx.data_autoload_flag);
  62. #endif
  63. #else
  64. ctx.data_autoload_flag = DATA_AUTOLOAD_FLAG;
  65. Cache_Enable_DCache(ctx.data_autoload_flag);
  66. ctx.inst_autoload_flag = INST_AUTOLOAD_FLAG;
  67. Cache_Enable_ICache(ctx.inst_autoload_flag);
  68. #endif
  69. cache_ll_l1_enable_bus(0, CACHE_LL_DEFAULT_DBUS_MASK);
  70. cache_ll_l1_enable_bus(0, CACHE_LL_DEFAULT_IBUS_MASK);
  71. #if !CONFIG_FREERTOS_UNICORE
  72. cache_ll_l1_enable_bus(1, CACHE_LL_DEFAULT_DBUS_MASK);
  73. cache_ll_l1_enable_bus(1, CACHE_LL_DEFAULT_IBUS_MASK);
  74. #endif
  75. #if CACHE_LL_ENABLE_DISABLE_STATE_SW
  76. ctx.cache_enabled = 1;
  77. #endif
  78. }
  79. void cache_hal_disable(cache_type_t type)
  80. {
  81. #if SOC_SHARED_IDCACHE_SUPPORTED
  82. #if CONFIG_IDF_TARGET_ESP32P4
  83. Cache_Disable_L2_Cache();
  84. #else
  85. Cache_Disable_ICache();
  86. #endif
  87. #else
  88. if (type == CACHE_TYPE_DATA) {
  89. Cache_Disable_DCache();
  90. } else if (type == CACHE_TYPE_INSTRUCTION) {
  91. Cache_Disable_ICache();
  92. } else {
  93. Cache_Disable_ICache();
  94. Cache_Disable_DCache();
  95. }
  96. #endif
  97. #if CACHE_LL_ENABLE_DISABLE_STATE_SW
  98. ctx.cache_enabled = 0;
  99. #endif
  100. }
  101. void cache_hal_enable(cache_type_t type)
  102. {
  103. #if SOC_SHARED_IDCACHE_SUPPORTED
  104. #if CONFIG_IDF_TARGET_ESP32P4
  105. Cache_Enable_L2_Cache(ctx.inst_autoload_flag);
  106. #else
  107. Cache_Enable_ICache(ctx.inst_autoload_flag);
  108. #endif
  109. #else
  110. if (type == CACHE_TYPE_DATA) {
  111. Cache_Enable_DCache(ctx.data_autoload_flag);
  112. } else if (type == CACHE_TYPE_INSTRUCTION) {
  113. Cache_Enable_ICache(ctx.inst_autoload_flag);
  114. } else {
  115. Cache_Enable_ICache(ctx.inst_autoload_flag);
  116. Cache_Enable_DCache(ctx.data_autoload_flag);
  117. }
  118. #endif
  119. #if CACHE_LL_ENABLE_DISABLE_STATE_SW
  120. ctx.cache_enabled = 1;
  121. #endif
  122. }
  123. void cache_hal_suspend(cache_type_t type)
  124. {
  125. #if SOC_CACHE_L2_SUPPORTED
  126. Cache_Suspend_L2_Cache();
  127. #elif SOC_SHARED_IDCACHE_SUPPORTED
  128. Cache_Suspend_ICache();
  129. #else
  130. if (type == CACHE_TYPE_DATA) {
  131. Cache_Suspend_DCache();
  132. } else if (type == CACHE_TYPE_INSTRUCTION) {
  133. Cache_Suspend_ICache();
  134. } else {
  135. Cache_Suspend_ICache();
  136. Cache_Suspend_DCache();
  137. }
  138. #endif
  139. #if CACHE_LL_ENABLE_DISABLE_STATE_SW
  140. ctx.cache_enabled = 0;
  141. #endif
  142. }
  143. void cache_hal_resume(cache_type_t type)
  144. {
  145. #if SOC_CACHE_L2_SUPPORTED
  146. Cache_Resume_L2_Cache(ctx.inst_autoload_flag);
  147. #elif SOC_SHARED_IDCACHE_SUPPORTED
  148. Cache_Resume_ICache(ctx.inst_autoload_flag);
  149. #else
  150. if (type == CACHE_TYPE_DATA) {
  151. Cache_Resume_DCache(ctx.data_autoload_flag);
  152. } else if (type == CACHE_TYPE_INSTRUCTION) {
  153. Cache_Resume_ICache(ctx.inst_autoload_flag);
  154. } else {
  155. Cache_Resume_ICache(ctx.inst_autoload_flag);
  156. Cache_Resume_DCache(ctx.data_autoload_flag);
  157. }
  158. #endif
  159. #if CACHE_LL_ENABLE_DISABLE_STATE_SW
  160. ctx.cache_enabled = 1;
  161. #endif
  162. }
  163. bool cache_hal_is_cache_enabled(cache_type_t type)
  164. {
  165. #if CACHE_LL_ENABLE_DISABLE_STATE_SW
  166. return ctx.cache_enabled;
  167. #else
  168. return cache_ll_l1_is_cache_enabled(0, type);
  169. #endif
  170. }
  171. void cache_hal_invalidate_addr(uint32_t vaddr, uint32_t size)
  172. {
  173. //Now only esp32 has 2 MMUs, this file doesn't build on esp32
  174. HAL_ASSERT(mmu_hal_check_valid_ext_vaddr_region(0, vaddr, size, MMU_VADDR_DATA | MMU_VADDR_INSTRUCTION));
  175. #if CONFIG_IDF_TARGET_ESP32P4
  176. Cache_Invalidate_Addr(CACHE_MAP_L1_DCACHE | CACHE_MAP_L2_CACHE, vaddr, size);
  177. #else
  178. Cache_Invalidate_Addr(vaddr, size);
  179. #endif
  180. }
  181. #if SOC_CACHE_WRITEBACK_SUPPORTED
  182. void cache_hal_writeback_addr(uint32_t vaddr, uint32_t size)
  183. {
  184. HAL_ASSERT(mmu_hal_check_valid_ext_vaddr_region(0, vaddr, size, MMU_VADDR_DATA));
  185. #if CONFIG_IDF_TARGET_ESP32P4
  186. Cache_WriteBack_Addr(CACHE_MAP_L1_DCACHE, vaddr, size);
  187. Cache_WriteBack_Addr(CACHE_MAP_L2_CACHE, vaddr, size);
  188. #else
  189. Cache_WriteBack_Addr(vaddr, size);
  190. #endif
  191. }
  192. #endif //#if SOC_CACHE_WRITEBACK_SUPPORTED
  193. #if SOC_CACHE_FREEZE_SUPPORTED
  194. void cache_hal_freeze(cache_type_t type)
  195. {
  196. #if SOC_SHARED_IDCACHE_SUPPORTED
  197. #if CONFIG_IDF_TARGET_ESP32P4
  198. Cache_Freeze_L2_Cache_Enable(CACHE_FREEZE_ACK_BUSY);
  199. #else
  200. Cache_Freeze_ICache_Enable(CACHE_FREEZE_ACK_BUSY);
  201. #endif
  202. #else
  203. if (type == CACHE_TYPE_DATA) {
  204. Cache_Freeze_DCache_Enable(CACHE_FREEZE_ACK_BUSY);
  205. } else if (type == CACHE_TYPE_INSTRUCTION) {
  206. Cache_Freeze_ICache_Enable(CACHE_FREEZE_ACK_BUSY);
  207. } else {
  208. Cache_Freeze_ICache_Enable(CACHE_FREEZE_ACK_BUSY);
  209. Cache_Freeze_DCache_Enable(CACHE_FREEZE_ACK_BUSY);
  210. }
  211. #endif
  212. }
  213. void cache_hal_unfreeze(cache_type_t type)
  214. {
  215. #if SOC_SHARED_IDCACHE_SUPPORTED
  216. #if CONFIG_IDF_TARGET_ESP32P4
  217. Cache_Freeze_L2_Cache_Disable();
  218. #else
  219. Cache_Freeze_ICache_Disable();
  220. #endif
  221. #else
  222. if (type == CACHE_TYPE_DATA) {
  223. Cache_Freeze_DCache_Disable();
  224. } else if (type == CACHE_TYPE_INSTRUCTION) {
  225. Cache_Freeze_ICache_Disable();
  226. } else {
  227. Cache_Freeze_DCache_Disable();
  228. Cache_Freeze_ICache_Disable();
  229. }
  230. #endif
  231. }
  232. #endif //#if SOC_CACHE_FREEZE_SUPPORTED
  233. uint32_t cache_hal_get_cache_line_size(cache_type_t type)
  234. {
  235. #if SOC_SHARED_IDCACHE_SUPPORTED
  236. #if CONFIG_IDF_TARGET_ESP32P4
  237. return Cache_Get_L2_Cache_Line_Size();
  238. #else
  239. return Cache_Get_ICache_Line_Size();
  240. #endif
  241. #else
  242. uint32_t size = 0;
  243. if (type == CACHE_TYPE_DATA) {
  244. size = Cache_Get_DCache_Line_Size();
  245. } else if (type == CACHE_TYPE_INSTRUCTION) {
  246. size = Cache_Get_ICache_Line_Size();
  247. } else {
  248. HAL_ASSERT(false);
  249. }
  250. return size;
  251. #endif
  252. }