cache.c 2.3 KB

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