clear_page.S 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2023 Ventana Micro Systems Inc.
  4. */
  5. #include <linux/linkage.h>
  6. #include <linux/export.h>
  7. #include <asm/asm.h>
  8. #include <asm/alternative-macros.h>
  9. #include <asm/hwcap.h>
  10. #include <asm/insn-def.h>
  11. #include <asm/page.h>
  12. #define CBOZ_ALT(order, old, new) \
  13. ALTERNATIVE(old, new, 0, \
  14. ((order) << 16) | RISCV_ISA_EXT_ZICBOZ, \
  15. CONFIG_RISCV_ISA_ZICBOZ)
  16. /* void clear_page(void *page) */
  17. SYM_FUNC_START(clear_page)
  18. li a2, PAGE_SIZE
  19. /*
  20. * If Zicboz isn't present, or somehow has a block
  21. * size larger than 4K, then fallback to memset.
  22. */
  23. CBOZ_ALT(12, "j .Lno_zicboz", "nop")
  24. lw a1, riscv_cboz_block_size
  25. add a2, a0, a2
  26. .Lzero_loop:
  27. CBO_ZERO(a0)
  28. add a0, a0, a1
  29. CBOZ_ALT(11, "bltu a0, a2, .Lzero_loop; ret", "nop; nop")
  30. CBO_ZERO(a0)
  31. add a0, a0, a1
  32. CBOZ_ALT(10, "bltu a0, a2, .Lzero_loop; ret", "nop; nop")
  33. CBO_ZERO(a0)
  34. add a0, a0, a1
  35. CBO_ZERO(a0)
  36. add a0, a0, a1
  37. CBOZ_ALT(9, "bltu a0, a2, .Lzero_loop; ret", "nop; nop")
  38. CBO_ZERO(a0)
  39. add a0, a0, a1
  40. CBO_ZERO(a0)
  41. add a0, a0, a1
  42. CBO_ZERO(a0)
  43. add a0, a0, a1
  44. CBO_ZERO(a0)
  45. add a0, a0, a1
  46. CBOZ_ALT(8, "bltu a0, a2, .Lzero_loop; ret", "nop; nop")
  47. CBO_ZERO(a0)
  48. add a0, a0, a1
  49. CBO_ZERO(a0)
  50. add a0, a0, a1
  51. CBO_ZERO(a0)
  52. add a0, a0, a1
  53. CBO_ZERO(a0)
  54. add a0, a0, a1
  55. CBO_ZERO(a0)
  56. add a0, a0, a1
  57. CBO_ZERO(a0)
  58. add a0, a0, a1
  59. CBO_ZERO(a0)
  60. add a0, a0, a1
  61. CBO_ZERO(a0)
  62. add a0, a0, a1
  63. bltu a0, a2, .Lzero_loop
  64. ret
  65. .Lno_zicboz:
  66. li a1, 0
  67. tail __memset
  68. SYM_FUNC_END(clear_page)
  69. EXPORT_SYMBOL(clear_page)