1  /* SPDX-License-Identifier: GPL-2.0-only */
2  /* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. */
3  
4  #ifndef _CNSS_PCI_PLATFORM_H
5  #define _CNSS_PCI_PLATFORM_H
6  
7  #include "pci.h"
8  
9  #if IS_ENABLED(CONFIG_PCI_MSM)
10  /**
11   * _cnss_pci_enumerate() - Enumerate PCIe endpoints
12   * @plat_priv: driver platform context pointer
13   * @rc_num: root complex index that an endpoint connects to
14   *
15   * This function shall call corresponding PCIe root complex driver APIs
16   * to power on root complex and enumerate the endpoint connected to it.
17   *
18   * Return: 0 for success, negative value for error
19   */
20  int _cnss_pci_enumerate(struct cnss_plat_data *plat_priv, u32 rc_num);
21  
22  /**
23   * cnss_pci_assert_perst() - Assert PCIe PERST GPIO
24   * @pci_priv: driver PCI bus context pointer
25   *
26   * This function shall call corresponding PCIe root complex driver APIs
27   * to assert PCIe PERST GPIO.
28   *
29   * Return: 0 for success, negative value for error
30   */
31  int cnss_pci_assert_perst(struct cnss_pci_data *pci_priv);
32  
33  /**
34   * cnss_pci_disable_pc() - Disable PCIe link power collapse from RC driver
35   * @pci_priv: driver PCI bus context pointer
36   * @vote: value to indicate disable (true) or enable (false)
37   *
38   * This function shall call corresponding PCIe root complex driver APIs
39   * to disable PCIe power collapse. The purpose of this API is to avoid
40   * root complex driver still controlling PCIe link from callbacks of
41   * system suspend/resume. Device driver itself should take full control
42   * of the link in such cases.
43   *
44   * Return: 0 for success, negative value for error
45   */
46  int cnss_pci_disable_pc(struct cnss_pci_data *pci_priv, bool vote);
47  
48  /**
49   * cnss_pci_set_link_bandwidth() - Update number of lanes and speed of
50   *                                 PCIe link
51   * @pci_priv: driver PCI bus context pointer
52   * @link_speed: PCIe link gen speed
53   * @link_width: number of lanes for PCIe link
54   *
55   * This function shall call corresponding PCIe root complex driver APIs
56   * to update number of lanes and speed of the link.
57   *
58   * Return: 0 for success, negative value for error
59   */
60  int cnss_pci_set_link_bandwidth(struct cnss_pci_data *pci_priv,
61  				u16 link_speed, u16 link_width);
62  
63  /**
64   * cnss_pci_set_max_link_speed() - Set the maximum speed PCIe can link up with
65   * @pci_priv: driver PCI bus context pointer
66   * @rc_num: root complex index that an endpoint connects to
67   * @link_speed: PCIe link gen speed
68   *
69   * This function shall call corresponding PCIe root complex driver APIs
70   * to update the maximum speed that PCIe can link up with.
71   *
72   * Return: 0 for success, negative value for error
73   */
74  int cnss_pci_set_max_link_speed(struct cnss_pci_data *pci_priv,
75  				u32 rc_num, u16 link_speed);
76  
77  /**
78   * cnss_reg_pci_event() - Register for PCIe events
79   * @pci_priv: driver PCI bus context pointer
80   *
81   * This function shall call corresponding PCIe root complex driver APIs
82   * to register for PCIe events like link down or WAKE GPIO toggling etc.
83   * The events should be based on PCIe root complex driver's capability.
84   *
85   * Return: 0 for success, negative value for error
86   */
87  int cnss_reg_pci_event(struct cnss_pci_data *pci_priv);
88  void cnss_dereg_pci_event(struct cnss_pci_data *pci_priv);
89  
90  /**
91   * cnss_wlan_adsp_pc_enable: Control ADSP power collapse setup
92   * @dev: Platform driver pci private data structure
93   * @control: Power collapse enable / disable
94   *
95   * This function controls ADSP power collapse (PC). It must be called
96   * based on wlan state.  ADSP power collapse during wlan RTPM suspend state
97   * results in delay during periodic QMI stats PCI link up/down. This delay
98   * causes additional power consumption.
99   *
100   * Result: 0 Success. negative error codes.
101   */
102  int cnss_wlan_adsp_pc_enable(struct cnss_pci_data *pci_priv,
103  			     bool control);
104  int cnss_set_pci_link(struct cnss_pci_data *pci_priv, bool link_up);
105  int cnss_pci_prevent_l1(struct device *dev);
106  void cnss_pci_allow_l1(struct device *dev);
107  int cnss_pci_get_msi_assignment(struct cnss_pci_data *pci_priv);
108  int cnss_pci_get_one_msi_assignment(struct cnss_pci_data *pci_priv);
109  bool cnss_pci_fallback_one_msi(struct cnss_pci_data *pci_priv,
110  			       int *num_vectors);
111  bool cnss_pci_is_one_msi(struct cnss_pci_data *pci_priv);
112  int cnss_pci_get_one_msi_mhi_irq_array_size(struct cnss_pci_data *pci_priv);
113  bool cnss_pci_is_force_one_msi(struct cnss_pci_data *pci_priv);
114  int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv);
115  void cnss_pci_update_drv_supported(struct cnss_pci_data *pci_priv);
116  
117  /**
118   * _cnss_pci_get_reg_dump() - Dump PCIe RC registers for debug
119   * @pci_priv: driver PCI bus context pointer
120   * @buf: destination buffer pointer
121   * @len: length of the buffer
122   *
123   * This function shall call corresponding PCIe root complex driver API
124   * to dump PCIe RC registers for debug purpose.
125   *
126   * Return: 0 for success, negative value for error
127   */
128  int _cnss_pci_get_reg_dump(struct cnss_pci_data *pci_priv,
129  			   u8 *buf, u32 len);
130  #else
_cnss_pci_enumerate(struct cnss_plat_data * plat_priv,u32 rc_num)131  int _cnss_pci_enumerate(struct cnss_plat_data *plat_priv, u32 rc_num)
132  {
133  	return -EOPNOTSUPP;
134  }
135  
cnss_pci_assert_perst(struct cnss_pci_data * pci_priv)136  int cnss_pci_assert_perst(struct cnss_pci_data *pci_priv)
137  {
138  	return -EOPNOTSUPP;
139  }
140  
cnss_pci_disable_pc(struct cnss_pci_data * pci_priv,bool vote)141  int cnss_pci_disable_pc(struct cnss_pci_data *pci_priv, bool vote)
142  {
143  	return 0;
144  }
145  
cnss_pci_set_link_bandwidth(struct cnss_pci_data * pci_priv,u16 link_speed,u16 link_width)146  int cnss_pci_set_link_bandwidth(struct cnss_pci_data *pci_priv,
147  				u16 link_speed, u16 link_width)
148  {
149  	return 0;
150  }
151  
cnss_pci_set_max_link_speed(struct cnss_pci_data * pci_priv,u32 rc_num,u16 link_speed)152  int cnss_pci_set_max_link_speed(struct cnss_pci_data *pci_priv,
153  				u32 rc_num, u16 link_speed)
154  {
155  	return 0;
156  }
157  
cnss_reg_pci_event(struct cnss_pci_data * pci_priv)158  int cnss_reg_pci_event(struct cnss_pci_data *pci_priv)
159  {
160  	return 0;
161  }
162  
cnss_dereg_pci_event(struct cnss_pci_data * pci_priv)163  void cnss_dereg_pci_event(struct cnss_pci_data *pci_priv) {}
164  
cnss_wlan_adsp_pc_enable(struct cnss_pci_data * pci_priv,bool control)165  int cnss_wlan_adsp_pc_enable(struct cnss_pci_data *pci_priv, bool control)
166  {
167  	return 0;
168  }
169  
cnss_set_pci_link(struct cnss_pci_data * pci_priv,bool link_up)170  int cnss_set_pci_link(struct cnss_pci_data *pci_priv, bool link_up)
171  {
172  	return 0;
173  }
174  
cnss_pci_prevent_l1(struct device * dev)175  int cnss_pci_prevent_l1(struct device *dev)
176  {
177  	return 0;
178  }
179  EXPORT_SYMBOL(cnss_pci_prevent_l1);
180  
cnss_pci_allow_l1(struct device * dev)181  void cnss_pci_allow_l1(struct device *dev)
182  {
183  }
184  EXPORT_SYMBOL(cnss_pci_allow_l1);
185  
cnss_pci_get_msi_assignment(struct cnss_pci_data * pci_priv)186  int cnss_pci_get_msi_assignment(struct cnss_pci_data *pci_priv)
187  {
188  	return 0;
189  }
190  
cnss_pci_init_smmu(struct cnss_pci_data * pci_priv)191  int cnss_pci_init_smmu(struct cnss_pci_data *pci_priv)
192  {
193  	return 0;
194  }
195  
_cnss_pci_get_reg_dump(struct cnss_pci_data * pci_priv,u8 * buf,u32 len)196  int _cnss_pci_get_reg_dump(struct cnss_pci_data *pci_priv,
197  			   u8 *buf, u32 len)
198  {
199  	return 0;
200  }
201  
cnss_pci_update_drv_supported(struct cnss_pci_data * pci_priv)202  void cnss_pci_update_drv_supported(struct cnss_pci_data *pci_priv)
203  {
204  	pci_priv->drv_supported = false;
205  }
206  
207  #endif /* CONFIG_PCI_MSM */
208  
cnss_pci_get_drv_supported(struct cnss_pci_data * pci_priv)209  static inline bool cnss_pci_get_drv_supported(struct cnss_pci_data *pci_priv)
210  {
211  	return pci_priv->drv_supported;
212  }
213  
214  #if IS_ENABLED(CONFIG_ARCH_QCOM)
215  int cnss_pci_of_reserved_mem_device_init(struct cnss_pci_data *pci_priv);
216  int cnss_pci_wake_gpio_init(struct cnss_pci_data *pci_priv);
217  void cnss_pci_wake_gpio_deinit(struct cnss_pci_data *pci_priv);
218  #endif /* CONFIG_ARCH_QCOM */
219  #endif /* _CNSS_PCI_PLATFORM_H*/
220