xive2_regs.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. /*
  2. * QEMU PowerPC XIVE2 internal structure definitions (POWER10)
  3. *
  4. * Copyright (c) 2019-2024, IBM Corporation.
  5. *
  6. * SPDX-License-Identifier: GPL-2.0-or-later
  7. */
  8. #ifndef PPC_XIVE2_REGS_H
  9. #define PPC_XIVE2_REGS_H
  10. #include "qemu/bswap.h"
  11. /*
  12. * Thread Interrupt Management Area (TIMA)
  13. *
  14. * In Gen1 mode (P9 compat mode) word 2 is the same. However in Gen2
  15. * mode (P10), the CAM line is slightly different as the VP space was
  16. * increased.
  17. */
  18. #define TM2_W2_VALID PPC_BIT32(0)
  19. #define TM2_W2_HW PPC_BIT32(1)
  20. #define TM2_QW0W2_VU TM2_W2_VALID
  21. #define TM2_QW0W2_LOGIC_SERV PPC_BITMASK32(4, 31)
  22. #define TM2_QW1W2_VO TM2_W2_VALID
  23. #define TM2_QW1W2_HO TM2_W2_HW
  24. #define TM2_QW1W2_OS_CAM PPC_BITMASK32(4, 31)
  25. #define TM2_QW2W2_VP TM2_W2_VALID
  26. #define TM2_QW2W2_HP TM2_W2_HW
  27. #define TM2_QW2W2_POOL_CAM PPC_BITMASK32(4, 31)
  28. #define TM2_QW3W2_VT TM2_W2_VALID
  29. #define TM2_QW3W2_HT TM2_W2_HW
  30. #define TM2_QW3W2_LP PPC_BIT32(6)
  31. #define TM2_QW3W2_LE PPC_BIT32(7)
  32. /*
  33. * Event Assignment Structure (EAS)
  34. */
  35. typedef struct Xive2Eas {
  36. uint64_t w;
  37. #define EAS2_VALID PPC_BIT(0)
  38. #define EAS2_END_BLOCK PPC_BITMASK(4, 7) /* Destination EQ block# */
  39. #define EAS2_END_INDEX PPC_BITMASK(8, 31) /* Destination EQ index */
  40. #define EAS2_MASKED PPC_BIT(32) /* Masked */
  41. #define EAS2_END_DATA PPC_BITMASK(33, 63) /* written to the EQ */
  42. } Xive2Eas;
  43. #define xive2_eas_is_valid(eas) (be64_to_cpu((eas)->w) & EAS2_VALID)
  44. #define xive2_eas_is_masked(eas) (be64_to_cpu((eas)->w) & EAS2_MASKED)
  45. void xive2_eas_pic_print_info(Xive2Eas *eas, uint32_t lisn, GString *buf);
  46. /*
  47. * Event Notifification Descriptor (END)
  48. */
  49. typedef struct Xive2End {
  50. uint32_t w0;
  51. #define END2_W0_VALID PPC_BIT32(0) /* "v" bit */
  52. #define END2_W0_ENQUEUE PPC_BIT32(5) /* "q" bit */
  53. #define END2_W0_UCOND_NOTIFY PPC_BIT32(6) /* "n" bit */
  54. #define END2_W0_SILENT_ESCALATE PPC_BIT32(7) /* "s" bit */
  55. #define END2_W0_BACKLOG PPC_BIT32(8) /* "b" bit */
  56. #define END2_W0_PRECL_ESC_CTL PPC_BIT32(9) /* "p" bit */
  57. #define END2_W0_UNCOND_ESCALATE PPC_BIT32(10) /* "u" bit */
  58. #define END2_W0_ESCALATE_CTL PPC_BIT32(11) /* "e" bit */
  59. #define END2_W0_ADAPTIVE_ESC PPC_BIT32(12) /* "a" bit */
  60. #define END2_W0_ESCALATE_END PPC_BIT32(13) /* "N" bit */
  61. #define END2_W0_FIRMWARE1 PPC_BIT32(16) /* Owned by FW */
  62. #define END2_W0_FIRMWARE2 PPC_BIT32(17) /* Owned by FW */
  63. #define END2_W0_AEC_SIZE PPC_BITMASK32(18, 19)
  64. #define END2_W0_AEG_SIZE PPC_BITMASK32(20, 23)
  65. #define END2_W0_EQ_VG_PREDICT PPC_BITMASK32(24, 31) /* Owned by HW */
  66. uint32_t w1;
  67. #define END2_W1_ESn PPC_BITMASK32(0, 1)
  68. #define END2_W1_ESn_P PPC_BIT32(0)
  69. #define END2_W1_ESn_Q PPC_BIT32(1)
  70. #define END2_W1_ESe PPC_BITMASK32(2, 3)
  71. #define END2_W1_ESe_P PPC_BIT32(2)
  72. #define END2_W1_ESe_Q PPC_BIT32(3)
  73. #define END2_W1_GEN_FLIPPED PPC_BIT32(8)
  74. #define END2_W1_GENERATION PPC_BIT32(9)
  75. #define END2_W1_PAGE_OFF PPC_BITMASK32(10, 31)
  76. uint32_t w2;
  77. #define END2_W2_RESERVED PPC_BITMASK32(4, 7)
  78. #define END2_W2_EQ_ADDR_HI PPC_BITMASK32(8, 31)
  79. uint32_t w3;
  80. #define END2_W3_EQ_ADDR_LO PPC_BITMASK32(0, 24)
  81. #define END2_W3_QSIZE PPC_BITMASK32(28, 31)
  82. uint32_t w4;
  83. #define END2_W4_END_BLOCK PPC_BITMASK32(4, 7)
  84. #define END2_W4_ESC_END_INDEX PPC_BITMASK32(8, 31)
  85. #define END2_W4_ESB_BLOCK PPC_BITMASK32(0, 3)
  86. #define END2_W4_ESC_ESB_INDEX PPC_BITMASK32(4, 31)
  87. uint32_t w5;
  88. #define END2_W5_ESC_END_DATA PPC_BITMASK32(1, 31)
  89. uint32_t w6;
  90. #define END2_W6_FORMAT_BIT PPC_BIT32(0)
  91. #define END2_W6_IGNORE PPC_BIT32(1)
  92. #define END2_W6_CROWD PPC_BIT32(2)
  93. #define END2_W6_VP_BLOCK PPC_BITMASK32(4, 7)
  94. #define END2_W6_VP_OFFSET PPC_BITMASK32(8, 31)
  95. #define END2_W6_VP_OFFSET_GEN1 PPC_BITMASK32(13, 31)
  96. uint32_t w7;
  97. #define END2_W7_TOPO PPC_BITMASK32(0, 3) /* Owned by HW */
  98. #define END2_W7_F0_PRIORITY PPC_BITMASK32(8, 15)
  99. #define END2_W7_F1_LOG_SERVER_ID PPC_BITMASK32(4, 31)
  100. } Xive2End;
  101. #define xive2_end_is_valid(end) (be32_to_cpu((end)->w0) & END2_W0_VALID)
  102. #define xive2_end_is_enqueue(end) (be32_to_cpu((end)->w0) & END2_W0_ENQUEUE)
  103. #define xive2_end_is_notify(end) \
  104. (be32_to_cpu((end)->w0) & END2_W0_UCOND_NOTIFY)
  105. #define xive2_end_is_backlog(end) (be32_to_cpu((end)->w0) & END2_W0_BACKLOG)
  106. #define xive2_end_is_precluded_escalation(end) \
  107. (be32_to_cpu((end)->w0) & END2_W0_PRECL_ESC_CTL)
  108. #define xive2_end_is_escalate(end) \
  109. (be32_to_cpu((end)->w0) & END2_W0_ESCALATE_CTL)
  110. #define xive2_end_is_uncond_escalation(end) \
  111. (be32_to_cpu((end)->w0) & END2_W0_UNCOND_ESCALATE)
  112. #define xive2_end_is_silent_escalation(end) \
  113. (be32_to_cpu((end)->w0) & END2_W0_SILENT_ESCALATE)
  114. #define xive2_end_is_escalate_end(end) \
  115. (be32_to_cpu((end)->w0) & END2_W0_ESCALATE_END)
  116. #define xive2_end_is_firmware1(end) \
  117. (be32_to_cpu((end)->w0) & END2_W0_FIRMWARE1)
  118. #define xive2_end_is_firmware2(end) \
  119. (be32_to_cpu((end)->w0) & END2_W0_FIRMWARE2)
  120. #define xive2_end_is_ignore(end) \
  121. (be32_to_cpu((end)->w6) & END2_W6_IGNORE)
  122. #define xive2_end_is_crowd(end) \
  123. (be32_to_cpu((end)->w6) & END2_W6_CROWD)
  124. static inline uint64_t xive2_end_qaddr(Xive2End *end)
  125. {
  126. return ((uint64_t) be32_to_cpu(end->w2) & END2_W2_EQ_ADDR_HI) << 32 |
  127. (be32_to_cpu(end->w3) & END2_W3_EQ_ADDR_LO);
  128. }
  129. void xive2_end_pic_print_info(Xive2End *end, uint32_t end_idx, GString *buf);
  130. void xive2_end_queue_pic_print_info(Xive2End *end, uint32_t width,
  131. GString *buf);
  132. void xive2_end_eas_pic_print_info(Xive2End *end, uint32_t end_idx,
  133. GString *buf);
  134. /*
  135. * Notification Virtual Processor (NVP)
  136. */
  137. typedef struct Xive2Nvp {
  138. uint32_t w0;
  139. #define NVP2_W0_VALID PPC_BIT32(0)
  140. #define NVP2_W0_HW PPC_BIT32(7)
  141. #define NVP2_W0_L PPC_BIT32(8)
  142. #define NVP2_W0_G PPC_BIT32(9)
  143. #define NVP2_W0_T PPC_BIT32(10)
  144. #define NVP2_W0_ESC_END PPC_BIT32(25) /* 'N' bit 0:ESB 1:END */
  145. #define NVP2_W0_PGOFIRST PPC_BITMASK32(26, 31)
  146. uint32_t w1;
  147. #define NVP2_W1_CO PPC_BIT32(13)
  148. #define NVP2_W1_CO_PRIV PPC_BITMASK32(14, 15)
  149. #define NVP2_W1_CO_THRID_VALID PPC_BIT32(16)
  150. #define NVP2_W1_CO_THRID PPC_BITMASK32(17, 31)
  151. uint32_t w2;
  152. #define NVP2_W2_CPPR PPC_BITMASK32(0, 7)
  153. #define NVP2_W2_IPB PPC_BITMASK32(8, 15)
  154. #define NVP2_W2_LSMFB PPC_BITMASK32(16, 23)
  155. #define NVP2_W2_T PPC_BIT32(27)
  156. #define NVP2_W2_LGS PPC_BITMASK32(28, 31)
  157. uint32_t w3;
  158. uint32_t w4;
  159. #define NVP2_W4_ESC_ESB_BLOCK PPC_BITMASK32(0, 3) /* N:0 */
  160. #define NVP2_W4_ESC_ESB_INDEX PPC_BITMASK32(4, 31) /* N:0 */
  161. #define NVP2_W4_ESC_END_BLOCK PPC_BITMASK32(4, 7) /* N:1 */
  162. #define NVP2_W4_ESC_END_INDEX PPC_BITMASK32(8, 31) /* N:1 */
  163. uint32_t w5;
  164. #define NVP2_W5_PSIZE PPC_BITMASK32(0, 1)
  165. #define NVP2_W5_VP_END_BLOCK PPC_BITMASK32(4, 7)
  166. #define NVP2_W5_VP_END_INDEX PPC_BITMASK32(8, 31)
  167. uint32_t w6;
  168. #define NVP2_W6_REPORTING_LINE PPC_BITMASK32(4, 31)
  169. uint32_t w7;
  170. #define NVP2_W7_REPORTING_LINE PPC_BITMASK32(0, 23)
  171. } Xive2Nvp;
  172. #define xive2_nvp_is_valid(nvp) (be32_to_cpu((nvp)->w0) & NVP2_W0_VALID)
  173. #define xive2_nvp_is_hw(nvp) (be32_to_cpu((nvp)->w0) & NVP2_W0_HW)
  174. #define xive2_nvp_is_co(nvp) (be32_to_cpu((nvp)->w1) & NVP2_W1_CO)
  175. /*
  176. * The VP number space in a block is defined by the END2_W6_VP_OFFSET
  177. * field of the XIVE END. When running in Gen1 mode (P9 compat mode),
  178. * the VP space is reduced to (1 << 19) VPs per block
  179. */
  180. #define XIVE2_NVP_SHIFT 24
  181. #define XIVE2_NVP_COUNT (1 << XIVE2_NVP_SHIFT)
  182. static inline uint32_t xive2_nvp_cam_line(uint8_t nvp_blk, uint32_t nvp_idx)
  183. {
  184. return (nvp_blk << XIVE2_NVP_SHIFT) | nvp_idx;
  185. }
  186. static inline uint32_t xive2_nvp_idx(uint32_t cam_line)
  187. {
  188. return cam_line & ((1 << XIVE2_NVP_SHIFT) - 1);
  189. }
  190. static inline uint32_t xive2_nvp_blk(uint32_t cam_line)
  191. {
  192. return (cam_line >> XIVE2_NVP_SHIFT) & 0xf;
  193. }
  194. void xive2_nvp_pic_print_info(Xive2Nvp *nvp, uint32_t nvp_idx, GString *buf);
  195. /*
  196. * Notification Virtual Group or Crowd (NVG/NVC)
  197. */
  198. typedef struct Xive2Nvgc {
  199. uint32_t w0;
  200. #define NVGC2_W0_VALID PPC_BIT32(0)
  201. #define NVGC2_W0_PGONEXT PPC_BITMASK32(26, 31)
  202. uint32_t w1;
  203. uint32_t w2;
  204. uint32_t w3;
  205. uint32_t w4;
  206. uint32_t w5;
  207. uint32_t w6;
  208. uint32_t w7;
  209. } Xive2Nvgc;
  210. #define xive2_nvgc_is_valid(nvgc) (be32_to_cpu((nvgc)->w0) & NVGC2_W0_VALID)
  211. void xive2_nvgc_pic_print_info(Xive2Nvgc *nvgc, uint32_t nvgc_idx,
  212. GString *buf);
  213. #define NVx_BACKLOG_OP PPC_BITMASK(52, 53)
  214. #define NVx_BACKLOG_PRIO PPC_BITMASK(57, 59)
  215. /* split the 6-bit crowd/group level */
  216. #define NVx_CROWD_LVL(level) ((level >> 4) & 0b11)
  217. #define NVx_GROUP_LVL(level) (level & 0b1111)
  218. #endif /* PPC_XIVE2_REGS_H */