xref: /wlan-dirver/qca-wifi-host-cmn/hal/wifi3.0/hal_internal.h (revision 92d87f51612f6c3b2285266215edee8911647c2f)
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