xref: /wlan-dirver/platform/inc/icnss2.h (revision f6e67cd9934930656cf0a3555b48f65df7f614e8)
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