xref: /wlan-dirver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_ipa_wdi3.h (revision 2f4b444fb7e689b83a4ab0e7b3b38f0bf4def8e0)
1 /*
2  * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /**
18  * DOC: i_qdf_ipa_wdi3.h
19  * This file provides OS dependent IPA WDI APIs.
20  */
21 
22 #ifndef I_QDF_IPA_WDI_H
23 #define I_QDF_IPA_WDI_H
24 
25 #ifdef IPA_OFFLOAD
26 
27 #include <qdf_status.h>         /* QDF_STATUS */
28 #include <linux/ipa_wdi3.h>
29 
30 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) || \
31 	defined(CONFIG_IPA_WDI_UNIFIED_API)
32 
33 /**
34  * __qdf_ipa_wdi_version_t - IPA WDI version
35  */
36 typedef enum ipa_wdi_version __qdf_ipa_wdi_version_t;
37 
38 /**
39  * __qdf_ipa_wdi_init_in_params_t - wdi init input parameters
40  */
41 typedef struct ipa_wdi_init_in_params __qdf_ipa_wdi_init_in_params_t;
42 
43 #define __QDF_IPA_WDI_INIT_IN_PARAMS_WDI_VERSION(in_params)	\
44 	(((struct ipa_wdi_init_in_params *)(in_params))->wdi_version)
45 #define __QDF_IPA_WDI_INIT_IN_PARAMS_NOTIFY(in_params)	\
46 	(((struct ipa_wdi_init_in_params *)(in_params))->notify)
47 #define __QDF_IPA_WDI_INIT_IN_PARAMS_PRIV(in_params)	\
48 	(((struct ipa_wdi_init_in_params *)(in_params))->priv)
49 #define __QDF_IPA_WDI_INIT_IN_PARAMS_WDI_NOTIFY(in_params)	\
50 	(((struct ipa_wdi_init_in_params *)(in_params))->wdi_notify)
51 
52 /**
53  * __qdf_ipa_wdi_init_out_params_t - wdi init output parameters
54  */
55 typedef struct ipa_wdi_init_out_params __qdf_ipa_wdi_init_out_params_t;
56 
57 #define __QDF_IPA_WDI_INIT_OUT_PARAMS_IS_UC_READY(out_params)	\
58 	(((struct ipa_wdi_init_out_params *)(out_params))->is_uC_ready)
59 #define __QDF_IPA_WDI_INIT_OUT_PARAMS_IS_SMMU_ENABLED(out_params)	\
60 	(((struct ipa_wdi_init_out_params *)(out_params))->is_smmu_enabled)
61 #if (defined(IPA_WDI3_GSI)) || (defined(IPA_WDI2_GSI))
62 #define QDF_IPA_WDI_INIT_OUT_PARAMS_IS_OVER_GSI(out_params)	\
63 	(((struct ipa_wdi_init_out_params *)(out_params))->is_over_gsi)
64 #else
65 #define QDF_IPA_WDI_INIT_OUT_PARAMS_IS_OVER_GSI(out_params)	\
66 	false
67 #endif
68 
69 /**
70  * __qdf_ipa_wdi_hdr_info_t - Header to install on IPA HW
71  */
72 typedef struct ipa_wdi_hdr_info  __qdf_ipa_wdi_hdr_info_t;
73 
74 #define __QDF_IPA_WDI_HDR_INFO_HDR(hdr_info)	\
75 	(((struct ipa_wdi_hdr_info *)(hdr_info))->hdr)
76 #define __QDF_IPA_WDI_HDR_INFO_HDR_LEN(hdr_info)	\
77 	(((struct ipa_wdi_hdr_info *)(hdr_info))->hdr_len)
78 #define __QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(hdr_info)	\
79 	(((struct ipa_wdi_hdr_info *)(hdr_info))->dst_mac_addr_offset)
80 #define __QDF_IPA_WDI_HDR_INFO_HDR_TYPE(hdr_info)	\
81 	(((struct ipa_wdi_hdr_info *)(hdr_info))->hdr_type)
82 
83 /**
84  * __qdf_ipa_wdi_reg_intf_in_params_t - parameters for uC offload
85  *	interface registration
86  */
87 typedef struct ipa_wdi_reg_intf_in_params  __qdf_ipa_wdi_reg_intf_in_params_t;
88 
89 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_NETDEV_NAME(in)	\
90 	(((struct ipa_wdi_reg_intf_in_params *)(in))->netdev_name)
91 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in)	\
92 	(((struct ipa_wdi_reg_intf_in_params *)(in))->hdr_info)
93 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_ALT_DST_PIPE(in)	\
94 	(((struct ipa_wdi_reg_intf_in_params *)(in))->alt_dst_pipe)
95 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_META_DATA_VALID(in)	\
96 	(((struct ipa_wdi_reg_intf_in_params *)(in))->is_meta_data_valid)
97 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA(in)	\
98 	(((struct ipa_wdi_reg_intf_in_params *)(in))->meta_data)
99 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(in)	\
100 	(((struct ipa_wdi_reg_intf_in_params *)(in))->meta_data_mask)
101 #ifdef IPA_WDI3_TX_TWO_PIPES
102 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_TX1_USED(in)	\
103 	(((struct ipa_wdi_reg_intf_in_params *)(in))->is_tx1_used)
104 #endif
105 
106 typedef struct ipa_ep_cfg __qdf_ipa_ep_cfg_t;
107 
108 #define __QDF_IPA_EP_CFG_NAT_EN(cfg)	\
109 	(((struct ipa_ep_cfg *)(cfg))->nat.nat_en)
110 #define __QDF_IPA_EP_CFG_HDR_LEN(cfg)	\
111 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_len)
112 #define __QDF_IPA_EP_CFG_HDR_OFST_METADATA_VALID(cfg)	\
113 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_metadata_valid)
114 #define __QDF_IPA_EP_CFG_HDR_METADATA_REG_VALID(cfg)	\
115 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_metadata_reg_valid)
116 #define __QDF_IPA_EP_CFG_HDR_OFST_PKT_SIZE_VALID(cfg)	\
117 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_pkt_size_valid)
118 #define __QDF_IPA_EP_CFG_HDR_OFST_PKT_SIZE(cfg)	\
119 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_pkt_size)
120 #define __QDF_IPA_EP_CFG_HDR_ADDITIONAL_CONST_LEN(cfg)	\
121 	(((struct ipa_ep_cfg *)(cfg))->hdr.hdr_additional_const_len)
122 #define __QDF_IPA_EP_CFG_MODE(cfg)	\
123 	(((struct ipa_ep_cfg *)(cfg))->mode.mode)
124 #define __QDF_IPA_EP_CFG_HDR_LITTLE_ENDIAN(cfg)	\
125 	(((struct ipa_ep_cfg *)(cfg))->hdr_ext.hdr_little_endian)
126 
127 /**
128  * __qdf_ipa_wdi_pipe_setup_info_t - WDI TX/Rx configuration
129  */
130 typedef struct ipa_wdi_pipe_setup_info  __qdf_ipa_wdi_pipe_setup_info_t;
131 
132 #define __QDF_IPA_WDI_SETUP_INFO_EP_CFG(txrx)	\
133 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->ipa_ep_cfg)
134 
135 #define __QDF_IPA_WDI_SETUP_INFO_CLIENT(txrx)	\
136 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->client)
137 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(txrx)	\
138 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_base_pa)
139 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(txrx)	\
140 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_size)
141 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(txrx)	\
142 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_doorbell_pa)
143 #define __QDF_IPA_WDI_SETUP_INFO_IS_TXR_RN_DB_PCIE_ADDR(txrx)  \
144 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->is_txr_rn_db_pcie_addr)
145 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(txrx)	\
146 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_base_pa)
147 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(txrx)	\
148 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_size)
149 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(txrx)	\
150 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_doorbell_pa)
151 #define __QDF_IPA_WDI_SETUP_INFO_IS_EVT_RN_DB_PCIE_ADDR(txrx) \
152 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->is_evt_rn_db_pcie_addr)
153 #define __QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(txrx)	\
154 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->num_pkt_buffers)
155 #define __QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(txrx)	\
156 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->pkt_offset)
157 #define __QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(txrx)	\
158 	(((struct ipa_wdi_pipe_setup_info *)(txrx))->desc_format_template)
159 
160 /**
161  * __qdf_ipa_wdi_pipe_setup_info_smmu_t - WDI TX/Rx configuration
162  */
163 typedef struct ipa_wdi_pipe_setup_info_smmu __qdf_ipa_wdi_pipe_setup_info_smmu_t;
164 
165 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EP_CFG(txrx)	\
166 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->ipa_ep_cfg)
167 
168 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_CLIENT(txrx)	\
169 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->client)
170 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_BASE(txrx)	\
171 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_base)
172 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_SIZE(txrx)	\
173 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_size)
174 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_DOORBELL_PA(txrx)	\
175 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_doorbell_pa)
176 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_IS_TXR_RN_DB_PCIE_ADDR(txrx)  \
177 	(((struct ipa_wdi_pipe_setup_info_smmu *) \
178 	  (txrx))->is_txr_rn_db_pcie_addr)
179 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_BASE(txrx)	\
180 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_base)
181 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_SIZE(txrx)	\
182 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_size)
183 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_DOORBELL_PA(txrx)	\
184 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_doorbell_pa)
185 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_IS_EVT_RN_DB_PCIE_ADDR(txrx) \
186 	(((struct ipa_wdi_pipe_setup_info_smmu *) \
187 	  (txrx))->is_evt_rn_db_pcie_addr)
188 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_NUM_PKT_BUFFERS(txrx)	\
189 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->num_pkt_buffers)
190 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_PKT_OFFSET(txrx)	\
191 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->pkt_offset)
192 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_DESC_FORMAT_TEMPLATE(txrx)	\
193 	(((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->desc_format_template)
194 
195 /**
196  * __qdf_ipa_wdi_conn_in_params_t - information provided by
197  *		uC offload client
198  */
199 typedef struct ipa_wdi_conn_in_params  __qdf_ipa_wdi_conn_in_params_t;
200 
201 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in)	\
202 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->notify)
203 #define __QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in)	\
204 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->priv)
205 #define __QDF_IPA_WDI_CONN_IN_PARAMS_SMMU_ENABLED(pipe_in)	\
206 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->is_smmu_enabled)
207 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NUM_SYS_PIPE_NEEDED(pipe_in)	\
208 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->num_sys_pipe_needed)
209 #define __QDF_IPA_WDI_CONN_IN_PARAMS_SYS_IN(in)	\
210 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->sys_in)
211 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in)	\
212 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_tx.tx)
213 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX_SMMU(pipe_in)	\
214 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_tx.tx_smmu)
215 #ifdef IPA_WDI3_TX_TWO_PIPES
216 #define __QDF_IPA_WDI_CONN_IN_PARAMS_IS_TX1_USED(pipe_in)	\
217 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->is_tx1_used)
218 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX_ALT_PIPE(pipe_in)	\
219 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_tx1.tx)
220 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX_ALT_PIPE_SMMU(pipe_in)	\
221 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_tx1.tx_smmu)
222 #endif
223 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in)	\
224 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_rx.rx)
225 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX_SMMU(pipe_in)	\
226 	(((struct ipa_wdi_conn_in_params *)(pipe_in))->u_rx.rx_smmu)
227 
228 /**
229  * __qdf_ipa_wdi_conn_out_params_t - information provided
230  *				to WLAN druver
231  */
232 typedef struct ipa_wdi_conn_out_params  __qdf_ipa_wdi_conn_out_params_t;
233 
234 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(pipe_out)	\
235 	(((struct ipa_wdi_conn_out_params *)(pipe_out))->tx_uc_db_pa)
236 #ifdef IPA_WDI3_TX_TWO_PIPES
237 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_ALT_DB_PA(pipe_out)	\
238 	(((struct ipa_wdi_conn_out_params *)(pipe_out))->tx1_uc_db_pa)
239 #endif
240 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(pipe_out)	\
241 	(((struct ipa_wdi_conn_out_params *)(pipe_out))->rx_uc_db_pa)
242 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0))
243 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_IS_DB_DDR_MAPPED(pipe_out)	\
244 	(((struct ipa_wdi_conn_out_params *)(pipe_out))->is_ddr_mapped)
245 #else
246 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_IS_DB_DDR_MAPPED(pipe_out) false
247 #endif
248 
249 /**
250  * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile
251  */
252 typedef struct ipa_wdi_perf_profile  __qdf_ipa_wdi_perf_profile_t;
253 
254 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile)	\
255 	(((struct ipa_wdi_perf_profile *)(profile))->client)
256 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile)	\
257 	(((struct ipa_wdi_perf_profile *)(profile))->max_supported_bw_mbps)
258 
259 /**
260  * __qdf_ipa_wdi_init - Client should call this function to
261  * init WDI IPA offload data path
262  *
263  * Note: Should not be called from atomic context and only
264  * after checking IPA readiness using ipa_register_ipa_ready_cb()
265  *
266  * @Return 0 on success, negative on failure
267  */
268 static inline int __qdf_ipa_wdi_init(struct ipa_wdi_init_in_params *in,
269 		 struct ipa_wdi_init_out_params *out)
270 {
271 	return ipa_wdi_init(in, out);
272 }
273 
274 /**
275  * __qdf_ipa_wdi_cleanup - Client should call this function to
276  * clean up WDI IPA offload data path
277  *
278  * @Return 0 on success, negative on failure
279  */
280 static inline int __qdf_ipa_wdi_cleanup(void)
281 {
282 	return ipa_wdi_cleanup();
283 }
284 
285 /**
286  * __qdf_ipa_wdi_reg_intf - Client should call this function to
287  * init WDI IPA offload data path
288  *
289  * Note: Should not be called from atomic context and only
290  * after checking IPA readiness using ipa_register_ipa_ready_cb()
291  *
292  * @Return 0 on success, negative on failure
293  */
294 static inline int __qdf_ipa_wdi_reg_intf(
295 	struct ipa_wdi_reg_intf_in_params *in)
296 {
297 	return ipa_wdi_reg_intf(in);
298 }
299 
300 /**
301  * __qdf_ipa_wdi_dereg_intf - Client Driver should call this
302  * function to deregister before unload and after disconnect
303  *
304  * @Return 0 on success, negative on failure
305  */
306 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name)
307 {
308 	return ipa_wdi_dereg_intf(netdev_name);
309 }
310 
311 /**
312  * __qdf_ipa_wdi_conn_pipes - Client should call this
313  * function to connect pipes
314  *
315  * @in:	[in] input parameters from client
316  * @out: [out] output params to client
317  *
318  * Note: Should not be called from atomic context and only
319  * after checking IPA readiness using ipa_register_ipa_ready_cb()
320  *
321  * @Return 0 on success, negative on failure
322  */
323 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in,
324 			struct ipa_wdi_conn_out_params *out)
325 {
326 	return ipa_wdi_conn_pipes(in, out);
327 }
328 
329 /**
330  * __qdf_ipa_wdi_disconn_pipes() - Client should call this
331  *		function to disconnect pipes
332  *
333  * Note: Should not be called from atomic context
334  *
335  * Returns: 0 on success, negative on failure
336  */
337 static inline int __qdf_ipa_wdi_disconn_pipes(void)
338 {
339 	return ipa_wdi_disconn_pipes();
340 }
341 
342 /**
343  * __qdf_ipa_wdi_enable_pipes() - Client should call this
344  *		function to enable IPA offload data path
345  *
346  * Note: Should not be called from atomic context
347  *
348  * Returns: 0 on success, negative on failure
349  */
350 static inline int __qdf_ipa_wdi_enable_pipes(void)
351 {
352 	return ipa_wdi_enable_pipes();
353 }
354 
355 /**
356  * __qdf_ipa_wdi_disable_pipes() - Client should call this
357  *		function to disable IPA offload data path
358  *
359  * Note: Should not be called from atomic context
360  *
361  * Returns: 0 on success, negative on failure
362  */
363 static inline int __qdf_ipa_wdi_disable_pipes(void)
364 {
365 	return ipa_wdi_disable_pipes();
366 }
367 
368 /**
369  * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to
370  *		set IPA clock bandwidth based on data rates
371  *
372  * @profile: [in] BandWidth profile to use
373  *
374  * Returns: 0 on success, negative on failure
375  */
376 static inline int __qdf_ipa_wdi_set_perf_profile(
377 			struct ipa_wdi_perf_profile *profile)
378 {
379 	return ipa_wdi_set_perf_profile(profile);
380 }
381 
382 /**
383  * __qdf_ipa_wdi_create_smmu_mapping() - Client should call this function to
384  *		create smmu mapping
385  *
386  * @num_buffers: [in] number of buffers
387  * @info: [in] wdi buffer info
388  *
389  * Returns: 0 on success, negative on failure
390  */
391 static inline int __qdf_ipa_wdi_create_smmu_mapping(u32 num_buffers,
392 		struct ipa_wdi_buffer_info *info)
393 {
394 	return ipa_wdi_create_smmu_mapping(num_buffers, info);
395 }
396 
397 /**
398  * __qdf_ipa_wdi_release_smmu_mapping() - Client should call this function to
399  *		release smmu mapping
400  *
401  * @num_buffers: [in] number of buffers
402  * @info: [in] wdi buffer info
403  *
404  * Returns: 0 on success, negative on failure
405  */
406 static inline int __qdf_ipa_wdi_release_smmu_mapping(u32 num_buffers,
407 		struct ipa_wdi_buffer_info *info)
408 {
409 	return ipa_wdi_release_smmu_mapping(num_buffers, info);
410 }
411 
412 #ifdef WDI3_STATS_UPDATE
413 /**
414  * __qdf_ipa_wdi_wlan_stats() - Client should call this function to
415  *		send Tx byte counts to IPA driver
416  * @tx_stats: number of Tx bytes on STA and SAP
417  *
418  * Returns: 0 on success, negative on failure
419  */
420 static inline int __qdf_ipa_wdi_wlan_stats(struct ipa_wdi_tx_info *tx_stats)
421 {
422 	return ipa_wdi_sw_stats(tx_stats);
423 }
424 
425 /**
426  * ipa_uc_bw_monitor() - start/stop uc bw monitoring
427  * @bw_info: set bw info levels to monitor
428  *
429  * Returns: 0 on success, negative on failure
430  */
431 static inline int __qdf_ipa_uc_bw_monitor(struct ipa_wdi_bw_info *bw_info)
432 {
433 	return ipa_uc_bw_monitor(bw_info);
434 }
435 #endif
436 #else /* CONFIG_IPA_WDI_UNIFIED_API */
437 
438 /**
439  * __qdf_ipa_wdi_hdr_info_t - Header to install on IPA HW
440  */
441 typedef struct ipa_wdi3_hdr_info  __qdf_ipa_wdi_hdr_info_t;
442 
443 #define __QDF_IPA_WDI_HDR_INFO_HDR(hdr_info)	\
444 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr)
445 #define __QDF_IPA_WDI_HDR_INFO_HDR_LEN(hdr_info)	\
446 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_len)
447 #define __QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(hdr_info)	\
448 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->dst_mac_addr_offset)
449 #define __QDF_IPA_WDI_HDR_INFO_HDR_TYPE(hdr_info)	\
450 	(((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_type)
451 
452 /**
453  * __qdf_ipa_wdi_reg_intf_in_params_t - parameters for uC offload
454  *	interface registration
455  */
456 typedef struct ipa_wdi3_reg_intf_in_params  __qdf_ipa_wdi_reg_intf_in_params_t;
457 
458 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_NETDEV_NAME(in)	\
459 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->netdev_name)
460 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in)	\
461 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->hdr_info)
462 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_META_DATA_VALID(in)	\
463 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->is_meta_data_valid)
464 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA(in)	\
465 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data)
466 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(in)	\
467 	(((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data_mask)
468 
469 /**
470  * __qdf_ipa_wdi_setup_info_t - WDI3 TX/Rx configuration
471  */
472 typedef struct ipa_wdi3_setup_info  __qdf_ipa_wdi_pipe_setup_info_t;
473 
474 #define __QDF_IPA_WDI_SETUP_INFO_NAT_EN(txrx)	\
475 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.nat.nat_en)
476 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LEN(txrx)	\
477 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_len)
478 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_METADATA_VALID(txrx)	\
479 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_metadata_valid)
480 #define __QDF_IPA_WDI_SETUP_INFO_HDR_METADATA_REG_VALID(txrx)	\
481 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_metadata_reg_valid)
482 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE_VALID(txrx)	\
483 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size_valid)
484 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE(txrx)	\
485 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size)
486 #define __QDF_IPA_WDI_SETUP_INFO_HDR_ADDITIONAL_CONST_LEN(txrx)	\
487 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_additional_const_len)
488 #define __QDF_IPA_WDI_SETUP_INFO_MODE(txrx)	\
489 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.mode.mode)
490 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LITTLE_ENDIAN(txrx)	\
491 	(((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr_ext.hdr_little_endian)
492 
493 #define __QDF_IPA_WDI_SETUP_INFO_CLIENT(txrx)	\
494 	(((struct ipa_wdi3_setup_info *)(txrx))->client)
495 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(txrx)	\
496 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_base_pa)
497 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(txrx)	\
498 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_size)
499 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(txrx)	\
500 	(((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_doorbell_pa)
501 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(txrx)	\
502 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_base_pa)
503 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(txrx)	\
504 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_size)
505 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(txrx)	\
506 	(((struct ipa_wdi3_setup_info *)(txrx))->event_ring_doorbell_pa)
507 #define __QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(txrx)	\
508 	(((struct ipa_wdi3_setup_info *)(txrx))->num_pkt_buffers)
509 #define __QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(txrx)	\
510 	(((struct ipa_wdi3_setup_info *)(txrx))->pkt_offset)
511 #define __QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(txrx)	\
512 	(((struct ipa_wdi3_setup_info *)(txrx))->desc_format_template)
513 
514 /**
515  * __qdf_ipa_wdi_conn_in_params_t - information provided by
516  *		uC offload client
517  */
518 typedef struct ipa_wdi3_conn_in_params  __qdf_ipa_wdi_conn_in_params_t;
519 
520 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in)	\
521 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->notify)
522 #define __QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in)	\
523 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->priv)
524 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in)	\
525 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->tx)
526 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in)	\
527 	(((struct ipa_wdi3_conn_in_params *)(pipe_in))->rx)
528 
529 /**
530  * __qdf_ipa_wdi_conn_out_params_t - information provided
531  *				to WLAN druver
532  */
533 typedef struct ipa_wdi3_conn_out_params  __qdf_ipa_wdi_conn_out_params_t;
534 
535 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(pipe_out)	\
536 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_pa)
537 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_VA(pipe_out)	\
538 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_va)
539 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(pipe_out)	\
540 	(((struct ipa_wdi3_conn_out_params *)(pipe_out))->rx_uc_db_pa)
541 
542 /**
543  * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile
544  */
545 typedef struct ipa_wdi3_perf_profile  __qdf_ipa_wdi_perf_profile_t;
546 
547 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile)	\
548 	(((struct ipa_wdi3_perf_profile *)(profile))->client)
549 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile)	\
550 	(((struct ipa_wdi3_perf_profile *)(profile))->max_supported_bw_mbps)
551 
552 /**
553  * __qdf_ipa_wdi_reg_intf - Client should call this function to
554  * init WDI3 IPA offload data path
555  *
556  * Note: Should not be called from atomic context and only
557  * after checking IPA readiness using ipa_register_ipa_ready_cb()
558  *
559  * @Return 0 on success, negative on failure
560  */
561 static inline int __qdf_ipa_wdi_reg_intf(
562 	struct ipa_wdi3_reg_intf_in_params *in)
563 {
564 	return ipa_wdi3_reg_intf(in);
565 }
566 
567 /**
568  * __qdf_ipa_wdi_dereg_intf - Client Driver should call this
569  * function to deregister before unload and after disconnect
570  *
571  * @Return 0 on success, negative on failure
572  */
573 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name)
574 {
575 	return ipa_wdi3_dereg_intf(netdev_name);
576 }
577 
578 /**
579  * __qdf_ipa_wdi_conn_pipes - Client should call this
580  * function to connect pipes
581  *
582  * @in:	[in] input parameters from client
583  * @out: [out] output params to client
584  *
585  * Note: Should not be called from atomic context and only
586  * after checking IPA readiness using ipa_register_ipa_ready_cb()
587  *
588  * @Return 0 on success, negative on failure
589  */
590 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi3_conn_in_params *in,
591 					   struct ipa_wdi3_conn_out_params *out)
592 {
593 	return ipa_wdi3_conn_pipes(in, out);
594 }
595 
596 /**
597  * __qdf_ipa_wdi_disconn_pipes() - Client should call this
598  *		function to disconnect pipes
599  *
600  * Note: Should not be called from atomic context
601  *
602  * Returns: 0 on success, negative on failure
603  */
604 static inline int __qdf_ipa_wdi_disconn_pipes(void)
605 {
606 	return ipa_wdi3_disconn_pipes();
607 }
608 
609 /**
610  * __qdf_ipa_wdi_enable_pipes() - Client should call this
611  *		function to enable IPA offload data path
612  *
613  * Note: Should not be called from atomic context
614  *
615  * Returns: 0 on success, negative on failure
616  */
617 static inline int __qdf_ipa_wdi_enable_pipes(void)
618 {
619 	return ipa_wdi3_enable_pipes();
620 }
621 
622 /**
623  * __qdf_ipa_wdi_disable_pipes() - Client should call this
624  *		function to disable IPA offload data path
625  *
626  * Note: Should not be called from atomic context
627  *
628  * Returns: 0 on success, negative on failure
629  */
630 static inline int __qdf_ipa_wdi_disable_pipes(void)
631 {
632 	return ipa_wdi3_disable_pipes();
633 }
634 
635 /**
636  * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to
637  *		set IPA clock bandwidth based on data rates
638  *
639  * @profile: [in] BandWidth profile to use
640  *
641  * Returns: 0 on success, negative on failure
642  */
643 static inline int __qdf_ipa_wdi_set_perf_profile(
644 			struct ipa_wdi3_perf_profile *profile)
645 {
646 	return ipa_wdi3_set_perf_profile(profile);
647 }
648 
649 #endif /* CONFIG_IPA_WDI_UNIFIED_API */
650 
651 #endif /* IPA_OFFLOAD */
652 #endif /* I_QDF_IPA_WDI_H */
653