insn-def.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. #ifndef __ASM_INSN_DEF_H
  3. #define __ASM_INSN_DEF_H
  4. #include <asm/asm.h>
  5. #define INSN_R_FUNC7_SHIFT 25
  6. #define INSN_R_RS2_SHIFT 20
  7. #define INSN_R_RS1_SHIFT 15
  8. #define INSN_R_FUNC3_SHIFT 12
  9. #define INSN_R_RD_SHIFT 7
  10. #define INSN_R_OPCODE_SHIFT 0
  11. #ifdef __ASSEMBLY__
  12. #ifdef CONFIG_AS_HAS_INSN
  13. .macro insn_r, opcode, func3, func7, rd, rs1, rs2
  14. .insn r \opcode, \func3, \func7, \rd, \rs1, \rs2
  15. .endm
  16. #else
  17. #include <asm/gpr-num.h>
  18. .macro insn_r, opcode, func3, func7, rd, rs1, rs2
  19. .4byte ((\opcode << INSN_R_OPCODE_SHIFT) | \
  20. (\func3 << INSN_R_FUNC3_SHIFT) | \
  21. (\func7 << INSN_R_FUNC7_SHIFT) | \
  22. (.L__gpr_num_\rd << INSN_R_RD_SHIFT) | \
  23. (.L__gpr_num_\rs1 << INSN_R_RS1_SHIFT) | \
  24. (.L__gpr_num_\rs2 << INSN_R_RS2_SHIFT))
  25. .endm
  26. #endif
  27. #define __INSN_R(...) insn_r __VA_ARGS__
  28. #else /* ! __ASSEMBLY__ */
  29. #ifdef CONFIG_AS_HAS_INSN
  30. #define __INSN_R(opcode, func3, func7, rd, rs1, rs2) \
  31. ".insn r " opcode ", " func3 ", " func7 ", " rd ", " rs1 ", " rs2 "\n"
  32. #else
  33. #include <linux/stringify.h>
  34. #include <asm/gpr-num.h>
  35. #define DEFINE_INSN_R \
  36. __DEFINE_ASM_GPR_NUMS \
  37. " .macro insn_r, opcode, func3, func7, rd, rs1, rs2\n" \
  38. " .4byte ((\\opcode << " __stringify(INSN_R_OPCODE_SHIFT) ") |" \
  39. " (\\func3 << " __stringify(INSN_R_FUNC3_SHIFT) ") |" \
  40. " (\\func7 << " __stringify(INSN_R_FUNC7_SHIFT) ") |" \
  41. " (.L__gpr_num_\\rd << " __stringify(INSN_R_RD_SHIFT) ") |" \
  42. " (.L__gpr_num_\\rs1 << " __stringify(INSN_R_RS1_SHIFT) ") |" \
  43. " (.L__gpr_num_\\rs2 << " __stringify(INSN_R_RS2_SHIFT) "))\n" \
  44. " .endm\n"
  45. #define UNDEFINE_INSN_R \
  46. " .purgem insn_r\n"
  47. #define __INSN_R(opcode, func3, func7, rd, rs1, rs2) \
  48. DEFINE_INSN_R \
  49. "insn_r " opcode ", " func3 ", " func7 ", " rd ", " rs1 ", " rs2 "\n" \
  50. UNDEFINE_INSN_R
  51. #endif
  52. #endif /* ! __ASSEMBLY__ */
  53. #define INSN_R(opcode, func3, func7, rd, rs1, rs2) \
  54. __INSN_R(RV_##opcode, RV_##func3, RV_##func7, \
  55. RV_##rd, RV_##rs1, RV_##rs2)
  56. #define RV_OPCODE(v) __ASM_STR(v)
  57. #define RV_FUNC3(v) __ASM_STR(v)
  58. #define RV_FUNC7(v) __ASM_STR(v)
  59. #define RV_RD(v) __ASM_STR(v)
  60. #define RV_RS1(v) __ASM_STR(v)
  61. #define RV_RS2(v) __ASM_STR(v)
  62. #define __RV_REG(v) __ASM_STR(x ## v)
  63. #define RV___RD(v) __RV_REG(v)
  64. #define RV___RS1(v) __RV_REG(v)
  65. #define RV___RS2(v) __RV_REG(v)
  66. #define RV_OPCODE_SYSTEM RV_OPCODE(115)
  67. #define HFENCE_VVMA(vaddr, asid) \
  68. INSN_R(OPCODE_SYSTEM, FUNC3(0), FUNC7(17), \
  69. __RD(0), RS1(vaddr), RS2(asid))
  70. #define HFENCE_GVMA(gaddr, vmid) \
  71. INSN_R(OPCODE_SYSTEM, FUNC3(0), FUNC7(49), \
  72. __RD(0), RS1(gaddr), RS2(vmid))
  73. #define HLVX_HU(dest, addr) \
  74. INSN_R(OPCODE_SYSTEM, FUNC3(4), FUNC7(50), \
  75. RD(dest), RS1(addr), __RS2(3))
  76. #define HLV_W(dest, addr) \
  77. INSN_R(OPCODE_SYSTEM, FUNC3(4), FUNC7(52), \
  78. RD(dest), RS1(addr), __RS2(0))
  79. #ifdef CONFIG_64BIT
  80. #define HLV_D(dest, addr) \
  81. INSN_R(OPCODE_SYSTEM, FUNC3(4), FUNC7(54), \
  82. RD(dest), RS1(addr), __RS2(0))
  83. #else
  84. #define HLV_D(dest, addr) \
  85. __ASM_STR(.error "hlv.d requires 64-bit support")
  86. #endif
  87. #define SINVAL_VMA(vaddr, asid) \
  88. INSN_R(OPCODE_SYSTEM, FUNC3(0), FUNC7(11), \
  89. __RD(0), RS1(vaddr), RS2(asid))
  90. #define SFENCE_W_INVAL() \
  91. INSN_R(OPCODE_SYSTEM, FUNC3(0), FUNC7(12), \
  92. __RD(0), __RS1(0), __RS2(0))
  93. #define SFENCE_INVAL_IR() \
  94. INSN_R(OPCODE_SYSTEM, FUNC3(0), FUNC7(12), \
  95. __RD(0), __RS1(0), __RS2(1))
  96. #define HINVAL_VVMA(vaddr, asid) \
  97. INSN_R(OPCODE_SYSTEM, FUNC3(0), FUNC7(19), \
  98. __RD(0), RS1(vaddr), RS2(asid))
  99. #define HINVAL_GVMA(gaddr, vmid) \
  100. INSN_R(OPCODE_SYSTEM, FUNC3(0), FUNC7(51), \
  101. __RD(0), RS1(gaddr), RS2(vmid))
  102. #endif /* __ASM_INSN_DEF_H */