xref: /freebsd/sys/contrib/dev/athk/ath12k/wifi7/hal_tx.c (revision 60bac4d6438b6bcb3d7b439684211d05396d90ce)
1*60bac4d6SBjoern A. Zeeb // SPDX-License-Identifier: BSD-3-Clause-Clear
2*60bac4d6SBjoern A. Zeeb /*
3*60bac4d6SBjoern A. Zeeb  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4*60bac4d6SBjoern A. Zeeb  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
5*60bac4d6SBjoern A. Zeeb  */
6*60bac4d6SBjoern A. Zeeb 
7*60bac4d6SBjoern A. Zeeb #include "../hal.h"
8*60bac4d6SBjoern A. Zeeb #include "hal_tx.h"
9*60bac4d6SBjoern A. Zeeb #include "../hif.h"
10*60bac4d6SBjoern A. Zeeb #include "hal.h"
11*60bac4d6SBjoern A. Zeeb 
12*60bac4d6SBjoern A. Zeeb #define DSCP_TID_MAP_TBL_ENTRY_SIZE 64
13*60bac4d6SBjoern A. Zeeb 
14*60bac4d6SBjoern A. Zeeb /* dscp_tid_map - Default DSCP-TID mapping
15*60bac4d6SBjoern A. Zeeb  *=================
16*60bac4d6SBjoern A. Zeeb  * DSCP        TID
17*60bac4d6SBjoern A. Zeeb  *=================
18*60bac4d6SBjoern A. Zeeb  * 000xxx      0
19*60bac4d6SBjoern A. Zeeb  * 001xxx      1
20*60bac4d6SBjoern A. Zeeb  * 010xxx      2
21*60bac4d6SBjoern A. Zeeb  * 011xxx      3
22*60bac4d6SBjoern A. Zeeb  * 100xxx      4
23*60bac4d6SBjoern A. Zeeb  * 101xxx      5
24*60bac4d6SBjoern A. Zeeb  * 110xxx      6
25*60bac4d6SBjoern A. Zeeb  * 111xxx      7
26*60bac4d6SBjoern A. Zeeb  */
dscp2tid(u8 dscp)27*60bac4d6SBjoern A. Zeeb static inline u8 dscp2tid(u8 dscp)
28*60bac4d6SBjoern A. Zeeb {
29*60bac4d6SBjoern A. Zeeb 	return dscp >> 3;
30*60bac4d6SBjoern A. Zeeb }
31*60bac4d6SBjoern A. Zeeb 
ath12k_wifi7_hal_tx_cmd_desc_setup(struct ath12k_base * ab,struct hal_tcl_data_cmd * tcl_cmd,struct hal_tx_info * ti)32*60bac4d6SBjoern A. Zeeb void ath12k_wifi7_hal_tx_cmd_desc_setup(struct ath12k_base *ab,
33*60bac4d6SBjoern A. Zeeb 					struct hal_tcl_data_cmd *tcl_cmd,
34*60bac4d6SBjoern A. Zeeb 					struct hal_tx_info *ti)
35*60bac4d6SBjoern A. Zeeb {
36*60bac4d6SBjoern A. Zeeb 	tcl_cmd->buf_addr_info.info0 =
37*60bac4d6SBjoern A. Zeeb 		le32_encode_bits(ti->paddr, BUFFER_ADDR_INFO0_ADDR);
38*60bac4d6SBjoern A. Zeeb 	tcl_cmd->buf_addr_info.info1 =
39*60bac4d6SBjoern A. Zeeb 		le32_encode_bits(((uint64_t)ti->paddr >> HAL_ADDR_MSB_REG_SHIFT),
40*60bac4d6SBjoern A. Zeeb 				 BUFFER_ADDR_INFO1_ADDR);
41*60bac4d6SBjoern A. Zeeb 	tcl_cmd->buf_addr_info.info1 |=
42*60bac4d6SBjoern A. Zeeb 		le32_encode_bits((ti->rbm_id), BUFFER_ADDR_INFO1_RET_BUF_MGR) |
43*60bac4d6SBjoern A. Zeeb 		le32_encode_bits(ti->desc_id, BUFFER_ADDR_INFO1_SW_COOKIE);
44*60bac4d6SBjoern A. Zeeb 
45*60bac4d6SBjoern A. Zeeb 	tcl_cmd->info0 =
46*60bac4d6SBjoern A. Zeeb 		le32_encode_bits(ti->type, HAL_TCL_DATA_CMD_INFO0_DESC_TYPE) |
47*60bac4d6SBjoern A. Zeeb 		le32_encode_bits(ti->bank_id, HAL_TCL_DATA_CMD_INFO0_BANK_ID);
48*60bac4d6SBjoern A. Zeeb 
49*60bac4d6SBjoern A. Zeeb 	tcl_cmd->info1 =
50*60bac4d6SBjoern A. Zeeb 		le32_encode_bits(ti->meta_data_flags,
51*60bac4d6SBjoern A. Zeeb 				 HAL_TCL_DATA_CMD_INFO1_CMD_NUM);
52*60bac4d6SBjoern A. Zeeb 
53*60bac4d6SBjoern A. Zeeb 	tcl_cmd->info2 = cpu_to_le32(ti->flags0) |
54*60bac4d6SBjoern A. Zeeb 		le32_encode_bits(ti->data_len, HAL_TCL_DATA_CMD_INFO2_DATA_LEN) |
55*60bac4d6SBjoern A. Zeeb 		le32_encode_bits(ti->pkt_offset, HAL_TCL_DATA_CMD_INFO2_PKT_OFFSET);
56*60bac4d6SBjoern A. Zeeb 
57*60bac4d6SBjoern A. Zeeb 	tcl_cmd->info3 = cpu_to_le32(ti->flags1) |
58*60bac4d6SBjoern A. Zeeb 		le32_encode_bits(ti->tid, HAL_TCL_DATA_CMD_INFO3_TID) |
59*60bac4d6SBjoern A. Zeeb 		le32_encode_bits(ti->lmac_id, HAL_TCL_DATA_CMD_INFO3_PMAC_ID) |
60*60bac4d6SBjoern A. Zeeb 		le32_encode_bits(ti->vdev_id, HAL_TCL_DATA_CMD_INFO3_VDEV_ID);
61*60bac4d6SBjoern A. Zeeb 
62*60bac4d6SBjoern A. Zeeb 	tcl_cmd->info4 = le32_encode_bits(ti->bss_ast_idx,
63*60bac4d6SBjoern A. Zeeb 					  HAL_TCL_DATA_CMD_INFO4_SEARCH_INDEX) |
64*60bac4d6SBjoern A. Zeeb 			 le32_encode_bits(ti->bss_ast_hash,
65*60bac4d6SBjoern A. Zeeb 					  HAL_TCL_DATA_CMD_INFO4_CACHE_SET_NUM);
66*60bac4d6SBjoern A. Zeeb 	tcl_cmd->info5 = 0;
67*60bac4d6SBjoern A. Zeeb }
68*60bac4d6SBjoern A. Zeeb 
ath12k_wifi7_hal_tx_set_dscp_tid_map(struct ath12k_base * ab,int id)69*60bac4d6SBjoern A. Zeeb void ath12k_wifi7_hal_tx_set_dscp_tid_map(struct ath12k_base *ab, int id)
70*60bac4d6SBjoern A. Zeeb {
71*60bac4d6SBjoern A. Zeeb 	u32 ctrl_reg_val;
72*60bac4d6SBjoern A. Zeeb 	u32 addr;
73*60bac4d6SBjoern A. Zeeb 	u8 hw_map_val[HAL_DSCP_TID_TBL_SIZE], dscp, tid;
74*60bac4d6SBjoern A. Zeeb 	int i;
75*60bac4d6SBjoern A. Zeeb 	u32 value;
76*60bac4d6SBjoern A. Zeeb 
77*60bac4d6SBjoern A. Zeeb 	ctrl_reg_val = ath12k_hif_read32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG +
78*60bac4d6SBjoern A. Zeeb 					 HAL_TCL1_RING_CMN_CTRL_REG);
79*60bac4d6SBjoern A. Zeeb 	/* Enable read/write access */
80*60bac4d6SBjoern A. Zeeb 	ctrl_reg_val |= HAL_TCL1_RING_CMN_CTRL_DSCP_TID_MAP_PROG_EN;
81*60bac4d6SBjoern A. Zeeb 	ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG +
82*60bac4d6SBjoern A. Zeeb 			   HAL_TCL1_RING_CMN_CTRL_REG, ctrl_reg_val);
83*60bac4d6SBjoern A. Zeeb 
84*60bac4d6SBjoern A. Zeeb 	addr = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_DSCP_TID_MAP +
85*60bac4d6SBjoern A. Zeeb 	       (4 * id * (HAL_DSCP_TID_TBL_SIZE / 4));
86*60bac4d6SBjoern A. Zeeb 
87*60bac4d6SBjoern A. Zeeb 	/* Configure each DSCP-TID mapping in three bits there by configure
88*60bac4d6SBjoern A. Zeeb 	 * three bytes in an iteration.
89*60bac4d6SBjoern A. Zeeb 	 */
90*60bac4d6SBjoern A. Zeeb 	for (i = 0, dscp = 0; i < HAL_DSCP_TID_TBL_SIZE; i += 3) {
91*60bac4d6SBjoern A. Zeeb 		tid = dscp2tid(dscp);
92*60bac4d6SBjoern A. Zeeb 		value = u32_encode_bits(tid, HAL_TCL1_RING_FIELD_DSCP_TID_MAP0);
93*60bac4d6SBjoern A. Zeeb 		dscp++;
94*60bac4d6SBjoern A. Zeeb 
95*60bac4d6SBjoern A. Zeeb 		tid = dscp2tid(dscp);
96*60bac4d6SBjoern A. Zeeb 		value |= u32_encode_bits(tid, HAL_TCL1_RING_FIELD_DSCP_TID_MAP1);
97*60bac4d6SBjoern A. Zeeb 		dscp++;
98*60bac4d6SBjoern A. Zeeb 
99*60bac4d6SBjoern A. Zeeb 		tid = dscp2tid(dscp);
100*60bac4d6SBjoern A. Zeeb 		value |= u32_encode_bits(tid, HAL_TCL1_RING_FIELD_DSCP_TID_MAP2);
101*60bac4d6SBjoern A. Zeeb 		dscp++;
102*60bac4d6SBjoern A. Zeeb 
103*60bac4d6SBjoern A. Zeeb 		tid = dscp2tid(dscp);
104*60bac4d6SBjoern A. Zeeb 		value |= u32_encode_bits(tid, HAL_TCL1_RING_FIELD_DSCP_TID_MAP3);
105*60bac4d6SBjoern A. Zeeb 		dscp++;
106*60bac4d6SBjoern A. Zeeb 
107*60bac4d6SBjoern A. Zeeb 		tid = dscp2tid(dscp);
108*60bac4d6SBjoern A. Zeeb 		value |= u32_encode_bits(tid, HAL_TCL1_RING_FIELD_DSCP_TID_MAP4);
109*60bac4d6SBjoern A. Zeeb 		dscp++;
110*60bac4d6SBjoern A. Zeeb 
111*60bac4d6SBjoern A. Zeeb 		tid = dscp2tid(dscp);
112*60bac4d6SBjoern A. Zeeb 		value |= u32_encode_bits(tid, HAL_TCL1_RING_FIELD_DSCP_TID_MAP5);
113*60bac4d6SBjoern A. Zeeb 		dscp++;
114*60bac4d6SBjoern A. Zeeb 
115*60bac4d6SBjoern A. Zeeb 		tid = dscp2tid(dscp);
116*60bac4d6SBjoern A. Zeeb 		value |= u32_encode_bits(tid, HAL_TCL1_RING_FIELD_DSCP_TID_MAP6);
117*60bac4d6SBjoern A. Zeeb 		dscp++;
118*60bac4d6SBjoern A. Zeeb 
119*60bac4d6SBjoern A. Zeeb 		tid = dscp2tid(dscp);
120*60bac4d6SBjoern A. Zeeb 		value |= u32_encode_bits(tid, HAL_TCL1_RING_FIELD_DSCP_TID_MAP7);
121*60bac4d6SBjoern A. Zeeb 		dscp++;
122*60bac4d6SBjoern A. Zeeb 
123*60bac4d6SBjoern A. Zeeb 		memcpy(&hw_map_val[i], &value, 3);
124*60bac4d6SBjoern A. Zeeb 	}
125*60bac4d6SBjoern A. Zeeb 
126*60bac4d6SBjoern A. Zeeb 	for (i = 0; i < HAL_DSCP_TID_TBL_SIZE; i += 4) {
127*60bac4d6SBjoern A. Zeeb 		ath12k_hif_write32(ab, addr, *(u32 *)&hw_map_val[i]);
128*60bac4d6SBjoern A. Zeeb 		addr += 4;
129*60bac4d6SBjoern A. Zeeb 	}
130*60bac4d6SBjoern A. Zeeb 
131*60bac4d6SBjoern A. Zeeb 	/* Disable read/write access */
132*60bac4d6SBjoern A. Zeeb 	ctrl_reg_val = ath12k_hif_read32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG +
133*60bac4d6SBjoern A. Zeeb 					 HAL_TCL1_RING_CMN_CTRL_REG);
134*60bac4d6SBjoern A. Zeeb 	ctrl_reg_val &= ~HAL_TCL1_RING_CMN_CTRL_DSCP_TID_MAP_PROG_EN;
135*60bac4d6SBjoern A. Zeeb 	ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG +
136*60bac4d6SBjoern A. Zeeb 			   HAL_TCL1_RING_CMN_CTRL_REG,
137*60bac4d6SBjoern A. Zeeb 			   ctrl_reg_val);
138*60bac4d6SBjoern A. Zeeb }
139