1/* SPDX-License-Identifier: GPL-2.0 */
2
3/* Copyright (c) 2018, The Linux Foundation. All rights reserved.
4 * Copyright (C) 2018-2022 Linaro Ltd.
5 */
6#ifndef _IPA_QMI_MSG_H_
7#define _IPA_QMI_MSG_H_
8
9/* === Only "ipa_qmi" and "ipa_qmi_msg.c" should include this file === */
10
11#include <linux/types.h>
12#include <linux/soc/qcom/qmi.h>
13
14/* Request/response/indication QMI message ids used for IPA. Receiving
15 * end issues a response for requests; indications require no response.
16 */
17#define IPA_QMI_INDICATION_REGISTER 0x20 /* modem -> AP request */
18#define IPA_QMI_INIT_DRIVER 0x21 /* AP -> modem request */
19#define IPA_QMI_INIT_COMPLETE 0x22 /* AP -> modem indication */
20#define IPA_QMI_DRIVER_INIT_COMPLETE 0x35 /* modem -> AP request */
21
22/* The maximum size required for message types. These sizes include
23 * the message data, along with type (1 byte) and length (2 byte)
24 * information for each field. The qmi_send_*() interfaces require
25 * the message size to be provided.
26 */
27#define IPA_QMI_INDICATION_REGISTER_REQ_SZ 20 /* -> server handle */
28#define IPA_QMI_INDICATION_REGISTER_RSP_SZ 7 /* <- server handle */
29#define IPA_QMI_INIT_DRIVER_REQ_SZ 162 /* client handle -> */
30#define IPA_QMI_INIT_DRIVER_RSP_SZ 25 /* client handle <- */
31#define IPA_QMI_INIT_COMPLETE_IND_SZ 7 /* <- server handle */
32#define IPA_QMI_DRIVER_INIT_COMPLETE_REQ_SZ 4 /* -> server handle */
33#define IPA_QMI_DRIVER_INIT_COMPLETE_RSP_SZ 7 /* <- server handle */
34
35/* Maximum size of messages we expect the AP to receive (max of above) */
36#define IPA_QMI_SERVER_MAX_RCV_SZ 8
37#define IPA_QMI_CLIENT_MAX_RCV_SZ 25
38
39/* Request message for the IPA_QMI_INDICATION_REGISTER request */
40struct ipa_indication_register_req {
41 u8 master_driver_init_complete_valid;
42 u8 master_driver_init_complete;
43 u8 data_usage_quota_reached_valid;
44 u8 data_usage_quota_reached;
45 u8 ipa_mhi_ready_ind_valid;
46 u8 ipa_mhi_ready_ind;
47 u8 endpoint_desc_ind_valid;
48 u8 endpoint_desc_ind;
49 u8 bw_change_ind_valid;
50 u8 bw_change_ind;
51};
52
53/* The response to a IPA_QMI_INDICATION_REGISTER request consists only of
54 * a standard QMI response.
55 */
56struct ipa_indication_register_rsp {
57 struct qmi_response_type_v01 rsp;
58};
59
60/* Request message for the IPA_QMI_DRIVER_INIT_COMPLETE request */
61struct ipa_driver_init_complete_req {
62 u8 status;
63};
64
65/* The response to a IPA_QMI_DRIVER_INIT_COMPLETE request consists only
66 * of a standard QMI response.
67 */
68struct ipa_driver_init_complete_rsp {
69 struct qmi_response_type_v01 rsp;
70};
71
72/* The message for the IPA_QMI_INIT_COMPLETE_IND indication consists
73 * only of a standard QMI response.
74 */
75struct ipa_init_complete_ind {
76 struct qmi_response_type_v01 status;
77};
78
79/* The AP tells the modem its platform type. We assume Android. */
80enum ipa_platform_type {
81 IPA_QMI_PLATFORM_TYPE_INVALID = 0x0, /* Invalid */
82 IPA_QMI_PLATFORM_TYPE_TN = 0x1, /* Data card */
83 IPA_QMI_PLATFORM_TYPE_LE = 0x2, /* Data router */
84 IPA_QMI_PLATFORM_TYPE_MSM_ANDROID = 0x3, /* Android MSM */
85 IPA_QMI_PLATFORM_TYPE_MSM_WINDOWS = 0x4, /* Windows MSM */
86 IPA_QMI_PLATFORM_TYPE_MSM_QNX_V01 = 0x5, /* QNX MSM */
87};
88
89/* This defines the start and end offset of a range of memory. The start
90 * value is a byte offset relative to the start of IPA shared memory. The
91 * end value is the last addressable unit *within* the range. Typically
92 * the end value is in units of bytes, however it can also be a maximum
93 * array index value.
94 */
95struct ipa_mem_bounds {
96 u32 start;
97 u32 end;
98};
99
100/* This defines the location and size of an array. The start value
101 * is an offset relative to the start of IPA shared memory. The
102 * size of the array is implied by the number of entries (the entry
103 * size is assumed to be known).
104 */
105struct ipa_mem_array {
106 u32 start;
107 u32 count;
108};
109
110/* This defines the location and size of a range of memory. The
111 * start is an offset relative to the start of IPA shared memory.
112 * This differs from the ipa_mem_bounds structure in that the size
113 * (in bytes) of the memory region is specified rather than the
114 * offset of its last byte.
115 */
116struct ipa_mem_range {
117 u32 start;
118 u32 size;
119};
120
121/* The message for the IPA_QMI_INIT_DRIVER request contains information
122 * from the AP that affects modem initialization.
123 */
124struct ipa_init_modem_driver_req {
125 u8 platform_type_valid;
126 u32 platform_type; /* enum ipa_platform_type */
127
128 /* Modem header table information. This defines the IPA shared
129 * memory in which the modem may insert header table entries.
130 */
131 u8 hdr_tbl_info_valid;
132 struct ipa_mem_bounds hdr_tbl_info;
133
134 /* Routing table information. These define the location and maximum
135 * *index* (not byte) for the modem portion of non-hashable IPv4 and
136 * IPv6 routing tables. The start values are byte offsets relative
137 * to the start of IPA shared memory.
138 */
139 u8 v4_route_tbl_info_valid;
140 struct ipa_mem_bounds v4_route_tbl_info;
141 u8 v6_route_tbl_info_valid;
142 struct ipa_mem_bounds v6_route_tbl_info;
143
144 /* Filter table information. These define the location of the
145 * non-hashable IPv4 and IPv6 filter tables. The start values are
146 * byte offsets relative to the start of IPA shared memory.
147 */
148 u8 v4_filter_tbl_start_valid;
149 u32 v4_filter_tbl_start;
150 u8 v6_filter_tbl_start_valid;
151 u32 v6_filter_tbl_start;
152
153 /* Modem memory information. This defines the location and
154 * size of memory available for the modem to use.
155 */
156 u8 modem_mem_info_valid;
157 struct ipa_mem_range modem_mem_info;
158
159 /* This defines the destination endpoint on the AP to which
160 * the modem driver can send control commands. Must be less
161 * than ipa_endpoint_max().
162 */
163 u8 ctrl_comm_dest_end_pt_valid;
164 u32 ctrl_comm_dest_end_pt;
165
166 /* This defines whether the modem should load the microcontroller
167 * or not. It is unnecessary to reload it if the modem is being
168 * restarted.
169 *
170 * NOTE: this field is named "is_ssr_bootup" elsewhere.
171 */
172 u8 skip_uc_load_valid;
173 u8 skip_uc_load;
174
175 /* Processing context memory information. This defines the memory in
176 * which the modem may insert header processing context table entries.
177 */
178 u8 hdr_proc_ctx_tbl_info_valid;
179 struct ipa_mem_bounds hdr_proc_ctx_tbl_info;
180
181 /* Compression command memory information. This defines the memory
182 * in which the modem may insert compression/decompression commands.
183 */
184 u8 zip_tbl_info_valid;
185 struct ipa_mem_bounds zip_tbl_info;
186
187 /* Routing table information. These define the location and maximum
188 * *index* (not byte) for the modem portion of hashable IPv4 and IPv6
189 * routing tables (if supported by hardware). The start values are
190 * byte offsets relative to the start of IPA shared memory.
191 */
192 u8 v4_hash_route_tbl_info_valid;
193 struct ipa_mem_bounds v4_hash_route_tbl_info;
194 u8 v6_hash_route_tbl_info_valid;
195 struct ipa_mem_bounds v6_hash_route_tbl_info;
196
197 /* Filter table information. These define the location and size
198 * of hashable IPv4 and IPv6 filter tables (if supported by hardware).
199 * The start values are byte offsets relative to the start of IPA
200 * shared memory.
201 */
202 u8 v4_hash_filter_tbl_start_valid;
203 u32 v4_hash_filter_tbl_start;
204 u8 v6_hash_filter_tbl_start_valid;
205 u32 v6_hash_filter_tbl_start;
206
207 /* Statistics information. These define the locations of the
208 * first and last statistics sub-regions. (IPA v4.0 and above)
209 */
210 u8 hw_stats_quota_base_addr_valid;
211 u32 hw_stats_quota_base_addr;
212 u8 hw_stats_quota_size_valid;
213 u32 hw_stats_quota_size;
214 u8 hw_stats_drop_base_addr_valid;
215 u32 hw_stats_drop_base_addr;
216 u8 hw_stats_drop_size_valid;
217 u32 hw_stats_drop_size;
218};
219
220/* The response to a IPA_QMI_INIT_DRIVER request begins with a standard
221 * QMI response, but contains other information as well. Currently we
222 * simply wait for the INIT_DRIVER transaction to complete and
223 * ignore any other data that might be returned.
224 */
225struct ipa_init_modem_driver_rsp {
226 struct qmi_response_type_v01 rsp;
227
228 /* This defines the destination endpoint on the modem to which
229 * the AP driver can send control commands. Must be less than
230 * ipa_endpoint_max().
231 */
232 u8 ctrl_comm_dest_end_pt_valid;
233 u32 ctrl_comm_dest_end_pt;
234
235 /* This defines the default endpoint. The AP driver is not
236 * required to configure the hardware with this value. Must
237 * be less than ipa_endpoint_max().
238 */
239 u8 default_end_pt_valid;
240 u32 default_end_pt;
241
242 /* This defines whether a second handshake is required to complete
243 * initialization.
244 */
245 u8 modem_driver_init_pending_valid;
246 u8 modem_driver_init_pending;
247};
248
249/* Message structure definitions defined in "ipa_qmi_msg.c" */
250extern const struct qmi_elem_info ipa_indication_register_req_ei[];
251extern const struct qmi_elem_info ipa_indication_register_rsp_ei[];
252extern const struct qmi_elem_info ipa_driver_init_complete_req_ei[];
253extern const struct qmi_elem_info ipa_driver_init_complete_rsp_ei[];
254extern const struct qmi_elem_info ipa_init_complete_ind_ei[];
255extern const struct qmi_elem_info ipa_mem_bounds_ei[];
256extern const struct qmi_elem_info ipa_mem_array_ei[];
257extern const struct qmi_elem_info ipa_mem_range_ei[];
258extern const struct qmi_elem_info ipa_init_modem_driver_req_ei[];
259extern const struct qmi_elem_info ipa_init_modem_driver_rsp_ei[];
260
261#endif /* !_IPA_QMI_MSG_H_ */
262

source code of linux/drivers/net/ipa/ipa_qmi_msg.h