cache_hal.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2022 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. #define DATA_AUTOLOAD_FLAG Cache_Disable_DCache()
  36. #define INST_AUTOLOAD_FLAG Cache_Disable_ICache()
  37. /**
  38. * Necessary hal contexts, could be maintained by upper layer in the future
  39. */
  40. typedef struct {
  41. uint32_t data_autoload_flag;
  42. uint32_t inst_autoload_flag;
  43. } cache_hal_context_t;
  44. static cache_hal_context_t ctx;
  45. void cache_hal_init(void)
  46. {
  47. #if SOC_SHARED_IDCACHE_SUPPORTED
  48. ctx.data_autoload_flag = INST_AUTOLOAD_FLAG;
  49. Cache_Enable_ICache(ctx.data_autoload_flag);
  50. #else
  51. ctx.data_autoload_flag = DATA_AUTOLOAD_FLAG;
  52. Cache_Enable_DCache(ctx.data_autoload_flag);
  53. ctx.inst_autoload_flag = INST_AUTOLOAD_FLAG;
  54. Cache_Enable_ICache(ctx.inst_autoload_flag);
  55. #endif
  56. cache_ll_l1_enable_bus(0, CACHE_LL_DEFAULT_DBUS_MASK);
  57. cache_ll_l1_enable_bus(0, CACHE_LL_DEFAULT_IBUS_MASK);
  58. #if !CONFIG_FREERTOS_UNICORE
  59. cache_ll_l1_enable_bus(1, CACHE_LL_DEFAULT_DBUS_MASK);
  60. cache_ll_l1_enable_bus(1, CACHE_LL_DEFAULT_IBUS_MASK);
  61. #endif
  62. }
  63. void cache_hal_disable(cache_type_t type)
  64. {
  65. #if SOC_SHARED_IDCACHE_SUPPORTED
  66. Cache_Disable_ICache();
  67. #else
  68. if (type == CACHE_TYPE_DATA) {
  69. Cache_Disable_DCache();
  70. } else if (type == CACHE_TYPE_INSTRUCTION) {
  71. Cache_Disable_ICache();
  72. } else {
  73. Cache_Disable_ICache();
  74. Cache_Disable_DCache();
  75. }
  76. #endif
  77. }
  78. void cache_hal_enable(cache_type_t type)
  79. {
  80. #if SOC_SHARED_IDCACHE_SUPPORTED
  81. Cache_Enable_ICache(ctx.inst_autoload_flag);
  82. #else
  83. if (type == CACHE_TYPE_DATA) {
  84. Cache_Enable_DCache(ctx.data_autoload_flag);
  85. } else if (type == CACHE_TYPE_INSTRUCTION) {
  86. Cache_Enable_ICache(ctx.inst_autoload_flag);
  87. } else {
  88. Cache_Enable_ICache(ctx.inst_autoload_flag);
  89. Cache_Enable_DCache(ctx.data_autoload_flag);
  90. }
  91. #endif
  92. }
  93. void cache_hal_invalidate_addr(uint32_t vaddr, uint32_t size)
  94. {
  95. //Now only esp32 has 2 MMUs, this file doesn't build on esp32
  96. HAL_ASSERT(mmu_hal_check_valid_ext_vaddr_region(0, vaddr, size, MMU_VADDR_DATA | MMU_VADDR_INSTRUCTION));
  97. Cache_Invalidate_Addr(vaddr, size);
  98. }
  99. #if SOC_CACHE_WRITEBACK_SUPPORTED
  100. void cache_hal_writeback_addr(uint32_t vaddr, uint32_t size)
  101. {
  102. HAL_ASSERT(mmu_hal_check_valid_ext_vaddr_region(0, vaddr, size, MMU_VADDR_DATA));
  103. Cache_WriteBack_Addr(vaddr, size);
  104. }
  105. #endif //#if SOC_CACHE_WRITEBACK_SUPPORTED
  106. #if SOC_CACHE_FREEZE_SUPPORTED
  107. void cache_hal_freeze(cache_type_t type)
  108. {
  109. #if SOC_SHARED_IDCACHE_SUPPORTED
  110. Cache_Freeze_ICache_Enable(CACHE_FREEZE_ACK_BUSY);
  111. #else
  112. if (type == CACHE_TYPE_DATA) {
  113. Cache_Freeze_DCache_Enable(CACHE_FREEZE_ACK_BUSY);
  114. } else if (type == CACHE_TYPE_INSTRUCTION) {
  115. Cache_Freeze_ICache_Enable(CACHE_FREEZE_ACK_BUSY);
  116. } else {
  117. Cache_Freeze_ICache_Enable(CACHE_FREEZE_ACK_BUSY);
  118. Cache_Freeze_DCache_Enable(CACHE_FREEZE_ACK_BUSY);
  119. }
  120. #endif
  121. }
  122. void cache_hal_unfreeze(cache_type_t type)
  123. {
  124. #if SOC_SHARED_IDCACHE_SUPPORTED
  125. Cache_Freeze_ICache_Disable();
  126. #else
  127. if (type == CACHE_TYPE_DATA) {
  128. Cache_Freeze_DCache_Disable();
  129. } else if (type == CACHE_TYPE_INSTRUCTION) {
  130. Cache_Freeze_ICache_Disable();
  131. } else {
  132. Cache_Freeze_DCache_Disable();
  133. Cache_Freeze_ICache_Disable();
  134. }
  135. #endif
  136. }
  137. #endif //#if SOC_CACHE_FREEZE_SUPPORTED
  138. uint32_t cache_hal_get_cache_line_size(cache_type_t type)
  139. {
  140. #if SOC_SHARED_IDCACHE_SUPPORTED
  141. return Cache_Get_ICache_Line_Size();
  142. #else
  143. uint32_t size = 0;
  144. if (type == CACHE_TYPE_DATA) {
  145. size = Cache_Get_DCache_Line_Size();
  146. } else if (type == CACHE_TYPE_INSTRUCTION) {
  147. size = Cache_Get_ICache_Line_Size();
  148. } else {
  149. HAL_ASSERT(false);
  150. }
  151. return size;
  152. #endif
  153. }