cache.c 1.9 KB

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