xor_64.h 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * include/asm/xor.h
  4. *
  5. * High speed xor_block operation for RAID4/5 utilizing the
  6. * UltraSparc Visual Instruction Set and Niagara block-init
  7. * twin-load instructions.
  8. *
  9. * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
  10. * Copyright (C) 2006 David S. Miller <davem@davemloft.net>
  11. */
  12. #include <asm/spitfire.h>
  13. void xor_vis_2(unsigned long bytes, unsigned long * __restrict p1,
  14. const unsigned long * __restrict p2);
  15. void xor_vis_3(unsigned long bytes, unsigned long * __restrict p1,
  16. const unsigned long * __restrict p2,
  17. const unsigned long * __restrict p3);
  18. void xor_vis_4(unsigned long bytes, unsigned long * __restrict p1,
  19. const unsigned long * __restrict p2,
  20. const unsigned long * __restrict p3,
  21. const unsigned long * __restrict p4);
  22. void xor_vis_5(unsigned long bytes, unsigned long * __restrict p1,
  23. const unsigned long * __restrict p2,
  24. const unsigned long * __restrict p3,
  25. const unsigned long * __restrict p4,
  26. const unsigned long * __restrict p5);
  27. /* XXX Ugh, write cheetah versions... -DaveM */
  28. static struct xor_block_template xor_block_VIS = {
  29. .name = "VIS",
  30. .do_2 = xor_vis_2,
  31. .do_3 = xor_vis_3,
  32. .do_4 = xor_vis_4,
  33. .do_5 = xor_vis_5,
  34. };
  35. void xor_niagara_2(unsigned long bytes, unsigned long * __restrict p1,
  36. const unsigned long * __restrict p2);
  37. void xor_niagara_3(unsigned long bytes, unsigned long * __restrict p1,
  38. const unsigned long * __restrict p2,
  39. const unsigned long * __restrict p3);
  40. void xor_niagara_4(unsigned long bytes, unsigned long * __restrict p1,
  41. const unsigned long * __restrict p2,
  42. const unsigned long * __restrict p3,
  43. const unsigned long * __restrict p4);
  44. void xor_niagara_5(unsigned long bytes, unsigned long * __restrict p1,
  45. const unsigned long * __restrict p2,
  46. const unsigned long * __restrict p3,
  47. const unsigned long * __restrict p4,
  48. const unsigned long * __restrict p5);
  49. static struct xor_block_template xor_block_niagara = {
  50. .name = "Niagara",
  51. .do_2 = xor_niagara_2,
  52. .do_3 = xor_niagara_3,
  53. .do_4 = xor_niagara_4,
  54. .do_5 = xor_niagara_5,
  55. };
  56. #undef XOR_TRY_TEMPLATES
  57. #define XOR_TRY_TEMPLATES \
  58. do { \
  59. xor_speed(&xor_block_VIS); \
  60. xor_speed(&xor_block_niagara); \
  61. } while (0)
  62. /* For VIS for everything except Niagara. */
  63. #define XOR_SELECT_TEMPLATE(FASTEST) \
  64. ((tlb_type == hypervisor && \
  65. (sun4v_chip_type == SUN4V_CHIP_NIAGARA1 || \
  66. sun4v_chip_type == SUN4V_CHIP_NIAGARA2 || \
  67. sun4v_chip_type == SUN4V_CHIP_NIAGARA3 || \
  68. sun4v_chip_type == SUN4V_CHIP_NIAGARA4 || \
  69. sun4v_chip_type == SUN4V_CHIP_NIAGARA5)) ? \
  70. &xor_block_niagara : \
  71. &xor_block_VIS)