cache.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * (C) Copyright 2007
  3. * Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
  4. *
  5. * (C) Copyright 2007
  6. * Nobobuhiro Iwamatsu <iwamatsu@nigauri.org>
  7. *
  8. * SPDX-License-Identifier: GPL-2.0+
  9. */
  10. #include <common.h>
  11. #include <command.h>
  12. #include <asm/processor.h>
  13. #include <asm/io.h>
  14. /*
  15. * Jump to P2 area.
  16. * When handling TLB or caches, we need to do it from P2 area.
  17. */
  18. #define jump_to_P2() \
  19. do { \
  20. unsigned long __dummy; \
  21. __asm__ __volatile__( \
  22. "mov.l 1f, %0\n\t" \
  23. "or %1, %0\n\t" \
  24. "jmp @%0\n\t" \
  25. " nop\n\t" \
  26. ".balign 4\n" \
  27. "1: .long 2f\n" \
  28. "2:" \
  29. : "=&r" (__dummy) \
  30. : "r" (0x20000000)); \
  31. } while (0)
  32. /*
  33. * Back to P1 area.
  34. */
  35. #define back_to_P1() \
  36. do { \
  37. unsigned long __dummy; \
  38. __asm__ __volatile__( \
  39. "nop;nop;nop;nop;nop;nop;nop\n\t" \
  40. "mov.l 1f, %0\n\t" \
  41. "jmp @%0\n\t" \
  42. " nop\n\t" \
  43. ".balign 4\n" \
  44. "1: .long 2f\n" \
  45. "2:" \
  46. : "=&r" (__dummy)); \
  47. } while (0)
  48. #define CACHE_VALID 1
  49. #define CACHE_UPDATED 2
  50. static inline void cache_wback_all(void)
  51. {
  52. unsigned long addr, data, i, j;
  53. jump_to_P2();
  54. for (i = 0; i < CACHE_OC_NUM_ENTRIES; i++) {
  55. for (j = 0; j < CACHE_OC_NUM_WAYS; j++) {
  56. addr = CACHE_OC_ADDRESS_ARRAY
  57. | (j << CACHE_OC_WAY_SHIFT)
  58. | (i << CACHE_OC_ENTRY_SHIFT);
  59. data = inl(addr);
  60. if (data & CACHE_UPDATED) {
  61. data &= ~CACHE_UPDATED;
  62. outl(data, addr);
  63. }
  64. }
  65. }
  66. back_to_P1();
  67. }
  68. #define CACHE_ENABLE 0
  69. #define CACHE_DISABLE 1
  70. int cache_control(unsigned int cmd)
  71. {
  72. unsigned long ccr;
  73. jump_to_P2();
  74. ccr = inl(CCR);
  75. if (ccr & CCR_CACHE_ENABLE)
  76. cache_wback_all();
  77. if (cmd == CACHE_DISABLE)
  78. outl(CCR_CACHE_STOP, CCR);
  79. else
  80. outl(CCR_CACHE_INIT, CCR);
  81. back_to_P1();
  82. return 0;
  83. }