gsi_reg-v4.0.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  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. /* Bit 13 reserved */
  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. 0x0001c000 + 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. 0x0001c004 + 0x4000 * GSI_EE_AP, 0x80);
  32. REG_STRIDE(CH_C_CNTXT_2, ch_c_cntxt_2, 0x0001c008 + 0x4000 * GSI_EE_AP, 0x80);
  33. REG_STRIDE(CH_C_CNTXT_3, ch_c_cntxt_3, 0x0001c00c + 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. [USE_ESCAPE_BUF_ONLY] = BIT(10),
  40. /* Bits 11-31 reserved */
  41. };
  42. REG_STRIDE_FIELDS(CH_C_QOS, ch_c_qos, 0x0001c05c + 0x4000 * GSI_EE_AP, 0x80);
  43. static const u32 reg_error_log_fmask[] = {
  44. [ERR_ARG3] = GENMASK(3, 0),
  45. [ERR_ARG2] = GENMASK(7, 4),
  46. [ERR_ARG1] = GENMASK(11, 8),
  47. [ERR_CODE] = GENMASK(15, 12),
  48. /* Bits 16-18 reserved */
  49. [ERR_VIRT_IDX] = GENMASK(23, 19),
  50. [ERR_TYPE] = GENMASK(27, 24),
  51. [ERR_EE] = GENMASK(31, 28),
  52. };
  53. REG_STRIDE(CH_C_SCRATCH_0, ch_c_scratch_0,
  54. 0x0001c060 + 0x4000 * GSI_EE_AP, 0x80);
  55. REG_STRIDE(CH_C_SCRATCH_1, ch_c_scratch_1,
  56. 0x0001c064 + 0x4000 * GSI_EE_AP, 0x80);
  57. REG_STRIDE(CH_C_SCRATCH_2, ch_c_scratch_2,
  58. 0x0001c068 + 0x4000 * GSI_EE_AP, 0x80);
  59. REG_STRIDE(CH_C_SCRATCH_3, ch_c_scratch_3,
  60. 0x0001c06c + 0x4000 * GSI_EE_AP, 0x80);
  61. static const u32 reg_ev_ch_e_cntxt_0_fmask[] = {
  62. [EV_CHTYPE] = GENMASK(3, 0),
  63. [EV_EE] = GENMASK(7, 4),
  64. [EV_EVCHID] = GENMASK(15, 8),
  65. [EV_INTYPE] = BIT(16),
  66. /* Bits 17-19 reserved */
  67. [EV_CHSTATE] = GENMASK(23, 20),
  68. [EV_ELEMENT_SIZE] = GENMASK(31, 24),
  69. };
  70. REG_STRIDE_FIELDS(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
  71. 0x0001d000 + 0x4000 * GSI_EE_AP, 0x80);
  72. static const u32 reg_ev_ch_e_cntxt_1_fmask[] = {
  73. [R_LENGTH] = GENMASK(15, 0),
  74. };
  75. REG_STRIDE_FIELDS(EV_CH_E_CNTXT_1, ev_ch_e_cntxt_1,
  76. 0x0001d004 + 0x4000 * GSI_EE_AP, 0x80);
  77. REG_STRIDE(EV_CH_E_CNTXT_2, ev_ch_e_cntxt_2,
  78. 0x0001d008 + 0x4000 * GSI_EE_AP, 0x80);
  79. REG_STRIDE(EV_CH_E_CNTXT_3, ev_ch_e_cntxt_3,
  80. 0x0001d00c + 0x4000 * GSI_EE_AP, 0x80);
  81. REG_STRIDE(EV_CH_E_CNTXT_4, ev_ch_e_cntxt_4,
  82. 0x0001d010 + 0x4000 * GSI_EE_AP, 0x80);
  83. static const u32 reg_ev_ch_e_cntxt_8_fmask[] = {
  84. [EV_MODT] = GENMASK(15, 0),
  85. [EV_MODC] = GENMASK(23, 16),
  86. [EV_MOD_CNT] = GENMASK(31, 24),
  87. };
  88. REG_STRIDE_FIELDS(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
  89. 0x0001d020 + 0x4000 * GSI_EE_AP, 0x80);
  90. REG_STRIDE(EV_CH_E_CNTXT_9, ev_ch_e_cntxt_9,
  91. 0x0001d024 + 0x4000 * GSI_EE_AP, 0x80);
  92. REG_STRIDE(EV_CH_E_CNTXT_10, ev_ch_e_cntxt_10,
  93. 0x0001d028 + 0x4000 * GSI_EE_AP, 0x80);
  94. REG_STRIDE(EV_CH_E_CNTXT_11, ev_ch_e_cntxt_11,
  95. 0x0001d02c + 0x4000 * GSI_EE_AP, 0x80);
  96. REG_STRIDE(EV_CH_E_CNTXT_12, ev_ch_e_cntxt_12,
  97. 0x0001d030 + 0x4000 * GSI_EE_AP, 0x80);
  98. REG_STRIDE(EV_CH_E_CNTXT_13, ev_ch_e_cntxt_13,
  99. 0x0001d034 + 0x4000 * GSI_EE_AP, 0x80);
  100. REG_STRIDE(EV_CH_E_SCRATCH_0, ev_ch_e_scratch_0,
  101. 0x0001d048 + 0x4000 * GSI_EE_AP, 0x80);
  102. REG_STRIDE(EV_CH_E_SCRATCH_1, ev_ch_e_scratch_1,
  103. 0x0001d04c + 0x4000 * GSI_EE_AP, 0x80);
  104. REG_STRIDE(CH_C_DOORBELL_0, ch_c_doorbell_0,
  105. 0x0001e000 + 0x4000 * GSI_EE_AP, 0x08);
  106. REG_STRIDE(EV_CH_E_DOORBELL_0, ev_ch_e_doorbell_0,
  107. 0x0001e100 + 0x4000 * GSI_EE_AP, 0x08);
  108. static const u32 reg_gsi_status_fmask[] = {
  109. [ENABLED] = BIT(0),
  110. /* Bits 1-31 reserved */
  111. };
  112. REG_FIELDS(GSI_STATUS, gsi_status, 0x0001f000 + 0x4000 * GSI_EE_AP);
  113. static const u32 reg_ch_cmd_fmask[] = {
  114. [CH_CHID] = GENMASK(7, 0),
  115. /* Bits 8-23 reserved */
  116. [CH_OPCODE] = GENMASK(31, 24),
  117. };
  118. REG_FIELDS(CH_CMD, ch_cmd, 0x0001f008 + 0x4000 * GSI_EE_AP);
  119. static const u32 reg_ev_ch_cmd_fmask[] = {
  120. [EV_CHID] = GENMASK(7, 0),
  121. /* Bits 8-23 reserved */
  122. [EV_OPCODE] = GENMASK(31, 24),
  123. };
  124. REG_FIELDS(EV_CH_CMD, ev_ch_cmd, 0x0001f010 + 0x4000 * GSI_EE_AP);
  125. static const u32 reg_generic_cmd_fmask[] = {
  126. [GENERIC_OPCODE] = GENMASK(4, 0),
  127. [GENERIC_CHID] = GENMASK(9, 5),
  128. [GENERIC_EE] = GENMASK(13, 10),
  129. /* Bits 14-31 reserved */
  130. };
  131. REG_FIELDS(GENERIC_CMD, generic_cmd, 0x0001f018 + 0x4000 * GSI_EE_AP);
  132. static const u32 reg_hw_param_2_fmask[] = {
  133. [IRAM_SIZE] = GENMASK(2, 0),
  134. [NUM_CH_PER_EE] = GENMASK(7, 3),
  135. [NUM_EV_PER_EE] = GENMASK(12, 8),
  136. [GSI_CH_PEND_TRANSLATE] = BIT(13),
  137. [GSI_CH_FULL_LOGIC] = BIT(14),
  138. [GSI_USE_SDMA] = BIT(15),
  139. [GSI_SDMA_N_INT] = GENMASK(18, 16),
  140. [GSI_SDMA_MAX_BURST] = GENMASK(26, 19),
  141. [GSI_SDMA_N_IOVEC] = GENMASK(29, 27),
  142. /* Bits 30-31 reserved */
  143. };
  144. REG_FIELDS(HW_PARAM_2, hw_param_2, 0x0001f040 + 0x4000 * GSI_EE_AP);
  145. REG(CNTXT_TYPE_IRQ, cntxt_type_irq, 0x0001f080 + 0x4000 * GSI_EE_AP);
  146. REG(CNTXT_TYPE_IRQ_MSK, cntxt_type_irq_msk, 0x0001f088 + 0x4000 * GSI_EE_AP);
  147. REG(CNTXT_SRC_CH_IRQ, cntxt_src_ch_irq, 0x0001f090 + 0x4000 * GSI_EE_AP);
  148. REG(CNTXT_SRC_EV_CH_IRQ, cntxt_src_ev_ch_irq, 0x0001f094 + 0x4000 * GSI_EE_AP);
  149. REG(CNTXT_SRC_CH_IRQ_MSK, cntxt_src_ch_irq_msk,
  150. 0x0001f098 + 0x4000 * GSI_EE_AP);
  151. REG(CNTXT_SRC_EV_CH_IRQ_MSK, cntxt_src_ev_ch_irq_msk,
  152. 0x0001f09c + 0x4000 * GSI_EE_AP);
  153. REG(CNTXT_SRC_CH_IRQ_CLR, cntxt_src_ch_irq_clr,
  154. 0x0001f0a0 + 0x4000 * GSI_EE_AP);
  155. REG(CNTXT_SRC_EV_CH_IRQ_CLR, cntxt_src_ev_ch_irq_clr,
  156. 0x0001f0a4 + 0x4000 * GSI_EE_AP);
  157. REG(CNTXT_SRC_IEOB_IRQ, cntxt_src_ieob_irq, 0x0001f0b0 + 0x4000 * GSI_EE_AP);
  158. REG(CNTXT_SRC_IEOB_IRQ_MSK, cntxt_src_ieob_irq_msk,
  159. 0x0001f0b8 + 0x4000 * GSI_EE_AP);
  160. REG(CNTXT_SRC_IEOB_IRQ_CLR, cntxt_src_ieob_irq_clr,
  161. 0x0001f0c0 + 0x4000 * GSI_EE_AP);
  162. REG(CNTXT_GLOB_IRQ_STTS, cntxt_glob_irq_stts, 0x0001f100 + 0x4000 * GSI_EE_AP);
  163. REG(CNTXT_GLOB_IRQ_EN, cntxt_glob_irq_en, 0x0001f108 + 0x4000 * GSI_EE_AP);
  164. REG(CNTXT_GLOB_IRQ_CLR, cntxt_glob_irq_clr, 0x0001f110 + 0x4000 * GSI_EE_AP);
  165. REG(CNTXT_GSI_IRQ_STTS, cntxt_gsi_irq_stts, 0x0001f118 + 0x4000 * GSI_EE_AP);
  166. REG(CNTXT_GSI_IRQ_EN, cntxt_gsi_irq_en, 0x0001f120 + 0x4000 * GSI_EE_AP);
  167. REG(CNTXT_GSI_IRQ_CLR, cntxt_gsi_irq_clr, 0x0001f128 + 0x4000 * GSI_EE_AP);
  168. static const u32 reg_cntxt_intset_fmask[] = {
  169. [INTYPE] = BIT(0)
  170. /* Bits 1-31 reserved */
  171. };
  172. REG_FIELDS(CNTXT_INTSET, cntxt_intset, 0x0001f180 + 0x4000 * GSI_EE_AP);
  173. REG_FIELDS(ERROR_LOG, error_log, 0x0001f200 + 0x4000 * GSI_EE_AP);
  174. REG(ERROR_LOG_CLR, error_log_clr, 0x0001f210 + 0x4000 * GSI_EE_AP);
  175. static const u32 reg_cntxt_scratch_0_fmask[] = {
  176. [INTER_EE_RESULT] = GENMASK(2, 0),
  177. /* Bits 3-4 reserved */
  178. [GENERIC_EE_RESULT] = GENMASK(7, 5),
  179. /* Bits 8-31 reserved */
  180. };
  181. REG_FIELDS(CNTXT_SCRATCH_0, cntxt_scratch_0, 0x0001f400 + 0x4000 * GSI_EE_AP);
  182. static const struct reg *reg_array[] = {
  183. [INTER_EE_SRC_CH_IRQ_MSK] = &reg_inter_ee_src_ch_irq_msk,
  184. [INTER_EE_SRC_EV_CH_IRQ_MSK] = &reg_inter_ee_src_ev_ch_irq_msk,
  185. [CH_C_CNTXT_0] = &reg_ch_c_cntxt_0,
  186. [CH_C_CNTXT_1] = &reg_ch_c_cntxt_1,
  187. [CH_C_CNTXT_2] = &reg_ch_c_cntxt_2,
  188. [CH_C_CNTXT_3] = &reg_ch_c_cntxt_3,
  189. [CH_C_QOS] = &reg_ch_c_qos,
  190. [CH_C_SCRATCH_0] = &reg_ch_c_scratch_0,
  191. [CH_C_SCRATCH_1] = &reg_ch_c_scratch_1,
  192. [CH_C_SCRATCH_2] = &reg_ch_c_scratch_2,
  193. [CH_C_SCRATCH_3] = &reg_ch_c_scratch_3,
  194. [EV_CH_E_CNTXT_0] = &reg_ev_ch_e_cntxt_0,
  195. [EV_CH_E_CNTXT_1] = &reg_ev_ch_e_cntxt_1,
  196. [EV_CH_E_CNTXT_2] = &reg_ev_ch_e_cntxt_2,
  197. [EV_CH_E_CNTXT_3] = &reg_ev_ch_e_cntxt_3,
  198. [EV_CH_E_CNTXT_4] = &reg_ev_ch_e_cntxt_4,
  199. [EV_CH_E_CNTXT_8] = &reg_ev_ch_e_cntxt_8,
  200. [EV_CH_E_CNTXT_9] = &reg_ev_ch_e_cntxt_9,
  201. [EV_CH_E_CNTXT_10] = &reg_ev_ch_e_cntxt_10,
  202. [EV_CH_E_CNTXT_11] = &reg_ev_ch_e_cntxt_11,
  203. [EV_CH_E_CNTXT_12] = &reg_ev_ch_e_cntxt_12,
  204. [EV_CH_E_CNTXT_13] = &reg_ev_ch_e_cntxt_13,
  205. [EV_CH_E_SCRATCH_0] = &reg_ev_ch_e_scratch_0,
  206. [EV_CH_E_SCRATCH_1] = &reg_ev_ch_e_scratch_1,
  207. [CH_C_DOORBELL_0] = &reg_ch_c_doorbell_0,
  208. [EV_CH_E_DOORBELL_0] = &reg_ev_ch_e_doorbell_0,
  209. [GSI_STATUS] = &reg_gsi_status,
  210. [CH_CMD] = &reg_ch_cmd,
  211. [EV_CH_CMD] = &reg_ev_ch_cmd,
  212. [GENERIC_CMD] = &reg_generic_cmd,
  213. [HW_PARAM_2] = &reg_hw_param_2,
  214. [CNTXT_TYPE_IRQ] = &reg_cntxt_type_irq,
  215. [CNTXT_TYPE_IRQ_MSK] = &reg_cntxt_type_irq_msk,
  216. [CNTXT_SRC_CH_IRQ] = &reg_cntxt_src_ch_irq,
  217. [CNTXT_SRC_EV_CH_IRQ] = &reg_cntxt_src_ev_ch_irq,
  218. [CNTXT_SRC_CH_IRQ_MSK] = &reg_cntxt_src_ch_irq_msk,
  219. [CNTXT_SRC_EV_CH_IRQ_MSK] = &reg_cntxt_src_ev_ch_irq_msk,
  220. [CNTXT_SRC_CH_IRQ_CLR] = &reg_cntxt_src_ch_irq_clr,
  221. [CNTXT_SRC_EV_CH_IRQ_CLR] = &reg_cntxt_src_ev_ch_irq_clr,
  222. [CNTXT_SRC_IEOB_IRQ] = &reg_cntxt_src_ieob_irq,
  223. [CNTXT_SRC_IEOB_IRQ_MSK] = &reg_cntxt_src_ieob_irq_msk,
  224. [CNTXT_SRC_IEOB_IRQ_CLR] = &reg_cntxt_src_ieob_irq_clr,
  225. [CNTXT_GLOB_IRQ_STTS] = &reg_cntxt_glob_irq_stts,
  226. [CNTXT_GLOB_IRQ_EN] = &reg_cntxt_glob_irq_en,
  227. [CNTXT_GLOB_IRQ_CLR] = &reg_cntxt_glob_irq_clr,
  228. [CNTXT_GSI_IRQ_STTS] = &reg_cntxt_gsi_irq_stts,
  229. [CNTXT_GSI_IRQ_EN] = &reg_cntxt_gsi_irq_en,
  230. [CNTXT_GSI_IRQ_CLR] = &reg_cntxt_gsi_irq_clr,
  231. [CNTXT_INTSET] = &reg_cntxt_intset,
  232. [ERROR_LOG] = &reg_error_log,
  233. [ERROR_LOG_CLR] = &reg_error_log_clr,
  234. [CNTXT_SCRATCH_0] = &reg_cntxt_scratch_0,
  235. };
  236. const struct regs gsi_regs_v4_0 = {
  237. .reg_count = ARRAY_SIZE(reg_array),
  238. .reg = reg_array,
  239. };