cache.S 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /* cache.S - low level cache handling routines
  2. * Copyright (C) 2003-2007 Analog Devices Inc.
  3. * Licensed under the GPL-2 or later.
  4. */
  5. #include <asm/linkage.h>
  6. #include <config.h>
  7. #include <asm/blackfin.h>
  8. .text
  9. .align 2
  10. ENTRY(_blackfin_icache_flush_range)
  11. R2 = -32;
  12. R2 = R0 & R2;
  13. P0 = R2;
  14. P1 = R1;
  15. CSYNC;
  16. 1:
  17. IFLUSH[P0++];
  18. CC = P0 < P1(iu);
  19. IF CC JUMP 1b(bp);
  20. IFLUSH[P0];
  21. SSYNC;
  22. RTS;
  23. ENDPROC(_blackfin_icache_flush_range)
  24. ENTRY(_blackfin_dcache_flush_range)
  25. R2 = -32;
  26. R2 = R0 & R2;
  27. P0 = R2;
  28. P1 = R1;
  29. CSYNC;
  30. 1:
  31. FLUSH[P0++];
  32. CC = P0 < P1(iu);
  33. IF CC JUMP 1b(bp);
  34. FLUSH[P0];
  35. SSYNC;
  36. RTS;
  37. ENDPROC(_blackfin_dcache_flush_range)
  38. ENTRY(_blackfin_dcache_invalidate_range)
  39. R2 = -32;
  40. R2 = R0 & R2;
  41. P0 = R2;
  42. P1 = R1;
  43. CSYNC;
  44. 1:
  45. FLUSHINV[P0++];
  46. CC = P0 < P1(iu);
  47. IF CC JUMP 1b(bp);
  48. /*
  49. * If the data crosses a cache line, then we'll be pointing to
  50. * the last cache line, but won't have flushed/invalidated it yet, so do
  51. * one more.
  52. */
  53. FLUSHINV[P0];
  54. SSYNC;
  55. RTS;
  56. ENDPROC(_blackfin_dcache_invalidate_range)