xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/ath/ath11k/qmi.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause-Clear */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef ATH11K_QMI_H
7*4882a593Smuzhiyun #define ATH11K_QMI_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/mutex.h>
10*4882a593Smuzhiyun #include <linux/soc/qcom/qmi.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define ATH11K_HOST_VERSION_STRING		"WIN"
13*4882a593Smuzhiyun #define ATH11K_QMI_WLANFW_TIMEOUT_MS		5000
14*4882a593Smuzhiyun #define ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE	64
15*4882a593Smuzhiyun #define ATH11K_QMI_BDF_MAX_SIZE			(256 * 1024)
16*4882a593Smuzhiyun #define ATH11K_QMI_CALDATA_OFFSET		(128 * 1024)
17*4882a593Smuzhiyun #define ATH11K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01	128
18*4882a593Smuzhiyun #define ATH11K_QMI_WLFW_SERVICE_ID_V01		0x45
19*4882a593Smuzhiyun #define ATH11K_QMI_WLFW_SERVICE_VERS_V01	0x01
20*4882a593Smuzhiyun #define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01	0x02
21*4882a593Smuzhiyun #define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_QCA6390	0x01
22*4882a593Smuzhiyun #define ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_IPQ8074	0x02
23*4882a593Smuzhiyun #define ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01	32
24*4882a593Smuzhiyun #define ATH11K_QMI_RESP_LEN_MAX			8192
25*4882a593Smuzhiyun #define ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01	32
26*4882a593Smuzhiyun #define ATH11K_QMI_CALDB_SIZE			0x480000
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define QMI_WLFW_REQUEST_MEM_IND_V01		0x0035
29*4882a593Smuzhiyun #define QMI_WLFW_FW_MEM_READY_IND_V01		0x0037
30*4882a593Smuzhiyun #define QMI_WLFW_COLD_BOOT_CAL_DONE_IND_V01	0x0021
31*4882a593Smuzhiyun #define QMI_WLFW_FW_READY_IND_V01		0x0038
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define QMI_WLANFW_MAX_DATA_SIZE_V01		6144
34*4882a593Smuzhiyun #define ATH11K_FIRMWARE_MODE_OFF		4
35*4882a593Smuzhiyun #define ATH11K_QMI_TARGET_MEM_MODE_DEFAULT	0
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun struct ath11k_base;
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun enum ath11k_qmi_file_type {
40*4882a593Smuzhiyun 	ATH11K_QMI_FILE_TYPE_BDF_GOLDEN,
41*4882a593Smuzhiyun 	ATH11K_QMI_FILE_TYPE_CALDATA,
42*4882a593Smuzhiyun 	ATH11K_QMI_MAX_FILE_TYPE,
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun enum ath11k_qmi_bdf_type {
46*4882a593Smuzhiyun 	ATH11K_QMI_BDF_TYPE_BIN			= 0,
47*4882a593Smuzhiyun 	ATH11K_QMI_BDF_TYPE_ELF			= 1,
48*4882a593Smuzhiyun };
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun enum ath11k_qmi_event_type {
51*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_SERVER_ARRIVE,
52*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_SERVER_EXIT,
53*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_REQUEST_MEM,
54*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_FW_MEM_READY,
55*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_FW_READY,
56*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_COLD_BOOT_CAL_START,
57*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_COLD_BOOT_CAL_DONE,
58*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_REGISTER_DRIVER,
59*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_UNREGISTER_DRIVER,
60*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_RECOVERY,
61*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_FORCE_FW_ASSERT,
62*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_POWER_UP,
63*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_POWER_DOWN,
64*4882a593Smuzhiyun 	ATH11K_QMI_EVENT_MAX,
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun struct ath11k_qmi_driver_event {
68*4882a593Smuzhiyun 	struct list_head list;
69*4882a593Smuzhiyun 	enum ath11k_qmi_event_type type;
70*4882a593Smuzhiyun 	void *data;
71*4882a593Smuzhiyun };
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun struct ath11k_qmi_ce_cfg {
74*4882a593Smuzhiyun 	const struct ce_pipe_config *tgt_ce;
75*4882a593Smuzhiyun 	int tgt_ce_len;
76*4882a593Smuzhiyun 	const struct service_to_pipe *svc_to_ce_map;
77*4882a593Smuzhiyun 	int svc_to_ce_map_len;
78*4882a593Smuzhiyun 	const u8 *shadow_reg;
79*4882a593Smuzhiyun 	int shadow_reg_len;
80*4882a593Smuzhiyun 	u32 *shadow_reg_v2;
81*4882a593Smuzhiyun 	int shadow_reg_v2_len;
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun struct ath11k_qmi_event_msg {
85*4882a593Smuzhiyun 	struct list_head list;
86*4882a593Smuzhiyun 	enum ath11k_qmi_event_type type;
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun struct target_mem_chunk {
90*4882a593Smuzhiyun 	u32 size;
91*4882a593Smuzhiyun 	u32 type;
92*4882a593Smuzhiyun 	dma_addr_t paddr;
93*4882a593Smuzhiyun 	u32 *vaddr;
94*4882a593Smuzhiyun };
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun struct target_info {
97*4882a593Smuzhiyun 	u32 chip_id;
98*4882a593Smuzhiyun 	u32 chip_family;
99*4882a593Smuzhiyun 	u32 board_id;
100*4882a593Smuzhiyun 	u32 soc_id;
101*4882a593Smuzhiyun 	u32 fw_version;
102*4882a593Smuzhiyun 	char fw_build_timestamp[ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1];
103*4882a593Smuzhiyun 	char fw_build_id[ATH11K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1];
104*4882a593Smuzhiyun };
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun struct m3_mem_region {
107*4882a593Smuzhiyun 	u32 size;
108*4882a593Smuzhiyun 	dma_addr_t paddr;
109*4882a593Smuzhiyun 	void *vaddr;
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun struct ath11k_qmi {
113*4882a593Smuzhiyun 	struct ath11k_base *ab;
114*4882a593Smuzhiyun 	struct qmi_handle handle;
115*4882a593Smuzhiyun 	struct sockaddr_qrtr sq;
116*4882a593Smuzhiyun 	struct work_struct event_work;
117*4882a593Smuzhiyun 	struct workqueue_struct *event_wq;
118*4882a593Smuzhiyun 	struct list_head event_list;
119*4882a593Smuzhiyun 	spinlock_t event_lock; /* spinlock for qmi event list */
120*4882a593Smuzhiyun 	struct ath11k_qmi_ce_cfg ce_cfg;
121*4882a593Smuzhiyun 	struct target_mem_chunk target_mem[ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01];
122*4882a593Smuzhiyun 	u32 mem_seg_count;
123*4882a593Smuzhiyun 	u32 target_mem_mode;
124*4882a593Smuzhiyun 	bool target_mem_delayed;
125*4882a593Smuzhiyun 	u8 cal_done;
126*4882a593Smuzhiyun 	struct target_info target;
127*4882a593Smuzhiyun 	struct m3_mem_region m3_mem;
128*4882a593Smuzhiyun 	unsigned int service_ins_id;
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun #define QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN		189
132*4882a593Smuzhiyun #define QMI_WLANFW_HOST_CAP_REQ_V01			0x0034
133*4882a593Smuzhiyun #define QMI_WLANFW_HOST_CAP_RESP_MSG_V01_MAX_LEN	7
134*4882a593Smuzhiyun #define QMI_WLFW_HOST_CAP_RESP_V01			0x0034
135*4882a593Smuzhiyun #define QMI_WLFW_MAX_NUM_GPIO_V01			32
136*4882a593Smuzhiyun #define QMI_IPQ8074_FW_MEM_MODE				0xFF
137*4882a593Smuzhiyun #define HOST_DDR_REGION_TYPE				0x1
138*4882a593Smuzhiyun #define BDF_MEM_REGION_TYPE				0x2
139*4882a593Smuzhiyun #define CALDB_MEM_REGION_TYPE				0x4
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun struct qmi_wlanfw_host_cap_req_msg_v01 {
142*4882a593Smuzhiyun 	u8 num_clients_valid;
143*4882a593Smuzhiyun 	u32 num_clients;
144*4882a593Smuzhiyun 	u8 wake_msi_valid;
145*4882a593Smuzhiyun 	u32 wake_msi;
146*4882a593Smuzhiyun 	u8 gpios_valid;
147*4882a593Smuzhiyun 	u32 gpios_len;
148*4882a593Smuzhiyun 	u32 gpios[QMI_WLFW_MAX_NUM_GPIO_V01];
149*4882a593Smuzhiyun 	u8 nm_modem_valid;
150*4882a593Smuzhiyun 	u8 nm_modem;
151*4882a593Smuzhiyun 	u8 bdf_support_valid;
152*4882a593Smuzhiyun 	u8 bdf_support;
153*4882a593Smuzhiyun 	u8 bdf_cache_support_valid;
154*4882a593Smuzhiyun 	u8 bdf_cache_support;
155*4882a593Smuzhiyun 	u8 m3_support_valid;
156*4882a593Smuzhiyun 	u8 m3_support;
157*4882a593Smuzhiyun 	u8 m3_cache_support_valid;
158*4882a593Smuzhiyun 	u8 m3_cache_support;
159*4882a593Smuzhiyun 	u8 cal_filesys_support_valid;
160*4882a593Smuzhiyun 	u8 cal_filesys_support;
161*4882a593Smuzhiyun 	u8 cal_cache_support_valid;
162*4882a593Smuzhiyun 	u8 cal_cache_support;
163*4882a593Smuzhiyun 	u8 cal_done_valid;
164*4882a593Smuzhiyun 	u8 cal_done;
165*4882a593Smuzhiyun 	u8 mem_bucket_valid;
166*4882a593Smuzhiyun 	u32 mem_bucket;
167*4882a593Smuzhiyun 	u8 mem_cfg_mode_valid;
168*4882a593Smuzhiyun 	u8 mem_cfg_mode;
169*4882a593Smuzhiyun };
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun struct qmi_wlanfw_host_cap_resp_msg_v01 {
172*4882a593Smuzhiyun 	struct qmi_response_type_v01 resp;
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #define QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN		54
176*4882a593Smuzhiyun #define QMI_WLANFW_IND_REGISTER_REQ_V01				0x0020
177*4882a593Smuzhiyun #define QMI_WLANFW_IND_REGISTER_RESP_MSG_V01_MAX_LEN		18
178*4882a593Smuzhiyun #define QMI_WLANFW_IND_REGISTER_RESP_V01			0x0020
179*4882a593Smuzhiyun #define QMI_WLANFW_CLIENT_ID					0x4b4e454c
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun struct qmi_wlanfw_ind_register_req_msg_v01 {
182*4882a593Smuzhiyun 	u8 fw_ready_enable_valid;
183*4882a593Smuzhiyun 	u8 fw_ready_enable;
184*4882a593Smuzhiyun 	u8 initiate_cal_download_enable_valid;
185*4882a593Smuzhiyun 	u8 initiate_cal_download_enable;
186*4882a593Smuzhiyun 	u8 initiate_cal_update_enable_valid;
187*4882a593Smuzhiyun 	u8 initiate_cal_update_enable;
188*4882a593Smuzhiyun 	u8 msa_ready_enable_valid;
189*4882a593Smuzhiyun 	u8 msa_ready_enable;
190*4882a593Smuzhiyun 	u8 pin_connect_result_enable_valid;
191*4882a593Smuzhiyun 	u8 pin_connect_result_enable;
192*4882a593Smuzhiyun 	u8 client_id_valid;
193*4882a593Smuzhiyun 	u32 client_id;
194*4882a593Smuzhiyun 	u8 request_mem_enable_valid;
195*4882a593Smuzhiyun 	u8 request_mem_enable;
196*4882a593Smuzhiyun 	u8 fw_mem_ready_enable_valid;
197*4882a593Smuzhiyun 	u8 fw_mem_ready_enable;
198*4882a593Smuzhiyun 	u8 fw_init_done_enable_valid;
199*4882a593Smuzhiyun 	u8 fw_init_done_enable;
200*4882a593Smuzhiyun 	u8 rejuvenate_enable_valid;
201*4882a593Smuzhiyun 	u32 rejuvenate_enable;
202*4882a593Smuzhiyun 	u8 xo_cal_enable_valid;
203*4882a593Smuzhiyun 	u8 xo_cal_enable;
204*4882a593Smuzhiyun 	u8 cal_done_enable_valid;
205*4882a593Smuzhiyun 	u8 cal_done_enable;
206*4882a593Smuzhiyun };
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun struct qmi_wlanfw_ind_register_resp_msg_v01 {
209*4882a593Smuzhiyun 	struct qmi_response_type_v01 resp;
210*4882a593Smuzhiyun 	u8 fw_status_valid;
211*4882a593Smuzhiyun 	u64 fw_status;
212*4882a593Smuzhiyun };
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun #define QMI_WLANFW_REQUEST_MEM_IND_MSG_V01_MAX_LEN	1124
215*4882a593Smuzhiyun #define QMI_WLANFW_RESPOND_MEM_REQ_MSG_V01_MAX_LEN	548
216*4882a593Smuzhiyun #define QMI_WLANFW_RESPOND_MEM_RESP_MSG_V01_MAX_LEN	7
217*4882a593Smuzhiyun #define QMI_WLANFW_REQUEST_MEM_IND_V01			0x0035
218*4882a593Smuzhiyun #define QMI_WLANFW_RESPOND_MEM_REQ_V01			0x0036
219*4882a593Smuzhiyun #define QMI_WLANFW_RESPOND_MEM_RESP_V01			0x0036
220*4882a593Smuzhiyun #define QMI_WLANFW_MAX_NUM_MEM_CFG_V01			2
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun struct qmi_wlanfw_mem_cfg_s_v01 {
223*4882a593Smuzhiyun 	u64 offset;
224*4882a593Smuzhiyun 	u32 size;
225*4882a593Smuzhiyun 	u8 secure_flag;
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun enum qmi_wlanfw_mem_type_enum_v01 {
229*4882a593Smuzhiyun 	WLANFW_MEM_TYPE_ENUM_MIN_VAL_V01 = INT_MIN,
230*4882a593Smuzhiyun 	QMI_WLANFW_MEM_TYPE_MSA_V01 = 0,
231*4882a593Smuzhiyun 	QMI_WLANFW_MEM_TYPE_DDR_V01 = 1,
232*4882a593Smuzhiyun 	QMI_WLANFW_MEM_BDF_V01 = 2,
233*4882a593Smuzhiyun 	QMI_WLANFW_MEM_M3_V01 = 3,
234*4882a593Smuzhiyun 	QMI_WLANFW_MEM_CAL_V01 = 4,
235*4882a593Smuzhiyun 	QMI_WLANFW_MEM_DPD_V01 = 5,
236*4882a593Smuzhiyun 	WLANFW_MEM_TYPE_ENUM_MAX_VAL_V01 = INT_MAX,
237*4882a593Smuzhiyun };
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun struct qmi_wlanfw_mem_seg_s_v01 {
240*4882a593Smuzhiyun 	u32 size;
241*4882a593Smuzhiyun 	enum qmi_wlanfw_mem_type_enum_v01 type;
242*4882a593Smuzhiyun 	u32 mem_cfg_len;
243*4882a593Smuzhiyun 	struct qmi_wlanfw_mem_cfg_s_v01 mem_cfg[QMI_WLANFW_MAX_NUM_MEM_CFG_V01];
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun struct qmi_wlanfw_request_mem_ind_msg_v01 {
247*4882a593Smuzhiyun 	u32 mem_seg_len;
248*4882a593Smuzhiyun 	struct qmi_wlanfw_mem_seg_s_v01 mem_seg[ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01];
249*4882a593Smuzhiyun };
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun struct qmi_wlanfw_mem_seg_resp_s_v01 {
252*4882a593Smuzhiyun 	u64 addr;
253*4882a593Smuzhiyun 	u32 size;
254*4882a593Smuzhiyun 	enum qmi_wlanfw_mem_type_enum_v01 type;
255*4882a593Smuzhiyun 	u8 restore;
256*4882a593Smuzhiyun };
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun struct qmi_wlanfw_respond_mem_req_msg_v01 {
259*4882a593Smuzhiyun 	u32 mem_seg_len;
260*4882a593Smuzhiyun 	struct qmi_wlanfw_mem_seg_resp_s_v01 mem_seg[ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01];
261*4882a593Smuzhiyun };
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun struct qmi_wlanfw_respond_mem_resp_msg_v01 {
264*4882a593Smuzhiyun 	struct qmi_response_type_v01 resp;
265*4882a593Smuzhiyun };
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun struct qmi_wlanfw_fw_mem_ready_ind_msg_v01 {
268*4882a593Smuzhiyun 	char placeholder;
269*4882a593Smuzhiyun };
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun struct qmi_wlanfw_fw_ready_ind_msg_v01 {
272*4882a593Smuzhiyun 	char placeholder;
273*4882a593Smuzhiyun };
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun struct qmi_wlanfw_fw_cold_cal_done_ind_msg_v01 {
276*4882a593Smuzhiyun 	char placeholder;
277*4882a593Smuzhiyun };
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun #define QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN	0
280*4882a593Smuzhiyun #define QMI_WLANFW_CAP_RESP_MSG_V01_MAX_LEN	207
281*4882a593Smuzhiyun #define QMI_WLANFW_CAP_REQ_V01			0x0024
282*4882a593Smuzhiyun #define QMI_WLANFW_CAP_RESP_V01			0x0024
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun enum qmi_wlanfw_pipedir_enum_v01 {
285*4882a593Smuzhiyun 	QMI_WLFW_PIPEDIR_NONE_V01 = 0,
286*4882a593Smuzhiyun 	QMI_WLFW_PIPEDIR_IN_V01 = 1,
287*4882a593Smuzhiyun 	QMI_WLFW_PIPEDIR_OUT_V01 = 2,
288*4882a593Smuzhiyun 	QMI_WLFW_PIPEDIR_INOUT_V01 = 3,
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01 {
292*4882a593Smuzhiyun 	__le32 pipe_num;
293*4882a593Smuzhiyun 	__le32 pipe_dir;
294*4882a593Smuzhiyun 	__le32 nentries;
295*4882a593Smuzhiyun 	__le32 nbytes_max;
296*4882a593Smuzhiyun 	__le32 flags;
297*4882a593Smuzhiyun };
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01 {
300*4882a593Smuzhiyun 	__le32 service_id;
301*4882a593Smuzhiyun 	__le32 pipe_dir;
302*4882a593Smuzhiyun 	__le32 pipe_num;
303*4882a593Smuzhiyun };
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun struct qmi_wlanfw_shadow_reg_cfg_s_v01 {
306*4882a593Smuzhiyun 	u16 id;
307*4882a593Smuzhiyun 	u16 offset;
308*4882a593Smuzhiyun };
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun struct qmi_wlanfw_shadow_reg_v2_cfg_s_v01 {
311*4882a593Smuzhiyun 	u32 addr;
312*4882a593Smuzhiyun };
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun struct qmi_wlanfw_memory_region_info_s_v01 {
315*4882a593Smuzhiyun 	u64 region_addr;
316*4882a593Smuzhiyun 	u32 size;
317*4882a593Smuzhiyun 	u8 secure_flag;
318*4882a593Smuzhiyun };
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun struct qmi_wlanfw_rf_chip_info_s_v01 {
321*4882a593Smuzhiyun 	u32 chip_id;
322*4882a593Smuzhiyun 	u32 chip_family;
323*4882a593Smuzhiyun };
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun struct qmi_wlanfw_rf_board_info_s_v01 {
326*4882a593Smuzhiyun 	u32 board_id;
327*4882a593Smuzhiyun };
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun struct qmi_wlanfw_soc_info_s_v01 {
330*4882a593Smuzhiyun 	u32 soc_id;
331*4882a593Smuzhiyun };
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun struct qmi_wlanfw_fw_version_info_s_v01 {
334*4882a593Smuzhiyun 	u32 fw_version;
335*4882a593Smuzhiyun 	char fw_build_timestamp[ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1];
336*4882a593Smuzhiyun };
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun enum qmi_wlanfw_cal_temp_id_enum_v01 {
339*4882a593Smuzhiyun 	QMI_WLANFW_CAL_TEMP_IDX_0_V01 = 0,
340*4882a593Smuzhiyun 	QMI_WLANFW_CAL_TEMP_IDX_1_V01 = 1,
341*4882a593Smuzhiyun 	QMI_WLANFW_CAL_TEMP_IDX_2_V01 = 2,
342*4882a593Smuzhiyun 	QMI_WLANFW_CAL_TEMP_IDX_3_V01 = 3,
343*4882a593Smuzhiyun 	QMI_WLANFW_CAL_TEMP_IDX_4_V01 = 4,
344*4882a593Smuzhiyun 	QMI_WLANFW_CAL_TEMP_ID_MAX_V01 = 0xFF,
345*4882a593Smuzhiyun };
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun struct qmi_wlanfw_cap_resp_msg_v01 {
348*4882a593Smuzhiyun 	struct qmi_response_type_v01 resp;
349*4882a593Smuzhiyun 	u8 chip_info_valid;
350*4882a593Smuzhiyun 	struct qmi_wlanfw_rf_chip_info_s_v01 chip_info;
351*4882a593Smuzhiyun 	u8 board_info_valid;
352*4882a593Smuzhiyun 	struct qmi_wlanfw_rf_board_info_s_v01 board_info;
353*4882a593Smuzhiyun 	u8 soc_info_valid;
354*4882a593Smuzhiyun 	struct qmi_wlanfw_soc_info_s_v01 soc_info;
355*4882a593Smuzhiyun 	u8 fw_version_info_valid;
356*4882a593Smuzhiyun 	struct qmi_wlanfw_fw_version_info_s_v01 fw_version_info;
357*4882a593Smuzhiyun 	u8 fw_build_id_valid;
358*4882a593Smuzhiyun 	char fw_build_id[ATH11K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1];
359*4882a593Smuzhiyun 	u8 num_macs_valid;
360*4882a593Smuzhiyun 	u8 num_macs;
361*4882a593Smuzhiyun };
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun struct qmi_wlanfw_cap_req_msg_v01 {
364*4882a593Smuzhiyun 	char placeholder;
365*4882a593Smuzhiyun };
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun #define QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN	6182
368*4882a593Smuzhiyun #define QMI_WLANFW_BDF_DOWNLOAD_RESP_MSG_V01_MAX_LEN	7
369*4882a593Smuzhiyun #define QMI_WLANFW_BDF_DOWNLOAD_RESP_V01		0x0025
370*4882a593Smuzhiyun #define QMI_WLANFW_BDF_DOWNLOAD_REQ_V01			0x0025
371*4882a593Smuzhiyun /* TODO: Need to check with MCL and FW team that data can be pointer and
372*4882a593Smuzhiyun  * can be last element in structure
373*4882a593Smuzhiyun  */
374*4882a593Smuzhiyun struct qmi_wlanfw_bdf_download_req_msg_v01 {
375*4882a593Smuzhiyun 	u8 valid;
376*4882a593Smuzhiyun 	u8 file_id_valid;
377*4882a593Smuzhiyun 	enum qmi_wlanfw_cal_temp_id_enum_v01 file_id;
378*4882a593Smuzhiyun 	u8 total_size_valid;
379*4882a593Smuzhiyun 	u32 total_size;
380*4882a593Smuzhiyun 	u8 seg_id_valid;
381*4882a593Smuzhiyun 	u32 seg_id;
382*4882a593Smuzhiyun 	u8 data_valid;
383*4882a593Smuzhiyun 	u32 data_len;
384*4882a593Smuzhiyun 	u8 data[QMI_WLANFW_MAX_DATA_SIZE_V01];
385*4882a593Smuzhiyun 	u8 end_valid;
386*4882a593Smuzhiyun 	u8 end;
387*4882a593Smuzhiyun 	u8 bdf_type_valid;
388*4882a593Smuzhiyun 	u8 bdf_type;
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun };
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun struct qmi_wlanfw_bdf_download_resp_msg_v01 {
393*4882a593Smuzhiyun 	struct qmi_response_type_v01 resp;
394*4882a593Smuzhiyun };
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun #define QMI_WLANFW_M3_INFO_REQ_MSG_V01_MAX_MSG_LEN	18
397*4882a593Smuzhiyun #define QMI_WLANFW_M3_INFO_RESP_MSG_V01_MAX_MSG_LEN	7
398*4882a593Smuzhiyun #define QMI_WLANFW_M3_INFO_RESP_V01		0x003C
399*4882a593Smuzhiyun #define QMI_WLANFW_M3_INFO_REQ_V01		0x003C
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun struct qmi_wlanfw_m3_info_req_msg_v01 {
402*4882a593Smuzhiyun 	u64 addr;
403*4882a593Smuzhiyun 	u32 size;
404*4882a593Smuzhiyun };
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun struct qmi_wlanfw_m3_info_resp_msg_v01 {
407*4882a593Smuzhiyun 	struct qmi_response_type_v01 resp;
408*4882a593Smuzhiyun };
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun #define QMI_WLANFW_WLAN_MODE_REQ_MSG_V01_MAX_LEN	11
411*4882a593Smuzhiyun #define QMI_WLANFW_WLAN_MODE_RESP_MSG_V01_MAX_LEN	7
412*4882a593Smuzhiyun #define QMI_WLANFW_WLAN_CFG_REQ_MSG_V01_MAX_LEN		803
413*4882a593Smuzhiyun #define QMI_WLANFW_WLAN_CFG_RESP_MSG_V01_MAX_LEN	7
414*4882a593Smuzhiyun #define QMI_WLANFW_WLAN_MODE_REQ_V01			0x0022
415*4882a593Smuzhiyun #define QMI_WLANFW_WLAN_MODE_RESP_V01			0x0022
416*4882a593Smuzhiyun #define QMI_WLANFW_WLAN_CFG_REQ_V01			0x0023
417*4882a593Smuzhiyun #define QMI_WLANFW_WLAN_CFG_RESP_V01			0x0023
418*4882a593Smuzhiyun #define QMI_WLANFW_MAX_STR_LEN_V01			16
419*4882a593Smuzhiyun #define QMI_WLANFW_MAX_NUM_CE_V01			12
420*4882a593Smuzhiyun #define QMI_WLANFW_MAX_NUM_SVC_V01			24
421*4882a593Smuzhiyun #define QMI_WLANFW_MAX_NUM_SHADOW_REG_V01		24
422*4882a593Smuzhiyun #define QMI_WLANFW_MAX_NUM_SHADOW_REG_V2_V01		36
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun struct qmi_wlanfw_wlan_mode_req_msg_v01 {
425*4882a593Smuzhiyun 	u32 mode;
426*4882a593Smuzhiyun 	u8 hw_debug_valid;
427*4882a593Smuzhiyun 	u8 hw_debug;
428*4882a593Smuzhiyun };
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun struct qmi_wlanfw_wlan_mode_resp_msg_v01 {
431*4882a593Smuzhiyun 	struct qmi_response_type_v01 resp;
432*4882a593Smuzhiyun };
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun struct qmi_wlanfw_wlan_cfg_req_msg_v01 {
435*4882a593Smuzhiyun 	u8 host_version_valid;
436*4882a593Smuzhiyun 	char host_version[QMI_WLANFW_MAX_STR_LEN_V01 + 1];
437*4882a593Smuzhiyun 	u8  tgt_cfg_valid;
438*4882a593Smuzhiyun 	u32  tgt_cfg_len;
439*4882a593Smuzhiyun 	struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01
440*4882a593Smuzhiyun 			tgt_cfg[QMI_WLANFW_MAX_NUM_CE_V01];
441*4882a593Smuzhiyun 	u8  svc_cfg_valid;
442*4882a593Smuzhiyun 	u32 svc_cfg_len;
443*4882a593Smuzhiyun 	struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01
444*4882a593Smuzhiyun 			svc_cfg[QMI_WLANFW_MAX_NUM_SVC_V01];
445*4882a593Smuzhiyun 	u8 shadow_reg_valid;
446*4882a593Smuzhiyun 	u32 shadow_reg_len;
447*4882a593Smuzhiyun 	struct qmi_wlanfw_shadow_reg_cfg_s_v01
448*4882a593Smuzhiyun 		shadow_reg[QMI_WLANFW_MAX_NUM_SHADOW_REG_V01];
449*4882a593Smuzhiyun 	u8 shadow_reg_v2_valid;
450*4882a593Smuzhiyun 	u32 shadow_reg_v2_len;
451*4882a593Smuzhiyun 	struct qmi_wlanfw_shadow_reg_v2_cfg_s_v01
452*4882a593Smuzhiyun 		shadow_reg_v2[QMI_WLANFW_MAX_NUM_SHADOW_REG_V2_V01];
453*4882a593Smuzhiyun };
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun struct qmi_wlanfw_wlan_cfg_resp_msg_v01 {
456*4882a593Smuzhiyun 	struct qmi_response_type_v01 resp;
457*4882a593Smuzhiyun };
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun int ath11k_qmi_firmware_start(struct ath11k_base *ab,
460*4882a593Smuzhiyun 			      u32 mode);
461*4882a593Smuzhiyun void ath11k_qmi_firmware_stop(struct ath11k_base *ab);
462*4882a593Smuzhiyun void ath11k_qmi_event_work(struct work_struct *work);
463*4882a593Smuzhiyun void ath11k_qmi_msg_recv_work(struct work_struct *work);
464*4882a593Smuzhiyun void ath11k_qmi_deinit_service(struct ath11k_base *ab);
465*4882a593Smuzhiyun int ath11k_qmi_init_service(struct ath11k_base *ab);
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun #endif
468