1 /* 2 * Copyright (c) 2016-2017 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 /* TBD: This should be movded to shared HW header file */ 86 enum hal_srng_ring_id { 87 /* UMAC rings */ 88 HAL_SRNG_REO2SW1 = 0, 89 HAL_SRNG_REO2SW2 = 1, 90 HAL_SRNG_REO2SW3 = 2, 91 HAL_SRNG_REO2SW4 = 3, 92 HAL_SRNG_REO2TCL = 4, 93 HAL_SRNG_SW2REO = 5, 94 /* 6-7 unused */ 95 HAL_SRNG_REO_CMD = 8, 96 HAL_SRNG_REO_STATUS = 9, 97 /* 10-15 unused */ 98 HAL_SRNG_SW2TCL1 = 16, 99 HAL_SRNG_SW2TCL2 = 17, 100 HAL_SRNG_SW2TCL3 = 18, 101 HAL_SRNG_SW2TCL4 = 19, /* FW2TCL ring */ 102 /* 20-23 unused */ 103 HAL_SRNG_SW2TCL_CMD = 24, 104 HAL_SRNG_TCL_STATUS = 25, 105 /* 26-31 unused */ 106 HAL_SRNG_CE_0_SRC = 32, 107 HAL_SRNG_CE_1_SRC = 33, 108 HAL_SRNG_CE_2_SRC = 34, 109 HAL_SRNG_CE_3_SRC = 35, 110 HAL_SRNG_CE_4_SRC = 36, 111 HAL_SRNG_CE_5_SRC = 37, 112 HAL_SRNG_CE_6_SRC = 38, 113 HAL_SRNG_CE_7_SRC = 39, 114 HAL_SRNG_CE_8_SRC = 40, 115 HAL_SRNG_CE_9_SRC = 41, 116 HAL_SRNG_CE_10_SRC = 42, 117 HAL_SRNG_CE_11_SRC = 43, 118 /* 44-55 unused */ 119 HAL_SRNG_CE_0_DST = 56, 120 HAL_SRNG_CE_1_DST = 57, 121 HAL_SRNG_CE_2_DST = 58, 122 HAL_SRNG_CE_3_DST = 59, 123 HAL_SRNG_CE_4_DST = 60, 124 HAL_SRNG_CE_5_DST = 61, 125 HAL_SRNG_CE_6_DST = 62, 126 HAL_SRNG_CE_7_DST = 63, 127 HAL_SRNG_CE_8_DST = 64, 128 HAL_SRNG_CE_9_DST = 65, 129 HAL_SRNG_CE_10_DST = 66, 130 HAL_SRNG_CE_11_DST = 67, 131 /* 68-79 unused */ 132 HAL_SRNG_CE_0_DST_STATUS = 80, 133 HAL_SRNG_CE_1_DST_STATUS = 81, 134 HAL_SRNG_CE_2_DST_STATUS = 82, 135 HAL_SRNG_CE_3_DST_STATUS = 83, 136 HAL_SRNG_CE_4_DST_STATUS = 84, 137 HAL_SRNG_CE_5_DST_STATUS = 85, 138 HAL_SRNG_CE_6_DST_STATUS = 86, 139 HAL_SRNG_CE_7_DST_STATUS = 87, 140 HAL_SRNG_CE_8_DST_STATUS = 88, 141 HAL_SRNG_CE_9_DST_STATUS = 89, 142 HAL_SRNG_CE_10_DST_STATUS = 90, 143 HAL_SRNG_CE_11_DST_STATUS = 91, 144 /* 92-103 unused */ 145 HAL_SRNG_WBM_IDLE_LINK = 104, 146 HAL_SRNG_WBM_SW_RELEASE = 105, 147 HAL_SRNG_WBM2SW0_RELEASE = 106, 148 HAL_SRNG_WBM2SW1_RELEASE = 107, 149 HAL_SRNG_WBM2SW2_RELEASE = 108, 150 HAL_SRNG_WBM2SW3_RELEASE = 109, 151 /* 110-127 unused */ 152 HAL_SRNG_UMAC_ID_END = 127, 153 /* LMAC rings - The following set will be replicated for each LMAC */ 154 HAL_SRNG_LMAC1_ID_START = 128, 155 HAL_SRNG_WMAC1_SW2RXDMA0_BUF0 = HAL_SRNG_LMAC1_ID_START, 156 #ifdef IPA_OFFLOAD 157 HAL_SRNG_WMAC1_SW2RXDMA0_BUF1 = (HAL_SRNG_LMAC1_ID_START + 1), 158 HAL_SRNG_WMAC1_SW2RXDMA0_BUF2 = (HAL_SRNG_LMAC1_ID_START + 2), 159 HAL_SRNG_WMAC1_SW2RXDMA1_BUF = (HAL_SRNG_WMAC1_SW2RXDMA0_BUF2 + 1), 160 #else 161 HAL_SRNG_WMAC1_SW2RXDMA1_BUF = (HAL_SRNG_WMAC1_SW2RXDMA0_BUF0 + 1), 162 #endif 163 HAL_SRNG_WMAC1_SW2RXDMA2_BUF = (HAL_SRNG_WMAC1_SW2RXDMA1_BUF + 1), 164 HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF = (HAL_SRNG_WMAC1_SW2RXDMA2_BUF + 1), 165 HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF = 166 (HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF + 1), 167 HAL_SRNG_WMAC1_RXDMA2SW0 = (HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF + 1), 168 HAL_SRNG_WMAC1_RXDMA2SW1 = (HAL_SRNG_WMAC1_RXDMA2SW0 + 1), 169 HAL_SRNG_WMAC1_SW2RXDMA1_DESC = (HAL_SRNG_WMAC1_RXDMA2SW1 + 1), 170 #ifdef WLAN_FEATURE_CIF_CFR 171 HAL_SRNG_WIFI_POS_SRC_DMA_RING = (HAL_SRNG_WMAC1_SW2RXDMA1_DESC + 1), 172 #endif 173 /* -142 unused */ 174 HAL_SRNG_LMAC1_ID_END = 143 175 }; 176 177 #define HAL_SRNG_REO_EXCEPTION HAL_SRNG_REO2SW1 178 179 #define HAL_MAX_LMACS 3 180 #define HAL_MAX_RINGS_PER_LMAC (HAL_SRNG_LMAC1_ID_END - HAL_SRNG_LMAC1_ID_START) 181 #define HAL_MAX_LMAC_RINGS (HAL_MAX_LMACS * HAL_MAX_RINGS_PER_LMAC) 182 183 #define HAL_SRNG_ID_MAX (HAL_SRNG_UMAC_ID_END + HAL_MAX_LMAC_RINGS) 184 185 enum hal_srng_dir { 186 HAL_SRNG_SRC_RING, 187 HAL_SRNG_DST_RING 188 }; 189 190 /* Lock wrappers for SRNG */ 191 #define hal_srng_lock_t qdf_spinlock_t 192 #define SRNG_LOCK_INIT(_lock) qdf_spinlock_create(_lock) 193 #define SRNG_LOCK(_lock) qdf_spin_lock_bh(_lock) 194 #define SRNG_UNLOCK(_lock) qdf_spin_unlock_bh(_lock) 195 #define SRNG_LOCK_DESTROY(_lock) qdf_spinlock_destroy(_lock) 196 197 #define MAX_SRNG_REG_GROUPS 2 198 199 /* Common SRNG ring structure for source and destination rings */ 200 struct hal_srng { 201 /* Unique SRNG ring ID */ 202 uint8_t ring_id; 203 204 /* Ring initialization done */ 205 uint8_t initialized; 206 207 /* Interrupt/MSI value assigned to this ring */ 208 int irq; 209 210 /* Physical base address of the ring */ 211 qdf_dma_addr_t ring_base_paddr; 212 213 /* Virtual base address of the ring */ 214 uint32_t *ring_base_vaddr; 215 216 /* Number of entries in ring */ 217 uint32_t num_entries; 218 219 /* Ring size */ 220 uint32_t ring_size; 221 222 /* Ring size mask */ 223 uint32_t ring_size_mask; 224 225 /* Size of ring entry */ 226 uint32_t entry_size; 227 228 /* Interrupt timer threshold – in micro seconds */ 229 uint32_t intr_timer_thres_us; 230 231 /* Interrupt batch counter threshold – in number of ring entries */ 232 uint32_t intr_batch_cntr_thres_entries; 233 234 /* MSI Address */ 235 qdf_dma_addr_t msi_addr; 236 237 /* MSI data */ 238 uint32_t msi_data; 239 240 /* Misc flags */ 241 uint32_t flags; 242 243 /* Lock for serializing ring index updates */ 244 hal_srng_lock_t lock; 245 246 /* Start offset of SRNG register groups for this ring 247 * TBD: See if this is required - register address can be derived 248 * from ring ID 249 */ 250 void *hwreg_base[MAX_SRNG_REG_GROUPS]; 251 252 /* Source or Destination ring */ 253 enum hal_srng_dir ring_dir; 254 255 union { 256 struct { 257 /* SW tail pointer */ 258 uint32_t tp; 259 260 /* Shadow head pointer location to be updated by HW */ 261 uint32_t *hp_addr; 262 263 /* Cached head pointer */ 264 uint32_t cached_hp; 265 266 /* Tail pointer location to be updated by SW – This 267 * will be a register address and need not be 268 * accessed through SW structure */ 269 uint32_t *tp_addr; 270 271 /* Current SW loop cnt */ 272 uint32_t loop_cnt; 273 274 /* max transfer size */ 275 uint16_t max_buffer_length; 276 } dst_ring; 277 278 struct { 279 /* SW head pointer */ 280 uint32_t hp; 281 282 /* SW reap head pointer */ 283 uint32_t reap_hp; 284 285 /* Shadow tail pointer location to be updated by HW */ 286 uint32_t *tp_addr; 287 288 /* Cached tail pointer */ 289 uint32_t cached_tp; 290 291 /* Head pointer location to be updated by SW – This 292 * will be a register address and need not be accessed 293 * through SW structure */ 294 uint32_t *hp_addr; 295 296 /* Low threshold – in number of ring entries */ 297 uint32_t low_threshold; 298 } src_ring; 299 } u; 300 301 struct hal_soc *hal_soc; 302 }; 303 304 /* HW SRNG configuration table */ 305 struct hal_hw_srng_config { 306 int start_ring_id; 307 uint16_t max_rings; 308 uint16_t entry_size; 309 uint32_t reg_start[MAX_SRNG_REG_GROUPS]; 310 uint16_t reg_size[MAX_SRNG_REG_GROUPS]; 311 uint8_t lmac_ring; 312 enum hal_srng_dir ring_dir; 313 }; 314 315 /* calculate the register address offset from bar0 of shadow register x */ 316 #define SHADOW_REGISTER(x) (0x00003024 + (4*x)) 317 #define MAX_SHADOW_REGISTERS 36 318 319 /** 320 * HAL context to be used to access SRNG APIs (currently used by data path 321 * and transport (CE) modules) 322 */ 323 struct hal_soc { 324 /* HIF handle to access HW registers */ 325 void *hif_handle; 326 327 /* QDF device handle */ 328 qdf_device_t qdf_dev; 329 330 /* Device base address */ 331 void *dev_base_addr; 332 333 /* HAL internal state for all SRNG rings. 334 * TODO: See if this is required 335 */ 336 struct hal_srng srng_list[HAL_SRNG_ID_MAX]; 337 338 /* Remote pointer memory for HW/FW updates */ 339 uint32_t *shadow_rdptr_mem_vaddr; 340 qdf_dma_addr_t shadow_rdptr_mem_paddr; 341 342 /* Shared memory for ring pointer updates from host to FW */ 343 uint32_t *shadow_wrptr_mem_vaddr; 344 qdf_dma_addr_t shadow_wrptr_mem_paddr; 345 346 /* REO blocking resource index */ 347 uint8_t reo_res_bitmap; 348 uint8_t index; 349 350 /* shadow register configuration */ 351 struct pld_shadow_reg_v2_cfg shadow_config[MAX_SHADOW_REGISTERS]; 352 int num_shadow_registers_configured; 353 bool use_register_windowing; 354 uint32_t register_window; 355 qdf_spinlock_t register_access_lock; 356 }; 357 358 /* TODO: Check if the following can be provided directly by HW headers */ 359 #define SRNG_LOOP_CNT_MASK REO_DESTINATION_RING_15_LOOPING_COUNT_MASK 360 #define SRNG_LOOP_CNT_LSB REO_DESTINATION_RING_15_LOOPING_COUNT_LSB 361 362 #define HAL_SRNG_LMAC_RING 0x80000000 363 364 #define HAL_DEFAULT_REO_TIMEOUT_MS 40 /* milliseconds */ 365 366 #define HAL_DESC_SET_FIELD(_desc, _word, _fld, _value) do { \ 367 ((uint32_t *)(_desc))[(_word ## _ ## _fld ## _OFFSET) >> 2] &= \ 368 ~(_word ## _ ## _fld ## _MASK); \ 369 ((uint32_t *)(_desc))[(_word ## _ ## _fld ## _OFFSET) >> 2] |= \ 370 ((_value) << _word ## _ ## _fld ## _LSB); \ 371 } while (0) 372 373 #define HAL_SM(_reg, _fld, _val) \ 374 (((_val) << (_reg ## _ ## _fld ## _SHFT)) & \ 375 (_reg ## _ ## _fld ## _BMSK)) 376 377 #define HAL_MS(_reg, _fld, _val) \ 378 (((_val) & (_reg ## _ ## _fld ## _BMSK)) >> \ 379 (_reg ## _ ## _fld ## _SHFT)) 380 381 #define HAL_REG_WRITE(_soc, _reg, _value) \ 382 hal_write32_mb(_soc, (_reg), (_value)) 383 384 #define HAL_REG_READ(_soc, _offset) \ 385 hal_read32_mb(_soc, (_offset)) 386 387 #endif /* _HAL_INTERNAL_H_ */ 388