blob: a19771a047e7b93bfb0ab016fd836bc77e2df656 [file] [log] [blame]
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -07001/*
Krunal Soni9911b442019-02-22 15:39:03 -08002 * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -07003 *
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05304 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -07008 *
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05309 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -070017 */
18
19#ifndef _HAL_INTERNAL_H_
20#define _HAL_INTERNAL_H_
21
22#include "qdf_types.h"
23#include "qdf_lock.h"
Leo Chang5ea93a42016-11-03 12:39:49 -070024#include "qdf_mem.h"
Ravi Joshi36f68ad2016-11-09 17:09:47 -080025#include "qdf_nbuf.h"
Houston Hoffman5141f9d2017-01-05 10:49:17 -080026#include "pld_common.h"
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -070027
Mohit Khannaefdae7f2018-11-02 16:19:48 -070028#define hal_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_TXRX, params)
29#define hal_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_TXRX, params)
30#define hal_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_TXRX, params)
31#define hal_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_TXRX, params)
32#define hal_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_TXRX, params)
Venkata Sharath Chandra Manchalaea6518b2019-10-25 18:03:25 -070033
34#define hal_alert_rl(params...) QDF_TRACE_FATAL_RL(QDF_MODULE_ID_HAL, params)
35#define hal_err_rl(params...) QDF_TRACE_ERROR_RL(QDF_MODULE_ID_HAL, params)
36#define hal_warn_rl(params...) QDF_TRACE_WARN_RL(QDF_MODULE_ID_HAL, params)
37#define hal_info_rl(params...) QDF_TRACE_INFO_RL(QDF_MODULE_ID_HAL, params)
38#define hal_debug_rl(params...) QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_HAL, params)
39
Krunal Soni9911b442019-02-22 15:39:03 -080040#ifdef ENABLE_VERBOSE_DEBUG
41extern bool is_hal_verbose_debug_enabled;
42#define hal_verbose_debug(params...) \
43 if (unlikely(is_hal_verbose_debug_enabled)) \
44 do {\
45 QDF_TRACE_DEBUG(QDF_MODULE_ID_TXRX, params); \
46 } while (0)
47#define hal_verbose_hex_dump(params...) \
48 if (unlikely(is_hal_verbose_debug_enabled)) \
49 do {\
50 QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_TXRX, \
51 QDF_TRACE_LEVEL_DEBUG, \
52 params); \
53 } while (0)
54#else
55#define hal_verbose_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_TXRX, params)
56#define hal_verbose_hex_dump(params...) \
57 QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, \
58 params)
59#endif
Mohit Khannaefdae7f2018-11-02 16:19:48 -070060
Akshay Kosigi6a206752019-06-10 23:14:52 +053061/*
62 * dp_hal_soc - opaque handle for DP HAL soc
63 */
64struct hal_soc_handle;
65typedef struct hal_soc_handle *hal_soc_handle_t;
Mohit Khanna6c22db32018-03-19 21:47:51 -070066
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -070067/* TBD: This should be movded to shared HW header file */
68enum hal_srng_ring_id {
69 /* UMAC rings */
70 HAL_SRNG_REO2SW1 = 0,
71 HAL_SRNG_REO2SW2 = 1,
72 HAL_SRNG_REO2SW3 = 2,
73 HAL_SRNG_REO2SW4 = 3,
74 HAL_SRNG_REO2TCL = 4,
75 HAL_SRNG_SW2REO = 5,
76 /* 6-7 unused */
77 HAL_SRNG_REO_CMD = 8,
78 HAL_SRNG_REO_STATUS = 9,
79 /* 10-15 unused */
80 HAL_SRNG_SW2TCL1 = 16,
81 HAL_SRNG_SW2TCL2 = 17,
82 HAL_SRNG_SW2TCL3 = 18,
83 HAL_SRNG_SW2TCL4 = 19, /* FW2TCL ring */
84 /* 20-23 unused */
85 HAL_SRNG_SW2TCL_CMD = 24,
86 HAL_SRNG_TCL_STATUS = 25,
87 /* 26-31 unused */
88 HAL_SRNG_CE_0_SRC = 32,
89 HAL_SRNG_CE_1_SRC = 33,
90 HAL_SRNG_CE_2_SRC = 34,
91 HAL_SRNG_CE_3_SRC = 35,
92 HAL_SRNG_CE_4_SRC = 36,
93 HAL_SRNG_CE_5_SRC = 37,
94 HAL_SRNG_CE_6_SRC = 38,
95 HAL_SRNG_CE_7_SRC = 39,
96 HAL_SRNG_CE_8_SRC = 40,
97 HAL_SRNG_CE_9_SRC = 41,
98 HAL_SRNG_CE_10_SRC = 42,
99 HAL_SRNG_CE_11_SRC = 43,
100 /* 44-55 unused */
101 HAL_SRNG_CE_0_DST = 56,
102 HAL_SRNG_CE_1_DST = 57,
103 HAL_SRNG_CE_2_DST = 58,
104 HAL_SRNG_CE_3_DST = 59,
105 HAL_SRNG_CE_4_DST = 60,
106 HAL_SRNG_CE_5_DST = 61,
107 HAL_SRNG_CE_6_DST = 62,
108 HAL_SRNG_CE_7_DST = 63,
109 HAL_SRNG_CE_8_DST = 64,
110 HAL_SRNG_CE_9_DST = 65,
111 HAL_SRNG_CE_10_DST = 66,
112 HAL_SRNG_CE_11_DST = 67,
113 /* 68-79 unused */
114 HAL_SRNG_CE_0_DST_STATUS = 80,
115 HAL_SRNG_CE_1_DST_STATUS = 81,
116 HAL_SRNG_CE_2_DST_STATUS = 82,
117 HAL_SRNG_CE_3_DST_STATUS = 83,
118 HAL_SRNG_CE_4_DST_STATUS = 84,
119 HAL_SRNG_CE_5_DST_STATUS = 85,
120 HAL_SRNG_CE_6_DST_STATUS = 86,
121 HAL_SRNG_CE_7_DST_STATUS = 87,
122 HAL_SRNG_CE_8_DST_STATUS = 88,
123 HAL_SRNG_CE_9_DST_STATUS = 89,
124 HAL_SRNG_CE_10_DST_STATUS = 90,
125 HAL_SRNG_CE_11_DST_STATUS = 91,
126 /* 92-103 unused */
127 HAL_SRNG_WBM_IDLE_LINK = 104,
128 HAL_SRNG_WBM_SW_RELEASE = 105,
129 HAL_SRNG_WBM2SW0_RELEASE = 106,
130 HAL_SRNG_WBM2SW1_RELEASE = 107,
131 HAL_SRNG_WBM2SW2_RELEASE = 108,
132 HAL_SRNG_WBM2SW3_RELEASE = 109,
133 /* 110-127 unused */
134 HAL_SRNG_UMAC_ID_END = 127,
135 /* LMAC rings - The following set will be replicated for each LMAC */
136 HAL_SRNG_LMAC1_ID_START = 128,
Yun Parkfde6b9e2017-06-26 17:13:11 -0700137 HAL_SRNG_WMAC1_SW2RXDMA0_BUF0 = HAL_SRNG_LMAC1_ID_START,
138#ifdef IPA_OFFLOAD
139 HAL_SRNG_WMAC1_SW2RXDMA0_BUF1 = (HAL_SRNG_LMAC1_ID_START + 1),
140 HAL_SRNG_WMAC1_SW2RXDMA0_BUF2 = (HAL_SRNG_LMAC1_ID_START + 2),
141 HAL_SRNG_WMAC1_SW2RXDMA1_BUF = (HAL_SRNG_WMAC1_SW2RXDMA0_BUF2 + 1),
142#else
143 HAL_SRNG_WMAC1_SW2RXDMA1_BUF = (HAL_SRNG_WMAC1_SW2RXDMA0_BUF0 + 1),
Naveen Rawatba24c482017-05-15 12:02:48 -0700144#endif
Yun Parkfde6b9e2017-06-26 17:13:11 -0700145 HAL_SRNG_WMAC1_SW2RXDMA2_BUF = (HAL_SRNG_WMAC1_SW2RXDMA1_BUF + 1),
146 HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF = (HAL_SRNG_WMAC1_SW2RXDMA2_BUF + 1),
147 HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF =
148 (HAL_SRNG_WMAC1_SW2RXDMA0_STATBUF + 1),
149 HAL_SRNG_WMAC1_RXDMA2SW0 = (HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF + 1),
150 HAL_SRNG_WMAC1_RXDMA2SW1 = (HAL_SRNG_WMAC1_RXDMA2SW0 + 1),
151 HAL_SRNG_WMAC1_SW2RXDMA1_DESC = (HAL_SRNG_WMAC1_RXDMA2SW1 + 1),
152#ifdef WLAN_FEATURE_CIF_CFR
153 HAL_SRNG_WIFI_POS_SRC_DMA_RING = (HAL_SRNG_WMAC1_SW2RXDMA1_DESC + 1),
Sathish Kumar03d77e62017-11-17 17:27:52 +0530154 HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING = (HAL_SRNG_WIFI_POS_SRC_DMA_RING + 1),
155#else
156 HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING = (HAL_SRNG_WMAC1_SW2RXDMA1_DESC + 1),
Yun Parkfde6b9e2017-06-26 17:13:11 -0700157#endif
158 /* -142 unused */
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700159 HAL_SRNG_LMAC1_ID_END = 143
160};
161
Balamurugan Mahalingamd0159642018-07-11 15:02:29 +0530162#define HAL_RXDMA_MAX_RING_SIZE 0xFFFF
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700163#define HAL_MAX_LMACS 3
164#define HAL_MAX_RINGS_PER_LMAC (HAL_SRNG_LMAC1_ID_END - HAL_SRNG_LMAC1_ID_START)
165#define HAL_MAX_LMAC_RINGS (HAL_MAX_LMACS * HAL_MAX_RINGS_PER_LMAC)
166
167#define HAL_SRNG_ID_MAX (HAL_SRNG_UMAC_ID_END + HAL_MAX_LMAC_RINGS)
168
169enum hal_srng_dir {
170 HAL_SRNG_SRC_RING,
171 HAL_SRNG_DST_RING
172};
173
174/* Lock wrappers for SRNG */
175#define hal_srng_lock_t qdf_spinlock_t
176#define SRNG_LOCK_INIT(_lock) qdf_spinlock_create(_lock)
Gurumoorthi Gnanasambandhaned4bcf82017-05-24 00:10:59 +0530177#define SRNG_LOCK(_lock) qdf_spin_lock_bh(_lock)
178#define SRNG_UNLOCK(_lock) qdf_spin_unlock_bh(_lock)
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700179#define SRNG_LOCK_DESTROY(_lock) qdf_spinlock_destroy(_lock)
180
Balamurugan Mahalingamd0159642018-07-11 15:02:29 +0530181struct hal_soc;
Akshay Kosigi91c56522019-07-02 11:49:39 +0530182
183/**
Akshay Kosigi0bca9fb2019-06-27 15:26:13 +0530184 * dp_hal_ring - opaque handle for DP HAL SRNG
185 */
186struct hal_ring_handle;
187typedef struct hal_ring_handle *hal_ring_handle_t;
188
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700189#define MAX_SRNG_REG_GROUPS 2
190
Sravan Kumar Kairam78b01a12019-09-16 14:22:55 +0530191/* Hal Srng bit mask
192 * HAL_SRNG_FLUSH_EVENT: SRNG HP TP flush in case of link down
193 */
194#define HAL_SRNG_FLUSH_EVENT BIT(0)
195
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700196/* Common SRNG ring structure for source and destination rings */
197struct hal_srng {
198 /* Unique SRNG ring ID */
199 uint8_t ring_id;
200
201 /* Ring initialization done */
202 uint8_t initialized;
203
204 /* Interrupt/MSI value assigned to this ring */
205 int irq;
206
207 /* Physical base address of the ring */
208 qdf_dma_addr_t ring_base_paddr;
209
210 /* Virtual base address of the ring */
211 uint32_t *ring_base_vaddr;
212
213 /* Number of entries in ring */
214 uint32_t num_entries;
215
216 /* Ring size */
217 uint32_t ring_size;
218
219 /* Ring size mask */
220 uint32_t ring_size_mask;
221
222 /* Size of ring entry */
223 uint32_t entry_size;
224
225 /* Interrupt timer threshold – in micro seconds */
226 uint32_t intr_timer_thres_us;
227
228 /* Interrupt batch counter threshold – in number of ring entries */
229 uint32_t intr_batch_cntr_thres_entries;
230
231 /* MSI Address */
232 qdf_dma_addr_t msi_addr;
233
234 /* MSI data */
235 uint32_t msi_data;
236
237 /* Misc flags */
238 uint32_t flags;
239
240 /* Lock for serializing ring index updates */
241 hal_srng_lock_t lock;
242
243 /* Start offset of SRNG register groups for this ring
244 * TBD: See if this is required - register address can be derived
245 * from ring ID
246 */
247 void *hwreg_base[MAX_SRNG_REG_GROUPS];
248
249 /* Source or Destination ring */
250 enum hal_srng_dir ring_dir;
251
252 union {
253 struct {
254 /* SW tail pointer */
255 uint32_t tp;
256
257 /* Shadow head pointer location to be updated by HW */
258 uint32_t *hp_addr;
259
260 /* Cached head pointer */
261 uint32_t cached_hp;
262
263 /* Tail pointer location to be updated by SW – This
264 * will be a register address and need not be
265 * accessed through SW structure */
266 uint32_t *tp_addr;
267
268 /* Current SW loop cnt */
Houston Hoffman74109122016-10-21 14:58:34 -0700269 uint32_t loop_cnt;
270
271 /* max transfer size */
272 uint16_t max_buffer_length;
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700273 } dst_ring;
274
275 struct {
276 /* SW head pointer */
277 uint32_t hp;
278
279 /* SW reap head pointer */
280 uint32_t reap_hp;
281
282 /* Shadow tail pointer location to be updated by HW */
283 uint32_t *tp_addr;
284
285 /* Cached tail pointer */
286 uint32_t cached_tp;
287
288 /* Head pointer location to be updated by SW – This
289 * will be a register address and need not be accessed
290 * through SW structure */
291 uint32_t *hp_addr;
292
293 /* Low threshold – in number of ring entries */
294 uint32_t low_threshold;
295 } src_ring;
296 } u;
Houston Hoffman8bbc9902017-04-10 14:09:51 -0700297
298 struct hal_soc *hal_soc;
Venkata Sharath Chandra Manchala5ee6efd2019-08-01 11:22:04 -0700299
300 /* Number of times hp/tp updated in runtime resume */
Sravan Kumar Kairam78b01a12019-09-16 14:22:55 +0530301 uint32_t flush_count;
302 /* hal srng event flag*/
303 unsigned long srng_event;
304 /* last flushed time stamp */
305 uint64_t last_flush_ts;
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700306};
307
308/* HW SRNG configuration table */
309struct hal_hw_srng_config {
310 int start_ring_id;
311 uint16_t max_rings;
312 uint16_t entry_size;
313 uint32_t reg_start[MAX_SRNG_REG_GROUPS];
314 uint16_t reg_size[MAX_SRNG_REG_GROUPS];
315 uint8_t lmac_ring;
316 enum hal_srng_dir ring_dir;
Venkata Sharath Chandra Manchala9a59bd62018-06-14 16:53:29 -0700317 uint32_t max_size;
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700318};
319
Houston Hoffman5141f9d2017-01-05 10:49:17 -0800320#define MAX_SHADOW_REGISTERS 36
321
Venkata Sharath Chandra Manchala222b2532019-09-23 17:16:51 -0700322/* REO parameters to be passed to hal_reo_setup */
323struct hal_reo_params {
324 /** rx hash steering enabled or disabled */
325 bool rx_hash_enabled;
326 /** reo remap 1 register */
327 uint32_t remap1;
328 /** reo remap 2 register */
329 uint32_t remap2;
330 /** fragment destination ring */
331 uint8_t frag_dst_ring;
332 /** padding */
333 uint8_t padding[3];
334};
335
Balamurugan Mahalingamd0159642018-07-11 15:02:29 +0530336struct hal_hw_txrx_ops {
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530337
338 /* init and setup */
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530339 void (*hal_srng_dst_hw_init)(struct hal_soc *hal,
340 struct hal_srng *srng);
341 void (*hal_srng_src_hw_init)(struct hal_soc *hal,
342 struct hal_srng *srng);
343 void (*hal_get_hw_hptp)(struct hal_soc *hal,
Akshay Kosigi0bca9fb2019-06-27 15:26:13 +0530344 hal_ring_handle_t hal_ring_hdl,
Venkata Sharath Chandra Manchala443b9b42018-10-10 12:04:54 -0700345 uint32_t *headp, uint32_t *tailp,
346 uint8_t ring_type);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530347 void (*hal_reo_setup)(struct hal_soc *hal_soc, void *reoparams);
348 void (*hal_setup_link_idle_list)(
349 struct hal_soc *hal_soc,
350 qdf_dma_addr_t scatter_bufs_base_paddr[],
351 void *scatter_bufs_base_vaddr[],
352 uint32_t num_scatter_bufs,
353 uint32_t scatter_buf_size,
354 uint32_t last_buf_end_offset,
355 uint32_t num_entries);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530356
Balamurugan Mahalingamd0159642018-07-11 15:02:29 +0530357 /* tx */
358 void (*hal_tx_desc_set_dscp_tid_table_id)(void *desc, uint8_t id);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530359 void (*hal_tx_set_dscp_tid_map)(struct hal_soc *hal_soc, uint8_t *map,
Balamurugan Mahalingamd0159642018-07-11 15:02:29 +0530360 uint8_t id);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530361 void (*hal_tx_update_dscp_tid)(struct hal_soc *hal_soc, uint8_t tid,
362 uint8_t id,
Balamurugan Mahalingamd0159642018-07-11 15:02:29 +0530363 uint8_t dscp);
364 void (*hal_tx_desc_set_lmac_id)(void *desc, uint8_t lmac_id);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530365 void (*hal_tx_desc_set_buf_addr)(void *desc, dma_addr_t paddr,
366 uint8_t pool_id, uint32_t desc_id, uint8_t type);
Balamurugan Mahalingamfa1d9c72018-09-25 12:13:34 +0530367 void (*hal_tx_desc_set_search_type)(void *desc, uint8_t search_type);
368 void (*hal_tx_desc_set_search_index)(void *desc, uint32_t search_index);
Subhranil Choudhury4ee1b5e2019-08-20 18:20:47 +0530369 void (*hal_tx_desc_set_cache_set_num)(void *desc, uint8_t search_index);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530370 void (*hal_tx_comp_get_status)(void *desc, void *ts,
371 struct hal_soc *hal);
Balamurugan Mahalingam764219e2018-09-17 15:34:25 +0530372 uint8_t (*hal_tx_comp_get_release_reason)(void *hal_desc);
Venkata Sharath Chandra Manchala38e84d22019-09-21 18:59:21 -0700373 void (*hal_tx_desc_set_mesh_en)(void *desc, uint8_t en);
Balamurugan Mahalingamd0159642018-07-11 15:02:29 +0530374
375 /* rx */
376 uint32_t (*hal_rx_msdu_start_nss_get)(uint8_t *);
377 void (*hal_rx_mon_hw_desc_get_mpdu_status)(void *hw_desc_addr,
378 struct mon_rx_status *rs);
379 uint8_t (*hal_rx_get_tlv)(void *rx_tlv);
380 void (*hal_rx_proc_phyrx_other_receive_info_tlv)(void *rx_tlv_hdr,
381 void *ppdu_info_handle);
382 void (*hal_rx_dump_msdu_start_tlv)(void *msdu_start, uint8_t dbg_level);
Balamurugan Mahalingam97ad1062018-07-11 15:22:58 +0530383 void (*hal_rx_dump_msdu_end_tlv)(void *msdu_end,
384 uint8_t dbg_level);
Balamurugan Mahalingamd0159642018-07-11 15:02:29 +0530385 uint32_t (*hal_get_link_desc_size)(void);
386 uint32_t (*hal_rx_mpdu_start_tid_get)(uint8_t *buf);
387 uint32_t (*hal_rx_msdu_start_reception_type_get)(uint8_t *buf);
Balamurugan Mahalingam96d2d412018-07-10 10:11:58 +0530388 uint16_t (*hal_rx_msdu_end_da_idx_get)(uint8_t *buf);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530389 void* (*hal_rx_msdu_desc_info_get_ptr)(void *msdu_details_ptr);
390 void* (*hal_rx_link_desc_msdu0_ptr)(void *msdu_link_ptr);
391 void (*hal_reo_status_get_header)(uint32_t *d, int b, void *h);
392 uint32_t (*hal_rx_status_get_tlv_info)(void *rx_tlv_hdr,
Akshay Kosigi6a206752019-06-10 23:14:52 +0530393 void *ppdu_info,
394 hal_soc_handle_t hal_soc_hdl,
395 qdf_nbuf_t nbuf);
Balamurugan Mahalingam764219e2018-09-17 15:34:25 +0530396 void (*hal_rx_wbm_err_info_get)(void *wbm_desc,
397 void *wbm_er_info);
398 void (*hal_rx_dump_mpdu_start_tlv)(void *mpdustart,
399 uint8_t dbg_level);
Debasis Dasc39a68d2019-01-28 17:02:06 +0530400
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530401 void (*hal_tx_set_pcp_tid_map)(struct hal_soc *hal_soc, uint8_t *map);
402 void (*hal_tx_update_pcp_tid_map)(struct hal_soc *hal_soc, uint8_t pcp,
Debasis Dasc39a68d2019-01-28 17:02:06 +0530403 uint8_t id);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530404 void (*hal_tx_set_tidmap_prty)(struct hal_soc *hal_soc, uint8_t prio);
Venkata Sharath Chandra Manchalad1b7e4c2019-09-20 10:01:21 -0700405 uint8_t (*hal_rx_get_rx_fragment_number)(uint8_t *buf);
Venkata Sharath Chandra Manchalaee909382019-09-20 10:52:37 -0700406 uint8_t (*hal_rx_msdu_end_da_is_mcbc_get)(uint8_t *buf);
Venkata Sharath Chandra Manchala59ebd5e2019-09-20 15:52:55 -0700407 uint8_t (*hal_rx_msdu_end_sa_is_valid_get)(uint8_t *buf);
Venkata Sharath Chandra Manchala5bf1e5a2019-09-20 16:18:42 -0700408 uint16_t (*hal_rx_msdu_end_sa_idx_get)(uint8_t *buf);
Venkata Sharath Chandra Manchala43d56322019-09-20 16:51:48 -0700409 uint32_t (*hal_rx_desc_is_first_msdu)(void *hw_desc_addr);
Venkata Sharath Chandra Manchalaf05b2ae2019-09-20 17:25:21 -0700410 uint32_t (*hal_rx_msdu_end_l3_hdr_padding_get)(uint8_t *buf);
Venkata Sharath Chandra Manchalac1a4c8b2019-09-20 17:42:07 -0700411 uint32_t (*hal_rx_encryption_info_valid)(uint8_t *buf);
Venkata Sharath Chandra Manchalaa2d74972019-09-20 18:02:57 -0700412 void (*hal_rx_print_pn)(uint8_t *buf);
Venkata Sharath Chandra Manchalacb255b42019-09-21 11:03:38 -0700413 uint8_t (*hal_rx_msdu_end_first_msdu_get)(uint8_t *buf);
Venkata Sharath Chandra Manchala79055382019-09-21 11:22:30 -0700414 uint8_t (*hal_rx_msdu_end_da_is_valid_get)(uint8_t *buf);
Venkata Sharath Chandra Manchala55f2d922019-09-21 11:37:01 -0700415 uint8_t (*hal_rx_msdu_end_last_msdu_get)(uint8_t *buf);
Venkata Sharath Chandra Manchala2a52d342019-09-21 11:52:54 -0700416 bool (*hal_rx_get_mpdu_mac_ad4_valid)(uint8_t *buf);
Venkata Sharath Chandra Manchala96ed6232019-09-21 12:11:19 -0700417 uint32_t (*hal_rx_mpdu_start_sw_peer_id_get)(uint8_t *buf);
Venkata Sharath Chandra Manchalae7924fd2019-09-21 12:44:52 -0700418 uint32_t (*hal_rx_mpdu_get_to_ds)(uint8_t *buf);
Venkata Sharath Chandra Manchala1e3a4792019-09-21 13:15:09 -0700419 uint32_t (*hal_rx_mpdu_get_fr_ds)(uint8_t *buf);
Venkata Sharath Chandra Manchala25ba7b82019-09-21 13:31:30 -0700420 uint8_t (*hal_rx_get_mpdu_frame_control_valid)(uint8_t *buf);
Venkata Sharath Chandra Manchalae3ae3192019-09-21 13:59:46 -0700421 QDF_STATUS
422 (*hal_rx_mpdu_get_addr1)(uint8_t *buf, uint8_t *mac_addr);
Venkata Sharath Chandra Manchalaa81a2fe2019-09-21 14:29:40 -0700423 QDF_STATUS
424 (*hal_rx_mpdu_get_addr2)(uint8_t *buf, uint8_t *mac_addr);
Venkata Sharath Chandra Manchala7c868252019-09-21 14:58:34 -0700425 QDF_STATUS
426 (*hal_rx_mpdu_get_addr3)(uint8_t *buf, uint8_t *mac_addr);
Venkata Sharath Chandra Manchalaaa762832019-09-21 15:13:47 -0700427 QDF_STATUS
428 (*hal_rx_mpdu_get_addr4)(uint8_t *buf, uint8_t *mac_addr);
Venkata Sharath Chandra Manchala68d6f0d2019-09-21 15:33:47 -0700429 uint8_t (*hal_rx_get_mpdu_sequence_control_valid)(uint8_t *buf);
Venkata Sharath Chandra Manchala5ddc5182019-09-21 15:53:03 -0700430 bool (*hal_rx_is_unicast)(uint8_t *buf);
Venkata Sharath Chandra Manchala85130482019-09-21 16:17:01 -0700431 uint32_t (*hal_rx_tid_get)(hal_soc_handle_t hal_soc_hdl, uint8_t *buf);
Venkata Sharath Chandra Manchala84d50922019-09-21 16:48:04 -0700432 uint32_t (*hal_rx_hw_desc_get_ppduid_get)(void *hw_desc_addr);
Venkata Sharath Chandra Manchala56022cb2019-09-21 18:17:21 -0700433 uint32_t (*hal_rx_mpdu_start_mpdu_qos_control_valid_get)(uint8_t *buf);
Venkata Sharath Chandra Manchala685045e2019-09-21 18:32:51 -0700434 uint32_t (*hal_rx_msdu_end_sa_sw_peer_id_get)(uint8_t *buf);
Venkata Sharath Chandra Manchala82272402019-09-23 14:16:41 -0700435 void * (*hal_rx_msdu0_buffer_addr_lsb)(void *link_desc_addr);
436 void * (*hal_rx_msdu_desc_info_ptr_get)(void *msdu0);
437 void * (*hal_ent_mpdu_desc_info)(void *hw_addr);
438 void * (*hal_dst_mpdu_desc_info)(void *hw_addr);
Venkata Sharath Chandra Manchalab7d2df12019-09-23 15:20:06 -0700439 uint8_t (*hal_rx_get_fc_valid)(uint8_t *buf);
440 uint8_t (*hal_rx_get_to_ds_flag)(uint8_t *buf);
441 uint8_t (*hal_rx_get_mac_addr2_valid)(uint8_t *buf);
442 uint8_t (*hal_rx_get_filter_category)(uint8_t *buf);
443 uint32_t (*hal_rx_get_ppdu_id)(uint8_t *buf);
Venkata Sharath Chandra Manchala222b2532019-09-23 17:16:51 -0700444 void (*hal_reo_config)(struct hal_soc *soc,
445 uint32_t reg_val,
446 struct hal_reo_params *reo_params);
Venkata Sharath Chandra Manchalac9a4e142019-09-25 11:20:23 -0700447 uint32_t (*hal_rx_msdu_flow_idx_get)(uint8_t *buf);
Venkata Sharath Chandra Manchalab9a85362019-09-25 11:42:07 -0700448 bool (*hal_rx_msdu_flow_idx_invalid)(uint8_t *buf);
Venkata Sharath Chandra Manchalab5ec9d22019-09-25 12:07:09 -0700449 bool (*hal_rx_msdu_flow_idx_timeout)(uint8_t *buf);
Venkata Sharath Chandra Manchala905312e2019-09-25 12:30:34 -0700450 uint32_t (*hal_rx_msdu_fse_metadata_get)(uint8_t *buf);
Venkata Sharath Chandra Manchala8fc894a2019-09-25 12:50:14 -0700451 uint16_t (*hal_rx_msdu_cce_metadata_get)(uint8_t *buf);
Venkata Sharath Chandra Manchala1059fae2019-09-25 13:00:36 -0700452 void
453 (*hal_rx_msdu_get_flow_params)(
454 uint8_t *buf,
455 bool *flow_invalid,
456 bool *flow_timeout,
457 uint32_t *flow_index);
Venkata Sharath Chandra Manchala5c5d4092019-09-25 13:31:51 -0700458 uint16_t (*hal_rx_tlv_get_tcp_chksum)(uint8_t *buf);
Venkata Sharath Chandra Manchala36fd40a2019-09-25 19:00:14 -0700459 uint16_t (*hal_rx_get_rx_sequence)(uint8_t *buf);
Balamurugan Mahalingamd0159642018-07-11 15:02:29 +0530460};
461
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700462/**
463 * HAL context to be used to access SRNG APIs (currently used by data path
464 * and transport (CE) modules)
465 */
466struct hal_soc {
467 /* HIF handle to access HW registers */
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530468 struct hif_opaque_softc *hif_handle;
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700469
470 /* QDF device handle */
471 qdf_device_t qdf_dev;
472
473 /* Device base address */
474 void *dev_base_addr;
475
476 /* HAL internal state for all SRNG rings.
477 * TODO: See if this is required
478 */
479 struct hal_srng srng_list[HAL_SRNG_ID_MAX];
480
481 /* Remote pointer memory for HW/FW updates */
482 uint32_t *shadow_rdptr_mem_vaddr;
483 qdf_dma_addr_t shadow_rdptr_mem_paddr;
484
485 /* Shared memory for ring pointer updates from host to FW */
486 uint32_t *shadow_wrptr_mem_vaddr;
487 qdf_dma_addr_t shadow_wrptr_mem_paddr;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700488
489 /* REO blocking resource index */
490 uint8_t reo_res_bitmap;
491 uint8_t index;
Balamurugan Mahalingamd0159642018-07-11 15:02:29 +0530492 uint32_t target_type;
Houston Hoffman5141f9d2017-01-05 10:49:17 -0800493
494 /* shadow register configuration */
495 struct pld_shadow_reg_v2_cfg shadow_config[MAX_SHADOW_REGISTERS];
496 int num_shadow_registers_configured;
Houston Hoffman61dad492017-04-07 17:09:34 -0700497 bool use_register_windowing;
498 uint32_t register_window;
499 qdf_spinlock_t register_access_lock;
Balamurugan Mahalingamd0159642018-07-11 15:02:29 +0530500
501 /* srng table */
502 struct hal_hw_srng_config *hw_srng_table;
503 int32_t *hal_hw_reg_offset;
504 struct hal_hw_txrx_ops *ops;
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700505};
Balamurugan Mahalingam96d2d412018-07-10 10:11:58 +0530506
Venkata Sharath Chandra Manchalae69c9c22019-09-23 18:31:36 -0700507void hal_qca6490_attach(struct hal_soc *hal_soc);
Balamurugan Mahalingam96d2d412018-07-10 10:11:58 +0530508void hal_qca6390_attach(struct hal_soc *hal_soc);
509void hal_qca6290_attach(struct hal_soc *hal_soc);
510void hal_qca8074_attach(struct hal_soc *hal_soc);
Akshay Kosigi6a206752019-06-10 23:14:52 +0530511
Akshay Kosigi0bca9fb2019-06-27 15:26:13 +0530512/*
513 * hal_soc_to_dp_hal_roc - API to convert hal_soc to opaque
514 * dp_hal_soc handle type
515 * @hal_soc - hal_soc type
516 *
517 * Return: hal_soc_handle_t type
518 */
Akshay Kosigi6a206752019-06-10 23:14:52 +0530519static inline
520hal_soc_handle_t hal_soc_to_hal_soc_handle(struct hal_soc *hal_soc)
521{
522 return (hal_soc_handle_t)hal_soc;
523}
Akshay Kosigi0bca9fb2019-06-27 15:26:13 +0530524
525/*
526 * hal_srng_to_hal_ring_handle - API to convert hal_srng to opaque
527 * dp_hal_ring handle type
528 * @hal_srng - hal_srng type
529 *
530 * Return: hal_ring_handle_t type
531 */
532static inline
533hal_ring_handle_t hal_srng_to_hal_ring_handle(struct hal_srng *hal_srng)
534{
535 return (hal_ring_handle_t)hal_srng;
536}
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530537
538/*
539 * hal_ring_handle_to_hal_srng - API to convert dp_hal_ring to hal_srng handle
540 * @hal_ring - hal_ring_handle_t type
541 *
542 * Return: hal_srng pointer type
543 */
544static inline
545struct hal_srng *hal_ring_handle_to_hal_srng(hal_ring_handle_t hal_ring)
546{
547 return (struct hal_srng *)hal_ring;
548}
Karunakar Dasineni8fbfeea2016-08-31 14:43:27 -0700549#endif /* _HAL_INTERNAL_H_ */