1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2022-2023 Bjoern A. Zeeb
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#ifndef	_LINUXKPI_LINUX_MHI_H
29#define	_LINUXKPI_LINUX_MHI_H
30
31#include <linux/types.h>
32
33/* Modem Host Interface (MHI) */
34
35/* XXX FIXME */
36#define	MHI_DB_BRST_DISABLE	0
37#define	MHI_ER_CTRL		0
38
39enum mhi_callback {
40	MHI_CB_SYS_ERROR,
41	MHI_CB_BW_REQ,
42	MHI_CB_EE_MISSION_MODE,
43	MHI_CB_EE_RDDM,
44	MHI_CB_FATAL_ERROR,
45	MHI_CB_IDLE,
46	MHI_CB_LPM_ENTER,
47	MHI_CB_LPM_EXIT,
48	MHI_CB_PENDING_DATA,
49};
50
51struct mhi_channel_config {
52	const char		*name;
53	int	auto_queue, dir, doorbell, doorbell_mode_switch, ee_mask, event_ring, lpm_notify, num, num_elements, offload_channel, pollcfg;
54};
55
56struct mhi_event_config {
57	int	client_managed, data_type, hardware_event, irq, irq_moderation_ms, mode, num_elements, offload_channel, priority;
58};
59
60struct mhi_device {
61};
62
63struct mhi_controller_config {
64	const struct mhi_channel_config	*ch_cfg;
65	struct mhi_event_config		*event_cfg;
66
67	int	buf_len, max_channels, num_channels, num_events, use_bounce_buf;
68
69	uint32_t			timeout_ms;
70};
71
72struct mhi_controller {
73	struct device			*cntrl_dev;
74	struct mhi_device		*mhi_dev;
75	void				*regs;
76	int				*irq;
77	const char			*fw_image;
78
79	bool				fbc_download;
80	size_t				rddm_size;
81	size_t				sbl_size;
82	size_t				seg_len;
83	size_t				reg_len;
84	int				nr_irqs;
85	unsigned long			irq_flags;
86	uint32_t			timeout_ms;
87
88	dma_addr_t			iova_start;
89	dma_addr_t			iova_stop;
90
91	int				(*runtime_get)(struct mhi_controller *);
92	void				(*runtime_put)(struct mhi_controller *);
93	void				(*status_cb)(struct mhi_controller *, enum mhi_callback);
94	int				(*read_reg)(struct mhi_controller *, void __iomem *, uint32_t *);
95	void				(*write_reg)(struct mhi_controller *, void __iomem *, uint32_t);
96};
97
98/* -------------------------------------------------------------------------- */
99
100struct mhi_controller *linuxkpi_mhi_alloc_controller(void);
101void linuxkpi_mhi_free_controller(struct mhi_controller *);
102int linuxkpi_mhi_register_controller(struct mhi_controller *,
103    const struct mhi_controller_config *);
104void linuxkpi_mhi_unregister_controller(struct mhi_controller *);
105
106/* -------------------------------------------------------------------------- */
107
108static inline struct mhi_controller *
109mhi_alloc_controller(void)
110{
111
112	/* Keep allocations internal to our implementation. */
113	return (linuxkpi_mhi_alloc_controller());
114}
115
116static inline void
117mhi_free_controller(struct mhi_controller *mhi_ctrl)
118{
119
120	linuxkpi_mhi_free_controller(mhi_ctrl);
121}
122
123static inline int
124mhi_register_controller(struct mhi_controller *mhi_ctrl,
125    const struct mhi_controller_config *cfg)
126{
127
128	return (linuxkpi_mhi_register_controller(mhi_ctrl, cfg));
129}
130
131static inline void
132mhi_unregister_controller(struct mhi_controller *mhi_ctrl)
133{
134
135	linuxkpi_mhi_unregister_controller(mhi_ctrl);
136}
137
138/* -------------------------------------------------------------------------- */
139
140static __inline int
141mhi_device_get_sync(struct mhi_device *mhi_dev)
142{
143	/* XXX TODO */
144	return (-1);
145}
146
147static __inline void
148mhi_device_put(struct mhi_device *mhi_dev)
149{
150	/* XXX TODO */
151}
152
153/* -------------------------------------------------------------------------- */
154
155static __inline int
156mhi_prepare_for_power_up(struct mhi_controller *mhi_ctrl)
157{
158	/* XXX TODO */
159	return (0);
160}
161
162static __inline int
163mhi_sync_power_up(struct mhi_controller *mhi_ctrl)
164{
165	/* XXX TODO */
166	return (0);
167}
168
169static __inline int
170mhi_async_power_up(struct mhi_controller *mhi_ctrl)
171{
172	/* XXX TODO */
173	return (0);
174}
175
176static __inline void
177mhi_power_down(struct mhi_controller *mhi_ctrl, bool x)
178{
179	/* XXX TODO */
180}
181
182static __inline void
183mhi_unprepare_after_power_down(struct mhi_controller *mhi_ctrl)
184{
185	/* XXX TODO */
186}
187
188/* -------------------------------------------------------------------------- */
189
190static __inline int
191mhi_pm_suspend(struct mhi_controller *mhi_ctrl)
192{
193	/* XXX TODO */
194	return (0);
195}
196
197static __inline int
198mhi_pm_resume(struct mhi_controller *mhi_ctrl)
199{
200	/* XXX TODO */
201	return (0);
202}
203
204static __inline int
205mhi_pm_resume_force(struct mhi_controller *mhi_ctrl)
206{
207	/* XXX TODO */
208	return (0);
209}
210
211/* -------------------------------------------------------------------------- */
212
213static __inline int
214mhi_force_rddm_mode(struct mhi_controller *mhi_ctrl)
215{
216	/* XXX TODO */
217	return (0);
218}
219
220#endif	/* _LINUXKPI_LINUX_MHI_H */
221