blob: 16056875999097b872d6032e2591e25555bf6074 [file] [log] [blame]
Siva Kumar Akkireddi83735882019-04-05 15:33:40 +05301/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -08002 *
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
Rama Krishna Phani Aa39a4332018-06-26 20:27:01 +053013#ifndef __MSM_MHI_DEV_H
14#define __MSM_MHI_DEV_H
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -080015
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -080016#include <linux/types.h>
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -080017#include <linux/dma-mapping.h>
18
Siddartha Mohanadosse0954332018-01-15 14:03:03 -080019#define IPA_DMA_SYNC 1
20#define IPA_DMA_ASYNC 0
Siva Kumar Akkireddi0f82ea32019-11-11 14:56:01 +053021#define DMA_SYNC 1
22#define DMA_ASYNC 0
Siddartha Mohanadosse0954332018-01-15 14:03:03 -080023
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -080024enum cb_reason {
25 MHI_DEV_TRE_AVAILABLE = 0,
Siddartha Mohanadosse0954332018-01-15 14:03:03 -080026 MHI_DEV_CTRL_UPDATE,
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -080027};
28
29struct mhi_dev_client_cb_reason {
30 uint32_t ch_id;
31 enum cb_reason reason;
32};
33
34struct mhi_dev_client {
35 struct list_head list;
36 struct mhi_dev_channel *channel;
37 void (*event_trigger)(struct mhi_dev_client_cb_reason *cb);
38
39 /* mhi_dev calls are fully synchronous -- only one call may be
40 * active per client at a time for now.
41 */
42 struct mutex write_lock;
43 wait_queue_head_t wait;
44
45 /* trace logs */
46 spinlock_t tr_lock;
47 unsigned int tr_head;
48 unsigned int tr_tail;
49 struct mhi_dev_trace *tr_log;
50
51 /* client buffers */
52 struct mhi_dev_iov *iov;
53 uint32_t nr_iov;
54};
55
Rama Krishna Phani Aa39a4332018-06-26 20:27:01 +053056enum mhi_ctrl_info {
57 MHI_STATE_CONFIGURED = 0,
58 MHI_STATE_CONNECTED = 1,
59 MHI_STATE_DISCONNECTED = 2,
60 MHI_STATE_INVAL,
Siddartha Mohanadosse0954332018-01-15 14:03:03 -080061};
62
63struct mhi_req {
64 u32 chan;
65 u32 mode;
66 u32 chain;
67 void *buf;
68 dma_addr_t dma;
69 u32 snd_cmpl;
70 void *context;
71 size_t len;
Siva Kumar Akkireddifc10c672018-09-27 13:15:02 +053072 size_t transfer_len;
Siddartha Mohanadosse0954332018-01-15 14:03:03 -080073 uint32_t rd_offset;
74 struct mhi_dev_client *client;
75 struct list_head list;
76 union mhi_dev_ring_element_type *el;
77 void (*client_cb)(void *req);
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -080078};
79
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -080080/* SW channel client list */
81enum mhi_client_channel {
82 MHI_CLIENT_LOOPBACK_OUT = 0,
83 MHI_CLIENT_LOOPBACK_IN = 1,
84 MHI_CLIENT_SAHARA_OUT = 2,
85 MHI_CLIENT_SAHARA_IN = 3,
86 MHI_CLIENT_DIAG_OUT = 4,
87 MHI_CLIENT_DIAG_IN = 5,
88 MHI_CLIENT_SSR_OUT = 6,
89 MHI_CLIENT_SSR_IN = 7,
90 MHI_CLIENT_QDSS_OUT = 8,
91 MHI_CLIENT_QDSS_IN = 9,
92 MHI_CLIENT_EFS_OUT = 10,
93 MHI_CLIENT_EFS_IN = 11,
94 MHI_CLIENT_MBIM_OUT = 12,
95 MHI_CLIENT_MBIM_IN = 13,
96 MHI_CLIENT_QMI_OUT = 14,
97 MHI_CLIENT_QMI_IN = 15,
98 MHI_CLIENT_IP_CTRL_0_OUT = 16,
99 MHI_CLIENT_IP_CTRL_0_IN = 17,
100 MHI_CLIENT_IP_CTRL_1_OUT = 18,
101 MHI_CLIENT_IP_CTRL_1_IN = 19,
102 MHI_CLIENT_DCI_OUT = 20,
103 MHI_CLIENT_DCI_IN = 21,
104 MHI_CLIENT_IP_CTRL_3_OUT = 22,
105 MHI_CLIENT_IP_CTRL_3_IN = 23,
106 MHI_CLIENT_IP_CTRL_4_OUT = 24,
107 MHI_CLIENT_IP_CTRL_4_IN = 25,
108 MHI_CLIENT_IP_CTRL_5_OUT = 26,
109 MHI_CLIENT_IP_CTRL_5_IN = 27,
110 MHI_CLIENT_IP_CTRL_6_OUT = 28,
111 MHI_CLIENT_IP_CTRL_6_IN = 29,
112 MHI_CLIENT_IP_CTRL_7_OUT = 30,
113 MHI_CLIENT_IP_CTRL_7_IN = 31,
114 MHI_CLIENT_DUN_OUT = 32,
115 MHI_CLIENT_DUN_IN = 33,
116 MHI_CLIENT_IP_SW_0_OUT = 34,
117 MHI_CLIENT_IP_SW_0_IN = 35,
Siva Kumar Akkireddi6fb2e4d2018-07-31 15:25:06 +0530118 MHI_CLIENT_ADB_OUT = 36,
119 MHI_CLIENT_ADB_IN = 37,
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -0800120 MHI_CLIENT_IP_SW_2_OUT = 38,
121 MHI_CLIENT_IP_SW_2_IN = 39,
122 MHI_CLIENT_IP_SW_3_OUT = 40,
123 MHI_CLIENT_IP_SW_3_IN = 41,
124 MHI_CLIENT_CSVT_OUT = 42,
125 MHI_CLIENT_CSVT_IN = 43,
126 MHI_CLIENT_SMCT_OUT = 44,
127 MHI_CLIENT_SMCT_IN = 45,
Siddartha Mohanadosse0954332018-01-15 14:03:03 -0800128 MHI_CLIENT_IP_SW_4_OUT = 46,
129 MHI_CLIENT_IP_SW_4_IN = 47,
Siva Kumar Akkireddif56578c2018-06-07 00:40:56 +0530130 MHI_MAX_SOFTWARE_CHANNELS,
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -0800131 MHI_CLIENT_TEST_OUT = 60,
132 MHI_CLIENT_TEST_IN = 61,
133 MHI_CLIENT_RESERVED_1_LOWER = 62,
134 MHI_CLIENT_RESERVED_1_UPPER = 99,
135 MHI_CLIENT_IP_HW_0_OUT = 100,
136 MHI_CLIENT_IP_HW_0_IN = 101,
Siva Kumar Akkireddi859701c2018-10-03 17:35:30 +0530137 MHI_CLIENT_ADPL_IN = 102,
Rama Krishna Phani A1b235ff2019-06-25 15:13:48 +0530138 MHI_CLIENT_IP_HW_1_OUT = 105,
139 MHI_CLIENT_IP_HW_1_IN = 106,
140 MHI_CLIENT_RESERVED_2_LOWER = 107,
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -0800141 MHI_CLIENT_RESERVED_2_UPPER = 127,
Rama Krishna Phani A1b235ff2019-06-25 15:13:48 +0530142 MHI_MAX_CHANNELS = 107,
Siva Kumar Akkireddi016427d2018-05-25 20:19:45 +0530143 MHI_CLIENT_INVALID = 0xFFFFFFFF
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -0800144};
145
Siddartha Mohanadosse0954332018-01-15 14:03:03 -0800146struct mhi_dev_client_cb_data {
147 void *user_data;
148 enum mhi_client_channel channel;
149 enum mhi_ctrl_info ctrl_info;
150};
151
152typedef void (*mhi_state_cb)(struct mhi_dev_client_cb_data *cb_dat);
153
154struct mhi_dev_ready_cb_info {
155 struct list_head list;
156 mhi_state_cb cb;
157 struct mhi_dev_client_cb_data cb_data;
158};
159
Rama Krishna Phani Aa39a4332018-06-26 20:27:01 +0530160#if defined(CONFIG_MSM_MHI_DEV)
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -0800161/**
162 * mhi_dev_open_channel() - Channel open for a given client done prior
163 * to read/write.
164 * @chan_id: Software Channel ID for the assigned client.
165 * @handle_client: Structure device for client handle.
166 * @notifier: Client issued callback notification.
167 */
168int mhi_dev_open_channel(uint32_t chan_id,
169 struct mhi_dev_client **handle_client,
170 void (*event_trigger)(struct mhi_dev_client_cb_reason *cb));
Rama Krishna Phani Aa39a4332018-06-26 20:27:01 +0530171
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -0800172/**
173 * mhi_dev_close_channel() - Channel close for a given client.
174 */
175int mhi_dev_close_channel(struct mhi_dev_client *handle_client);
176
177/**
178 * mhi_dev_read_channel() - Channel read for a given client
Siddartha Mohanadosse0954332018-01-15 14:03:03 -0800179 * @mreq: mreq is the client argument which includes meta info
180 * like write data location, buffer len, read offset, mode,
181 * chain and client call back function which will be invoked
182 * when data read is completed.
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -0800183 */
Siddartha Mohanadosse0954332018-01-15 14:03:03 -0800184int mhi_dev_read_channel(struct mhi_req *mreq);
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -0800185
186/**
187 * mhi_dev_write_channel() - Channel write for a given software client.
Siddartha Mohanadosse0954332018-01-15 14:03:03 -0800188 * @wreq wreq is the client argument which includes meta info like
189 * client handle, read data location, buffer length, mode,
190 * and client call back function which will free the packet.
191 * when data write is completed.
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -0800192 */
Siddartha Mohanadosse0954332018-01-15 14:03:03 -0800193int mhi_dev_write_channel(struct mhi_req *wreq);
Siddartha Mohanadoss603f7652017-01-26 15:59:41 -0800194
195/**
196 * mhi_dev_channel_isempty() - Checks if there is any pending TRE's to process.
197 * @handle_client: Client Handle issued during mhi_dev_open_channel
198 */
199int mhi_dev_channel_isempty(struct mhi_dev_client *handle);
200
Siddartha Mohanadosse0954332018-01-15 14:03:03 -0800201/**
Siva Kumar Akkireddi0f82ea32019-11-11 14:56:01 +0530202* mhi_dev_channel_has_pending_write() - Checks if there are any pending writes
203* to be completed on inbound channel
204* @handle_client: Client Handle issued during mhi_dev_open_channel
205*/
206bool mhi_dev_channel_has_pending_write(struct mhi_dev_client *handle);
207
208/**
Siddartha Mohanadosse0954332018-01-15 14:03:03 -0800209 * mhi_ctrl_state_info() - Provide MHI state info
Siddartha Mohanadossba314f22018-03-19 15:43:50 -0700210 * @idx: Channel number idx. Look at channel_state_info and
211 * pass the index for the corresponding channel.
212 * @info: Return the control info.
Siddartha Mohanadosse0954332018-01-15 14:03:03 -0800213 * MHI_STATE=CONFIGURED - MHI device is present but not ready
214 * for data traffic.
215 * MHI_STATE=CONNECTED - MHI device is ready for data transfer.
216 * MHI_STATE=DISCONNECTED - MHI device has its pipes suspended.
217 * exposes device nodes for the supported MHI software
218 * channels.
219 */
Siddartha Mohanadossba314f22018-03-19 15:43:50 -0700220int mhi_ctrl_state_info(uint32_t idx, uint32_t *info);
Siddartha Mohanadosse0954332018-01-15 14:03:03 -0800221
222/**
Siddartha Mohanadosse0954332018-01-15 14:03:03 -0800223 * mhi_register_state_cb() - Clients can register and receive callback after
224 * MHI channel is connected or disconnected.
225 */
226int mhi_register_state_cb(void (*mhi_state_cb)
227 (struct mhi_dev_client_cb_data *cb_data), void *data,
228 enum mhi_client_channel channel);
Rama Krishna Phani Aa39a4332018-06-26 20:27:01 +0530229
230#else
231static inline int mhi_dev_open_channel(uint32_t chan_id,
232 struct mhi_dev_client **handle_client,
233 void (*event_trigger)(struct mhi_dev_client_cb_reason *cb))
234{
235 return -EINVAL;
236};
237
238static inline int mhi_dev_close_channel(struct mhi_dev_client *handle_client)
239{
240 return -EINVAL;
241};
242
243static inline int mhi_dev_read_channel(struct mhi_req *mreq)
244{
245 return -EINVAL;
246};
247
248static inline int mhi_dev_write_channel(struct mhi_req *wreq)
249{
250 return -EINVAL;
251};
252
253static inline int mhi_dev_channel_isempty(struct mhi_dev_client *handle)
254{
255 return -EINVAL;
256};
257
Siva Kumar Akkireddi0f82ea32019-11-11 14:56:01 +0530258static inline bool mhi_dev_channel_has_pending_write
259 (struct mhi_dev_client *handle)
260{
261 return false;
262}
263
Rama Krishna Phani Aa39a4332018-06-26 20:27:01 +0530264static inline int mhi_ctrl_state_info(uint32_t idx, uint32_t *info)
265{
266 return -EINVAL;
267};
268
269static inline int mhi_register_state_cb(void (*mhi_state_cb)
270 (struct mhi_dev_client_cb_data *cb_data), void *data,
271 enum mhi_client_channel channel)
272{
273 return -EINVAL;
274};
275#endif
276
277#endif /* _MSM_MHI_DEV_H*/