blob: 4c10e04fa31a45d84336129bbf2fb73cab8ce8d1 [file] [log] [blame]
Mohammed Javid22b54442019-07-01 03:43:21 +05301/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
Amir Levy9659e592016-10-27 18:08:27 +03002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#ifndef _IPA_H_
14#define _IPA_H_
15
16#include <linux/msm_ipa.h>
17#include <linux/skbuff.h>
18#include <linux/types.h>
19#include <linux/msm-sps.h>
20#include <linux/if_ether.h>
21#include "linux/msm_gsi.h"
22
23#define IPA_APPS_MAX_BW_IN_MBPS 700
24/**
25 * enum ipa_transport_type
26 * transport type: either GSI or SPS
27 */
28enum ipa_transport_type {
29 IPA_TRANSPORT_TYPE_SPS,
30 IPA_TRANSPORT_TYPE_GSI
31};
32
33/**
34 * enum ipa_nat_en_type - NAT setting type in IPA end-point
35 */
36enum ipa_nat_en_type {
37 IPA_BYPASS_NAT,
38 IPA_SRC_NAT,
39 IPA_DST_NAT,
40};
41
42/**
Amir Levy479cfdd2017-10-26 12:23:14 +030043 * enum ipa_ipv6ct_en_type - IPv6CT setting type in IPA end-point
44 */
Amir Levydc65f4c2017-07-06 09:49:50 +030045enum ipa_ipv6ct_en_type {
46 IPA_BYPASS_IPV6CT,
47 IPA_ENABLE_IPV6CT,
48};
49
50/**
Amir Levy9659e592016-10-27 18:08:27 +030051 * enum ipa_mode_type - mode setting type in IPA end-point
52 * @BASIC: basic mode
53 * @ENABLE_FRAMING_HDLC: not currently supported
54 * @ENABLE_DEFRAMING_HDLC: not currently supported
55 * @DMA: all data arriving IPA will not go through IPA logic blocks, this
56 * allows IPA to work as DMA for specific pipes.
57 */
58enum ipa_mode_type {
59 IPA_BASIC,
60 IPA_ENABLE_FRAMING_HDLC,
61 IPA_ENABLE_DEFRAMING_HDLC,
62 IPA_DMA,
63};
64
65/**
66 * enum ipa_aggr_en_type - aggregation setting type in IPA
67 * end-point
68 */
69enum ipa_aggr_en_type {
70 IPA_BYPASS_AGGR,
71 IPA_ENABLE_AGGR,
72 IPA_ENABLE_DEAGGR,
73};
74
75/**
76 * enum ipa_aggr_type - type of aggregation in IPA end-point
77 */
78enum ipa_aggr_type {
79 IPA_MBIM_16 = 0,
80 IPA_HDLC = 1,
81 IPA_TLP = 2,
82 IPA_RNDIS = 3,
83 IPA_GENERIC = 4,
84 IPA_QCMAP = 6,
85};
86
87/**
88 * enum ipa_aggr_mode - global aggregation mode
89 */
90enum ipa_aggr_mode {
91 IPA_MBIM_AGGR,
92 IPA_QCNCM_AGGR,
93};
94
95/**
96 * enum ipa_dp_evt_type - type of event client callback is
97 * invoked for on data path
98 * @IPA_RECEIVE: data is struct sk_buff
99 * @IPA_WRITE_DONE: data is struct sk_buff
100 */
101enum ipa_dp_evt_type {
102 IPA_RECEIVE,
103 IPA_WRITE_DONE,
104 IPA_CLIENT_START_POLL,
105 IPA_CLIENT_COMP_NAPI,
106};
107
108/**
Skylar Changfcf36c22016-10-04 14:15:25 -0700109 * enum hdr_total_len_or_pad_type - type of value held by TOTAL_LEN_OR_PAD
Amir Levy9659e592016-10-27 18:08:27 +0300110 * field in header configuration register.
111 * @IPA_HDR_PAD: field is used as padding length
112 * @IPA_HDR_TOTAL_LEN: field is used as total length
113 */
114enum hdr_total_len_or_pad_type {
115 IPA_HDR_PAD = 0,
116 IPA_HDR_TOTAL_LEN = 1,
117};
118
119/**
120 * struct ipa_ep_cfg_nat - NAT configuration in IPA end-point
121 * @nat_en: This defines the default NAT mode for the pipe: in case of
122 * filter miss - the default NAT mode defines the NATing operation
123 * on the packet. Valid for Input Pipes only (IPA consumer)
124 */
125struct ipa_ep_cfg_nat {
126 enum ipa_nat_en_type nat_en;
127};
128
129/**
Amir Levydc65f4c2017-07-06 09:49:50 +0300130 * struct ipa_ep_cfg_conn_track - IPv6 Connection tracking configuration in
131 * IPA end-point
132 * @conn_track_en: Defines speculative conn_track action, means if specific
Amir Levy479cfdd2017-10-26 12:23:14 +0300133 * pipe needs to have UL/DL IPv6 Connection Tracking or Bypass
Amir Levydc65f4c2017-07-06 09:49:50 +0300134 * IPv6 Connection Tracking. 0: Bypass IPv6 Connection Tracking
135 * 1: IPv6 UL/DL Connection Tracking.
136 * Valid for Input Pipes only (IPA consumer)
137 */
138struct ipa_ep_cfg_conn_track {
139 enum ipa_ipv6ct_en_type conn_track_en;
140};
141
142/**
Amir Levy9659e592016-10-27 18:08:27 +0300143 * struct ipa_ep_cfg_hdr - header configuration in IPA end-point
144 *
145 * @hdr_len:Header length in bytes to be added/removed. Assuming
146 * header len is constant per endpoint. Valid for
147 * both Input and Output Pipes
148 * @hdr_ofst_metadata_valid: 0: Metadata_Ofst value is invalid, i.e., no
149 * metadata within header.
150 * 1: Metadata_Ofst value is valid, i.e., metadata
151 * within header is in offset Metadata_Ofst Valid
152 * for Input Pipes only (IPA Consumer) (for output
153 * pipes, metadata already set within the header)
154 * @hdr_ofst_metadata: Offset within header in which metadata resides
155 * Size of metadata - 4bytes
156 * Example - Stream ID/SSID/mux ID.
157 * Valid for Input Pipes only (IPA Consumer) (for output
158 * pipes, metadata already set within the header)
159 * @hdr_additional_const_len: Defines the constant length that should be added
160 * to the payload length in order for IPA to update
161 * correctly the length field within the header
162 * (valid only in case Hdr_Ofst_Pkt_Size_Valid=1)
163 * Valid for Output Pipes (IPA Producer)
164 * @hdr_ofst_pkt_size_valid: 0: Hdr_Ofst_Pkt_Size value is invalid, i.e., no
165 * length field within the inserted header
166 * 1: Hdr_Ofst_Pkt_Size value is valid, i.e., a
167 * packet length field resides within the header
168 * Valid for Output Pipes (IPA Producer)
169 * @hdr_ofst_pkt_size: Offset within header in which packet size reside. Upon
170 * Header Insertion, IPA will update this field within the
171 * header with the packet length . Assumption is that
172 * header length field size is constant and is 2Bytes
173 * Valid for Output Pipes (IPA Producer)
174 * @hdr_a5_mux: Determines whether A5 Mux header should be added to the packet.
175 * This bit is valid only when Hdr_En=01(Header Insertion)
176 * SW should set this bit for IPA-to-A5 pipes.
177 * 0: Do not insert A5 Mux Header
178 * 1: Insert A5 Mux Header
179 * Valid for Output Pipes (IPA Producer)
180 * @hdr_remove_additional: bool switch, remove more of the header
181 * based on the aggregation configuration (register
182 * HDR_LEN_INC_DEAGG_HDR)
183 * @hdr_metadata_reg_valid: bool switch, metadata from
184 * register INIT_HDR_METADATA_n is valid.
185 * (relevant only for IPA Consumer pipes)
186 */
187struct ipa_ep_cfg_hdr {
188 u32 hdr_len;
189 u32 hdr_ofst_metadata_valid;
190 u32 hdr_ofst_metadata;
191 u32 hdr_additional_const_len;
192 u32 hdr_ofst_pkt_size_valid;
193 u32 hdr_ofst_pkt_size;
194 u32 hdr_a5_mux;
195 u32 hdr_remove_additional;
196 u32 hdr_metadata_reg_valid;
197};
198
199/**
200 * struct ipa_ep_cfg_hdr_ext - extended header configuration in IPA end-point
201 * @hdr_pad_to_alignment: Pad packet to specified alignment
202 * (2^pad to alignment value), i.e. value of 3 means pad to 2^3 = 8 bytes
203 * alignment. Alignment is to 0,2 up to 32 bytes (IPAv2 does not support 64
204 * byte alignment). Valid for Output Pipes only (IPA Producer).
205 * @hdr_total_len_or_pad_offset: Offset to length field containing either
206 * total length or pad length, per hdr_total_len_or_pad config
207 * @hdr_payload_len_inc_padding: 0-IPA_ENDP_INIT_HDR_n's
208 * HDR_OFST_PKT_SIZE does
209 * not includes padding bytes size, payload_len = packet length,
210 * 1-IPA_ENDP_INIT_HDR_n's HDR_OFST_PKT_SIZE includes
211 * padding bytes size, payload_len = packet length + padding
212 * @hdr_total_len_or_pad: field is used as PAD length ot as Total length
213 * (header + packet + padding)
214 * @hdr_total_len_or_pad_valid: 0-Ignore TOTAL_LEN_OR_PAD field, 1-Process
215 * TOTAL_LEN_OR_PAD field
216 * @hdr_little_endian: 0-Big Endian, 1-Little Endian
217 */
218struct ipa_ep_cfg_hdr_ext {
219 u32 hdr_pad_to_alignment;
220 u32 hdr_total_len_or_pad_offset;
221 bool hdr_payload_len_inc_padding;
222 enum hdr_total_len_or_pad_type hdr_total_len_or_pad;
223 bool hdr_total_len_or_pad_valid;
224 bool hdr_little_endian;
225};
226
227/**
228 * struct ipa_ep_cfg_mode - mode configuration in IPA end-point
229 * @mode: Valid for Input Pipes only (IPA Consumer)
230 * @dst: This parameter specifies the output pipe to which the packets
231 * will be routed to.
232 * This parameter is valid for Mode=DMA and not valid for
233 * Mode=Basic
234 * Valid for Input Pipes only (IPA Consumer)
235 */
236struct ipa_ep_cfg_mode {
237 enum ipa_mode_type mode;
238 enum ipa_client_type dst;
239};
240
241/**
242 * struct ipa_ep_cfg_aggr - aggregation configuration in IPA end-point
243 *
244 * @aggr_en: Valid for both Input and Output Pipes
245 * @aggr: aggregation type (Valid for both Input and Output Pipes)
246 * @aggr_byte_limit: Limit of aggregated packet size in KB (<=32KB) When set
247 * to 0, there is no size limitation on the aggregation.
248 * When both, Aggr_Byte_Limit and Aggr_Time_Limit are set
249 * to 0, there is no aggregation, every packet is sent
250 * independently according to the aggregation structure
251 * Valid for Output Pipes only (IPA Producer )
252 * @aggr_time_limit: Timer to close aggregated packet (<=32ms) When set to 0,
253 * there is no time limitation on the aggregation. When
254 * both, Aggr_Byte_Limit and Aggr_Time_Limit are set to 0,
255 * there is no aggregation, every packet is sent
256 * independently according to the aggregation structure
257 * Valid for Output Pipes only (IPA Producer)
258 * @aggr_pkt_limit: Defines if EOF close aggregation or not. if set to false
259 * HW closes aggregation (sends EOT) only based on its
260 * aggregation config (byte/time limit, etc). if set to
261 * true EOF closes aggregation in addition to HW based
262 * aggregation closure. Valid for Output Pipes only (IPA
263 * Producer). EOF affects only Pipes configured for
264 * generic aggregation.
265 * @aggr_hard_byte_limit_en: If set to 1, byte-limit aggregation for this
266 * pipe will apply a hard-limit behavior which will not
267 * allow frames to be closed with more than byte-limit
268 * bytes. If set to 0, previous byte-limit behavior
269 * will apply - frames close once a packet causes the
270 * accumulated byte-count to cross the byte-limit
271 * threshold (closed frame will contain that packet).
272 * @aggr_sw_eof_active: 0: EOF does not close aggregation. HW closes aggregation
273 * (sends EOT) only based on its aggregation config
274 * (byte/time limit, etc).
275 * 1: EOF closes aggregation in addition to HW based
276 * aggregation closure. Valid for Output Pipes only (IPA
277 * Producer). EOF affects only Pipes configured for generic
278 * aggregation.
279 */
280struct ipa_ep_cfg_aggr {
281 enum ipa_aggr_en_type aggr_en;
282 enum ipa_aggr_type aggr;
283 u32 aggr_byte_limit;
284 u32 aggr_time_limit;
285 u32 aggr_pkt_limit;
286 u32 aggr_hard_byte_limit_en;
287 bool aggr_sw_eof_active;
288};
289
290/**
291 * struct ipa_ep_cfg_route - route configuration in IPA end-point
292 * @rt_tbl_hdl: Defines the default routing table index to be used in case there
293 * is no filter rule matching, valid for Input Pipes only (IPA
294 * Consumer). Clients should set this to 0 which will cause default
295 * v4 and v6 routes setup internally by IPA driver to be used for
296 * this end-point
297 */
298struct ipa_ep_cfg_route {
299 u32 rt_tbl_hdl;
300};
301
302/**
303 * struct ipa_ep_cfg_holb - head of line blocking configuration in IPA end-point
304 * @en: enable(1 => ok to drop pkt)/disable(0 => never drop pkt)
305 * @tmr_val: duration in units of 128 IPA clk clock cyles [0,511], 1 clk=1.28us
306 * IPAv2.5 support 32 bit HOLB timeout value, previous versions
307 * supports 16 bit
308 */
309struct ipa_ep_cfg_holb {
310 u16 en;
311 u32 tmr_val;
312};
313
314/**
315 * struct ipa_ep_cfg_deaggr - deaggregation configuration in IPA end-point
316 * @deaggr_hdr_len: Deaggregation Header length in bytes. Valid only for Input
317 * Pipes, which are configured for 'Generic' deaggregation.
318 * @packet_offset_valid: - 0: PACKET_OFFSET is not used, 1: PACKET_OFFSET is
319 * used.
320 * @packet_offset_location: Location of packet offset field, which specifies
321 * the offset to the packet from the start of the packet offset field.
322 * @max_packet_len: DEAGGR Max Packet Length in Bytes. A Packet with higher
323 * size wil be treated as an error. 0 - Packet Length is not Bound,
324 * IPA should not check for a Max Packet Length.
325 */
326struct ipa_ep_cfg_deaggr {
327 u32 deaggr_hdr_len;
328 bool packet_offset_valid;
329 u32 packet_offset_location;
330 u32 max_packet_len;
331};
332
333/**
334 * enum ipa_cs_offload - checksum offload setting
335 */
336enum ipa_cs_offload {
337 IPA_DISABLE_CS_OFFLOAD,
338 IPA_ENABLE_CS_OFFLOAD_UL,
339 IPA_ENABLE_CS_OFFLOAD_DL,
340 IPA_CS_RSVD
341};
342
343/**
344 * struct ipa_ep_cfg_cfg - IPA ENDP_INIT Configuration register
345 * @frag_offload_en: - 0 - IP packet fragment handling is disabled. IP packet
346 * fragments should be sent to SW. SW is responsible for
347 * configuring filter rules, and IP packet filter exception should be
348 * used to send all fragments to SW. 1 - IP packet fragment
349 * handling is enabled. IPA checks for fragments and uses frag
350 * rules table for processing fragments. Valid only for Input Pipes
351 * (IPA Consumer)
352 * @cs_offload_en: Checksum offload enable: 00: Disable checksum offload, 01:
353 * Enable checksum calculation offload (UL) - For output pipe
354 * (IPA producer) specifies that checksum trailer is to be added.
355 * For input pipe (IPA consumer) specifies presence of checksum
356 * header and IPA checksum calculation accordingly. 10: Enable
357 * checksum calculation offload (DL) - For output pipe (IPA
358 * producer) specifies that checksum trailer is to be added. For
359 * input pipe (IPA consumer) specifies IPA checksum calculation.
360 * 11: Reserved
361 * @cs_metadata_hdr_offset: Offset in Words (4 bytes) within header in which
362 * checksum meta info header (4 bytes) starts (UL). Values are 0-15, which
363 * mean 0 - 60 byte checksum header offset. Valid for input
364 * pipes only (IPA consumer)
365 * @gen_qmb_master_sel: Select bit for ENDP GEN-QMB master. This is used to
366 * separate DDR & PCIe transactions in-order to limit them as
367 * a group (using MAX_WRITES/READS limiation). Valid for input and
368 * output pipes (IPA consumer+producer)
369 */
370struct ipa_ep_cfg_cfg {
371 bool frag_offload_en;
372 enum ipa_cs_offload cs_offload_en;
373 u8 cs_metadata_hdr_offset;
374 u8 gen_qmb_master_sel;
375};
376
377/**
378 * struct ipa_ep_cfg_metadata_mask - Endpoint initialization hdr metadata mask
379 * @metadata_mask: Mask specifying which metadata bits to write to
380 * IPA_ENDP_INIT_HDR_n.s HDR_OFST_METADATA. Only
381 * masked metadata bits (set to 1) will be written. Valid for Output
382 * Pipes only (IPA Producer)
383 */
384struct ipa_ep_cfg_metadata_mask {
385 u32 metadata_mask;
386};
387
388/**
389 * struct ipa_ep_cfg_metadata - Meta Data configuration in IPA end-point
390 * @md: This defines the meta data from tx data descriptor
391 * @qmap_id: qmap id
392 */
393struct ipa_ep_cfg_metadata {
394 u32 qmap_id;
395};
396
397/**
398 * struct ipa_ep_cfg_seq - HPS/DPS sequencer type configuration in IPA end-point
399 * @set_dynamic: 0 - HPS/DPS seq type is configured statically,
400 * 1 - HPS/DPS seq type is set to seq_type
401 * @seq_type: HPS/DPS sequencer type configuration
402 */
403struct ipa_ep_cfg_seq {
404 bool set_dynamic;
405 int seq_type;
406};
407
408/**
409 * struct ipa_ep_cfg - configuration of IPA end-point
Amir Levy479cfdd2017-10-26 12:23:14 +0300410 * @nat: NAT parameters
411 * @conn_track: IPv6CT parameters
Amir Levy9659e592016-10-27 18:08:27 +0300412 * @hdr: Header parameters
413 * @hdr_ext: Extended header parameters
414 * @mode: Mode parameters
415 * @aggr: Aggregation parameters
416 * @deaggr: Deaggregation params
417 * @route: Routing parameters
418 * @cfg: Configuration register data
419 * @metadata_mask: Hdr metadata mask
420 * @meta: Meta Data
421 * @seq: HPS/DPS sequencers configuration
422 */
423struct ipa_ep_cfg {
424 struct ipa_ep_cfg_nat nat;
Amir Levydc65f4c2017-07-06 09:49:50 +0300425 struct ipa_ep_cfg_conn_track conn_track;
Amir Levy9659e592016-10-27 18:08:27 +0300426 struct ipa_ep_cfg_hdr hdr;
427 struct ipa_ep_cfg_hdr_ext hdr_ext;
428 struct ipa_ep_cfg_mode mode;
429 struct ipa_ep_cfg_aggr aggr;
430 struct ipa_ep_cfg_deaggr deaggr;
431 struct ipa_ep_cfg_route route;
432 struct ipa_ep_cfg_cfg cfg;
433 struct ipa_ep_cfg_metadata_mask metadata_mask;
434 struct ipa_ep_cfg_metadata meta;
435 struct ipa_ep_cfg_seq seq;
436};
437
438/**
439 * struct ipa_ep_cfg_ctrl - Control configuration in IPA end-point
440 * @ipa_ep_suspend: 0 - ENDP is enabled, 1 - ENDP is suspended (disabled).
441 * Valid for PROD Endpoints
442 * @ipa_ep_delay: 0 - ENDP is free-running, 1 - ENDP is delayed.
443 * SW controls the data flow of an endpoint usind this bit.
444 * Valid for CONS Endpoints
445 */
446struct ipa_ep_cfg_ctrl {
447 bool ipa_ep_suspend;
448 bool ipa_ep_delay;
449};
450
451/**
452 * x should be in bytes
453 */
454#define IPA_NUM_OF_FIFO_DESC(x) (x/sizeof(struct sps_iovec))
455typedef void (*ipa_notify_cb)(void *priv, enum ipa_dp_evt_type evt,
456 unsigned long data);
457
458/**
Skylar Changfcf36c22016-10-04 14:15:25 -0700459 * enum ipa_wdi_meter_evt_type - type of event client callback is
460 * for AP+STA mode metering
461 * @IPA_GET_WDI_SAP_STATS: get IPA_stats betwen SAP and STA -
462 * use ipa_get_wdi_sap_stats structure
463 * @IPA_SET_WIFI_QUOTA: set quota limit on STA -
464 * use ipa_set_wifi_quota structure
465 */
466enum ipa_wdi_meter_evt_type {
467 IPA_GET_WDI_SAP_STATS,
468 IPA_SET_WIFI_QUOTA,
469};
470
471struct ipa_get_wdi_sap_stats {
472 /* indicate to reset stats after query */
473 uint8_t reset_stats;
474 /* indicate valid stats from wlan-fw */
475 uint8_t stats_valid;
476 /* Tx: SAP->STA */
477 uint64_t ipv4_tx_packets;
478 uint64_t ipv4_tx_bytes;
479 /* Rx: STA->SAP */
480 uint64_t ipv4_rx_packets;
481 uint64_t ipv4_rx_bytes;
482 uint64_t ipv6_tx_packets;
483 uint64_t ipv6_tx_bytes;
484 uint64_t ipv6_rx_packets;
485 uint64_t ipv6_rx_bytes;
486};
487
488/**
489 * struct ipa_set_wifi_quota - structure used for
490 * IPA_SET_WIFI_QUOTA.
491 *
492 * @quota_bytes: Quota (in bytes) for the STA interface.
493 * @set_quota: Indicate whether to set the quota (use 1) or
494 * unset the quota.
495 *
496 */
497struct ipa_set_wifi_quota {
498 uint64_t quota_bytes;
499 uint8_t set_quota;
500 /* indicate valid quota set from wlan-fw */
501 uint8_t set_valid;
502};
503
504typedef void (*ipa_wdi_meter_notifier_cb)(enum ipa_wdi_meter_evt_type evt,
505 void *data);
506
507/**
Amir Levy9659e592016-10-27 18:08:27 +0300508 * struct ipa_connect_params - low-level client connect input parameters. Either
509 * client allocates the data and desc FIFO and specifies that in data+desc OR
510 * specifies sizes and pipe_mem pref and IPA does the allocation.
511 *
512 * @ipa_ep_cfg: IPA EP configuration
513 * @client: type of "client"
514 * @client_bam_hdl: client SPS handle
515 * @client_ep_idx: client PER EP index
516 * @priv: callback cookie
517 * @notify: callback
518 * priv - callback cookie evt - type of event data - data relevant
519 * to event. May not be valid. See event_type enum for valid
520 * cases.
521 * @desc_fifo_sz: size of desc FIFO
522 * @data_fifo_sz: size of data FIFO
523 * @pipe_mem_preferred: if true, try to alloc the FIFOs in pipe mem, fallback
524 * to sys mem if pipe mem alloc fails
525 * @desc: desc FIFO meta-data when client has allocated it
526 * @data: data FIFO meta-data when client has allocated it
527 * @skip_ep_cfg: boolean field that determines if EP should be configured
528 * by IPA driver
529 * @keep_ipa_awake: when true, IPA will not be clock gated
530 */
531struct ipa_connect_params {
532 struct ipa_ep_cfg ipa_ep_cfg;
533 enum ipa_client_type client;
534 unsigned long client_bam_hdl;
535 u32 client_ep_idx;
536 void *priv;
537 ipa_notify_cb notify;
538 u32 desc_fifo_sz;
539 u32 data_fifo_sz;
540 bool pipe_mem_preferred;
541 struct sps_mem_buffer desc;
542 struct sps_mem_buffer data;
543 bool skip_ep_cfg;
544 bool keep_ipa_awake;
545};
546
547/**
548 * struct ipa_sps_params - SPS related output parameters resulting from
549 * low/high level client connect
550 * @ipa_bam_hdl: IPA SPS handle
551 * @ipa_ep_idx: IPA PER EP index
552 * @desc: desc FIFO meta-data
553 * @data: data FIFO meta-data
554 */
555struct ipa_sps_params {
556 unsigned long ipa_bam_hdl;
557 u32 ipa_ep_idx;
558 struct sps_mem_buffer desc;
559 struct sps_mem_buffer data;
560};
561
562/**
563 * struct ipa_tx_intf - interface tx properties
564 * @num_props: number of tx properties
565 * @prop: the tx properties array
566 */
567struct ipa_tx_intf {
568 u32 num_props;
569 struct ipa_ioc_tx_intf_prop *prop;
570};
571
572/**
573 * struct ipa_rx_intf - interface rx properties
574 * @num_props: number of rx properties
575 * @prop: the rx properties array
576 */
577struct ipa_rx_intf {
578 u32 num_props;
579 struct ipa_ioc_rx_intf_prop *prop;
580};
581
582/**
583 * struct ipa_ext_intf - interface ext properties
584 * @excp_pipe_valid: is next field valid?
585 * @excp_pipe: exception packets should be routed to this pipe
586 * @num_props: number of ext properties
587 * @prop: the ext properties array
588 */
589struct ipa_ext_intf {
590 bool excp_pipe_valid;
591 enum ipa_client_type excp_pipe;
592 u32 num_props;
593 struct ipa_ioc_ext_intf_prop *prop;
594};
595
596/**
597 * struct ipa_sys_connect_params - information needed to setup an IPA end-point
598 * in system-BAM mode
599 * @ipa_ep_cfg: IPA EP configuration
600 * @client: the type of client who "owns" the EP
601 * @desc_fifo_sz: size of desc FIFO. This number is used to allocate the desc
602 * fifo for BAM. For GSI, this size is used by IPA driver as a
603 * baseline to calculate the GSI ring size in the following way:
604 * For PROD pipes, GSI ring is 4 * desc_fifo_sz.
605 For PROD pipes, GSI ring is 2 * desc_fifo_sz.
606 * @priv: callback cookie
607 * @notify: callback
608 * priv - callback cookie
609 * evt - type of event
610 * data - data relevant to event. May not be valid. See event_type
611 * enum for valid cases.
612 * @skip_ep_cfg: boolean field that determines if EP should be configured
613 * by IPA driver
614 * @keep_ipa_awake: when true, IPA will not be clock gated
615 * @napi_enabled: when true, IPA call client callback to start polling
616 */
617struct ipa_sys_connect_params {
618 struct ipa_ep_cfg ipa_ep_cfg;
619 enum ipa_client_type client;
620 u32 desc_fifo_sz;
621 void *priv;
622 ipa_notify_cb notify;
623 bool skip_ep_cfg;
624 bool keep_ipa_awake;
625 bool napi_enabled;
Gidon Studinski3021a6f2016-11-10 12:48:48 +0200626 bool recycle_enabled;
Amir Levy9659e592016-10-27 18:08:27 +0300627};
628
629/**
630 * struct ipa_tx_meta - meta-data for the TX packet
631 * @dma_address: dma mapped address of TX packet
632 * @dma_address_valid: is above field valid?
633 */
634struct ipa_tx_meta {
635 u8 pkt_init_dst_ep;
636 bool pkt_init_dst_ep_valid;
637 bool pkt_init_dst_ep_remote;
638 dma_addr_t dma_address;
639 bool dma_address_valid;
640};
641
642/**
643 * typedef ipa_msg_free_fn - callback function
644 * @param buff - [in] the message payload to free
645 * @param len - [in] size of message payload
646 * @param type - [in] the message type
647 *
648 * Message callback registered by kernel client with IPA driver to
649 * free message payload after IPA driver processing is complete
650 *
651 * No return value
652 */
653typedef void (*ipa_msg_free_fn)(void *buff, u32 len, u32 type);
654
655/**
656 * typedef ipa_msg_pull_fn - callback function
657 * @param buff - [in] where to copy message payload
658 * @param len - [in] size of buffer to copy payload into
659 * @param type - [in] the message type
660 *
661 * Message callback registered by kernel client with IPA driver for
662 * IPA driver to pull messages from the kernel client upon demand from
663 * user-space
664 *
665 * Returns how many bytes were copied into the buffer.
666 */
667typedef int (*ipa_msg_pull_fn)(void *buff, u32 len, u32 type);
668
669/**
670 * enum ipa_voltage_level - IPA Voltage levels
671 */
672enum ipa_voltage_level {
673 IPA_VOLTAGE_UNSPECIFIED,
Skylar Chang448d8b82017-08-08 17:30:32 -0700674 IPA_VOLTAGE_SVS2 = IPA_VOLTAGE_UNSPECIFIED,
675 IPA_VOLTAGE_SVS,
Amir Levy9659e592016-10-27 18:08:27 +0300676 IPA_VOLTAGE_NOMINAL,
677 IPA_VOLTAGE_TURBO,
678 IPA_VOLTAGE_MAX,
679};
680
681/**
682 * enum ipa_rm_event - IPA RM events
683 *
684 * Indicate the resource state change
685 */
686enum ipa_rm_event {
687 IPA_RM_RESOURCE_GRANTED,
688 IPA_RM_RESOURCE_RELEASED
689};
690
691typedef void (*ipa_rm_notify_cb)(void *user_data,
692 enum ipa_rm_event event,
693 unsigned long data);
694/**
695 * struct ipa_rm_register_params - information needed to
696 * register IPA RM client with IPA RM
697 *
698 * @user_data: IPA RM client provided information
699 * to be passed to notify_cb callback below
700 * @notify_cb: callback which is called by resource
701 * to notify the IPA RM client about its state
702 * change IPA RM client is expected to perform non
703 * blocking operations only in notify_cb and
704 * release notification context as soon as
705 * possible.
706 */
707struct ipa_rm_register_params {
708 void *user_data;
709 ipa_rm_notify_cb notify_cb;
710};
711
712/**
713 * struct ipa_rm_create_params - information needed to initialize
714 * the resource
715 * @name: resource name
716 * @floor_voltage: floor voltage needed for client to operate in maximum
717 * bandwidth.
718 * @reg_params: register parameters, contains are ignored
719 * for consumer resource NULL should be provided
720 * for consumer resource
721 * @request_resource: function which should be called to request resource,
722 * NULL should be provided for producer resource
723 * @release_resource: function which should be called to release resource,
724 * NULL should be provided for producer resource
725 *
726 * IPA RM client is expected to perform non blocking operations only
727 * in request_resource and release_resource functions and
728 * release notification context as soon as possible.
729 */
730struct ipa_rm_create_params {
731 enum ipa_rm_resource_name name;
732 enum ipa_voltage_level floor_voltage;
733 struct ipa_rm_register_params reg_params;
734 int (*request_resource)(void);
735 int (*release_resource)(void);
736};
737
738/**
739 * struct ipa_rm_perf_profile - information regarding IPA RM client performance
740 * profile
741 *
742 * @max_bandwidth_mbps: maximum bandwidth need of the client in Mbps
743 */
744struct ipa_rm_perf_profile {
745 u32 max_supported_bandwidth_mbps;
746};
747
748#define A2_MUX_HDR_NAME_V4_PREF "dmux_hdr_v4_"
749#define A2_MUX_HDR_NAME_V6_PREF "dmux_hdr_v6_"
750
751/**
752 * enum teth_tethering_mode - Tethering mode (Rmnet / MBIM)
753 */
754enum teth_tethering_mode {
755 TETH_TETHERING_MODE_RMNET,
756 TETH_TETHERING_MODE_MBIM,
Mohammed Javid22b54442019-07-01 03:43:21 +0530757 TETH_TETHERING_MODE_RMNET_2,
Amir Levy9659e592016-10-27 18:08:27 +0300758 TETH_TETHERING_MODE_MAX,
759};
760
761/**
762 * teth_bridge_init_params - Parameters used for in/out USB API
763 * @usb_notify_cb: Callback function which should be used by the caller.
764 * Output parameter.
765 * @private_data: Data for the callback function. Should be used by the
766 * caller. Output parameter.
767 * @skip_ep_cfg: boolean field that determines if Apps-processor
768 * should or should not confiugre this end-point.
769 */
770struct teth_bridge_init_params {
771 ipa_notify_cb usb_notify_cb;
772 void *private_data;
773 enum ipa_client_type client;
774 bool skip_ep_cfg;
775};
776
777/**
778 * struct teth_bridge_connect_params - Parameters used in teth_bridge_connect()
779 * @ipa_usb_pipe_hdl: IPA to USB pipe handle, returned from ipa_connect()
780 * @usb_ipa_pipe_hdl: USB to IPA pipe handle, returned from ipa_connect()
781 * @tethering_mode: Rmnet or MBIM
782 * @ipa_client_type: IPA "client" name (IPA_CLIENT_USB#_PROD)
783 */
784struct teth_bridge_connect_params {
785 u32 ipa_usb_pipe_hdl;
786 u32 usb_ipa_pipe_hdl;
787 enum teth_tethering_mode tethering_mode;
788 enum ipa_client_type client_type;
789};
790
791/**
792 * struct ipa_tx_data_desc - information needed
793 * to send data packet to HW link: link to data descriptors
794 * priv: client specific private data
795 * @pyld_buffer: pointer to the data buffer that holds frame
796 * @pyld_len: length of the data packet
797 */
798struct ipa_tx_data_desc {
799 struct list_head link;
800 void *priv;
801 void *pyld_buffer;
802 u16 pyld_len;
803};
804
805/**
806 * struct ipa_rx_data - information needed
807 * to send to wlan driver on receiving data from ipa hw
808 * @skb: skb
809 * @dma_addr: DMA address of this Rx packet
810 */
811struct ipa_rx_data {
812 struct sk_buff *skb;
813 dma_addr_t dma_addr;
814};
815
816/**
817 * enum ipa_irq_type - IPA Interrupt Type
818 * Used to register handlers for IPA interrupts
819 *
820 * Below enum is a logical mapping and not the actual interrupt bit in HW
821 */
822enum ipa_irq_type {
823 IPA_BAD_SNOC_ACCESS_IRQ,
824 IPA_EOT_COAL_IRQ,
825 IPA_UC_IRQ_0,
826 IPA_UC_IRQ_1,
827 IPA_UC_IRQ_2,
828 IPA_UC_IRQ_3,
829 IPA_UC_IN_Q_NOT_EMPTY_IRQ,
830 IPA_UC_RX_CMD_Q_NOT_FULL_IRQ,
831 IPA_UC_TX_CMD_Q_NOT_FULL_IRQ,
832 IPA_UC_TO_PROC_ACK_Q_NOT_FULL_IRQ,
833 IPA_PROC_TO_UC_ACK_Q_NOT_EMPTY_IRQ,
834 IPA_RX_ERR_IRQ,
835 IPA_DEAGGR_ERR_IRQ,
836 IPA_TX_ERR_IRQ,
837 IPA_STEP_MODE_IRQ,
838 IPA_PROC_ERR_IRQ,
839 IPA_TX_SUSPEND_IRQ,
840 IPA_TX_HOLB_DROP_IRQ,
841 IPA_BAM_IDLE_IRQ,
Amir Levya59ed3f2017-03-05 17:30:55 +0200842 IPA_GSI_IDLE_IRQ = IPA_BAM_IDLE_IRQ,
Amir Levy9659e592016-10-27 18:08:27 +0300843 IPA_IRQ_MAX
844};
845
846/**
847 * struct ipa_tx_suspend_irq_data - interrupt data for IPA_TX_SUSPEND_IRQ
848 * @endpoints: bitmask of endpoints which case IPA_TX_SUSPEND_IRQ interrupt
849 * @dma_addr: DMA address of this Rx packet
850 */
851struct ipa_tx_suspend_irq_data {
852 u32 endpoints;
853};
854
855
856/**
857 * typedef ipa_irq_handler_t - irq handler/callback type
858 * @param ipa_irq_type - [in] interrupt type
859 * @param private_data - [in, out] the client private data
860 * @param interrupt_data - [out] interrupt information data
861 *
862 * callback registered by ipa_add_interrupt_handler function to
863 * handle a specific interrupt type
864 *
865 * No return value
866 */
867typedef void (*ipa_irq_handler_t)(enum ipa_irq_type interrupt,
868 void *private_data,
869 void *interrupt_data);
870
871/**
872 * struct IpaHwBamStats_t - Strucuture holding the BAM statistics
873 *
874 * @bamFifoFull : Number of times Bam Fifo got full - For In Ch: Good,
875 * For Out Ch: Bad
876 * @bamFifoEmpty : Number of times Bam Fifo got empty - For In Ch: Bad,
877 * For Out Ch: Good
878 * @bamFifoUsageHigh : Number of times Bam fifo usage went above 75% -
879 * For In Ch: Good, For Out Ch: Bad
880 * @bamFifoUsageLow : Number of times Bam fifo usage went below 25% -
881 * For In Ch: Bad, For Out Ch: Good
882*/
883struct IpaHwBamStats_t {
884 u32 bamFifoFull;
885 u32 bamFifoEmpty;
886 u32 bamFifoUsageHigh;
887 u32 bamFifoUsageLow;
888 u32 bamUtilCount;
889} __packed;
890
891/**
892 * struct IpaHwRingStats_t - Strucuture holding the Ring statistics
893 *
894 * @ringFull : Number of times Transfer Ring got full - For In Ch: Good,
895 * For Out Ch: Bad
896 * @ringEmpty : Number of times Transfer Ring got empty - For In Ch: Bad,
897 * For Out Ch: Good
898 * @ringUsageHigh : Number of times Transfer Ring usage went above 75% -
899 * For In Ch: Good, For Out Ch: Bad
900 * @ringUsageLow : Number of times Transfer Ring usage went below 25% -
901 * For In Ch: Bad, For Out Ch: Good
902*/
903struct IpaHwRingStats_t {
904 u32 ringFull;
905 u32 ringEmpty;
906 u32 ringUsageHigh;
907 u32 ringUsageLow;
908 u32 RingUtilCount;
909} __packed;
910
911/**
912 * struct IpaHwStatsWDIRxInfoData_t - Structure holding the WDI Rx channel
913 * structures
914 *
915 * @max_outstanding_pkts : Number of outstanding packets in Rx Ring
916 * @num_pkts_processed : Number of packets processed - cumulative
917 * @rx_ring_rp_value : Read pointer last advertized to the WLAN FW
918 * @rx_ind_ring_stats : Ring info
919 * @bam_stats : BAM info
920 * @num_bam_int_handled : Number of Bam Interrupts handled by FW
921 * @num_db : Number of times the doorbell was rung
922 * @num_unexpected_db : Number of unexpected doorbells
923 * @num_pkts_in_dis_uninit_state : number of completions we
924 * received in disabled or uninitialized state
925 * @num_ic_inj_vdev_change : Number of times the Imm Cmd is
926 * injected due to vdev_id change
927 * @num_ic_inj_fw_desc_change : Number of times the Imm Cmd is
928 * injected due to fw_desc change
Utkarsh Saxena971a03c2017-01-22 22:04:13 +0530929 * @num_qmb_int_handled : Number of QMB interrupts handled
Amir Levy9659e592016-10-27 18:08:27 +0300930*/
931struct IpaHwStatsWDIRxInfoData_t {
932 u32 max_outstanding_pkts;
933 u32 num_pkts_processed;
934 u32 rx_ring_rp_value;
935 struct IpaHwRingStats_t rx_ind_ring_stats;
936 struct IpaHwBamStats_t bam_stats;
937 u32 num_bam_int_handled;
938 u32 num_db;
939 u32 num_unexpected_db;
940 u32 num_pkts_in_dis_uninit_state;
941 u32 num_ic_inj_vdev_change;
942 u32 num_ic_inj_fw_desc_change;
Utkarsh Saxena971a03c2017-01-22 22:04:13 +0530943 u32 num_qmb_int_handled;
Amir Levy9659e592016-10-27 18:08:27 +0300944 u32 reserved1;
945 u32 reserved2;
946} __packed;
947
948/**
949 * struct IpaHwStatsWDITxInfoData_t - Structure holding the WDI Tx channel
950 * structures
951 *
952 * @num_pkts_processed : Number of packets processed - cumulative
953 * @copy_engine_doorbell_value : latest value of doorbell written to copy engine
954 * @num_db_fired : Number of DB from uC FW to Copy engine
955 * @tx_comp_ring_stats : ring info
956 * @bam_stats : BAM info
957 * @num_db : Number of times the doorbell was rung
958 * @num_unexpected_db : Number of unexpected doorbells
959 * @num_bam_int_handled : Number of Bam Interrupts handled by FW
960 * @num_bam_int_in_non_running_state : Number of Bam interrupts while not in
961 * Running state
962 * @num_qmb_int_handled : Number of QMB interrupts handled
963*/
964struct IpaHwStatsWDITxInfoData_t {
965 u32 num_pkts_processed;
966 u32 copy_engine_doorbell_value;
967 u32 num_db_fired;
968 struct IpaHwRingStats_t tx_comp_ring_stats;
969 struct IpaHwBamStats_t bam_stats;
970 u32 num_db;
971 u32 num_unexpected_db;
972 u32 num_bam_int_handled;
973 u32 num_bam_int_in_non_running_state;
974 u32 num_qmb_int_handled;
975 u32 num_bam_int_handled_while_wait_for_bam;
976} __packed;
977
978/**
979 * struct IpaHwStatsWDIInfoData_t - Structure holding the WDI channel structures
980 *
981 * @rx_ch_stats : RX stats
982 * @tx_ch_stats : TX stats
983*/
984struct IpaHwStatsWDIInfoData_t {
985 struct IpaHwStatsWDIRxInfoData_t rx_ch_stats;
986 struct IpaHwStatsWDITxInfoData_t tx_ch_stats;
987} __packed;
988
989
990/**
991 * struct ipa_wdi_ul_params - WDI_RX configuration
992 * @rdy_ring_base_pa: physical address of the base of the Rx ring (containing
993 * Rx buffers)
994 * @rdy_ring_size: size of the Rx ring in bytes
995 * @rdy_ring_rp_pa: physical address of the location through which IPA uc is
996 * reading (WDI-1.0)
997 * @rdy_comp_ring_base_pa: physical address of the base of the Rx completion
998 * ring (WDI-2.0)
999 * @rdy_comp_ring_wp_pa: physical address of the location through which IPA
1000 * uc is writing (WDI-2.0)
1001 * @rdy_comp_ring_size: size of the Rx_completion ring in bytes
1002 * expected to communicate about the Read pointer into the Rx Ring
1003 */
1004struct ipa_wdi_ul_params {
1005 phys_addr_t rdy_ring_base_pa;
1006 u32 rdy_ring_size;
1007 phys_addr_t rdy_ring_rp_pa;
1008 phys_addr_t rdy_comp_ring_base_pa;
1009 phys_addr_t rdy_comp_ring_wp_pa;
1010 u32 rdy_comp_ring_size;
1011 u32 *rdy_ring_rp_va;
1012 u32 *rdy_comp_ring_wp_va;
1013};
1014
1015/**
1016 * struct ipa_wdi_ul_params_smmu - WDI_RX configuration (with WLAN SMMU)
1017 * @rdy_ring: SG table describing the Rx ring (containing Rx buffers)
1018 * @rdy_ring_size: size of the Rx ring in bytes
1019 * @rdy_ring_rp_pa: physical address of the location through which IPA uc is
1020 * expected to communicate about the Read pointer into the Rx Ring
1021 */
1022struct ipa_wdi_ul_params_smmu {
1023 struct sg_table rdy_ring;
1024 u32 rdy_ring_size;
1025 phys_addr_t rdy_ring_rp_pa;
1026 struct sg_table rdy_comp_ring;
1027 phys_addr_t rdy_comp_ring_wp_pa;
1028 u32 rdy_comp_ring_size;
1029 u32 *rdy_ring_rp_va;
1030 u32 *rdy_comp_ring_wp_va;
1031};
1032
1033/**
1034 * struct ipa_wdi_dl_params - WDI_TX configuration
1035 * @comp_ring_base_pa: physical address of the base of the Tx completion ring
1036 * @comp_ring_size: size of the Tx completion ring in bytes
1037 * @ce_ring_base_pa: physical address of the base of the Copy Engine Source
1038 * Ring
1039 * @ce_door_bell_pa: physical address of the doorbell that the IPA uC has to
1040 * write into to trigger the copy engine
1041 * @ce_ring_size: Copy Engine Ring size in bytes
1042 * @num_tx_buffers: Number of pkt buffers allocated
1043 */
1044struct ipa_wdi_dl_params {
1045 phys_addr_t comp_ring_base_pa;
1046 u32 comp_ring_size;
1047 phys_addr_t ce_ring_base_pa;
1048 phys_addr_t ce_door_bell_pa;
1049 u32 ce_ring_size;
1050 u32 num_tx_buffers;
1051};
1052
1053/**
1054 * struct ipa_wdi_dl_params_smmu - WDI_TX configuration (with WLAN SMMU)
1055 * @comp_ring: SG table describing the Tx completion ring
1056 * @comp_ring_size: size of the Tx completion ring in bytes
1057 * @ce_ring: SG table describing the Copy Engine Source Ring
1058 * @ce_door_bell_pa: physical address of the doorbell that the IPA uC has to
1059 * write into to trigger the copy engine
1060 * @ce_ring_size: Copy Engine Ring size in bytes
1061 * @num_tx_buffers: Number of pkt buffers allocated
1062 */
1063struct ipa_wdi_dl_params_smmu {
1064 struct sg_table comp_ring;
1065 u32 comp_ring_size;
1066 struct sg_table ce_ring;
1067 phys_addr_t ce_door_bell_pa;
1068 u32 ce_ring_size;
1069 u32 num_tx_buffers;
1070};
1071
1072/**
1073 * struct ipa_wdi_in_params - information provided by WDI client
1074 * @sys: IPA EP configuration info
1075 * @ul: WDI_RX configuration info
1076 * @dl: WDI_TX configuration info
1077 * @ul_smmu: WDI_RX configuration info when WLAN uses SMMU
1078 * @dl_smmu: WDI_TX configuration info when WLAN uses SMMU
1079 * @smmu_enabled: true if WLAN uses SMMU
Skylar Changfcf36c22016-10-04 14:15:25 -07001080 * @ipa_wdi_meter_notifier_cb: Get WDI stats and quato info
Amir Levy9659e592016-10-27 18:08:27 +03001081 */
1082struct ipa_wdi_in_params {
1083 struct ipa_sys_connect_params sys;
1084 union {
1085 struct ipa_wdi_ul_params ul;
1086 struct ipa_wdi_dl_params dl;
1087 struct ipa_wdi_ul_params_smmu ul_smmu;
1088 struct ipa_wdi_dl_params_smmu dl_smmu;
1089 } u;
1090 bool smmu_enabled;
Skylar Changfcf36c22016-10-04 14:15:25 -07001091#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN
1092 ipa_wdi_meter_notifier_cb wdi_notify;
1093#endif
Amir Levy9659e592016-10-27 18:08:27 +03001094};
1095
Skylar Chang6b41f8d2016-11-01 12:50:11 -07001096enum ipa_upstream_type {
1097 IPA_UPSTEAM_MODEM = 1,
1098 IPA_UPSTEAM_WLAN,
1099 IPA_UPSTEAM_MAX
1100};
1101
Amir Levy9659e592016-10-27 18:08:27 +03001102/**
1103 * struct ipa_wdi_out_params - information provided to WDI client
1104 * @uc_door_bell_pa: physical address of IPA uc doorbell
1105 * @clnt_hdl: opaque handle assigned to client
1106 */
1107struct ipa_wdi_out_params {
1108 phys_addr_t uc_door_bell_pa;
1109 u32 clnt_hdl;
1110};
1111
1112/**
1113 * struct ipa_wdi_db_params - information provided to retrieve
1114 * physical address of uC doorbell
1115 * @client: type of "client" (IPA_CLIENT_WLAN#_PROD/CONS)
1116 * @uc_door_bell_pa: physical address of IPA uc doorbell
1117 */
1118struct ipa_wdi_db_params {
1119 enum ipa_client_type client;
1120 phys_addr_t uc_door_bell_pa;
1121};
1122
1123/**
1124 * struct ipa_wdi_uc_ready_params - uC ready CB parameters
1125 * @is_uC_ready: uC loaded or not
1126 * @priv : callback cookie
1127 * @notify: callback
1128 */
1129typedef void (*ipa_uc_ready_cb)(void *priv);
1130struct ipa_wdi_uc_ready_params {
1131 bool is_uC_ready;
1132 void *priv;
1133 ipa_uc_ready_cb notify;
1134};
1135
1136/**
1137 * struct ipa_wdi_buffer_info - address info of a WLAN allocated buffer
1138 * @pa: physical address of the buffer
1139 * @iova: IOVA of the buffer as embedded inside the WDI descriptors
1140 * @size: size in bytes of the buffer
1141 * @result: result of map or unmap operations (out param)
1142 *
1143 * IPA driver will create/release IOMMU mapping in IPA SMMU from iova->pa
1144 */
1145struct ipa_wdi_buffer_info {
1146 phys_addr_t pa;
1147 unsigned long iova;
1148 size_t size;
1149 int result;
1150};
1151
1152/**
1153 * struct ipa_gsi_ep_config - IPA GSI endpoint configurations
1154 *
1155 * @ipa_ep_num: IPA EP pipe number
1156 * @ipa_gsi_chan_num: GSI channel number
1157 * @ipa_if_tlv: number of IPA_IF TLV
1158 * @ipa_if_aos: number of IPA_IF AOS
1159 * @ee: Execution environment
Mohammed Javid47a09892018-05-28 14:46:44 +05301160 * @prefetch_mode: Prefetch mode to be used
Amir Levy9659e592016-10-27 18:08:27 +03001161 */
1162struct ipa_gsi_ep_config {
1163 int ipa_ep_num;
1164 int ipa_gsi_chan_num;
1165 int ipa_if_tlv;
1166 int ipa_if_aos;
1167 int ee;
Mohammed Javid47a09892018-05-28 14:46:44 +05301168 enum gsi_prefetch_mode prefetch_mode;
Amir Levy9659e592016-10-27 18:08:27 +03001169};
1170
Skylar Chang48afa052017-10-25 09:32:57 -07001171/**
1172 * struct ipa_tz_unlock_reg_info - Used in order unlock regions of memory by TZ
1173 * @reg_addr - Physical address of the start of the region
1174 * @size - Size of the region in bytes
1175 */
1176struct ipa_tz_unlock_reg_info {
1177 u64 reg_addr;
1178 u64 size;
1179};
1180
Michael Adisumartad04e6d62017-11-09 17:46:35 -08001181/**
1182 * struct ipa_smmu_in_params - information provided from client
1183 * @ipa_smmu_client_type: clinet requesting for the smmu info.
1184 */
1185
1186enum ipa_smmu_client_type {
1187 IPA_SMMU_WLAN_CLIENT,
1188 IPA_SMMU_CLIENT_MAX
1189};
1190
1191struct ipa_smmu_in_params {
1192 enum ipa_smmu_client_type smmu_client;
1193};
1194
1195/**
1196 * struct ipa_smmu_out_params - information provided to IPA client
1197 * @ipa_smmu_s1_enable: IPA S1 SMMU enable/disable status
1198 */
1199struct ipa_smmu_out_params {
1200 bool smmu_enable;
1201};
1202
Amir Levy9659e592016-10-27 18:08:27 +03001203#if defined CONFIG_IPA || defined CONFIG_IPA3
1204
1205/*
1206 * Connect / Disconnect
1207 */
1208int ipa_connect(const struct ipa_connect_params *in, struct ipa_sps_params *sps,
1209 u32 *clnt_hdl);
1210int ipa_disconnect(u32 clnt_hdl);
1211
1212/*
1213 * Resume / Suspend
1214 */
1215int ipa_reset_endpoint(u32 clnt_hdl);
1216
1217/*
1218 * Remove ep delay
1219 */
1220int ipa_clear_endpoint_delay(u32 clnt_hdl);
1221
1222/*
1223 * Disable ep
1224 */
1225int ipa_disable_endpoint(u32 clnt_hdl);
1226
1227/*
1228 * Configuration
1229 */
1230int ipa_cfg_ep(u32 clnt_hdl, const struct ipa_ep_cfg *ipa_ep_cfg);
1231
1232int ipa_cfg_ep_nat(u32 clnt_hdl, const struct ipa_ep_cfg_nat *ipa_ep_cfg);
1233
Amir Levydc65f4c2017-07-06 09:49:50 +03001234int ipa_cfg_ep_conn_track(u32 clnt_hdl,
1235 const struct ipa_ep_cfg_conn_track *ep_conn_track);
1236
Amir Levy9659e592016-10-27 18:08:27 +03001237int ipa_cfg_ep_hdr(u32 clnt_hdl, const struct ipa_ep_cfg_hdr *ipa_ep_cfg);
1238
1239int ipa_cfg_ep_hdr_ext(u32 clnt_hdl,
1240 const struct ipa_ep_cfg_hdr_ext *ipa_ep_cfg);
1241
1242int ipa_cfg_ep_mode(u32 clnt_hdl, const struct ipa_ep_cfg_mode *ipa_ep_cfg);
1243
1244int ipa_cfg_ep_aggr(u32 clnt_hdl, const struct ipa_ep_cfg_aggr *ipa_ep_cfg);
1245
1246int ipa_cfg_ep_deaggr(u32 clnt_hdl,
1247 const struct ipa_ep_cfg_deaggr *ipa_ep_cfg);
1248
1249int ipa_cfg_ep_route(u32 clnt_hdl, const struct ipa_ep_cfg_route *ipa_ep_cfg);
1250
1251int ipa_cfg_ep_holb(u32 clnt_hdl, const struct ipa_ep_cfg_holb *ipa_ep_cfg);
1252
1253int ipa_cfg_ep_cfg(u32 clnt_hdl, const struct ipa_ep_cfg_cfg *ipa_ep_cfg);
1254
1255int ipa_cfg_ep_metadata_mask(u32 clnt_hdl, const struct ipa_ep_cfg_metadata_mask
1256 *ipa_ep_cfg);
1257
1258int ipa_cfg_ep_holb_by_client(enum ipa_client_type client,
1259 const struct ipa_ep_cfg_holb *ipa_ep_cfg);
1260
1261int ipa_cfg_ep_ctrl(u32 clnt_hdl, const struct ipa_ep_cfg_ctrl *ep_ctrl);
1262
1263/*
1264 * Header removal / addition
1265 */
1266int ipa_add_hdr(struct ipa_ioc_add_hdr *hdrs);
1267
Skylar Chang68c37d82018-04-07 16:42:36 -07001268int ipa_add_hdr_usr(struct ipa_ioc_add_hdr *hdrs, bool user_only);
1269
Amir Levy9659e592016-10-27 18:08:27 +03001270int ipa_del_hdr(struct ipa_ioc_del_hdr *hdls);
1271
1272int ipa_commit_hdr(void);
1273
Skylar Chang68c37d82018-04-07 16:42:36 -07001274int ipa_reset_hdr(bool user_only);
Amir Levy9659e592016-10-27 18:08:27 +03001275
1276int ipa_get_hdr(struct ipa_ioc_get_hdr *lookup);
1277
1278int ipa_put_hdr(u32 hdr_hdl);
1279
1280int ipa_copy_hdr(struct ipa_ioc_copy_hdr *copy);
1281
1282/*
1283 * Header Processing Context
1284 */
Skylar Chang68c37d82018-04-07 16:42:36 -07001285int ipa_add_hdr_proc_ctx(struct ipa_ioc_add_hdr_proc_ctx *proc_ctxs,
1286 bool user_only);
Amir Levy9659e592016-10-27 18:08:27 +03001287
1288int ipa_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls);
1289
1290/*
1291 * Routing
1292 */
1293int ipa_add_rt_rule(struct ipa_ioc_add_rt_rule *rules);
1294
Skylar Chang68c37d82018-04-07 16:42:36 -07001295int ipa_add_rt_rule_usr(struct ipa_ioc_add_rt_rule *rules, bool user_only);
1296
Amir Levy9659e592016-10-27 18:08:27 +03001297int ipa_del_rt_rule(struct ipa_ioc_del_rt_rule *hdls);
1298
1299int ipa_commit_rt(enum ipa_ip_type ip);
1300
Skylar Chang68c37d82018-04-07 16:42:36 -07001301int ipa_reset_rt(enum ipa_ip_type ip, bool user_only);
Amir Levy9659e592016-10-27 18:08:27 +03001302
1303int ipa_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup);
1304
1305int ipa_put_rt_tbl(u32 rt_tbl_hdl);
1306
1307int ipa_query_rt_index(struct ipa_ioc_get_rt_tbl_indx *in);
1308
1309int ipa_mdfy_rt_rule(struct ipa_ioc_mdfy_rt_rule *rules);
1310
1311/*
1312 * Filtering
1313 */
1314int ipa_add_flt_rule(struct ipa_ioc_add_flt_rule *rules);
1315
Skylar Chang68c37d82018-04-07 16:42:36 -07001316int ipa_add_flt_rule_usr(struct ipa_ioc_add_flt_rule *rules, bool user_only);
1317
Amir Levy9659e592016-10-27 18:08:27 +03001318int ipa_del_flt_rule(struct ipa_ioc_del_flt_rule *hdls);
1319
1320int ipa_mdfy_flt_rule(struct ipa_ioc_mdfy_flt_rule *rules);
1321
1322int ipa_commit_flt(enum ipa_ip_type ip);
1323
Skylar Chang68c37d82018-04-07 16:42:36 -07001324int ipa_reset_flt(enum ipa_ip_type ip, bool user_only);
Amir Levy9659e592016-10-27 18:08:27 +03001325
1326/*
Amir Levy479cfdd2017-10-26 12:23:14 +03001327 * NAT\IPv6CT
Amir Levy9659e592016-10-27 18:08:27 +03001328 */
Amir Levy479cfdd2017-10-26 12:23:14 +03001329int ipa_allocate_nat_device(struct ipa_ioc_nat_alloc_mem *mem);
1330int ipa_allocate_nat_table(struct ipa_ioc_nat_ipv6ct_table_alloc *table_alloc);
1331int ipa_allocate_ipv6ct_table(
1332 struct ipa_ioc_nat_ipv6ct_table_alloc *table_alloc);
Amir Levy9659e592016-10-27 18:08:27 +03001333
1334int ipa_nat_init_cmd(struct ipa_ioc_v4_nat_init *init);
Amir Levy479cfdd2017-10-26 12:23:14 +03001335int ipa_ipv6ct_init_cmd(struct ipa_ioc_ipv6ct_init *init);
Amir Levy9659e592016-10-27 18:08:27 +03001336
1337int ipa_nat_dma_cmd(struct ipa_ioc_nat_dma_cmd *dma);
Amir Levy479cfdd2017-10-26 12:23:14 +03001338int ipa_table_dma_cmd(struct ipa_ioc_nat_dma_cmd *dma);
Amir Levy9659e592016-10-27 18:08:27 +03001339
1340int ipa_nat_del_cmd(struct ipa_ioc_v4_nat_del *del);
Amir Levy479cfdd2017-10-26 12:23:14 +03001341int ipa_del_nat_table(struct ipa_ioc_nat_ipv6ct_table_del *del);
1342int ipa_del_ipv6ct_table(struct ipa_ioc_nat_ipv6ct_table_del *del);
1343
1344int ipa_nat_mdfy_pdn(struct ipa_ioc_nat_pdn_entry *mdfy_pdn);
Amir Levy9659e592016-10-27 18:08:27 +03001345
1346/*
1347 * Messaging
1348 */
1349int ipa_send_msg(struct ipa_msg_meta *meta, void *buff,
1350 ipa_msg_free_fn callback);
1351int ipa_register_pull_msg(struct ipa_msg_meta *meta, ipa_msg_pull_fn callback);
1352int ipa_deregister_pull_msg(struct ipa_msg_meta *meta);
1353
1354/*
1355 * Interface
1356 */
1357int ipa_register_intf(const char *name, const struct ipa_tx_intf *tx,
1358 const struct ipa_rx_intf *rx);
1359int ipa_register_intf_ext(const char *name, const struct ipa_tx_intf *tx,
1360 const struct ipa_rx_intf *rx,
1361 const struct ipa_ext_intf *ext);
1362int ipa_deregister_intf(const char *name);
1363
1364/*
1365 * Aggregation
1366 */
1367int ipa_set_aggr_mode(enum ipa_aggr_mode mode);
1368
1369int ipa_set_qcncm_ndp_sig(char sig[3]);
1370
1371int ipa_set_single_ndp_per_mbim(bool enable);
1372
1373/*
1374 * Data path
1375 */
1376int ipa_tx_dp(enum ipa_client_type dst, struct sk_buff *skb,
1377 struct ipa_tx_meta *metadata);
1378
1379/*
1380 * To transfer multiple data packets
1381 * While passing the data descriptor list, the anchor node
1382 * should be of type struct ipa_tx_data_desc not list_head
1383*/
1384int ipa_tx_dp_mul(enum ipa_client_type dst,
1385 struct ipa_tx_data_desc *data_desc);
1386
1387void ipa_free_skb(struct ipa_rx_data *);
1388int ipa_rx_poll(u32 clnt_hdl, int budget);
1389void ipa_recycle_wan_skb(struct sk_buff *skb);
1390
1391/*
1392 * System pipes
1393 */
1394int ipa_setup_sys_pipe(struct ipa_sys_connect_params *sys_in, u32 *clnt_hdl);
1395
1396int ipa_teardown_sys_pipe(u32 clnt_hdl);
1397
1398int ipa_connect_wdi_pipe(struct ipa_wdi_in_params *in,
1399 struct ipa_wdi_out_params *out);
1400int ipa_disconnect_wdi_pipe(u32 clnt_hdl);
1401int ipa_enable_wdi_pipe(u32 clnt_hdl);
1402int ipa_disable_wdi_pipe(u32 clnt_hdl);
1403int ipa_resume_wdi_pipe(u32 clnt_hdl);
1404int ipa_suspend_wdi_pipe(u32 clnt_hdl);
1405int ipa_get_wdi_stats(struct IpaHwStatsWDIInfoData_t *stats);
1406u16 ipa_get_smem_restr_bytes(void);
Skylar Changfcf36c22016-10-04 14:15:25 -07001407int ipa_broadcast_wdi_quota_reach_ind(uint32_t fid,
1408 uint64_t num_bytes);
1409
Amir Levy9659e592016-10-27 18:08:27 +03001410/*
1411 * To retrieve doorbell physical address of
1412 * wlan pipes
1413 */
1414int ipa_uc_wdi_get_dbpa(struct ipa_wdi_db_params *out);
1415
1416/*
1417 * To register uC ready callback if uC not ready
1418 * and also check uC readiness
1419 * if uC not ready only, register callback
1420 */
1421int ipa_uc_reg_rdyCB(struct ipa_wdi_uc_ready_params *param);
1422/*
1423 * To de-register uC ready callback
1424 */
1425int ipa_uc_dereg_rdyCB(void);
1426
1427int ipa_create_wdi_mapping(u32 num_buffers, struct ipa_wdi_buffer_info *info);
1428int ipa_release_wdi_mapping(u32 num_buffers, struct ipa_wdi_buffer_info *info);
1429
1430/*
1431 * Resource manager
1432 */
1433int ipa_rm_create_resource(struct ipa_rm_create_params *create_params);
1434
1435int ipa_rm_delete_resource(enum ipa_rm_resource_name resource_name);
1436
1437int ipa_rm_register(enum ipa_rm_resource_name resource_name,
1438 struct ipa_rm_register_params *reg_params);
1439
1440int ipa_rm_deregister(enum ipa_rm_resource_name resource_name,
1441 struct ipa_rm_register_params *reg_params);
1442
1443int ipa_rm_set_perf_profile(enum ipa_rm_resource_name resource_name,
1444 struct ipa_rm_perf_profile *profile);
1445
1446int ipa_rm_add_dependency(enum ipa_rm_resource_name resource_name,
1447 enum ipa_rm_resource_name depends_on_name);
1448
1449int ipa_rm_add_dependency_sync(enum ipa_rm_resource_name resource_name,
1450 enum ipa_rm_resource_name depends_on_name);
1451
1452int ipa_rm_delete_dependency(enum ipa_rm_resource_name resource_name,
1453 enum ipa_rm_resource_name depends_on_name);
1454
1455int ipa_rm_request_resource(enum ipa_rm_resource_name resource_name);
1456
1457int ipa_rm_release_resource(enum ipa_rm_resource_name resource_name);
1458
1459int ipa_rm_notify_completion(enum ipa_rm_event event,
1460 enum ipa_rm_resource_name resource_name);
1461
1462int ipa_rm_inactivity_timer_init(enum ipa_rm_resource_name resource_name,
1463 unsigned long msecs);
1464
1465int ipa_rm_inactivity_timer_destroy(enum ipa_rm_resource_name resource_name);
1466
1467int ipa_rm_inactivity_timer_request_resource(
1468 enum ipa_rm_resource_name resource_name);
1469
1470int ipa_rm_inactivity_timer_release_resource(
1471 enum ipa_rm_resource_name resource_name);
1472
1473/*
1474 * Tethering bridge (Rmnet / MBIM)
1475 */
1476int teth_bridge_init(struct teth_bridge_init_params *params);
1477
1478int teth_bridge_disconnect(enum ipa_client_type client);
1479
1480int teth_bridge_connect(struct teth_bridge_connect_params *connect_params);
1481
1482/*
1483 * Tethering client info
1484 */
1485void ipa_set_client(int index, enum ipacm_client_enum client, bool uplink);
1486
1487enum ipacm_client_enum ipa_get_client(int pipe_idx);
1488
1489bool ipa_get_client_uplink(int pipe_idx);
1490
1491/*
1492 * IPADMA
1493 */
1494int ipa_dma_init(void);
1495
1496int ipa_dma_enable(void);
1497
1498int ipa_dma_disable(void);
1499
1500int ipa_dma_sync_memcpy(u64 dest, u64 src, int len);
1501
1502int ipa_dma_async_memcpy(u64 dest, u64 src, int len,
1503 void (*user_cb)(void *user1), void *user_param);
1504
1505int ipa_dma_uc_memcpy(phys_addr_t dest, phys_addr_t src, int len);
1506
1507void ipa_dma_destroy(void);
1508
1509/*
1510 * mux id
1511 */
1512int ipa_write_qmap_id(struct ipa_ioc_write_qmapid *param_in);
1513
1514/*
1515 * interrupts
1516 */
1517int ipa_add_interrupt_handler(enum ipa_irq_type interrupt,
1518 ipa_irq_handler_t handler,
1519 bool deferred_flag,
1520 void *private_data);
1521
1522int ipa_remove_interrupt_handler(enum ipa_irq_type interrupt);
1523
1524int ipa_restore_suspend_handler(void);
1525
1526/*
1527 * Miscellaneous
1528 */
1529void ipa_bam_reg_dump(void);
1530
1531int ipa_get_ep_mapping(enum ipa_client_type client);
1532
1533bool ipa_is_ready(void);
1534
1535void ipa_proxy_clk_vote(void);
1536void ipa_proxy_clk_unvote(void);
1537
1538enum ipa_hw_type ipa_get_hw_type(void);
1539
1540bool ipa_is_client_handle_valid(u32 clnt_hdl);
1541
1542enum ipa_client_type ipa_get_client_mapping(int pipe_idx);
1543
1544enum ipa_rm_resource_name ipa_get_rm_resource_from_ep(int pipe_idx);
1545
1546bool ipa_get_modem_cfg_emb_pipe_flt(void);
1547
1548enum ipa_transport_type ipa_get_transport_type(void);
1549
1550struct device *ipa_get_dma_dev(void);
1551struct iommu_domain *ipa_get_smmu_domain(void);
1552
1553int ipa_disable_apps_wan_cons_deaggr(uint32_t agg_size, uint32_t agg_count);
1554
Amir Levy3be373c2017-03-05 16:31:30 +02001555const struct ipa_gsi_ep_config *ipa_get_gsi_ep_info
1556 (enum ipa_client_type client);
Amir Levy9659e592016-10-27 18:08:27 +03001557
1558int ipa_stop_gsi_channel(u32 clnt_hdl);
1559
1560typedef void (*ipa_ready_cb)(void *user_data);
1561
1562/**
1563* ipa_register_ipa_ready_cb() - register a callback to be invoked
1564* when IPA core driver initialization is complete.
1565*
1566* @ipa_ready_cb: CB to be triggered.
1567* @user_data: Data to be sent to the originator of the CB.
1568*
1569* Note: This function is expected to be utilized when ipa_is_ready
1570* function returns false.
1571* An IPA client may also use this function directly rather than
1572* calling ipa_is_ready beforehand, as if this API returns -EEXIST,
1573* this means IPA initialization is complete (and no callback will
1574* be triggered).
1575* When the callback is triggered, the client MUST perform his
1576* operations in a different context.
1577*
1578* The function will return 0 on success, -ENOMEM on memory issues and
1579* -EEXIST if IPA initialization is complete already.
1580*/
1581int ipa_register_ipa_ready_cb(void (*ipa_ready_cb)(void *user_data),
1582 void *user_data);
1583
Skylar Chang48afa052017-10-25 09:32:57 -07001584/**
1585 * ipa_tz_unlock_reg - Unlocks memory regions so that they become accessible
1586 * from AP.
1587 * @reg_info - Pointer to array of memory regions to unlock
1588 * @num_regs - Number of elements in the array
1589 *
1590 * Converts the input array of regions to a struct that TZ understands and
1591 * issues an SCM call.
1592 * Also flushes the memory cache to DDR in order to make sure that TZ sees the
1593 * correct data structure.
1594 *
1595 * Returns: 0 on success, negative on failure
1596 */
1597int ipa_tz_unlock_reg(struct ipa_tz_unlock_reg_info *reg_info, u16 num_regs);
Michael Adisumartad04e6d62017-11-09 17:46:35 -08001598int ipa_get_smmu_params(struct ipa_smmu_in_params *in,
1599 struct ipa_smmu_out_params *out);
Amir Levy2da9d452017-12-12 10:09:46 +02001600/**
1601 * ipa_is_vlan_mode - check if a LAN driver should load in VLAN mode
1602 * @iface - type of vlan capable device
1603 * @res - query result: true for vlan mode, false for non vlan mode
1604 *
1605 * API must be called after ipa_is_ready() returns true, otherwise it will fail
1606 *
1607 * Returns: 0 on success, negative on failure
1608 */
1609int ipa_is_vlan_mode(enum ipa_vlan_ifaces iface, bool *res);
Amir Levy8fb98e02019-10-29 14:22:26 +02001610
1611/**
1612 * ipa_get_lan_rx_napi - returns true if NAPI is enabled in the LAN RX dp
1613 */
1614bool ipa_get_lan_rx_napi(void);
Amir Levy9659e592016-10-27 18:08:27 +03001615#else /* (CONFIG_IPA || CONFIG_IPA3) */
1616
1617/*
1618 * Connect / Disconnect
1619 */
1620static inline int ipa_connect(const struct ipa_connect_params *in,
1621 struct ipa_sps_params *sps, u32 *clnt_hdl)
1622{
1623 return -EPERM;
1624}
1625
1626static inline int ipa_disconnect(u32 clnt_hdl)
1627{
1628 return -EPERM;
1629}
1630
1631/*
1632 * Resume / Suspend
1633 */
1634static inline int ipa_reset_endpoint(u32 clnt_hdl)
1635{
1636 return -EPERM;
1637}
1638
1639/*
1640 * Remove ep delay
1641 */
1642static inline int ipa_clear_endpoint_delay(u32 clnt_hdl)
1643{
1644 return -EPERM;
1645}
1646
1647/*
1648 * Disable ep
1649 */
1650static inline int ipa_disable_endpoint(u32 clnt_hdl)
1651{
1652 return -EPERM;
1653}
1654
1655/*
1656 * Configuration
1657 */
1658static inline int ipa_cfg_ep(u32 clnt_hdl,
1659 const struct ipa_ep_cfg *ipa_ep_cfg)
1660{
1661 return -EPERM;
1662}
1663
1664static inline int ipa_cfg_ep_nat(u32 clnt_hdl,
1665 const struct ipa_ep_cfg_nat *ipa_ep_cfg)
1666{
1667 return -EPERM;
1668}
1669
Amir Levydc65f4c2017-07-06 09:49:50 +03001670static inline int ipa_cfg_ep_conn_track(u32 clnt_hdl,
1671 const struct ipa_ep_cfg_conn_track *ep_conn_track)
1672{
Sundara Vinayagam93ab52c2018-03-05 19:41:21 +05301673 return -EPERM;
Amir Levydc65f4c2017-07-06 09:49:50 +03001674}
1675
Amir Levy9659e592016-10-27 18:08:27 +03001676static inline int ipa_cfg_ep_hdr(u32 clnt_hdl,
1677 const struct ipa_ep_cfg_hdr *ipa_ep_cfg)
1678{
1679 return -EPERM;
1680}
1681
1682static inline int ipa_cfg_ep_hdr_ext(u32 clnt_hdl,
1683 const struct ipa_ep_cfg_hdr_ext *ipa_ep_cfg)
1684{
1685 return -EPERM;
1686}
1687
1688static inline int ipa_cfg_ep_mode(u32 clnt_hdl,
1689 const struct ipa_ep_cfg_mode *ipa_ep_cfg)
1690{
1691 return -EPERM;
1692}
1693
1694static inline int ipa_cfg_ep_aggr(u32 clnt_hdl,
1695 const struct ipa_ep_cfg_aggr *ipa_ep_cfg)
1696{
1697 return -EPERM;
1698}
1699
1700static inline int ipa_cfg_ep_deaggr(u32 clnt_hdl,
1701 const struct ipa_ep_cfg_deaggr *ipa_ep_cfg)
1702{
1703 return -EPERM;
1704}
1705
1706static inline int ipa_cfg_ep_route(u32 clnt_hdl,
1707 const struct ipa_ep_cfg_route *ipa_ep_cfg)
1708{
1709 return -EPERM;
1710}
1711
1712static inline int ipa_cfg_ep_holb(u32 clnt_hdl,
1713 const struct ipa_ep_cfg_holb *ipa_ep_cfg)
1714{
1715 return -EPERM;
1716}
1717
1718static inline int ipa_cfg_ep_cfg(u32 clnt_hdl,
1719 const struct ipa_ep_cfg_cfg *ipa_ep_cfg)
1720{
1721 return -EPERM;
1722}
1723
1724static inline int ipa_cfg_ep_metadata_mask(u32 clnt_hdl,
1725 const struct ipa_ep_cfg_metadata_mask *ipa_ep_cfg)
1726{
1727 return -EPERM;
1728}
1729
1730static inline int ipa_cfg_ep_ctrl(u32 clnt_hdl,
1731 const struct ipa_ep_cfg_ctrl *ep_ctrl)
1732{
1733 return -EPERM;
1734}
1735
1736/*
1737 * Header removal / addition
1738 */
1739static inline int ipa_add_hdr(struct ipa_ioc_add_hdr *hdrs)
1740{
1741 return -EPERM;
1742}
1743
Skylar Chang68c37d82018-04-07 16:42:36 -07001744static inline int ipa_add_hdr_usr(struct ipa_ioc_add_hdr *hdrs,
1745 bool user_only)
1746{
1747 return -EPERM;
1748}
1749
Amir Levy9659e592016-10-27 18:08:27 +03001750static inline int ipa_del_hdr(struct ipa_ioc_del_hdr *hdls)
1751{
1752 return -EPERM;
1753}
1754
1755static inline int ipa_commit_hdr(void)
1756{
1757 return -EPERM;
1758}
1759
Skylar Chang68c37d82018-04-07 16:42:36 -07001760static inline int ipa_reset_hdr(bool user_only)
Amir Levy9659e592016-10-27 18:08:27 +03001761{
1762 return -EPERM;
1763}
1764
1765static inline int ipa_get_hdr(struct ipa_ioc_get_hdr *lookup)
1766{
1767 return -EPERM;
1768}
1769
1770static inline int ipa_put_hdr(u32 hdr_hdl)
1771{
1772 return -EPERM;
1773}
1774
1775static inline int ipa_copy_hdr(struct ipa_ioc_copy_hdr *copy)
1776{
1777 return -EPERM;
1778}
1779
1780/*
1781 * Header Processing Context
1782 */
1783static inline int ipa_add_hdr_proc_ctx(
Skylar Chang68c37d82018-04-07 16:42:36 -07001784 struct ipa_ioc_add_hdr_proc_ctx *proc_ctxs,
1785 bool user_only)
Amir Levy9659e592016-10-27 18:08:27 +03001786{
1787 return -EPERM;
1788}
1789
1790static inline int ipa_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls)
1791{
1792 return -EPERM;
1793}
1794/*
1795 * Routing
1796 */
1797static inline int ipa_add_rt_rule(struct ipa_ioc_add_rt_rule *rules)
1798{
1799 return -EPERM;
1800}
1801
Skylar Chang68c37d82018-04-07 16:42:36 -07001802static inline int ipa_add_rt_rule_usr(struct ipa_ioc_add_rt_rule *rules,
1803 bool user_only)
1804{
1805 return -EPERM;
1806}
1807
Amir Levy9659e592016-10-27 18:08:27 +03001808static inline int ipa_del_rt_rule(struct ipa_ioc_del_rt_rule *hdls)
1809{
1810 return -EPERM;
1811}
1812
1813static inline int ipa_commit_rt(enum ipa_ip_type ip)
1814{
1815 return -EPERM;
1816}
1817
Skylar Chang68c37d82018-04-07 16:42:36 -07001818static inline int ipa_reset_rt(enum ipa_ip_type ip, bool user_only)
Amir Levy9659e592016-10-27 18:08:27 +03001819{
1820 return -EPERM;
1821}
1822
1823static inline int ipa_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup)
1824{
1825 return -EPERM;
1826}
1827
1828static inline int ipa_put_rt_tbl(u32 rt_tbl_hdl)
1829{
1830 return -EPERM;
1831}
1832
1833static inline int ipa_query_rt_index(struct ipa_ioc_get_rt_tbl_indx *in)
1834{
1835 return -EPERM;
1836}
1837
1838static inline int ipa_mdfy_rt_rule(struct ipa_ioc_mdfy_rt_rule *rules)
1839{
1840 return -EPERM;
1841}
1842
1843/*
1844 * Filtering
1845 */
1846static inline int ipa_add_flt_rule(struct ipa_ioc_add_flt_rule *rules)
1847{
1848 return -EPERM;
1849}
1850
Skylar Chang68c37d82018-04-07 16:42:36 -07001851static inline int ipa_add_flt_rule_usr(struct ipa_ioc_add_flt_rule *rules,
1852 bool user_only)
1853{
1854 return -EPERM;
1855}
1856
Amir Levy9659e592016-10-27 18:08:27 +03001857static inline int ipa_del_flt_rule(struct ipa_ioc_del_flt_rule *hdls)
1858{
1859 return -EPERM;
1860}
1861
1862static inline int ipa_mdfy_flt_rule(struct ipa_ioc_mdfy_flt_rule *rules)
1863{
1864 return -EPERM;
1865}
1866
1867static inline int ipa_commit_flt(enum ipa_ip_type ip)
1868{
1869 return -EPERM;
1870}
1871
Skylar Chang68c37d82018-04-07 16:42:36 -07001872static inline int ipa_reset_flt(enum ipa_ip_type ip, bool user_only)
Amir Levy9659e592016-10-27 18:08:27 +03001873{
1874 return -EPERM;
1875}
1876
1877/*
1878 * NAT
1879 */
Amir Levy479cfdd2017-10-26 12:23:14 +03001880static inline int ipa_allocate_nat_device(struct ipa_ioc_nat_alloc_mem *mem)
Amir Levy9659e592016-10-27 18:08:27 +03001881{
1882 return -EPERM;
1883}
1884
Amir Levy479cfdd2017-10-26 12:23:14 +03001885static inline int ipa_allocate_nat_table(
1886 struct ipa_ioc_nat_ipv6ct_table_alloc *table_alloc)
1887{
1888 return -EPERM;
1889}
1890
1891static inline int ipa_allocate_ipv6ct_table(
1892 struct ipa_ioc_nat_ipv6ct_table_alloc *table_alloc)
1893{
1894 return -EPERM;
1895}
Amir Levy9659e592016-10-27 18:08:27 +03001896
1897static inline int ipa_nat_init_cmd(struct ipa_ioc_v4_nat_init *init)
1898{
1899 return -EPERM;
1900}
1901
Amir Levy479cfdd2017-10-26 12:23:14 +03001902static inline int ipa_ipv6ct_init_cmd(struct ipa_ioc_ipv6ct_init *init)
1903{
1904 return -EPERM;
1905}
Amir Levy9659e592016-10-27 18:08:27 +03001906
1907static inline int ipa_nat_dma_cmd(struct ipa_ioc_nat_dma_cmd *dma)
1908{
1909 return -EPERM;
1910}
1911
Amir Levy479cfdd2017-10-26 12:23:14 +03001912static inline int ipa_table_dma_cmd(struct ipa_ioc_nat_dma_cmd *dma)
1913{
1914 return -EPERM;
1915}
Amir Levy9659e592016-10-27 18:08:27 +03001916
1917static inline int ipa_nat_del_cmd(struct ipa_ioc_v4_nat_del *del)
1918{
1919 return -EPERM;
1920}
1921
Amir Levy479cfdd2017-10-26 12:23:14 +03001922static inline int ipa_del_nat_table(struct ipa_ioc_nat_ipv6ct_table_del *del)
1923{
1924 return -EPERM;
1925}
1926
1927static inline int ipa_del_ipv6ct_table(
1928 struct ipa_ioc_nat_ipv6ct_table_del *del)
1929{
1930 return -EPERM;
1931}
1932
1933static inline int ipa_nat_mdfy_pdn(struct ipa_ioc_nat_pdn_entry *mdfy_pdn)
1934{
1935 return -EPERM;
1936}
1937
Amir Levy9659e592016-10-27 18:08:27 +03001938/*
1939 * Messaging
1940 */
1941static inline int ipa_send_msg(struct ipa_msg_meta *meta, void *buff,
1942 ipa_msg_free_fn callback)
1943{
1944 return -EPERM;
1945}
1946
1947static inline int ipa_register_pull_msg(struct ipa_msg_meta *meta,
1948 ipa_msg_pull_fn callback)
1949{
1950 return -EPERM;
1951}
1952
1953static inline int ipa_deregister_pull_msg(struct ipa_msg_meta *meta)
1954{
1955 return -EPERM;
1956}
1957
1958/*
1959 * Interface
1960 */
1961static inline int ipa_register_intf(const char *name,
1962 const struct ipa_tx_intf *tx,
1963 const struct ipa_rx_intf *rx)
1964{
1965 return -EPERM;
1966}
1967
1968static inline int ipa_register_intf_ext(const char *name,
1969 const struct ipa_tx_intf *tx,
1970 const struct ipa_rx_intf *rx,
1971 const struct ipa_ext_intf *ext)
1972{
1973 return -EPERM;
1974}
1975
1976static inline int ipa_deregister_intf(const char *name)
1977{
1978 return -EPERM;
1979}
1980
1981/*
1982 * Aggregation
1983 */
1984static inline int ipa_set_aggr_mode(enum ipa_aggr_mode mode)
1985{
1986 return -EPERM;
1987}
1988
1989static inline int ipa_set_qcncm_ndp_sig(char sig[3])
1990{
1991 return -EPERM;
1992}
1993
1994static inline int ipa_set_single_ndp_per_mbim(bool enable)
1995{
1996 return -EPERM;
1997}
1998
1999/*
2000 * Data path
2001 */
2002static inline int ipa_tx_dp(enum ipa_client_type dst, struct sk_buff *skb,
2003 struct ipa_tx_meta *metadata)
2004{
2005 return -EPERM;
2006}
2007
2008/*
2009 * To transfer multiple data packets
2010 */
2011static inline int ipa_tx_dp_mul(
2012 enum ipa_client_type dst,
2013 struct ipa_tx_data_desc *data_desc)
2014{
2015 return -EPERM;
2016}
2017
2018static inline void ipa_free_skb(struct ipa_rx_data *rx_in)
2019{
2020}
2021
2022static inline int ipa_rx_poll(u32 clnt_hdl, int budget)
2023{
2024 return -EPERM;
2025}
2026
2027static inline void ipa_recycle_wan_skb(struct sk_buff *skb)
2028{
2029}
2030
2031/*
2032 * System pipes
2033 */
2034static inline u16 ipa_get_smem_restr_bytes(void)
2035{
2036 return -EPERM;
2037}
2038
2039static inline int ipa_setup_sys_pipe(struct ipa_sys_connect_params *sys_in,
2040 u32 *clnt_hdl)
2041{
2042 return -EPERM;
2043}
2044
2045static inline int ipa_teardown_sys_pipe(u32 clnt_hdl)
2046{
2047 return -EPERM;
2048}
2049
2050static inline int ipa_connect_wdi_pipe(struct ipa_wdi_in_params *in,
2051 struct ipa_wdi_out_params *out)
2052{
2053 return -EPERM;
2054}
2055
2056static inline int ipa_disconnect_wdi_pipe(u32 clnt_hdl)
2057{
2058 return -EPERM;
2059}
2060
2061static inline int ipa_enable_wdi_pipe(u32 clnt_hdl)
2062{
2063 return -EPERM;
2064}
2065
2066static inline int ipa_disable_wdi_pipe(u32 clnt_hdl)
2067{
2068 return -EPERM;
2069}
2070
2071static inline int ipa_resume_wdi_pipe(u32 clnt_hdl)
2072{
2073 return -EPERM;
2074}
2075
2076static inline int ipa_suspend_wdi_pipe(u32 clnt_hdl)
2077{
2078 return -EPERM;
2079}
2080
Skylar Changfcf36c22016-10-04 14:15:25 -07002081static inline int ipa_broadcast_wdi_quota_reach_ind(uint32_t fid,
2082 uint64_t num_bytes)
2083{
2084 return -EPERM;
2085}
2086
Amir Levy9659e592016-10-27 18:08:27 +03002087static inline int ipa_uc_wdi_get_dbpa(
2088 struct ipa_wdi_db_params *out)
2089{
2090 return -EPERM;
2091}
2092
2093static inline int ipa_uc_reg_rdyCB(
2094 struct ipa_wdi_uc_ready_params *param)
2095{
2096 return -EPERM;
2097}
2098
2099static inline int ipa_uc_dereg_rdyCB(void)
2100{
2101 return -EPERM;
2102}
2103
2104
2105/*
2106 * Resource manager
2107 */
2108static inline int ipa_rm_create_resource(
2109 struct ipa_rm_create_params *create_params)
2110{
2111 return -EPERM;
2112}
2113
2114static inline int ipa_rm_delete_resource(
2115 enum ipa_rm_resource_name resource_name)
2116{
2117 return -EPERM;
2118}
2119
2120static inline int ipa_rm_register(enum ipa_rm_resource_name resource_name,
2121 struct ipa_rm_register_params *reg_params)
2122{
2123 return -EPERM;
2124}
2125
2126static inline int ipa_rm_set_perf_profile(
2127 enum ipa_rm_resource_name resource_name,
2128 struct ipa_rm_perf_profile *profile)
2129{
2130 return -EPERM;
2131}
2132
2133static inline int ipa_rm_deregister(enum ipa_rm_resource_name resource_name,
2134 struct ipa_rm_register_params *reg_params)
2135{
2136 return -EPERM;
2137}
2138
2139static inline int ipa_rm_add_dependency(
2140 enum ipa_rm_resource_name resource_name,
2141 enum ipa_rm_resource_name depends_on_name)
2142{
2143 return -EPERM;
2144}
2145
2146static inline int ipa_rm_add_dependency_sync(
2147 enum ipa_rm_resource_name resource_name,
2148 enum ipa_rm_resource_name depends_on_name)
2149{
2150 return -EPERM;
2151}
2152
2153static inline int ipa_rm_delete_dependency(
2154 enum ipa_rm_resource_name resource_name,
2155 enum ipa_rm_resource_name depends_on_name)
2156{
2157 return -EPERM;
2158}
2159
2160static inline int ipa_rm_request_resource(
2161 enum ipa_rm_resource_name resource_name)
2162{
2163 return -EPERM;
2164}
2165
2166static inline int ipa_rm_release_resource(
2167 enum ipa_rm_resource_name resource_name)
2168{
2169 return -EPERM;
2170}
2171
2172static inline int ipa_rm_notify_completion(enum ipa_rm_event event,
2173 enum ipa_rm_resource_name resource_name)
2174{
2175 return -EPERM;
2176}
2177
2178static inline int ipa_rm_inactivity_timer_init(
2179 enum ipa_rm_resource_name resource_name,
2180 unsigned long msecs)
2181{
2182 return -EPERM;
2183}
2184
2185static inline int ipa_rm_inactivity_timer_destroy(
2186 enum ipa_rm_resource_name resource_name)
2187{
2188 return -EPERM;
2189}
2190
2191static inline int ipa_rm_inactivity_timer_request_resource(
2192 enum ipa_rm_resource_name resource_name)
2193{
2194 return -EPERM;
2195}
2196
2197static inline int ipa_rm_inactivity_timer_release_resource(
2198 enum ipa_rm_resource_name resource_name)
2199{
2200 return -EPERM;
2201}
2202
2203/*
2204 * Tethering bridge (Rmnet / MBIM)
2205 */
2206static inline int teth_bridge_init(struct teth_bridge_init_params *params)
2207{
2208 return -EPERM;
2209}
2210
2211static inline int teth_bridge_disconnect(enum ipa_client_type client)
2212{
2213 return -EPERM;
2214}
2215
2216static inline int teth_bridge_connect(struct teth_bridge_connect_params
2217 *connect_params)
2218{
2219 return -EPERM;
2220}
2221
2222/*
2223 * Tethering client info
2224 */
2225static inline void ipa_set_client(int index, enum ipacm_client_enum client,
2226 bool uplink)
2227{
2228}
2229
2230static inline enum ipacm_client_enum ipa_get_client(int pipe_idx)
2231{
2232 return -EPERM;
2233}
2234
2235static inline bool ipa_get_client_uplink(int pipe_idx)
2236{
2237 return -EPERM;
2238}
2239
2240/*
2241 * IPADMA
2242 */
2243static inline int ipa_dma_init(void)
2244{
2245 return -EPERM;
2246}
2247
2248static inline int ipa_dma_enable(void)
2249{
2250 return -EPERM;
2251}
2252
2253static inline int ipa_dma_disable(void)
2254{
2255 return -EPERM;
2256}
2257
2258static inline int ipa_dma_sync_memcpy(phys_addr_t dest, phys_addr_t src
2259 , int len)
2260{
2261 return -EPERM;
2262}
2263
2264static inline int ipa_dma_async_memcpy(phys_addr_t dest, phys_addr_t src
2265 , int len, void (*user_cb)(void *user1),
2266 void *user_param)
2267{
2268 return -EPERM;
2269}
2270
2271static inline int ipa_dma_uc_memcpy(phys_addr_t dest, phys_addr_t src, int len)
2272{
2273 return -EPERM;
2274}
2275
2276static inline void ipa_dma_destroy(void)
2277{
2278}
2279
2280/*
2281 * mux id
2282 */
2283static inline int ipa_write_qmap_id(struct ipa_ioc_write_qmapid *param_in)
2284{
2285 return -EPERM;
2286}
2287
2288/*
2289 * interrupts
2290 */
2291static inline int ipa_add_interrupt_handler(enum ipa_irq_type interrupt,
2292 ipa_irq_handler_t handler,
2293 bool deferred_flag,
2294 void *private_data)
2295{
2296 return -EPERM;
2297}
2298
2299static inline int ipa_remove_interrupt_handler(enum ipa_irq_type interrupt)
2300{
2301 return -EPERM;
2302}
2303
2304static inline int ipa_restore_suspend_handler(void)
2305{
2306 return -EPERM;
2307}
2308
2309/*
2310 * Miscellaneous
2311 */
2312static inline void ipa_bam_reg_dump(void)
2313{
2314}
2315
2316static inline int ipa_get_wdi_stats(struct IpaHwStatsWDIInfoData_t *stats)
2317{
2318 return -EPERM;
2319}
2320
2321static inline int ipa_get_ep_mapping(enum ipa_client_type client)
2322{
2323 return -EPERM;
2324}
2325
2326static inline bool ipa_is_ready(void)
2327{
2328 return false;
2329}
2330
2331static inline void ipa_proxy_clk_vote(void)
2332{
2333}
2334
2335static inline void ipa_proxy_clk_unvote(void)
2336{
2337}
2338
2339static inline enum ipa_hw_type ipa_get_hw_type(void)
2340{
2341 return IPA_HW_None;
2342}
2343
2344static inline bool ipa_is_client_handle_valid(u32 clnt_hdl)
2345{
2346 return -EINVAL;
2347}
2348
2349static inline enum ipa_client_type ipa_get_client_mapping(int pipe_idx)
2350{
2351 return -EINVAL;
2352}
2353
2354static inline enum ipa_rm_resource_name ipa_get_rm_resource_from_ep(
2355 int pipe_idx)
2356{
2357 return -EFAULT;
2358}
2359
2360static inline bool ipa_get_modem_cfg_emb_pipe_flt(void)
2361{
2362 return -EINVAL;
2363}
2364
2365static inline enum ipa_transport_type ipa_get_transport_type(void)
2366{
2367 return -EFAULT;
2368}
2369
2370static inline struct device *ipa_get_dma_dev(void)
2371{
2372 return NULL;
2373}
2374
2375static inline struct iommu_domain *ipa_get_smmu_domain(void)
2376{
2377 return NULL;
2378}
2379
2380static inline int ipa_create_wdi_mapping(u32 num_buffers,
2381 struct ipa_wdi_buffer_info *info)
2382{
2383 return -EINVAL;
2384}
2385
2386static inline int ipa_release_wdi_mapping(u32 num_buffers,
2387 struct ipa_wdi_buffer_info *info)
2388{
2389 return -EINVAL;
2390}
2391
2392static inline int ipa_disable_apps_wan_cons_deaggr(void)
2393{
2394 return -EINVAL;
2395}
2396
Amir Levy3be373c2017-03-05 16:31:30 +02002397static inline const struct ipa_gsi_ep_config *ipa_get_gsi_ep_info
2398 (enum ipa_client_type client)
Amir Levy9659e592016-10-27 18:08:27 +03002399{
2400 return NULL;
2401}
2402
2403static inline int ipa_stop_gsi_channel(u32 clnt_hdl)
2404{
2405 return -EPERM;
2406}
2407
2408static inline int ipa_register_ipa_ready_cb(
2409 void (*ipa_ready_cb)(void *user_data),
2410 void *user_data)
2411{
2412 return -EPERM;
2413}
2414
Skylar Chang48afa052017-10-25 09:32:57 -07002415static inline int ipa_tz_unlock_reg(struct ipa_tz_unlock_reg_info *reg_info,
2416 u16 num_regs)
2417{
2418 return -EPERM;
2419}
2420
Michael Adisumartad04e6d62017-11-09 17:46:35 -08002421
2422static inline int ipa_get_smmu_params(struct ipa_smmu_in_params *in,
2423 struct ipa_smmu_out_params *out)
2424{
2425 return -EPERM;
2426}
Amir Levy2da9d452017-12-12 10:09:46 +02002427
2428static inline int ipa_is_vlan_mode(enum ipa_vlan_ifaces iface, bool *res)
2429{
2430 return -EPERM;
2431}
Amir Levy8fb98e02019-10-29 14:22:26 +02002432
2433static inline bool ipa_get_lan_rx_napi(void)
2434{
2435 return false;
2436}
Amir Levy9659e592016-10-27 18:08:27 +03002437#endif /* (CONFIG_IPA || CONFIG_IPA3) */
2438
2439#endif /* _IPA_H_ */