13983bc45SNaman Padhiar /* SPDX-License-Identifier: GPL-2.0-only */ 23983bc45SNaman Padhiar /* 33983bc45SNaman Padhiar * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. 4*f6e67cd9SSandeep Singh * Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved. 53983bc45SNaman Padhiar */ 63983bc45SNaman Padhiar #ifndef _ICNSS_WLAN_H_ 73983bc45SNaman Padhiar #define _ICNSS_WLAN_H_ 83983bc45SNaman Padhiar 93983bc45SNaman Padhiar #include <linux/interrupt.h> 103983bc45SNaman Padhiar #include <linux/device.h> 113983bc45SNaman Padhiar 123983bc45SNaman Padhiar #define ICNSS_MAX_IRQ_REGISTRATIONS 12 133983bc45SNaman Padhiar #define IWCN_MAX_IRQ_REGISTRATIONS 32 143983bc45SNaman Padhiar #define ICNSS_MAX_TIMESTAMP_LEN 32 15414f0dcfSSandeep Singh #define ICNSS_WLFW_MAX_BUILD_ID_LEN 128 16*f6e67cd9SSandeep Singh #define ICNSS_MAX_DEV_MEM_NUM 4 173983bc45SNaman Padhiar 183983bc45SNaman Padhiar #define DEVICE_NAME_MAX 10 193983bc45SNaman Padhiar enum icnss_uevent { 203983bc45SNaman Padhiar ICNSS_UEVENT_FW_CRASHED, 213983bc45SNaman Padhiar ICNSS_UEVENT_FW_DOWN, 223983bc45SNaman Padhiar ICNSS_UEVENT_HANG_DATA, 233983bc45SNaman Padhiar ICNSS_UEVENT_SMMU_FAULT, 243983bc45SNaman Padhiar }; 253983bc45SNaman Padhiar 269c8339eaSSandeep Singh enum icnss_device_config { 279c8339eaSSandeep Singh ICNSS_IPA_DISABLED, 289c8339eaSSandeep Singh }; 299c8339eaSSandeep Singh 303983bc45SNaman Padhiar struct icnss_uevent_hang_data { 313983bc45SNaman Padhiar void *hang_event_data; 323983bc45SNaman Padhiar uint16_t hang_event_data_len; 333983bc45SNaman Padhiar }; 343983bc45SNaman Padhiar 353983bc45SNaman Padhiar struct icnss_uevent_fw_down_data { 363983bc45SNaman Padhiar bool crashed; 373983bc45SNaman Padhiar }; 383983bc45SNaman Padhiar 393983bc45SNaman Padhiar struct icnss_uevent_data { 403983bc45SNaman Padhiar enum icnss_uevent uevent; 413983bc45SNaman Padhiar void *data; 423983bc45SNaman Padhiar }; 433983bc45SNaman Padhiar 44*f6e67cd9SSandeep Singh struct icnss_dev_mem_info { 45*f6e67cd9SSandeep Singh u64 start; 46*f6e67cd9SSandeep Singh u64 size; 47*f6e67cd9SSandeep Singh }; 48*f6e67cd9SSandeep Singh 493983bc45SNaman Padhiar /* Device information like supported device ids, etc*/ 503983bc45SNaman Padhiar struct device_info { 513983bc45SNaman Padhiar char name[DEVICE_NAME_MAX]; 523983bc45SNaman Padhiar uint16_t device_id; 533983bc45SNaman Padhiar }; 543983bc45SNaman Padhiar 553983bc45SNaman Padhiar struct icnss_driver_ops { 563983bc45SNaman Padhiar char *name; 573983bc45SNaman Padhiar struct device_info *dev_info; 583983bc45SNaman Padhiar unsigned long drv_state; 593983bc45SNaman Padhiar struct device_driver driver; 603983bc45SNaman Padhiar int (*probe)(struct device *dev); 613983bc45SNaman Padhiar void (*remove)(struct device *dev); 623983bc45SNaman Padhiar void (*shutdown)(struct device *dev); 633983bc45SNaman Padhiar int (*reinit)(struct device *dev); 643983bc45SNaman Padhiar void (*crash_shutdown)(void *pdev); 653983bc45SNaman Padhiar int (*pm_suspend)(struct device *dev); 663983bc45SNaman Padhiar int (*pm_resume)(struct device *dev); 673983bc45SNaman Padhiar int (*suspend_noirq)(struct device *dev); 683983bc45SNaman Padhiar int (*resume_noirq)(struct device *dev); 693983bc45SNaman Padhiar int (*runtime_suspend)(struct device *dev); 703983bc45SNaman Padhiar int (*runtime_resume)(struct device *dev); 713983bc45SNaman Padhiar int (*uevent)(struct device *dev, struct icnss_uevent_data *uevent); 723983bc45SNaman Padhiar int (*idle_shutdown)(struct device *dev); 733983bc45SNaman Padhiar int (*idle_restart)(struct device *dev); 743983bc45SNaman Padhiar int (*set_therm_cdev_state)(struct device *dev, 753983bc45SNaman Padhiar unsigned long thermal_state, 763983bc45SNaman Padhiar int tcdev_id); 773983bc45SNaman Padhiar }; 783983bc45SNaman Padhiar 793983bc45SNaman Padhiar 803983bc45SNaman Padhiar struct ce_tgt_pipe_cfg { 813983bc45SNaman Padhiar u32 pipe_num; 823983bc45SNaman Padhiar u32 pipe_dir; 833983bc45SNaman Padhiar u32 nentries; 843983bc45SNaman Padhiar u32 nbytes_max; 853983bc45SNaman Padhiar u32 flags; 863983bc45SNaman Padhiar u32 reserved; 873983bc45SNaman Padhiar }; 883983bc45SNaman Padhiar 893983bc45SNaman Padhiar struct ce_svc_pipe_cfg { 903983bc45SNaman Padhiar u32 service_id; 913983bc45SNaman Padhiar u32 pipe_dir; 923983bc45SNaman Padhiar u32 pipe_num; 933983bc45SNaman Padhiar }; 943983bc45SNaman Padhiar 953983bc45SNaman Padhiar struct icnss_shadow_reg_cfg { 963983bc45SNaman Padhiar u16 ce_id; 973983bc45SNaman Padhiar u16 reg_offset; 983983bc45SNaman Padhiar }; 993983bc45SNaman Padhiar 1003983bc45SNaman Padhiar struct icnss_shadow_reg_v2_cfg { 1013983bc45SNaman Padhiar u32 addr; 1023983bc45SNaman Padhiar }; 1033983bc45SNaman Padhiar 104aec346c6SSandeep Singh struct icnss_shadow_reg_v3_cfg { 105aec346c6SSandeep Singh u32 addr; 106aec346c6SSandeep Singh }; 107aec346c6SSandeep Singh 1083983bc45SNaman Padhiar struct icnss_rri_over_ddr_cfg { 1093983bc45SNaman Padhiar u32 base_addr_low; 1103983bc45SNaman Padhiar u32 base_addr_high; 1113983bc45SNaman Padhiar }; 1123983bc45SNaman Padhiar /* CE configuration to target */ 1133983bc45SNaman Padhiar struct icnss_wlan_enable_cfg { 1143983bc45SNaman Padhiar u32 num_ce_tgt_cfg; 1153983bc45SNaman Padhiar struct ce_tgt_pipe_cfg *ce_tgt_cfg; 1163983bc45SNaman Padhiar u32 num_ce_svc_pipe_cfg; 1173983bc45SNaman Padhiar struct ce_svc_pipe_cfg *ce_svc_cfg; 1183983bc45SNaman Padhiar u32 num_shadow_reg_cfg; 1193983bc45SNaman Padhiar struct icnss_shadow_reg_cfg *shadow_reg_cfg; 1203983bc45SNaman Padhiar u32 num_shadow_reg_v2_cfg; 1213983bc45SNaman Padhiar struct icnss_shadow_reg_v2_cfg *shadow_reg_v2_cfg; 122aec346c6SSandeep Singh u32 num_shadow_reg_v3_cfg; 123aec346c6SSandeep Singh struct icnss_shadow_reg_v3_cfg *shadow_reg_v3_cfg; 1243983bc45SNaman Padhiar bool rri_over_ddr_cfg_valid; 1253983bc45SNaman Padhiar struct icnss_rri_over_ddr_cfg rri_over_ddr_cfg; 1263983bc45SNaman Padhiar }; 1273983bc45SNaman Padhiar 1283983bc45SNaman Padhiar /* driver modes */ 1293983bc45SNaman Padhiar enum icnss_driver_mode { 1303983bc45SNaman Padhiar ICNSS_MISSION, 1313983bc45SNaman Padhiar ICNSS_FTM, 1323983bc45SNaman Padhiar ICNSS_EPPING, 1333983bc45SNaman Padhiar ICNSS_WALTEST, 1343983bc45SNaman Padhiar ICNSS_OFF, 1353983bc45SNaman Padhiar ICNSS_CCPM, 1363983bc45SNaman Padhiar ICNSS_QVIT, 1373983bc45SNaman Padhiar ICNSS_CALIBRATION, 1383983bc45SNaman Padhiar }; 1393983bc45SNaman Padhiar 140c5b4320dSSandeep Singh enum icnss_rd_card_chain_cap { 141c5b4320dSSandeep Singh ICNSS_RD_CARD_CHAIN_CAP_UNSPECIFIED, 142c5b4320dSSandeep Singh ICNSS_RD_CARD_CHAIN_CAP_1x1, 143c5b4320dSSandeep Singh ICNSS_RD_CARD_CHAIN_CAP_2x2, 144c5b4320dSSandeep Singh ICNSS_RD_CARD_CHAIN_CAP_MAX_VAL, 145c5b4320dSSandeep Singh }; 146c5b4320dSSandeep Singh 147c5b4320dSSandeep Singh enum icnss_phy_he_channel_width_cap { 148c5b4320dSSandeep Singh ICNSS_PHY_HE_CHANNEL_WIDTH_CAP_UNSPECIFIED, 149c5b4320dSSandeep Singh ICNSS_PHY_HE_CHANNEL_WIDTH_CAP_80MHZ, 150c5b4320dSSandeep Singh ICNSS_PHY_HE_CHANNEL_WIDTH_CAP_160MHZ, 151c5b4320dSSandeep Singh ICNSS_PHY_HE_CHANNEL_WIDTH_CAP_MAX_VAL, 152c5b4320dSSandeep Singh }; 153c5b4320dSSandeep Singh 154c5b4320dSSandeep Singh enum icnss_phy_qam_cap { 155c5b4320dSSandeep Singh ICNSS_PHY_QAM_CAP_UNSPECIFIED, 156c5b4320dSSandeep Singh ICNSS_PHY_QAM_CAP_1K, 157c5b4320dSSandeep Singh ICNSS_PHY_QAM_CAP_4K, 158c5b4320dSSandeep Singh ICNSS_PHY_QAM_CAP_MAX_VAL, 159c5b4320dSSandeep Singh }; 160c5b4320dSSandeep Singh 1613983bc45SNaman Padhiar struct icnss_soc_info { 1623983bc45SNaman Padhiar void __iomem *v_addr; 1633983bc45SNaman Padhiar phys_addr_t p_addr; 1643983bc45SNaman Padhiar uint32_t chip_id; 1653983bc45SNaman Padhiar uint32_t chip_family; 1663983bc45SNaman Padhiar uint32_t board_id; 1673983bc45SNaman Padhiar uint32_t soc_id; 1683983bc45SNaman Padhiar uint32_t fw_version; 1693983bc45SNaman Padhiar char fw_build_timestamp[ICNSS_MAX_TIMESTAMP_LEN + 1]; 170414f0dcfSSandeep Singh char fw_build_id[ICNSS_WLFW_MAX_BUILD_ID_LEN + 1]; 171c5b4320dSSandeep Singh enum icnss_rd_card_chain_cap rd_card_chain_cap; 172c5b4320dSSandeep Singh enum icnss_phy_he_channel_width_cap phy_he_channel_width_cap; 173c5b4320dSSandeep Singh enum icnss_phy_qam_cap phy_qam_cap; 174*f6e67cd9SSandeep Singh struct icnss_dev_mem_info dev_mem_info[ICNSS_MAX_DEV_MEM_NUM]; 1753983bc45SNaman Padhiar }; 1763983bc45SNaman Padhiar 1773983bc45SNaman Padhiar #define icnss_register_driver(ops) \ 1783983bc45SNaman Padhiar __icnss_register_driver(ops, THIS_MODULE, KBUILD_MODNAME) 1793983bc45SNaman Padhiar extern int __icnss_register_driver(struct icnss_driver_ops *ops, 1803983bc45SNaman Padhiar struct module *owner, const char *mod_name); 1813983bc45SNaman Padhiar 1823983bc45SNaman Padhiar extern int icnss_unregister_driver(struct icnss_driver_ops *ops); 1833983bc45SNaman Padhiar 1843983bc45SNaman Padhiar extern int icnss_wlan_enable(struct device *dev, 1853983bc45SNaman Padhiar struct icnss_wlan_enable_cfg *config, 1863983bc45SNaman Padhiar enum icnss_driver_mode mode, 1873983bc45SNaman Padhiar const char *host_version); 1883983bc45SNaman Padhiar extern int icnss_wlan_disable(struct device *dev, enum icnss_driver_mode mode); 1893983bc45SNaman Padhiar extern void icnss_enable_irq(struct device *dev, unsigned int ce_id); 1903983bc45SNaman Padhiar extern void icnss_disable_irq(struct device *dev, unsigned int ce_id); 1913983bc45SNaman Padhiar extern int icnss_get_soc_info(struct device *dev, struct icnss_soc_info *info); 1923983bc45SNaman Padhiar extern int icnss_ce_free_irq(struct device *dev, unsigned int ce_id, void *ctx); 1933983bc45SNaman Padhiar extern int icnss_ce_request_irq(struct device *dev, unsigned int ce_id, 1943983bc45SNaman Padhiar irqreturn_t (*handler)(int, void *), 1953983bc45SNaman Padhiar unsigned long flags, const char *name, void *ctx); 1963983bc45SNaman Padhiar extern int icnss_get_ce_id(struct device *dev, int irq); 1973983bc45SNaman Padhiar extern int icnss_set_fw_log_mode(struct device *dev, uint8_t fw_log_mode); 1983983bc45SNaman Padhiar extern int icnss_athdiag_read(struct device *dev, uint32_t offset, 1993983bc45SNaman Padhiar uint32_t mem_type, uint32_t data_len, 2003983bc45SNaman Padhiar uint8_t *output); 2013983bc45SNaman Padhiar extern int icnss_athdiag_write(struct device *dev, uint32_t offset, 2023983bc45SNaman Padhiar uint32_t mem_type, uint32_t data_len, 2033983bc45SNaman Padhiar uint8_t *input); 2043983bc45SNaman Padhiar extern int icnss_get_irq(struct device *dev, int ce_id); 2053983bc45SNaman Padhiar extern int icnss_power_on(struct device *dev); 2063983bc45SNaman Padhiar extern int icnss_power_off(struct device *dev); 2073983bc45SNaman Padhiar extern struct dma_iommu_mapping *icnss_smmu_get_mapping(struct device *dev); 2083983bc45SNaman Padhiar extern struct iommu_domain *icnss_smmu_get_domain(struct device *dev); 2093983bc45SNaman Padhiar extern int icnss_smmu_map(struct device *dev, phys_addr_t paddr, 2103983bc45SNaman Padhiar uint32_t *iova_addr, size_t size); 2113983bc45SNaman Padhiar extern int icnss_smmu_unmap(struct device *dev, 2123983bc45SNaman Padhiar uint32_t iova_addr, size_t size); 2133983bc45SNaman Padhiar extern unsigned int icnss_socinfo_get_serial_number(struct device *dev); 2143983bc45SNaman Padhiar extern bool icnss_is_qmi_disable(struct device *dev); 2153983bc45SNaman Padhiar extern bool icnss_is_fw_ready(void); 2163983bc45SNaman Padhiar extern bool icnss_is_fw_down(void); 2176c9f906aSSurabhi Vishnoi extern bool icnss_is_low_power(void); 2183983bc45SNaman Padhiar extern bool icnss_is_rejuvenate(void); 2193983bc45SNaman Padhiar extern int icnss_trigger_recovery(struct device *dev); 2203983bc45SNaman Padhiar extern void icnss_block_shutdown(bool status); 2213983bc45SNaman Padhiar extern bool icnss_is_pdr(void); 2223983bc45SNaman Padhiar extern int icnss_idle_restart(struct device *dev); 2233983bc45SNaman Padhiar extern int icnss_idle_shutdown(struct device *dev); 2243983bc45SNaman Padhiar extern int icnss_get_user_msi_assignment(struct device *dev, char *user_name, 2253983bc45SNaman Padhiar int *num_vectors, u32 *user_base_data, 2263983bc45SNaman Padhiar u32 *base_vector); 2273983bc45SNaman Padhiar extern int icnss_get_msi_irq(struct device *dev, unsigned int vector); 2283983bc45SNaman Padhiar extern void icnss_get_msi_address(struct device *dev, u32 *msi_addr_low, 2293983bc45SNaman Padhiar u32 *msi_addr_high); 2303983bc45SNaman Padhiar extern int icnss_qmi_send(struct device *dev, int type, void *cmd, 2313983bc45SNaman Padhiar int cmd_len, void *cb_ctx, 2323983bc45SNaman Padhiar int (*cb)(void *ctx, void *event, int event_len)); 2333983bc45SNaman Padhiar extern int icnss_force_wake_request(struct device *dev); 2343983bc45SNaman Padhiar extern int icnss_force_wake_release(struct device *dev); 2353983bc45SNaman Padhiar extern int icnss_is_device_awake(struct device *dev); 2363983bc45SNaman Padhiar extern int icnss_thermal_cdev_register(struct device *dev, 2373983bc45SNaman Padhiar unsigned long max_state, 2383983bc45SNaman Padhiar int tcdev_id); 2393983bc45SNaman Padhiar extern void icnss_thermal_cdev_unregister(struct device *dev, int tcdev_id); 2403983bc45SNaman Padhiar extern int icnss_get_curr_therm_cdev_state(struct device *dev, 2413983bc45SNaman Padhiar unsigned long *thermal_state, 2423983bc45SNaman Padhiar int tcdev_id); 2433983bc45SNaman Padhiar extern int icnss_exit_power_save(struct device *dev); 2443983bc45SNaman Padhiar extern int icnss_prevent_l1(struct device *dev); 2453983bc45SNaman Padhiar extern void icnss_allow_l1(struct device *dev); 2463983bc45SNaman Padhiar extern int icnss_get_mhi_state(struct device *dev); 2473983bc45SNaman Padhiar extern int icnss_is_pci_ep_awake(struct device *dev); 2489c8339eaSSandeep Singh extern unsigned long icnss_get_device_config(void); 2493983bc45SNaman Padhiar #endif /* _ICNSS_WLAN_H_ */ 250