cache.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Copyright (c) 2006-2025 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-11-09 RT-Thread The first version
  9. */
  10. #ifndef __CACHE_H__
  11. #define __CACHE_H__
  12. #include <rtdef.h>
  13. /**
  14. * @brief These APIs may not be supported by a specified architecture
  15. * But we have to include to all the cases to be 'general purpose'
  16. */
  17. rt_always_inline void rt_hw_cpu_dcache_clean_local(void *addr, int size)
  18. {
  19. RT_UNUSED(addr);
  20. RT_UNUSED(size);
  21. }
  22. rt_always_inline void rt_hw_cpu_dcache_invalidate_local(void *addr, int size)
  23. {
  24. RT_UNUSED(addr);
  25. RT_UNUSED(size);
  26. }
  27. rt_always_inline void rt_hw_cpu_dcache_clean_and_invalidate_local(void *addr, int size)
  28. {
  29. RT_UNUSED(addr);
  30. RT_UNUSED(size);
  31. }
  32. rt_always_inline void rt_hw_cpu_dcache_clean_all_local(void)
  33. {
  34. }
  35. rt_always_inline void rt_hw_cpu_dcache_invalidate_all_local(void)
  36. {
  37. }
  38. rt_always_inline void rt_hw_cpu_dcache_clean_and_invalidate_all_local(void)
  39. {
  40. }
  41. /*use fence.i to invalidate all icache*/
  42. rt_always_inline void rt_hw_cpu_icache_invalidate_local(void *addr, int size)
  43. {
  44. __asm__ __volatile__("fence.i" ::: "memory");
  45. }
  46. /*use fence.i to invalidate all icache*/
  47. rt_always_inline void rt_hw_cpu_icache_invalidate_all_local(void)
  48. {
  49. __asm__ __volatile__("fence.i" ::: "memory");
  50. }
  51. /**
  52. * @brief Multi-core
  53. */
  54. #define rt_hw_cpu_dcache_clean rt_hw_cpu_dcache_clean_local
  55. #define rt_hw_cpu_dcache_invalidate rt_hw_cpu_dcache_invalidate_local
  56. #define rt_hw_cpu_dcache_clean_and_invalidate rt_hw_cpu_dcache_clean_and_invalidate_local
  57. #define rt_hw_cpu_dcache_clean_all rt_hw_cpu_dcache_clean_all_local
  58. #define rt_hw_cpu_dcache_invalidate_all rt_hw_cpu_dcache_invalidate_all_local
  59. #define rt_hw_cpu_dcache_clean_and_invalidate_all rt_hw_cpu_dcache_clean_and_invalidate_all_local
  60. #define rt_hw_cpu_icache_invalidate rt_hw_cpu_icache_invalidate_local
  61. #define rt_hw_cpu_icache_invalidate_all rt_hw_cpu_icache_invalidate_all_local
  62. #define rt_hw_icache_invalidate_all rt_hw_cpu_icache_invalidate_all
  63. /** instruction barrier */
  64. static inline void rt_hw_cpu_sync(void)
  65. {
  66. __asm__ __volatile__("fence.i" ::: "memory");
  67. }
  68. /**
  69. * @brief local cpu icahce & dcache synchronization
  70. *
  71. * @param addr
  72. * @param size
  73. */
  74. void rt_hw_sync_cache_local(void *addr, int size);
  75. #endif /* __CACHE_H__ */