ipa_reg.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
  3. * Copyright (C) 2018-2024 Linaro Ltd.
  4. */
  5. #ifndef _IPA_REG_H_
  6. #define _IPA_REG_H_
  7. #include "reg.h"
  8. struct platform_device;
  9. struct ipa;
  10. /**
  11. * DOC: IPA Registers
  12. *
  13. * IPA registers are located within the "ipa-reg" address space defined by
  14. * Device Tree. Each register has a specified offset within that space,
  15. * which is mapped into virtual memory space in ipa_mem_init(). Each
  16. * has a unique identifer, taken from the ipa_reg_id enumerated type.
  17. * All IPA registers are 32 bits wide.
  18. *
  19. * Certain "parameterized" register types are duplicated for a number of
  20. * instances of something. For example, each IPA endpoint has an set of
  21. * registers defining its configuration. The offset to an endpoint's set
  22. * of registers is computed based on an "base" offset, plus an endpoint's
  23. * ID multiplied and a "stride" value for the register. Similarly, some
  24. * registers have an offset that depends on execution environment. In
  25. * this case, the stride is multiplied by a member of the gsi_ee_id
  26. * enumerated type.
  27. *
  28. * Each version of IPA implements an array of ipa_reg structures indexed
  29. * by register ID. Each entry in the array specifies the base offset and
  30. * (for parameterized registers) a non-zero stride value. Not all versions
  31. * of IPA define all registers. The offset for a register is returned by
  32. * reg_offset() when the register's ipa_reg structure is supplied;
  33. * zero is returned for an undefined register (this should never happen).
  34. *
  35. * Some registers encode multiple fields within them. Each field in
  36. * such a register has a unique identifier (from an enumerated type).
  37. * The position and width of the fields in a register are defined by
  38. * an array of field masks, indexed by field ID. Two functions are
  39. * used to access register fields; both take an ipa_reg structure as
  40. * argument. To encode a value to be represented in a register field,
  41. * the value and field ID are passed to reg_encode(). To extract
  42. * a value encoded in a register field, the field ID is passed to
  43. * reg_decode(). In addition, for single-bit fields, reg_bit()
  44. * can be used to either encode the bit value, or to generate a mask
  45. * used to extract the bit value.
  46. */
  47. /* enum ipa_reg_id - IPA register IDs */
  48. enum ipa_reg_id {
  49. COMP_CFG,
  50. CLKON_CFG,
  51. ROUTE,
  52. SHARED_MEM_SIZE,
  53. QSB_MAX_WRITES,
  54. QSB_MAX_READS,
  55. FILT_ROUT_HASH_EN, /* IPA v4.2 */
  56. FILT_ROUT_HASH_FLUSH, /* Not IPA v4.2 nor IPA v5.0+ */
  57. FILT_ROUT_CACHE_FLUSH, /* IPA v5.0+ */
  58. STATE_AGGR_ACTIVE,
  59. IPA_BCR, /* Not IPA v4.5+ */
  60. LOCAL_PKT_PROC_CNTXT,
  61. AGGR_FORCE_CLOSE,
  62. COUNTER_CFG, /* Not IPA v4.5+ */
  63. IPA_TX_CFG, /* IPA v3.5+ */
  64. FLAVOR_0, /* IPA v3.5+ */
  65. IDLE_INDICATION_CFG, /* IPA v3.5+ */
  66. QTIME_TIMESTAMP_CFG, /* IPA v4.5+ */
  67. TIMERS_XO_CLK_DIV_CFG, /* IPA v4.5+ */
  68. TIMERS_PULSE_GRAN_CFG, /* IPA v4.5+ */
  69. SRC_RSRC_GRP_01_RSRC_TYPE,
  70. SRC_RSRC_GRP_23_RSRC_TYPE,
  71. SRC_RSRC_GRP_45_RSRC_TYPE, /* Not IPA v3.5+; IPA v4.5, IPA v5.0 */
  72. SRC_RSRC_GRP_67_RSRC_TYPE, /* Not IPA v3.5+; IPA v5.0 */
  73. DST_RSRC_GRP_01_RSRC_TYPE,
  74. DST_RSRC_GRP_23_RSRC_TYPE,
  75. DST_RSRC_GRP_45_RSRC_TYPE, /* Not IPA v3.5+; IPA v4.5, IPA v5.0 */
  76. DST_RSRC_GRP_67_RSRC_TYPE, /* Not IPA v3.5+; IPA v5.0 */
  77. ENDP_INIT_CTRL, /* Not IPA v4.2+ for TX, not IPA v4.0+ for RX */
  78. ENDP_INIT_CFG,
  79. ENDP_INIT_NAT, /* TX only */
  80. ENDP_INIT_HDR,
  81. ENDP_INIT_HDR_EXT,
  82. ENDP_INIT_HDR_METADATA_MASK, /* RX only */
  83. ENDP_INIT_MODE, /* TX only */
  84. ENDP_INIT_AGGR,
  85. ENDP_INIT_HOL_BLOCK_EN, /* RX only */
  86. ENDP_INIT_HOL_BLOCK_TIMER, /* RX only */
  87. ENDP_INIT_DEAGGR, /* TX only */
  88. ENDP_INIT_RSRC_GRP,
  89. ENDP_INIT_SEQ, /* TX only */
  90. ENDP_STATUS,
  91. ENDP_FILTER_ROUTER_HSH_CFG, /* Not IPA v4.2 */
  92. ENDP_FILTER_CACHE_CFG, /* IPA v5.0+ */
  93. ENDP_ROUTER_CACHE_CFG, /* IPA v5.0+ */
  94. /* The IRQ registers that follow are only used for GSI_EE_AP */
  95. IPA_IRQ_STTS,
  96. IPA_IRQ_EN,
  97. IPA_IRQ_CLR,
  98. IPA_IRQ_UC,
  99. IRQ_SUSPEND_INFO,
  100. IRQ_SUSPEND_EN, /* IPA v3.1+ */
  101. IRQ_SUSPEND_CLR, /* IPA v3.1+ */
  102. IPA_REG_ID_COUNT, /* Last; not an ID */
  103. };
  104. /* COMP_CFG register */
  105. enum ipa_reg_comp_cfg_field_id {
  106. COMP_CFG_ENABLE, /* Not IPA v4.0+ */
  107. RAM_ARB_PRI_CLIENT_SAMP_FIX_DIS, /* IPA v4.7+ */
  108. GSI_SNOC_BYPASS_DIS,
  109. GEN_QMB_0_SNOC_BYPASS_DIS,
  110. GEN_QMB_1_SNOC_BYPASS_DIS,
  111. IPA_DCMP_FAST_CLK_EN, /* Not IPA v4.5+ */
  112. IPA_QMB_SELECT_CONS_EN, /* IPA v4.0+ */
  113. IPA_QMB_SELECT_PROD_EN, /* IPA v4.0+ */
  114. GSI_MULTI_INORDER_RD_DIS, /* IPA v4.0+ */
  115. GSI_MULTI_INORDER_WR_DIS, /* IPA v4.0+ */
  116. GEN_QMB_0_MULTI_INORDER_RD_DIS, /* IPA v4.0+ */
  117. GEN_QMB_1_MULTI_INORDER_RD_DIS, /* IPA v4.0+ */
  118. GEN_QMB_0_MULTI_INORDER_WR_DIS, /* IPA v4.0+ */
  119. GEN_QMB_1_MULTI_INORDER_WR_DIS, /* IPA v4.0+ */
  120. GEN_QMB_0_SNOC_CNOC_LOOP_PROT_DIS, /* IPA v4.0+ */
  121. GSI_SNOC_CNOC_LOOP_PROT_DISABLE, /* IPA v4.0+ */
  122. GSI_MULTI_AXI_MASTERS_DIS, /* IPA v4.0+ */
  123. IPA_QMB_SELECT_GLOBAL_EN, /* IPA v4.0+ */
  124. QMB_RAM_RD_CACHE_DISABLE, /* IPA v4.9+ */
  125. GENQMB_AOOOWR, /* IPA v4.9+ */
  126. IF_OUT_OF_BUF_STOP_RESET_MASK_EN, /* IPA v4.9+ */
  127. GEN_QMB_1_DYNAMIC_ASIZE, /* IPA v4.9+ */
  128. GEN_QMB_0_DYNAMIC_ASIZE, /* IPA v4.9+ */
  129. ATOMIC_FETCHER_ARB_LOCK_DIS, /* IPA v4.0+ */
  130. FULL_FLUSH_WAIT_RS_CLOSURE_EN, /* IPA v4.5+ */
  131. };
  132. /* CLKON_CFG register */
  133. enum ipa_reg_clkon_cfg_field_id {
  134. CLKON_RX,
  135. CLKON_PROC,
  136. TX_WRAPPER,
  137. CLKON_MISC,
  138. RAM_ARB,
  139. FTCH_HPS,
  140. FTCH_DPS,
  141. CLKON_HPS,
  142. CLKON_DPS,
  143. RX_HPS_CMDQS,
  144. HPS_DPS_CMDQS,
  145. DPS_TX_CMDQS,
  146. RSRC_MNGR,
  147. CTX_HANDLER,
  148. ACK_MNGR,
  149. D_DCPH,
  150. H_DCPH,
  151. CLKON_DCMP, /* IPA v4.5+ */
  152. NTF_TX_CMDQS, /* IPA v3.5+ */
  153. CLKON_TX_0, /* IPA v3.5+ */
  154. CLKON_TX_1, /* IPA v3.5+ */
  155. CLKON_FNR, /* IPA v3.5.1+ */
  156. QSB2AXI_CMDQ_L, /* IPA v4.0+ */
  157. AGGR_WRAPPER, /* IPA v4.0+ */
  158. RAM_SLAVEWAY, /* IPA v4.0+ */
  159. CLKON_QMB, /* IPA v4.0+ */
  160. WEIGHT_ARB, /* IPA v4.0+ */
  161. GSI_IF, /* IPA v4.0+ */
  162. CLKON_GLOBAL, /* IPA v4.0+ */
  163. GLOBAL_2X_CLK, /* IPA v4.0+ */
  164. DPL_FIFO, /* IPA v4.5+ */
  165. DRBIP, /* IPA v4.7+ */
  166. };
  167. /* ROUTE register */
  168. enum ipa_reg_route_field_id {
  169. ROUTE_DIS,
  170. ROUTE_DEF_PIPE,
  171. ROUTE_DEF_HDR_TABLE,
  172. ROUTE_DEF_HDR_OFST,
  173. ROUTE_FRAG_DEF_PIPE,
  174. ROUTE_DEF_RETAIN_HDR,
  175. };
  176. /* SHARED_MEM_SIZE register */
  177. enum ipa_reg_shared_mem_size_field_id {
  178. MEM_SIZE,
  179. MEM_BADDR,
  180. };
  181. /* QSB_MAX_WRITES register */
  182. enum ipa_reg_qsb_max_writes_field_id {
  183. GEN_QMB_0_MAX_WRITES,
  184. GEN_QMB_1_MAX_WRITES,
  185. };
  186. /* QSB_MAX_READS register */
  187. enum ipa_reg_qsb_max_reads_field_id {
  188. GEN_QMB_0_MAX_READS,
  189. GEN_QMB_1_MAX_READS,
  190. GEN_QMB_0_MAX_READS_BEATS, /* IPA v4.0+ */
  191. GEN_QMB_1_MAX_READS_BEATS, /* IPA v4.0+ */
  192. };
  193. /* FILT_ROUT_HASH_EN and FILT_ROUT_HASH_FLUSH registers */
  194. enum ipa_reg_filt_rout_hash_field_id {
  195. IPV6_ROUTER_HASH,
  196. IPV6_FILTER_HASH,
  197. IPV4_ROUTER_HASH,
  198. IPV4_FILTER_HASH,
  199. };
  200. /* FILT_ROUT_CACHE_FLUSH register */
  201. enum ipa_reg_filt_rout_cache_field_id {
  202. ROUTER_CACHE,
  203. FILTER_CACHE,
  204. };
  205. /* BCR register */
  206. enum ipa_bcr_compat {
  207. BCR_CMDQ_L_LACK_ONE_ENTRY = 0x0, /* Not IPA v4.2+ */
  208. BCR_TX_NOT_USING_BRESP = 0x1, /* Not IPA v4.2+ */
  209. BCR_TX_SUSPEND_IRQ_ASSERT_ONCE = 0x2, /* Not IPA v4.0+ */
  210. BCR_SUSPEND_L2_IRQ = 0x3, /* Not IPA v4.2+ */
  211. BCR_HOLB_DROP_L2_IRQ = 0x4, /* Not IPA v4.2+ */
  212. BCR_DUAL_TX = 0x5, /* IPA v3.5+ */
  213. BCR_ENABLE_FILTER_DATA_CACHE = 0x6, /* IPA v3.5+ */
  214. BCR_NOTIF_PRIORITY_OVER_ZLT = 0x7, /* IPA v3.5+ */
  215. BCR_FILTER_PREFETCH_EN = 0x8, /* IPA v3.5+ */
  216. BCR_ROUTER_PREFETCH_EN = 0x9, /* IPA v3.5+ */
  217. };
  218. /* LOCAL_PKT_PROC_CNTXT register */
  219. enum ipa_reg_local_pkt_proc_cntxt_field_id {
  220. IPA_BASE_ADDR,
  221. };
  222. /* COUNTER_CFG register */
  223. enum ipa_reg_counter_cfg_field_id {
  224. EOT_COAL_GRANULARITY, /* Not IPA v3.5+ */
  225. AGGR_GRANULARITY,
  226. };
  227. /* IPA_TX_CFG register */
  228. enum ipa_reg_ipa_tx_cfg_field_id {
  229. TX0_PREFETCH_DISABLE, /* Not IPA v4.0+ */
  230. TX1_PREFETCH_DISABLE, /* Not IPA v4.0+ */
  231. PREFETCH_ALMOST_EMPTY_SIZE, /* Not IPA v4.0+ */
  232. PREFETCH_ALMOST_EMPTY_SIZE_TX0, /* IPA v4.0+ */
  233. DMAW_SCND_OUTSD_PRED_THRESHOLD, /* IPA v4.0+ */
  234. DMAW_SCND_OUTSD_PRED_EN, /* IPA v4.0+ */
  235. DMAW_MAX_BEATS_256_DIS, /* IPA v4.0+ */
  236. PA_MASK_EN, /* IPA v4.0+ */
  237. PREFETCH_ALMOST_EMPTY_SIZE_TX1, /* IPA v4.0+ */
  238. DUAL_TX_ENABLE, /* IPA v4.5+ */
  239. SSPND_PA_NO_START_STATE, /* IPA v4,2+, not IPA v4.5 */
  240. SSPND_PA_NO_BQ_STATE, /* IPA v4.2 only */
  241. HOLB_STICKY_DROP_EN, /* IPA v5.0+ */
  242. };
  243. /* FLAVOR_0 register */
  244. enum ipa_reg_flavor_0_field_id {
  245. MAX_PIPES,
  246. MAX_CONS_PIPES,
  247. MAX_PROD_PIPES,
  248. PROD_LOWEST,
  249. };
  250. /* IDLE_INDICATION_CFG register */
  251. enum ipa_reg_idle_indication_cfg_field_id {
  252. ENTER_IDLE_DEBOUNCE_THRESH,
  253. CONST_NON_IDLE_ENABLE,
  254. };
  255. /* QTIME_TIMESTAMP_CFG register */
  256. enum ipa_reg_qtime_timestamp_cfg_field_id {
  257. DPL_TIMESTAMP_LSB, /* Not IPA v5.5+ */
  258. DPL_TIMESTAMP_SEL, /* Not IPA v5.5+ */
  259. TAG_TIMESTAMP_LSB,
  260. NAT_TIMESTAMP_LSB,
  261. };
  262. /* TIMERS_XO_CLK_DIV_CFG register */
  263. enum ipa_reg_timers_xo_clk_div_cfg_field_id {
  264. DIV_VALUE,
  265. DIV_ENABLE,
  266. };
  267. /* TIMERS_PULSE_GRAN_CFG register */
  268. enum ipa_reg_timers_pulse_gran_cfg_field_id {
  269. PULSE_GRAN_0,
  270. PULSE_GRAN_1,
  271. PULSE_GRAN_2,
  272. PULSE_GRAN_3,
  273. };
  274. /* Values for IPA_GRAN_x fields of TIMERS_PULSE_GRAN_CFG */
  275. enum ipa_pulse_gran {
  276. IPA_GRAN_10_US = 0x0,
  277. IPA_GRAN_20_US = 0x1,
  278. IPA_GRAN_50_US = 0x2,
  279. IPA_GRAN_100_US = 0x3,
  280. IPA_GRAN_1_MS = 0x4,
  281. IPA_GRAN_10_MS = 0x5,
  282. IPA_GRAN_100_MS = 0x6,
  283. IPA_GRAN_655350_US = 0x7,
  284. };
  285. /* {SRC,DST}_RSRC_GRP_{01,23,45,67}_RSRC_TYPE registers */
  286. enum ipa_reg_rsrc_grp_rsrc_type_field_id {
  287. X_MIN_LIM,
  288. X_MAX_LIM,
  289. Y_MIN_LIM,
  290. Y_MAX_LIM,
  291. };
  292. /* ENDP_INIT_CTRL register */
  293. enum ipa_reg_endp_init_ctrl_field_id {
  294. ENDP_SUSPEND, /* Not IPA v4.0+ */
  295. ENDP_DELAY, /* Not IPA v4.2+ */
  296. };
  297. /* ENDP_INIT_CFG register */
  298. enum ipa_reg_endp_init_cfg_field_id {
  299. FRAG_OFFLOAD_EN,
  300. CS_OFFLOAD_EN,
  301. CS_METADATA_HDR_OFFSET,
  302. CS_GEN_QMB_MASTER_SEL,
  303. PIPE_REPLICATE_EN, /* IPA v5.5+ */
  304. };
  305. /** enum ipa_cs_offload_en - ENDP_INIT_CFG register CS_OFFLOAD_EN field value */
  306. enum ipa_cs_offload_en {
  307. IPA_CS_OFFLOAD_NONE = 0x0,
  308. IPA_CS_OFFLOAD_UL /* TX */ = 0x1, /* Not IPA v4.5+ */
  309. IPA_CS_OFFLOAD_DL /* RX */ = 0x2, /* Not IPA v4.5+ */
  310. IPA_CS_OFFLOAD_INLINE /* TX and RX */ = 0x1, /* IPA v4.5+ */
  311. };
  312. /* ENDP_INIT_NAT register */
  313. enum ipa_reg_endp_init_nat_field_id {
  314. NAT_EN,
  315. };
  316. /** enum ipa_nat_type - ENDP_INIT_NAT register NAT_EN field value */
  317. enum ipa_nat_type {
  318. IPA_NAT_TYPE_BYPASS = 0,
  319. IPA_NAT_TYPE_SRC = 1,
  320. IPA_NAT_TYPE_DST = 2,
  321. };
  322. /* ENDP_INIT_HDR register */
  323. enum ipa_reg_endp_init_hdr_field_id {
  324. HDR_LEN,
  325. HDR_OFST_METADATA_VALID,
  326. HDR_OFST_METADATA,
  327. HDR_ADDITIONAL_CONST_LEN,
  328. HDR_OFST_PKT_SIZE_VALID,
  329. HDR_OFST_PKT_SIZE,
  330. HDR_A5_MUX, /* Not IPA v4.9+ */
  331. HDR_LEN_INC_DEAGG_HDR,
  332. HDR_METADATA_REG_VALID, /* Not IPA v4.5+ */
  333. HDR_LEN_MSB, /* IPA v4.5+ */
  334. HDR_OFST_METADATA_MSB, /* IPA v4.5+ */
  335. };
  336. /* ENDP_INIT_HDR_EXT register */
  337. enum ipa_reg_endp_init_hdr_ext_field_id {
  338. HDR_ENDIANNESS,
  339. HDR_TOTAL_LEN_OR_PAD_VALID,
  340. HDR_TOTAL_LEN_OR_PAD,
  341. HDR_PAYLOAD_LEN_INC_PADDING,
  342. HDR_TOTAL_LEN_OR_PAD_OFFSET,
  343. HDR_PAD_TO_ALIGNMENT,
  344. HDR_TOTAL_LEN_OR_PAD_OFFSET_MSB, /* IPA v4.5+ */
  345. HDR_OFST_PKT_SIZE_MSB, /* IPA v4.5+ */
  346. HDR_ADDITIONAL_CONST_LEN_MSB, /* IPA v4.5+ */
  347. HDR_BYTES_TO_REMOVE_VALID, /* IPA v5.0+ */
  348. HDR_BYTES_TO_REMOVE, /* IPA v5.0+ */
  349. };
  350. /* ENDP_INIT_MODE register */
  351. enum ipa_reg_endp_init_mode_field_id {
  352. ENDP_MODE,
  353. DCPH_ENABLE, /* IPA v4.5+ */
  354. DEST_PIPE_INDEX,
  355. BYTE_THRESHOLD,
  356. PIPE_REPLICATION_EN, /* Not IPA v5.5+ */
  357. PAD_EN,
  358. HDR_FTCH_DISABLE, /* IPA v4.5+ */
  359. DRBIP_ACL_ENABLE, /* IPA v4.9+ */
  360. };
  361. /** enum ipa_mode - ENDP_INIT_MODE register MODE field value */
  362. enum ipa_mode {
  363. IPA_BASIC = 0x0,
  364. IPA_ENABLE_FRAMING_HDLC = 0x1,
  365. IPA_ENABLE_DEFRAMING_HDLC = 0x2,
  366. IPA_DMA = 0x3,
  367. };
  368. /* ENDP_INIT_AGGR register */
  369. enum ipa_reg_endp_init_aggr_field_id {
  370. AGGR_EN,
  371. AGGR_TYPE,
  372. BYTE_LIMIT,
  373. TIME_LIMIT,
  374. PKT_LIMIT,
  375. SW_EOF_ACTIVE,
  376. FORCE_CLOSE,
  377. HARD_BYTE_LIMIT_EN,
  378. AGGR_GRAN_SEL,
  379. AGGR_COAL_L2, /* IPA v5.5+ */
  380. };
  381. /** enum ipa_aggr_en - ENDP_INIT_AGGR register AGGR_EN field value */
  382. enum ipa_aggr_en {
  383. IPA_BYPASS_AGGR /* TX and RX */ = 0x0,
  384. IPA_ENABLE_AGGR /* RX */ = 0x1,
  385. IPA_ENABLE_DEAGGR /* TX */ = 0x2,
  386. };
  387. /** enum ipa_aggr_type - ENDP_INIT_AGGR register AGGR_TYPE field value */
  388. enum ipa_aggr_type {
  389. IPA_MBIM_16 = 0x0,
  390. IPA_HDLC = 0x1,
  391. IPA_TLP = 0x2,
  392. IPA_RNDIS = 0x3,
  393. IPA_GENERIC = 0x4,
  394. IPA_COALESCE = 0x5,
  395. IPA_QCMAP = 0x6,
  396. };
  397. /* ENDP_INIT_HOL_BLOCK_EN register */
  398. enum ipa_reg_endp_init_hol_block_en_field_id {
  399. HOL_BLOCK_EN,
  400. };
  401. /* ENDP_INIT_HOL_BLOCK_TIMER register */
  402. enum ipa_reg_endp_init_hol_block_timer_field_id {
  403. TIMER_BASE_VALUE, /* Not IPA v4.5+ */
  404. TIMER_SCALE, /* IPA v4.2 only */
  405. TIMER_LIMIT, /* IPA v4.5+ */
  406. TIMER_GRAN_SEL, /* IPA v4.5+ */
  407. };
  408. /* ENDP_INIT_DEAGGR register */
  409. enum ipa_reg_endp_deaggr_field_id {
  410. DEAGGR_HDR_LEN,
  411. SYSPIPE_ERR_DETECTION,
  412. PACKET_OFFSET_VALID,
  413. PACKET_OFFSET_LOCATION,
  414. IGNORE_MIN_PKT_ERR,
  415. MAX_PACKET_LEN,
  416. };
  417. /* ENDP_INIT_RSRC_GRP register */
  418. enum ipa_reg_endp_init_rsrc_grp_field_id {
  419. ENDP_RSRC_GRP,
  420. };
  421. /* ENDP_INIT_SEQ register */
  422. enum ipa_reg_endp_init_seq_field_id {
  423. SEQ_TYPE,
  424. SEQ_REP_TYPE, /* Not IPA v4.5+ */
  425. };
  426. /**
  427. * enum ipa_seq_type - HPS and DPS sequencer type
  428. * @IPA_SEQ_DMA: Perform DMA only
  429. * @IPA_SEQ_1_PASS: One pass through the pipeline
  430. * @IPA_SEQ_2_PASS_SKIP_LAST_UC: Two passes, skip the microcprocessor
  431. * @IPA_SEQ_1_PASS_SKIP_LAST_UC: One pass, skip the microcprocessor
  432. * @IPA_SEQ_2_PASS: Two passes through the pipeline
  433. * @IPA_SEQ_3_PASS_SKIP_LAST_UC: Three passes, skip the microcprocessor
  434. * @IPA_SEQ_DECIPHER: Optional deciphering step (combined)
  435. *
  436. * The low-order byte of the sequencer type register defines the number of
  437. * passes a packet takes through the IPA pipeline. The last pass through can
  438. * optionally skip the microprocessor. Deciphering is optional for all types;
  439. * if enabled, an additional mask (two bits) is added to the type value.
  440. *
  441. * Note: not all combinations of ipa_seq_type and ipa_seq_rep_type are
  442. * supported (or meaningful).
  443. */
  444. enum ipa_seq_type {
  445. IPA_SEQ_DMA = 0x00,
  446. IPA_SEQ_1_PASS = 0x02,
  447. IPA_SEQ_2_PASS_SKIP_LAST_UC = 0x04,
  448. IPA_SEQ_1_PASS_SKIP_LAST_UC = 0x06,
  449. IPA_SEQ_2_PASS = 0x0a,
  450. IPA_SEQ_3_PASS_SKIP_LAST_UC = 0x0c,
  451. /* The next value can be ORed with the above */
  452. IPA_SEQ_DECIPHER = 0x11,
  453. };
  454. /**
  455. * enum ipa_seq_rep_type - replicated packet sequencer type
  456. * @IPA_SEQ_REP_DMA_PARSER: DMA parser for replicated packets
  457. *
  458. * This goes in the second byte of the endpoint sequencer type register.
  459. *
  460. * Note: not all combinations of ipa_seq_type and ipa_seq_rep_type are
  461. * supported (or meaningful).
  462. */
  463. enum ipa_seq_rep_type {
  464. IPA_SEQ_REP_DMA_PARSER = 0x08,
  465. };
  466. /* ENDP_STATUS register */
  467. enum ipa_reg_endp_status_field_id {
  468. STATUS_EN,
  469. STATUS_ENDP,
  470. STATUS_LOCATION, /* Not IPA v4.5+ */
  471. STATUS_PKT_SUPPRESS, /* IPA v4.0+ */
  472. };
  473. /* ENDP_FILTER_ROUTER_HSH_CFG register */
  474. enum ipa_reg_endp_filter_router_hsh_cfg_field_id {
  475. FILTER_HASH_MSK_SRC_ID,
  476. FILTER_HASH_MSK_SRC_IP,
  477. FILTER_HASH_MSK_DST_IP,
  478. FILTER_HASH_MSK_SRC_PORT,
  479. FILTER_HASH_MSK_DST_PORT,
  480. FILTER_HASH_MSK_PROTOCOL,
  481. FILTER_HASH_MSK_METADATA,
  482. FILTER_HASH_MSK_ALL, /* Bitwise OR of the above 6 fields */
  483. ROUTER_HASH_MSK_SRC_ID,
  484. ROUTER_HASH_MSK_SRC_IP,
  485. ROUTER_HASH_MSK_DST_IP,
  486. ROUTER_HASH_MSK_SRC_PORT,
  487. ROUTER_HASH_MSK_DST_PORT,
  488. ROUTER_HASH_MSK_PROTOCOL,
  489. ROUTER_HASH_MSK_METADATA,
  490. ROUTER_HASH_MSK_ALL, /* Bitwise OR of the above 6 fields */
  491. };
  492. /* ENDP_FILTER_CACHE_CFG and ENDP_ROUTER_CACHE_CFG registers */
  493. enum ipa_reg_endp_cache_cfg_field_id {
  494. CACHE_MSK_SRC_ID,
  495. CACHE_MSK_SRC_IP,
  496. CACHE_MSK_DST_IP,
  497. CACHE_MSK_SRC_PORT,
  498. CACHE_MSK_DST_PORT,
  499. CACHE_MSK_PROTOCOL,
  500. CACHE_MSK_METADATA,
  501. };
  502. /* IPA_IRQ_STTS, IPA_IRQ_EN, and IPA_IRQ_CLR registers */
  503. /**
  504. * enum ipa_irq_id - Bit positions representing type of IPA IRQ
  505. * @IPA_IRQ_UC_0: Microcontroller event interrupt
  506. * @IPA_IRQ_UC_1: Microcontroller response interrupt
  507. * @IPA_IRQ_TX_SUSPEND: Data ready interrupt
  508. * @IPA_IRQ_COUNT: Number of IRQ ids (must be last)
  509. *
  510. * IRQ types not described above are not currently used.
  511. *
  512. * @IPA_IRQ_BAD_SNOC_ACCESS: (Not currently used)
  513. * @IPA_IRQ_EOT_COAL: (Not currently used)
  514. * @IPA_IRQ_UC_2: (Not currently used)
  515. * @IPA_IRQ_UC_3: (Not currently used)
  516. * @IPA_IRQ_UC_IN_Q_NOT_EMPTY: (Not currently used)
  517. * @IPA_IRQ_UC_RX_CMD_Q_NOT_FULL: (Not currently used)
  518. * @IPA_IRQ_PROC_UC_ACK_Q_NOT_EMPTY: (Not currently used)
  519. * @IPA_IRQ_RX_ERR: (Not currently used)
  520. * @IPA_IRQ_DEAGGR_ERR: (Not currently used)
  521. * @IPA_IRQ_TX_ERR: (Not currently used)
  522. * @IPA_IRQ_STEP_MODE: (Not currently used)
  523. * @IPA_IRQ_PROC_ERR: (Not currently used)
  524. * @IPA_IRQ_TX_HOLB_DROP: (Not currently used)
  525. * @IPA_IRQ_BAM_GSI_IDLE: (Not currently used)
  526. * @IPA_IRQ_PIPE_YELLOW_BELOW: (Not currently used)
  527. * @IPA_IRQ_PIPE_RED_BELOW: (Not currently used)
  528. * @IPA_IRQ_PIPE_YELLOW_ABOVE: (Not currently used)
  529. * @IPA_IRQ_PIPE_RED_ABOVE: (Not currently used)
  530. * @IPA_IRQ_UCP: (Not currently used)
  531. * @IPA_IRQ_DCMP: (Not currently used)
  532. * @IPA_IRQ_GSI_EE: (Not currently used)
  533. * @IPA_IRQ_GSI_IPA_IF_TLV_RCVD: (Not currently used)
  534. * @IPA_IRQ_GSI_UC: (Not currently used)
  535. * @IPA_IRQ_TLV_LEN_MIN_DSM: (Not currently used)
  536. * @IPA_IRQ_DRBIP_PKT_EXCEED_MAX_SIZE_EN: (Not currently used)
  537. * @IPA_IRQ_DRBIP_DATA_SCTR_CFG_ERROR_EN: (Not currently used)
  538. * @IPA_IRQ_DRBIP_IMM_CMD_NO_FLSH_HZRD_EN: (Not currently used)
  539. * @IPA_IRQ_ERROR_NON_FATAL: (Not currently used)
  540. * @IPA_IRQ_ERROR_FATAL: (Not currently used)
  541. */
  542. enum ipa_irq_id {
  543. IPA_IRQ_BAD_SNOC_ACCESS = 0x0, /* Not IPA v5.5+ */
  544. IPA_IRQ_EOT_COAL = 0x1, /* Not IPA v3.5+ */
  545. IPA_IRQ_UC_0 = 0x2,
  546. IPA_IRQ_UC_1 = 0x3,
  547. IPA_IRQ_UC_2 = 0x4,
  548. IPA_IRQ_UC_3 = 0x5,
  549. IPA_IRQ_UC_IN_Q_NOT_EMPTY = 0x6,
  550. IPA_IRQ_UC_RX_CMD_Q_NOT_FULL = 0x7,
  551. IPA_IRQ_PROC_UC_ACK_Q_NOT_EMPTY = 0x8,
  552. IPA_IRQ_RX_ERR = 0x9, /* Not IPA v5.5+ */
  553. IPA_IRQ_DEAGGR_ERR = 0xa, /* Not IPA v5.5+ */
  554. IPA_IRQ_TX_ERR = 0xb, /* Not IPA v5.5+ */
  555. IPA_IRQ_STEP_MODE = 0xc, /* Not IPA v5.5+ */
  556. IPA_IRQ_PROC_ERR = 0xd, /* Not IPA v5.5+ */
  557. IPA_IRQ_TX_SUSPEND = 0xe,
  558. IPA_IRQ_TX_HOLB_DROP = 0xf,
  559. IPA_IRQ_BAM_GSI_IDLE = 0x10,
  560. IPA_IRQ_PIPE_YELLOW_BELOW = 0x11,
  561. IPA_IRQ_PIPE_RED_BELOW = 0x12,
  562. IPA_IRQ_PIPE_YELLOW_ABOVE = 0x13,
  563. IPA_IRQ_PIPE_RED_ABOVE = 0x14,
  564. IPA_IRQ_UCP = 0x15,
  565. IPA_IRQ_DCMP = 0x16, /* Not IPA v4.5+ */
  566. IPA_IRQ_GSI_EE = 0x17,
  567. IPA_IRQ_GSI_IPA_IF_TLV_RCVD = 0x18,
  568. IPA_IRQ_GSI_UC = 0x19,
  569. IPA_IRQ_TLV_LEN_MIN_DSM = 0x1a, /* IPA v4.5-v5.2 */
  570. IPA_IRQ_DRBIP_PKT_EXCEED_MAX_SIZE_EN = 0x1b, /* IPA v4.9-v5.2 */
  571. IPA_IRQ_DRBIP_DATA_SCTR_CFG_ERROR_EN = 0x1c, /* IPA v4.9-v5.2 */
  572. IPA_IRQ_DRBIP_IMM_CMD_NO_FLSH_HZRD_EN = 0x1d, /* IPA v4.9-v5.2 */
  573. IPA_IRQ_ERROR_NON_FATAL = 0x1e, /* IPA v5.5+ */
  574. IPA_IRQ_ERROR_FATAL = 0x1f, /* IPA v5.5+ */
  575. IPA_IRQ_COUNT, /* Last; not an id */
  576. };
  577. /* IPA_IRQ_UC register */
  578. enum ipa_reg_ipa_irq_uc_field_id {
  579. UC_INTR,
  580. };
  581. extern const struct regs ipa_regs_v3_1;
  582. extern const struct regs ipa_regs_v3_5_1;
  583. extern const struct regs ipa_regs_v4_2;
  584. extern const struct regs ipa_regs_v4_5;
  585. extern const struct regs ipa_regs_v4_7;
  586. extern const struct regs ipa_regs_v4_9;
  587. extern const struct regs ipa_regs_v4_11;
  588. extern const struct regs ipa_regs_v5_0;
  589. extern const struct regs ipa_regs_v5_5;
  590. const struct reg *ipa_reg(struct ipa *ipa, enum ipa_reg_id reg_id);
  591. int ipa_reg_init(struct ipa *ipa, struct platform_device *pdev);
  592. void ipa_reg_exit(struct ipa *ipa);
  593. #endif /* _IPA_REG_H_ */