hal_6432_tx.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  1. /*
  2. * Copyright (c) 2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any
  6. * purpose with or without fee is hereby granted, provided that the above
  7. * copyright notice and this permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  10. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  11. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  12. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  13. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  14. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  15. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE
  16. */
  17. #ifndef _HAL_6432_TX_H_
  18. #define _HAL_6432_TX_H_
  19. #include "tcl_data_cmd.h"
  20. #include "phyrx_rssi_legacy.h"
  21. #include "hal_internal.h"
  22. #include "qdf_trace.h"
  23. #include "hal_rx.h"
  24. #include "hal_tx.h"
  25. #include "hal_api_mon.h"
  26. #include <hal_be_tx.h>
  27. #define DSCP_TID_TABLE_SIZE 24
  28. #define NUM_WORDS_PER_DSCP_TID_TABLE (DSCP_TID_TABLE_SIZE / 4)
  29. #define HAL_TX_NUM_DSCP_REGISTER_SIZE 32
  30. #define HAL_PPE_VP_ENTRIES_MAX 32
  31. #define HAL_PPE_VP_SEARCH_IDX_REG_MAX 8
  32. /**
  33. * hal_tx_get_num_ppe_vp_search_idx_reg_entries_6432() - get number of PPE VP
  34. * search index registers
  35. * @hal_soc_hdl: HAL SoC handle
  36. *
  37. * Return: Number of PPE VP search index registers
  38. */
  39. static uint32_t
  40. hal_tx_get_num_ppe_vp_search_idx_reg_entries_6432(hal_soc_handle_t hal_soc_hdl)
  41. {
  42. return HAL_PPE_VP_SEARCH_IDX_REG_MAX;
  43. }
  44. /**
  45. * hal_tx_set_dscp_tid_map_6432() - Configure default DSCP to TID map table
  46. * @hal_soc: HAL SoC context
  47. * @map: DSCP-TID mapping table
  48. * @id: mapping table ID - 0-31
  49. *
  50. * DSCP are mapped to 8 TID values using TID values programmed
  51. * in any of the 32 DSCP_TID_MAPS (id = 0-31).
  52. *
  53. * Return: none
  54. */
  55. static void hal_tx_set_dscp_tid_map_6432(struct hal_soc *hal_soc, uint8_t *map,
  56. uint8_t id)
  57. {
  58. int i;
  59. uint32_t addr, cmn_reg_addr;
  60. uint32_t value = 0, regval;
  61. uint8_t val[DSCP_TID_TABLE_SIZE], cnt = 0;
  62. struct hal_soc *soc = (struct hal_soc *)hal_soc;
  63. if (id >= HAL_MAX_HW_DSCP_TID_V2_MAPS_6432)
  64. return;
  65. cmn_reg_addr = HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(
  66. MAC_TCL_REG_REG_BASE);
  67. addr = HWIO_TCL_R0_DSCP_TID_MAP_n_ADDR(
  68. MAC_TCL_REG_REG_BASE,
  69. id * NUM_WORDS_PER_DSCP_TID_TABLE);
  70. /* Enable read/write access */
  71. regval = HAL_REG_READ(soc, cmn_reg_addr);
  72. regval |=
  73. (1 <<
  74. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_SHFT);
  75. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  76. /* Write 8 (24 bits) DSCP-TID mappings in each iteration */
  77. for (i = 0; i < 64; i += 8) {
  78. value = (map[i] |
  79. (map[i + 1] << 0x3) |
  80. (map[i + 2] << 0x6) |
  81. (map[i + 3] << 0x9) |
  82. (map[i + 4] << 0xc) |
  83. (map[i + 5] << 0xf) |
  84. (map[i + 6] << 0x12) |
  85. (map[i + 7] << 0x15));
  86. qdf_mem_copy(&val[cnt], (void *)&value, 3);
  87. cnt += 3;
  88. }
  89. for (i = 0; i < DSCP_TID_TABLE_SIZE; i += 4) {
  90. regval = *(uint32_t *)(val + i);
  91. HAL_REG_WRITE(soc, addr,
  92. (regval & HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  93. addr += 4;
  94. }
  95. /* Disable read/write access */
  96. regval = HAL_REG_READ(soc, cmn_reg_addr);
  97. regval &=
  98. ~(HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_BMSK);
  99. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  100. }
  101. /**
  102. * hal_tx_update_dscp_tid_6432() - Update the dscp tid map table as updated
  103. * by the user
  104. * @soc: HAL SoC context
  105. * @tid: DSCP-TID mapping table
  106. * @id : MAP ID
  107. * @dscp: DSCP_TID map index
  108. *
  109. * Return: void
  110. */
  111. static void hal_tx_update_dscp_tid_6432(struct hal_soc *soc, uint8_t tid,
  112. uint8_t id, uint8_t dscp)
  113. {
  114. uint32_t addr, addr1, cmn_reg_addr;
  115. uint32_t start_value = 0, end_value = 0;
  116. uint32_t regval;
  117. uint8_t end_bits = 0;
  118. uint8_t start_bits = 0;
  119. uint32_t start_index, end_index;
  120. cmn_reg_addr = HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(
  121. MAC_TCL_REG_REG_BASE);
  122. addr = HWIO_TCL_R0_DSCP_TID_MAP_n_ADDR(
  123. MAC_TCL_REG_REG_BASE,
  124. id * NUM_WORDS_PER_DSCP_TID_TABLE);
  125. start_index = dscp * HAL_TX_BITS_PER_TID;
  126. end_index = (start_index + (HAL_TX_BITS_PER_TID - 1))
  127. % HAL_TX_NUM_DSCP_REGISTER_SIZE;
  128. start_index = start_index % HAL_TX_NUM_DSCP_REGISTER_SIZE;
  129. addr += (4 * ((dscp * HAL_TX_BITS_PER_TID) /
  130. HAL_TX_NUM_DSCP_REGISTER_SIZE));
  131. if (end_index < start_index) {
  132. end_bits = end_index + 1;
  133. start_bits = HAL_TX_BITS_PER_TID - end_bits;
  134. start_value = tid << start_index;
  135. end_value = tid >> start_bits;
  136. addr1 = addr + 4;
  137. } else {
  138. start_bits = HAL_TX_BITS_PER_TID - end_bits;
  139. start_value = tid << start_index;
  140. addr1 = 0;
  141. }
  142. /* Enable read/write access */
  143. regval = HAL_REG_READ(soc, cmn_reg_addr);
  144. regval |=
  145. (1 << HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_SHFT);
  146. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  147. regval = HAL_REG_READ(soc, addr);
  148. if (end_index < start_index)
  149. regval &= (~0) >> start_bits;
  150. else
  151. regval &= ~(7 << start_index);
  152. regval |= start_value;
  153. HAL_REG_WRITE(soc, addr, (regval & HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  154. if (addr1) {
  155. regval = HAL_REG_READ(soc, addr1);
  156. regval &= (~0) << end_bits;
  157. regval |= end_value;
  158. HAL_REG_WRITE(soc, addr1, (regval &
  159. HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  160. }
  161. /* Disable read/write access */
  162. regval = HAL_REG_READ(soc, cmn_reg_addr);
  163. regval &=
  164. ~(HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_BMSK);
  165. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  166. }
  167. #ifdef DP_TX_IMPLICIT_RBM_MAPPING
  168. #define RBM_MAPPING_BMSK HWIO_TCL_R0_RBM_MAPPING0_SW2TCL1_RING_BMSK
  169. #define RBM_MAPPING_SHFT HWIO_TCL_R0_RBM_MAPPING0_SW2TCL2_RING_SHFT
  170. #define RBM_TCL_CMD_CREDIT_OFFSET \
  171. (HWIO_TCL_R0_RBM_MAPPING0_SW2TCL_CREDIT_RING_SHFT >> 2)
  172. /**
  173. * hal_tx_config_rbm_mapping_be_6432() - Update return buffer manager ring id
  174. * @hal_soc_hdl: HAL SoC context
  175. * @hal_ring_hdl: Source ring pointer
  176. * @rbm_id: return buffer manager ring id
  177. *
  178. * Return: void
  179. */
  180. static inline void
  181. hal_tx_config_rbm_mapping_be_6432(hal_soc_handle_t hal_soc_hdl,
  182. hal_ring_handle_t hal_ring_hdl,
  183. uint8_t rbm_id)
  184. {
  185. struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
  186. struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
  187. uint32_t reg_addr = 0;
  188. uint32_t reg_val = 0;
  189. uint32_t val = 0;
  190. uint8_t ring_num;
  191. enum hal_ring_type ring_type;
  192. ring_type = srng->ring_type;
  193. ring_num = hal_soc->hw_srng_table[ring_type].start_ring_id;
  194. ring_num = srng->ring_id - ring_num;
  195. reg_addr = HWIO_TCL_R0_RBM_MAPPING0_ADDR(MAC_TCL_REG_REG_BASE);
  196. if (ring_type == PPE2TCL)
  197. ring_num = ring_num + RBM_PPE2TCL_OFFSET;
  198. else if (ring_type == TCL_CMD_CREDIT)
  199. ring_num = ring_num + RBM_TCL_CMD_CREDIT_OFFSET;
  200. /* get current value stored in register address */
  201. val = HAL_REG_READ(hal_soc, reg_addr);
  202. /* mask out other stored value */
  203. val &= (~(RBM_MAPPING_BMSK << (RBM_MAPPING_SHFT * ring_num)));
  204. reg_val = val | ((RBM_MAPPING_BMSK & rbm_id) <<
  205. (RBM_MAPPING_SHFT * ring_num));
  206. /* write rbm mapped value to register address */
  207. HAL_REG_WRITE(hal_soc, reg_addr, reg_val);
  208. }
  209. #else
  210. static inline void
  211. hal_tx_config_rbm_mapping_be_6432(hal_soc_handle_t hal_soc_hdl,
  212. hal_ring_handle_t hal_ring_hdl,
  213. uint8_t rbm_id)
  214. {
  215. }
  216. #endif
  217. /**
  218. * hal_tx_init_cmd_credit_ring_6432() - Initialize command/credit SRNG
  219. * @hal_soc_hdl: Handle to HAL SoC structure
  220. * @hal_ring_hdl: Handle to HAL SRNG structure
  221. *
  222. * Return: none
  223. */
  224. static inline void
  225. hal_tx_init_cmd_credit_ring_6432(hal_soc_handle_t hal_soc_hdl,
  226. hal_ring_handle_t hal_ring_hdl)
  227. {
  228. }
  229. /* TX MONITOR */
  230. #if defined(WLAN_PKT_CAPTURE_TX_2_0) && defined(TX_MONITOR_WORD_MASK)
  231. #define TX_FES_SETUP_MASK 0x3
  232. typedef struct tx_fes_setup_compact_6432 hal_tx_fes_setup_t;
  233. struct tx_fes_setup_compact_6432 {
  234. /* DWORD - 0 */
  235. uint32_t schedule_id;
  236. /* DWORD - 1 */
  237. uint32_t reserved_1a : 7, // [0: 6]
  238. transmit_start_reason : 3, // [7: 9]
  239. reserved_1b : 13, // [10: 22]
  240. number_of_users : 6, // [28: 23]
  241. mu_type : 1, // [29]
  242. reserved_1c : 2; // [30]
  243. /* DWORD - 2 */
  244. uint32_t reserved_2a : 4, // [0: 3]
  245. ndp_frame : 2, // [4: 5]
  246. txbf : 1, // [6]
  247. reserved_2b : 3, // [7: 9]
  248. static_bandwidth : 3, // [12: 10]
  249. reserved_2c : 1, // [13]
  250. transmission_contains_mu_rts : 1, // [14]
  251. reserved_2d : 17; // [15: 31]
  252. /* DWORD - 3 */
  253. uint32_t reserved_3a : 15, // [0: 14]
  254. mu_ndp : 1, // [15]
  255. reserved_3b : 11, // [16: 26]
  256. ndpa : 1, // [27]
  257. reserved_3c : 4; // [28: 31]
  258. };
  259. #define TX_PEER_ENTRY_MASK 0x103
  260. typedef struct tx_peer_entry_compact_6432 hal_tx_peer_entry_t;
  261. struct tx_peer_entry_compact_6432 {
  262. /* DWORD - 0 */
  263. uint32_t mac_addr_a_31_0 : 32;
  264. /* DWORD - 1 */
  265. uint32_t mac_addr_a_47_32 : 16,
  266. mac_addr_b_15_0 : 16;
  267. /* DWORD - 2 */
  268. uint32_t mac_addr_b_47_16 : 32;
  269. /* DWORD - 3 */
  270. uint32_t reserved_3 : 32;
  271. /* DWORD - 16 */
  272. uint32_t reserved_16 : 32;
  273. /* DWORD - 17 */
  274. uint32_t multi_link_addr_crypto_enable : 1,
  275. reserved_17_a : 15,
  276. sw_peer_id : 16;
  277. };
  278. #define TX_QUEUE_EXT_MASK 0x1
  279. typedef struct tx_queue_ext_compact_6432 hal_tx_queue_ext_t;
  280. struct tx_queue_ext_compact_6432 {
  281. /* DWORD - 0 */
  282. uint32_t frame_ctl : 16,
  283. qos_ctl : 16;
  284. /* DWORD - 1 */
  285. uint32_t ampdu_flag : 1,
  286. reserved_1 : 31;
  287. };
  288. #define TX_MSDU_START_MASK 0x1
  289. typedef struct tx_msdu_start_compact_6432 hal_tx_msdu_start_t;
  290. struct tx_msdu_start_compact_6432 {
  291. /* DWORD - 0 */
  292. uint32_t reserved_0 : 32;
  293. /* DWORD - 1 */
  294. uint32_t reserved_1 : 32;
  295. };
  296. #define TX_MPDU_START_MASK 0x3
  297. typedef struct tx_mpdu_start_compact_6432 hal_tx_mpdu_start_t;
  298. struct tx_mpdu_start_compact_6432 {
  299. /* DWORD - 0 */
  300. uint32_t mpdu_length : 14,
  301. frame_not_from_tqm : 1,
  302. vht_control_present : 1,
  303. mpdu_header_length : 8,
  304. retry_count : 7,
  305. wds : 1;
  306. /* DWORD - 1 */
  307. uint32_t pn_31_0 : 32;
  308. /* DWORD - 2 */
  309. uint32_t pn_47_32 : 16,
  310. mpdu_sequence_number : 12,
  311. raw_already_encrypted : 1,
  312. frame_type : 2,
  313. txdma_dropped_mpdu_warning : 1;
  314. /* DWORD - 3 */
  315. uint32_t reserved_3 : 32;
  316. };
  317. typedef struct rxpcu_user_setup_compact_6432 hal_rxpcu_user_setup_t;
  318. struct rxpcu_user_setup_compact_6432 {
  319. };
  320. #define TX_FES_STATUS_END_MASK 0x7
  321. typedef struct tx_fes_status_end_compact_6432 hal_tx_fes_status_end_t;
  322. struct tx_fes_status_end_compact_6432 {
  323. /* DWORD - 0 */
  324. uint32_t reserved_0 : 32;
  325. /* DWORD - 1 */
  326. struct {
  327. uint16_t phytx_abort_reason : 8,
  328. user_number : 6,
  329. reserved_1a : 2;
  330. } phytx_abort_request_info_details;
  331. uint16_t reserved_1b : 12,
  332. phytx_abort_request_info_valid : 1,
  333. reserved_1c : 3;
  334. /* DWORD - 2 */
  335. uint32_t start_of_frame_timestamp_15_0 : 16,
  336. start_of_frame_timestamp_31_16 : 16;
  337. /* DWORD - 3 */
  338. uint32_t end_of_frame_timestamp_15_0 : 16,
  339. end_of_frame_timestamp_31_16 : 16;
  340. /* DWORD - 4 */
  341. uint32_t terminate_ranging_sequence : 1,
  342. reserved_4a : 7,
  343. timing_status : 2,
  344. response_type : 5,
  345. r2r_end_status_to_follow : 1,
  346. transmit_delay : 16;
  347. /* DWORD - 5 */
  348. uint32_t reserved_5 : 32;
  349. };
  350. #define RESPONSE_END_STATUS_MASK 0xD
  351. typedef struct response_end_status_compact_6432 hal_response_end_status_t;
  352. struct response_end_status_compact_6432 {
  353. /* DWORD - 0 */
  354. uint32_t coex_bt_tx_while_wlan_tx : 1,
  355. coex_wan_tx_while_wlan_tx : 1,
  356. coex_wlan_tx_while_wlan_tx : 1,
  357. global_data_underflow_warning : 1,
  358. response_transmit_status : 4,
  359. phytx_pkt_end_info_valid : 1,
  360. phytx_abort_request_info_valid : 1,
  361. generated_response : 3,
  362. mba_user_count : 7,
  363. mba_fake_bitmap_count : 7,
  364. coex_based_tx_bw : 3,
  365. trig_response_related : 1,
  366. dpdtrain_done : 1;
  367. /* DWORD - 1 */
  368. uint32_t reserved_1 : 32;
  369. /* DWORD - 4 */
  370. uint32_t reserved_4 : 32;
  371. /* DWORD - 5 */
  372. uint32_t start_of_frame_timestamp_15_0 : 16,
  373. start_of_frame_timestamp_31_16 : 16;
  374. /* DWORD - 6 */
  375. uint32_t end_of_frame_timestamp_15_0 : 16,
  376. end_of_frame_timestamp_31_16 : 16;
  377. /* DWORD - 7 */
  378. uint32_t reserved_7 : 32;
  379. };
  380. #define TX_FES_STATUS_PROT_MASK 0x2
  381. typedef struct tx_fes_status_prot_compact_6432 hal_tx_fes_status_prot_t;
  382. struct tx_fes_status_prot_compact_6432 {
  383. /* DWORD - 2 */
  384. uint32_t start_of_frame_timestamp_15_0 : 16,
  385. start_of_frame_timestamp_31_16 : 16;
  386. /* DWROD - 3 */
  387. uint32_t end_of_frame_timestamp_15_0 : 16,
  388. end_of_frame_timestamp_31_16 : 16;
  389. };
  390. #define PCU_PPDU_SETUP_INIT_MASK 0x1E800000
  391. typedef struct pcu_ppdu_setup_init_compact_6432 hal_pcu_ppdu_setup_t;
  392. struct pcu_ppdu_setup_init_compact_6432 {
  393. /* DWORD - 46 */
  394. uint32_t reserved_46 : 32;
  395. /* DWORD - 47 */
  396. uint32_t r2r_group_id : 6,
  397. r2r_response_frame_type : 4,
  398. r2r_sta_partial_aid : 11,
  399. use_address_fields_for_protection : 1,
  400. r2r_set_required_response_time : 1,
  401. reserved_47 : 9;
  402. /* DWORD - 50 */
  403. uint32_t reserved_50 : 32;
  404. /* DWORD - 51 */
  405. uint32_t protection_frame_ad1_31_0 : 32;
  406. /* DWORD - 52 */
  407. uint32_t protection_frame_ad1_47_32 : 16,
  408. protection_frame_ad2_15_0 : 16;
  409. /* DWORD - 53 */
  410. uint32_t protection_frame_ad2_47_16 : 32;
  411. /* DWORD - 54 */
  412. uint32_t reserved_54 : 32;
  413. /* DWORD - 55 */
  414. uint32_t protection_frame_ad3_31_0 : 32;
  415. /* DWORD - 56 */
  416. uint32_t protection_frame_ad3_47_32 : 16,
  417. protection_frame_ad4_15_0 : 16;
  418. /* DWORD - 57 */
  419. uint32_t protection_frame_ad4_47_16 : 32;
  420. };
  421. /**
  422. * hal_txmon_get_word_mask_qcn6432() - api to get word mask for tx monitor
  423. * @wmask: pointer to hal_txmon_word_mask_config_t
  424. *
  425. * Return: void
  426. */
  427. static inline
  428. void hal_txmon_get_word_mask_qcn6432(void *wmask)
  429. {
  430. hal_txmon_word_mask_config_t *word_mask = NULL;
  431. word_mask = (hal_txmon_word_mask_config_t *)wmask;
  432. word_mask->compaction_enable = 1;
  433. word_mask->tx_fes_setup = TX_FES_SETUP_MASK;
  434. word_mask->tx_peer_entry = TX_PEER_ENTRY_MASK;
  435. word_mask->tx_queue_ext = TX_QUEUE_EXT_MASK;
  436. word_mask->tx_msdu_start = TX_MSDU_START_MASK;
  437. word_mask->pcu_ppdu_setup_init = PCU_PPDU_SETUP_INIT_MASK;
  438. word_mask->tx_mpdu_start = TX_MPDU_START_MASK;
  439. word_mask->rxpcu_user_setup = 0xFF;
  440. word_mask->tx_fes_status_end = TX_FES_STATUS_END_MASK;
  441. word_mask->response_end_status = RESPONSE_END_STATUS_MASK;
  442. word_mask->tx_fes_status_prot = TX_FES_STATUS_PROT_MASK;
  443. }
  444. #endif
  445. /**
  446. * hal_tx_set_ppe_cmn_config_6432() - Set the PPE common config register
  447. * @hal_soc_hdl: HAL SoC handle
  448. * @cmn_cfg: Common PPE config
  449. *
  450. * Based on the PPE2TCL descriptor below errors, if the below register
  451. * values are set then the packets are forward to Tx rule handler if 1'0b
  452. * or to TCL exit base if 1'1b.
  453. *
  454. * Return: void
  455. */
  456. static inline
  457. void hal_tx_set_ppe_cmn_config_6432(hal_soc_handle_t hal_soc_hdl,
  458. union hal_tx_cmn_config_ppe *cmn_cfg)
  459. {
  460. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  461. union hal_tx_cmn_config_ppe *cfg =
  462. (union hal_tx_cmn_config_ppe *)cmn_cfg;
  463. uint32_t reg_addr, reg_val = 0;
  464. reg_addr = HWIO_TCL_R0_CMN_CONFIG_PPE_ADDR(MAC_TCL_REG_REG_BASE);
  465. reg_val = HAL_REG_READ(soc, reg_addr);
  466. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_BMSK;
  467. reg_val |=
  468. (cfg->drop_prec_err &
  469. HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_BMSK) <<
  470. HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_SHFT;
  471. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_BMSK;
  472. reg_val |=
  473. (cfg->fake_mac_hdr &
  474. HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_BMSK) <<
  475. HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_SHFT;
  476. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_BMSK;
  477. reg_val |=
  478. (cfg->cpu_code_inv &
  479. HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_BMSK) <<
  480. HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_SHFT;
  481. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_BMSK;
  482. reg_val |=
  483. (cfg->l3_l4_err &
  484. HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_BMSK) <<
  485. HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_SHFT;
  486. HAL_REG_WRITE(soc, reg_addr, reg_val);
  487. }
  488. /**
  489. * hal_tx_set_ppe_vp_entry_6432() - Set the PPE VP entry
  490. * @hal_soc_hdl: HAL SoC handle
  491. * @cfg: PPE VP config
  492. * @ppe_vp_idx: PPE VP index to the table
  493. *
  494. * Return: void
  495. */
  496. static inline
  497. void hal_tx_set_ppe_vp_entry_6432(hal_soc_handle_t hal_soc_hdl,
  498. union hal_tx_ppe_vp_config *cfg,
  499. int ppe_vp_idx)
  500. {
  501. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  502. uint32_t reg_addr;
  503. reg_addr = HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_ADDR(MAC_TCL_REG_REG_BASE,
  504. ppe_vp_idx);
  505. HAL_REG_WRITE(soc, reg_addr, cfg->val);
  506. }
  507. /**
  508. * hal_ppeds_cfg_ast_override_map_reg_6432() - Set the PPE index mapping table
  509. * @hal_soc_hdl: HAL SoC context
  510. * @idx: index into the table
  511. * @idx_map: HAL PPE INDESX MAPPING config
  512. *
  513. * Return: void
  514. */
  515. static inline void
  516. hal_ppeds_cfg_ast_override_map_reg_6432(hal_soc_handle_t hal_soc_hdl,
  517. uint8_t idx,
  518. union hal_tx_ppe_idx_map_config *idx_map)
  519. {
  520. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  521. uint32_t reg_addr;
  522. reg_addr =
  523. HWIO_TCL_R0_PPE_INDEX_MAPPING_TABLE_n_ADDR(MAC_TCL_REG_REG_BASE,
  524. idx);
  525. HAL_REG_WRITE(soc, reg_addr, idx_map->val);
  526. }
  527. /**
  528. * hal_tx_set_ppe_pri2tid_map_6432()
  529. * @hal_soc_hdl: HAL SoC handle
  530. * @val : PRI to TID value
  531. * @map_no: Map number
  532. *
  533. * Return: void
  534. */
  535. static inline
  536. void hal_tx_set_ppe_pri2tid_map_6432(hal_soc_handle_t hal_soc_hdl,
  537. uint32_t val, uint8_t map_no)
  538. {
  539. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  540. uint32_t reg_addr, reg_val = 0;
  541. if (map_no == 0)
  542. reg_addr =
  543. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_ADDR(MAC_TCL_REG_REG_BASE);
  544. else
  545. reg_addr =
  546. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_ADDR(MAC_TCL_REG_REG_BASE);
  547. reg_val |= val;
  548. HAL_REG_WRITE(soc, reg_addr, reg_val);
  549. }
  550. /**
  551. * hal_tx_enable_pri2tid_map_6432()
  552. * @hal_soc_hdl: HAL SoC handle
  553. * @val : PRI to TID value
  554. * @ppe_vp_idx: Map number
  555. *
  556. * Return: void
  557. */
  558. static inline
  559. void hal_tx_enable_pri2tid_map_6432(hal_soc_handle_t hal_soc_hdl,
  560. bool val, uint8_t ppe_vp_idx)
  561. {
  562. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  563. uint32_t reg_addr, reg_val = 0;
  564. reg_addr = HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_ADDR(MAC_TCL_REG_REG_BASE,
  565. ppe_vp_idx);
  566. /*
  567. * Drop precedence is enabled by default.
  568. */
  569. reg_val = HAL_REG_READ(soc, reg_addr);
  570. reg_val &=
  571. ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK;
  572. reg_val |=
  573. (val &
  574. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK) <<
  575. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_SHFT;
  576. HAL_REG_WRITE(soc, reg_addr, reg_val);
  577. }
  578. /**
  579. * hal_tx_update_ppe_pri2tid_6432()
  580. * @hal_soc_hdl: HAL SoC handle
  581. * @pri: INT_PRI
  582. * @tid: Wi-Fi TID
  583. *
  584. * Return: void
  585. */
  586. static inline
  587. void hal_tx_update_ppe_pri2tid_6432(hal_soc_handle_t hal_soc_hdl,
  588. uint8_t pri, uint8_t tid)
  589. {
  590. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  591. uint32_t reg_addr, reg_val = 0, mask, shift;
  592. /*
  593. * INT_PRI 0..9 is in MAP0 register and INT_PRI 10..15
  594. * is in MAP1 register.
  595. */
  596. switch (pri) {
  597. case 0 ... 9:
  598. reg_addr =
  599. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_ADDR(MAC_TCL_REG_REG_BASE);
  600. mask =
  601. (HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_INT_PRI_0_BMSK << (0x3 * pri));
  602. shift = HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_INT_PRI_0_SHFT + (pri * 0x3);
  603. break;
  604. case 10 ... 15:
  605. pri = pri - 10;
  606. reg_addr =
  607. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_ADDR(MAC_TCL_REG_REG_BASE);
  608. mask =
  609. (HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_INT_PRI_10_BMSK << (0x3 * pri));
  610. shift =
  611. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_INT_PRI_10_SHFT + (pri * 0x3);
  612. break;
  613. default:
  614. return;
  615. }
  616. reg_val = HAL_REG_READ(soc, reg_addr);
  617. reg_val &= ~mask;
  618. reg_val |= (pri << shift) & mask;
  619. HAL_REG_WRITE(soc, reg_addr, reg_val);
  620. }
  621. /*
  622. * hal_tx_dump_ppe_vp_entry_6432()
  623. * @hal_soc_hdl: HAL SoC handle
  624. *
  625. * Return: void
  626. */
  627. static inline
  628. void hal_tx_dump_ppe_vp_entry_6432(hal_soc_handle_t hal_soc_hdl)
  629. {
  630. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  631. uint32_t reg_addr, reg_val = 0, i;
  632. for (i = 0; i < HAL_PPE_VP_ENTRIES_MAX; i++) {
  633. reg_addr =
  634. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_ADDR(
  635. MAC_TCL_REG_REG_BASE,
  636. i);
  637. reg_val = HAL_REG_READ(soc, reg_addr);
  638. hal_verbose_debug("%d: 0x%x\n", i, reg_val);
  639. }
  640. }
  641. /*
  642. * hal_tx_get_num_ppe_vp_tbl_entries_6432()
  643. * @hal_soc_hdl: HAL SoC handle
  644. *
  645. * Return: Number of PPE VP entries
  646. */
  647. static
  648. uint32_t hal_tx_get_num_ppe_vp_tbl_entries_6432(hal_soc_handle_t hal_soc_hdl)
  649. {
  650. return HAL_PPE_VP_ENTRIES_MAX;
  651. }
  652. /**
  653. * hal_tx_ppe2tcl_ring_halt_set_6432() - Enable ring halt for the ppe2tcl ring
  654. * @hal_soc: HAL SoC context
  655. *
  656. * Return: none
  657. */
  658. static void hal_tx_ppe2tcl_ring_halt_set_6432(hal_soc_handle_t hal_soc)
  659. {
  660. uint32_t cmn_reg_addr;
  661. uint32_t regval;
  662. struct hal_soc *soc = (struct hal_soc *)hal_soc;
  663. cmn_reg_addr =
  664. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(MAC_TCL_REG_REG_BASE);
  665. /* Enable RING_HALT */
  666. regval = HAL_REG_READ(soc, cmn_reg_addr);
  667. regval |=
  668. (1 <<
  669. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_PPE2TCL1_RNG_HALT_SHFT);
  670. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  671. }
  672. /**
  673. * hal_tx_ppe2tcl_ring_halt_reset_6432() - Disable ring halt for the ppe2tcl ring
  674. * @hal_soc: HAL SoC context
  675. *
  676. * Return: none
  677. */
  678. static void hal_tx_ppe2tcl_ring_halt_reset_6432(hal_soc_handle_t hal_soc)
  679. {
  680. uint32_t cmn_reg_addr;
  681. uint32_t regval;
  682. struct hal_soc *soc = (struct hal_soc *)hal_soc;
  683. cmn_reg_addr =
  684. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(MAC_TCL_REG_REG_BASE);
  685. /* Disable RING_HALT */
  686. regval = HAL_REG_READ(soc, cmn_reg_addr);
  687. regval &= ~(1 <<
  688. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_PPE2TCL1_RNG_HALT_SHFT);
  689. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  690. }
  691. /**
  692. * hal_tx_ppe2tcl_ring_halt_done_6432() - Check if ring halt is done for ppe2tcl ring
  693. * @hal_soc: HAL SoC context
  694. *
  695. * Return: true if halt done
  696. */
  697. static bool hal_tx_ppe2tcl_ring_halt_done_6432(hal_soc_handle_t hal_soc)
  698. {
  699. uint32_t cmn_reg_addr;
  700. uint32_t regval;
  701. struct hal_soc *soc = (struct hal_soc *)hal_soc;
  702. cmn_reg_addr =
  703. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(MAC_TCL_REG_REG_BASE);
  704. regval = HAL_REG_READ(soc, cmn_reg_addr);
  705. regval &= (1 << HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_PPE2TCL1_RNG_HALT_STAT_SHFT);
  706. return(!!regval);
  707. }
  708. #endif /* _HAL_6432_TX_H_ */