300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. From: Ben Menchaca <[email protected]>
  2. Date: Fri, 7 Jun 2013 18:35:22 -0500
  3. Subject: MIPS: r4k_cache: use more efficient cache blast
  4. Optimize the compiler output for larger cache blast cases that are
  5. common for DMA-based networking.
  6. Signed-off-by: Ben Menchaca <[email protected]>
  7. Signed-off-by: Felix Fietkau <[email protected]>
  8. ---
  9. --- a/arch/mips/include/asm/r4kcache.h
  10. +++ b/arch/mips/include/asm/r4kcache.h
  11. @@ -286,14 +286,46 @@ static inline void prot##extra##blast_##
  12. unsigned long end) \
  13. { \
  14. unsigned long lsize = cpu_##desc##_line_size(); \
  15. + unsigned long lsize_2 = lsize * 2; \
  16. + unsigned long lsize_3 = lsize * 3; \
  17. + unsigned long lsize_4 = lsize * 4; \
  18. + unsigned long lsize_5 = lsize * 5; \
  19. + unsigned long lsize_6 = lsize * 6; \
  20. + unsigned long lsize_7 = lsize * 7; \
  21. + unsigned long lsize_8 = lsize * 8; \
  22. unsigned long addr = start & ~(lsize - 1); \
  23. - unsigned long aend = (end - 1) & ~(lsize - 1); \
  24. + unsigned long aend = (end + lsize - 1) & ~(lsize - 1); \
  25. + int lines = (aend - addr) / lsize; \
  26. \
  27. - while (1) { \
  28. + while (lines >= 8) { \
  29. + prot##cache_op(hitop, addr); \
  30. + prot##cache_op(hitop, addr + lsize); \
  31. + prot##cache_op(hitop, addr + lsize_2); \
  32. + prot##cache_op(hitop, addr + lsize_3); \
  33. + prot##cache_op(hitop, addr + lsize_4); \
  34. + prot##cache_op(hitop, addr + lsize_5); \
  35. + prot##cache_op(hitop, addr + lsize_6); \
  36. + prot##cache_op(hitop, addr + lsize_7); \
  37. + addr += lsize_8; \
  38. + lines -= 8; \
  39. + } \
  40. + \
  41. + if (lines & 0x4) { \
  42. + prot##cache_op(hitop, addr); \
  43. + prot##cache_op(hitop, addr + lsize); \
  44. + prot##cache_op(hitop, addr + lsize_2); \
  45. + prot##cache_op(hitop, addr + lsize_3); \
  46. + addr += lsize_4; \
  47. + } \
  48. + \
  49. + if (lines & 0x2) { \
  50. + prot##cache_op(hitop, addr); \
  51. + prot##cache_op(hitop, addr + lsize); \
  52. + addr += lsize_2; \
  53. + } \
  54. + \
  55. + if (lines & 0x1) { \
  56. prot##cache_op(hitop, addr); \
  57. - if (addr == aend) \
  58. - break; \
  59. - addr += lsize; \
  60. } \
  61. }