hal_be_generic_api.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051
  1. /*
  2. * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for
  6. * any purpose with or without fee is hereby granted, provided that the
  7. * above copyright notice and this permission notice appear in all
  8. * copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  11. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  12. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  13. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  14. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  15. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  16. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  17. * PERFORMANCE OF THIS SOFTWARE.
  18. */
  19. #include <qdf_module.h>
  20. #include "hal_be_api.h"
  21. #include "hal_be_hw_headers.h"
  22. #include "hal_be_reo.h"
  23. #include "hal_tx.h" //HAL_SET_FLD
  24. #include "hal_be_rx.h" //HAL_RX_BUF_RBM_GET
  25. /*
  26. * The 4 bits REO destination ring value is defined as: 0: TCL
  27. * 1:SW1 2:SW2 3:SW3 4:SW4 5:Release 6:FW(WIFI) 7:SW5
  28. * 8:SW6 9:SW7 10:SW8 11: NOT_USED.
  29. *
  30. */
  31. uint32_t reo_dest_ring_remap[] = {REO_REMAP_SW1, REO_REMAP_SW2,
  32. REO_REMAP_SW3, REO_REMAP_SW4,
  33. REO_REMAP_SW5, REO_REMAP_SW6,
  34. REO_REMAP_SW7, REO_REMAP_SW8};
  35. #if defined(QDF_BIG_ENDIAN_MACHINE)
  36. void hal_setup_reo_swap(struct hal_soc *soc)
  37. {
  38. uint32_t reg_val;
  39. reg_val = HAL_REG_READ(soc, HWIO_REO_R0_CACHE_CTL_CONFIG_ADDR(
  40. REO_REG_REG_BASE));
  41. reg_val |= HAL_SM(HWIO_REO_R0_CACHE_CTL_CONFIG, WRITE_STRUCT_SWAP, 1);
  42. reg_val |= HAL_SM(HWIO_REO_R0_CACHE_CTL_CONFIG, READ_STRUCT_SWAP, 1);
  43. HAL_REG_WRITE(soc, HWIO_REO_R0_CACHE_CTL_CONFIG_ADDR(
  44. REO_REG_REG_BASE), reg_val);
  45. }
  46. #else
  47. void hal_setup_reo_swap(struct hal_soc *soc)
  48. {
  49. }
  50. #endif
  51. /**
  52. * hal_tx_init_data_ring_be() - Initialize all the TCL Descriptors in SRNG
  53. * @hal_soc_hdl: Handle to HAL SoC structure
  54. * @hal_srng: Handle to HAL SRNG structure
  55. *
  56. * Return: none
  57. */
  58. static void
  59. hal_tx_init_data_ring_be(hal_soc_handle_t hal_soc_hdl,
  60. hal_ring_handle_t hal_ring_hdl)
  61. {
  62. }
  63. void hal_reo_setup_generic_be(struct hal_soc *soc, void *reoparams)
  64. {
  65. uint32_t reg_val;
  66. struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams;
  67. reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR(
  68. REO_REG_REG_BASE));
  69. hal_reo_config(soc, reg_val, reo_params);
  70. /* Other ring enable bits and REO_ENABLE will be set by FW */
  71. /* TODO: Setup destination ring mapping if enabled */
  72. /* TODO: Error destination ring setting is left to default.
  73. * Default setting is to send all errors to release ring.
  74. */
  75. /* Set the reo descriptor swap bits in case of BIG endian platform */
  76. hal_setup_reo_swap(soc);
  77. HAL_REG_WRITE(soc,
  78. HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(REO_REG_REG_BASE),
  79. HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000);
  80. HAL_REG_WRITE(soc,
  81. HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(REO_REG_REG_BASE),
  82. (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
  83. HAL_REG_WRITE(soc,
  84. HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(REO_REG_REG_BASE),
  85. (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
  86. HAL_REG_WRITE(soc,
  87. HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(REO_REG_REG_BASE),
  88. (HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000));
  89. /*
  90. * When hash based routing is enabled, routing of the rx packet
  91. * is done based on the following value: 1 _ _ _ _ The last 4
  92. * bits are based on hash[3:0]. This means the possible values
  93. * are 0x10 to 0x1f. This value is used to look-up the
  94. * ring ID configured in Destination_Ring_Ctrl_IX_* register.
  95. * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3
  96. * registers need to be configured to set-up the 16 entries to
  97. * map the hash values to a ring number. There are 3 bits per
  98. * hash entry – which are mapped as follows:
  99. * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI),
  100. * 7: NOT_USED.
  101. */
  102. if (reo_params->rx_hash_enabled) {
  103. HAL_REG_WRITE(soc,
  104. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
  105. REO_REG_REG_BASE),
  106. reo_params->remap1);
  107. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x",
  108. HAL_REG_READ(soc,
  109. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
  110. REO_REG_REG_BASE)));
  111. HAL_REG_WRITE(soc,
  112. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
  113. REO_REG_REG_BASE),
  114. reo_params->remap2);
  115. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x",
  116. HAL_REG_READ(soc,
  117. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
  118. REO_REG_REG_BASE)));
  119. }
  120. /* TODO: Check if the following registers shoould be setup by host:
  121. * AGING_CONTROL
  122. * HIGH_MEMORY_THRESHOLD
  123. * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2]
  124. * GLOBAL_LINK_DESC_COUNT_CTRL
  125. */
  126. }
  127. void hal_set_link_desc_addr_be(void *desc, uint32_t cookie,
  128. qdf_dma_addr_t link_desc_paddr,
  129. uint8_t bm_id)
  130. {
  131. uint32_t *buf_addr = (uint32_t *)desc;
  132. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO, BUFFER_ADDR_31_0,
  133. link_desc_paddr & 0xffffffff);
  134. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO, BUFFER_ADDR_39_32,
  135. (uint64_t)link_desc_paddr >> 32);
  136. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO, RETURN_BUFFER_MANAGER,
  137. bm_id);
  138. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO, SW_BUFFER_COOKIE,
  139. cookie);
  140. }
  141. static uint32_t hal_get_reo_qdesc_size_be(uint32_t ba_window_size, int tid)
  142. {
  143. /* Return descriptor size corresponding to window size of 2 since
  144. * we set ba_window_size to 2 while setting up REO descriptors as
  145. * a WAR to get 2k jump exception aggregates are received without
  146. * a BA session.
  147. */
  148. if (ba_window_size <= 1) {
  149. if (tid != HAL_NON_QOS_TID)
  150. return sizeof(struct rx_reo_queue) +
  151. sizeof(struct rx_reo_queue_ext);
  152. else
  153. return sizeof(struct rx_reo_queue);
  154. }
  155. if (ba_window_size <= 105)
  156. return sizeof(struct rx_reo_queue) +
  157. sizeof(struct rx_reo_queue_ext);
  158. if (ba_window_size <= 210)
  159. return sizeof(struct rx_reo_queue) +
  160. (2 * sizeof(struct rx_reo_queue_ext));
  161. return sizeof(struct rx_reo_queue) +
  162. (3 * sizeof(struct rx_reo_queue_ext));
  163. }
  164. void *hal_rx_msdu_ext_desc_info_get_ptr_be(void *msdu_details_ptr)
  165. {
  166. return HAL_RX_MSDU_EXT_DESC_INFO_GET(msdu_details_ptr);
  167. }
  168. #if defined(QCA_WIFI_KIWI) && !defined(QCA_WIFI_KIWI_V2)
  169. static inline uint32_t
  170. hal_wbm2sw_release_source_get(void *hal_desc, enum hal_be_wbm_release_dir dir)
  171. {
  172. uint32_t buf_src;
  173. buf_src = HAL_WBM2SW_RELEASE_SRC_GET(hal_desc);
  174. switch (buf_src) {
  175. case HAL_BE_RX_WBM_ERR_SRC_RXDMA:
  176. return HAL_RX_WBM_ERR_SRC_RXDMA;
  177. case HAL_BE_RX_WBM_ERR_SRC_REO:
  178. return HAL_RX_WBM_ERR_SRC_REO;
  179. case HAL_BE_RX_WBM_ERR_SRC_FW_RX:
  180. if (dir != HAL_BE_WBM_RELEASE_DIR_RX)
  181. qdf_assert_always(0);
  182. return HAL_RX_WBM_ERR_SRC_FW;
  183. case HAL_BE_RX_WBM_ERR_SRC_SW_RX:
  184. if (dir != HAL_BE_WBM_RELEASE_DIR_RX)
  185. qdf_assert_always(0);
  186. return HAL_RX_WBM_ERR_SRC_SW;
  187. case HAL_BE_RX_WBM_ERR_SRC_TQM:
  188. return HAL_RX_WBM_ERR_SRC_TQM;
  189. case HAL_BE_RX_WBM_ERR_SRC_FW_TX:
  190. if (dir != HAL_BE_WBM_RELEASE_DIR_TX)
  191. qdf_assert_always(0);
  192. return HAL_RX_WBM_ERR_SRC_FW;
  193. case HAL_BE_RX_WBM_ERR_SRC_SW_TX:
  194. if (dir != HAL_BE_WBM_RELEASE_DIR_TX)
  195. qdf_assert_always(0);
  196. return HAL_RX_WBM_ERR_SRC_SW;
  197. default:
  198. qdf_assert_always(0);
  199. }
  200. return buf_src;
  201. }
  202. #else
  203. static inline uint32_t
  204. hal_wbm2sw_release_source_get(void *hal_desc, enum hal_be_wbm_release_dir dir)
  205. {
  206. return HAL_WBM2SW_RELEASE_SRC_GET(hal_desc);
  207. }
  208. #endif
  209. uint32_t hal_tx_comp_get_buffer_source_generic_be(void *hal_desc)
  210. {
  211. return hal_wbm2sw_release_source_get(hal_desc,
  212. HAL_BE_WBM_RELEASE_DIR_TX);
  213. }
  214. /**
  215. * hal_tx_comp_get_release_reason_generic_be() - TQM Release reason
  216. * @hal_desc: completion ring descriptor pointer
  217. *
  218. * This function will return the type of pointer - buffer or descriptor
  219. *
  220. * Return: buffer type
  221. */
  222. static uint8_t hal_tx_comp_get_release_reason_generic_be(void *hal_desc)
  223. {
  224. uint32_t comp_desc = *(uint32_t *)(((uint8_t *)hal_desc) +
  225. WBM2SW_COMPLETION_RING_TX_TQM_RELEASE_REASON_OFFSET);
  226. return (comp_desc &
  227. WBM2SW_COMPLETION_RING_TX_TQM_RELEASE_REASON_MASK) >>
  228. WBM2SW_COMPLETION_RING_TX_TQM_RELEASE_REASON_LSB;
  229. }
  230. /**
  231. * hal_get_wbm_internal_error_generic_be() - is WBM internal error
  232. * @hal_desc: completion ring descriptor pointer
  233. *
  234. * This function will return 0 or 1 - is it WBM internal error or not
  235. *
  236. * Return: uint8_t
  237. */
  238. static uint8_t hal_get_wbm_internal_error_generic_be(void *hal_desc)
  239. {
  240. /*
  241. * TODO - This func is called by tx comp and wbm error handler
  242. * Check if one needs to use WBM2SW-TX and other WBM2SW-RX
  243. */
  244. uint32_t comp_desc =
  245. *(uint32_t *)(((uint8_t *)hal_desc) +
  246. HAL_WBM_INTERNAL_ERROR_OFFSET);
  247. return (comp_desc & HAL_WBM_INTERNAL_ERROR_MASK) >>
  248. HAL_WBM_INTERNAL_ERROR_LSB;
  249. }
  250. /**
  251. * hal_setup_link_idle_list_generic_be - Setup scattered idle list using the
  252. * buffer list provided
  253. *
  254. * @hal_soc: Opaque HAL SOC handle
  255. * @scatter_bufs_base_paddr: Array of physical base addresses
  256. * @scatter_bufs_base_vaddr: Array of virtual base addresses
  257. * @num_scatter_bufs: Number of scatter buffers in the above lists
  258. * @scatter_buf_size: Size of each scatter buffer
  259. * @last_buf_end_offset: Offset to the last entry
  260. * @num_entries: Total entries of all scatter bufs
  261. *
  262. * Return: None
  263. */
  264. static void
  265. hal_setup_link_idle_list_generic_be(struct hal_soc *soc,
  266. qdf_dma_addr_t scatter_bufs_base_paddr[],
  267. void *scatter_bufs_base_vaddr[],
  268. uint32_t num_scatter_bufs,
  269. uint32_t scatter_buf_size,
  270. uint32_t last_buf_end_offset,
  271. uint32_t num_entries)
  272. {
  273. int i;
  274. uint32_t *prev_buf_link_ptr = NULL;
  275. uint32_t reg_scatter_buf_size, reg_tot_scatter_buf_size;
  276. uint32_t val;
  277. /* Link the scatter buffers */
  278. for (i = 0; i < num_scatter_bufs; i++) {
  279. if (i > 0) {
  280. prev_buf_link_ptr[0] =
  281. scatter_bufs_base_paddr[i] & 0xffffffff;
  282. prev_buf_link_ptr[1] = HAL_SM(
  283. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  284. BASE_ADDRESS_39_32,
  285. ((uint64_t)(scatter_bufs_base_paddr[i])
  286. >> 32)) | HAL_SM(
  287. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  288. ADDRESS_MATCH_TAG,
  289. ADDRESS_MATCH_TAG_VAL);
  290. }
  291. prev_buf_link_ptr = (uint32_t *)(scatter_bufs_base_vaddr[i] +
  292. scatter_buf_size - WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE);
  293. }
  294. /* TBD: Register programming partly based on MLD & the rest based on
  295. * inputs from HW team. Not complete yet.
  296. */
  297. reg_scatter_buf_size = (scatter_buf_size -
  298. WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) / 64;
  299. reg_tot_scatter_buf_size = ((scatter_buf_size -
  300. WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) * num_scatter_bufs) / 64;
  301. HAL_REG_WRITE(soc,
  302. HWIO_WBM_R0_IDLE_LIST_CONTROL_ADDR(
  303. WBM_REG_REG_BASE),
  304. HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, SCATTER_BUFFER_SIZE,
  305. reg_scatter_buf_size) |
  306. HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, LINK_DESC_IDLE_LIST_MODE,
  307. 0x1));
  308. HAL_REG_WRITE(soc,
  309. HWIO_WBM_R0_IDLE_LIST_SIZE_ADDR(
  310. WBM_REG_REG_BASE),
  311. HAL_SM(HWIO_WBM_R0_IDLE_LIST_SIZE,
  312. SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST,
  313. reg_tot_scatter_buf_size));
  314. HAL_REG_WRITE(soc,
  315. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_LSB_ADDR(
  316. WBM_REG_REG_BASE),
  317. scatter_bufs_base_paddr[0] & 0xffffffff);
  318. HAL_REG_WRITE(soc,
  319. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
  320. WBM_REG_REG_BASE),
  321. ((uint64_t)(scatter_bufs_base_paddr[0]) >> 32) &
  322. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_BASE_ADDRESS_39_32_BMSK);
  323. HAL_REG_WRITE(soc,
  324. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
  325. WBM_REG_REG_BASE),
  326. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  327. BASE_ADDRESS_39_32, ((uint64_t)(scatter_bufs_base_paddr[0])
  328. >> 32)) |
  329. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  330. ADDRESS_MATCH_TAG, ADDRESS_MATCH_TAG_VAL));
  331. /* ADDRESS_MATCH_TAG field in the above register is expected to match
  332. * with the upper bits of link pointer. The above write sets this field
  333. * to zero and we are also setting the upper bits of link pointers to
  334. * zero while setting up the link list of scatter buffers above
  335. */
  336. /* Setup head and tail pointers for the idle list */
  337. HAL_REG_WRITE(soc,
  338. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
  339. WBM_REG_REG_BASE),
  340. scatter_bufs_base_paddr[num_scatter_bufs - 1] & 0xffffffff);
  341. HAL_REG_WRITE(soc,
  342. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1_ADDR(
  343. WBM_REG_REG_BASE),
  344. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
  345. BUFFER_ADDRESS_39_32,
  346. ((uint64_t)(scatter_bufs_base_paddr[num_scatter_bufs - 1])
  347. >> 32)) |
  348. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
  349. HEAD_POINTER_OFFSET, last_buf_end_offset >> 2));
  350. HAL_REG_WRITE(soc,
  351. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
  352. WBM_REG_REG_BASE),
  353. scatter_bufs_base_paddr[0] & 0xffffffff);
  354. HAL_REG_WRITE(soc,
  355. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX0_ADDR(
  356. WBM_REG_REG_BASE),
  357. scatter_bufs_base_paddr[0] & 0xffffffff);
  358. HAL_REG_WRITE(soc,
  359. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1_ADDR(
  360. WBM_REG_REG_BASE),
  361. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
  362. BUFFER_ADDRESS_39_32,
  363. ((uint64_t)(scatter_bufs_base_paddr[0]) >>
  364. 32)) | HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
  365. TAIL_POINTER_OFFSET, 0));
  366. HAL_REG_WRITE(soc,
  367. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HP_ADDR(
  368. WBM_REG_REG_BASE),
  369. 2 * num_entries);
  370. /* Set RING_ID_DISABLE */
  371. val = HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, RING_ID_DISABLE, 1);
  372. /*
  373. * SRNG_ENABLE bit is not available in HWK v1 (QCA8074v1). Hence
  374. * check the presence of the bit before toggling it.
  375. */
  376. #ifdef HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE_BMSK
  377. val |= HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, SRNG_ENABLE, 1);
  378. #endif
  379. HAL_REG_WRITE(soc,
  380. HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_ADDR(WBM_REG_REG_BASE),
  381. val);
  382. }
  383. /**
  384. * hal_rx_wbm_err_src_get_be() - Get WBM error source from descriptor
  385. * @ring_desc: ring descriptor
  386. *
  387. * Return: wbm error source
  388. */
  389. static uint32_t hal_rx_wbm_err_src_get_be(hal_ring_desc_t ring_desc)
  390. {
  391. return hal_wbm2sw_release_source_get(ring_desc,
  392. HAL_BE_WBM_RELEASE_DIR_RX);
  393. }
  394. /**
  395. * hal_rx_ret_buf_manager_get_be() - Get return buffer manager from ring desc
  396. * @ring_desc: ring descriptor
  397. *
  398. * Return: rbm
  399. */
  400. uint8_t hal_rx_ret_buf_manager_get_be(hal_ring_desc_t ring_desc)
  401. {
  402. /*
  403. * The following macro takes buf_addr_info as argument,
  404. * but since buf_addr_info is the first field in ring_desc
  405. * Hence the following call is OK
  406. */
  407. return HAL_RX_BUF_RBM_GET(ring_desc);
  408. }
  409. #define HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc) (((*(((uint32_t *)wbm_desc) + \
  410. (WBM2SW_COMPLETION_RING_RX_REO_PUSH_REASON_OFFSET >> 2))) & \
  411. WBM2SW_COMPLETION_RING_RX_REO_PUSH_REASON_MASK) >> \
  412. WBM2SW_COMPLETION_RING_RX_REO_PUSH_REASON_LSB)
  413. #define HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc) (((*(((uint32_t *)wbm_desc) + \
  414. (WBM2SW_COMPLETION_RING_RX_REO_ERROR_CODE_OFFSET >> 2))) & \
  415. WBM2SW_COMPLETION_RING_RX_REO_ERROR_CODE_MASK) >> \
  416. WBM2SW_COMPLETION_RING_RX_REO_ERROR_CODE_LSB)
  417. #define HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc) \
  418. (((*(((uint32_t *)wbm_desc) + \
  419. (WBM2SW_COMPLETION_RING_RX_RXDMA_PUSH_REASON_OFFSET >> 2))) & \
  420. WBM2SW_COMPLETION_RING_RX_RXDMA_PUSH_REASON_MASK) >> \
  421. WBM2SW_COMPLETION_RING_RX_RXDMA_PUSH_REASON_LSB)
  422. #define HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc) \
  423. (((*(((uint32_t *)wbm_desc) + \
  424. (WBM2SW_COMPLETION_RING_RX_RXDMA_ERROR_CODE_OFFSET >> 2))) & \
  425. WBM2SW_COMPLETION_RING_RX_RXDMA_ERROR_CODE_MASK) >> \
  426. WBM2SW_COMPLETION_RING_RX_RXDMA_ERROR_CODE_LSB)
  427. /**
  428. * hal_rx_wbm_err_info_get_generic_be(): Retrieves WBM error code and reason and
  429. * save it to hal_wbm_err_desc_info structure passed by caller
  430. * @wbm_desc: wbm ring descriptor
  431. * @wbm_er_info1: hal_wbm_err_desc_info structure, output parameter.
  432. * Return: void
  433. */
  434. void hal_rx_wbm_err_info_get_generic_be(void *wbm_desc, void *wbm_er_info1)
  435. {
  436. struct hal_wbm_err_desc_info *wbm_er_info =
  437. (struct hal_wbm_err_desc_info *)wbm_er_info1;
  438. wbm_er_info->wbm_err_src = hal_rx_wbm_err_src_get_be(wbm_desc);
  439. wbm_er_info->reo_psh_rsn = HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc);
  440. wbm_er_info->reo_err_code = HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc);
  441. wbm_er_info->rxdma_psh_rsn = HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc);
  442. wbm_er_info->rxdma_err_code = HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc);
  443. }
  444. static void hal_rx_reo_buf_paddr_get_be(hal_ring_desc_t rx_desc,
  445. struct hal_buf_info *buf_info)
  446. {
  447. struct reo_destination_ring *reo_ring =
  448. (struct reo_destination_ring *)rx_desc;
  449. buf_info->paddr =
  450. (HAL_RX_REO_BUFFER_ADDR_31_0_GET(reo_ring) |
  451. ((uint64_t)(HAL_RX_REO_BUFFER_ADDR_39_32_GET(reo_ring)) << 32));
  452. buf_info->sw_cookie = HAL_RX_REO_BUF_COOKIE_GET(reo_ring);
  453. }
  454. static void hal_rx_msdu_link_desc_set_be(hal_soc_handle_t hal_soc_hdl,
  455. void *src_srng_desc,
  456. hal_buff_addrinfo_t buf_addr_info,
  457. uint8_t bm_action)
  458. {
  459. /*
  460. * The offsets for fields used in this function are same in
  461. * wbm_release_ring for Lithium and wbm_release_ring_tx
  462. * for Beryllium. hence we can use wbm_release_ring directly.
  463. */
  464. struct wbm_release_ring *wbm_rel_srng =
  465. (struct wbm_release_ring *)src_srng_desc;
  466. uint32_t addr_31_0;
  467. uint8_t addr_39_32;
  468. /* Structure copy !!! */
  469. wbm_rel_srng->released_buff_or_desc_addr_info =
  470. *((struct buffer_addr_info *)buf_addr_info);
  471. addr_31_0 =
  472. wbm_rel_srng->released_buff_or_desc_addr_info.buffer_addr_31_0;
  473. addr_39_32 =
  474. wbm_rel_srng->released_buff_or_desc_addr_info.buffer_addr_39_32;
  475. HAL_DESC_SET_FIELD(src_srng_desc, HAL_SW2WBM_RELEASE_RING,
  476. RELEASE_SOURCE_MODULE, HAL_RX_WBM_ERR_SRC_SW);
  477. HAL_DESC_SET_FIELD(src_srng_desc, HAL_SW2WBM_RELEASE_RING, BM_ACTION,
  478. bm_action);
  479. HAL_DESC_SET_FIELD(src_srng_desc, HAL_SW2WBM_RELEASE_RING,
  480. BUFFER_OR_DESC_TYPE,
  481. HAL_RX_WBM_BUF_TYPE_MSDU_LINK_DESC);
  482. /* WBM error is indicated when any of the link descriptors given to
  483. * WBM has a NULL address, and one those paths is the link descriptors
  484. * released from host after processing RXDMA errors,
  485. * or from Rx defrag path, and we want to add an assert here to ensure
  486. * host is not releasing descriptors with NULL address.
  487. */
  488. if (qdf_unlikely(!addr_31_0 && !addr_39_32)) {
  489. hal_dump_wbm_rel_desc(src_srng_desc);
  490. qdf_assert_always(0);
  491. }
  492. }
  493. /**
  494. * hal_rx_reo_ent_buf_paddr_get_be: Gets the physical address and
  495. * cookie from the REO entrance ring element
  496. *
  497. * @ hal_rx_desc_cookie: Opaque cookie pointer used by HAL to get to
  498. * the current descriptor
  499. * @ buf_info: structure to return the buffer information
  500. * @ msdu_cnt: pointer to msdu count in MPDU
  501. * Return: void
  502. */
  503. static
  504. void hal_rx_buf_cookie_rbm_get_be(uint32_t *buf_addr_info_hdl,
  505. hal_buf_info_t buf_info_hdl)
  506. {
  507. struct hal_buf_info *buf_info =
  508. (struct hal_buf_info *)buf_info_hdl;
  509. struct buffer_addr_info *buf_addr_info =
  510. (struct buffer_addr_info *)buf_addr_info_hdl;
  511. buf_info->sw_cookie = HAL_RX_BUF_COOKIE_GET(buf_addr_info);
  512. /*
  513. * buffer addr info is the first member of ring desc, so the typecast
  514. * can be done.
  515. */
  516. buf_info->rbm = hal_rx_ret_buf_manager_get_be(
  517. (hal_ring_desc_t)buf_addr_info);
  518. }
  519. /*
  520. * hal_rxdma_buff_addr_info_set_be() - set the buffer_addr_info of the
  521. * rxdma ring entry.
  522. * @rxdma_entry: descriptor entry
  523. * @paddr: physical address of nbuf data pointer.
  524. * @cookie: SW cookie used as a index to SW rx desc.
  525. * @manager: who owns the nbuf (host, NSS, etc...).
  526. *
  527. */
  528. static inline void
  529. hal_rxdma_buff_addr_info_set_be(void *rxdma_entry,
  530. qdf_dma_addr_t paddr, uint32_t cookie,
  531. uint8_t manager)
  532. {
  533. uint32_t paddr_lo = ((u64)paddr & 0x00000000ffffffff);
  534. uint32_t paddr_hi = ((u64)paddr & 0xffffffff00000000) >> 32;
  535. HAL_RXDMA_PADDR_LO_SET(rxdma_entry, paddr_lo);
  536. HAL_RXDMA_PADDR_HI_SET(rxdma_entry, paddr_hi);
  537. HAL_RXDMA_COOKIE_SET(rxdma_entry, cookie);
  538. HAL_RXDMA_MANAGER_SET(rxdma_entry, manager);
  539. }
  540. /**
  541. * hal_rx_get_reo_error_code_be() - Get REO error code from ring desc
  542. * @rx_desc: rx descriptor
  543. *
  544. * Return: REO error code
  545. */
  546. static uint32_t hal_rx_get_reo_error_code_be(hal_ring_desc_t rx_desc)
  547. {
  548. struct reo_destination_ring *reo_desc =
  549. (struct reo_destination_ring *)rx_desc;
  550. return HAL_RX_REO_ERROR_GET(reo_desc);
  551. }
  552. /**
  553. * hal_gen_reo_remap_val_generic_be() - Generate the reo map value
  554. * @ix0_map: mapping values for reo
  555. *
  556. * Return: IX0 reo remap register value to be written
  557. */
  558. static uint32_t
  559. hal_gen_reo_remap_val_generic_be(enum hal_reo_remap_reg remap_reg,
  560. uint8_t *ix0_map)
  561. {
  562. uint32_t ix_val = 0;
  563. switch (remap_reg) {
  564. case HAL_REO_REMAP_REG_IX0:
  565. ix_val = HAL_REO_REMAP_IX0(ix0_map[0], 0) |
  566. HAL_REO_REMAP_IX0(ix0_map[1], 1) |
  567. HAL_REO_REMAP_IX0(ix0_map[2], 2) |
  568. HAL_REO_REMAP_IX0(ix0_map[3], 3) |
  569. HAL_REO_REMAP_IX0(ix0_map[4], 4) |
  570. HAL_REO_REMAP_IX0(ix0_map[5], 5) |
  571. HAL_REO_REMAP_IX0(ix0_map[6], 6) |
  572. HAL_REO_REMAP_IX0(ix0_map[7], 7);
  573. break;
  574. case HAL_REO_REMAP_REG_IX2:
  575. ix_val = HAL_REO_REMAP_IX2(ix0_map[0], 16) |
  576. HAL_REO_REMAP_IX2(ix0_map[1], 17) |
  577. HAL_REO_REMAP_IX2(ix0_map[2], 18) |
  578. HAL_REO_REMAP_IX2(ix0_map[3], 19) |
  579. HAL_REO_REMAP_IX2(ix0_map[4], 20) |
  580. HAL_REO_REMAP_IX2(ix0_map[5], 21) |
  581. HAL_REO_REMAP_IX2(ix0_map[6], 22) |
  582. HAL_REO_REMAP_IX2(ix0_map[7], 23);
  583. break;
  584. default:
  585. break;
  586. }
  587. return ix_val;
  588. }
  589. static uint8_t hal_rx_err_status_get_be(hal_ring_desc_t rx_desc)
  590. {
  591. return HAL_RX_ERROR_STATUS_GET(rx_desc);
  592. }
  593. static QDF_STATUS hal_reo_status_update_be(hal_soc_handle_t hal_soc_hdl,
  594. hal_ring_desc_t reo_desc,
  595. void *st_handle,
  596. uint32_t tlv, int *num_ref)
  597. {
  598. union hal_reo_status *reo_status_ref;
  599. reo_status_ref = (union hal_reo_status *)st_handle;
  600. switch (tlv) {
  601. case HAL_REO_QUEUE_STATS_STATUS_TLV:
  602. hal_reo_queue_stats_status_be(reo_desc,
  603. &reo_status_ref->queue_status,
  604. hal_soc_hdl);
  605. *num_ref = reo_status_ref->queue_status.header.cmd_num;
  606. break;
  607. case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
  608. hal_reo_flush_queue_status_be(reo_desc,
  609. &reo_status_ref->fl_queue_status,
  610. hal_soc_hdl);
  611. *num_ref = reo_status_ref->fl_queue_status.header.cmd_num;
  612. break;
  613. case HAL_REO_FLUSH_CACHE_STATUS_TLV:
  614. hal_reo_flush_cache_status_be(reo_desc,
  615. &reo_status_ref->fl_cache_status,
  616. hal_soc_hdl);
  617. *num_ref = reo_status_ref->fl_cache_status.header.cmd_num;
  618. break;
  619. case HAL_REO_UNBLK_CACHE_STATUS_TLV:
  620. hal_reo_unblock_cache_status_be
  621. (reo_desc, hal_soc_hdl,
  622. &reo_status_ref->unblk_cache_status);
  623. *num_ref = reo_status_ref->unblk_cache_status.header.cmd_num;
  624. break;
  625. case HAL_REO_TIMOUT_LIST_STATUS_TLV:
  626. hal_reo_flush_timeout_list_status_be(
  627. reo_desc,
  628. &reo_status_ref->fl_timeout_status,
  629. hal_soc_hdl);
  630. *num_ref = reo_status_ref->fl_timeout_status.header.cmd_num;
  631. break;
  632. case HAL_REO_DESC_THRES_STATUS_TLV:
  633. hal_reo_desc_thres_reached_status_be(
  634. reo_desc,
  635. &reo_status_ref->thres_status,
  636. hal_soc_hdl);
  637. *num_ref = reo_status_ref->thres_status.header.cmd_num;
  638. break;
  639. case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
  640. hal_reo_rx_update_queue_status_be(
  641. reo_desc,
  642. &reo_status_ref->rx_queue_status,
  643. hal_soc_hdl);
  644. *num_ref = reo_status_ref->rx_queue_status.header.cmd_num;
  645. break;
  646. default:
  647. QDF_TRACE(QDF_MODULE_ID_DP_REO, QDF_TRACE_LEVEL_WARN,
  648. "hal_soc %pK: no handler for TLV:%d",
  649. hal_soc_hdl, tlv);
  650. return QDF_STATUS_E_FAILURE;
  651. } /* switch */
  652. return QDF_STATUS_SUCCESS;
  653. }
  654. static uint8_t hal_rx_reo_buf_type_get_be(hal_ring_desc_t rx_desc)
  655. {
  656. return HAL_RX_REO_BUF_TYPE_GET(rx_desc);
  657. }
  658. #ifdef DP_HW_COOKIE_CONVERT_EXCEPTION
  659. #define HAL_WBM_MISC_CONTROL_SPARE_CONTROL_FIELD_BIT15 0x8000
  660. #endif
  661. void hal_cookie_conversion_reg_cfg_be(hal_soc_handle_t hal_soc_hdl,
  662. struct hal_hw_cc_config *cc_cfg)
  663. {
  664. uint32_t reg_addr, reg_val = 0;
  665. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  666. /* REO CFG */
  667. reg_addr = HWIO_REO_R0_SW_COOKIE_CFG0_ADDR(REO_REG_REG_BASE);
  668. reg_val = cc_cfg->lut_base_addr_31_0;
  669. HAL_REG_WRITE(soc, reg_addr, reg_val);
  670. reg_addr = HWIO_REO_R0_SW_COOKIE_CFG1_ADDR(REO_REG_REG_BASE);
  671. reg_val = 0;
  672. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  673. SW_COOKIE_CONVERT_GLOBAL_ENABLE,
  674. cc_cfg->cc_global_en);
  675. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  676. SW_COOKIE_CONVERT_ENABLE,
  677. cc_cfg->cc_global_en);
  678. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  679. PAGE_ALIGNMENT,
  680. cc_cfg->page_4k_align);
  681. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  682. COOKIE_OFFSET_MSB,
  683. cc_cfg->cookie_offset_msb);
  684. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  685. COOKIE_PAGE_MSB,
  686. cc_cfg->cookie_page_msb);
  687. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  688. CMEM_LUT_BASE_ADDR_39_32,
  689. cc_cfg->lut_base_addr_39_32);
  690. HAL_REG_WRITE(soc, reg_addr, reg_val);
  691. /* WBM CFG */
  692. reg_addr = HWIO_WBM_R0_SW_COOKIE_CFG0_ADDR(WBM_REG_REG_BASE);
  693. reg_val = cc_cfg->lut_base_addr_31_0;
  694. HAL_REG_WRITE(soc, reg_addr, reg_val);
  695. reg_addr = HWIO_WBM_R0_SW_COOKIE_CFG1_ADDR(WBM_REG_REG_BASE);
  696. reg_val = 0;
  697. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
  698. PAGE_ALIGNMENT,
  699. cc_cfg->page_4k_align);
  700. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
  701. COOKIE_OFFSET_MSB,
  702. cc_cfg->cookie_offset_msb);
  703. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
  704. COOKIE_PAGE_MSB,
  705. cc_cfg->cookie_page_msb);
  706. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
  707. CMEM_LUT_BASE_ADDR_39_32,
  708. cc_cfg->lut_base_addr_39_32);
  709. HAL_REG_WRITE(soc, reg_addr, reg_val);
  710. /*
  711. * WCSS_UMAC_WBM_R0_SW_COOKIE_CONVERT_CFG default value is 0x1FE,
  712. */
  713. reg_addr = HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG_ADDR(WBM_REG_REG_BASE);
  714. reg_val = 0;
  715. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  716. WBM_COOKIE_CONV_GLOBAL_ENABLE,
  717. cc_cfg->cc_global_en);
  718. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  719. WBM2SW6_COOKIE_CONVERSION_EN,
  720. cc_cfg->wbm2sw6_cc_en);
  721. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  722. WBM2SW5_COOKIE_CONVERSION_EN,
  723. cc_cfg->wbm2sw5_cc_en);
  724. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  725. WBM2SW4_COOKIE_CONVERSION_EN,
  726. cc_cfg->wbm2sw4_cc_en);
  727. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  728. WBM2SW3_COOKIE_CONVERSION_EN,
  729. cc_cfg->wbm2sw3_cc_en);
  730. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  731. WBM2SW2_COOKIE_CONVERSION_EN,
  732. cc_cfg->wbm2sw2_cc_en);
  733. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  734. WBM2SW1_COOKIE_CONVERSION_EN,
  735. cc_cfg->wbm2sw1_cc_en);
  736. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  737. WBM2SW0_COOKIE_CONVERSION_EN,
  738. cc_cfg->wbm2sw0_cc_en);
  739. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  740. WBM2FW_COOKIE_CONVERSION_EN,
  741. cc_cfg->wbm2fw_cc_en);
  742. HAL_REG_WRITE(soc, reg_addr, reg_val);
  743. #ifdef HWIO_WBM_R0_WBM_CFG_2_COOKIE_DEBUG_SEL_BMSK
  744. reg_addr = HWIO_WBM_R0_WBM_CFG_2_ADDR(WBM_REG_REG_BASE);
  745. reg_val = 0;
  746. reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
  747. COOKIE_DEBUG_SEL,
  748. cc_cfg->cc_global_en);
  749. reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
  750. COOKIE_CONV_INDICATION_EN,
  751. cc_cfg->cc_global_en);
  752. reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
  753. ERROR_PATH_COOKIE_CONV_EN,
  754. cc_cfg->error_path_cookie_conv_en);
  755. reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
  756. RELEASE_PATH_COOKIE_CONV_EN,
  757. cc_cfg->release_path_cookie_conv_en);
  758. HAL_REG_WRITE(soc, reg_addr, reg_val);
  759. #endif
  760. #ifdef DP_HW_COOKIE_CONVERT_EXCEPTION
  761. /*
  762. * To enable indication for HW cookie conversion done or not for
  763. * WBM, WCSS_UMAC_WBM_R0_MISC_CONTROL spare_control field 15th
  764. * bit spare_control[15] should be set.
  765. */
  766. reg_addr = HWIO_WBM_R0_MISC_CONTROL_ADDR(WBM_REG_REG_BASE);
  767. reg_val = HAL_REG_READ(soc, reg_addr);
  768. reg_val |= HAL_SM(HWIO_WCSS_UMAC_WBM_R0_MISC_CONTROL,
  769. SPARE_CONTROL,
  770. HAL_WBM_MISC_CONTROL_SPARE_CONTROL_FIELD_BIT15);
  771. HAL_REG_WRITE(soc, reg_addr, reg_val);
  772. #endif
  773. }
  774. qdf_export_symbol(hal_cookie_conversion_reg_cfg_be);
  775. static inline void
  776. hal_msdu_desc_info_set_be(hal_soc_handle_t hal_soc_hdl,
  777. void *msdu_desc, uint32_t dst_ind,
  778. uint32_t nbuf_len)
  779. {
  780. struct rx_msdu_desc_info *msdu_desc_info =
  781. (struct rx_msdu_desc_info *)msdu_desc;
  782. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  783. FIRST_MSDU_IN_MPDU_FLAG, 1);
  784. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  785. LAST_MSDU_IN_MPDU_FLAG, 1);
  786. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  787. MSDU_CONTINUATION, 0x0);
  788. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  789. MSDU_LENGTH, nbuf_len);
  790. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  791. SA_IS_VALID, 1);
  792. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  793. DA_IS_VALID, 1);
  794. }
  795. static inline void
  796. hal_mpdu_desc_info_set_be(hal_soc_handle_t hal_soc_hdl,
  797. void *mpdu_desc, uint32_t seq_no)
  798. {
  799. struct rx_mpdu_desc_info *mpdu_desc_info =
  800. (struct rx_mpdu_desc_info *)mpdu_desc;
  801. HAL_RX_MPDU_DESC_INFO_SET(mpdu_desc_info,
  802. MSDU_COUNT, 0x1);
  803. /* unset frag bit */
  804. HAL_RX_MPDU_DESC_INFO_SET(mpdu_desc_info,
  805. FRAGMENT_FLAG, 0x0);
  806. HAL_RX_MPDU_DESC_INFO_SET(mpdu_desc_info,
  807. RAW_MPDU, 0x0);
  808. }
  809. /**
  810. * hal_rx_msdu_reo_dst_ind_get: Gets the REO
  811. * destination ring ID from the msdu desc info
  812. *
  813. * @msdu_link_desc : Opaque cookie pointer used by HAL to get to
  814. * the current descriptor
  815. *
  816. * Return: dst_ind (REO destination ring ID)
  817. */
  818. static inline
  819. uint32_t hal_rx_msdu_reo_dst_ind_get_be(hal_soc_handle_t hal_soc_hdl,
  820. void *msdu_link_desc)
  821. {
  822. struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
  823. struct rx_msdu_details *msdu_details;
  824. struct rx_msdu_desc_info *msdu_desc_info;
  825. struct rx_msdu_link *msdu_link = (struct rx_msdu_link *)msdu_link_desc;
  826. uint32_t dst_ind;
  827. msdu_details = hal_rx_link_desc_msdu0_ptr(msdu_link, hal_soc);
  828. /* The first msdu in the link should exsist */
  829. msdu_desc_info = hal_rx_msdu_ext_desc_info_get_ptr(&msdu_details[0],
  830. hal_soc);
  831. dst_ind = HAL_RX_MSDU_REO_DST_IND_GET(msdu_desc_info);
  832. return dst_ind;
  833. }
  834. uint32_t
  835. hal_reo_ix_remap_value_get_be(hal_soc_handle_t hal_soc_hdl,
  836. uint8_t rx_ring_mask)
  837. {
  838. uint32_t num_rings = 0;
  839. uint32_t i = 0;
  840. uint32_t ring_remap_arr[HAL_MAX_REO2SW_RINGS] = {0};
  841. uint32_t reo_remap_val = 0;
  842. uint32_t ring_idx = 0;
  843. uint8_t ix_map[HAL_NUM_RX_RING_PER_IX_MAP] = {0};
  844. /* create reo ring remap array */
  845. while (i < HAL_MAX_REO2SW_RINGS) {
  846. if (rx_ring_mask & (1 << i)) {
  847. ring_remap_arr[num_rings] = reo_dest_ring_remap[i];
  848. num_rings++;
  849. }
  850. i++;
  851. }
  852. for (i = 0; i < HAL_NUM_RX_RING_PER_IX_MAP; i++) {
  853. if (rx_ring_mask) {
  854. ix_map[i] = ring_remap_arr[ring_idx];
  855. ring_idx = ((ring_idx + 1) % num_rings);
  856. } else {
  857. /* if ring mask is zero configure to release to WBM */
  858. ix_map[i] = REO_REMAP_RELEASE;
  859. }
  860. }
  861. reo_remap_val = HAL_REO_REMAP_IX0(ix_map[0], 0) |
  862. HAL_REO_REMAP_IX0(ix_map[1], 1) |
  863. HAL_REO_REMAP_IX0(ix_map[2], 2) |
  864. HAL_REO_REMAP_IX0(ix_map[3], 3) |
  865. HAL_REO_REMAP_IX0(ix_map[4], 4) |
  866. HAL_REO_REMAP_IX0(ix_map[5], 5) |
  867. HAL_REO_REMAP_IX0(ix_map[6], 6) |
  868. HAL_REO_REMAP_IX0(ix_map[7], 7);
  869. return reo_remap_val;
  870. }
  871. qdf_export_symbol(hal_reo_ix_remap_value_get_be);
  872. uint8_t hal_reo_ring_remap_value_get_be(uint8_t rx_ring_id)
  873. {
  874. if (rx_ring_id > HAL_MAX_REO2SW_RINGS)
  875. return REO_REMAP_RELEASE;
  876. return reo_dest_ring_remap[rx_ring_id];
  877. }
  878. qdf_export_symbol(hal_reo_ring_remap_value_get_be);
  879. uint8_t hal_get_idle_link_bm_id_be(uint8_t chip_id)
  880. {
  881. return (WBM_IDLE_DESC_LIST + chip_id);
  882. }
  883. /**
  884. * hal_hw_txrx_default_ops_attach_be() - Attach the default hal ops for
  885. * beryllium chipsets.
  886. * @hal_soc_hdl: HAL soc handle
  887. *
  888. * Return: None
  889. */
  890. void hal_hw_txrx_default_ops_attach_be(struct hal_soc *hal_soc)
  891. {
  892. hal_soc->ops->hal_get_reo_qdesc_size = hal_get_reo_qdesc_size_be;
  893. hal_soc->ops->hal_set_link_desc_addr = hal_set_link_desc_addr_be;
  894. hal_soc->ops->hal_tx_init_data_ring = hal_tx_init_data_ring_be;
  895. hal_soc->ops->hal_get_ba_aging_timeout = hal_get_ba_aging_timeout_be;
  896. hal_soc->ops->hal_set_ba_aging_timeout = hal_set_ba_aging_timeout_be;
  897. hal_soc->ops->hal_get_reo_reg_base_offset =
  898. hal_get_reo_reg_base_offset_be;
  899. hal_soc->ops->hal_setup_link_idle_list =
  900. hal_setup_link_idle_list_generic_be;
  901. hal_soc->ops->hal_reo_setup = hal_reo_setup_generic_be;
  902. hal_soc->ops->hal_rx_reo_buf_paddr_get = hal_rx_reo_buf_paddr_get_be;
  903. hal_soc->ops->hal_rx_msdu_link_desc_set = hal_rx_msdu_link_desc_set_be;
  904. hal_soc->ops->hal_rx_buf_cookie_rbm_get = hal_rx_buf_cookie_rbm_get_be;
  905. hal_soc->ops->hal_rx_ret_buf_manager_get =
  906. hal_rx_ret_buf_manager_get_be;
  907. hal_soc->ops->hal_rxdma_buff_addr_info_set =
  908. hal_rxdma_buff_addr_info_set_be;
  909. hal_soc->ops->hal_rx_msdu_flags_get = hal_rx_msdu_flags_get_be;
  910. hal_soc->ops->hal_rx_get_reo_error_code = hal_rx_get_reo_error_code_be;
  911. hal_soc->ops->hal_gen_reo_remap_val =
  912. hal_gen_reo_remap_val_generic_be;
  913. hal_soc->ops->hal_tx_comp_get_buffer_source =
  914. hal_tx_comp_get_buffer_source_generic_be;
  915. hal_soc->ops->hal_tx_comp_get_release_reason =
  916. hal_tx_comp_get_release_reason_generic_be;
  917. hal_soc->ops->hal_get_wbm_internal_error =
  918. hal_get_wbm_internal_error_generic_be;
  919. hal_soc->ops->hal_rx_mpdu_desc_info_get =
  920. hal_rx_mpdu_desc_info_get_be;
  921. hal_soc->ops->hal_rx_err_status_get = hal_rx_err_status_get_be;
  922. hal_soc->ops->hal_rx_reo_buf_type_get = hal_rx_reo_buf_type_get_be;
  923. hal_soc->ops->hal_rx_wbm_err_src_get = hal_rx_wbm_err_src_get_be;
  924. hal_soc->ops->hal_reo_send_cmd = hal_reo_send_cmd_be;
  925. hal_soc->ops->hal_reo_qdesc_setup = hal_reo_qdesc_setup_be;
  926. hal_soc->ops->hal_reo_status_update = hal_reo_status_update_be;
  927. hal_soc->ops->hal_get_tlv_hdr_size = hal_get_tlv_hdr_size_be;
  928. hal_soc->ops->hal_rx_msdu_reo_dst_ind_get =
  929. hal_rx_msdu_reo_dst_ind_get_be;
  930. hal_soc->ops->hal_get_idle_link_bm_id = hal_get_idle_link_bm_id_be;
  931. hal_soc->ops->hal_rx_msdu_ext_desc_info_get_ptr =
  932. hal_rx_msdu_ext_desc_info_get_ptr_be;
  933. hal_soc->ops->hal_msdu_desc_info_set = hal_msdu_desc_info_set_be;
  934. hal_soc->ops->hal_mpdu_desc_info_set = hal_mpdu_desc_info_set_be;
  935. }