1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #ifndef __PLD_IPCI_H__
21 #define __PLD_IPCI_H__
22 
23 #ifdef CONFIG_PLD_IPCI_ICNSS
24 #ifdef CONFIG_CNSS_OUT_OF_TREE
25 #include "icnss2.h"
26 #else
27 #include <soc/qcom/icnss2.h>
28 #endif
29 #endif
30 #include "pld_internal.h"
31 
32 #ifndef CONFIG_PLD_IPCI_ICNSS
pld_ipci_register_driver(void)33 static inline int pld_ipci_register_driver(void)
34 {
35 	return 0;
36 }
37 
pld_ipci_unregister_driver(void)38 static inline void pld_ipci_unregister_driver(void)
39 {
40 }
41 
pld_ipci_wlan_enable(struct device * dev,struct pld_wlan_enable_cfg * config,enum pld_driver_mode mode,const char * host_version)42 static inline int pld_ipci_wlan_enable(struct device *dev,
43 				       struct pld_wlan_enable_cfg *config,
44 				       enum pld_driver_mode mode,
45 				       const char *host_version)
46 {
47 	return 0;
48 }
49 
pld_ipci_wlan_disable(struct device * dev,enum pld_driver_mode mode)50 static inline int pld_ipci_wlan_disable(struct device *dev,
51 					enum pld_driver_mode mode)
52 {
53 	return 0;
54 }
55 
pld_ipci_get_soc_info(struct device * dev,struct pld_soc_info * info)56 static inline int pld_ipci_get_soc_info(struct device *dev,
57 					struct pld_soc_info *info)
58 {
59 	return 0;
60 }
61 
pld_ipci_power_on(struct device * dev)62 static inline int pld_ipci_power_on(struct device *dev)
63 {
64 	return 0;
65 }
66 
pld_ipci_power_off(struct device * dev)67 static inline int pld_ipci_power_off(struct device *dev)
68 {
69 	return 0;
70 }
71 
pld_ipci_idle_restart(struct device * dev)72 static inline int pld_ipci_idle_restart(struct device *dev)
73 {
74 	return 0;
75 }
76 
pld_ipci_idle_shutdown(struct device * dev)77 static inline int pld_ipci_idle_shutdown(struct device *dev)
78 {
79 	return 0;
80 }
81 
pld_ipci_force_assert_target(struct device * dev)82 static inline int pld_ipci_force_assert_target(struct device *dev)
83 {
84 	return -EINVAL;
85 }
86 
pld_ipci_get_user_msi_assignment(struct device * dev,char * user_name,int * num_vectors,uint32_t * user_base_data,uint32_t * base_vector)87 static inline int pld_ipci_get_user_msi_assignment(struct device *dev,
88 						   char *user_name,
89 						   int *num_vectors,
90 						   uint32_t *user_base_data,
91 						   uint32_t *base_vector)
92 {
93 	return 0;
94 }
95 
pld_ipci_get_msi_irq(struct device * dev,unsigned int vector)96 static inline int pld_ipci_get_msi_irq(struct device *dev, unsigned int vector)
97 {
98 	return 0;
99 }
100 
pld_ipci_get_msi_address(struct device * dev,uint32_t * msi_addr_low,uint32_t * msi_addr_high)101 static inline void pld_ipci_get_msi_address(struct device *dev,
102 					    uint32_t *msi_addr_low,
103 					    uint32_t *msi_addr_high)
104 {
105 }
106 
pld_ipci_is_fw_down(struct device * dev)107 static inline int pld_ipci_is_fw_down(struct device *dev)
108 {
109 	return 0;
110 }
111 
pld_ipci_set_fw_log_mode(struct device * dev,u8 fw_log_mode)112 static inline int pld_ipci_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
113 {
114 	return 0;
115 }
116 
pld_ipci_smmu_get_domain(struct device * dev)117 static inline void *pld_ipci_smmu_get_domain(struct device *dev)
118 {
119 	return NULL;
120 }
121 
pld_ipci_smmu_map(struct device * dev,phys_addr_t paddr,uint32_t * iova_addr,size_t size)122 static inline int pld_ipci_smmu_map(struct device *dev, phys_addr_t paddr,
123 				    uint32_t *iova_addr, size_t size)
124 {
125 	return 0;
126 }
127 
pld_ipci_smmu_unmap(struct device * dev,uint32_t iova_addr,size_t size)128 static inline int pld_ipci_smmu_unmap(struct device *dev,
129 				      uint32_t iova_addr, size_t size)
130 {
131 	return 0;
132 }
133 
pld_ipci_force_wake_request(struct device * dev)134 static inline int pld_ipci_force_wake_request(struct device *dev)
135 {
136 	return 0;
137 }
138 
pld_ipci_force_wake_release(struct device * dev)139 static inline int pld_ipci_force_wake_release(struct device *dev)
140 {
141 	return 0;
142 }
143 
pld_ipci_is_device_awake(struct device * dev)144 static inline int pld_ipci_is_device_awake(struct device *dev)
145 {
146 	return 0;
147 }
148 
pld_ipci_athdiag_read(struct device * dev,uint32_t offset,uint32_t memtype,uint32_t datalen,uint8_t * output)149 static inline int pld_ipci_athdiag_read(struct device *dev, uint32_t offset,
150 					uint32_t memtype, uint32_t datalen,
151 					uint8_t *output)
152 {
153 	return 0;
154 }
155 
pld_ipci_athdiag_write(struct device * dev,uint32_t offset,uint32_t memtype,uint32_t datalen,uint8_t * input)156 static inline int pld_ipci_athdiag_write(struct device *dev, uint32_t offset,
157 					 uint32_t memtype, uint32_t datalen,
158 					 uint8_t *input)
159 {
160 	return 0;
161 }
162 
163 static inline int
pld_ipci_qmi_send(struct device * dev,int type,void * cmd,int cmd_len,void * cb_ctx,int (* cb)(void * ctx,void * event,int event_len))164 pld_ipci_qmi_send(struct device *dev, int type, void *cmd,
165 		  int cmd_len, void *cb_ctx,
166 		  int (*cb)(void *ctx, void *event, int event_len))
167 {
168 	return 0;
169 }
170 
pld_ipci_thermal_register(struct device * dev,unsigned long max_state,int mon_id)171 static inline int pld_ipci_thermal_register(struct device *dev,
172 					    unsigned long max_state,
173 					    int mon_id)
174 {
175 	return 0;
176 }
177 
pld_ipci_thermal_unregister(struct device * dev,int mon_id)178 static inline void pld_ipci_thermal_unregister(struct device *dev,
179 					       int mon_id)
180 {
181 }
182 
pld_ipci_get_thermal_state(struct device * dev,unsigned long * thermal_state,int mon_id)183 static inline int pld_ipci_get_thermal_state(struct device *dev,
184 					     unsigned long *thermal_state,
185 					     int mon_id)
186 {
187 	return 0;
188 }
189 
pld_ipci_exit_power_save(struct device * dev)190 static inline int pld_ipci_exit_power_save(struct device *dev)
191 {
192 	return 0;
193 }
194 
pld_ipci_prevent_l1(struct device * dev)195 static inline int pld_ipci_prevent_l1(struct device *dev)
196 {
197 	return 0;
198 }
199 
pld_ipci_allow_l1(struct device * dev)200 static inline void pld_ipci_allow_l1(struct device *dev)
201 {
202 }
203 
pld_ipci_mhi_state(struct device * dev)204 static inline int pld_ipci_mhi_state(struct device *dev)
205 {
206 	return 0;
207 }
208 
pld_ipci_is_pci_ep_awake(struct device * dev)209 static inline int pld_ipci_is_pci_ep_awake(struct device *dev)
210 {
211 	return 0;
212 }
213 
pld_ipci_get_irq(struct device * dev,int ce_id)214 static inline int pld_ipci_get_irq(struct device *dev, int ce_id)
215 {
216 	return 0;
217 }
218 #else
219 /**
220  * pld_ipci_register_driver() - Register platform device callback functions
221  *
222  * Return: int
223  */
224 int pld_ipci_register_driver(void);
225 
226 /**
227  * pld_ipci_unregister_driver() - Unregister platform device callback functions
228  *
229  * Return: void
230  */
231 void pld_ipci_unregister_driver(void);
232 
233 /**
234  * pld_ipci_wlan_enable() - Enable WLAN
235  * @dev: device
236  * @config: WLAN configuration data
237  * @mode: WLAN mode
238  * @host_version: host software version
239  *
240  * This function enables WLAN FW. It passed WLAN configuration data,
241  * WLAN mode and host software version to FW.
242  *
243  * Return: 0 for success
244  *         Non zero failure code for errors
245  */
246 int pld_ipci_wlan_enable(struct device *dev,
247 			 struct pld_wlan_enable_cfg *config,
248 			 enum pld_driver_mode mode, const char *host_version);
249 
250 /**
251  * pld_ipci_wlan_disable() - Disable WLAN
252  * @dev: device
253  * @mode: WLAN mode
254  *
255  * This function disables WLAN FW. It passes WLAN mode to FW.
256  *
257  * Return: 0 for success
258  *         Non zero failure code for errors
259  */
260 int pld_ipci_wlan_disable(struct device *dev, enum pld_driver_mode mode);
261 
262 /**
263  * pld_ipci_get_soc_info() - Get SOC information
264  * @dev: device
265  * @info: buffer to SOC information
266  *
267  * Return SOC info to the buffer.
268  *
269  * Return: 0 for success
270  *         Non zero failure code for errors
271  */
272 int pld_ipci_get_soc_info(struct device *dev, struct pld_soc_info *info);
273 int pld_ipci_get_irq(struct device *dev, int ce_id);
274 
pld_ipci_power_on(struct device * dev)275 static inline int pld_ipci_power_on(struct device *dev)
276 {
277 	return icnss_power_on(dev);
278 }
279 
pld_ipci_power_off(struct device * dev)280 static inline int pld_ipci_power_off(struct device *dev)
281 {
282 	return icnss_power_off(dev);
283 }
284 
pld_ipci_idle_restart(struct device * dev)285 static inline int pld_ipci_idle_restart(struct device *dev)
286 {
287 	return icnss_idle_restart(dev);
288 }
289 
pld_ipci_idle_shutdown(struct device * dev)290 static inline int pld_ipci_idle_shutdown(struct device *dev)
291 {
292 	return icnss_idle_shutdown(dev);
293 }
294 
pld_ipci_force_assert_target(struct device * dev)295 static inline int pld_ipci_force_assert_target(struct device *dev)
296 {
297 	return icnss_trigger_recovery(dev);
298 }
299 
pld_ipci_get_user_msi_assignment(struct device * dev,char * user_name,int * num_vectors,uint32_t * user_base_data,uint32_t * base_vector)300 static inline int pld_ipci_get_user_msi_assignment(struct device *dev,
301 						   char *user_name,
302 						   int *num_vectors,
303 						   uint32_t *user_base_data,
304 						   uint32_t *base_vector)
305 {
306 	return icnss_get_user_msi_assignment(dev, user_name, num_vectors,
307 					    user_base_data, base_vector);
308 }
309 
pld_ipci_get_msi_irq(struct device * dev,unsigned int vector)310 static inline int pld_ipci_get_msi_irq(struct device *dev, unsigned int vector)
311 {
312 	return icnss_get_msi_irq(dev, vector);
313 }
314 
pld_ipci_get_msi_address(struct device * dev,uint32_t * msi_addr_low,uint32_t * msi_addr_high)315 static inline void pld_ipci_get_msi_address(struct device *dev,
316 					    uint32_t *msi_addr_low,
317 					    uint32_t *msi_addr_high)
318 {
319 	icnss_get_msi_address(dev, msi_addr_low, msi_addr_high);
320 }
321 
pld_ipci_is_fw_down(struct device * dev)322 static inline int pld_ipci_is_fw_down(struct device *dev)
323 {
324 	return icnss_is_fw_down();
325 }
326 
pld_ipci_set_fw_log_mode(struct device * dev,u8 fw_log_mode)327 static inline int pld_ipci_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
328 {
329 	return icnss_set_fw_log_mode(dev, fw_log_mode);
330 }
331 
pld_ipci_smmu_get_domain(struct device * dev)332 static inline void *pld_ipci_smmu_get_domain(struct device *dev)
333 {
334 	return icnss_smmu_get_domain(dev);
335 }
336 
pld_ipci_smmu_map(struct device * dev,phys_addr_t paddr,uint32_t * iova_addr,size_t size)337 static inline int pld_ipci_smmu_map(struct device *dev, phys_addr_t paddr,
338 				    uint32_t *iova_addr, size_t size)
339 {
340 	return icnss_smmu_map(dev, paddr, iova_addr, size);
341 }
342 
343 #ifdef CONFIG_SMMU_S1_UNMAP
pld_ipci_smmu_unmap(struct device * dev,uint32_t iova_addr,size_t size)344 static inline int pld_ipci_smmu_unmap(struct device *dev,
345 				      uint32_t iova_addr, size_t size)
346 {
347 	return icnss_smmu_unmap(dev, iova_addr, size);
348 }
349 
350 #else
pld_ipci_smmu_unmap(struct device * dev,uint32_t iova_addr,size_t size)351 static inline int pld_ipci_smmu_unmap(struct device *dev,
352 				      uint32_t iova_addr, size_t size)
353 {
354 	return 0;
355 }
356 #endif
357 
pld_ipci_force_wake_request(struct device * dev)358 static inline int pld_ipci_force_wake_request(struct device *dev)
359 {
360 	return icnss_force_wake_request(dev);
361 }
362 
pld_ipci_force_wake_release(struct device * dev)363 static inline int pld_ipci_force_wake_release(struct device *dev)
364 {
365 	return icnss_force_wake_release(dev);
366 }
367 
pld_ipci_is_device_awake(struct device * dev)368 static inline int pld_ipci_is_device_awake(struct device *dev)
369 {
370 	return icnss_is_device_awake(dev);
371 }
372 
pld_ipci_athdiag_read(struct device * dev,uint32_t offset,uint32_t memtype,uint32_t datalen,uint8_t * output)373 static inline int pld_ipci_athdiag_read(struct device *dev, uint32_t offset,
374 					uint32_t memtype, uint32_t datalen,
375 					uint8_t *output)
376 {
377 	return icnss_athdiag_read(dev, offset, memtype, datalen, output);
378 }
379 
pld_ipci_athdiag_write(struct device * dev,uint32_t offset,uint32_t memtype,uint32_t datalen,uint8_t * input)380 static inline int pld_ipci_athdiag_write(struct device *dev, uint32_t offset,
381 					 uint32_t memtype, uint32_t datalen,
382 					 uint8_t *input)
383 {
384 	return icnss_athdiag_write(dev, offset, memtype, datalen, input);
385 }
386 
387 static inline int
pld_ipci_qmi_send(struct device * dev,int type,void * cmd,int cmd_len,void * cb_ctx,int (* cb)(void * ctx,void * event,int event_len))388 pld_ipci_qmi_send(struct device *dev, int type, void *cmd,
389 		  int cmd_len, void *cb_ctx,
390 		  int (*cb)(void *ctx, void *event, int event_len))
391 {
392 	return icnss_qmi_send(dev, type, cmd, cmd_len, cb_ctx, cb);
393 }
394 
pld_ipci_thermal_register(struct device * dev,unsigned long max_state,int mon_id)395 static inline int pld_ipci_thermal_register(struct device *dev,
396 					    unsigned long max_state,
397 					    int mon_id)
398 {
399 	return icnss_thermal_cdev_register(dev, max_state, mon_id);
400 }
401 
pld_ipci_thermal_unregister(struct device * dev,int mon_id)402 static inline void pld_ipci_thermal_unregister(struct device *dev,
403 					       int mon_id)
404 {
405 	icnss_thermal_cdev_unregister(dev, mon_id);
406 }
407 
pld_ipci_get_thermal_state(struct device * dev,unsigned long * thermal_state,int mon_id)408 static inline int pld_ipci_get_thermal_state(struct device *dev,
409 					     unsigned long *thermal_state,
410 					     int mon_id)
411 {
412 	return icnss_get_curr_therm_cdev_state(dev, thermal_state, mon_id);
413 }
414 
pld_ipci_exit_power_save(struct device * dev)415 static inline int pld_ipci_exit_power_save(struct device *dev)
416 {
417 	return icnss_exit_power_save(dev);
418 }
419 
pld_ipci_prevent_l1(struct device * dev)420 static inline int pld_ipci_prevent_l1(struct device *dev)
421 {
422 	return icnss_prevent_l1(dev);
423 }
424 
pld_ipci_allow_l1(struct device * dev)425 static inline void pld_ipci_allow_l1(struct device *dev)
426 {
427 	icnss_allow_l1(dev);
428 }
429 
pld_ipci_is_pci_ep_awake(struct device * dev)430 static inline int pld_ipci_is_pci_ep_awake(struct device *dev)
431 {
432 	return icnss_is_pci_ep_awake(dev);
433 }
434 
pld_ipci_mhi_state(struct device * dev)435 static inline int pld_ipci_mhi_state(struct device *dev)
436 {
437 	return icnss_get_mhi_state(dev);
438 }
439 #endif
440 #endif
441