cache.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * linux/arch/m32r/mm/cache.c
  3. *
  4. * Copyright (C) 2002-2005 Hirokazu Takata, Hayato Fujiwara
  5. */
  6. #include <linux/config.h>
  7. #include <asm/pgtable.h>
  8. #undef MCCR
  9. #if defined(CONFIG_CHIP_XNUX2) || defined(CONFIG_CHIP_M32700) \
  10. || defined(CONFIG_CHIP_VDEC2) || defined(CONFIG_CHIP_OPSP)
  11. /* Cache Control Register */
  12. #define MCCR ((volatile unsigned long*)0xfffffffc)
  13. #define MCCR_CC (1UL << 7) /* Cache mode modify bit */
  14. #define MCCR_IIV (1UL << 6) /* I-cache invalidate */
  15. #define MCCR_DIV (1UL << 5) /* D-cache invalidate */
  16. #define MCCR_DCB (1UL << 4) /* D-cache copy back */
  17. #define MCCR_ICM (1UL << 1) /* I-cache mode [0:off,1:on] */
  18. #define MCCR_DCM (1UL << 0) /* D-cache mode [0:off,1:on] */
  19. #define MCCR_ICACHE_INV (MCCR_CC|MCCR_IIV)
  20. #define MCCR_DCACHE_CB (MCCR_CC|MCCR_DCB)
  21. #define MCCR_DCACHE_CBINV (MCCR_CC|MCCR_DIV|MCCR_DCB)
  22. #define CHECK_MCCR(mccr) (mccr = *MCCR)
  23. #elif defined(CONFIG_CHIP_M32102)
  24. #define MCCR ((volatile unsigned char*)0xfffffffe)
  25. #define MCCR_IIV (1UL << 0) /* I-cache invalidate */
  26. #define MCCR_ICACHE_INV MCCR_IIV
  27. #elif defined(CONFIG_CHIP_M32104)
  28. #define MCCR ((volatile unsigned short*)0xfffffffe)
  29. #define MCCR_IIV (1UL << 8) /* I-cache invalidate */
  30. #define MCCR_DIV (1UL << 9) /* D-cache invalidate */
  31. #define MCCR_DCB (1UL << 10) /* D-cache copy back */
  32. #define MCCR_ICM (1UL << 0) /* I-cache mode [0:off,1:on] */
  33. #define MCCR_DCM (1UL << 1) /* D-cache mode [0:off,1:on] */
  34. #define MCCR_ICACHE_INV MCCR_IIV
  35. #define MCCR_DCACHE_CB MCCR_DCB
  36. #define MCCR_DCACHE_CBINV (MCCR_DIV|MCCR_DCB)
  37. #endif
  38. #ifndef MCCR
  39. #error Unknown cache type.
  40. #endif
  41. /* Copy back and invalidate D-cache and invalidate I-cache all */
  42. void _flush_cache_all(void)
  43. {
  44. #if defined(CONFIG_CHIP_M32102)
  45. unsigned char mccr;
  46. *MCCR = MCCR_ICACHE_INV;
  47. #elif defined(CONFIG_CHIP_M32104)
  48. unsigned short mccr;
  49. /* Copyback and invalidate D-cache */
  50. /* Invalidate I-cache */
  51. *MCCR |= (MCCR_ICACHE_INV | MCCR_DCACHE_CBINV);
  52. #else
  53. unsigned long mccr;
  54. /* Copyback and invalidate D-cache */
  55. /* Invalidate I-cache */
  56. *MCCR = MCCR_ICACHE_INV | MCCR_DCACHE_CBINV;
  57. #endif
  58. while ((mccr = *MCCR) & MCCR_IIV); /* loop while invalidating... */
  59. }
  60. /* Copy back D-cache and invalidate I-cache all */
  61. void _flush_cache_copyback_all(void)
  62. {
  63. #if defined(CONFIG_CHIP_M32102)
  64. unsigned char mccr;
  65. *MCCR = MCCR_ICACHE_INV;
  66. #elif defined(CONFIG_CHIP_M32104)
  67. unsigned short mccr;
  68. /* Copyback and invalidate D-cache */
  69. /* Invalidate I-cache */
  70. *MCCR |= (MCCR_ICACHE_INV | MCCR_DCACHE_CB);
  71. #else
  72. unsigned long mccr;
  73. /* Copyback D-cache */
  74. /* Invalidate I-cache */
  75. *MCCR = MCCR_ICACHE_INV | MCCR_DCACHE_CB;
  76. #endif
  77. while ((mccr = *MCCR) & MCCR_IIV); /* loop while invalidating... */
  78. }