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