xref: /freebsd-src/sys/compat/linuxkpi/common/include/linux/mhi.h (revision c12e3a05252ac9f43a6db379f88e4b4a07c06d46)
106a1103fSBjoern A. Zeeb /*-
206a1103fSBjoern A. Zeeb  * SPDX-License-Identifier: BSD-2-Clause
306a1103fSBjoern A. Zeeb  *
404729820SBjoern A. Zeeb  * Copyright (c) 2022-2023 Bjoern A. Zeeb
506a1103fSBjoern A. Zeeb  *
606a1103fSBjoern A. Zeeb  * Redistribution and use in source and binary forms, with or without
706a1103fSBjoern A. Zeeb  * modification, are permitted provided that the following conditions
806a1103fSBjoern A. Zeeb  * are met:
906a1103fSBjoern A. Zeeb  * 1. Redistributions of source code must retain the above copyright
1006a1103fSBjoern A. Zeeb  *    notice, this list of conditions and the following disclaimer.
1106a1103fSBjoern A. Zeeb  * 2. Redistributions in binary form must reproduce the above copyright
1206a1103fSBjoern A. Zeeb  *    notice, this list of conditions and the following disclaimer in the
1306a1103fSBjoern A. Zeeb  *    documentation and/or other materials provided with the distribution.
1406a1103fSBjoern A. Zeeb  *
1506a1103fSBjoern A. Zeeb  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1606a1103fSBjoern A. Zeeb  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1706a1103fSBjoern A. Zeeb  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1806a1103fSBjoern A. Zeeb  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1906a1103fSBjoern A. Zeeb  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2006a1103fSBjoern A. Zeeb  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2106a1103fSBjoern A. Zeeb  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2206a1103fSBjoern A. Zeeb  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2306a1103fSBjoern A. Zeeb  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2406a1103fSBjoern A. Zeeb  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2506a1103fSBjoern A. Zeeb  * SUCH DAMAGE.
2606a1103fSBjoern A. Zeeb  */
2706a1103fSBjoern A. Zeeb 
2806a1103fSBjoern A. Zeeb #ifndef	_LINUXKPI_LINUX_MHI_H
2906a1103fSBjoern A. Zeeb #define	_LINUXKPI_LINUX_MHI_H
3006a1103fSBjoern A. Zeeb 
3106a1103fSBjoern A. Zeeb #include <linux/types.h>
3206a1103fSBjoern A. Zeeb 
3306a1103fSBjoern A. Zeeb /* Modem Host Interface (MHI) */
3406a1103fSBjoern A. Zeeb 
3506a1103fSBjoern A. Zeeb /* XXX FIXME */
3606a1103fSBjoern A. Zeeb #define	MHI_DB_BRST_DISABLE	0
3706a1103fSBjoern A. Zeeb #define	MHI_ER_CTRL		0
3806a1103fSBjoern A. Zeeb 
3906a1103fSBjoern A. Zeeb enum mhi_callback {
4006a1103fSBjoern A. Zeeb 	MHI_CB_SYS_ERROR,
4104729820SBjoern A. Zeeb 	MHI_CB_BW_REQ,
4204729820SBjoern A. Zeeb 	MHI_CB_EE_MISSION_MODE,
4304729820SBjoern A. Zeeb 	MHI_CB_EE_RDDM,
4404729820SBjoern A. Zeeb 	MHI_CB_FATAL_ERROR,
4504729820SBjoern A. Zeeb 	MHI_CB_IDLE,
4604729820SBjoern A. Zeeb 	MHI_CB_LPM_ENTER,
4704729820SBjoern A. Zeeb 	MHI_CB_LPM_EXIT,
4804729820SBjoern A. Zeeb 	MHI_CB_PENDING_DATA,
4906a1103fSBjoern A. Zeeb };
5006a1103fSBjoern A. Zeeb 
5106a1103fSBjoern A. Zeeb struct mhi_channel_config {
5206a1103fSBjoern A. Zeeb 	const char		*name;
5306a1103fSBjoern A. Zeeb 	int	auto_queue, dir, doorbell, doorbell_mode_switch, ee_mask, event_ring, lpm_notify, num, num_elements, offload_channel, pollcfg;
5406a1103fSBjoern A. Zeeb };
5506a1103fSBjoern A. Zeeb 
5606a1103fSBjoern A. Zeeb struct mhi_event_config {
5706a1103fSBjoern A. Zeeb 	int	client_managed, data_type, hardware_event, irq, irq_moderation_ms, mode, num_elements, offload_channel, priority;
5806a1103fSBjoern A. Zeeb };
5906a1103fSBjoern A. Zeeb 
6006a1103fSBjoern A. Zeeb struct mhi_device {
6106a1103fSBjoern A. Zeeb };
6206a1103fSBjoern A. Zeeb 
6306a1103fSBjoern A. Zeeb struct mhi_controller_config {
64bee50f89SBjoern A. Zeeb 	const struct mhi_channel_config	*ch_cfg;
6506a1103fSBjoern A. Zeeb 	struct mhi_event_config		*event_cfg;
6606a1103fSBjoern A. Zeeb 
6706a1103fSBjoern A. Zeeb 	int	buf_len, max_channels, num_channels, num_events, use_bounce_buf;
6806a1103fSBjoern A. Zeeb 
6906a1103fSBjoern A. Zeeb 	uint32_t			timeout_ms;
7006a1103fSBjoern A. Zeeb };
7106a1103fSBjoern A. Zeeb 
7206a1103fSBjoern A. Zeeb struct mhi_controller {
7306a1103fSBjoern A. Zeeb 	struct device			*cntrl_dev;
7406a1103fSBjoern A. Zeeb 	struct mhi_device		*mhi_dev;
7506a1103fSBjoern A. Zeeb 	void				*regs;
7606a1103fSBjoern A. Zeeb 	int				*irq;
7706a1103fSBjoern A. Zeeb 	const char			*fw_image;
78*c12e3a05SBjoern A. Zeeb 	const u8			*fw_data;
79*c12e3a05SBjoern A. Zeeb 	size_t				fw_sz;
8006a1103fSBjoern A. Zeeb 
8106a1103fSBjoern A. Zeeb 	bool				fbc_download;
8204729820SBjoern A. Zeeb 	size_t				rddm_size;
8306a1103fSBjoern A. Zeeb 	size_t				sbl_size;
8406a1103fSBjoern A. Zeeb 	size_t				seg_len;
8506a1103fSBjoern A. Zeeb 	size_t				reg_len;
8606a1103fSBjoern A. Zeeb 	int				nr_irqs;
8706a1103fSBjoern A. Zeeb 	unsigned long			irq_flags;
8806a1103fSBjoern A. Zeeb 	uint32_t			timeout_ms;
8906a1103fSBjoern A. Zeeb 
9006a1103fSBjoern A. Zeeb 	dma_addr_t			iova_start;
9106a1103fSBjoern A. Zeeb 	dma_addr_t			iova_stop;
9206a1103fSBjoern A. Zeeb 
9306a1103fSBjoern A. Zeeb 	int				(*runtime_get)(struct mhi_controller *);
9406a1103fSBjoern A. Zeeb 	void				(*runtime_put)(struct mhi_controller *);
9506a1103fSBjoern A. Zeeb 	void				(*status_cb)(struct mhi_controller *, enum mhi_callback);
9606a1103fSBjoern A. Zeeb 	int				(*read_reg)(struct mhi_controller *, void __iomem *, uint32_t *);
9706a1103fSBjoern A. Zeeb 	void				(*write_reg)(struct mhi_controller *, void __iomem *, uint32_t);
9806a1103fSBjoern A. Zeeb };
9906a1103fSBjoern A. Zeeb 
10006a1103fSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
10106a1103fSBjoern A. Zeeb 
10206a1103fSBjoern A. Zeeb struct mhi_controller *linuxkpi_mhi_alloc_controller(void);
10306a1103fSBjoern A. Zeeb void linuxkpi_mhi_free_controller(struct mhi_controller *);
10406a1103fSBjoern A. Zeeb int linuxkpi_mhi_register_controller(struct mhi_controller *,
105bee50f89SBjoern A. Zeeb     const struct mhi_controller_config *);
10606a1103fSBjoern A. Zeeb void linuxkpi_mhi_unregister_controller(struct mhi_controller *);
10706a1103fSBjoern A. Zeeb 
10806a1103fSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
10906a1103fSBjoern A. Zeeb 
11006a1103fSBjoern A. Zeeb static inline struct mhi_controller *
11106a1103fSBjoern A. Zeeb mhi_alloc_controller(void)
11206a1103fSBjoern A. Zeeb {
11306a1103fSBjoern A. Zeeb 
11406a1103fSBjoern A. Zeeb 	/* Keep allocations internal to our implementation. */
11506a1103fSBjoern A. Zeeb 	return (linuxkpi_mhi_alloc_controller());
11606a1103fSBjoern A. Zeeb }
11706a1103fSBjoern A. Zeeb 
11806a1103fSBjoern A. Zeeb static inline void
11906a1103fSBjoern A. Zeeb mhi_free_controller(struct mhi_controller *mhi_ctrl)
12006a1103fSBjoern A. Zeeb {
12106a1103fSBjoern A. Zeeb 
12206a1103fSBjoern A. Zeeb 	linuxkpi_mhi_free_controller(mhi_ctrl);
12306a1103fSBjoern A. Zeeb }
12406a1103fSBjoern A. Zeeb 
12506a1103fSBjoern A. Zeeb static inline int
12606a1103fSBjoern A. Zeeb mhi_register_controller(struct mhi_controller *mhi_ctrl,
127bee50f89SBjoern A. Zeeb     const struct mhi_controller_config *cfg)
12806a1103fSBjoern A. Zeeb {
12906a1103fSBjoern A. Zeeb 
13006a1103fSBjoern A. Zeeb 	return (linuxkpi_mhi_register_controller(mhi_ctrl, cfg));
13106a1103fSBjoern A. Zeeb }
13206a1103fSBjoern A. Zeeb 
13306a1103fSBjoern A. Zeeb static inline void
13406a1103fSBjoern A. Zeeb mhi_unregister_controller(struct mhi_controller *mhi_ctrl)
13506a1103fSBjoern A. Zeeb {
13606a1103fSBjoern A. Zeeb 
13706a1103fSBjoern A. Zeeb 	linuxkpi_mhi_unregister_controller(mhi_ctrl);
13806a1103fSBjoern A. Zeeb }
13906a1103fSBjoern A. Zeeb 
14006a1103fSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
14106a1103fSBjoern A. Zeeb 
14204729820SBjoern A. Zeeb static __inline int
14306a1103fSBjoern A. Zeeb mhi_device_get_sync(struct mhi_device *mhi_dev)
14406a1103fSBjoern A. Zeeb {
14506a1103fSBjoern A. Zeeb 	/* XXX TODO */
14604729820SBjoern A. Zeeb 	return (-1);
14706a1103fSBjoern A. Zeeb }
14806a1103fSBjoern A. Zeeb 
14906a1103fSBjoern A. Zeeb static __inline void
15006a1103fSBjoern A. Zeeb mhi_device_put(struct mhi_device *mhi_dev)
15106a1103fSBjoern A. Zeeb {
15206a1103fSBjoern A. Zeeb 	/* XXX TODO */
15306a1103fSBjoern A. Zeeb }
15406a1103fSBjoern A. Zeeb 
15506a1103fSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
15606a1103fSBjoern A. Zeeb 
15706a1103fSBjoern A. Zeeb static __inline int
15806a1103fSBjoern A. Zeeb mhi_prepare_for_power_up(struct mhi_controller *mhi_ctrl)
15906a1103fSBjoern A. Zeeb {
16006a1103fSBjoern A. Zeeb 	/* XXX TODO */
16106a1103fSBjoern A. Zeeb 	return (0);
16206a1103fSBjoern A. Zeeb }
16306a1103fSBjoern A. Zeeb 
16406a1103fSBjoern A. Zeeb static __inline int
16504729820SBjoern A. Zeeb mhi_sync_power_up(struct mhi_controller *mhi_ctrl)
16604729820SBjoern A. Zeeb {
16704729820SBjoern A. Zeeb 	/* XXX TODO */
16804729820SBjoern A. Zeeb 	return (0);
16904729820SBjoern A. Zeeb }
17004729820SBjoern A. Zeeb 
17104729820SBjoern A. Zeeb static __inline int
17206a1103fSBjoern A. Zeeb mhi_async_power_up(struct mhi_controller *mhi_ctrl)
17306a1103fSBjoern A. Zeeb {
17406a1103fSBjoern A. Zeeb 	/* XXX TODO */
17506a1103fSBjoern A. Zeeb 	return (0);
17606a1103fSBjoern A. Zeeb }
17706a1103fSBjoern A. Zeeb 
17806a1103fSBjoern A. Zeeb static __inline void
17906a1103fSBjoern A. Zeeb mhi_power_down(struct mhi_controller *mhi_ctrl, bool x)
18006a1103fSBjoern A. Zeeb {
18106a1103fSBjoern A. Zeeb 	/* XXX TODO */
18206a1103fSBjoern A. Zeeb }
18306a1103fSBjoern A. Zeeb 
18406a1103fSBjoern A. Zeeb static __inline void
18506a1103fSBjoern A. Zeeb mhi_unprepare_after_power_down(struct mhi_controller *mhi_ctrl)
18606a1103fSBjoern A. Zeeb {
18706a1103fSBjoern A. Zeeb 	/* XXX TODO */
18806a1103fSBjoern A. Zeeb }
18906a1103fSBjoern A. Zeeb 
19006a1103fSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
19106a1103fSBjoern A. Zeeb 
19206a1103fSBjoern A. Zeeb static __inline int
19306a1103fSBjoern A. Zeeb mhi_pm_suspend(struct mhi_controller *mhi_ctrl)
19406a1103fSBjoern A. Zeeb {
19506a1103fSBjoern A. Zeeb 	/* XXX TODO */
19606a1103fSBjoern A. Zeeb 	return (0);
19706a1103fSBjoern A. Zeeb }
19806a1103fSBjoern A. Zeeb 
19906a1103fSBjoern A. Zeeb static __inline int
200bee50f89SBjoern A. Zeeb mhi_pm_resume(struct mhi_controller *mhi_ctrl)
201bee50f89SBjoern A. Zeeb {
202bee50f89SBjoern A. Zeeb 	/* XXX TODO */
203bee50f89SBjoern A. Zeeb 	return (0);
204bee50f89SBjoern A. Zeeb }
205bee50f89SBjoern A. Zeeb 
206bee50f89SBjoern A. Zeeb static __inline int
20706a1103fSBjoern A. Zeeb mhi_pm_resume_force(struct mhi_controller *mhi_ctrl)
20806a1103fSBjoern A. Zeeb {
20906a1103fSBjoern A. Zeeb 	/* XXX TODO */
21006a1103fSBjoern A. Zeeb 	return (0);
21106a1103fSBjoern A. Zeeb }
21206a1103fSBjoern A. Zeeb 
21306a1103fSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
21406a1103fSBjoern A. Zeeb 
21506a1103fSBjoern A. Zeeb static __inline int
21606a1103fSBjoern A. Zeeb mhi_force_rddm_mode(struct mhi_controller *mhi_ctrl)
21706a1103fSBjoern A. Zeeb {
21806a1103fSBjoern A. Zeeb 	/* XXX TODO */
21906a1103fSBjoern A. Zeeb 	return (0);
22006a1103fSBjoern A. Zeeb }
22106a1103fSBjoern A. Zeeb 
22206a1103fSBjoern A. Zeeb #endif	/* _LINUXKPI_LINUX_MHI_H */
223