xref: /openbmc/linux/drivers/net/ipa/ipa_qmi_msg.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1530f9216SAlex Elder /* SPDX-License-Identifier: GPL-2.0 */
2530f9216SAlex Elder 
3530f9216SAlex Elder /* Copyright (c) 2018, The Linux Foundation. All rights reserved.
4a4388da5SAlex Elder  * Copyright (C) 2018-2022 Linaro Ltd.
5530f9216SAlex Elder  */
6530f9216SAlex Elder #ifndef _IPA_QMI_MSG_H_
7530f9216SAlex Elder #define _IPA_QMI_MSG_H_
8530f9216SAlex Elder 
9530f9216SAlex Elder /* === Only "ipa_qmi" and "ipa_qmi_msg.c" should include this file === */
10530f9216SAlex Elder 
11530f9216SAlex Elder #include <linux/types.h>
12530f9216SAlex Elder #include <linux/soc/qcom/qmi.h>
13530f9216SAlex Elder 
14530f9216SAlex Elder /* Request/response/indication QMI message ids used for IPA.  Receiving
15530f9216SAlex Elder  * end issues a response for requests; indications require no response.
16530f9216SAlex Elder  */
17530f9216SAlex Elder #define IPA_QMI_INDICATION_REGISTER	0x20	/* modem -> AP request */
18530f9216SAlex Elder #define IPA_QMI_INIT_DRIVER		0x21	/* AP -> modem request */
19530f9216SAlex Elder #define IPA_QMI_INIT_COMPLETE		0x22	/* AP -> modem indication */
20530f9216SAlex Elder #define IPA_QMI_DRIVER_INIT_COMPLETE	0x35	/* modem -> AP request */
21530f9216SAlex Elder 
22530f9216SAlex Elder /* The maximum size required for message types.  These sizes include
23530f9216SAlex Elder  * the message data, along with type (1 byte) and length (2 byte)
24530f9216SAlex Elder  * information for each field.  The qmi_send_*() interfaces require
25530f9216SAlex Elder  * the message size to be provided.
26530f9216SAlex Elder  */
276ec7a9c2SAlex Elder #define IPA_QMI_INDICATION_REGISTER_REQ_SZ	20	/* -> server handle */
28530f9216SAlex Elder #define IPA_QMI_INDICATION_REGISTER_RSP_SZ	7	/* <- server handle */
29530f9216SAlex Elder #define IPA_QMI_INIT_DRIVER_REQ_SZ		162	/* client handle -> */
30530f9216SAlex Elder #define IPA_QMI_INIT_DRIVER_RSP_SZ		25	/* client handle <- */
31530f9216SAlex Elder #define IPA_QMI_INIT_COMPLETE_IND_SZ		7	/* <- server handle */
32530f9216SAlex Elder #define IPA_QMI_DRIVER_INIT_COMPLETE_REQ_SZ	4	/* -> server handle */
33530f9216SAlex Elder #define IPA_QMI_DRIVER_INIT_COMPLETE_RSP_SZ	7	/* <- server handle */
34530f9216SAlex Elder 
35530f9216SAlex Elder /* Maximum size of messages we expect the AP to receive (max of above) */
36530f9216SAlex Elder #define IPA_QMI_SERVER_MAX_RCV_SZ		8
37530f9216SAlex Elder #define IPA_QMI_CLIENT_MAX_RCV_SZ		25
38530f9216SAlex Elder 
39530f9216SAlex Elder /* Request message for the IPA_QMI_INDICATION_REGISTER request */
40530f9216SAlex Elder struct ipa_indication_register_req {
41530f9216SAlex Elder 	u8 master_driver_init_complete_valid;
42530f9216SAlex Elder 	u8 master_driver_init_complete;
43530f9216SAlex Elder 	u8 data_usage_quota_reached_valid;
44530f9216SAlex Elder 	u8 data_usage_quota_reached;
45530f9216SAlex Elder 	u8 ipa_mhi_ready_ind_valid;
46530f9216SAlex Elder 	u8 ipa_mhi_ready_ind;
476ec7a9c2SAlex Elder 	u8 endpoint_desc_ind_valid;
486ec7a9c2SAlex Elder 	u8 endpoint_desc_ind;
496ec7a9c2SAlex Elder 	u8 bw_change_ind_valid;
506ec7a9c2SAlex Elder 	u8 bw_change_ind;
51530f9216SAlex Elder };
52530f9216SAlex Elder 
53530f9216SAlex Elder /* The response to a IPA_QMI_INDICATION_REGISTER request consists only of
54530f9216SAlex Elder  * a standard QMI response.
55530f9216SAlex Elder  */
56530f9216SAlex Elder struct ipa_indication_register_rsp {
57530f9216SAlex Elder 	struct qmi_response_type_v01 rsp;
58530f9216SAlex Elder };
59530f9216SAlex Elder 
60530f9216SAlex Elder /* Request message for the IPA_QMI_DRIVER_INIT_COMPLETE request */
61530f9216SAlex Elder struct ipa_driver_init_complete_req {
62530f9216SAlex Elder 	u8 status;
63530f9216SAlex Elder };
64530f9216SAlex Elder 
65530f9216SAlex Elder /* The response to a IPA_QMI_DRIVER_INIT_COMPLETE request consists only
66530f9216SAlex Elder  * of a standard QMI response.
67530f9216SAlex Elder  */
68530f9216SAlex Elder struct ipa_driver_init_complete_rsp {
69530f9216SAlex Elder 	struct qmi_response_type_v01 rsp;
70530f9216SAlex Elder };
71530f9216SAlex Elder 
72530f9216SAlex Elder /* The message for the IPA_QMI_INIT_COMPLETE_IND indication consists
73530f9216SAlex Elder  * only of a standard QMI response.
74530f9216SAlex Elder  */
75530f9216SAlex Elder struct ipa_init_complete_ind {
76530f9216SAlex Elder 	struct qmi_response_type_v01 status;
77530f9216SAlex Elder };
78530f9216SAlex Elder 
79530f9216SAlex Elder /* The AP tells the modem its platform type.  We assume Android. */
80530f9216SAlex Elder enum ipa_platform_type {
818701cb00SAlex Elder 	IPA_QMI_PLATFORM_TYPE_INVALID		= 0x0,	/* Invalid */
828701cb00SAlex Elder 	IPA_QMI_PLATFORM_TYPE_TN		= 0x1,	/* Data card */
838701cb00SAlex Elder 	IPA_QMI_PLATFORM_TYPE_LE		= 0x2,	/* Data router */
848701cb00SAlex Elder 	IPA_QMI_PLATFORM_TYPE_MSM_ANDROID	= 0x3,	/* Android MSM */
858701cb00SAlex Elder 	IPA_QMI_PLATFORM_TYPE_MSM_WINDOWS	= 0x4,	/* Windows MSM */
868701cb00SAlex Elder 	IPA_QMI_PLATFORM_TYPE_MSM_QNX_V01	= 0x5,	/* QNX MSM */
87530f9216SAlex Elder };
88530f9216SAlex Elder 
89cf412ec3SAlex Elder /* This defines the start and end offset of a range of memory.  The start
90cf412ec3SAlex Elder  * value is a byte offset relative to the start of IPA shared memory.  The
91cf412ec3SAlex Elder  * end value is the last addressable unit *within* the range.  Typically
92cf412ec3SAlex Elder  * the end value is in units of bytes, however it can also be a maximum
93cf412ec3SAlex Elder  * array index value.
94530f9216SAlex Elder  */
95530f9216SAlex Elder struct ipa_mem_bounds {
96530f9216SAlex Elder 	u32 start;
97530f9216SAlex Elder 	u32 end;
98530f9216SAlex Elder };
99530f9216SAlex Elder 
100530f9216SAlex Elder /* This defines the location and size of an array.  The start value
101530f9216SAlex Elder  * is an offset relative to the start of IPA shared memory.  The
102530f9216SAlex Elder  * size of the array is implied by the number of entries (the entry
103530f9216SAlex Elder  * size is assumed to be known).
104530f9216SAlex Elder  */
105530f9216SAlex Elder struct ipa_mem_array {
106530f9216SAlex Elder 	u32 start;
107530f9216SAlex Elder 	u32 count;
108530f9216SAlex Elder };
109530f9216SAlex Elder 
110530f9216SAlex Elder /* This defines the location and size of a range of memory.  The
111530f9216SAlex Elder  * start is an offset relative to the start of IPA shared memory.
112530f9216SAlex Elder  * This differs from the ipa_mem_bounds structure in that the size
113530f9216SAlex Elder  * (in bytes) of the memory region is specified rather than the
114530f9216SAlex Elder  * offset of its last byte.
115530f9216SAlex Elder  */
116530f9216SAlex Elder struct ipa_mem_range {
117530f9216SAlex Elder 	u32 start;
118530f9216SAlex Elder 	u32 size;
119530f9216SAlex Elder };
120530f9216SAlex Elder 
121530f9216SAlex Elder /* The message for the IPA_QMI_INIT_DRIVER request contains information
122530f9216SAlex Elder  * from the AP that affects modem initialization.
123530f9216SAlex Elder  */
124530f9216SAlex Elder struct ipa_init_modem_driver_req {
125530f9216SAlex Elder 	u8			platform_type_valid;
126530f9216SAlex Elder 	u32			platform_type;	/* enum ipa_platform_type */
127530f9216SAlex Elder 
128530f9216SAlex Elder 	/* Modem header table information.  This defines the IPA shared
129530f9216SAlex Elder 	 * memory in which the modem may insert header table entries.
130530f9216SAlex Elder 	 */
131530f9216SAlex Elder 	u8			hdr_tbl_info_valid;
132530f9216SAlex Elder 	struct ipa_mem_bounds	hdr_tbl_info;
133530f9216SAlex Elder 
134cf412ec3SAlex Elder 	/* Routing table information.  These define the location and maximum
135cf412ec3SAlex Elder 	 * *index* (not byte) for the modem portion of non-hashable IPv4 and
136cf412ec3SAlex Elder 	 * IPv6 routing tables.  The start values are byte offsets relative
137cf412ec3SAlex Elder 	 * to the start of IPA shared memory.
138530f9216SAlex Elder 	 */
139530f9216SAlex Elder 	u8			v4_route_tbl_info_valid;
140cf412ec3SAlex Elder 	struct ipa_mem_bounds	v4_route_tbl_info;
141530f9216SAlex Elder 	u8			v6_route_tbl_info_valid;
142cf412ec3SAlex Elder 	struct ipa_mem_bounds	v6_route_tbl_info;
143530f9216SAlex Elder 
144530f9216SAlex Elder 	/* Filter table information.  These define the location of the
145530f9216SAlex Elder 	 * non-hashable IPv4 and IPv6 filter tables.  The start values are
146cf412ec3SAlex Elder 	 * byte offsets relative to the start of IPA shared memory.
147530f9216SAlex Elder 	 */
148530f9216SAlex Elder 	u8			v4_filter_tbl_start_valid;
149530f9216SAlex Elder 	u32			v4_filter_tbl_start;
150530f9216SAlex Elder 	u8			v6_filter_tbl_start_valid;
151530f9216SAlex Elder 	u32			v6_filter_tbl_start;
152530f9216SAlex Elder 
153530f9216SAlex Elder 	/* Modem memory information.  This defines the location and
154530f9216SAlex Elder 	 * size of memory available for the modem to use.
155530f9216SAlex Elder 	 */
156530f9216SAlex Elder 	u8			modem_mem_info_valid;
157530f9216SAlex Elder 	struct ipa_mem_range	modem_mem_info;
158530f9216SAlex Elder 
159530f9216SAlex Elder 	/* This defines the destination endpoint on the AP to which
160530f9216SAlex Elder 	 * the modem driver can send control commands.  Must be less
161530f9216SAlex Elder 	 * than ipa_endpoint_max().
162530f9216SAlex Elder 	 */
163530f9216SAlex Elder 	u8			ctrl_comm_dest_end_pt_valid;
164530f9216SAlex Elder 	u32			ctrl_comm_dest_end_pt;
165530f9216SAlex Elder 
166530f9216SAlex Elder 	/* This defines whether the modem should load the microcontroller
167530f9216SAlex Elder 	 * or not.  It is unnecessary to reload it if the modem is being
168530f9216SAlex Elder 	 * restarted.
169530f9216SAlex Elder 	 *
170530f9216SAlex Elder 	 * NOTE: this field is named "is_ssr_bootup" elsewhere.
171530f9216SAlex Elder 	 */
172530f9216SAlex Elder 	u8			skip_uc_load_valid;
173530f9216SAlex Elder 	u8			skip_uc_load;
174530f9216SAlex Elder 
175530f9216SAlex Elder 	/* Processing context memory information.  This defines the memory in
176530f9216SAlex Elder 	 * which the modem may insert header processing context table entries.
177530f9216SAlex Elder 	 */
178530f9216SAlex Elder 	u8			hdr_proc_ctx_tbl_info_valid;
179530f9216SAlex Elder 	struct ipa_mem_bounds	hdr_proc_ctx_tbl_info;
180530f9216SAlex Elder 
181530f9216SAlex Elder 	/* Compression command memory information.  This defines the memory
182530f9216SAlex Elder 	 * in which the modem may insert compression/decompression commands.
183530f9216SAlex Elder 	 */
184530f9216SAlex Elder 	u8			zip_tbl_info_valid;
185530f9216SAlex Elder 	struct ipa_mem_bounds	zip_tbl_info;
186530f9216SAlex Elder 
187cf412ec3SAlex Elder 	/* Routing table information.  These define the location and maximum
188cf412ec3SAlex Elder 	 * *index* (not byte) for the modem portion of hashable IPv4 and IPv6
189cf412ec3SAlex Elder 	 * routing tables (if supported by hardware).  The start values are
190cf412ec3SAlex Elder 	 * byte offsets relative to the start of IPA shared memory.
191530f9216SAlex Elder 	 */
192530f9216SAlex Elder 	u8			v4_hash_route_tbl_info_valid;
193cf412ec3SAlex Elder 	struct ipa_mem_bounds	v4_hash_route_tbl_info;
194530f9216SAlex Elder 	u8			v6_hash_route_tbl_info_valid;
195cf412ec3SAlex Elder 	struct ipa_mem_bounds	v6_hash_route_tbl_info;
196530f9216SAlex Elder 
197530f9216SAlex Elder 	/* Filter table information.  These define the location and size
198cf412ec3SAlex Elder 	 * of hashable IPv4 and IPv6 filter tables (if supported by hardware).
199cf412ec3SAlex Elder 	 * The start values are byte offsets relative to the start of IPA
200cf412ec3SAlex Elder 	 * shared memory.
201530f9216SAlex Elder 	 */
202530f9216SAlex Elder 	u8			v4_hash_filter_tbl_start_valid;
203530f9216SAlex Elder 	u32			v4_hash_filter_tbl_start;
204530f9216SAlex Elder 	u8			v6_hash_filter_tbl_start_valid;
205530f9216SAlex Elder 	u32			v6_hash_filter_tbl_start;
206530f9216SAlex Elder 
207530f9216SAlex Elder 	/* Statistics information.  These define the locations of the
208530f9216SAlex Elder 	 * first and last statistics sub-regions.  (IPA v4.0 and above)
209530f9216SAlex Elder 	 */
210530f9216SAlex Elder 	u8			hw_stats_quota_base_addr_valid;
211530f9216SAlex Elder 	u32			hw_stats_quota_base_addr;
212530f9216SAlex Elder 	u8			hw_stats_quota_size_valid;
213530f9216SAlex Elder 	u32			hw_stats_quota_size;
214530f9216SAlex Elder 	u8			hw_stats_drop_base_addr_valid;
215530f9216SAlex Elder 	u32			hw_stats_drop_base_addr;
216530f9216SAlex Elder 	u8			hw_stats_drop_size_valid;
217530f9216SAlex Elder 	u32			hw_stats_drop_size;
218530f9216SAlex Elder };
219530f9216SAlex Elder 
220530f9216SAlex Elder /* The response to a IPA_QMI_INIT_DRIVER request begins with a standard
221530f9216SAlex Elder  * QMI response, but contains other information as well.  Currently we
2222540d3c9SSlark Xiao  * simply wait for the INIT_DRIVER transaction to complete and
223530f9216SAlex Elder  * ignore any other data that might be returned.
224530f9216SAlex Elder  */
225530f9216SAlex Elder struct ipa_init_modem_driver_rsp {
226530f9216SAlex Elder 	struct qmi_response_type_v01	rsp;
227530f9216SAlex Elder 
228530f9216SAlex Elder 	/* This defines the destination endpoint on the modem to which
229530f9216SAlex Elder 	 * the AP driver can send control commands.  Must be less than
230530f9216SAlex Elder 	 * ipa_endpoint_max().
231530f9216SAlex Elder 	 */
232530f9216SAlex Elder 	u8				ctrl_comm_dest_end_pt_valid;
233530f9216SAlex Elder 	u32				ctrl_comm_dest_end_pt;
234530f9216SAlex Elder 
235530f9216SAlex Elder 	/* This defines the default endpoint.  The AP driver is not
236530f9216SAlex Elder 	 * required to configure the hardware with this value.  Must
237530f9216SAlex Elder 	 * be less than ipa_endpoint_max().
238530f9216SAlex Elder 	 */
239530f9216SAlex Elder 	u8				default_end_pt_valid;
240530f9216SAlex Elder 	u32				default_end_pt;
241530f9216SAlex Elder 
242530f9216SAlex Elder 	/* This defines whether a second handshake is required to complete
243530f9216SAlex Elder 	 * initialization.
244530f9216SAlex Elder 	 */
245530f9216SAlex Elder 	u8				modem_driver_init_pending_valid;
246530f9216SAlex Elder 	u8				modem_driver_init_pending;
247530f9216SAlex Elder };
248530f9216SAlex Elder 
249530f9216SAlex Elder /* Message structure definitions defined in "ipa_qmi_msg.c" */
250*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_indication_register_req_ei[];
251*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_indication_register_rsp_ei[];
252*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_driver_init_complete_req_ei[];
253*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_driver_init_complete_rsp_ei[];
254*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_init_complete_ind_ei[];
255*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_mem_bounds_ei[];
256*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_mem_array_ei[];
257*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_mem_range_ei[];
258*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_init_modem_driver_req_ei[];
259*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_init_modem_driver_rsp_ei[];
260530f9216SAlex Elder 
261530f9216SAlex Elder #endif /* !_IPA_QMI_MSG_H_ */
262