1d5c65159SKalle Valo // SPDX-License-Identifier: BSD-3-Clause-Clear 2d5c65159SKalle Valo /* 3d5c65159SKalle Valo * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. 4d5c65159SKalle Valo */ 5d5c65159SKalle Valo 6d5c65159SKalle Valo #include "ahb.h" 7d5c65159SKalle Valo #include "hal.h" 8d5c65159SKalle Valo #include "hal_tx.h" 9d5c65159SKalle Valo 10d5c65159SKalle Valo #define DSCP_TID_MAP_TBL_ENTRY_SIZE 64 11d5c65159SKalle Valo 12d5c65159SKalle Valo /* dscp_tid_map - Default DSCP-TID mapping 13d5c65159SKalle Valo * 14d5c65159SKalle Valo * DSCP TID 15d5c65159SKalle Valo * 000000 0 16d5c65159SKalle Valo * 001000 1 17d5c65159SKalle Valo * 010000 2 18d5c65159SKalle Valo * 011000 3 19d5c65159SKalle Valo * 100000 4 20d5c65159SKalle Valo * 101000 5 21d5c65159SKalle Valo * 110000 6 22d5c65159SKalle Valo * 111000 7 23d5c65159SKalle Valo */ 24d5c65159SKalle Valo static const u8 dscp_tid_map[DSCP_TID_MAP_TBL_ENTRY_SIZE] = { 25d5c65159SKalle Valo 0, 0, 0, 0, 0, 0, 0, 0, 26d5c65159SKalle Valo 1, 1, 1, 1, 1, 1, 1, 1, 27d5c65159SKalle Valo 2, 2, 2, 2, 2, 2, 2, 2, 28d5c65159SKalle Valo 3, 3, 3, 3, 3, 3, 3, 3, 29d5c65159SKalle Valo 4, 4, 4, 4, 4, 4, 4, 4, 30d5c65159SKalle Valo 5, 5, 5, 5, 5, 5, 5, 5, 31d5c65159SKalle Valo 6, 6, 6, 6, 6, 6, 6, 6, 32d5c65159SKalle Valo 7, 7, 7, 7, 7, 7, 7, 7, 33d5c65159SKalle Valo }; 34d5c65159SKalle Valo 35d5c65159SKalle Valo void ath11k_hal_tx_cmd_desc_setup(struct ath11k_base *ab, void *cmd, 36d5c65159SKalle Valo struct hal_tx_info *ti) 37d5c65159SKalle Valo { 38d5c65159SKalle Valo struct hal_tcl_data_cmd *tcl_cmd = (struct hal_tcl_data_cmd *)cmd; 39d5c65159SKalle Valo 40d5c65159SKalle Valo tcl_cmd->buf_addr_info.info0 = 41d5c65159SKalle Valo FIELD_PREP(BUFFER_ADDR_INFO0_ADDR, ti->paddr); 42d5c65159SKalle Valo tcl_cmd->buf_addr_info.info1 = 43d5c65159SKalle Valo FIELD_PREP(BUFFER_ADDR_INFO1_ADDR, 44d5c65159SKalle Valo ((uint64_t)ti->paddr >> HAL_ADDR_MSB_REG_SHIFT)); 45d5c65159SKalle Valo tcl_cmd->buf_addr_info.info1 |= 46d5c65159SKalle Valo FIELD_PREP(BUFFER_ADDR_INFO1_RET_BUF_MGR, 47d5c65159SKalle Valo (ti->ring_id + HAL_RX_BUF_RBM_SW0_BM)) | 48d5c65159SKalle Valo FIELD_PREP(BUFFER_ADDR_INFO1_SW_COOKIE, ti->desc_id); 49d5c65159SKalle Valo 50d5c65159SKalle Valo tcl_cmd->info0 = 51d5c65159SKalle Valo FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_DESC_TYPE, ti->type) | 52d5c65159SKalle Valo FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_ENCAP_TYPE, ti->encap_type) | 53d5c65159SKalle Valo FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_ENCRYPT_TYPE, 54d5c65159SKalle Valo ti->encrypt_type) | 550f37fbf4SAnilkumar Kolli FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_SEARCH_TYPE, 560f37fbf4SAnilkumar Kolli ti->search_type) | 570f37fbf4SAnilkumar Kolli FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_ADDR_EN, 58d5c65159SKalle Valo ti->addr_search_flags) | 59d5c65159SKalle Valo FIELD_PREP(HAL_TCL_DATA_CMD_INFO0_CMD_NUM, 60d5c65159SKalle Valo ti->meta_data_flags); 61d5c65159SKalle Valo 62d5c65159SKalle Valo tcl_cmd->info1 = ti->flags0 | 63d5c65159SKalle Valo FIELD_PREP(HAL_TCL_DATA_CMD_INFO1_DATA_LEN, ti->data_len) | 64d5c65159SKalle Valo FIELD_PREP(HAL_TCL_DATA_CMD_INFO1_PKT_OFFSET, ti->pkt_offset); 65d5c65159SKalle Valo 66d5c65159SKalle Valo tcl_cmd->info2 = ti->flags1 | 67d5c65159SKalle Valo FIELD_PREP(HAL_TCL_DATA_CMD_INFO2_TID, ti->tid) | 68d5c65159SKalle Valo FIELD_PREP(HAL_TCL_DATA_CMD_INFO2_LMAC_ID, ti->lmac_id); 69d5c65159SKalle Valo 70d5c65159SKalle Valo tcl_cmd->info3 = FIELD_PREP(HAL_TCL_DATA_CMD_INFO3_DSCP_TID_TABLE_IDX, 71d5c65159SKalle Valo ti->dscp_tid_tbl_idx) | 72d5c65159SKalle Valo FIELD_PREP(HAL_TCL_DATA_CMD_INFO3_SEARCH_INDEX, 73d5c65159SKalle Valo ti->bss_ast_hash); 74*bde4d95eSJohn Crispin tcl_cmd->info4 = 0; 75d5c65159SKalle Valo } 76d5c65159SKalle Valo 77d5c65159SKalle Valo void ath11k_hal_tx_set_dscp_tid_map(struct ath11k_base *ab, int id) 78d5c65159SKalle Valo { 79d5c65159SKalle Valo u32 ctrl_reg_val; 80d5c65159SKalle Valo u32 addr; 81d5c65159SKalle Valo u8 hw_map_val[HAL_DSCP_TID_TBL_SIZE]; 82d5c65159SKalle Valo int i; 83d5c65159SKalle Valo u32 value; 84d5c65159SKalle Valo int cnt = 0; 85d5c65159SKalle Valo 86d5c65159SKalle Valo ctrl_reg_val = ath11k_ahb_read32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG + 87d5c65159SKalle Valo HAL_TCL1_RING_CMN_CTRL_REG); 88d5c65159SKalle Valo /* Enable read/write access */ 89d5c65159SKalle Valo ctrl_reg_val |= HAL_TCL1_RING_CMN_CTRL_DSCP_TID_MAP_PROG_EN; 90d5c65159SKalle Valo ath11k_ahb_write32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG + 91d5c65159SKalle Valo HAL_TCL1_RING_CMN_CTRL_REG, ctrl_reg_val); 92d5c65159SKalle Valo 93d5c65159SKalle Valo addr = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_DSCP_TID_MAP + 94d5c65159SKalle Valo (4 * id * (HAL_DSCP_TID_TBL_SIZE / 4)); 95d5c65159SKalle Valo 96d5c65159SKalle Valo /* Configure each DSCP-TID mapping in three bits there by configure 97d5c65159SKalle Valo * three bytes in an iteration. 98d5c65159SKalle Valo */ 99d5c65159SKalle Valo for (i = 0; i < DSCP_TID_MAP_TBL_ENTRY_SIZE; i += 8) { 100d5c65159SKalle Valo value = FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP0, 101d5c65159SKalle Valo dscp_tid_map[i]) | 102d5c65159SKalle Valo FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP1, 103d5c65159SKalle Valo dscp_tid_map[i + 1]) | 104d5c65159SKalle Valo FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP2, 105d5c65159SKalle Valo dscp_tid_map[i + 2]) | 106d5c65159SKalle Valo FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP3, 107d5c65159SKalle Valo dscp_tid_map[i + 3]) | 108d5c65159SKalle Valo FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP4, 109d5c65159SKalle Valo dscp_tid_map[i + 4]) | 110d5c65159SKalle Valo FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP5, 111d5c65159SKalle Valo dscp_tid_map[i + 5]) | 112d5c65159SKalle Valo FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP6, 113d5c65159SKalle Valo dscp_tid_map[i + 6]) | 114d5c65159SKalle Valo FIELD_PREP(HAL_TCL1_RING_FIELD_DSCP_TID_MAP7, 115d5c65159SKalle Valo dscp_tid_map[i + 7]); 116d5c65159SKalle Valo memcpy(&hw_map_val[cnt], (u8 *)&value, 3); 117d5c65159SKalle Valo cnt += 3; 118d5c65159SKalle Valo } 119d5c65159SKalle Valo 120d5c65159SKalle Valo for (i = 0; i < HAL_DSCP_TID_TBL_SIZE; i += 4) { 121d5c65159SKalle Valo ath11k_ahb_write32(ab, addr, *(u32 *)&hw_map_val[i]); 122d5c65159SKalle Valo addr += 4; 123d5c65159SKalle Valo } 124d5c65159SKalle Valo 125d5c65159SKalle Valo /* Disable read/write access */ 126d5c65159SKalle Valo ctrl_reg_val = ath11k_ahb_read32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG + 127d5c65159SKalle Valo HAL_TCL1_RING_CMN_CTRL_REG); 128d5c65159SKalle Valo ctrl_reg_val &= ~HAL_TCL1_RING_CMN_CTRL_DSCP_TID_MAP_PROG_EN; 129d5c65159SKalle Valo ath11k_ahb_write32(ab, HAL_SEQ_WCSS_UMAC_TCL_REG + 130d5c65159SKalle Valo HAL_TCL1_RING_CMN_CTRL_REG, 131d5c65159SKalle Valo ctrl_reg_val); 132d5c65159SKalle Valo } 133d5c65159SKalle Valo 134d5c65159SKalle Valo void ath11k_hal_tx_init_data_ring(struct ath11k_base *ab, struct hal_srng *srng) 135d5c65159SKalle Valo { 136d5c65159SKalle Valo struct hal_srng_params params; 137d5c65159SKalle Valo struct hal_tlv_hdr *tlv; 138d5c65159SKalle Valo int i, entry_size; 139d5c65159SKalle Valo u8 *desc; 140d5c65159SKalle Valo 141d5c65159SKalle Valo memset(¶ms, 0, sizeof(params)); 142d5c65159SKalle Valo 143d5c65159SKalle Valo entry_size = ath11k_hal_srng_get_entrysize(HAL_TCL_DATA); 144d5c65159SKalle Valo ath11k_hal_srng_get_params(ab, srng, ¶ms); 145d5c65159SKalle Valo desc = (u8 *)params.ring_base_vaddr; 146d5c65159SKalle Valo 147d5c65159SKalle Valo for (i = 0; i < params.num_entries; i++) { 148d5c65159SKalle Valo tlv = (struct hal_tlv_hdr *)desc; 149d5c65159SKalle Valo tlv->tl = FIELD_PREP(HAL_TLV_HDR_TAG, HAL_TCL_DATA_CMD) | 150d5c65159SKalle Valo FIELD_PREP(HAL_TLV_HDR_LEN, 151d5c65159SKalle Valo sizeof(struct hal_tcl_data_cmd)); 152d5c65159SKalle Valo desc += entry_size; 153d5c65159SKalle Valo } 154d5c65159SKalle Valo } 155