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