hal_9224_tx.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. /*
  2. * Copyright (c) 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. #ifndef _HAL_9224_TX_H_
  20. #define _HAL_9224_TX_H_
  21. #include "tcl_data_cmd.h"
  22. #include "phyrx_rssi_legacy.h"
  23. #include "hal_internal.h"
  24. #include "qdf_trace.h"
  25. #include "hal_rx.h"
  26. #include "hal_tx.h"
  27. #include "hal_api_mon.h"
  28. #include <hal_be_tx.h>
  29. #define DSCP_TID_TABLE_SIZE 24
  30. #define NUM_WORDS_PER_DSCP_TID_TABLE (DSCP_TID_TABLE_SIZE / 4)
  31. #define HAL_TX_NUM_DSCP_REGISTER_SIZE 32
  32. /**
  33. * hal_tx_set_dscp_tid_map_9224() - Configure default DSCP to TID map table
  34. * @soc: HAL SoC context
  35. * @map: DSCP-TID mapping table
  36. * @id: mapping table ID - 0-31
  37. *
  38. * DSCP are mapped to 8 TID values using TID values programmed
  39. * in any of the 32 DSCP_TID_MAPS (id = 0-31).
  40. *
  41. * Return: none
  42. */
  43. static void hal_tx_set_dscp_tid_map_9224(struct hal_soc *hal_soc, uint8_t *map,
  44. uint8_t id)
  45. {
  46. int i;
  47. uint32_t addr, cmn_reg_addr;
  48. uint32_t value = 0, regval;
  49. uint8_t val[DSCP_TID_TABLE_SIZE], cnt = 0;
  50. struct hal_soc *soc = (struct hal_soc *)hal_soc;
  51. if (id >= HAL_MAX_HW_DSCP_TID_V2_MAPS)
  52. return;
  53. cmn_reg_addr = HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(
  54. MAC_TCL_REG_REG_BASE);
  55. addr = HWIO_TCL_R0_DSCP_TID_MAP_n_ADDR(
  56. MAC_TCL_REG_REG_BASE,
  57. id * NUM_WORDS_PER_DSCP_TID_TABLE);
  58. /* Enable read/write access */
  59. regval = HAL_REG_READ(soc, cmn_reg_addr);
  60. regval |=
  61. (1 <<
  62. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_SHFT);
  63. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  64. /* Write 8 (24 bits) DSCP-TID mappings in each interation */
  65. for (i = 0; i < 64; i += 8) {
  66. value = (map[i] |
  67. (map[i + 1] << 0x3) |
  68. (map[i + 2] << 0x6) |
  69. (map[i + 3] << 0x9) |
  70. (map[i + 4] << 0xc) |
  71. (map[i + 5] << 0xf) |
  72. (map[i + 6] << 0x12) |
  73. (map[i + 7] << 0x15));
  74. qdf_mem_copy(&val[cnt], (void *)&value, 3);
  75. cnt += 3;
  76. }
  77. for (i = 0; i < DSCP_TID_TABLE_SIZE; i += 4) {
  78. regval = *(uint32_t *)(val + i);
  79. HAL_REG_WRITE(soc, addr,
  80. (regval & HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  81. addr += 4;
  82. }
  83. /* Diasble read/write access */
  84. regval = HAL_REG_READ(soc, cmn_reg_addr);
  85. regval &=
  86. ~(HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_BMSK);
  87. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  88. }
  89. /**
  90. * hal_tx_update_dscp_tid_9224() - Update the dscp tid map table as updated
  91. * by the user
  92. * @soc: HAL SoC context
  93. * @map: DSCP-TID mapping table
  94. * @id : MAP ID
  95. * @dscp: DSCP_TID map index
  96. *
  97. * Return: void
  98. */
  99. static void hal_tx_update_dscp_tid_9224(struct hal_soc *soc, uint8_t tid,
  100. uint8_t id, uint8_t dscp)
  101. {
  102. uint32_t addr, addr1, cmn_reg_addr;
  103. uint32_t start_value = 0, end_value = 0;
  104. uint32_t regval;
  105. uint8_t end_bits = 0;
  106. uint8_t start_bits = 0;
  107. uint32_t start_index, end_index;
  108. cmn_reg_addr = HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(
  109. MAC_TCL_REG_REG_BASE);
  110. addr = HWIO_TCL_R0_DSCP_TID_MAP_n_ADDR(
  111. MAC_TCL_REG_REG_BASE,
  112. id * NUM_WORDS_PER_DSCP_TID_TABLE);
  113. start_index = dscp * HAL_TX_BITS_PER_TID;
  114. end_index = (start_index + (HAL_TX_BITS_PER_TID - 1))
  115. % HAL_TX_NUM_DSCP_REGISTER_SIZE;
  116. start_index = start_index % HAL_TX_NUM_DSCP_REGISTER_SIZE;
  117. addr += (4 * ((dscp * HAL_TX_BITS_PER_TID) /
  118. HAL_TX_NUM_DSCP_REGISTER_SIZE));
  119. if (end_index < start_index) {
  120. end_bits = end_index + 1;
  121. start_bits = HAL_TX_BITS_PER_TID - end_bits;
  122. start_value = tid << start_index;
  123. end_value = tid >> start_bits;
  124. addr1 = addr + 4;
  125. } else {
  126. start_bits = HAL_TX_BITS_PER_TID - end_bits;
  127. start_value = tid << start_index;
  128. addr1 = 0;
  129. }
  130. /* Enable read/write access */
  131. regval = HAL_REG_READ(soc, cmn_reg_addr);
  132. regval |=
  133. (1 << HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_SHFT);
  134. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  135. regval = HAL_REG_READ(soc, addr);
  136. if (end_index < start_index)
  137. regval &= (~0) >> start_bits;
  138. else
  139. regval &= ~(7 << start_index);
  140. regval |= start_value;
  141. HAL_REG_WRITE(soc, addr, (regval & HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  142. if (addr1) {
  143. regval = HAL_REG_READ(soc, addr1);
  144. regval &= (~0) << end_bits;
  145. regval |= end_value;
  146. HAL_REG_WRITE(soc, addr1, (regval &
  147. HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  148. }
  149. /* Diasble read/write access */
  150. regval = HAL_REG_READ(soc, cmn_reg_addr);
  151. regval &=
  152. ~(HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_BMSK);
  153. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  154. }
  155. /**
  156. * hal_tx_init_cmd_credit_ring_9224() - Initialize command/credit SRNG
  157. * @hal_soc_hdl: Handle to HAL SoC structure
  158. * @hal_srng: Handle to HAL SRNG structure
  159. *
  160. * Return: none
  161. */
  162. static inline void
  163. hal_tx_init_cmd_credit_ring_9224(hal_soc_handle_t hal_soc_hdl,
  164. hal_ring_handle_t hal_ring_hdl)
  165. {
  166. }
  167. /* TX MONITOR */
  168. #ifdef QCA_MONITOR_2_0_SUPPORT
  169. #if defined(TX_MONITOR_WORD_MASK)
  170. typedef struct tx_fes_setup_compact_9224 hal_tx_fes_setup_t;
  171. struct tx_fes_setup_compact_9224 {
  172. /* DWORD - 0 */
  173. uint32_t schedule_id;
  174. /* DWORD - 1 */
  175. uint32_t reserved_1a : 7, // [0: 6]
  176. transmit_start_reason : 3, // [7: 9]
  177. reserved_1b : 13, // [10: 22]
  178. number_of_users : 6, // [28: 23]
  179. MU_type : 1, // [29]
  180. reserved_1c : 2; // [30]
  181. /* DWORD - 2 */
  182. uint32_t reserved_2a : 4, // [0: 3]
  183. ndp_frame : 2, // [4: 5]
  184. txbf : 1, // [6]
  185. reserved_2b : 3, // [7: 9]
  186. static_bandwidth : 3, // [12: 10]
  187. reserved_2c : 1, // [13]
  188. transmission_contains_MU_RTS : 1, // [14]
  189. reserved_2d : 17; // [15: 31]
  190. /* DWORD - 3 */
  191. uint32_t reserved_3a : 15, // [0: 14]
  192. mu_ndp : 1, // [15]
  193. reserved_3b : 11, // [16: 26]
  194. ndpa : 1, // [27]
  195. reserved_3c : 4; // [28: 31]
  196. };
  197. #endif
  198. #endif /* QCA_MONITOR_2_0_SUPPORT */
  199. /**
  200. * hal_tx_set_ppe_cmn_config_9224() - Set the PPE common config register
  201. * @hal_soc_hdl: HAL SoC handle
  202. * @cmn_cfg: Common PPE config
  203. *
  204. * Based on the PPE2TCL descriptor below errors, if the below register
  205. * values are set then the packets are forward to Tx rule handler if 1'0b
  206. * or to TCL exit base if 1'1b.
  207. *
  208. * Return: void
  209. */
  210. static inline
  211. void hal_tx_set_ppe_cmn_config_9224(hal_soc_handle_t hal_soc_hdl,
  212. union hal_tx_cmn_config_ppe *cmn_cfg)
  213. {
  214. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  215. union hal_tx_cmn_config_ppe *cfg =
  216. (union hal_tx_cmn_config_ppe *)cmn_cfg;
  217. uint32_t reg_addr, reg_val = 0;
  218. reg_addr = HWIO_TCL_R0_CMN_CONFIG_PPE_ADDR(MAC_TCL_REG_REG_BASE);
  219. reg_val = HAL_REG_READ(soc, reg_addr);
  220. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_BMSK;
  221. reg_val |=
  222. (cfg->drop_prec_err &
  223. HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_BMSK) <<
  224. HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_SHFT;
  225. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_BMSK;
  226. reg_val |=
  227. (cfg->fake_mac_hdr &
  228. HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_BMSK) <<
  229. HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_SHFT;
  230. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_BMSK;
  231. reg_val |=
  232. (cfg->cpu_code_inv &
  233. HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_BMSK) <<
  234. HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_SHFT;
  235. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_BMSK;
  236. reg_val |=
  237. (cfg->l3_l4_err &
  238. HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_BMSK) <<
  239. HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_SHFT;
  240. HAL_REG_WRITE(soc, reg_addr, reg_val);
  241. }
  242. /**
  243. * hal_tx_set_ppe_vp_entry_9224() - Set the PPE VP entry
  244. * @hal_soc_hdl: HAL SoC handle
  245. * @vp_cfg: PPE VP config
  246. * @ppe_vp_idx : PPE VP index to the table
  247. *
  248. * Return: void
  249. */
  250. static inline
  251. void hal_tx_set_ppe_vp_entry_9224(hal_soc_handle_t hal_soc_hdl,
  252. union hal_tx_ppe_vp_config *cfg,
  253. int ppe_vp_idx)
  254. {
  255. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  256. uint32_t reg_addr, reg_val = 0;
  257. reg_addr = HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_ADDR(MAC_TCL_REG_REG_BASE,
  258. ppe_vp_idx);
  259. /*
  260. * Drop precedence is enabled by default.
  261. */
  262. reg_val = HAL_REG_READ(soc, reg_addr);
  263. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VP_NUM_BMSK;
  264. reg_val |= (cfg->vp_num &
  265. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VP_NUM_BMSK) <<
  266. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VP_NUM_SHFT;
  267. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_PMAC_ID_BMSK;
  268. reg_val |= (cfg->pmac_id &
  269. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_PMAC_ID_BMSK) <<
  270. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_PMAC_ID_SHFT;
  271. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_BANK_ID_BMSK;
  272. reg_val |= (cfg->bank_id &
  273. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_BANK_ID_BMSK) <<
  274. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_BANK_ID_SHFT;
  275. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VDEV_ID_BMSK;
  276. reg_val |= (cfg->vdev_id &
  277. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VDEV_ID_BMSK) <<
  278. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VDEV_ID_SHFT;
  279. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_SEARCH_INDEX_REG_NUM_BMSK;
  280. reg_val |=
  281. (cfg->search_idx_reg_num &
  282. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_SEARCH_INDEX_REG_NUM_BMSK) <<
  283. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_SEARCH_INDEX_REG_NUM_SHFT;
  284. reg_val &=
  285. ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK;
  286. reg_val |=
  287. (cfg->use_ppe_int_pri &
  288. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK) <<
  289. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_SHFT;
  290. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_TO_FW_BMSK;
  291. reg_val |= (cfg->to_fw &
  292. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_TO_FW_BMSK) <<
  293. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_TO_FW_SHFT;
  294. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_DROP_PREC_ENABLE_BMSK;
  295. reg_val |= (cfg->drop_prec_enable &
  296. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_DROP_PREC_ENABLE_BMSK) <<
  297. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_DROP_PREC_ENABLE_SHFT;
  298. HAL_REG_WRITE(soc, reg_addr, reg_val);
  299. }
  300. /**
  301. * hal_tx_set_ppe_pri2tid_map1_9224()
  302. * @hal_soc_hdl: HAL SoC handle
  303. * @val : PRI to TID value
  304. * @map_no: Map number
  305. *
  306. * Return: void
  307. */
  308. static inline
  309. void hal_tx_set_ppe_pri2tid_map_9224(hal_soc_handle_t hal_soc_hdl,
  310. uint32_t val, uint8_t map_no)
  311. {
  312. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  313. uint32_t reg_addr, reg_val = 0;
  314. if (map_no == 0)
  315. reg_addr =
  316. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_ADDR(MAC_TCL_REG_REG_BASE);
  317. else
  318. reg_addr =
  319. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_ADDR(MAC_TCL_REG_REG_BASE);
  320. reg_val |= val;
  321. HAL_REG_WRITE(soc, reg_addr, reg_val);
  322. }
  323. /**
  324. * hal_tx_set_ppe_pri2tid_map1_9224()
  325. * @hal_soc_hdl: HAL SoC handle
  326. * @val : PRI to TID value
  327. * @map_no: Map number
  328. *
  329. * Return: void
  330. */
  331. static inline
  332. void hal_tx_enable_pri2tid_map_9224(hal_soc_handle_t hal_soc_hdl,
  333. bool val, uint8_t ppe_vp_idx)
  334. {
  335. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  336. uint32_t reg_addr, reg_val = 0;
  337. reg_addr = HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_ADDR(MAC_TCL_REG_REG_BASE,
  338. ppe_vp_idx);
  339. /*
  340. * Drop precedence is enabled by default.
  341. */
  342. reg_val = HAL_REG_READ(soc, reg_addr);
  343. reg_val &=
  344. ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK;
  345. reg_val |=
  346. (val &
  347. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK) <<
  348. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_SHFT;
  349. HAL_REG_WRITE(soc, reg_addr, reg_val);
  350. }
  351. /**
  352. * hal_tx_update_ppe_pri2tid_9224()
  353. * @hal_soc_hdl: HAL SoC handle
  354. * @pri: INT_PRI
  355. * @tid: Wi-Fi TID
  356. *
  357. * Return: void
  358. */
  359. static inline
  360. void hal_tx_update_ppe_pri2tid_9224(hal_soc_handle_t hal_soc_hdl,
  361. uint8_t pri, uint8_t tid)
  362. {
  363. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  364. uint32_t reg_addr, reg_val = 0, mask, shift;
  365. /*
  366. * INT_PRI 0..9 is in MAP0 register and INT_PRI 10..15
  367. * is in MAP1 register.
  368. */
  369. switch (pri) {
  370. case 0 ... 9:
  371. reg_addr =
  372. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_ADDR(MAC_TCL_REG_REG_BASE);
  373. mask =
  374. (HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_INT_PRI_0_BMSK << (0x3 * pri));
  375. shift = HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_INT_PRI_0_SHFT + (pri * 0x3);
  376. break;
  377. case 10 ... 15:
  378. pri = pri - 10;
  379. reg_addr =
  380. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_ADDR(MAC_TCL_REG_REG_BASE);
  381. mask =
  382. (HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_INT_PRI_10_BMSK << (0x3 * pri));
  383. shift =
  384. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_INT_PRI_10_SHFT + (pri * 0x3);
  385. break;
  386. default:
  387. return;
  388. }
  389. reg_val = HAL_REG_READ(soc, reg_addr);
  390. reg_val &= ~mask;
  391. reg_val |= (pri << shift) & mask;
  392. HAL_REG_WRITE(soc, reg_addr, reg_val);
  393. }
  394. #endif /* _HAL_9224_TX_H_ */