hal_8074_srng.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. /*
  2. * Copyright (c) 2018 The Linux Foundation. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions are
  6. * met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above
  10. * copyright notice, this list of conditions and the following
  11. * disclaimer in the documentation and/or other materials provided
  12. * with the distribution.
  13. * * Neither the name of The Linux Foundation nor the names of its
  14. * contributors may be used to endorse or promote products derived
  15. * from this software without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
  18. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
  20. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
  21. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  22. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  23. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  24. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  25. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  26. * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  27. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. */
  29. #include "hal_hw_headers.h"
  30. #include "hal_internal.h"
  31. #include "hal_api.h"
  32. #include "target_type.h"
  33. #include "wcss_version.h"
  34. #include "qdf_module.h"
  35. #include "hal_8074_tx.h"
  36. #include "hal_8074_rx.h"
  37. struct hal_hw_txrx_ops qca8074_hal_hw_txrx_ops = {
  38. /* tx */
  39. hal_tx_desc_set_dscp_tid_table_id_8074,
  40. hal_tx_set_dscp_tid_map_8074,
  41. hal_tx_update_dscp_tid_8074,
  42. hal_tx_desc_set_lmac_id_8074,
  43. /* rx */
  44. hal_rx_msdu_start_nss_get_8074,
  45. hal_rx_mon_hw_desc_get_mpdu_status_8074,
  46. hal_rx_get_tlv_8074,
  47. hal_rx_proc_phyrx_other_receive_info_tlv_8074,
  48. hal_rx_dump_msdu_start_tlv_8074,
  49. hal_get_link_desc_size_8074,
  50. hal_rx_mpdu_start_tid_get_8074,
  51. hal_rx_msdu_start_reception_type_get_8074,
  52. };
  53. struct hal_hw_srng_config hw_srng_table_8074[] = {
  54. /* TODO: max_rings can populated by querying HW capabilities */
  55. { /* REO_DST */
  56. .start_ring_id = HAL_SRNG_REO2SW1,
  57. .max_rings = 4,
  58. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  59. .lmac_ring = FALSE,
  60. .ring_dir = HAL_SRNG_DST_RING,
  61. .reg_start = {
  62. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(
  63. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  64. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(
  65. SEQ_WCSS_UMAC_REO_REG_OFFSET)
  66. },
  67. .reg_size = {
  68. HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) -
  69. HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0),
  70. HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) -
  71. HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0),
  72. },
  73. .max_size =
  74. HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >>
  75. HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT,
  76. },
  77. { /* REO_EXCEPTION */
  78. /* Designating REO2TCL ring as exception ring. This ring is
  79. * similar to other REO2SW rings though it is named as REO2TCL.
  80. * Any of theREO2SW rings can be used as exception ring.
  81. */
  82. .start_ring_id = HAL_SRNG_REO2TCL,
  83. .max_rings = 1,
  84. .entry_size = sizeof(struct reo_destination_ring) >> 2,
  85. .lmac_ring = FALSE,
  86. .ring_dir = HAL_SRNG_DST_RING,
  87. .reg_start = {
  88. HWIO_REO_R0_REO2TCL_RING_BASE_LSB_ADDR(
  89. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  90. HWIO_REO_R2_REO2TCL_RING_HP_ADDR(
  91. SEQ_WCSS_UMAC_REO_REG_OFFSET)
  92. },
  93. /* Single ring - provide ring size if multiple rings of this
  94. * type are supported
  95. */
  96. .reg_size = {},
  97. .max_size =
  98. HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_BMSK >>
  99. HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_SHFT,
  100. },
  101. { /* REO_REINJECT */
  102. .start_ring_id = HAL_SRNG_SW2REO,
  103. .max_rings = 1,
  104. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  105. .lmac_ring = FALSE,
  106. .ring_dir = HAL_SRNG_SRC_RING,
  107. .reg_start = {
  108. HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(
  109. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  110. HWIO_REO_R2_SW2REO_RING_HP_ADDR(
  111. SEQ_WCSS_UMAC_REO_REG_OFFSET)
  112. },
  113. /* Single ring - provide ring size if multiple rings of this
  114. * type are supported
  115. */
  116. .reg_size = {},
  117. .max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >>
  118. HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT,
  119. },
  120. { /* REO_CMD */
  121. .start_ring_id = HAL_SRNG_REO_CMD,
  122. .max_rings = 1,
  123. .entry_size = (sizeof(struct tlv_32_hdr) +
  124. sizeof(struct reo_get_queue_stats)) >> 2,
  125. .lmac_ring = FALSE,
  126. .ring_dir = HAL_SRNG_SRC_RING,
  127. .reg_start = {
  128. HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR(
  129. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  130. HWIO_REO_R2_REO_CMD_RING_HP_ADDR(
  131. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  132. },
  133. /* Single ring - provide ring size if multiple rings of this
  134. * type are supported
  135. */
  136. .reg_size = {},
  137. .max_size = HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
  138. HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
  139. },
  140. { /* REO_STATUS */
  141. .start_ring_id = HAL_SRNG_REO_STATUS,
  142. .max_rings = 1,
  143. .entry_size = (sizeof(struct tlv_32_hdr) +
  144. sizeof(struct reo_get_queue_stats_status)) >> 2,
  145. .lmac_ring = FALSE,
  146. .ring_dir = HAL_SRNG_DST_RING,
  147. .reg_start = {
  148. HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR(
  149. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  150. HWIO_REO_R2_REO_STATUS_RING_HP_ADDR(
  151. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  152. },
  153. /* Single ring - provide ring size if multiple rings of this
  154. * type are supported
  155. */
  156. .reg_size = {},
  157. .max_size =
  158. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  159. HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  160. },
  161. { /* TCL_DATA */
  162. .start_ring_id = HAL_SRNG_SW2TCL1,
  163. .max_rings = 3,
  164. .entry_size = (sizeof(struct tlv_32_hdr) +
  165. sizeof(struct tcl_data_cmd)) >> 2,
  166. .lmac_ring = FALSE,
  167. .ring_dir = HAL_SRNG_SRC_RING,
  168. .reg_start = {
  169. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(
  170. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  171. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(
  172. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  173. },
  174. .reg_size = {
  175. HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) -
  176. HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0),
  177. HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) -
  178. HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0),
  179. },
  180. .max_size =
  181. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
  182. HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
  183. },
  184. { /* TCL_CMD */
  185. .start_ring_id = HAL_SRNG_SW2TCL_CMD,
  186. .max_rings = 1,
  187. .entry_size = (sizeof(struct tlv_32_hdr) +
  188. sizeof(struct tcl_gse_cmd)) >> 2,
  189. .lmac_ring = FALSE,
  190. .ring_dir = HAL_SRNG_SRC_RING,
  191. .reg_start = {
  192. HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_LSB_ADDR(
  193. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  194. HWIO_TCL_R2_SW2TCL_CMD_RING_HP_ADDR(
  195. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  196. },
  197. /* Single ring - provide ring size if multiple rings of this
  198. * type are supported
  199. */
  200. .reg_size = {},
  201. .max_size =
  202. HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
  203. HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
  204. },
  205. { /* TCL_STATUS */
  206. .start_ring_id = HAL_SRNG_TCL_STATUS,
  207. .max_rings = 1,
  208. .entry_size = (sizeof(struct tlv_32_hdr) +
  209. sizeof(struct tcl_status_ring)) >> 2,
  210. .lmac_ring = FALSE,
  211. .ring_dir = HAL_SRNG_DST_RING,
  212. .reg_start = {
  213. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR(
  214. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  215. HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR(
  216. SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET),
  217. },
  218. /* Single ring - provide ring size if multiple rings of this
  219. * type are supported
  220. */
  221. .reg_size = {},
  222. .max_size =
  223. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >>
  224. HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT,
  225. },
  226. { /* CE_SRC */
  227. .start_ring_id = HAL_SRNG_CE_0_SRC,
  228. .max_rings = 12,
  229. .entry_size = sizeof(struct ce_src_desc) >> 2,
  230. .lmac_ring = FALSE,
  231. .ring_dir = HAL_SRNG_SRC_RING,
  232. .reg_start = {
  233. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
  234. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
  235. HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
  236. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET),
  237. },
  238. .reg_size = {
  239. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
  240. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
  241. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET -
  242. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET,
  243. },
  244. .max_size =
  245. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
  246. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
  247. },
  248. { /* CE_DST */
  249. .start_ring_id = HAL_SRNG_CE_0_DST,
  250. .max_rings = 12,
  251. .entry_size = 8 >> 2,
  252. /*TODO: entry_size above should actually be
  253. * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition
  254. * of struct ce_dst_desc in HW header files
  255. */
  256. .lmac_ring = FALSE,
  257. .ring_dir = HAL_SRNG_SRC_RING,
  258. .reg_start = {
  259. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
  260. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  261. HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
  262. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  263. },
  264. .reg_size = {
  265. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  266. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  267. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  268. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  269. },
  270. .max_size =
  271. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
  272. HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
  273. },
  274. { /* CE_DST_STATUS */
  275. .start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
  276. .max_rings = 12,
  277. .entry_size = sizeof(struct ce_stat_desc) >> 2,
  278. .lmac_ring = FALSE,
  279. .ring_dir = HAL_SRNG_DST_RING,
  280. .reg_start = {
  281. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR(
  282. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  283. HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR(
  284. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET),
  285. },
  286. /* TODO: check destination status ring registers */
  287. .reg_size = {
  288. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  289. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  290. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET -
  291. SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET,
  292. },
  293. .max_size =
  294. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
  295. HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
  296. },
  297. { /* WBM_IDLE_LINK */
  298. .start_ring_id = HAL_SRNG_WBM_IDLE_LINK,
  299. .max_rings = 1,
  300. .entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2,
  301. .lmac_ring = FALSE,
  302. .ring_dir = HAL_SRNG_SRC_RING,
  303. .reg_start = {
  304. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  305. HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  306. },
  307. /* Single ring - provide ring size if multiple rings of this
  308. * type are supported
  309. */
  310. .reg_size = {},
  311. .max_size =
  312. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >>
  313. HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT,
  314. },
  315. { /* SW2WBM_RELEASE */
  316. .start_ring_id = HAL_SRNG_WBM_SW_RELEASE,
  317. .max_rings = 1,
  318. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  319. .lmac_ring = FALSE,
  320. .ring_dir = HAL_SRNG_SRC_RING,
  321. .reg_start = {
  322. HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  323. HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_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_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  331. HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  332. },
  333. { /* WBM2SW_RELEASE */
  334. .start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
  335. .max_rings = 4,
  336. .entry_size = sizeof(struct wbm_release_ring) >> 2,
  337. .lmac_ring = FALSE,
  338. .ring_dir = HAL_SRNG_DST_RING,
  339. .reg_start = {
  340. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  341. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  342. },
  343. .reg_size = {
  344. HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
  345. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  346. HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) -
  347. HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  348. },
  349. .max_size =
  350. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
  351. HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
  352. },
  353. { /* RXDMA_BUF */
  354. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
  355. #ifdef IPA_OFFLOAD
  356. .max_rings = 3,
  357. #else
  358. .max_rings = 2,
  359. #endif
  360. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  361. .lmac_ring = TRUE,
  362. .ring_dir = HAL_SRNG_SRC_RING,
  363. /* reg_start is not set because LMAC rings are not accessed
  364. * from host
  365. */
  366. .reg_start = {},
  367. .reg_size = {},
  368. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  369. },
  370. { /* RXDMA_DST */
  371. .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0,
  372. .max_rings = 1,
  373. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  374. .lmac_ring = TRUE,
  375. .ring_dir = HAL_SRNG_DST_RING,
  376. /* reg_start is not set because LMAC rings are not accessed
  377. * from host
  378. */
  379. .reg_start = {},
  380. .reg_size = {},
  381. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  382. },
  383. { /* RXDMA_MONITOR_BUF */
  384. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
  385. .max_rings = 1,
  386. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  387. .lmac_ring = TRUE,
  388. .ring_dir = HAL_SRNG_SRC_RING,
  389. /* reg_start is not set because LMAC rings are not accessed
  390. * from host
  391. */
  392. .reg_start = {},
  393. .reg_size = {},
  394. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  395. },
  396. { /* RXDMA_MONITOR_STATUS */
  397. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF,
  398. .max_rings = 1,
  399. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  400. .lmac_ring = TRUE,
  401. .ring_dir = HAL_SRNG_SRC_RING,
  402. /* reg_start is not set because LMAC rings are not accessed
  403. * from host
  404. */
  405. .reg_start = {},
  406. .reg_size = {},
  407. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  408. },
  409. { /* RXDMA_MONITOR_DST */
  410. .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW1,
  411. .max_rings = 1,
  412. .entry_size = sizeof(struct reo_entrance_ring) >> 2,
  413. .lmac_ring = TRUE,
  414. .ring_dir = HAL_SRNG_DST_RING,
  415. /* reg_start is not set because LMAC rings are not accessed
  416. * from host
  417. */
  418. .reg_start = {},
  419. .reg_size = {},
  420. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  421. },
  422. { /* RXDMA_MONITOR_DESC */
  423. .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC,
  424. .max_rings = 1,
  425. .entry_size = sizeof(struct wbm_buffer_ring) >> 2,
  426. .lmac_ring = TRUE,
  427. .ring_dir = HAL_SRNG_SRC_RING,
  428. /* reg_start is not set because LMAC rings are not accessed
  429. * from host
  430. */
  431. .reg_start = {},
  432. .reg_size = {},
  433. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  434. },
  435. { /* DIR_BUF_RX_DMA_SRC */
  436. .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING,
  437. .max_rings = 1,
  438. .entry_size = 2,
  439. .lmac_ring = TRUE,
  440. .ring_dir = HAL_SRNG_SRC_RING,
  441. /* reg_start is not set because LMAC rings are not accessed
  442. * from host
  443. */
  444. .reg_start = {},
  445. .reg_size = {},
  446. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  447. },
  448. #ifdef WLAN_FEATURE_CIF_CFR
  449. { /* WIFI_POS_SRC */
  450. .start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING,
  451. .max_rings = 1,
  452. .entry_size = sizeof(wmi_oem_dma_buf_release_entry) >> 2,
  453. .lmac_ring = TRUE,
  454. .ring_dir = HAL_SRNG_SRC_RING,
  455. /* reg_start is not set because LMAC rings are not accessed
  456. * from host
  457. */
  458. .reg_start = {},
  459. .reg_size = {},
  460. .max_size = HAL_RXDMA_MAX_RING_SIZE,
  461. },
  462. #endif
  463. };
  464. int32_t hal_hw_reg_offset_qca8074[] = {
  465. /* dst */
  466. REG_OFFSET(DST, HP),
  467. REG_OFFSET(DST, TP),
  468. REG_OFFSET(DST, ID),
  469. REG_OFFSET(DST, MISC),
  470. REG_OFFSET(DST, HP_ADDR_LSB),
  471. REG_OFFSET(DST, HP_ADDR_MSB),
  472. REG_OFFSET(DST, MSI1_BASE_LSB),
  473. REG_OFFSET(DST, MSI1_BASE_MSB),
  474. REG_OFFSET(DST, MSI1_DATA),
  475. REG_OFFSET(DST, BASE_LSB),
  476. REG_OFFSET(DST, BASE_MSB),
  477. REG_OFFSET(DST, PRODUCER_INT_SETUP),
  478. /* src */
  479. REG_OFFSET(SRC, HP),
  480. REG_OFFSET(SRC, TP),
  481. REG_OFFSET(SRC, ID),
  482. REG_OFFSET(SRC, MISC),
  483. REG_OFFSET(SRC, TP_ADDR_LSB),
  484. REG_OFFSET(SRC, TP_ADDR_MSB),
  485. REG_OFFSET(SRC, MSI1_BASE_LSB),
  486. REG_OFFSET(SRC, MSI1_BASE_MSB),
  487. REG_OFFSET(SRC, MSI1_DATA),
  488. REG_OFFSET(SRC, BASE_LSB),
  489. REG_OFFSET(SRC, BASE_MSB),
  490. REG_OFFSET(SRC, CONSUMER_INT_SETUP_IX0),
  491. REG_OFFSET(SRC, CONSUMER_INT_SETUP_IX1),
  492. };
  493. void hal_qca8074_attach(struct hal_soc *hal_soc)
  494. {
  495. hal_soc->hw_srng_table = hw_srng_table_8074;
  496. hal_soc->hal_hw_reg_offset = hal_hw_reg_offset_qca8074;
  497. hal_soc->ops = &qca8074_hal_hw_txrx_ops;
  498. }