gsi_reg-v4.5.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright (C) 2023-2024 Linaro Ltd. */
  3. #include <linux/array_size.h>
  4. #include <linux/bits.h>
  5. #include <linux/types.h>
  6. #include "../gsi_reg.h"
  7. #include "../ipa_version.h"
  8. #include "../reg.h"
  9. REG(INTER_EE_SRC_CH_IRQ_MSK, inter_ee_src_ch_irq_msk,
  10. 0x0000c020 + 0x1000 * GSI_EE_AP);
  11. REG(INTER_EE_SRC_EV_CH_IRQ_MSK, inter_ee_src_ev_ch_irq_msk,
  12. 0x0000c024 + 0x1000 * GSI_EE_AP);
  13. static const u32 reg_ch_c_cntxt_0_fmask[] = {
  14. [CHTYPE_PROTOCOL] = GENMASK(2, 0),
  15. [CHTYPE_DIR] = BIT(3),
  16. [CH_EE] = GENMASK(7, 4),
  17. [CHID] = GENMASK(12, 8),
  18. [CHTYPE_PROTOCOL_MSB] = BIT(13),
  19. [ERINDEX] = GENMASK(18, 14),
  20. /* Bit 19 reserved */
  21. [CHSTATE] = GENMASK(23, 20),
  22. [ELEMENT_SIZE] = GENMASK(31, 24),
  23. };
  24. REG_STRIDE_FIELDS(CH_C_CNTXT_0, ch_c_cntxt_0,
  25. 0x0000f000 + 0x4000 * GSI_EE_AP, 0x80);
  26. static const u32 reg_ch_c_cntxt_1_fmask[] = {
  27. [CH_R_LENGTH] = GENMASK(15, 0),
  28. /* Bits 16-31 reserved */
  29. };
  30. REG_STRIDE_FIELDS(CH_C_CNTXT_1, ch_c_cntxt_1,
  31. 0x0000f004 + 0x4000 * GSI_EE_AP, 0x80);
  32. REG_STRIDE(CH_C_CNTXT_2, ch_c_cntxt_2, 0x0000f008 + 0x4000 * GSI_EE_AP, 0x80);
  33. REG_STRIDE(CH_C_CNTXT_3, ch_c_cntxt_3, 0x0000f00c + 0x4000 * GSI_EE_AP, 0x80);
  34. static const u32 reg_ch_c_qos_fmask[] = {
  35. [WRR_WEIGHT] = GENMASK(3, 0),
  36. /* Bits 4-7 reserved */
  37. [MAX_PREFETCH] = BIT(8),
  38. [USE_DB_ENG] = BIT(9),
  39. [PREFETCH_MODE] = GENMASK(13, 10),
  40. /* Bits 14-15 reserved */
  41. [EMPTY_LVL_THRSHOLD] = GENMASK(23, 16),
  42. /* Bits 24-31 reserved */
  43. };
  44. REG_STRIDE_FIELDS(CH_C_QOS, ch_c_qos, 0x0000f05c + 0x4000 * GSI_EE_AP, 0x80);
  45. static const u32 reg_error_log_fmask[] = {
  46. [ERR_ARG3] = GENMASK(3, 0),
  47. [ERR_ARG2] = GENMASK(7, 4),
  48. [ERR_ARG1] = GENMASK(11, 8),
  49. [ERR_CODE] = GENMASK(15, 12),
  50. /* Bits 16-18 reserved */
  51. [ERR_VIRT_IDX] = GENMASK(23, 19),
  52. [ERR_TYPE] = GENMASK(27, 24),
  53. [ERR_EE] = GENMASK(31, 28),
  54. };
  55. REG_STRIDE(CH_C_SCRATCH_0, ch_c_scratch_0,
  56. 0x0000f060 + 0x4000 * GSI_EE_AP, 0x80);
  57. REG_STRIDE(CH_C_SCRATCH_1, ch_c_scratch_1,
  58. 0x0000f064 + 0x4000 * GSI_EE_AP, 0x80);
  59. REG_STRIDE(CH_C_SCRATCH_2, ch_c_scratch_2,
  60. 0x0000f068 + 0x4000 * GSI_EE_AP, 0x80);
  61. REG_STRIDE(CH_C_SCRATCH_3, ch_c_scratch_3,
  62. 0x0000f06c + 0x4000 * GSI_EE_AP, 0x80);
  63. static const u32 reg_ev_ch_e_cntxt_0_fmask[] = {
  64. [EV_CHTYPE] = GENMASK(3, 0),
  65. [EV_EE] = GENMASK(7, 4),
  66. [EV_EVCHID] = GENMASK(15, 8),
  67. [EV_INTYPE] = BIT(16),
  68. /* Bits 17-19 reserved */
  69. [EV_CHSTATE] = GENMASK(23, 20),
  70. [EV_ELEMENT_SIZE] = GENMASK(31, 24),
  71. };
  72. REG_STRIDE_FIELDS(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
  73. 0x00010000 + 0x4000 * GSI_EE_AP, 0x80);
  74. static const u32 reg_ev_ch_e_cntxt_1_fmask[] = {
  75. [R_LENGTH] = GENMASK(15, 0),
  76. };
  77. REG_STRIDE_FIELDS(EV_CH_E_CNTXT_1, ev_ch_e_cntxt_1,
  78. 0x00010004 + 0x4000 * GSI_EE_AP, 0x80);
  79. REG_STRIDE(EV_CH_E_CNTXT_2, ev_ch_e_cntxt_2,
  80. 0x00010008 + 0x4000 * GSI_EE_AP, 0x80);
  81. REG_STRIDE(EV_CH_E_CNTXT_3, ev_ch_e_cntxt_3,
  82. 0x0001000c + 0x4000 * GSI_EE_AP, 0x80);
  83. REG_STRIDE(EV_CH_E_CNTXT_4, ev_ch_e_cntxt_4,
  84. 0x00010010 + 0x4000 * GSI_EE_AP, 0x80);
  85. static const u32 reg_ev_ch_e_cntxt_8_fmask[] = {
  86. [EV_MODT] = GENMASK(15, 0),
  87. [EV_MODC] = GENMASK(23, 16),
  88. [EV_MOD_CNT] = GENMASK(31, 24),
  89. };
  90. REG_STRIDE_FIELDS(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
  91. 0x00010020 + 0x4000 * GSI_EE_AP, 0x80);
  92. REG_STRIDE(EV_CH_E_CNTXT_9, ev_ch_e_cntxt_9,
  93. 0x00010024 + 0x4000 * GSI_EE_AP, 0x80);
  94. REG_STRIDE(EV_CH_E_CNTXT_10, ev_ch_e_cntxt_10,
  95. 0x00010028 + 0x4000 * GSI_EE_AP, 0x80);
  96. REG_STRIDE(EV_CH_E_CNTXT_11, ev_ch_e_cntxt_11,
  97. 0x0001002c + 0x4000 * GSI_EE_AP, 0x80);
  98. REG_STRIDE(EV_CH_E_CNTXT_12, ev_ch_e_cntxt_12,
  99. 0x00010030 + 0x4000 * GSI_EE_AP, 0x80);
  100. REG_STRIDE(EV_CH_E_CNTXT_13, ev_ch_e_cntxt_13,
  101. 0x00010034 + 0x4000 * GSI_EE_AP, 0x80);
  102. REG_STRIDE(EV_CH_E_SCRATCH_0, ev_ch_e_scratch_0,
  103. 0x00010048 + 0x4000 * GSI_EE_AP, 0x80);
  104. REG_STRIDE(EV_CH_E_SCRATCH_1, ev_ch_e_scratch_1,
  105. 0x0001004c + 0x4000 * GSI_EE_AP, 0x80);
  106. REG_STRIDE(CH_C_DOORBELL_0, ch_c_doorbell_0,
  107. 0x00011000 + 0x4000 * GSI_EE_AP, 0x08);
  108. REG_STRIDE(EV_CH_E_DOORBELL_0, ev_ch_e_doorbell_0,
  109. 0x00011100 + 0x4000 * GSI_EE_AP, 0x08);
  110. static const u32 reg_gsi_status_fmask[] = {
  111. [ENABLED] = BIT(0),
  112. /* Bits 1-31 reserved */
  113. };
  114. REG_FIELDS(GSI_STATUS, gsi_status, 0x00012000 + 0x4000 * GSI_EE_AP);
  115. static const u32 reg_ch_cmd_fmask[] = {
  116. [CH_CHID] = GENMASK(7, 0),
  117. /* Bits 8-23 reserved */
  118. [CH_OPCODE] = GENMASK(31, 24),
  119. };
  120. REG_FIELDS(CH_CMD, ch_cmd, 0x00012008 + 0x4000 * GSI_EE_AP);
  121. static const u32 reg_ev_ch_cmd_fmask[] = {
  122. [EV_CHID] = GENMASK(7, 0),
  123. /* Bits 8-23 reserved */
  124. [EV_OPCODE] = GENMASK(31, 24),
  125. };
  126. REG_FIELDS(EV_CH_CMD, ev_ch_cmd, 0x00012010 + 0x4000 * GSI_EE_AP);
  127. static const u32 reg_generic_cmd_fmask[] = {
  128. [GENERIC_OPCODE] = GENMASK(4, 0),
  129. [GENERIC_CHID] = GENMASK(9, 5),
  130. [GENERIC_EE] = GENMASK(13, 10),
  131. /* Bits 14-31 reserved */
  132. };
  133. REG_FIELDS(GENERIC_CMD, generic_cmd, 0x00012018 + 0x4000 * GSI_EE_AP);
  134. static const u32 reg_hw_param_2_fmask[] = {
  135. [IRAM_SIZE] = GENMASK(2, 0),
  136. [NUM_CH_PER_EE] = GENMASK(7, 3),
  137. [NUM_EV_PER_EE] = GENMASK(12, 8),
  138. [GSI_CH_PEND_TRANSLATE] = BIT(13),
  139. [GSI_CH_FULL_LOGIC] = BIT(14),
  140. [GSI_USE_SDMA] = BIT(15),
  141. [GSI_SDMA_N_INT] = GENMASK(18, 16),
  142. [GSI_SDMA_MAX_BURST] = GENMASK(26, 19),
  143. [GSI_SDMA_N_IOVEC] = GENMASK(29, 27),
  144. [GSI_USE_RD_WR_ENG] = BIT(30),
  145. [GSI_USE_INTER_EE] = BIT(31),
  146. };
  147. REG_FIELDS(HW_PARAM_2, hw_param_2, 0x00012040 + 0x4000 * GSI_EE_AP);
  148. REG(CNTXT_TYPE_IRQ, cntxt_type_irq, 0x00012080 + 0x4000 * GSI_EE_AP);
  149. REG(CNTXT_TYPE_IRQ_MSK, cntxt_type_irq_msk, 0x00012088 + 0x4000 * GSI_EE_AP);
  150. REG(CNTXT_SRC_CH_IRQ, cntxt_src_ch_irq, 0x00012090 + 0x4000 * GSI_EE_AP);
  151. REG(CNTXT_SRC_EV_CH_IRQ, cntxt_src_ev_ch_irq, 0x00012094 + 0x4000 * GSI_EE_AP);
  152. REG(CNTXT_SRC_CH_IRQ_MSK, cntxt_src_ch_irq_msk,
  153. 0x00012098 + 0x4000 * GSI_EE_AP);
  154. REG(CNTXT_SRC_EV_CH_IRQ_MSK, cntxt_src_ev_ch_irq_msk,
  155. 0x0001209c + 0x4000 * GSI_EE_AP);
  156. REG(CNTXT_SRC_CH_IRQ_CLR, cntxt_src_ch_irq_clr,
  157. 0x000120a0 + 0x4000 * GSI_EE_AP);
  158. REG(CNTXT_SRC_EV_CH_IRQ_CLR, cntxt_src_ev_ch_irq_clr,
  159. 0x000120a4 + 0x4000 * GSI_EE_AP);
  160. REG(CNTXT_SRC_IEOB_IRQ, cntxt_src_ieob_irq, 0x000120b0 + 0x4000 * GSI_EE_AP);
  161. REG(CNTXT_SRC_IEOB_IRQ_MSK, cntxt_src_ieob_irq_msk,
  162. 0x000120b8 + 0x4000 * GSI_EE_AP);
  163. REG(CNTXT_SRC_IEOB_IRQ_CLR, cntxt_src_ieob_irq_clr,
  164. 0x000120c0 + 0x4000 * GSI_EE_AP);
  165. REG(CNTXT_GLOB_IRQ_STTS, cntxt_glob_irq_stts, 0x00012100 + 0x4000 * GSI_EE_AP);
  166. REG(CNTXT_GLOB_IRQ_EN, cntxt_glob_irq_en, 0x00012108 + 0x4000 * GSI_EE_AP);
  167. REG(CNTXT_GLOB_IRQ_CLR, cntxt_glob_irq_clr, 0x00012110 + 0x4000 * GSI_EE_AP);
  168. REG(CNTXT_GSI_IRQ_STTS, cntxt_gsi_irq_stts, 0x00012118 + 0x4000 * GSI_EE_AP);
  169. REG(CNTXT_GSI_IRQ_EN, cntxt_gsi_irq_en, 0x00012120 + 0x4000 * GSI_EE_AP);
  170. REG(CNTXT_GSI_IRQ_CLR, cntxt_gsi_irq_clr, 0x00012128 + 0x4000 * GSI_EE_AP);
  171. static const u32 reg_cntxt_intset_fmask[] = {
  172. [INTYPE] = BIT(0)
  173. /* Bits 1-31 reserved */
  174. };
  175. REG_FIELDS(CNTXT_INTSET, cntxt_intset, 0x00012180 + 0x4000 * GSI_EE_AP);
  176. REG_FIELDS(ERROR_LOG, error_log, 0x00012200 + 0x4000 * GSI_EE_AP);
  177. REG(ERROR_LOG_CLR, error_log_clr, 0x00012210 + 0x4000 * GSI_EE_AP);
  178. static const u32 reg_cntxt_scratch_0_fmask[] = {
  179. [INTER_EE_RESULT] = GENMASK(2, 0),
  180. /* Bits 3-4 reserved */
  181. [GENERIC_EE_RESULT] = GENMASK(7, 5),
  182. /* Bits 8-31 reserved */
  183. };
  184. REG_FIELDS(CNTXT_SCRATCH_0, cntxt_scratch_0, 0x00012400 + 0x4000 * GSI_EE_AP);
  185. static const struct reg *reg_array[] = {
  186. [INTER_EE_SRC_CH_IRQ_MSK] = &reg_inter_ee_src_ch_irq_msk,
  187. [INTER_EE_SRC_EV_CH_IRQ_MSK] = &reg_inter_ee_src_ev_ch_irq_msk,
  188. [CH_C_CNTXT_0] = &reg_ch_c_cntxt_0,
  189. [CH_C_CNTXT_1] = &reg_ch_c_cntxt_1,
  190. [CH_C_CNTXT_2] = &reg_ch_c_cntxt_2,
  191. [CH_C_CNTXT_3] = &reg_ch_c_cntxt_3,
  192. [CH_C_QOS] = &reg_ch_c_qos,
  193. [CH_C_SCRATCH_0] = &reg_ch_c_scratch_0,
  194. [CH_C_SCRATCH_1] = &reg_ch_c_scratch_1,
  195. [CH_C_SCRATCH_2] = &reg_ch_c_scratch_2,
  196. [CH_C_SCRATCH_3] = &reg_ch_c_scratch_3,
  197. [EV_CH_E_CNTXT_0] = &reg_ev_ch_e_cntxt_0,
  198. [EV_CH_E_CNTXT_1] = &reg_ev_ch_e_cntxt_1,
  199. [EV_CH_E_CNTXT_2] = &reg_ev_ch_e_cntxt_2,
  200. [EV_CH_E_CNTXT_3] = &reg_ev_ch_e_cntxt_3,
  201. [EV_CH_E_CNTXT_4] = &reg_ev_ch_e_cntxt_4,
  202. [EV_CH_E_CNTXT_8] = &reg_ev_ch_e_cntxt_8,
  203. [EV_CH_E_CNTXT_9] = &reg_ev_ch_e_cntxt_9,
  204. [EV_CH_E_CNTXT_10] = &reg_ev_ch_e_cntxt_10,
  205. [EV_CH_E_CNTXT_11] = &reg_ev_ch_e_cntxt_11,
  206. [EV_CH_E_CNTXT_12] = &reg_ev_ch_e_cntxt_12,
  207. [EV_CH_E_CNTXT_13] = &reg_ev_ch_e_cntxt_13,
  208. [EV_CH_E_SCRATCH_0] = &reg_ev_ch_e_scratch_0,
  209. [EV_CH_E_SCRATCH_1] = &reg_ev_ch_e_scratch_1,
  210. [CH_C_DOORBELL_0] = &reg_ch_c_doorbell_0,
  211. [EV_CH_E_DOORBELL_0] = &reg_ev_ch_e_doorbell_0,
  212. [GSI_STATUS] = &reg_gsi_status,
  213. [CH_CMD] = &reg_ch_cmd,
  214. [EV_CH_CMD] = &reg_ev_ch_cmd,
  215. [GENERIC_CMD] = &reg_generic_cmd,
  216. [HW_PARAM_2] = &reg_hw_param_2,
  217. [CNTXT_TYPE_IRQ] = &reg_cntxt_type_irq,
  218. [CNTXT_TYPE_IRQ_MSK] = &reg_cntxt_type_irq_msk,
  219. [CNTXT_SRC_CH_IRQ] = &reg_cntxt_src_ch_irq,
  220. [CNTXT_SRC_EV_CH_IRQ] = &reg_cntxt_src_ev_ch_irq,
  221. [CNTXT_SRC_CH_IRQ_MSK] = &reg_cntxt_src_ch_irq_msk,
  222. [CNTXT_SRC_EV_CH_IRQ_MSK] = &reg_cntxt_src_ev_ch_irq_msk,
  223. [CNTXT_SRC_CH_IRQ_CLR] = &reg_cntxt_src_ch_irq_clr,
  224. [CNTXT_SRC_EV_CH_IRQ_CLR] = &reg_cntxt_src_ev_ch_irq_clr,
  225. [CNTXT_SRC_IEOB_IRQ] = &reg_cntxt_src_ieob_irq,
  226. [CNTXT_SRC_IEOB_IRQ_MSK] = &reg_cntxt_src_ieob_irq_msk,
  227. [CNTXT_SRC_IEOB_IRQ_CLR] = &reg_cntxt_src_ieob_irq_clr,
  228. [CNTXT_GLOB_IRQ_STTS] = &reg_cntxt_glob_irq_stts,
  229. [CNTXT_GLOB_IRQ_EN] = &reg_cntxt_glob_irq_en,
  230. [CNTXT_GLOB_IRQ_CLR] = &reg_cntxt_glob_irq_clr,
  231. [CNTXT_GSI_IRQ_STTS] = &reg_cntxt_gsi_irq_stts,
  232. [CNTXT_GSI_IRQ_EN] = &reg_cntxt_gsi_irq_en,
  233. [CNTXT_GSI_IRQ_CLR] = &reg_cntxt_gsi_irq_clr,
  234. [CNTXT_INTSET] = &reg_cntxt_intset,
  235. [ERROR_LOG] = &reg_error_log,
  236. [ERROR_LOG_CLR] = &reg_error_log_clr,
  237. [CNTXT_SCRATCH_0] = &reg_cntxt_scratch_0,
  238. };
  239. const struct regs gsi_regs_v4_5 = {
  240. .reg_count = ARRAY_SIZE(reg_array),
  241. .reg = reg_array,
  242. };