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