ipa_reg.h 21 KB

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