1 /* 2 * Copyright (c) 2020-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 any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #ifndef _IPCI_API_H_ 19 #define _IPCI_API_H_ 20 struct hif_exec_context; 21 22 /** 23 * hif_ipci_open() - hif_bus_open 24 * @hif_ctx: hif context 25 * @bus_type: bus type 26 * 27 * Return: 0 for success or QDF_STATUS_E_NOMEM 28 */ 29 QDF_STATUS hif_ipci_open(struct hif_softc *hif_ctx, 30 enum qdf_bus_type bus_type); 31 32 /** 33 * hif_ipci_close() - hif_bus_close 34 * @hif_ctx: hif context 35 * 36 * Return: n/a 37 */ 38 void hif_ipci_close(struct hif_softc *hif_ctx); 39 40 /** 41 * hif_ipci_prevent_linkdown() - allow or permit linkdown 42 * @scn: struct hif_softc 43 * @flag: true prevents linkdown, false allows 44 * 45 * Calls into the platform driver to vote against taking down the 46 * pcie link. 47 * 48 * Return: n/a 49 */ 50 void hif_ipci_prevent_linkdown(struct hif_softc *scn, bool flag); 51 52 /** 53 * hif_ipci_bus_suspend() - prepare hif for suspend 54 * @scn: struct hif_softc 55 * 56 * Return: Errno 57 */ 58 int hif_ipci_bus_suspend(struct hif_softc *scn); 59 60 /** 61 * hif_ipci_bus_suspend_noirq() - ensure there are no pending transactions 62 * @scn: hif context 63 * 64 * Ensure that if we received the wakeup message before the irq 65 * was disabled that the message is processed before suspending. 66 * 67 * Return: -EBUSY if we fail to flush the tasklets. 68 */ 69 int hif_ipci_bus_suspend_noirq(struct hif_softc *scn); 70 71 /** 72 * hif_ipci_bus_resume() - prepare hif for resume 73 * @scn: struct hif_softc 74 * 75 * Return: Errno 76 */ 77 int hif_ipci_bus_resume(struct hif_softc *scn); 78 79 /** 80 * hif_ipci_bus_resume_noirq() - ensure there are no pending transactions 81 * @scn: hif context 82 * 83 * Ensure that if we received the wakeup message before the irq 84 * was disabled that the message is processed before suspending. 85 * 86 * Return: -EBUSY if we fail to flush the tasklets. 87 */ 88 int hif_ipci_bus_resume_noirq(struct hif_softc *scn); 89 90 /** 91 * hif_ipci_disable_isr() - disable interrupt 92 * @scn: struct hif_softc 93 * 94 * Return: n/a 95 */ 96 void hif_ipci_disable_isr(struct hif_softc *scn); 97 98 /** 99 * hif_ipci_nointrs() - disable IRQ 100 * @scn: struct hif_softc 101 * 102 * This function stops interrupt(s) 103 * 104 * Return: none 105 */ 106 void hif_ipci_nointrs(struct hif_softc *scn); 107 108 /** 109 * hif_ipci_dump_registers() - dump bus debug registers 110 * @scn: struct hif_opaque_softc 111 * 112 * This function dumps hif bus debug registers 113 * 114 * Return: 0 for success or error code 115 */ 116 int hif_ipci_dump_registers(struct hif_softc *scn); 117 118 /** 119 * hif_ipci_enable_bus() - enable bus 120 * @scn: soft_sc struct 121 * @dev: device pointer 122 * @bdev: bus dev pointer 123 * @bid: bus id pointer 124 * @type: enum hif_enable_type such as HIF_ENABLE_TYPE_PROBE 125 * 126 * This function enables the bus 127 * 128 * Return: QDF_STATUS 129 */ 130 QDF_STATUS hif_ipci_enable_bus( 131 struct hif_softc *scn, 132 struct device *dev, void *bdev, 133 const struct hif_bus_id *bid, 134 enum hif_enable_type type); 135 136 /** 137 * hif_ipci_disable_bus() - hif_disable_bus 138 * @scn: struct hif_softc 139 * 140 * This function disables the bus 141 * 142 * Return: none 143 */ 144 void hif_ipci_disable_bus(struct hif_softc *scn); 145 146 /** 147 * hif_ipci_bus_configure() - configure the pcie bus 148 * @scn: pointer to the hif context. 149 * 150 * return: 0 for success. nonzero for failure. 151 */ 152 int hif_ipci_bus_configure(struct hif_softc *scn); 153 154 /** 155 * hif_ipci_enable_power_management() - enable power management 156 * @hif_ctx: hif context 157 * @is_packet_log_enabled: pktlog enabled or disabled 158 * 159 * Return: none 160 */ 161 void hif_ipci_enable_power_management( 162 struct hif_softc *hif_ctx, 163 bool is_packet_log_enabled); 164 165 /** 166 * hif_ipci_disable_power_management() - disable power management 167 * @hif_ctx: hif context 168 * 169 * Return: none 170 */ 171 void hif_ipci_disable_power_management(struct hif_softc *hif_ctx); 172 173 /** 174 * hif_ipci_configure_grp_irq() - configure HW block irq 175 * @scn: hif context 176 * @exec: hif exec context 177 * 178 * Return:Errno 179 */ 180 int hif_ipci_configure_grp_irq( 181 struct hif_softc *scn, 182 struct hif_exec_context *exec); 183 184 /** 185 * hif_ipci_deconfigure_grp_irq() - deconfigure HW block irq 186 * @scn: hif context 187 * 188 * Return: None 189 */ 190 void hif_ipci_deconfigure_grp_irq(struct hif_softc *scn); 191 192 /** 193 * hif_ipci_display_stats() - display stats 194 * @hif_ctx: hif context 195 * 196 * Return: none 197 */ 198 void hif_ipci_display_stats(struct hif_softc *hif_ctx); 199 200 /** 201 * hif_ipci_clear_stats() - clear stats 202 * @hif_ctx: hif context 203 * 204 * Return: none 205 */ 206 void hif_ipci_clear_stats(struct hif_softc *hif_ctx); 207 208 /** 209 * hif_ipci_needs_bmi() - return true if the soc needs bmi through the driver 210 * @scn: hif context 211 * 212 * Return: true if soc needs driver bmi otherwise false 213 */ 214 bool hif_ipci_needs_bmi(struct hif_softc *scn); 215 216 /** 217 * hif_ipci_get_irq_name() - get irqname 218 * This function gives irqnumber to irqname 219 * mapping. 220 * 221 * @irq_no: irq number 222 * 223 * Return: irq name 224 */ 225 const char *hif_ipci_get_irq_name(int irq_no); 226 227 /** 228 * hif_ipci_enable_grp_irqs() - enable grp IRQs 229 * @scn: struct hif_softc 230 * 231 * This function enables grp irqs 232 * 233 * Return: 0 if success, error code if failure 234 */ 235 int hif_ipci_enable_grp_irqs(struct hif_softc *scn); 236 237 #ifdef HIF_CPU_PERF_AFFINE_MASK 238 /** 239 * hif_ipci_config_irq_affinity() - set the irq affinity 240 * @scn: hif context 241 * 242 * set irq affinity hint for wlan irqs to gold cores only for 243 * defconfig builds. 244 * 245 * Return: none 246 */ 247 void hif_ipci_config_irq_affinity(struct hif_softc *scn); 248 #endif 249 250 #ifdef HIF_CPU_CLEAR_AFFINITY 251 /** 252 * hif_ipci_config_irq_clear_cpu_affinity() - Remove cpu affinity of IRQ 253 * @scn: HIF handle 254 * @intr_ctxt_id: interrupt group index 255 * @cpu: CPU core to clear 256 * 257 * Return: None 258 */ 259 void hif_ipci_config_irq_clear_cpu_affinity(struct hif_softc *scn, 260 int intr_ctxt_id, int cpu); 261 #else 262 static inline 263 void hif_ipci_config_irq_clear_cpu_affinity(struct hif_softc *scn, 264 int intr_ctxt_id, int cpu) 265 { 266 } 267 #endif 268 269 /** 270 * hif_ipci_disable_grp_irqs() - disable grp IRQs 271 * @scn: struct hif_softc 272 * 273 * This function disables grp irqs 274 * 275 * Return: 0 if success, error code if failure 276 */ 277 int hif_ipci_disable_grp_irqs(struct hif_softc *scn); 278 279 #ifdef FEATURE_IRQ_AFFINITY 280 /** 281 * hif_ipci_set_grp_intr_affinity() - Set irq affinity hint for grp 282 * intrs based on bitmask 283 * @scn: hif context 284 * @grp_intr_bitmask: group intr bitmask 285 * @perf: affine to perf or non-perf cluster 286 * 287 * Return: None 288 */ 289 void hif_ipci_set_grp_intr_affinity(struct hif_softc *scn, 290 uint32_t grp_intr_bitmask, bool perf); 291 #endif 292 #endif /* _IPCI_API_H_ */ 293