hal_8074v1.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. /*
  2. * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #include "hal_hw_headers.h"
  19. #include "hal_internal.h"
  20. #include "hal_api.h"
  21. #include "target_type.h"
  22. #include "wcss_version.h"
  23. #include "qdf_module.h"
  24. #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET \
  25. RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET
  26. #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK \
  27. RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK
  28. #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB \
  29. RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB
  30. #define UNIFIED_PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET \
  31. PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET
  32. #define UNIFIED_PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET \
  33. PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET
  34. #define UNIFIED_PHYRX_L_SIG_A_0_L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS_OFFSET \
  35. PHYRX_L_SIG_A_0_L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS_OFFSET
  36. #define UNIFIED_PHYRX_VHT_SIG_A_0_VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS_OFFSET \
  37. PHYRX_VHT_SIG_A_0_VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS_OFFSET
  38. #define UNIFIED_PHYRX_HE_SIG_A_SU_0_HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS_OFFSET \
  39. PHYRX_HE_SIG_A_SU_0_HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS_OFFSET
  40. #define UNIFIED_PHYRX_HE_SIG_A_MU_DL_0_HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_OFFSET \
  41. PHYRX_HE_SIG_A_MU_DL_0_HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_OFFSET
  42. #define UNIFIED_PHYRX_HE_SIG_B1_MU_0_HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_OFFSET \
  43. PHYRX_HE_SIG_B1_MU_0_HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_OFFSET
  44. #define UNIFIED_PHYRX_HE_SIG_B2_MU_0_HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_OFFSET \
  45. PHYRX_HE_SIG_B2_MU_0_HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_OFFSET
  46. #define UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0_HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_OFFSET \
  47. PHYRX_HE_SIG_B2_OFDMA_0_HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_OFFSET
  48. #define UNIFIED_PHYRX_RSSI_LEGACY_3_RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS_OFFSET \
  49. PHYRX_RSSI_LEGACY_3_RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS_OFFSET
  50. #define UNIFIED_PHYRX_RSSI_LEGACY_19_RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS_OFFSET \
  51. PHYRX_RSSI_LEGACY_19_RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS_OFFSET
  52. #define UNIFIED_RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET \
  53. RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET
  54. #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
  55. RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET
  56. #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \
  57. RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET
  58. #define UNIFIED_RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
  59. RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET
  60. #define UNIFIED_REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \
  61. REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET
  62. #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC \
  63. UNIFORM_REO_STATUS_HEADER_STATUS_HEADER
  64. #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSE \
  65. RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET
  66. #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \
  67. RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET
  68. #define UNIFIED_TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
  69. TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET
  70. #define UNIFIED_TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \
  71. TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET
  72. #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET \
  73. TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET
  74. #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB \
  75. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB
  76. #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK \
  77. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK
  78. #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB \
  79. BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB
  80. #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK \
  81. BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK
  82. #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB \
  83. BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB
  84. #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK \
  85. BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK
  86. #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB \
  87. BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB
  88. #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK \
  89. BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK
  90. #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB \
  91. TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB
  92. #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK \
  93. TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK
  94. #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK \
  95. WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK
  96. #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET \
  97. WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET
  98. #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB \
  99. WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB
  100. #include "hal_8074v1_tx.h"
  101. #include "hal_8074v1_rx.h"
  102. #include <hal_generic_api.h>
  103. #include <hal_wbm.h>
  104. /**
  105. * hal_rx_get_rx_fragment_number_8074v1(): Function to retrieve
  106. * rx fragment number
  107. *
  108. * @nbuf: Network buffer
  109. * Returns: rx fragment number
  110. */
  111. static
  112. uint8_t hal_rx_get_rx_fragment_number_8074v1(uint8_t *buf)
  113. {
  114. struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
  115. struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
  116. /* Return first 4 bits as fragment number */
  117. return (HAL_RX_MPDU_GET_SEQUENCE_NUMBER(rx_mpdu_info) &
  118. DOT11_SEQ_FRAG_MASK);
  119. }
  120. struct hal_hw_txrx_ops qca8074_hal_hw_txrx_ops = {
  121. /* init and setup */
  122. hal_srng_dst_hw_init_generic,
  123. hal_srng_src_hw_init_generic,
  124. hal_get_hw_hptp_generic,
  125. hal_reo_setup_generic,
  126. hal_setup_link_idle_list_generic,
  127. /* tx */
  128. hal_tx_desc_set_dscp_tid_table_id_8074,
  129. hal_tx_set_dscp_tid_map_8074,
  130. hal_tx_update_dscp_tid_8074,
  131. hal_tx_desc_set_lmac_id_8074,
  132. hal_tx_desc_set_buf_addr_generic,
  133. hal_tx_desc_set_search_type_generic,
  134. hal_tx_desc_set_search_index_generic,
  135. hal_tx_desc_set_cache_set_num_generic,
  136. hal_tx_comp_get_status_generic,
  137. hal_tx_comp_get_release_reason_generic,
  138. /* rx */
  139. hal_rx_msdu_start_nss_get_8074,
  140. hal_rx_mon_hw_desc_get_mpdu_status_8074,
  141. hal_rx_get_tlv_8074,
  142. hal_rx_proc_phyrx_other_receive_info_tlv_8074,
  143. hal_rx_dump_msdu_start_tlv_8074,
  144. hal_rx_dump_msdu_end_tlv_8074,
  145. hal_get_link_desc_size_8074,
  146. hal_rx_mpdu_start_tid_get_8074,
  147. hal_rx_msdu_start_reception_type_get_8074,
  148. hal_rx_msdu_end_da_idx_get_8074,
  149. hal_rx_msdu_desc_info_get_ptr_generic,
  150. hal_rx_link_desc_msdu0_ptr_generic,
  151. hal_reo_status_get_header_generic,
  152. hal_rx_status_get_tlv_info_generic,
  153. hal_rx_wbm_err_info_get_generic,
  154. hal_rx_dump_mpdu_start_tlv_generic,
  155. hal_tx_set_pcp_tid_map_generic,
  156. hal_tx_update_pcp_tid_generic,
  157. hal_tx_update_tidmap_prty_generic,
  158. hal_rx_get_rx_fragment_number_8074v1,
  159. };
  160. struct hal_hw_srng_config hw_srng_table_8074[] = {
  161. /* TODO: max_rings can populated by querying HW capabilities */
  162. { /* REO_DST */
  163. .start_ring_id = HAL_SRNG_REO2SW1,
  164. .max_rings = 4,
  165. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  166. .lmac_ring = FALSE,
  167. .ring_dir = HAL_SRNG_DST_RING,
  168. .reg_start = {
  169. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(
  170. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  171. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(
  172. SEQ_WCSS_UMAC_REO_REG_OFFSET)
  173. },
  174. .reg_size = {
  175. HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) -
  176. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0),
  177. HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) -
  178. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0),
  179. },
  180. .max_size =
  181. HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >>
  182. HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT,
  183. },
  184. { /* REO_EXCEPTION */
  185. /* Designating REO2TCL ring as exception ring. This ring is
  186. * similar to other REO2SW rings though it is named as REO2TCL.
  187. * Any of theREO2SW rings can be used as exception ring.
  188. */
  189. .start_ring_id = HAL_SRNG_REO2TCL,
  190. .max_rings = 1,
  191. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  192. .lmac_ring = FALSE,
  193. .ring_dir = HAL_SRNG_DST_RING,
  194. .reg_start = {
  195. HWIO_REO_R0_REO2TCL_RING_BASE_LSB_ADDR(
  196. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  197. HWIO_REO_R2_REO2TCL_RING_HP_ADDR(
  198. SEQ_WCSS_UMAC_REO_REG_OFFSET)
  199. },
  200. /* Single ring - provide ring size if multiple rings of this
  201. * type are supported
  202. */
  203. .reg_size = {},
  204. .max_size =
  205. HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_BMSK >>
  206. HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_SHFT,
  207. },
  208. { /* REO_REINJECT */
  209. .start_ring_id = HAL_SRNG_SW2REO,
  210. .max_rings = 1,
  211. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  212. .lmac_ring = FALSE,
  213. .ring_dir = HAL_SRNG_SRC_RING,
  214. .reg_start = {
  215. HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(
  216. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  217. HWIO_REO_R2_SW2REO_RING_HP_ADDR(
  218. SEQ_WCSS_UMAC_REO_REG_OFFSET)
  219. },
  220. /* Single ring - provide ring size if multiple rings of this
  221. * type are supported
  222. */
  223. .reg_size = {},
  224. .max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >>
  225. HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT,
  226. },
  227. { /* REO_CMD */
  228. .start_ring_id = HAL_SRNG_REO_CMD,
  229. .max_rings = 1,
  230. .entry_size = (sizeof(struct tlv_32_hdr) +
  231. sizeof(struct reo_get_queue_stats)) >> 2,
  232. .lmac_ring = FALSE,
  233. .ring_dir = HAL_SRNG_SRC_RING,
  234. .reg_start = {
  235. HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR(
  236. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  237. HWIO_REO_R2_REO_CMD_RING_HP_ADDR(
  238. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  239. },
  240. /* Single ring - provide ring size if multiple rings of this
  241. * type are supported
  242. */
  243. .reg_size = {},
  244. .max_size = HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
  245. HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
  246. },
  247. { /* REO_STATUS */
  248. .start_ring_id = HAL_SRNG_REO_STATUS,
  249. .max_rings = 1,
  250. .entry_size = (sizeof(struct tlv_32_hdr) +
  251. sizeof(struct reo_get_queue_stats_status)) >> 2,
  252. .lmac_ring = FALSE,
  253. .ring_dir = HAL_SRNG_DST_RING,
  254. .reg_start = {
  255. HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR(
  256. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  257. HWIO_REO_R2_REO_STATUS_RING_HP_ADDR(
  258. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  259. },
  260. /* Single ring - provide ring size if multiple rings of this
  261. * type are supported
  262. */
  263. .reg_size = {},
  264. .max_size =
  265. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  266. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  267. },
  268. { /* TCL_DATA */
  269. .start_ring_id = HAL_SRNG_SW2TCL1,
  270. .max_rings = 3,
  271. .entry_size = (sizeof(struct tlv_32_hdr) +
  272. sizeof(struct tcl_data_cmd)) >> 2,
  273. .lmac_ring = FALSE,
  274. .ring_dir = HAL_SRNG_SRC_RING,
  275. .reg_start = {
  276. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(
  277. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  278. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(
  279. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  280. },
  281. .reg_size = {
  282. HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) -
  283. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0),
  284. HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) -
  285. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0),
  286. },
  287. .max_size =
  288. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
  289. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
  290. },
  291. { /* TCL_CMD */
  292. .start_ring_id = HAL_SRNG_SW2TCL_CMD,
  293. .max_rings = 1,
  294. .entry_size = (sizeof(struct tlv_32_hdr) +
  295. sizeof(struct tcl_gse_cmd)) >> 2,
  296. .lmac_ring = FALSE,
  297. .ring_dir = HAL_SRNG_SRC_RING,
  298. .reg_start = {
  299. HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_LSB_ADDR(
  300. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  301. HWIO_TCL_R2_SW2TCL_CMD_RING_HP_ADDR(
  302. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  303. },
  304. /* Single ring - provide ring size if multiple rings of this
  305. * type are supported
  306. */
  307. .reg_size = {},
  308. .max_size =
  309. HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
  310. HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
  311. },
  312. { /* TCL_STATUS */
  313. .start_ring_id = HAL_SRNG_TCL_STATUS,
  314. .max_rings = 1,
  315. .entry_size = (sizeof(struct tlv_32_hdr) +
  316. sizeof(struct tcl_status_ring)) >> 2,
  317. .lmac_ring = FALSE,
  318. .ring_dir = HAL_SRNG_DST_RING,
  319. .reg_start = {
  320. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR(
  321. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  322. HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR(
  323. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  324. },
  325. /* Single ring - provide ring size if multiple rings of this
  326. * type are supported
  327. */
  328. .reg_size = {},
  329. .max_size =
  330. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >>
  331. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT,
  332. },
  333. { /* CE_SRC */
  334. .start_ring_id = HAL_SRNG_CE_0_SRC,
  335. .max_rings = 12,
  336. .entry_size = sizeof(struct ce_src_desc) >> 2,
  337. .lmac_ring = FALSE,
  338. .ring_dir = HAL_SRNG_SRC_RING,
  339. .reg_start = {
  340. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
  341. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
  342. HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
  343. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
  344. },
  345. .reg_size = {
  346. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
  347. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
  348. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
  349. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
  350. },
  351. .max_size =
  352. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
  353. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
  354. },
  355. { /* CE_DST */
  356. .start_ring_id = HAL_SRNG_CE_0_DST,
  357. .max_rings = 12,
  358. .entry_size = 8 >> 2,
  359. /*TODO: entry_size above should actually be
  360. * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition
  361. * of struct ce_dst_desc in HW header files
  362. */
  363. .lmac_ring = FALSE,
  364. .ring_dir = HAL_SRNG_SRC_RING,
  365. .reg_start = {
  366. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
  367. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  368. HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
  369. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  370. },
  371. .reg_size = {
  372. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  373. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  374. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  375. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  376. },
  377. .max_size =
  378. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
  379. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
  380. },
  381. { /* CE_DST_STATUS */
  382. .start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
  383. .max_rings = 12,
  384. .entry_size = sizeof(struct ce_stat_desc) >> 2,
  385. .lmac_ring = FALSE,
  386. .ring_dir = HAL_SRNG_DST_RING,
  387. .reg_start = {
  388. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR(
  389. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  390. HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR(
  391. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  392. },
  393. /* TODO: check destination status ring registers */
  394. .reg_size = {
  395. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  396. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  397. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  398. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  399. },
  400. .max_size =
  401. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  402. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  403. },
  404. { /* WBM_IDLE_LINK */
  405. .start_ring_id = HAL_SRNG_WBM_IDLE_LINK,
  406. .max_rings = 1,
  407. .entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2,
  408. .lmac_ring = FALSE,
  409. .ring_dir = HAL_SRNG_SRC_RING,
  410. .reg_start = {
  411. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  412. HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  413. },
  414. /* Single ring - provide ring size if multiple rings of this
  415. * type are supported
  416. */
  417. .reg_size = {},
  418. .max_size =
  419. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >>
  420. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT,
  421. },
  422. { /* SW2WBM_RELEASE */
  423. .start_ring_id = HAL_SRNG_WBM_SW_RELEASE,
  424. .max_rings = 1,
  425. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  426. .lmac_ring = FALSE,
  427. .ring_dir = HAL_SRNG_SRC_RING,
  428. .reg_start = {
  429. HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  430. HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  431. },
  432. /* Single ring - provide ring size if multiple rings of this
  433. * type are supported
  434. */
  435. .reg_size = {},
  436. .max_size =
  437. HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  438. HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  439. },
  440. { /* WBM2SW_RELEASE */
  441. .start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
  442. .max_rings = 4,
  443. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  444. .lmac_ring = FALSE,
  445. .ring_dir = HAL_SRNG_DST_RING,
  446. .reg_start = {
  447. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  448. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  449. },
  450. .reg_size = {
  451. HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
  452. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  453. HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
  454. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  455. },
  456. .max_size =
  457. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  458. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  459. },
  460. { /* RXDMA_BUF */
  461. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
  462. #ifdef IPA_OFFLOAD
  463. .max_rings = 3,
  464. #else
  465. .max_rings = 2,
  466. #endif
  467. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  468. .lmac_ring = TRUE,
  469. .ring_dir = HAL_SRNG_SRC_RING,
  470. /* reg_start is not set because LMAC rings are not accessed
  471. * from host
  472. */
  473. .reg_start = {},
  474. .reg_size = {},
  475. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  476. },
  477. { /* RXDMA_DST */
  478. .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0,
  479. .max_rings = 1,
  480. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  481. .lmac_ring = TRUE,
  482. .ring_dir = HAL_SRNG_DST_RING,
  483. /* reg_start is not set because LMAC rings are not accessed
  484. * from host
  485. */
  486. .reg_start = {},
  487. .reg_size = {},
  488. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  489. },
  490. { /* RXDMA_MONITOR_BUF */
  491. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
  492. .max_rings = 1,
  493. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  494. .lmac_ring = TRUE,
  495. .ring_dir = HAL_SRNG_SRC_RING,
  496. /* reg_start is not set because LMAC rings are not accessed
  497. * from host
  498. */
  499. .reg_start = {},
  500. .reg_size = {},
  501. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  502. },
  503. { /* RXDMA_MONITOR_STATUS */
  504. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF,
  505. .max_rings = 1,
  506. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  507. .lmac_ring = TRUE,
  508. .ring_dir = HAL_SRNG_SRC_RING,
  509. /* reg_start is not set because LMAC rings are not accessed
  510. * from host
  511. */
  512. .reg_start = {},
  513. .reg_size = {},
  514. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  515. },
  516. { /* RXDMA_MONITOR_DST */
  517. .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW1,
  518. .max_rings = 1,
  519. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  520. .lmac_ring = TRUE,
  521. .ring_dir = HAL_SRNG_DST_RING,
  522. /* reg_start is not set because LMAC rings are not accessed
  523. * from host
  524. */
  525. .reg_start = {},
  526. .reg_size = {},
  527. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  528. },
  529. { /* RXDMA_MONITOR_DESC */
  530. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC,
  531. .max_rings = 1,
  532. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  533. .lmac_ring = TRUE,
  534. .ring_dir = HAL_SRNG_SRC_RING,
  535. /* reg_start is not set because LMAC rings are not accessed
  536. * from host
  537. */
  538. .reg_start = {},
  539. .reg_size = {},
  540. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  541. },
  542. { /* DIR_BUF_RX_DMA_SRC */
  543. .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING,
  544. .max_rings = 1,
  545. .entry_size = 2,
  546. .lmac_ring = TRUE,
  547. .ring_dir = HAL_SRNG_SRC_RING,
  548. /* reg_start is not set because LMAC rings are not accessed
  549. * from host
  550. */
  551. .reg_start = {},
  552. .reg_size = {},
  553. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  554. },
  555. #ifdef WLAN_FEATURE_CIF_CFR
  556. { /* WIFI_POS_SRC */
  557. .start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING,
  558. .max_rings = 1,
  559. .entry_size = sizeof(wmi_oem_dma_buf_release_entry) >> 2,
  560. .lmac_ring = TRUE,
  561. .ring_dir = HAL_SRNG_SRC_RING,
  562. /* reg_start is not set because LMAC rings are not accessed
  563. * from host
  564. */
  565. .reg_start = {},
  566. .reg_size = {},
  567. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  568. },
  569. #endif
  570. };
  571. int32_t hal_hw_reg_offset_qca8074[] = {
  572. /* dst */
  573. REG_OFFSET(DST, HP),
  574. REG_OFFSET(DST, TP),
  575. REG_OFFSET(DST, ID),
  576. REG_OFFSET(DST, MISC),
  577. REG_OFFSET(DST, HP_ADDR_LSB),
  578. REG_OFFSET(DST, HP_ADDR_MSB),
  579. REG_OFFSET(DST, MSI1_BASE_LSB),
  580. REG_OFFSET(DST, MSI1_BASE_MSB),
  581. REG_OFFSET(DST, MSI1_DATA),
  582. REG_OFFSET(DST, BASE_LSB),
  583. REG_OFFSET(DST, BASE_MSB),
  584. REG_OFFSET(DST, PRODUCER_INT_SETUP),
  585. /* src */
  586. REG_OFFSET(SRC, HP),
  587. REG_OFFSET(SRC, TP),
  588. REG_OFFSET(SRC, ID),
  589. REG_OFFSET(SRC, MISC),
  590. REG_OFFSET(SRC, TP_ADDR_LSB),
  591. REG_OFFSET(SRC, TP_ADDR_MSB),
  592. REG_OFFSET(SRC, MSI1_BASE_LSB),
  593. REG_OFFSET(SRC, MSI1_BASE_MSB),
  594. REG_OFFSET(SRC, MSI1_DATA),
  595. REG_OFFSET(SRC, BASE_LSB),
  596. REG_OFFSET(SRC, BASE_MSB),
  597. REG_OFFSET(SRC, CONSUMER_INT_SETUP_IX0),
  598. REG_OFFSET(SRC, CONSUMER_INT_SETUP_IX1),
  599. };
  600. /**
  601. * hal_qca8074_attach() - Attach 8074 target specific hal_soc ops,
  602. * offset and srng table
  603. */
  604. void hal_qca8074_attach(struct hal_soc *hal_soc)
  605. {
  606. hal_soc->hw_srng_table = hw_srng_table_8074;
  607. hal_soc->hal_hw_reg_offset = hal_hw_reg_offset_qca8074;
  608. hal_soc->ops = &qca8074_hal_hw_txrx_ops;
  609. }