1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (c) 2022, Linaro Ltd.
9 #include <linux/dma-direction.h>
10 #include <linux/mhi.h>
12 #define MHI_EP_DEFAULT_MTU 0x8000
15 * struct mhi_ep_channel_config - Channel configuration structure for controller
16 * @name: The name of this channel
17 * @num: The number assigned to this channel
18 * @num_elements: The number of elements that can be queued to this channel
19 * @dir: Direction that data may flow on this channel
21 struct mhi_ep_channel_config
{
25 enum dma_data_direction dir
;
29 * struct mhi_ep_cntrl_config - MHI Endpoint controller configuration
30 * @mhi_version: MHI spec version supported by the controller
31 * @max_channels: Maximum number of channels supported
32 * @num_channels: Number of channels defined in @ch_cfg
33 * @ch_cfg: Array of defined channels
35 struct mhi_ep_cntrl_config
{
39 const struct mhi_ep_channel_config
*ch_cfg
;
43 * struct mhi_ep_db_info - MHI Endpoint doorbell info
44 * @mask: Mask of the doorbell interrupt
45 * @status: Status of the doorbell interrupt
47 struct mhi_ep_db_info
{
53 * struct mhi_ep_buf_info - MHI Endpoint transfer buffer info
54 * @mhi_dev: MHI device associated with this buffer
55 * @dev_addr: Address of the buffer in endpoint
56 * @host_addr: Address of the bufffer in host
57 * @size: Size of the buffer
58 * @code: Transfer completion code
59 * @cb: Callback to be executed by controller drivers after transfer completion (async)
60 * @cb_buf: Opaque buffer to be passed to the callback
62 struct mhi_ep_buf_info
{
63 struct mhi_ep_device
*mhi_dev
;
69 void (*cb
)(struct mhi_ep_buf_info
*buf_info
);
74 * struct mhi_ep_cntrl - MHI Endpoint controller structure
75 * @cntrl_dev: Pointer to the struct device of physical bus acting as the MHI
77 * @mhi_dev: MHI Endpoint device instance for the controller
78 * @mmio: MMIO region containing the MHI registers
79 * @mhi_chan: Points to the channel configuration table
80 * @mhi_event: Points to the event ring configurations table
81 * @mhi_cmd: Points to the command ring configurations table
82 * @sm: MHI Endpoint state machine
83 * @ch_ctx_cache: Cache of host channel context data structure
84 * @ev_ctx_cache: Cache of host event context data structure
85 * @cmd_ctx_cache: Cache of host command context data structure
86 * @ch_ctx_host_pa: Physical address of host channel context data structure
87 * @ev_ctx_host_pa: Physical address of host event context data structure
88 * @cmd_ctx_host_pa: Physical address of host command context data structure
89 * @ch_ctx_cache_phys: Physical address of the host channel context cache
90 * @ev_ctx_cache_phys: Physical address of the host event context cache
91 * @cmd_ctx_cache_phys: Physical address of the host command context cache
92 * @chdb: Array of channel doorbell interrupt info
93 * @event_lock: Lock for protecting event rings
94 * @state_lock: Lock for protecting state transitions
95 * @list_lock: Lock for protecting state transition and channel doorbell lists
96 * @st_transition_list: List of state transitions
97 * @ch_db_list: List of queued channel doorbells
98 * @wq: Dedicated workqueue for handling rings and state changes
99 * @state_work: State transition worker
100 * @reset_work: Worker for MHI Endpoint reset
101 * @cmd_ring_work: Worker for processing command rings
102 * @ch_ring_work: Worker for processing channel rings
103 * @raise_irq: CB function for raising IRQ to the host
104 * @alloc_map: CB function for allocating memory in endpoint for storing host context and mapping it
105 * @unmap_free: CB function to unmap and free the allocated memory in endpoint for storing host context
106 * @read_sync: CB function for reading from host memory synchronously
107 * @write_sync: CB function for writing to host memory synchronously
108 * @read_async: CB function for reading from host memory asynchronously
109 * @write_async: CB function for writing to host memory asynchronously
110 * @mhi_state: MHI Endpoint state
111 * @max_chan: Maximum channels supported by the endpoint controller
112 * @mru: MRU (Maximum Receive Unit) value of the endpoint controller
113 * @event_rings: Number of event rings supported by the endpoint controller
114 * @hw_event_rings: Number of hardware event rings supported by the endpoint controller
115 * @chdb_offset: Channel doorbell offset set by the host
116 * @erdb_offset: Event ring doorbell offset set by the host
117 * @index: MHI Endpoint controller index
118 * @irq: IRQ used by the endpoint controller
119 * @enabled: Check if the endpoint controller is enabled or not
121 struct mhi_ep_cntrl
{
122 struct device
*cntrl_dev
;
123 struct mhi_ep_device
*mhi_dev
;
126 struct mhi_ep_chan
*mhi_chan
;
127 struct mhi_ep_event
*mhi_event
;
128 struct mhi_ep_cmd
*mhi_cmd
;
129 struct mhi_ep_sm
*sm
;
131 struct mhi_chan_ctxt
*ch_ctx_cache
;
132 struct mhi_event_ctxt
*ev_ctx_cache
;
133 struct mhi_cmd_ctxt
*cmd_ctx_cache
;
137 phys_addr_t ch_ctx_cache_phys
;
138 phys_addr_t ev_ctx_cache_phys
;
139 phys_addr_t cmd_ctx_cache_phys
;
141 struct mhi_ep_db_info chdb
[4];
142 struct mutex event_lock
;
143 struct mutex state_lock
;
144 spinlock_t list_lock
;
146 struct list_head st_transition_list
;
147 struct list_head ch_db_list
;
149 struct workqueue_struct
*wq
;
150 struct work_struct state_work
;
151 struct work_struct reset_work
;
152 struct work_struct cmd_ring_work
;
153 struct work_struct ch_ring_work
;
154 struct kmem_cache
*ring_item_cache
;
155 struct kmem_cache
*ev_ring_el_cache
;
156 struct kmem_cache
*tre_buf_cache
;
158 void (*raise_irq
)(struct mhi_ep_cntrl
*mhi_cntrl
, u32 vector
);
159 int (*alloc_map
)(struct mhi_ep_cntrl
*mhi_cntrl
, u64 pci_addr
, phys_addr_t
*phys_ptr
,
160 void __iomem
**virt
, size_t size
);
161 void (*unmap_free
)(struct mhi_ep_cntrl
*mhi_cntrl
, u64 pci_addr
, phys_addr_t phys
,
162 void __iomem
*virt
, size_t size
);
163 int (*read_sync
)(struct mhi_ep_cntrl
*mhi_cntrl
, struct mhi_ep_buf_info
*buf_info
);
164 int (*write_sync
)(struct mhi_ep_cntrl
*mhi_cntrl
, struct mhi_ep_buf_info
*buf_info
);
165 int (*read_async
)(struct mhi_ep_cntrl
*mhi_cntrl
, struct mhi_ep_buf_info
*buf_info
);
166 int (*write_async
)(struct mhi_ep_cntrl
*mhi_cntrl
, struct mhi_ep_buf_info
*buf_info
);
168 enum mhi_state mhi_state
;
182 * struct mhi_ep_device - Structure representing an MHI Endpoint device that binds
183 * to channels or is associated with controllers
184 * @dev: Driver model device node for the MHI Endpoint device
185 * @mhi_cntrl: Controller the device belongs to
186 * @id: Pointer to MHI Endpoint device ID struct
187 * @name: Name of the associated MHI Endpoint device
188 * @ul_chan: UL (from host to endpoint) channel for the device
189 * @dl_chan: DL (from endpoint to host) channel for the device
190 * @dev_type: MHI device type
192 struct mhi_ep_device
{
194 struct mhi_ep_cntrl
*mhi_cntrl
;
195 const struct mhi_device_id
*id
;
197 struct mhi_ep_chan
*ul_chan
;
198 struct mhi_ep_chan
*dl_chan
;
199 enum mhi_device_type dev_type
;
203 * struct mhi_ep_driver - Structure representing a MHI Endpoint client driver
204 * @id_table: Pointer to MHI Endpoint device ID table
205 * @driver: Device driver model driver
206 * @probe: CB function for client driver probe function
207 * @remove: CB function for client driver remove function
208 * @ul_xfer_cb: CB function for UL (from host to endpoint) data transfer
209 * @dl_xfer_cb: CB function for DL (from endpoint to host) data transfer
211 struct mhi_ep_driver
{
212 const struct mhi_device_id
*id_table
;
213 struct device_driver driver
;
214 int (*probe
)(struct mhi_ep_device
*mhi_ep
,
215 const struct mhi_device_id
*id
);
216 void (*remove
)(struct mhi_ep_device
*mhi_ep
);
217 void (*ul_xfer_cb
)(struct mhi_ep_device
*mhi_dev
,
218 struct mhi_result
*result
);
219 void (*dl_xfer_cb
)(struct mhi_ep_device
*mhi_dev
,
220 struct mhi_result
*result
);
223 #define to_mhi_ep_device(dev) container_of(dev, struct mhi_ep_device, dev)
224 #define to_mhi_ep_driver(drv) container_of_const(drv, struct mhi_ep_driver, driver)
227 * module_mhi_ep_driver() - Helper macro for drivers that don't do
228 * anything special other than using default mhi_ep_driver_register() and
229 * mhi_ep_driver_unregister(). This eliminates a lot of boilerplate.
230 * Each module may only use this macro once.
232 #define module_mhi_ep_driver(mhi_drv) \
233 module_driver(mhi_drv, mhi_ep_driver_register, \
234 mhi_ep_driver_unregister)
237 * Macro to avoid include chaining to get THIS_MODULE
239 #define mhi_ep_driver_register(mhi_drv) \
240 __mhi_ep_driver_register(mhi_drv, THIS_MODULE)
243 * __mhi_ep_driver_register - Register a driver with MHI Endpoint bus
244 * @mhi_drv: Driver to be associated with the device
245 * @owner: The module owner
247 * Return: 0 if driver registrations succeeds, a negative error code otherwise.
249 int __mhi_ep_driver_register(struct mhi_ep_driver
*mhi_drv
, struct module
*owner
);
252 * mhi_ep_driver_unregister - Unregister a driver from MHI Endpoint bus
253 * @mhi_drv: Driver associated with the device
255 void mhi_ep_driver_unregister(struct mhi_ep_driver
*mhi_drv
);
258 * mhi_ep_register_controller - Register MHI Endpoint controller
259 * @mhi_cntrl: MHI Endpoint controller to register
260 * @config: Configuration to use for the controller
262 * Return: 0 if controller registrations succeeds, a negative error code otherwise.
264 int mhi_ep_register_controller(struct mhi_ep_cntrl
*mhi_cntrl
,
265 const struct mhi_ep_cntrl_config
*config
);
268 * mhi_ep_unregister_controller - Unregister MHI Endpoint controller
269 * @mhi_cntrl: MHI Endpoint controller to unregister
271 void mhi_ep_unregister_controller(struct mhi_ep_cntrl
*mhi_cntrl
);
274 * mhi_ep_power_up - Power up the MHI endpoint stack
275 * @mhi_cntrl: MHI Endpoint controller
277 * Return: 0 if power up succeeds, a negative error code otherwise.
279 int mhi_ep_power_up(struct mhi_ep_cntrl
*mhi_cntrl
);
282 * mhi_ep_power_down - Power down the MHI endpoint stack
283 * @mhi_cntrl: MHI controller
285 void mhi_ep_power_down(struct mhi_ep_cntrl
*mhi_cntrl
);
288 * mhi_ep_queue_is_empty - Determine whether the transfer queue is empty
289 * @mhi_dev: Device associated with the channels
290 * @dir: DMA direction for the channel
292 * Return: true if the queue is empty, false otherwise.
294 bool mhi_ep_queue_is_empty(struct mhi_ep_device
*mhi_dev
, enum dma_data_direction dir
);
297 * mhi_ep_queue_skb - Send SKBs to host over MHI Endpoint
298 * @mhi_dev: Device associated with the DL channel
299 * @skb: SKBs to be queued
301 * Return: 0 if the SKBs has been sent successfully, a negative error code otherwise.
303 int mhi_ep_queue_skb(struct mhi_ep_device
*mhi_dev
, struct sk_buff
*skb
);