blob: 868948130c6d2aba37d69e4509c668d7cbade0b9 [file] [log] [blame]
Yuanyuan Liud9f7a362016-01-22 14:27:12 -08001/*
Nirav Shahfb79af82018-03-12 18:10:33 +05302 * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
Yuanyuan Liud9f7a362016-01-22 14:27:12 -08003 *
Yuanyuan Liud9f7a362016-01-22 14:27:12 -08004 * 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.
8 *
9 * 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.
17 */
18
Yuanyuan Liud9f7a362016-01-22 14:27:12 -080019#ifndef __PLD_PCIE_H__
20#define __PLD_PCIE_H__
21
Yuanyuan Liu16a55622016-09-14 16:15:59 -070022#ifdef CONFIG_PLD_PCIE_CNSS
Yue Mae6a7a322016-08-31 11:09:23 -070023#include <net/cnss2.h>
24#endif
Yuanyuan Liuf7aea122016-05-25 16:39:40 -070025#include "pld_internal.h"
Yuanyuan Liud9f7a362016-01-22 14:27:12 -080026
Qun Zhang4a83a462018-09-11 16:28:51 +080027#ifdef MULTI_IF_NAME
28#define PREFIX MULTI_IF_NAME "/"
29#else
30#define PREFIX ""
31#endif
32
Nirav Shahfb79af82018-03-12 18:10:33 +053033#ifndef HIF_PCI
Yuanyuan Liud9f7a362016-01-22 14:27:12 -080034static inline int pld_pcie_register_driver(void)
35{
36 return 0;
37}
38
39static inline void pld_pcie_unregister_driver(void)
40{
Yuanyuan Liud9f7a362016-01-22 14:27:12 -080041}
42
Yue Ma85761e62017-10-30 11:13:45 -070043static inline int pld_pcie_get_ce_id(struct device *dev, int irq)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -080044{
45 return 0;
46}
47#else
48int pld_pcie_register_driver(void);
49void pld_pcie_unregister_driver(void);
Yue Ma85761e62017-10-30 11:13:45 -070050int pld_pcie_get_ce_id(struct device *dev, int irq);
Yuanyuan Liud9f7a362016-01-22 14:27:12 -080051#endif
52
Yue Ma08047522016-11-08 18:53:26 -080053#ifndef CONFIG_PLD_PCIE_CNSS
54static inline int pld_pcie_wlan_enable(struct device *dev,
55 struct pld_wlan_enable_cfg *config,
56 enum pld_driver_mode mode,
57 const char *host_version)
58{
59 return 0;
60}
Yue Ma85761e62017-10-30 11:13:45 -070061
Yue Ma08047522016-11-08 18:53:26 -080062static inline int pld_pcie_wlan_disable(struct device *dev,
63 enum pld_driver_mode mode)
64{
65 return 0;
66}
67#else
68int pld_pcie_wlan_enable(struct device *dev, struct pld_wlan_enable_cfg *config,
69 enum pld_driver_mode mode, const char *host_version);
70int pld_pcie_wlan_disable(struct device *dev, enum pld_driver_mode mode);
71#endif
72
Nirav Shah74be3842018-06-26 19:17:25 +053073#if defined(CONFIG_PLD_PCIE_CNSS)
Yuanyuan Liu81982b92017-04-13 14:25:19 -070074static inline int pld_pcie_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
75{
76 return cnss_set_fw_log_mode(dev, fw_log_mode);
77}
Yue Ma85761e62017-10-30 11:13:45 -070078
79static inline void pld_pcie_intr_notify_q6(struct device *dev)
Yuanyuan Liu81982b92017-04-13 14:25:19 -070080{
81}
82#else
83static inline int pld_pcie_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
84{
85 return 0;
86}
Yue Ma85761e62017-10-30 11:13:45 -070087
88static inline void pld_pcie_intr_notify_q6(struct device *dev)
Yuanyuan Liu81982b92017-04-13 14:25:19 -070089{
90}
Yuanyuan Liud9f7a362016-01-22 14:27:12 -080091#endif
92
Yuanyuan Liu11f526a2016-05-18 10:22:07 -070093#if (!defined(CONFIG_PLD_PCIE_CNSS)) || (!defined(CONFIG_CNSS_SECURE_FW))
Yue Ma85761e62017-10-30 11:13:45 -070094static inline int pld_pcie_get_sha_hash(struct device *dev, const u8 *data,
Yuanyuan Liu59f81e02016-05-19 16:17:38 -070095 u32 data_len, u8 *hash_idx, u8 *out)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -080096{
97 return 0;
98}
Yue Ma85761e62017-10-30 11:13:45 -070099
100static inline void *pld_pcie_get_fw_ptr(struct device *dev)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800101{
102 return NULL;
103}
Yuanyuan Liu59f81e02016-05-19 16:17:38 -0700104#else
Yue Ma85761e62017-10-30 11:13:45 -0700105static inline int pld_pcie_get_sha_hash(struct device *dev, const u8 *data,
Yuanyuan Liu16a55622016-09-14 16:15:59 -0700106 u32 data_len, u8 *hash_idx, u8 *out)
107{
108 return cnss_get_sha_hash(data, data_len, hash_idx, out);
109}
Yue Ma85761e62017-10-30 11:13:45 -0700110
111static inline void *pld_pcie_get_fw_ptr(struct device *dev)
Yuanyuan Liu16a55622016-09-14 16:15:59 -0700112{
113 return cnss_get_fw_ptr();
114}
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800115#endif
116
Yuanyuan Liu11f526a2016-05-18 10:22:07 -0700117#if (!defined(CONFIG_PLD_PCIE_CNSS)) || (!defined(CONFIG_PCI_MSM))
Yue Ma85761e62017-10-30 11:13:45 -0700118static inline int pld_pcie_wlan_pm_control(struct device *dev, bool vote)
Yuanyuan Liu466ccb72016-04-21 15:13:22 -0700119{
120 return 0;
121}
Yuanyuan Liu59f81e02016-05-19 16:17:38 -0700122#else
Yue Ma85761e62017-10-30 11:13:45 -0700123static inline int pld_pcie_wlan_pm_control(struct device *dev, bool vote)
124{
125 return cnss_wlan_pm_control(dev, vote);
126}
Yue Ma85761e62017-10-30 11:13:45 -0700127#endif
Yuanyuan Liu466ccb72016-04-21 15:13:22 -0700128
Yuanyuan Liu11f526a2016-05-18 10:22:07 -0700129#ifndef CONFIG_PLD_PCIE_CNSS
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800130static inline int
Yue Ma85761e62017-10-30 11:13:45 -0700131pld_pcie_get_fw_files_for_target(struct device *dev,
132 struct pld_fw_files *pfw_files,
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800133 u32 target_type, u32 target_version)
134{
Yuanyuan Liu6a313dc2016-05-10 14:19:10 -0700135 pld_get_default_fw_files(pfw_files);
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800136 return 0;
137}
Yue Ma85761e62017-10-30 11:13:45 -0700138
Yuanyuan Liu10fc3d32017-01-12 15:32:06 -0800139static inline void pld_pcie_link_down(struct device *dev)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800140{
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800141}
Yue Ma85761e62017-10-30 11:13:45 -0700142
Yue Ma9c0e4802018-09-11 15:34:06 -0700143static inline int pld_pcie_is_fw_down(struct device *dev)
144{
145 return 0;
146}
147
Yue Ma6dbbb182017-04-26 17:06:05 -0700148static inline int pld_pcie_athdiag_read(struct device *dev, uint32_t offset,
149 uint32_t memtype, uint32_t datalen,
150 uint8_t *output)
151{
152 return 0;
153}
Yue Ma85761e62017-10-30 11:13:45 -0700154
Yue Ma6dbbb182017-04-26 17:06:05 -0700155static inline int pld_pcie_athdiag_write(struct device *dev, uint32_t offset,
156 uint32_t memtype, uint32_t datalen,
157 uint8_t *input)
158{
159 return 0;
160}
Yue Ma85761e62017-10-30 11:13:45 -0700161
162static inline void
163pld_pcie_schedule_recovery_work(struct device *dev,
164 enum pld_recovery_reason reason)
Yuanyuan Liu0e0aa932016-05-12 10:17:58 -0700165{
Yuanyuan Liu0e0aa932016-05-12 10:17:58 -0700166}
Yue Ma85761e62017-10-30 11:13:45 -0700167
168static inline void *pld_pcie_get_virt_ramdump_mem(struct device *dev,
169 unsigned long *size)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800170{
Yu Ouyang58648a52018-11-01 11:18:15 +0800171 size_t length = 0;
172 int flags = GFP_KERNEL;
173
174 length = TOTAL_DUMP_SIZE;
175
176 if (!size)
177 return NULL;
178
179 *size = (unsigned long)length;
180
181 if (in_interrupt() || irqs_disabled() || in_atomic())
182 flags = GFP_ATOMIC;
183
184 return kzalloc(length, flags);
185}
186
187static inline void pld_pcie_release_virt_ramdump_mem(void *address)
188{
189 kfree(address);
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800190}
Yue Ma85761e62017-10-30 11:13:45 -0700191
192static inline void pld_pcie_device_crashed(struct device *dev)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800193{
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800194}
Yue Ma85761e62017-10-30 11:13:45 -0700195
Yuanyuan Liu10fc3d32017-01-12 15:32:06 -0800196static inline void pld_pcie_device_self_recovery(struct device *dev,
197 enum pld_recovery_reason reason)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800198{
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800199}
Yue Ma85761e62017-10-30 11:13:45 -0700200
201static inline void pld_pcie_request_pm_qos(struct device *dev, u32 qos_val)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800202{
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800203}
Yue Ma85761e62017-10-30 11:13:45 -0700204
205static inline void pld_pcie_remove_pm_qos(struct device *dev)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800206{
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800207}
Yue Ma85761e62017-10-30 11:13:45 -0700208
209static inline int pld_pcie_request_bus_bandwidth(struct device *dev,
210 int bandwidth)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800211{
212 return 0;
213}
Yue Ma85761e62017-10-30 11:13:45 -0700214
215static inline int pld_pcie_get_platform_cap(struct device *dev,
216 struct pld_platform_cap *cap)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800217{
218 return 0;
219}
Yue Ma85761e62017-10-30 11:13:45 -0700220
Yue Macd243862016-11-04 19:21:16 -0700221static inline int pld_pcie_get_soc_info(struct device *dev,
222 struct pld_soc_info *info)
223{
224 return 0;
225}
Yue Ma85761e62017-10-30 11:13:45 -0700226
Yue Ma5ff417c2017-10-30 11:13:12 -0700227static inline int pld_pcie_auto_suspend(struct device *dev)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800228{
229 return 0;
230}
Yue Ma85761e62017-10-30 11:13:45 -0700231
232static inline int pld_pcie_auto_resume(struct device *dev)
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800233{
234 return 0;
235}
Yue Ma85761e62017-10-30 11:13:45 -0700236
Yue Mafb3b78d2018-08-08 11:51:21 -0700237static inline int pld_pcie_force_wake_request(struct device *dev)
238{
239 return 0;
240}
241
242static inline int pld_pcie_is_device_awake(struct device *dev)
243{
244 return true;
245}
246
247static inline int pld_pcie_force_wake_release(struct device *dev)
248{
249 return 0;
250}
251
Yue Ma85761e62017-10-30 11:13:45 -0700252static inline void pld_pcie_lock_pm_sem(struct device *dev)
Yuanyuan Liu44c44772016-04-11 11:11:27 -0700253{
Yuanyuan Liu44c44772016-04-11 11:11:27 -0700254}
Yue Ma85761e62017-10-30 11:13:45 -0700255
256static inline void pld_pcie_release_pm_sem(struct device *dev)
Yuanyuan Liu44c44772016-04-11 11:11:27 -0700257{
Yuanyuan Liu44c44772016-04-11 11:11:27 -0700258}
Yue Ma85761e62017-10-30 11:13:45 -0700259
Arun Khandavalli1496fcb2016-07-25 16:53:00 +0530260static inline int pld_pcie_power_on(struct device *dev)
261{
262 return 0;
263}
Yue Ma85761e62017-10-30 11:13:45 -0700264
Arun Khandavalli1496fcb2016-07-25 16:53:00 +0530265static inline int pld_pcie_power_off(struct device *dev)
266{
267 return 0;
268}
Yue Ma85761e62017-10-30 11:13:45 -0700269
Yue Ma63d360a2017-06-20 17:00:35 -0700270static inline int pld_pcie_force_assert_target(struct device *dev)
271{
272 return -EINVAL;
273}
Yue Ma85761e62017-10-30 11:13:45 -0700274
Yue Mafd418ea2016-11-21 16:47:13 -0800275static inline int pld_pcie_get_user_msi_assignment(struct device *dev,
276 char *user_name,
277 int *num_vectors,
278 uint32_t *user_base_data,
279 uint32_t *base_vector)
280{
Yu Ouyang781f1b52018-12-27 15:24:07 +0800281 return -EINVAL;
Yue Mafd418ea2016-11-21 16:47:13 -0800282}
Yue Ma85761e62017-10-30 11:13:45 -0700283
Yue Mafd418ea2016-11-21 16:47:13 -0800284static inline int pld_pcie_get_msi_irq(struct device *dev, unsigned int vector)
285{
286 return 0;
287}
Yue Ma85761e62017-10-30 11:13:45 -0700288
Yue Mafd418ea2016-11-21 16:47:13 -0800289static inline void pld_pcie_get_msi_address(struct device *dev,
290 uint32_t *msi_addr_low,
291 uint32_t *msi_addr_high)
292{
293 return;
294}
Yu Ouyang58648a52018-11-01 11:18:15 +0800295
296static inline bool pld_pcie_platform_driver_support(void)
297{
298 return false;
299}
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800300#else
Yue Ma85761e62017-10-30 11:13:45 -0700301int pld_pcie_get_fw_files_for_target(struct device *dev,
302 struct pld_fw_files *pfw_files,
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800303 u32 target_type, u32 target_version);
Yue Ma85761e62017-10-30 11:13:45 -0700304int pld_pcie_get_platform_cap(struct device *dev, struct pld_platform_cap *cap);
Yue Macd243862016-11-04 19:21:16 -0700305int pld_pcie_get_soc_info(struct device *dev, struct pld_soc_info *info);
Yuanyuan Liu10fc3d32017-01-12 15:32:06 -0800306void pld_pcie_schedule_recovery_work(struct device *dev,
307 enum pld_recovery_reason reason);
308void pld_pcie_device_self_recovery(struct device *dev,
309 enum pld_recovery_reason reason);
Komal Seelam355b1472016-09-02 14:36:21 +0530310
Yuanyuan Liu10fc3d32017-01-12 15:32:06 -0800311static inline void pld_pcie_link_down(struct device *dev)
Yuanyuan Liu16a55622016-09-14 16:15:59 -0700312{
Yuanyuan Liu10fc3d32017-01-12 15:32:06 -0800313 cnss_pci_link_down(dev);
Yuanyuan Liu16a55622016-09-14 16:15:59 -0700314}
Yue Ma85761e62017-10-30 11:13:45 -0700315
Yue Ma9c0e4802018-09-11 15:34:06 -0700316static inline int pld_pcie_is_fw_down(struct device *dev)
317{
318 return cnss_pci_is_device_down(dev);
319}
320
Yue Ma6dbbb182017-04-26 17:06:05 -0700321static inline int pld_pcie_athdiag_read(struct device *dev, uint32_t offset,
322 uint32_t memtype, uint32_t datalen,
323 uint8_t *output)
324{
325 return cnss_athdiag_read(dev, offset, memtype, datalen, output);
326}
Yue Ma85761e62017-10-30 11:13:45 -0700327
Yue Ma6dbbb182017-04-26 17:06:05 -0700328static inline int pld_pcie_athdiag_write(struct device *dev, uint32_t offset,
329 uint32_t memtype, uint32_t datalen,
330 uint8_t *input)
331{
332 return cnss_athdiag_write(dev, offset, memtype, datalen, input);
333}
Yue Ma85761e62017-10-30 11:13:45 -0700334
Yue Ma85761e62017-10-30 11:13:45 -0700335static inline void *pld_pcie_get_virt_ramdump_mem(struct device *dev,
336 unsigned long *size)
337{
338 return cnss_get_virt_ramdump_mem(dev, size);
339}
340
Yu Ouyang58648a52018-11-01 11:18:15 +0800341static inline void pld_pcie_release_virt_ramdump_mem(void *address)
342{
343}
344
Yue Ma85761e62017-10-30 11:13:45 -0700345static inline void pld_pcie_device_crashed(struct device *dev)
346{
347 cnss_device_crashed(dev);
348}
349
350static inline void pld_pcie_request_pm_qos(struct device *dev, u32 qos_val)
351{
352 cnss_request_pm_qos(dev, qos_val);
353}
354
355static inline void pld_pcie_remove_pm_qos(struct device *dev)
356{
357 cnss_remove_pm_qos(dev);
358}
359
360static inline int pld_pcie_request_bus_bandwidth(struct device *dev,
361 int bandwidth)
362{
363 return cnss_request_bus_bandwidth(dev, bandwidth);
364}
365
366static inline int pld_pcie_auto_suspend(struct device *dev)
367{
368 return cnss_auto_suspend(dev);
369}
370
371static inline int pld_pcie_auto_resume(struct device *dev)
372{
373 return cnss_auto_resume(dev);
374}
375
Yue Mafb3b78d2018-08-08 11:51:21 -0700376static inline int pld_pcie_force_wake_request(struct device *dev)
377{
378 return cnss_pci_force_wake_request(dev);
379}
380
381static inline int pld_pcie_is_device_awake(struct device *dev)
382{
383 return cnss_pci_is_device_awake(dev);
384}
385
386static inline int pld_pcie_force_wake_release(struct device *dev)
387{
388 return cnss_pci_force_wake_release(dev);
389}
390
Yue Ma85761e62017-10-30 11:13:45 -0700391static inline void pld_pcie_lock_pm_sem(struct device *dev)
392{
393 cnss_lock_pm_sem(dev);
394}
395
396static inline void pld_pcie_release_pm_sem(struct device *dev)
397{
398 cnss_release_pm_sem(dev);
399}
Yue Ma85761e62017-10-30 11:13:45 -0700400
Yuanyuan Liu16a55622016-09-14 16:15:59 -0700401static inline int pld_pcie_power_on(struct device *dev)
402{
403 return cnss_power_up(dev);
404}
Yue Ma85761e62017-10-30 11:13:45 -0700405
Yuanyuan Liu16a55622016-09-14 16:15:59 -0700406static inline int pld_pcie_power_off(struct device *dev)
407{
408 return cnss_power_down(dev);
409}
Yue Ma85761e62017-10-30 11:13:45 -0700410
Yue Ma63d360a2017-06-20 17:00:35 -0700411static inline int pld_pcie_force_assert_target(struct device *dev)
412{
413 return cnss_force_fw_assert(dev);
414}
Yue Ma85761e62017-10-30 11:13:45 -0700415
Yue Mafd418ea2016-11-21 16:47:13 -0800416static inline int pld_pcie_get_user_msi_assignment(struct device *dev,
417 char *user_name,
418 int *num_vectors,
419 uint32_t *user_base_data,
420 uint32_t *base_vector)
421{
422 return cnss_get_user_msi_assignment(dev, user_name, num_vectors,
423 user_base_data, base_vector);
424}
Yue Ma85761e62017-10-30 11:13:45 -0700425
Yue Mafd418ea2016-11-21 16:47:13 -0800426static inline int pld_pcie_get_msi_irq(struct device *dev, unsigned int vector)
427{
428 return cnss_get_msi_irq(dev, vector);
429}
Yue Ma85761e62017-10-30 11:13:45 -0700430
Yue Mafd418ea2016-11-21 16:47:13 -0800431static inline void pld_pcie_get_msi_address(struct device *dev,
432 uint32_t *msi_addr_low,
433 uint32_t *msi_addr_high)
434{
435 cnss_get_msi_address(dev, msi_addr_low, msi_addr_high);
436}
Yu Ouyang58648a52018-11-01 11:18:15 +0800437
438static inline bool pld_pcie_platform_driver_support(void)
439{
440 return true;
441}
Komal Seelam355b1472016-09-02 14:36:21 +0530442#endif
Yuanyuan Liud9f7a362016-01-22 14:27:12 -0800443#endif