hal_be_generic_api.c 34 KB

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