Siva Kumar Akkireddi | 8373588 | 2019-04-05 15:33:40 +0530 | [diff] [blame] | 1 | /* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 2 | * |
| 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 A | a39a433 | 2018-06-26 20:27:01 +0530 | [diff] [blame] | 13 | #ifndef __MSM_MHI_DEV_H |
| 14 | #define __MSM_MHI_DEV_H |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 15 | |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 16 | #include <linux/types.h> |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 17 | #include <linux/dma-mapping.h> |
| 18 | |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 19 | #define IPA_DMA_SYNC 1 |
| 20 | #define IPA_DMA_ASYNC 0 |
Siva Kumar Akkireddi | 0f82ea3 | 2019-11-11 14:56:01 +0530 | [diff] [blame] | 21 | #define DMA_SYNC 1 |
| 22 | #define DMA_ASYNC 0 |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 23 | |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 24 | enum cb_reason { |
| 25 | MHI_DEV_TRE_AVAILABLE = 0, |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 26 | MHI_DEV_CTRL_UPDATE, |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 27 | }; |
| 28 | |
| 29 | struct mhi_dev_client_cb_reason { |
| 30 | uint32_t ch_id; |
| 31 | enum cb_reason reason; |
| 32 | }; |
| 33 | |
| 34 | struct 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 A | a39a433 | 2018-06-26 20:27:01 +0530 | [diff] [blame] | 56 | enum mhi_ctrl_info { |
| 57 | MHI_STATE_CONFIGURED = 0, |
| 58 | MHI_STATE_CONNECTED = 1, |
| 59 | MHI_STATE_DISCONNECTED = 2, |
| 60 | MHI_STATE_INVAL, |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 61 | }; |
| 62 | |
| 63 | struct 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 Akkireddi | fc10c67 | 2018-09-27 13:15:02 +0530 | [diff] [blame] | 72 | size_t transfer_len; |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 73 | 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 Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 78 | }; |
| 79 | |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 80 | /* SW channel client list */ |
| 81 | enum 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 Akkireddi | 6fb2e4d | 2018-07-31 15:25:06 +0530 | [diff] [blame] | 118 | MHI_CLIENT_ADB_OUT = 36, |
| 119 | MHI_CLIENT_ADB_IN = 37, |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 120 | 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 Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 128 | MHI_CLIENT_IP_SW_4_OUT = 46, |
| 129 | MHI_CLIENT_IP_SW_4_IN = 47, |
Siva Kumar Akkireddi | f56578c | 2018-06-07 00:40:56 +0530 | [diff] [blame] | 130 | MHI_MAX_SOFTWARE_CHANNELS, |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 131 | 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 Akkireddi | 859701c | 2018-10-03 17:35:30 +0530 | [diff] [blame] | 137 | MHI_CLIENT_ADPL_IN = 102, |
Rama Krishna Phani A | 1b235ff | 2019-06-25 15:13:48 +0530 | [diff] [blame] | 138 | MHI_CLIENT_IP_HW_1_OUT = 105, |
| 139 | MHI_CLIENT_IP_HW_1_IN = 106, |
| 140 | MHI_CLIENT_RESERVED_2_LOWER = 107, |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 141 | MHI_CLIENT_RESERVED_2_UPPER = 127, |
Rama Krishna Phani A | 1b235ff | 2019-06-25 15:13:48 +0530 | [diff] [blame] | 142 | MHI_MAX_CHANNELS = 107, |
Siva Kumar Akkireddi | 016427d | 2018-05-25 20:19:45 +0530 | [diff] [blame] | 143 | MHI_CLIENT_INVALID = 0xFFFFFFFF |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 144 | }; |
| 145 | |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 146 | struct mhi_dev_client_cb_data { |
| 147 | void *user_data; |
| 148 | enum mhi_client_channel channel; |
| 149 | enum mhi_ctrl_info ctrl_info; |
| 150 | }; |
| 151 | |
| 152 | typedef void (*mhi_state_cb)(struct mhi_dev_client_cb_data *cb_dat); |
| 153 | |
| 154 | struct 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 A | a39a433 | 2018-06-26 20:27:01 +0530 | [diff] [blame] | 160 | #if defined(CONFIG_MSM_MHI_DEV) |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 161 | /** |
| 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 | */ |
| 168 | int 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 A | a39a433 | 2018-06-26 20:27:01 +0530 | [diff] [blame] | 171 | |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 172 | /** |
| 173 | * mhi_dev_close_channel() - Channel close for a given client. |
| 174 | */ |
| 175 | int mhi_dev_close_channel(struct mhi_dev_client *handle_client); |
| 176 | |
| 177 | /** |
| 178 | * mhi_dev_read_channel() - Channel read for a given client |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 179 | * @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 Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 183 | */ |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 184 | int mhi_dev_read_channel(struct mhi_req *mreq); |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 185 | |
| 186 | /** |
| 187 | * mhi_dev_write_channel() - Channel write for a given software client. |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 188 | * @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 Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 192 | */ |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 193 | int mhi_dev_write_channel(struct mhi_req *wreq); |
Siddartha Mohanadoss | 603f765 | 2017-01-26 15:59:41 -0800 | [diff] [blame] | 194 | |
| 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 | */ |
| 199 | int mhi_dev_channel_isempty(struct mhi_dev_client *handle); |
| 200 | |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 201 | /** |
Siva Kumar Akkireddi | 0f82ea3 | 2019-11-11 14:56:01 +0530 | [diff] [blame] | 202 | * 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 | */ |
| 206 | bool mhi_dev_channel_has_pending_write(struct mhi_dev_client *handle); |
| 207 | |
| 208 | /** |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 209 | * mhi_ctrl_state_info() - Provide MHI state info |
Siddartha Mohanadoss | ba314f2 | 2018-03-19 15:43:50 -0700 | [diff] [blame] | 210 | * @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 Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 213 | * 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 Mohanadoss | ba314f2 | 2018-03-19 15:43:50 -0700 | [diff] [blame] | 220 | int mhi_ctrl_state_info(uint32_t idx, uint32_t *info); |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 221 | |
| 222 | /** |
Siddartha Mohanadoss | e095433 | 2018-01-15 14:03:03 -0800 | [diff] [blame] | 223 | * mhi_register_state_cb() - Clients can register and receive callback after |
| 224 | * MHI channel is connected or disconnected. |
| 225 | */ |
| 226 | int 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 A | a39a433 | 2018-06-26 20:27:01 +0530 | [diff] [blame] | 229 | |
| 230 | #else |
| 231 | static 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 | |
| 238 | static inline int mhi_dev_close_channel(struct mhi_dev_client *handle_client) |
| 239 | { |
| 240 | return -EINVAL; |
| 241 | }; |
| 242 | |
| 243 | static inline int mhi_dev_read_channel(struct mhi_req *mreq) |
| 244 | { |
| 245 | return -EINVAL; |
| 246 | }; |
| 247 | |
| 248 | static inline int mhi_dev_write_channel(struct mhi_req *wreq) |
| 249 | { |
| 250 | return -EINVAL; |
| 251 | }; |
| 252 | |
| 253 | static inline int mhi_dev_channel_isempty(struct mhi_dev_client *handle) |
| 254 | { |
| 255 | return -EINVAL; |
| 256 | }; |
| 257 | |
Siva Kumar Akkireddi | 0f82ea3 | 2019-11-11 14:56:01 +0530 | [diff] [blame] | 258 | static inline bool mhi_dev_channel_has_pending_write |
| 259 | (struct mhi_dev_client *handle) |
| 260 | { |
| 261 | return false; |
| 262 | } |
| 263 | |
Rama Krishna Phani A | a39a433 | 2018-06-26 20:27:01 +0530 | [diff] [blame] | 264 | static inline int mhi_ctrl_state_info(uint32_t idx, uint32_t *info) |
| 265 | { |
| 266 | return -EINVAL; |
| 267 | }; |
| 268 | |
| 269 | static 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*/ |