1  // SPDX-License-Identifier: GPL-2.0-only
2  /*
3   * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
4   * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
5   */
6  
7  #include "bus.h"
8  #include "debug.h"
9  #include "pci.h"
10  
cnss_get_dev_bus_type(struct device * dev)11  enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev)
12  {
13  	if (!dev)
14  		return CNSS_BUS_NONE;
15  
16  	if (!dev->bus)
17  		return CNSS_BUS_NONE;
18  
19  	if (memcmp(dev->bus->name, "pci", 3) == 0)
20  		return CNSS_BUS_PCI;
21  	else
22  		return CNSS_BUS_NONE;
23  }
24  
cnss_get_bus_type(struct cnss_plat_data * plat_priv)25  enum cnss_dev_bus_type cnss_get_bus_type(struct cnss_plat_data *plat_priv)
26  {
27  	int ret;
28  	struct device *dev;
29  	u32 bus_type_dt = CNSS_BUS_NONE;
30  
31  	if (plat_priv->dt_type == CNSS_DTT_MULTIEXCHG) {
32  		dev = &plat_priv->plat_dev->dev;
33  		ret = of_property_read_u32(dev->of_node, "qcom,bus-type",
34  					   &bus_type_dt);
35  		if (!ret)
36  			if (bus_type_dt < CNSS_BUS_MAX)
37  				cnss_pr_dbg("Got bus type[%u] from dt\n",
38  					    bus_type_dt);
39  			else
40  				bus_type_dt = CNSS_BUS_NONE;
41  		else
42  			cnss_pr_err("No bus type for multi-exchg dt\n");
43  
44  		return bus_type_dt;
45  	}
46  
47  	switch (plat_priv->device_id) {
48  	case QCA6174_DEVICE_ID:
49  	case QCA6290_DEVICE_ID:
50  	case QCA6390_DEVICE_ID:
51  	case QCN7605_DEVICE_ID:
52  	case QCA6490_DEVICE_ID:
53  	case KIWI_DEVICE_ID:
54  	case MANGO_DEVICE_ID:
55  	case PEACH_DEVICE_ID:
56  		return CNSS_BUS_PCI;
57  	default:
58  		cnss_pr_err("Unknown device_id: 0x%lx\n", plat_priv->device_id);
59  		return CNSS_BUS_NONE;
60  	}
61  }
62  
cnss_bus_dev_to_bus_priv(struct device * dev)63  void *cnss_bus_dev_to_bus_priv(struct device *dev)
64  {
65  	if (!dev)
66  		return NULL;
67  
68  	switch (cnss_get_dev_bus_type(dev)) {
69  	case CNSS_BUS_PCI:
70  		return cnss_get_pci_priv(to_pci_dev(dev));
71  	default:
72  		return NULL;
73  	}
74  }
75  
cnss_bus_dev_to_plat_priv(struct device * dev)76  struct cnss_plat_data *cnss_bus_dev_to_plat_priv(struct device *dev)
77  {
78  	void *bus_priv;
79  
80  	if (!dev)
81  		return cnss_get_plat_priv(NULL);
82  
83  	bus_priv = cnss_bus_dev_to_bus_priv(dev);
84  	if (!bus_priv)
85  		return NULL;
86  
87  	switch (cnss_get_dev_bus_type(dev)) {
88  	case CNSS_BUS_PCI:
89  		return cnss_pci_priv_to_plat_priv(bus_priv);
90  	default:
91  		return NULL;
92  	}
93  }
94  
cnss_bus_init(struct cnss_plat_data * plat_priv)95  int cnss_bus_init(struct cnss_plat_data *plat_priv)
96  {
97  	if (!plat_priv)
98  		return -ENODEV;
99  
100  	switch (plat_priv->bus_type) {
101  	case CNSS_BUS_PCI:
102  		return cnss_pci_init(plat_priv);
103  	default:
104  		cnss_pr_err("Unsupported bus type: %d\n",
105  			    plat_priv->bus_type);
106  		return -EINVAL;
107  	}
108  }
109  
cnss_bus_deinit(struct cnss_plat_data * plat_priv)110  void cnss_bus_deinit(struct cnss_plat_data *plat_priv)
111  {
112  	if (!plat_priv)
113  		return;
114  
115  	switch (plat_priv->bus_type) {
116  	case CNSS_BUS_PCI:
117  		return cnss_pci_deinit(plat_priv);
118  	default:
119  		cnss_pr_err("Unsupported bus type: %d\n",
120  			    plat_priv->bus_type);
121  		return;
122  	}
123  }
124  
cnss_bus_add_fw_prefix_name(struct cnss_plat_data * plat_priv,char * prefix_name,char * name)125  void cnss_bus_add_fw_prefix_name(struct cnss_plat_data *plat_priv,
126  				 char *prefix_name, char *name)
127  {
128  	if (!plat_priv)
129  		return;
130  
131  	switch (plat_priv->bus_type) {
132  	case CNSS_BUS_PCI:
133  		return cnss_pci_add_fw_prefix_name(plat_priv->bus_priv,
134  						   prefix_name, name);
135  	default:
136  		cnss_pr_err("Unsupported bus type: %d\n",
137  			    plat_priv->bus_type);
138  		return;
139  	}
140  }
141  
cnss_bus_load_tme_patch(struct cnss_plat_data * plat_priv)142  int cnss_bus_load_tme_patch(struct cnss_plat_data *plat_priv)
143  {
144  	if (!plat_priv)
145  		return -ENODEV;
146  
147  	switch (plat_priv->bus_type) {
148  	case CNSS_BUS_PCI:
149  		return cnss_pci_load_tme_patch(plat_priv->bus_priv);
150  	default:
151  		cnss_pr_err("Unsupported bus type: %d\n",
152  			    plat_priv->bus_type);
153  		return -EINVAL;
154  	}
155  }
156  
cnss_bus_load_tme_opt_file(struct cnss_plat_data * plat_priv,enum wlfw_tme_lite_file_type_v01 file)157  int cnss_bus_load_tme_opt_file(struct cnss_plat_data *plat_priv,
158  				enum wlfw_tme_lite_file_type_v01 file)
159  {
160  	if (!plat_priv)
161  		return -ENODEV;
162  
163  	switch (plat_priv->bus_type) {
164  	case CNSS_BUS_PCI:
165  		return cnss_pci_load_tme_opt_file(plat_priv->bus_priv, file);
166  	default:
167  		cnss_pr_err("Unsupported bus type: %d\n",
168  			    plat_priv->bus_type);
169  		return -EINVAL;
170  	}
171  }
172  
cnss_bus_load_m3(struct cnss_plat_data * plat_priv)173  int cnss_bus_load_m3(struct cnss_plat_data *plat_priv)
174  {
175  	if (!plat_priv)
176  		return -ENODEV;
177  
178  	switch (plat_priv->bus_type) {
179  	case CNSS_BUS_PCI:
180  		return cnss_pci_load_m3(plat_priv->bus_priv);
181  	default:
182  		cnss_pr_err("Unsupported bus type: %d\n",
183  			    plat_priv->bus_type);
184  		return -EINVAL;
185  	}
186  }
187  
cnss_bus_load_aux(struct cnss_plat_data * plat_priv)188  int cnss_bus_load_aux(struct cnss_plat_data *plat_priv)
189  {
190  	if (!plat_priv)
191  		return -ENODEV;
192  
193  	switch (plat_priv->bus_type) {
194  	case CNSS_BUS_PCI:
195  		return cnss_pci_load_aux(plat_priv->bus_priv);
196  	default:
197  		cnss_pr_err("Unsupported bus type: %d\n",
198  			    plat_priv->bus_type);
199  		return -EINVAL;
200  	}
201  }
202  
cnss_bus_handle_dev_sol_irq(struct cnss_plat_data * plat_priv)203  int cnss_bus_handle_dev_sol_irq(struct cnss_plat_data *plat_priv)
204  {
205  	if (!plat_priv)
206  		return -ENODEV;
207  
208  	switch (plat_priv->bus_type) {
209  	case CNSS_BUS_PCI:
210  		return cnss_pci_handle_dev_sol_irq(plat_priv->bus_priv);
211  	default:
212  		cnss_pr_err("Unsupported bus type: %d\n",
213  			    plat_priv->bus_type);
214  		return -EINVAL;
215  	}
216  }
217  
cnss_bus_alloc_fw_mem(struct cnss_plat_data * plat_priv)218  int cnss_bus_alloc_fw_mem(struct cnss_plat_data *plat_priv)
219  {
220  	if (!plat_priv)
221  		return -ENODEV;
222  
223  	switch (plat_priv->bus_type) {
224  	case CNSS_BUS_PCI:
225  		return cnss_pci_alloc_fw_mem(plat_priv->bus_priv);
226  	default:
227  		cnss_pr_err("Unsupported bus type: %d\n",
228  			    plat_priv->bus_type);
229  		return -EINVAL;
230  	}
231  }
232  
cnss_bus_alloc_qdss_mem(struct cnss_plat_data * plat_priv)233  int cnss_bus_alloc_qdss_mem(struct cnss_plat_data *plat_priv)
234  {
235  	if (!plat_priv)
236  		return -ENODEV;
237  
238  	switch (plat_priv->bus_type) {
239  	case CNSS_BUS_PCI:
240  		return cnss_pci_alloc_qdss_mem(plat_priv->bus_priv);
241  	default:
242  		cnss_pr_err("Unsupported bus type: %d\n",
243  			    plat_priv->bus_type);
244  		return -EINVAL;
245  	}
246  }
247  
cnss_bus_free_qdss_mem(struct cnss_plat_data * plat_priv)248  void cnss_bus_free_qdss_mem(struct cnss_plat_data *plat_priv)
249  {
250  	if (!plat_priv)
251  		return;
252  
253  	switch (plat_priv->bus_type) {
254  	case CNSS_BUS_PCI:
255  		cnss_pci_free_qdss_mem(plat_priv->bus_priv);
256  		return;
257  	default:
258  		cnss_pr_err("Unsupported bus type: %d\n",
259  			    plat_priv->bus_type);
260  		return;
261  	}
262  }
263  
cnss_bus_get_wake_irq(struct cnss_plat_data * plat_priv)264  u32 cnss_bus_get_wake_irq(struct cnss_plat_data *plat_priv)
265  {
266  	if (!plat_priv)
267  		return -ENODEV;
268  
269  	switch (plat_priv->bus_type) {
270  	case CNSS_BUS_PCI:
271  		return cnss_pci_get_wake_msi(plat_priv->bus_priv);
272  	default:
273  		cnss_pr_err("Unsupported bus type: %d\n",
274  			    plat_priv->bus_type);
275  		return -EINVAL;
276  	}
277  }
278  
cnss_bus_force_fw_assert_hdlr(struct cnss_plat_data * plat_priv)279  int cnss_bus_force_fw_assert_hdlr(struct cnss_plat_data *plat_priv)
280  {
281  	if (!plat_priv)
282  		return -ENODEV;
283  
284  	switch (plat_priv->bus_type) {
285  	case CNSS_BUS_PCI:
286  		return cnss_pci_force_fw_assert_hdlr(plat_priv->bus_priv);
287  	default:
288  		cnss_pr_err("Unsupported bus type: %d\n",
289  			    plat_priv->bus_type);
290  		return -EINVAL;
291  	}
292  }
293  
cnss_bus_qmi_send_get(struct cnss_plat_data * plat_priv)294  int cnss_bus_qmi_send_get(struct cnss_plat_data *plat_priv)
295  {
296  	if (!plat_priv)
297  		return -ENODEV;
298  
299  	switch (plat_priv->bus_type) {
300  	case CNSS_BUS_PCI:
301  		return cnss_pci_qmi_send_get(plat_priv->bus_priv);
302  	default:
303  		cnss_pr_err("Unsupported bus type: %d\n",
304  			    plat_priv->bus_type);
305  		return -EINVAL;
306  	}
307  }
308  
cnss_bus_qmi_send_put(struct cnss_plat_data * plat_priv)309  int cnss_bus_qmi_send_put(struct cnss_plat_data *plat_priv)
310  {
311  	if (!plat_priv)
312  		return -ENODEV;
313  
314  	switch (plat_priv->bus_type) {
315  	case CNSS_BUS_PCI:
316  		return cnss_pci_qmi_send_put(plat_priv->bus_priv);
317  	default:
318  		cnss_pr_err("Unsupported bus type: %d\n",
319  			    plat_priv->bus_type);
320  		return -EINVAL;
321  	}
322  }
323  
cnss_bus_fw_boot_timeout_hdlr(struct timer_list * t)324  void cnss_bus_fw_boot_timeout_hdlr(struct timer_list *t)
325  {
326  	struct cnss_plat_data *plat_priv =
327  		from_timer(plat_priv, t, fw_boot_timer);
328  
329  	if (!plat_priv)
330  		return;
331  
332  	switch (plat_priv->bus_type) {
333  	case CNSS_BUS_PCI:
334  		return cnss_pci_fw_boot_timeout_hdlr(plat_priv->bus_priv);
335  	default:
336  		cnss_pr_err("Unsupported bus type: %d\n",
337  			    plat_priv->bus_type);
338  		return;
339  	}
340  }
341  
cnss_bus_collect_dump_info(struct cnss_plat_data * plat_priv,bool in_panic)342  void cnss_bus_collect_dump_info(struct cnss_plat_data *plat_priv, bool in_panic)
343  {
344  	if (!plat_priv)
345  		return;
346  
347  	switch (plat_priv->bus_type) {
348  	case CNSS_BUS_PCI:
349  		return cnss_pci_collect_dump_info(plat_priv->bus_priv,
350  						  in_panic);
351  	default:
352  		cnss_pr_err("Unsupported bus type: %d\n",
353  			    plat_priv->bus_type);
354  		return;
355  	}
356  }
357  
cnss_bus_device_crashed(struct cnss_plat_data * plat_priv)358  void cnss_bus_device_crashed(struct cnss_plat_data *plat_priv)
359  {
360  	if (!plat_priv)
361  		return;
362  
363  	switch (plat_priv->bus_type) {
364  	case CNSS_BUS_PCI:
365  		return cnss_pci_device_crashed(plat_priv->bus_priv);
366  	default:
367  		cnss_pr_err("Unsupported bus type: %d\n",
368  			    plat_priv->bus_type);
369  		return;
370  	}
371  }
372  
cnss_bus_call_driver_probe(struct cnss_plat_data * plat_priv)373  int cnss_bus_call_driver_probe(struct cnss_plat_data *plat_priv)
374  {
375  	if (!plat_priv)
376  		return -ENODEV;
377  
378  	switch (plat_priv->bus_type) {
379  	case CNSS_BUS_PCI:
380  		return cnss_pci_call_driver_probe(plat_priv->bus_priv);
381  	default:
382  		cnss_pr_err("Unsupported bus type: %d\n",
383  			    plat_priv->bus_type);
384  		return -EINVAL;
385  	}
386  }
387  
cnss_bus_call_driver_remove(struct cnss_plat_data * plat_priv)388  int cnss_bus_call_driver_remove(struct cnss_plat_data *plat_priv)
389  {
390  	if (!plat_priv)
391  		return -ENODEV;
392  
393  	switch (plat_priv->bus_type) {
394  	case CNSS_BUS_PCI:
395  		return cnss_pci_call_driver_remove(plat_priv->bus_priv);
396  	default:
397  		cnss_pr_err("Unsupported bus type: %d\n",
398  			    plat_priv->bus_type);
399  		return -EINVAL;
400  	}
401  }
402  
cnss_bus_dev_powerup(struct cnss_plat_data * plat_priv)403  int cnss_bus_dev_powerup(struct cnss_plat_data *plat_priv)
404  {
405  	if (!plat_priv)
406  		return -ENODEV;
407  
408  	switch (plat_priv->bus_type) {
409  	case CNSS_BUS_PCI:
410  		return cnss_pci_dev_powerup(plat_priv->bus_priv);
411  	default:
412  		cnss_pr_err("Unsupported bus type: %d\n",
413  			    plat_priv->bus_type);
414  		return -EINVAL;
415  	}
416  }
417  
cnss_bus_dev_shutdown(struct cnss_plat_data * plat_priv)418  int cnss_bus_dev_shutdown(struct cnss_plat_data *plat_priv)
419  {
420  	if (!plat_priv)
421  		return -ENODEV;
422  
423  	switch (plat_priv->bus_type) {
424  	case CNSS_BUS_PCI:
425  		return cnss_pci_dev_shutdown(plat_priv->bus_priv);
426  	default:
427  		cnss_pr_err("Unsupported bus type: %d\n",
428  			    plat_priv->bus_type);
429  		return -EINVAL;
430  	}
431  }
432  
cnss_bus_dev_crash_shutdown(struct cnss_plat_data * plat_priv)433  int cnss_bus_dev_crash_shutdown(struct cnss_plat_data *plat_priv)
434  {
435  	if (!plat_priv)
436  		return -ENODEV;
437  
438  	switch (plat_priv->bus_type) {
439  	case CNSS_BUS_PCI:
440  		return cnss_pci_dev_crash_shutdown(plat_priv->bus_priv);
441  	default:
442  		cnss_pr_err("Unsupported bus type: %d\n",
443  			    plat_priv->bus_type);
444  		return -EINVAL;
445  	}
446  }
447  
cnss_bus_dev_ramdump(struct cnss_plat_data * plat_priv)448  int cnss_bus_dev_ramdump(struct cnss_plat_data *plat_priv)
449  {
450  	if (!plat_priv)
451  		return -ENODEV;
452  
453  	switch (plat_priv->bus_type) {
454  	case CNSS_BUS_PCI:
455  		return cnss_pci_dev_ramdump(plat_priv->bus_priv);
456  	default:
457  		cnss_pr_err("Unsupported bus type: %d\n",
458  			    plat_priv->bus_type);
459  		return -EINVAL;
460  	}
461  }
462  
cnss_bus_register_driver_hdlr(struct cnss_plat_data * plat_priv,void * data)463  int cnss_bus_register_driver_hdlr(struct cnss_plat_data *plat_priv, void *data)
464  {
465  	if (!plat_priv)
466  		return -ENODEV;
467  
468  	switch (plat_priv->bus_type) {
469  	case CNSS_BUS_PCI:
470  		return cnss_pci_register_driver_hdlr(plat_priv->bus_priv, data);
471  	default:
472  		cnss_pr_err("Unsupported bus type: %d\n",
473  			    plat_priv->bus_type);
474  		return -EINVAL;
475  	}
476  }
477  
cnss_bus_runtime_pm_get_sync(struct cnss_plat_data * plat_priv)478  int cnss_bus_runtime_pm_get_sync(struct cnss_plat_data *plat_priv)
479  {
480  	if (!plat_priv)
481  		return -ENODEV;
482  
483  	switch (plat_priv->bus_type) {
484  	case CNSS_BUS_PCI:
485  		return cnss_pci_pm_runtime_get_sync(plat_priv->bus_priv, RTPM_ID_CNSS);
486  	default:
487  		cnss_pr_err("Unsupported bus type: %d\n",
488  			    plat_priv->bus_type);
489  		return -EINVAL;
490  	}
491  }
492  
cnss_bus_runtime_pm_put(struct cnss_plat_data * plat_priv)493  void cnss_bus_runtime_pm_put(struct cnss_plat_data *plat_priv)
494  {
495  	if (!plat_priv)
496  		return;
497  
498  	switch (plat_priv->bus_type) {
499  	case CNSS_BUS_PCI:
500  		cnss_pci_pm_runtime_mark_last_busy(plat_priv->bus_priv);
501  		cnss_pci_pm_runtime_put_autosuspend(plat_priv->bus_priv, RTPM_ID_CNSS);
502  		break;
503  	default:
504  		cnss_pr_err("Unsupported bus type: %d\n",
505  			    plat_priv->bus_type);
506  	}
507  }
508  
cnss_bus_unregister_driver_hdlr(struct cnss_plat_data * plat_priv)509  int cnss_bus_unregister_driver_hdlr(struct cnss_plat_data *plat_priv)
510  {
511  	if (!plat_priv)
512  		return -ENODEV;
513  
514  	switch (plat_priv->bus_type) {
515  	case CNSS_BUS_PCI:
516  		return cnss_pci_unregister_driver_hdlr(plat_priv->bus_priv);
517  	default:
518  		cnss_pr_err("Unsupported bus type: %d\n",
519  			    plat_priv->bus_type);
520  		return -EINVAL;
521  	}
522  }
523  
cnss_bus_call_driver_modem_status(struct cnss_plat_data * plat_priv,int modem_current_status)524  int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv,
525  				      int modem_current_status)
526  {
527  	if (!plat_priv)
528  		return -ENODEV;
529  
530  	switch (plat_priv->bus_type) {
531  	case CNSS_BUS_PCI:
532  		return cnss_pci_call_driver_modem_status(plat_priv->bus_priv,
533  							 modem_current_status);
534  	default:
535  		cnss_pr_err("Unsupported bus type: %d\n",
536  			    plat_priv->bus_type);
537  		return -EINVAL;
538  	}
539  }
540  
cnss_bus_update_status(struct cnss_plat_data * plat_priv,enum cnss_driver_status status)541  int cnss_bus_update_status(struct cnss_plat_data *plat_priv,
542  			   enum cnss_driver_status status)
543  {
544  	if (!plat_priv)
545  		return -ENODEV;
546  
547  	switch (plat_priv->bus_type) {
548  	case CNSS_BUS_PCI:
549  		return cnss_pci_update_status(plat_priv->bus_priv, status);
550  	default:
551  		cnss_pr_err("Unsupported bus type: %d\n",
552  			    plat_priv->bus_type);
553  		return -EINVAL;
554  	}
555  }
556  
cnss_bus_update_uevent(struct cnss_plat_data * plat_priv,enum cnss_driver_status status,void * data)557  int cnss_bus_update_uevent(struct cnss_plat_data *plat_priv,
558  			   enum cnss_driver_status status, void *data)
559  {
560  	if (!plat_priv)
561  		return -ENODEV;
562  
563  	switch (plat_priv->bus_type) {
564  	case CNSS_BUS_PCI:
565  		return cnss_pci_call_driver_uevent(plat_priv->bus_priv,
566  						   status, data);
567  	default:
568  		cnss_pr_err("Unsupported bus type: %d\n",
569  			    plat_priv->bus_type);
570  		return -EINVAL;
571  	}
572  }
573  
cnss_bus_is_device_down(struct cnss_plat_data * plat_priv)574  int cnss_bus_is_device_down(struct cnss_plat_data *plat_priv)
575  {
576  	if (!plat_priv)
577  		return -ENODEV;
578  
579  	switch (plat_priv->bus_type) {
580  	case CNSS_BUS_PCI:
581  		return cnss_pcie_is_device_down(plat_priv->bus_priv);
582  	default:
583  		cnss_pr_dbg("Unsupported bus type: %d\n",
584  			    plat_priv->bus_type);
585  		return 0;
586  	}
587  }
588  
cnss_bus_shutdown_cleanup(struct cnss_plat_data * plat_priv)589  int cnss_bus_shutdown_cleanup(struct cnss_plat_data *plat_priv)
590  {
591  	if (!plat_priv)
592  		return -ENODEV;
593  
594  	switch (plat_priv->bus_type) {
595  	case CNSS_BUS_PCI:
596  		return cnss_pci_shutdown_cleanup(plat_priv->bus_priv);
597  	default:
598  		cnss_pr_dbg("Unsupported bus type: %d\n",
599  			    plat_priv->bus_type);
600  		return 0;
601  	}
602  }
603  
cnss_bus_check_link_status(struct cnss_plat_data * plat_priv)604  int cnss_bus_check_link_status(struct cnss_plat_data *plat_priv)
605  {
606  	if (!plat_priv)
607  		return -ENODEV;
608  
609  	switch (plat_priv->bus_type) {
610  	case CNSS_BUS_PCI:
611  		return cnss_pci_check_link_status(plat_priv->bus_priv);
612  	default:
613  		cnss_pr_dbg("Unsupported bus type: %d\n",
614  			    plat_priv->bus_type);
615  		return 0;
616  	}
617  }
618  
cnss_bus_recover_link_down(struct cnss_plat_data * plat_priv)619  int cnss_bus_recover_link_down(struct cnss_plat_data *plat_priv)
620  {
621  	if (!plat_priv)
622  		return -ENODEV;
623  
624  	switch (plat_priv->bus_type) {
625  	case CNSS_BUS_PCI:
626  		return cnss_pci_recover_link_down(plat_priv->bus_priv);
627  	default:
628  		cnss_pr_dbg("Unsupported bus type: %d\n",
629  			    plat_priv->bus_type);
630  		return -EINVAL;
631  	}
632  }
633  
cnss_bus_debug_reg_read(struct cnss_plat_data * plat_priv,u32 offset,u32 * val,bool raw_access)634  int cnss_bus_debug_reg_read(struct cnss_plat_data *plat_priv, u32 offset,
635  			    u32 *val, bool raw_access)
636  {
637  	if (!plat_priv)
638  		return -ENODEV;
639  
640  	switch (plat_priv->bus_type) {
641  	case CNSS_BUS_PCI:
642  		return cnss_pci_debug_reg_read(plat_priv->bus_priv, offset,
643  					       val, raw_access);
644  	default:
645  		cnss_pr_dbg("Unsupported bus type: %d\n",
646  			    plat_priv->bus_type);
647  		return 0;
648  	}
649  }
650  
cnss_bus_debug_reg_write(struct cnss_plat_data * plat_priv,u32 offset,u32 val,bool raw_access)651  int cnss_bus_debug_reg_write(struct cnss_plat_data *plat_priv, u32 offset,
652  			     u32 val, bool raw_access)
653  {
654  	if (!plat_priv)
655  		return -ENODEV;
656  
657  	switch (plat_priv->bus_type) {
658  	case CNSS_BUS_PCI:
659  		return cnss_pci_debug_reg_write(plat_priv->bus_priv, offset,
660  						val, raw_access);
661  	default:
662  		cnss_pr_dbg("Unsupported bus type: %d\n",
663  			    plat_priv->bus_type);
664  		return 0;
665  	}
666  }
667  
cnss_bus_get_iova(struct cnss_plat_data * plat_priv,u64 * addr,u64 * size)668  int cnss_bus_get_iova(struct cnss_plat_data *plat_priv, u64 *addr, u64 *size)
669  {
670  	if (!plat_priv)
671  		return -ENODEV;
672  
673  	switch (plat_priv->bus_type) {
674  	case CNSS_BUS_PCI:
675  		return cnss_pci_get_iova(plat_priv->bus_priv, addr, size);
676  	default:
677  		cnss_pr_err("Unsupported bus type: %d\n",
678  			    plat_priv->bus_type);
679  		return -EINVAL;
680  	}
681  }
682  
cnss_bus_get_iova_ipa(struct cnss_plat_data * plat_priv,u64 * addr,u64 * size)683  int cnss_bus_get_iova_ipa(struct cnss_plat_data *plat_priv, u64 *addr,
684  			  u64 *size)
685  {
686  	if (!plat_priv)
687  		return -ENODEV;
688  
689  	switch (plat_priv->bus_type) {
690  	case CNSS_BUS_PCI:
691  		return cnss_pci_get_iova_ipa(plat_priv->bus_priv, addr, size);
692  	default:
693  		cnss_pr_err("Unsupported bus type: %d\n",
694  			    plat_priv->bus_type);
695  		return -EINVAL;
696  	}
697  }
698  
cnss_bus_is_smmu_s1_enabled(struct cnss_plat_data * plat_priv)699  bool cnss_bus_is_smmu_s1_enabled(struct cnss_plat_data *plat_priv)
700  {
701  	if (!plat_priv)
702  		return false;
703  
704  	switch (plat_priv->bus_type) {
705  	case CNSS_BUS_PCI:
706  		return cnss_pci_is_smmu_s1_enabled(plat_priv->bus_priv);
707  	default:
708  		cnss_pr_err("Unsupported bus type: %d\n",
709  			    plat_priv->bus_type);
710  		return false;
711  	}
712  }
713  
cnss_bus_update_time_sync_period(struct cnss_plat_data * plat_priv,unsigned int time_sync_period)714  int cnss_bus_update_time_sync_period(struct cnss_plat_data *plat_priv,
715  				     unsigned int time_sync_period)
716  {
717  	if (!plat_priv)
718  		return -ENODEV;
719  
720  	switch (plat_priv->bus_type) {
721  	case CNSS_BUS_PCI:
722  		return cnss_pci_update_time_sync_period(plat_priv->bus_priv,
723  							time_sync_period);
724  	default:
725  		cnss_pr_err("Unsupported bus type: %d\n",
726  			    plat_priv->bus_type);
727  		return -EINVAL;
728  	}
729  }
730  
cnss_bus_set_therm_cdev_state(struct cnss_plat_data * plat_priv,unsigned long thermal_state,int tcdev_id)731  int cnss_bus_set_therm_cdev_state(struct cnss_plat_data *plat_priv,
732  				  unsigned long thermal_state,
733  				  int tcdev_id)
734  {
735  	if (!plat_priv)
736  		return -ENODEV;
737  
738  	switch (plat_priv->bus_type) {
739  	case CNSS_BUS_PCI:
740  		return cnss_pci_set_therm_cdev_state(plat_priv->bus_priv,
741  						     thermal_state,
742  						     tcdev_id);
743  	default:
744  		cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type);
745  		return -EINVAL;
746  	}
747  }
748  
cnss_bus_get_msi_assignment(struct cnss_plat_data * plat_priv,char * msi_name,int * num_vectors,u32 * user_base_data,u32 * base_vector)749  int cnss_bus_get_msi_assignment(struct cnss_plat_data *plat_priv,
750  				char *msi_name,
751  				int *num_vectors,
752  				u32 *user_base_data,
753  				u32 *base_vector)
754  {
755  	if (!plat_priv)
756  		return -ENODEV;
757  
758  	switch (plat_priv->bus_type) {
759  	case CNSS_BUS_PCI:
760  		return cnss_pci_get_user_msi_assignment(plat_priv->bus_priv,
761  							msi_name,
762  							num_vectors,
763  							user_base_data,
764  							base_vector);
765  	default:
766  		cnss_pr_err("Unsupported bus type: %d\n", plat_priv->bus_type);
767  		return -EINVAL;
768  	}
769  }
770  
771  #if IS_ENABLED(CONFIG_MHI_BUS_MISC)
cnss_bus_disable_mhi_satellite_cfg(struct cnss_plat_data * plat_priv)772  void cnss_bus_disable_mhi_satellite_cfg(struct cnss_plat_data *plat_priv)
773  {
774  	struct cnss_pci_data *pci_priv;
775  
776  	pci_priv = plat_priv->bus_priv;
777  	if (!pci_priv) {
778  		cnss_pr_err("mhi satellite could not be disabled since pci_priv is NULL\n");
779  		return;
780  	}
781  
782  	switch (plat_priv->bus_type) {
783  	case CNSS_BUS_PCI:
784  		/* MHI satellite configuration is only for KIWI V2 and
785  		 * that too only in DRV mode.
786  		 */
787  		if (plat_priv->device_id == KIWI_DEVICE_ID &&
788  		    plat_priv->device_version.major_version == FW_V2_NUMBER) {
789  			cnss_pr_dbg("Remove MHI satellite configuration\n");
790  			return cnss_mhi_controller_set_base(pci_priv, 0);
791  		}
792  		break;
793  	default:
794  		cnss_pr_dbg("Unsupported bus type: %d, ignore disable mhi satellite cfg\n",
795  			    plat_priv->bus_type);
796  		return;
797  	}
798  
799  	return;
800  }
801  #else
cnss_bus_disable_mhi_satellite_cfg(struct cnss_plat_data * pci_priv)802  void cnss_bus_disable_mhi_satellite_cfg(struct cnss_plat_data *pci_priv)
803  {
804  }
805  #endif
806