1 /* 2 * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above 10 * copyright notice, this list of conditions and the following 11 * disclaimer in the documentation and/or other materials provided 12 * with the distribution. 13 * * Neither the name of The Linux Foundation nor the names of its 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #ifndef _HAL_INTERNAL_H_ 31 #define _HAL_INTERNAL_H_ 32 33 #include "qdf_types.h" 34 #include "qdf_lock.h" 35 #include "qdf_mem.h" 36 #include "qdf_nbuf.h" 37 #include "wcss_seq_hwiobase.h" 38 #include "tlv_hdr.h" 39 #include "tlv_tag_def.h" 40 #include "reo_destination_ring.h" 41 #include "reo_reg_seq_hwioreg.h" 42 #include "reo_entrance_ring.h" 43 #include "reo_get_queue_stats.h" 44 #include "reo_get_queue_stats_status.h" 45 #include "tcl_data_cmd.h" 46 #include "tcl_gse_cmd.h" 47 #include "tcl_status_ring.h" 48 #include "mac_tcl_reg_seq_hwioreg.h" 49 #include "ce_src_desc.h" 50 #include "ce_stat_desc.h" 51 #include "wfss_ce_reg_seq_hwioreg.h" 52 #include "wbm_link_descriptor_ring.h" 53 #include "wbm_reg_seq_hwioreg.h" 54 #include "wbm_buffer_ring.h" 55 #include "wbm_release_ring.h" 56 #include "rx_msdu_desc_info.h" 57 #include "rx_mpdu_start.h" 58 #include "rx_mpdu_end.h" 59 #include "rx_msdu_start.h" 60 #include "rx_msdu_end.h" 61 #include "rx_attention.h" 62 #include "rx_ppdu_start.h" 63 #include "rx_ppdu_start_user_info.h" 64 #include "rx_ppdu_end_user_stats.h" 65 #include "rx_ppdu_end_user_stats_ext.h" 66 #include "rx_mpdu_desc_info.h" 67 #include "rxpcu_ppdu_end_info.h" 68 #include "phyrx_he_sig_a_su.h" 69 #include "phyrx_he_sig_a_mu_dl.h" 70 #include "phyrx_he_sig_b1_mu.h" 71 #include "phyrx_he_sig_b2_mu.h" 72 #include "phyrx_he_sig_b2_ofdma.h" 73 #include "phyrx_l_sig_a.h" 74 #include "phyrx_l_sig_b.h" 75 #include "phyrx_vht_sig_a.h" 76 #include "phyrx_ht_sig.h" 77 #include "tx_msdu_extension.h" 78 #include "receive_rssi_info.h" 79 #include "phyrx_pkt_end.h" 80 #include "phyrx_rssi_legacy.h" 81 #include "wcss_version.h" 82 #include "pld_common.h" 83 #include "rx_msdu_link.h" 84 85 #ifdef QCA_WIFI_QCA6290_11AX 86 #include "phyrx_other_receive_info_ru_details.h" 87 #endif /* QCA_WIFI_QCA6290_11AX */ 88 89 #ifdef FEATURE_PERPKT_INFO 90 #include "rx_header.h" 91 #endif /* FEATURE_PERPKT_INFO */ 92 93 /* TBD: This should be movded to shared HW header file */ 94 enum hal_srng_ring_id { 95 /* UMAC rings */ 96 HAL_SRNG_REO2SW1 = 0, 97 HAL_SRNG_REO2SW2 = 1, 98 HAL_SRNG_REO2SW3 = 2, 99 HAL_SRNG_REO2SW4 = 3, 100 HAL_SRNG_REO2TCL = 4, 101 HAL_SRNG_SW2REO = 5, 102 /* 6-7 unused */ 103 HAL_SRNG_REO_CMD = 8, 104 HAL_SRNG_REO_STATUS = 9, 105 /* 10-15 unused */ 106 HAL_SRNG_SW2TCL1 = 16, 107 HAL_SRNG_SW2TCL2 = 17, 108 HAL_SRNG_SW2TCL3 = 18, 109 HAL_SRNG_SW2TCL4 = 19, /* FW2TCL ring */ 110 /* 20-23 unused */ 111 HAL_SRNG_SW2TCL_CMD = 24, 112 HAL_SRNG_TCL_STATUS = 25, 113 /* 26-31 unused */ 114 HAL_SRNG_CE_0_SRC = 32, 115 HAL_SRNG_CE_1_SRC = 33, 116 HAL_SRNG_CE_2_SRC = 34, 117 HAL_SRNG_CE_3_SRC = 35, 118 HAL_SRNG_CE_4_SRC = 36, 119 HAL_SRNG_CE_5_SRC = 37, 120 HAL_SRNG_CE_6_SRC = 38, 121 HAL_SRNG_CE_7_SRC = 39, 122 HAL_SRNG_CE_8_SRC = 40, 123 HAL_SRNG_CE_9_SRC = 41, 124 HAL_SRNG_CE_10_SRC = 42, 125 HAL_SRNG_CE_11_SRC = 43, 126 /* 44-55 unused */ 127 HAL_SRNG_CE_0_DST = 56, 128 HAL_SRNG_CE_1_DST = 57, 129 HAL_SRNG_CE_2_DST = 58, 130 HAL_SRNG_CE_3_DST = 59, 131 HAL_SRNG_CE_4_DST = 60, 132 HAL_SRNG_CE_5_DST = 61, 133 HAL_SRNG_CE_6_DST = 62, 134 HAL_SRNG_CE_7_DST = 63, 135 HAL_SRNG_CE_8_DST = 64, 136 HAL_SRNG_CE_9_DST = 65, 137 HAL_SRNG_CE_10_DST = 66, 138 HAL_SRNG_CE_11_DST = 67, 139 /* 68-79 unused */ 140 HAL_SRNG_CE_0_DST_STATUS = 80, 141 HAL_SRNG_CE_1_DST_STATUS = 81, 142 HAL_SRNG_CE_2_DST_STATUS = 82, 143 HAL_SRNG_CE_3_DST_STATUS = 83, 144 HAL_SRNG_CE_4_DST_STATUS = 84, 145 HAL_SRNG_CE_5_DST_STATUS = 85, 146 HAL_SRNG_CE_6_DST_STATUS = 86, 147 HAL_SRNG_CE_7_DST_STATUS = 87, 148 HAL_SRNG_CE_8_DST_STATUS = 88, 149 HAL_SRNG_CE_9_DST_STATUS = 89, 150 HAL_SRNG_CE_10_DST_STATUS = 90, 151 HAL_SRNG_CE_11_DST_STATUS = 91, 152 /* 92-103 unused */ 153 HAL_SRNG_WBM_IDLE_LINK = 104, 154 HAL_SRNG_WBM_SW_RELEASE = 105, 155 HAL_SRNG_WBM2SW0_RELEASE = 106, 156 HAL_SRNG_WBM2SW1_RELEASE = 107, 157 HAL_SRNG_WBM2SW2_RELEASE = 108, 158 HAL_SRNG_WBM2SW3_RELEASE = 109, 159 /* 110-127 unused */ 160 HAL_SRNG_UMAC_ID_END = 127, 161 /* LMAC rings - The following set will be replicated for each LMAC */ 162 HAL_SRNG_LMAC1_ID_START = 128, 163 HAL_SRNG_WMAC1_SW2RXDMA0_BUF0 = HAL_SRNG_LMAC1_ID_START, 164 #ifdef IPA_OFFLOAD 165 HAL_SRNG_WMAC1_SW2RXDMA0_BUF1 = (HAL_SRNG_LMAC1_ID_START + 1), 166 HAL_SRNG_WMAC1_SW2RXDMA0_BUF2 = (HAL_SRNG_LMAC1_ID_START + 2), 167 HAL_SRNG_WMAC1_SW2RXDMA1_BUF = (HAL_SRNG_WMAC1_SW2RXDMA0_BUF2 + 1), 168 #else 169 HAL_SRNG_WMAC1_SW2RXDMA1_BUF = (HAL_SRNG_WMAC1_SW2RXDMA0_BUF0 + 1), 170 #endif 171 HAL_SRNG_WMAC1_SW2RXDMA2_BUF = (HAL_SRNG_WMAC1_SW2RXDMA1_BUF + 1), 172 HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF = (HAL_SRNG_WMAC1_SW2RXDMA2_BUF + 1), 173 HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF = 174 (HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF + 1), 175 HAL_SRNG_WMAC1_RXDMA2SW0 = (HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF + 1), 176 HAL_SRNG_WMAC1_RXDMA2SW1 = (HAL_SRNG_WMAC1_RXDMA2SW0 + 1), 177 HAL_SRNG_WMAC1_SW2RXDMA1_DESC = (HAL_SRNG_WMAC1_RXDMA2SW1 + 1), 178 #ifdef WLAN_FEATURE_CIF_CFR 179 HAL_SRNG_WIFI_POS_SRC_DMA_RING = (HAL_SRNG_WMAC1_SW2RXDMA1_DESC + 1), 180 HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING = (HAL_SRNG_WIFI_POS_SRC_DMA_RING + 1), 181 #else 182 HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING = (HAL_SRNG_WMAC1_SW2RXDMA1_DESC + 1), 183 #endif 184 /* -142 unused */ 185 HAL_SRNG_LMAC1_ID_END = 143 186 }; 187 188 #define HAL_SRNG_REO_EXCEPTION HAL_SRNG_REO2SW1 189 #define HAL_SRNG_REO_ALTERNATE_SELECT 0x7 190 191 #define HAL_MAX_LMACS 3 192 #define HAL_MAX_RINGS_PER_LMAC (HAL_SRNG_LMAC1_ID_END - HAL_SRNG_LMAC1_ID_START) 193 #define HAL_MAX_LMAC_RINGS (HAL_MAX_LMACS * HAL_MAX_RINGS_PER_LMAC) 194 195 #define HAL_SRNG_ID_MAX (HAL_SRNG_UMAC_ID_END + HAL_MAX_LMAC_RINGS) 196 197 enum hal_srng_dir { 198 HAL_SRNG_SRC_RING, 199 HAL_SRNG_DST_RING 200 }; 201 202 /* Lock wrappers for SRNG */ 203 #define hal_srng_lock_t qdf_spinlock_t 204 #define SRNG_LOCK_INIT(_lock) qdf_spinlock_create(_lock) 205 #define SRNG_LOCK(_lock) qdf_spin_lock_bh(_lock) 206 #define SRNG_UNLOCK(_lock) qdf_spin_unlock_bh(_lock) 207 #define SRNG_LOCK_DESTROY(_lock) qdf_spinlock_destroy(_lock) 208 209 #define MAX_SRNG_REG_GROUPS 2 210 211 /* Common SRNG ring structure for source and destination rings */ 212 struct hal_srng { 213 /* Unique SRNG ring ID */ 214 uint8_t ring_id; 215 216 /* Ring initialization done */ 217 uint8_t initialized; 218 219 /* Interrupt/MSI value assigned to this ring */ 220 int irq; 221 222 /* Physical base address of the ring */ 223 qdf_dma_addr_t ring_base_paddr; 224 225 /* Virtual base address of the ring */ 226 uint32_t *ring_base_vaddr; 227 228 /* Number of entries in ring */ 229 uint32_t num_entries; 230 231 /* Ring size */ 232 uint32_t ring_size; 233 234 /* Ring size mask */ 235 uint32_t ring_size_mask; 236 237 /* Size of ring entry */ 238 uint32_t entry_size; 239 240 /* Interrupt timer threshold – in micro seconds */ 241 uint32_t intr_timer_thres_us; 242 243 /* Interrupt batch counter threshold – in number of ring entries */ 244 uint32_t intr_batch_cntr_thres_entries; 245 246 /* MSI Address */ 247 qdf_dma_addr_t msi_addr; 248 249 /* MSI data */ 250 uint32_t msi_data; 251 252 /* Misc flags */ 253 uint32_t flags; 254 255 /* Lock for serializing ring index updates */ 256 hal_srng_lock_t lock; 257 258 /* Start offset of SRNG register groups for this ring 259 * TBD: See if this is required - register address can be derived 260 * from ring ID 261 */ 262 void *hwreg_base[MAX_SRNG_REG_GROUPS]; 263 264 /* Source or Destination ring */ 265 enum hal_srng_dir ring_dir; 266 267 union { 268 struct { 269 /* SW tail pointer */ 270 uint32_t tp; 271 272 /* Shadow head pointer location to be updated by HW */ 273 uint32_t *hp_addr; 274 275 /* Cached head pointer */ 276 uint32_t cached_hp; 277 278 /* Tail pointer location to be updated by SW – This 279 * will be a register address and need not be 280 * accessed through SW structure */ 281 uint32_t *tp_addr; 282 283 /* Current SW loop cnt */ 284 uint32_t loop_cnt; 285 286 /* max transfer size */ 287 uint16_t max_buffer_length; 288 } dst_ring; 289 290 struct { 291 /* SW head pointer */ 292 uint32_t hp; 293 294 /* SW reap head pointer */ 295 uint32_t reap_hp; 296 297 /* Shadow tail pointer location to be updated by HW */ 298 uint32_t *tp_addr; 299 300 /* Cached tail pointer */ 301 uint32_t cached_tp; 302 303 /* Head pointer location to be updated by SW – This 304 * will be a register address and need not be accessed 305 * through SW structure */ 306 uint32_t *hp_addr; 307 308 /* Low threshold – in number of ring entries */ 309 uint32_t low_threshold; 310 } src_ring; 311 } u; 312 313 struct hal_soc *hal_soc; 314 }; 315 316 /* HW SRNG configuration table */ 317 struct hal_hw_srng_config { 318 int start_ring_id; 319 uint16_t max_rings; 320 uint16_t entry_size; 321 uint32_t reg_start[MAX_SRNG_REG_GROUPS]; 322 uint16_t reg_size[MAX_SRNG_REG_GROUPS]; 323 uint8_t lmac_ring; 324 enum hal_srng_dir ring_dir; 325 }; 326 327 /* calculate the register address offset from bar0 of shadow register x */ 328 #define SHADOW_REGISTER(x) (0x00003024 + (4*x)) 329 #define MAX_SHADOW_REGISTERS 36 330 331 /** 332 * HAL context to be used to access SRNG APIs (currently used by data path 333 * and transport (CE) modules) 334 */ 335 struct hal_soc { 336 /* HIF handle to access HW registers */ 337 void *hif_handle; 338 339 /* QDF device handle */ 340 qdf_device_t qdf_dev; 341 342 /* Device base address */ 343 void *dev_base_addr; 344 345 /* HAL internal state for all SRNG rings. 346 * TODO: See if this is required 347 */ 348 struct hal_srng srng_list[HAL_SRNG_ID_MAX]; 349 350 /* Remote pointer memory for HW/FW updates */ 351 uint32_t *shadow_rdptr_mem_vaddr; 352 qdf_dma_addr_t shadow_rdptr_mem_paddr; 353 354 /* Shared memory for ring pointer updates from host to FW */ 355 uint32_t *shadow_wrptr_mem_vaddr; 356 qdf_dma_addr_t shadow_wrptr_mem_paddr; 357 358 /* REO blocking resource index */ 359 uint8_t reo_res_bitmap; 360 uint8_t index; 361 362 /* shadow register configuration */ 363 struct pld_shadow_reg_v2_cfg shadow_config[MAX_SHADOW_REGISTERS]; 364 int num_shadow_registers_configured; 365 bool use_register_windowing; 366 uint32_t register_window; 367 qdf_spinlock_t register_access_lock; 368 }; 369 370 /* TODO: Check if the following can be provided directly by HW headers */ 371 #define SRNG_LOOP_CNT_MASK REO_DESTINATION_RING_15_LOOPING_COUNT_MASK 372 #define SRNG_LOOP_CNT_LSB REO_DESTINATION_RING_15_LOOPING_COUNT_LSB 373 374 #define HAL_SRNG_LMAC_RING 0x80000000 375 376 #define HAL_DEFAULT_REO_TIMEOUT_MS 40 /* milliseconds */ 377 378 #define HAL_DESC_SET_FIELD(_desc, _word, _fld, _value) do { \ 379 ((uint32_t *)(_desc))[(_word ## _ ## _fld ## _OFFSET) >> 2] &= \ 380 ~(_word ## _ ## _fld ## _MASK); \ 381 ((uint32_t *)(_desc))[(_word ## _ ## _fld ## _OFFSET) >> 2] |= \ 382 ((_value) << _word ## _ ## _fld ## _LSB); \ 383 } while (0) 384 385 #define HAL_SM(_reg, _fld, _val) \ 386 (((_val) << (_reg ## _ ## _fld ## _SHFT)) & \ 387 (_reg ## _ ## _fld ## _BMSK)) 388 389 #define HAL_MS(_reg, _fld, _val) \ 390 (((_val) & (_reg ## _ ## _fld ## _BMSK)) >> \ 391 (_reg ## _ ## _fld ## _SHFT)) 392 393 #define HAL_REG_WRITE(_soc, _reg, _value) \ 394 hal_write32_mb(_soc, (_reg), (_value)) 395 396 #define HAL_REG_READ(_soc, _offset) \ 397 hal_read32_mb(_soc, (_offset)) 398 399 #endif /* _HAL_INTERNAL_H_ */ 400