ipa_api.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/ipa_mhi.h>
  6. #include <linux/ipa_uc_offload.h>
  7. #include <linux/ipa_wdi3.h>
  8. #include "ipa_common_i.h"
  9. #ifndef _IPA_API_H_
  10. #define _IPA_API_H_
  11. struct ipa_api_controller {
  12. int (*ipa_reset_endpoint)(u32 clnt_hdl);
  13. int (*ipa_clear_endpoint_delay)(u32 clnt_hdl);
  14. int (*ipa_disable_endpoint)(u32 clnt_hdl);
  15. int (*ipa_cfg_ep)(u32 clnt_hdl, const struct ipa_ep_cfg *ipa_ep_cfg);
  16. int (*ipa_cfg_ep_nat)(u32 clnt_hdl,
  17. const struct ipa_ep_cfg_nat *ipa_ep_cfg);
  18. int (*ipa_cfg_ep_conn_track)(u32 clnt_hdl,
  19. const struct ipa_ep_cfg_conn_track *ipa_ep_cfg);
  20. int (*ipa_cfg_ep_hdr)(u32 clnt_hdl,
  21. const struct ipa_ep_cfg_hdr *ipa_ep_cfg);
  22. int (*ipa_cfg_ep_hdr_ext)(u32 clnt_hdl,
  23. const struct ipa_ep_cfg_hdr_ext *ipa_ep_cfg);
  24. int (*ipa_cfg_ep_mode)(u32 clnt_hdl,
  25. const struct ipa_ep_cfg_mode *ipa_ep_cfg);
  26. int (*ipa_cfg_ep_aggr)(u32 clnt_hdl,
  27. const struct ipa_ep_cfg_aggr *ipa_ep_cfg);
  28. int (*ipa_cfg_ep_deaggr)(u32 clnt_hdl,
  29. const struct ipa_ep_cfg_deaggr *ipa_ep_cfg);
  30. int (*ipa_cfg_ep_route)(u32 clnt_hdl,
  31. const struct ipa_ep_cfg_route *ipa_ep_cfg);
  32. int (*ipa_cfg_ep_holb)(u32 clnt_hdl,
  33. const struct ipa_ep_cfg_holb *ipa_ep_cfg);
  34. int (*ipa_cfg_ep_cfg)(u32 clnt_hdl,
  35. const struct ipa_ep_cfg_cfg *ipa_ep_cfg);
  36. int (*ipa_cfg_ep_metadata_mask)(u32 clnt_hdl,
  37. const struct ipa_ep_cfg_metadata_mask *ipa_ep_cfg);
  38. int (*ipa_cfg_ep_holb_by_client)(enum ipa_client_type client,
  39. const struct ipa_ep_cfg_holb *ipa_ep_cfg);
  40. int (*ipa_cfg_ep_ctrl)(u32 clnt_hdl,
  41. const struct ipa_ep_cfg_ctrl *ep_ctrl);
  42. int (*ipa_add_hdr)(struct ipa_ioc_add_hdr *hdrs);
  43. int (*ipa_add_hdr_usr)(struct ipa_ioc_add_hdr *hdrs, bool user_only);
  44. int (*ipa_del_hdr)(struct ipa_ioc_del_hdr *hdls);
  45. int (*ipa_commit_hdr)(void);
  46. int (*ipa_reset_hdr)(bool user_only);
  47. int (*ipa_get_hdr)(struct ipa_ioc_get_hdr *lookup);
  48. int (*ipa_put_hdr)(u32 hdr_hdl);
  49. int (*ipa_copy_hdr)(struct ipa_ioc_copy_hdr *copy);
  50. int (*ipa_add_hdr_proc_ctx)(struct ipa_ioc_add_hdr_proc_ctx *proc_ctxs,
  51. bool user_only);
  52. int (*ipa_del_hdr_proc_ctx)(struct ipa_ioc_del_hdr_proc_ctx *hdls);
  53. int (*ipa_add_rt_rule)(struct ipa_ioc_add_rt_rule *rules);
  54. int (*ipa_add_rt_rule_v2)(struct ipa_ioc_add_rt_rule_v2 *rules);
  55. int (*ipa_add_rt_rule_usr)(struct ipa_ioc_add_rt_rule *rules,
  56. bool user_only);
  57. int (*ipa_add_rt_rule_usr_v2)(struct ipa_ioc_add_rt_rule_v2 *rules,
  58. bool user_only);
  59. int (*ipa_del_rt_rule)(struct ipa_ioc_del_rt_rule *hdls);
  60. int (*ipa_commit_rt)(enum ipa_ip_type ip);
  61. int (*ipa_reset_rt)(enum ipa_ip_type ip, bool user_only);
  62. int (*ipa_get_rt_tbl)(struct ipa_ioc_get_rt_tbl *lookup);
  63. int (*ipa_put_rt_tbl)(u32 rt_tbl_hdl);
  64. int (*ipa_query_rt_index)(struct ipa_ioc_get_rt_tbl_indx *in);
  65. int (*ipa_mdfy_rt_rule)(struct ipa_ioc_mdfy_rt_rule *rules);
  66. int (*ipa_mdfy_rt_rule_v2)(struct ipa_ioc_mdfy_rt_rule_v2 *rules);
  67. int (*ipa_add_flt_rule)(struct ipa_ioc_add_flt_rule *rules);
  68. int (*ipa_add_flt_rule_v2)(struct ipa_ioc_add_flt_rule_v2 *rules);
  69. int (*ipa_add_flt_rule_usr)(struct ipa_ioc_add_flt_rule *rules,
  70. bool user_only);
  71. int (*ipa_add_flt_rule_usr_v2)
  72. (struct ipa_ioc_add_flt_rule_v2 *rules, bool user_only);
  73. int (*ipa_del_flt_rule)(struct ipa_ioc_del_flt_rule *hdls);
  74. int (*ipa_mdfy_flt_rule)(struct ipa_ioc_mdfy_flt_rule *rules);
  75. int (*ipa_mdfy_flt_rule_v2)(struct ipa_ioc_mdfy_flt_rule_v2 *rules);
  76. int (*ipa_commit_flt)(enum ipa_ip_type ip);
  77. int (*ipa_reset_flt)(enum ipa_ip_type ip, bool user_only);
  78. int (*ipa_allocate_nat_device)(struct ipa_ioc_nat_alloc_mem *mem);
  79. int (*ipa_allocate_nat_table)(
  80. struct ipa_ioc_nat_ipv6ct_table_alloc *table_alloc);
  81. int (*ipa_allocate_ipv6ct_table)(
  82. struct ipa_ioc_nat_ipv6ct_table_alloc *table_alloc);
  83. int (*ipa_nat_init_cmd)(struct ipa_ioc_v4_nat_init *init);
  84. int (*ipa_ipv6ct_init_cmd)(struct ipa_ioc_ipv6ct_init *init);
  85. int (*ipa_nat_dma_cmd)(struct ipa_ioc_nat_dma_cmd *dma);
  86. int (*ipa_table_dma_cmd)(struct ipa_ioc_nat_dma_cmd *dma);
  87. int (*ipa_nat_del_cmd)(struct ipa_ioc_v4_nat_del *del);
  88. int (*ipa_del_nat_table)(struct ipa_ioc_nat_ipv6ct_table_del *del);
  89. int (*ipa_del_ipv6ct_table)(struct ipa_ioc_nat_ipv6ct_table_del *del);
  90. int (*ipa_nat_mdfy_pdn)(struct ipa_ioc_nat_pdn_entry *mdfy_pdn);
  91. int (*ipa_send_msg)(struct ipa_msg_meta *meta, void *buff,
  92. ipa_msg_free_fn callback);
  93. int (*ipa_register_pull_msg)(struct ipa_msg_meta *meta,
  94. ipa_msg_pull_fn callback);
  95. int (*ipa_deregister_pull_msg)(struct ipa_msg_meta *meta);
  96. int (*ipa_register_intf)(const char *name,
  97. const struct ipa_tx_intf *tx,
  98. const struct ipa_rx_intf *rx);
  99. int (*ipa_register_intf_ext)(const char *name,
  100. const struct ipa_tx_intf *tx,
  101. const struct ipa_rx_intf *rx,
  102. const struct ipa_ext_intf *ext);
  103. int (*ipa_deregister_intf)(const char *name);
  104. int (*ipa_set_aggr_mode)(enum ipa_aggr_mode mode);
  105. int (*ipa_set_qcncm_ndp_sig)(char sig[3]);
  106. int (*ipa_set_single_ndp_per_mbim)(bool enable);
  107. int (*ipa_tx_dp_mul)(enum ipa_client_type dst,
  108. struct ipa_tx_data_desc *data_desc);
  109. void (*ipa_free_skb)(struct ipa_rx_data *data);
  110. int (*ipa_setup_sys_pipe)(struct ipa_sys_connect_params *sys_in,
  111. u32 *clnt_hdl);
  112. int (*ipa_teardown_sys_pipe)(u32 clnt_hdl);
  113. int (*ipa_sys_setup)(struct ipa_sys_connect_params *sys_in,
  114. unsigned long *ipa_bam_hdl,
  115. u32 *ipa_pipe_num, u32 *clnt_hdl, bool en_status);
  116. int (*ipa_sys_teardown)(u32 clnt_hdl);
  117. int (*ipa_sys_update_gsi_hdls)(u32 clnt_hdl, unsigned long gsi_ch_hdl,
  118. unsigned long gsi_ev_hdl);
  119. int (*ipa_connect_wdi_pipe)(struct ipa_wdi_in_params *in,
  120. struct ipa_wdi_out_params *out);
  121. int (*ipa_disconnect_wdi_pipe)(u32 clnt_hdl);
  122. int (*ipa_enable_wdi_pipe)(u32 clnt_hdl);
  123. int (*ipa_disable_wdi_pipe)(u32 clnt_hdl);
  124. int (*ipa_resume_wdi_pipe)(u32 clnt_hdl);
  125. int (*ipa_suspend_wdi_pipe)(u32 clnt_hdl);
  126. int (*ipa_get_wdi_stats)(struct IpaHwStatsWDIInfoData_t *stats);
  127. int (*ipa_uc_bw_monitor)(struct ipa_wdi_bw_info *info);
  128. int (*ipa_set_wlan_tx_info)(struct ipa_wdi_tx_info *info);
  129. u16 (*ipa_get_smem_restr_bytes)(void);
  130. int (*ipa_broadcast_wdi_quota_reach_ind)(uint32_t fid,
  131. uint64_t num_bytes);
  132. int (*ipa_uc_wdi_get_dbpa)(struct ipa_wdi_db_params *out);
  133. int (*ipa_uc_reg_rdyCB)(struct ipa_wdi_uc_ready_params *param);
  134. int (*ipa_uc_dereg_rdyCB)(void);
  135. int (*teth_bridge_init)(struct teth_bridge_init_params *params);
  136. int (*teth_bridge_disconnect)(enum ipa_client_type client);
  137. int (*teth_bridge_connect)(
  138. struct teth_bridge_connect_params *connect_params);
  139. void (*ipa_set_client)(
  140. int index, enum ipacm_client_enum client, bool uplink);
  141. enum ipacm_client_enum (*ipa_get_client)(int pipe_idx);
  142. bool (*ipa_get_client_uplink)(int pipe_idx);
  143. int (*ipa_dma_init)(void);
  144. int (*ipa_dma_enable)(void);
  145. int (*ipa_dma_disable)(void);
  146. int (*ipa_dma_sync_memcpy)(u64 dest, u64 src, int len);
  147. int (*ipa_dma_async_memcpy)(u64 dest, u64 src, int len,
  148. void (*user_cb)(void *user1), void *user_param);
  149. int (*ipa_dma_uc_memcpy)(phys_addr_t dest, phys_addr_t src, int len);
  150. void (*ipa_dma_destroy)(void);
  151. bool (*ipa_has_open_aggr_frame)(enum ipa_client_type client);
  152. int (*ipa_generate_tag_process)(void);
  153. int (*ipa_disable_sps_pipe)(enum ipa_client_type client);
  154. void (*ipa_set_tag_process_before_gating)(bool val);
  155. int (*ipa_mhi_init_engine)(struct ipa_mhi_init_engine *params);
  156. int (*ipa_connect_mhi_pipe)(struct ipa_mhi_connect_params_internal *in,
  157. u32 *clnt_hdl);
  158. int (*ipa_disconnect_mhi_pipe)(u32 clnt_hdl);
  159. bool (*ipa_mhi_stop_gsi_channel)(enum ipa_client_type client);
  160. int (*ipa_qmi_disable_force_clear)(u32 request_id);
  161. int (*ipa_qmi_enable_force_clear_datapath_send)(
  162. struct ipa_enable_force_clear_datapath_req_msg_v01 *req);
  163. int (*ipa_qmi_disable_force_clear_datapath_send)(
  164. struct ipa_disable_force_clear_datapath_req_msg_v01 *req);
  165. bool (*ipa_mhi_sps_channel_empty)(enum ipa_client_type client);
  166. int (*ipa_mhi_reset_channel_internal)(enum ipa_client_type client);
  167. int (*ipa_mhi_start_channel_internal)(enum ipa_client_type client);
  168. void (*ipa_get_holb)(int ep_idx, struct ipa_ep_cfg_holb *holb);
  169. int (*ipa_mhi_query_ch_info)(enum ipa_client_type client,
  170. struct gsi_chan_info *ch_info);
  171. int (*ipa_mhi_resume_channels_internal)(
  172. enum ipa_client_type client,
  173. bool LPTransitionRejected,
  174. bool brstmode_enabled,
  175. union __packed gsi_channel_scratch ch_scratch,
  176. u8 index);
  177. int (*ipa_mhi_destroy_channel)(enum ipa_client_type client);
  178. int (*ipa_uc_mhi_send_dl_ul_sync_info)
  179. (union IpaHwMhiDlUlSyncCmdData_t *cmd);
  180. int (*ipa_uc_mhi_init)
  181. (void (*ready_cb)(void), void (*wakeup_request_cb)(void));
  182. void (*ipa_uc_mhi_cleanup)(void);
  183. int (*ipa_uc_mhi_print_stats)(char *dbg_buff, int size);
  184. int (*ipa_uc_mhi_reset_channel)(int channelHandle);
  185. int (*ipa_uc_mhi_suspend_channel)(int channelHandle);
  186. int (*ipa_uc_mhi_stop_event_update_channel)(int channelHandle);
  187. int (*ipa_uc_state_check)(void);
  188. int (*ipa_write_qmap_id)(struct ipa_ioc_write_qmapid *param_in);
  189. int (*ipa_add_interrupt_handler)(enum ipa_irq_type interrupt,
  190. ipa_irq_handler_t handler,
  191. bool deferred_flag,
  192. void *private_data);
  193. int (*ipa_remove_interrupt_handler)(enum ipa_irq_type interrupt);
  194. int (*ipa_restore_suspend_handler)(void);
  195. void (*ipa_bam_reg_dump)(void);
  196. int (*ipa_get_ep_mapping)(enum ipa_client_type client);
  197. bool (*ipa_is_ready)(void);
  198. void (*ipa_proxy_clk_vote)(void);
  199. void (*ipa_proxy_clk_unvote)(void);
  200. bool (*ipa_is_client_handle_valid)(u32 clnt_hdl);
  201. enum ipa_client_type (*ipa_get_client_mapping)(int pipe_idx);
  202. bool (*ipa_get_modem_cfg_emb_pipe_flt)(void);
  203. enum ipa_transport_type (*ipa_get_transport_type)(void);
  204. int (*ipa_ap_suspend)(struct device *dev);
  205. int (*ipa_ap_resume)(struct device *dev);
  206. int (*ipa_stop_gsi_channel)(u32 clnt_hdl);
  207. int (*ipa_start_gsi_channel)(u32 clnt_hdl);
  208. struct iommu_domain *(*ipa_get_smmu_domain)(void);
  209. int (*ipa_disable_apps_wan_cons_deaggr)(uint32_t agg_size,
  210. uint32_t agg_count);
  211. struct device *(*ipa_get_dma_dev)(void);
  212. int (*ipa_release_wdi_mapping)(u32 num_buffers,
  213. struct ipa_wdi_buffer_info *info);
  214. int (*ipa_create_wdi_mapping)(u32 num_buffers,
  215. struct ipa_wdi_buffer_info *info);
  216. const struct ipa_gsi_ep_config *(*ipa_get_gsi_ep_info)
  217. (enum ipa_client_type client);
  218. void (*ipa_inc_client_enable_clks)(
  219. struct ipa_active_client_logging_info *id);
  220. void (*ipa_dec_client_disable_clks)(
  221. struct ipa_active_client_logging_info *id);
  222. int (*ipa_inc_client_enable_clks_no_block)(
  223. struct ipa_active_client_logging_info *id);
  224. int (*ipa_suspend_resource_no_block)(
  225. enum ipa_rm_resource_name resource);
  226. int (*ipa_resume_resource)(enum ipa_rm_resource_name name);
  227. int (*ipa_suspend_resource_sync)(enum ipa_rm_resource_name resource);
  228. int (*ipa_set_required_perf_profile)(
  229. enum ipa_voltage_level floor_voltage, u32 bandwidth_mbps);
  230. void *(*ipa_get_ipc_logbuf)(void);
  231. void *(*ipa_get_ipc_logbuf_low)(void);
  232. int (*ipa_rx_poll)(u32 clnt_hdl, int budget);
  233. void (*ipa_recycle_wan_skb)(struct sk_buff *skb);
  234. int (*ipa_setup_uc_ntn_pipes)(struct ipa_ntn_conn_in_params *in,
  235. ipa_notify_cb notify, void *priv, u8 hdr_len,
  236. struct ipa_ntn_conn_out_params *outp);
  237. int (*ipa_tear_down_uc_offload_pipes)(int ipa_ep_idx_ul,
  238. int ipa_ep_idx_dl, struct ipa_ntn_conn_in_params *params);
  239. struct device *(*ipa_get_pdev)(void);
  240. int (*ipa_ntn_uc_reg_rdyCB)(void (*ipauc_ready_cb)(void *user_data),
  241. void *user_data);
  242. void (*ipa_ntn_uc_dereg_rdyCB)(void);
  243. int (*ipa_conn_wdi_pipes)(struct ipa_wdi_conn_in_params *in,
  244. struct ipa_wdi_conn_out_params *out,
  245. ipa_wdi_meter_notifier_cb wdi_notify);
  246. int (*ipa_disconn_wdi_pipes)(int ipa_ep_idx_tx,
  247. int ipa_ep_idx_rx);
  248. int (*ipa_enable_wdi_pipes)(int ipa_ep_idx_tx,
  249. int ipa_ep_idx_rx);
  250. int (*ipa_disable_wdi_pipes)(int ipa_ep_idx_tx,
  251. int ipa_ep_idx_rx);
  252. int (*ipa_tz_unlock_reg)(struct ipa_tz_unlock_reg_info *reg_info,
  253. u16 num_regs);
  254. int (*ipa_get_smmu_params)(struct ipa_smmu_in_params *in,
  255. struct ipa_smmu_out_params *out);
  256. int (*ipa_is_vlan_mode)(enum ipa_vlan_ifaces iface, bool *res);
  257. int (*ipa_wigig_internal_init)(
  258. struct ipa_wdi_uc_ready_params *inout,
  259. ipa_wigig_misc_int_cb int_notify,
  260. phys_addr_t *uc_db_pa);
  261. int (*ipa_conn_wigig_rx_pipe_i)(void *in,
  262. struct ipa_wigig_conn_out_params *out,
  263. struct dentry **parent);
  264. int (*ipa_conn_wigig_client_i)(void *in,
  265. struct ipa_wigig_conn_out_params *out,
  266. ipa_notify_cb tx_notify,
  267. void *priv);
  268. int (*ipa_disconn_wigig_pipe_i)(enum ipa_client_type client,
  269. struct ipa_wigig_pipe_setup_info_smmu *pipe_smmu,
  270. void *dbuff);
  271. int (*ipa_wigig_uc_msi_init)(bool init,
  272. phys_addr_t periph_baddr_pa,
  273. phys_addr_t pseudo_cause_pa,
  274. phys_addr_t int_gen_tx_pa,
  275. phys_addr_t int_gen_rx_pa,
  276. phys_addr_t dma_ep_misc_pa);
  277. int (*ipa_enable_wigig_pipe_i)(enum ipa_client_type client);
  278. int (*ipa_disable_wigig_pipe_i)(enum ipa_client_type client);
  279. void (*ipa_register_client_callback)(
  280. int (*client_cb)(bool is_lock),
  281. bool (*teth_port_state)(void), enum ipa_client_type client);
  282. void (*ipa_deregister_client_callback)(enum ipa_client_type client);
  283. bool (*ipa_get_lan_rx_napi)(void);
  284. int (*ipa_uc_debug_stats_alloc)(
  285. struct IpaHwOffloadStatsAllocCmdData_t cmdinfo);
  286. int (*ipa_uc_debug_stats_dealloc)(uint32_t prot_id);
  287. void (*ipa_get_gsi_stats)(int prot_id,
  288. struct ipa_uc_dbg_ring_stats *stats);
  289. int (*ipa_get_prot_id)(enum ipa_client_type client);
  290. };
  291. #if IS_ENABLED(CONFIG_IPA3)
  292. int ipa3_plat_drv_probe(struct platform_device *pdev_p,
  293. struct ipa_api_controller *api_ctrl,
  294. const struct of_device_id *pdrv_match);
  295. int ipa3_pci_drv_probe(
  296. struct pci_dev *pci_dev,
  297. struct ipa_api_controller *api_ctrl,
  298. const struct of_device_id *pdrv_match);
  299. #else /* IS_ENABLED(CONFIG_IPA3) */
  300. static inline int ipa3_plat_drv_probe(struct platform_device *pdev_p,
  301. struct ipa_api_controller *api_ctrl,
  302. const struct of_device_id *pdrv_match)
  303. {
  304. return -ENODEV;
  305. }
  306. static inline int ipa3_pci_drv_probe(
  307. struct pci_dev *pci_dev,
  308. struct ipa_api_controller *api_ctrl,
  309. const struct of_device_id *pdrv_match)
  310. {
  311. return -ENODEV;
  312. }
  313. #endif /* IS_ENABLED(CONFIG_IPA3) */
  314. #endif /* _IPA_API_H_ */