cache.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. */
  9. #include "../xburst/cache.h"
  10. #include <board.h>
  11. #define CACHE_SIZE 16*1024
  12. #define CACHE_LINE_SIZE 32
  13. #define KSEG0 0x80000000
  14. #define K0_TO_K1() \
  15. do { \
  16. unsigned long __k0_addr; \
  17. \
  18. __asm__ __volatile__( \
  19. "la %0, 1f\n\t" \
  20. "or %0, %0, %1\n\t" \
  21. "jr %0\n\t" \
  22. "nop\n\t" \
  23. "1: nop\n" \
  24. : "=&r"(__k0_addr) \
  25. : "r" (0x20000000) ); \
  26. } while(0)
  27. #define K1_TO_K0() \
  28. do { \
  29. unsigned long __k0_addr; \
  30. __asm__ __volatile__( \
  31. "nop;nop;nop;nop;nop;nop;nop\n\t" \
  32. "la %0, 1f\n\t" \
  33. "jr %0\n\t" \
  34. "nop\n\t" \
  35. "1: nop\n" \
  36. : "=&r" (__k0_addr)); \
  37. } while (0)
  38. #define INVALIDATE_BTB() \
  39. do { \
  40. unsigned long tmp; \
  41. __asm__ __volatile__( \
  42. ".set mips32\n\t" \
  43. "mfc0 %0, $16, 7\n\t" \
  44. "nop\n\t" \
  45. "ori %0, 2\n\t" \
  46. "mtc0 %0, $16, 7\n\t" \
  47. "nop\n\t" \
  48. ".set mips2\n\t" \
  49. : "=&r" (tmp)); \
  50. } while (0)
  51. #define SYNC_WB() __asm__ __volatile__ ("sync")
  52. #define cache_op(op,addr) \
  53. __asm__ __volatile__( \
  54. " .set noreorder \n" \
  55. " .set mips32\n\t \n" \
  56. " cache %0, %1 \n" \
  57. " .set mips0 \n" \
  58. " .set reorder" \
  59. : \
  60. : "i" (op), "m" (*(unsigned char *)(addr)))
  61. void __icache_invalidate_all(void)
  62. {
  63. unsigned int i;
  64. K0_TO_K1();
  65. asm volatile (".set noreorder\n"
  66. ".set mips32\n\t"
  67. "mtc0\t$0,$28\n\t"
  68. "mtc0\t$0,$29\n"
  69. ".set mips0\n"
  70. ".set reorder\n");
  71. for (i=KSEG0;i<KSEG0+CACHE_SIZE;i+=CACHE_LINE_SIZE)
  72. cache_op(Index_Store_Tag_I, i);
  73. K1_TO_K0();
  74. INVALIDATE_BTB();
  75. }
  76. void __dcache_writeback_all(void)
  77. {
  78. unsigned int i;
  79. for (i=KSEG0;i<KSEG0+CACHE_SIZE;i+=CACHE_LINE_SIZE)
  80. cache_op(Index_Writeback_Inv_D, i);
  81. SYNC_WB();
  82. }
  83. void rt_hw_cache_init(void)
  84. {
  85. __dcache_writeback_all();
  86. __icache_invalidate_all();
  87. }