18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef _MHI_INT_H 88c2ecf20Sopenharmony_ci#define _MHI_INT_H 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/mhi.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ciextern struct bus_type mhi_bus_type; 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#define MHIREGLEN (0x0) 158c2ecf20Sopenharmony_ci#define MHIREGLEN_MHIREGLEN_MASK (0xFFFFFFFF) 168c2ecf20Sopenharmony_ci#define MHIREGLEN_MHIREGLEN_SHIFT (0) 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#define MHIVER (0x8) 198c2ecf20Sopenharmony_ci#define MHIVER_MHIVER_MASK (0xFFFFFFFF) 208c2ecf20Sopenharmony_ci#define MHIVER_MHIVER_SHIFT (0) 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define MHICFG (0x10) 238c2ecf20Sopenharmony_ci#define MHICFG_NHWER_MASK (0xFF000000) 248c2ecf20Sopenharmony_ci#define MHICFG_NHWER_SHIFT (24) 258c2ecf20Sopenharmony_ci#define MHICFG_NER_MASK (0xFF0000) 268c2ecf20Sopenharmony_ci#define MHICFG_NER_SHIFT (16) 278c2ecf20Sopenharmony_ci#define MHICFG_NHWCH_MASK (0xFF00) 288c2ecf20Sopenharmony_ci#define MHICFG_NHWCH_SHIFT (8) 298c2ecf20Sopenharmony_ci#define MHICFG_NCH_MASK (0xFF) 308c2ecf20Sopenharmony_ci#define MHICFG_NCH_SHIFT (0) 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#define CHDBOFF (0x18) 338c2ecf20Sopenharmony_ci#define CHDBOFF_CHDBOFF_MASK (0xFFFFFFFF) 348c2ecf20Sopenharmony_ci#define CHDBOFF_CHDBOFF_SHIFT (0) 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#define ERDBOFF (0x20) 378c2ecf20Sopenharmony_ci#define ERDBOFF_ERDBOFF_MASK (0xFFFFFFFF) 388c2ecf20Sopenharmony_ci#define ERDBOFF_ERDBOFF_SHIFT (0) 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci#define BHIOFF (0x28) 418c2ecf20Sopenharmony_ci#define BHIOFF_BHIOFF_MASK (0xFFFFFFFF) 428c2ecf20Sopenharmony_ci#define BHIOFF_BHIOFF_SHIFT (0) 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci#define BHIEOFF (0x2C) 458c2ecf20Sopenharmony_ci#define BHIEOFF_BHIEOFF_MASK (0xFFFFFFFF) 468c2ecf20Sopenharmony_ci#define BHIEOFF_BHIEOFF_SHIFT (0) 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#define DEBUGOFF (0x30) 498c2ecf20Sopenharmony_ci#define DEBUGOFF_DEBUGOFF_MASK (0xFFFFFFFF) 508c2ecf20Sopenharmony_ci#define DEBUGOFF_DEBUGOFF_SHIFT (0) 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci#define MHICTRL (0x38) 538c2ecf20Sopenharmony_ci#define MHICTRL_MHISTATE_MASK (0x0000FF00) 548c2ecf20Sopenharmony_ci#define MHICTRL_MHISTATE_SHIFT (8) 558c2ecf20Sopenharmony_ci#define MHICTRL_RESET_MASK (0x2) 568c2ecf20Sopenharmony_ci#define MHICTRL_RESET_SHIFT (1) 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci#define MHISTATUS (0x48) 598c2ecf20Sopenharmony_ci#define MHISTATUS_MHISTATE_MASK (0x0000FF00) 608c2ecf20Sopenharmony_ci#define MHISTATUS_MHISTATE_SHIFT (8) 618c2ecf20Sopenharmony_ci#define MHISTATUS_SYSERR_MASK (0x4) 628c2ecf20Sopenharmony_ci#define MHISTATUS_SYSERR_SHIFT (2) 638c2ecf20Sopenharmony_ci#define MHISTATUS_READY_MASK (0x1) 648c2ecf20Sopenharmony_ci#define MHISTATUS_READY_SHIFT (0) 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci#define CCABAP_LOWER (0x58) 678c2ecf20Sopenharmony_ci#define CCABAP_LOWER_CCABAP_LOWER_MASK (0xFFFFFFFF) 688c2ecf20Sopenharmony_ci#define CCABAP_LOWER_CCABAP_LOWER_SHIFT (0) 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci#define CCABAP_HIGHER (0x5C) 718c2ecf20Sopenharmony_ci#define CCABAP_HIGHER_CCABAP_HIGHER_MASK (0xFFFFFFFF) 728c2ecf20Sopenharmony_ci#define CCABAP_HIGHER_CCABAP_HIGHER_SHIFT (0) 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci#define ECABAP_LOWER (0x60) 758c2ecf20Sopenharmony_ci#define ECABAP_LOWER_ECABAP_LOWER_MASK (0xFFFFFFFF) 768c2ecf20Sopenharmony_ci#define ECABAP_LOWER_ECABAP_LOWER_SHIFT (0) 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci#define ECABAP_HIGHER (0x64) 798c2ecf20Sopenharmony_ci#define ECABAP_HIGHER_ECABAP_HIGHER_MASK (0xFFFFFFFF) 808c2ecf20Sopenharmony_ci#define ECABAP_HIGHER_ECABAP_HIGHER_SHIFT (0) 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci#define CRCBAP_LOWER (0x68) 838c2ecf20Sopenharmony_ci#define CRCBAP_LOWER_CRCBAP_LOWER_MASK (0xFFFFFFFF) 848c2ecf20Sopenharmony_ci#define CRCBAP_LOWER_CRCBAP_LOWER_SHIFT (0) 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci#define CRCBAP_HIGHER (0x6C) 878c2ecf20Sopenharmony_ci#define CRCBAP_HIGHER_CRCBAP_HIGHER_MASK (0xFFFFFFFF) 888c2ecf20Sopenharmony_ci#define CRCBAP_HIGHER_CRCBAP_HIGHER_SHIFT (0) 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci#define CRDB_LOWER (0x70) 918c2ecf20Sopenharmony_ci#define CRDB_LOWER_CRDB_LOWER_MASK (0xFFFFFFFF) 928c2ecf20Sopenharmony_ci#define CRDB_LOWER_CRDB_LOWER_SHIFT (0) 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci#define CRDB_HIGHER (0x74) 958c2ecf20Sopenharmony_ci#define CRDB_HIGHER_CRDB_HIGHER_MASK (0xFFFFFFFF) 968c2ecf20Sopenharmony_ci#define CRDB_HIGHER_CRDB_HIGHER_SHIFT (0) 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci#define MHICTRLBASE_LOWER (0x80) 998c2ecf20Sopenharmony_ci#define MHICTRLBASE_LOWER_MHICTRLBASE_LOWER_MASK (0xFFFFFFFF) 1008c2ecf20Sopenharmony_ci#define MHICTRLBASE_LOWER_MHICTRLBASE_LOWER_SHIFT (0) 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci#define MHICTRLBASE_HIGHER (0x84) 1038c2ecf20Sopenharmony_ci#define MHICTRLBASE_HIGHER_MHICTRLBASE_HIGHER_MASK (0xFFFFFFFF) 1048c2ecf20Sopenharmony_ci#define MHICTRLBASE_HIGHER_MHICTRLBASE_HIGHER_SHIFT (0) 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci#define MHICTRLLIMIT_LOWER (0x88) 1078c2ecf20Sopenharmony_ci#define MHICTRLLIMIT_LOWER_MHICTRLLIMIT_LOWER_MASK (0xFFFFFFFF) 1088c2ecf20Sopenharmony_ci#define MHICTRLLIMIT_LOWER_MHICTRLLIMIT_LOWER_SHIFT (0) 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci#define MHICTRLLIMIT_HIGHER (0x8C) 1118c2ecf20Sopenharmony_ci#define MHICTRLLIMIT_HIGHER_MHICTRLLIMIT_HIGHER_MASK (0xFFFFFFFF) 1128c2ecf20Sopenharmony_ci#define MHICTRLLIMIT_HIGHER_MHICTRLLIMIT_HIGHER_SHIFT (0) 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci#define MHIDATABASE_LOWER (0x98) 1158c2ecf20Sopenharmony_ci#define MHIDATABASE_LOWER_MHIDATABASE_LOWER_MASK (0xFFFFFFFF) 1168c2ecf20Sopenharmony_ci#define MHIDATABASE_LOWER_MHIDATABASE_LOWER_SHIFT (0) 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci#define MHIDATABASE_HIGHER (0x9C) 1198c2ecf20Sopenharmony_ci#define MHIDATABASE_HIGHER_MHIDATABASE_HIGHER_MASK (0xFFFFFFFF) 1208c2ecf20Sopenharmony_ci#define MHIDATABASE_HIGHER_MHIDATABASE_HIGHER_SHIFT (0) 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci#define MHIDATALIMIT_LOWER (0xA0) 1238c2ecf20Sopenharmony_ci#define MHIDATALIMIT_LOWER_MHIDATALIMIT_LOWER_MASK (0xFFFFFFFF) 1248c2ecf20Sopenharmony_ci#define MHIDATALIMIT_LOWER_MHIDATALIMIT_LOWER_SHIFT (0) 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci#define MHIDATALIMIT_HIGHER (0xA4) 1278c2ecf20Sopenharmony_ci#define MHIDATALIMIT_HIGHER_MHIDATALIMIT_HIGHER_MASK (0xFFFFFFFF) 1288c2ecf20Sopenharmony_ci#define MHIDATALIMIT_HIGHER_MHIDATALIMIT_HIGHER_SHIFT (0) 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci/* Host request register */ 1318c2ecf20Sopenharmony_ci#define MHI_SOC_RESET_REQ_OFFSET (0xB0) 1328c2ecf20Sopenharmony_ci#define MHI_SOC_RESET_REQ BIT(0) 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci/* MHI BHI offfsets */ 1358c2ecf20Sopenharmony_ci#define BHI_BHIVERSION_MINOR (0x00) 1368c2ecf20Sopenharmony_ci#define BHI_BHIVERSION_MAJOR (0x04) 1378c2ecf20Sopenharmony_ci#define BHI_IMGADDR_LOW (0x08) 1388c2ecf20Sopenharmony_ci#define BHI_IMGADDR_HIGH (0x0C) 1398c2ecf20Sopenharmony_ci#define BHI_IMGSIZE (0x10) 1408c2ecf20Sopenharmony_ci#define BHI_RSVD1 (0x14) 1418c2ecf20Sopenharmony_ci#define BHI_IMGTXDB (0x18) 1428c2ecf20Sopenharmony_ci#define BHI_TXDB_SEQNUM_BMSK (0x3FFFFFFF) 1438c2ecf20Sopenharmony_ci#define BHI_TXDB_SEQNUM_SHFT (0) 1448c2ecf20Sopenharmony_ci#define BHI_RSVD2 (0x1C) 1458c2ecf20Sopenharmony_ci#define BHI_INTVEC (0x20) 1468c2ecf20Sopenharmony_ci#define BHI_RSVD3 (0x24) 1478c2ecf20Sopenharmony_ci#define BHI_EXECENV (0x28) 1488c2ecf20Sopenharmony_ci#define BHI_STATUS (0x2C) 1498c2ecf20Sopenharmony_ci#define BHI_ERRCODE (0x30) 1508c2ecf20Sopenharmony_ci#define BHI_ERRDBG1 (0x34) 1518c2ecf20Sopenharmony_ci#define BHI_ERRDBG2 (0x38) 1528c2ecf20Sopenharmony_ci#define BHI_ERRDBG3 (0x3C) 1538c2ecf20Sopenharmony_ci#define BHI_SERIALNU (0x40) 1548c2ecf20Sopenharmony_ci#define BHI_SBLANTIROLLVER (0x44) 1558c2ecf20Sopenharmony_ci#define BHI_NUMSEG (0x48) 1568c2ecf20Sopenharmony_ci#define BHI_MSMHWID(n) (0x4C + (0x4 * n)) 1578c2ecf20Sopenharmony_ci#define BHI_OEMPKHASH(n) (0x64 + (0x4 * n)) 1588c2ecf20Sopenharmony_ci#define BHI_RSVD5 (0xC4) 1598c2ecf20Sopenharmony_ci#define BHI_STATUS_MASK (0xC0000000) 1608c2ecf20Sopenharmony_ci#define BHI_STATUS_SHIFT (30) 1618c2ecf20Sopenharmony_ci#define BHI_STATUS_ERROR (3) 1628c2ecf20Sopenharmony_ci#define BHI_STATUS_SUCCESS (2) 1638c2ecf20Sopenharmony_ci#define BHI_STATUS_RESET (0) 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci/* MHI BHIE offsets */ 1668c2ecf20Sopenharmony_ci#define BHIE_MSMSOCID_OFFS (0x0000) 1678c2ecf20Sopenharmony_ci#define BHIE_TXVECADDR_LOW_OFFS (0x002C) 1688c2ecf20Sopenharmony_ci#define BHIE_TXVECADDR_HIGH_OFFS (0x0030) 1698c2ecf20Sopenharmony_ci#define BHIE_TXVECSIZE_OFFS (0x0034) 1708c2ecf20Sopenharmony_ci#define BHIE_TXVECDB_OFFS (0x003C) 1718c2ecf20Sopenharmony_ci#define BHIE_TXVECDB_SEQNUM_BMSK (0x3FFFFFFF) 1728c2ecf20Sopenharmony_ci#define BHIE_TXVECDB_SEQNUM_SHFT (0) 1738c2ecf20Sopenharmony_ci#define BHIE_TXVECSTATUS_OFFS (0x0044) 1748c2ecf20Sopenharmony_ci#define BHIE_TXVECSTATUS_SEQNUM_BMSK (0x3FFFFFFF) 1758c2ecf20Sopenharmony_ci#define BHIE_TXVECSTATUS_SEQNUM_SHFT (0) 1768c2ecf20Sopenharmony_ci#define BHIE_TXVECSTATUS_STATUS_BMSK (0xC0000000) 1778c2ecf20Sopenharmony_ci#define BHIE_TXVECSTATUS_STATUS_SHFT (30) 1788c2ecf20Sopenharmony_ci#define BHIE_TXVECSTATUS_STATUS_RESET (0x00) 1798c2ecf20Sopenharmony_ci#define BHIE_TXVECSTATUS_STATUS_XFER_COMPL (0x02) 1808c2ecf20Sopenharmony_ci#define BHIE_TXVECSTATUS_STATUS_ERROR (0x03) 1818c2ecf20Sopenharmony_ci#define BHIE_RXVECADDR_LOW_OFFS (0x0060) 1828c2ecf20Sopenharmony_ci#define BHIE_RXVECADDR_HIGH_OFFS (0x0064) 1838c2ecf20Sopenharmony_ci#define BHIE_RXVECSIZE_OFFS (0x0068) 1848c2ecf20Sopenharmony_ci#define BHIE_RXVECDB_OFFS (0x0070) 1858c2ecf20Sopenharmony_ci#define BHIE_RXVECDB_SEQNUM_BMSK (0x3FFFFFFF) 1868c2ecf20Sopenharmony_ci#define BHIE_RXVECDB_SEQNUM_SHFT (0) 1878c2ecf20Sopenharmony_ci#define BHIE_RXVECSTATUS_OFFS (0x0078) 1888c2ecf20Sopenharmony_ci#define BHIE_RXVECSTATUS_SEQNUM_BMSK (0x3FFFFFFF) 1898c2ecf20Sopenharmony_ci#define BHIE_RXVECSTATUS_SEQNUM_SHFT (0) 1908c2ecf20Sopenharmony_ci#define BHIE_RXVECSTATUS_STATUS_BMSK (0xC0000000) 1918c2ecf20Sopenharmony_ci#define BHIE_RXVECSTATUS_STATUS_SHFT (30) 1928c2ecf20Sopenharmony_ci#define BHIE_RXVECSTATUS_STATUS_RESET (0x00) 1938c2ecf20Sopenharmony_ci#define BHIE_RXVECSTATUS_STATUS_XFER_COMPL (0x02) 1948c2ecf20Sopenharmony_ci#define BHIE_RXVECSTATUS_STATUS_ERROR (0x03) 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci#define SOC_HW_VERSION_OFFS (0x224) 1978c2ecf20Sopenharmony_ci#define SOC_HW_VERSION_FAM_NUM_BMSK (0xF0000000) 1988c2ecf20Sopenharmony_ci#define SOC_HW_VERSION_FAM_NUM_SHFT (28) 1998c2ecf20Sopenharmony_ci#define SOC_HW_VERSION_DEV_NUM_BMSK (0x0FFF0000) 2008c2ecf20Sopenharmony_ci#define SOC_HW_VERSION_DEV_NUM_SHFT (16) 2018c2ecf20Sopenharmony_ci#define SOC_HW_VERSION_MAJOR_VER_BMSK (0x0000FF00) 2028c2ecf20Sopenharmony_ci#define SOC_HW_VERSION_MAJOR_VER_SHFT (8) 2038c2ecf20Sopenharmony_ci#define SOC_HW_VERSION_MINOR_VER_BMSK (0x000000FF) 2048c2ecf20Sopenharmony_ci#define SOC_HW_VERSION_MINOR_VER_SHFT (0) 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci#define EV_CTX_RESERVED_MASK GENMASK(7, 0) 2078c2ecf20Sopenharmony_ci#define EV_CTX_INTMODC_MASK GENMASK(15, 8) 2088c2ecf20Sopenharmony_ci#define EV_CTX_INTMODC_SHIFT 8 2098c2ecf20Sopenharmony_ci#define EV_CTX_INTMODT_MASK GENMASK(31, 16) 2108c2ecf20Sopenharmony_ci#define EV_CTX_INTMODT_SHIFT 16 2118c2ecf20Sopenharmony_cistruct mhi_event_ctxt { 2128c2ecf20Sopenharmony_ci __u32 intmod; 2138c2ecf20Sopenharmony_ci __u32 ertype; 2148c2ecf20Sopenharmony_ci __u32 msivec; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci __u64 rbase __packed __aligned(4); 2178c2ecf20Sopenharmony_ci __u64 rlen __packed __aligned(4); 2188c2ecf20Sopenharmony_ci __u64 rp __packed __aligned(4); 2198c2ecf20Sopenharmony_ci __u64 wp __packed __aligned(4); 2208c2ecf20Sopenharmony_ci}; 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ci#define CHAN_CTX_CHSTATE_MASK GENMASK(7, 0) 2238c2ecf20Sopenharmony_ci#define CHAN_CTX_CHSTATE_SHIFT 0 2248c2ecf20Sopenharmony_ci#define CHAN_CTX_BRSTMODE_MASK GENMASK(9, 8) 2258c2ecf20Sopenharmony_ci#define CHAN_CTX_BRSTMODE_SHIFT 8 2268c2ecf20Sopenharmony_ci#define CHAN_CTX_POLLCFG_MASK GENMASK(15, 10) 2278c2ecf20Sopenharmony_ci#define CHAN_CTX_POLLCFG_SHIFT 10 2288c2ecf20Sopenharmony_ci#define CHAN_CTX_RESERVED_MASK GENMASK(31, 16) 2298c2ecf20Sopenharmony_cistruct mhi_chan_ctxt { 2308c2ecf20Sopenharmony_ci __u32 chcfg; 2318c2ecf20Sopenharmony_ci __u32 chtype; 2328c2ecf20Sopenharmony_ci __u32 erindex; 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci __u64 rbase __packed __aligned(4); 2358c2ecf20Sopenharmony_ci __u64 rlen __packed __aligned(4); 2368c2ecf20Sopenharmony_ci __u64 rp __packed __aligned(4); 2378c2ecf20Sopenharmony_ci __u64 wp __packed __aligned(4); 2388c2ecf20Sopenharmony_ci}; 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_cistruct mhi_cmd_ctxt { 2418c2ecf20Sopenharmony_ci __u32 reserved0; 2428c2ecf20Sopenharmony_ci __u32 reserved1; 2438c2ecf20Sopenharmony_ci __u32 reserved2; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci __u64 rbase __packed __aligned(4); 2468c2ecf20Sopenharmony_ci __u64 rlen __packed __aligned(4); 2478c2ecf20Sopenharmony_ci __u64 rp __packed __aligned(4); 2488c2ecf20Sopenharmony_ci __u64 wp __packed __aligned(4); 2498c2ecf20Sopenharmony_ci}; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_cistruct mhi_ctxt { 2528c2ecf20Sopenharmony_ci struct mhi_event_ctxt *er_ctxt; 2538c2ecf20Sopenharmony_ci struct mhi_chan_ctxt *chan_ctxt; 2548c2ecf20Sopenharmony_ci struct mhi_cmd_ctxt *cmd_ctxt; 2558c2ecf20Sopenharmony_ci dma_addr_t er_ctxt_addr; 2568c2ecf20Sopenharmony_ci dma_addr_t chan_ctxt_addr; 2578c2ecf20Sopenharmony_ci dma_addr_t cmd_ctxt_addr; 2588c2ecf20Sopenharmony_ci}; 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_cistruct mhi_tre { 2618c2ecf20Sopenharmony_ci u64 ptr; 2628c2ecf20Sopenharmony_ci u32 dword[2]; 2638c2ecf20Sopenharmony_ci}; 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_cistruct bhi_vec_entry { 2668c2ecf20Sopenharmony_ci u64 dma_addr; 2678c2ecf20Sopenharmony_ci u64 size; 2688c2ecf20Sopenharmony_ci}; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_cienum mhi_cmd_type { 2718c2ecf20Sopenharmony_ci MHI_CMD_NOP = 1, 2728c2ecf20Sopenharmony_ci MHI_CMD_RESET_CHAN = 16, 2738c2ecf20Sopenharmony_ci MHI_CMD_STOP_CHAN = 17, 2748c2ecf20Sopenharmony_ci MHI_CMD_START_CHAN = 18, 2758c2ecf20Sopenharmony_ci}; 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci/* No operation command */ 2788c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_NOOP_PTR (0) 2798c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_NOOP_DWORD0 (0) 2808c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_NOOP_DWORD1 (MHI_CMD_NOP << 16) 2818c2ecf20Sopenharmony_ci 2828c2ecf20Sopenharmony_ci/* Channel reset command */ 2838c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_RESET_PTR (0) 2848c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_RESET_DWORD0 (0) 2858c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_RESET_DWORD1(chid) ((chid << 24) | \ 2868c2ecf20Sopenharmony_ci (MHI_CMD_RESET_CHAN << 16)) 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci/* Channel stop command */ 2898c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_STOP_PTR (0) 2908c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_STOP_DWORD0 (0) 2918c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_STOP_DWORD1(chid) ((chid << 24) | \ 2928c2ecf20Sopenharmony_ci (MHI_CMD_STOP_CHAN << 16)) 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci/* Channel start command */ 2958c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_START_PTR (0) 2968c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_START_DWORD0 (0) 2978c2ecf20Sopenharmony_ci#define MHI_TRE_CMD_START_DWORD1(chid) ((chid << 24) | \ 2988c2ecf20Sopenharmony_ci (MHI_CMD_START_CHAN << 16)) 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci#define MHI_TRE_GET_CMD_CHID(tre) (((tre)->dword[1] >> 24) & 0xFF) 3018c2ecf20Sopenharmony_ci#define MHI_TRE_GET_CMD_TYPE(tre) (((tre)->dword[1] >> 16) & 0xFF) 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ci/* Event descriptor macros */ 3048c2ecf20Sopenharmony_ci#define MHI_TRE_EV_PTR(ptr) (ptr) 3058c2ecf20Sopenharmony_ci#define MHI_TRE_EV_DWORD0(code, len) ((code << 24) | len) 3068c2ecf20Sopenharmony_ci#define MHI_TRE_EV_DWORD1(chid, type) ((chid << 24) | (type << 16)) 3078c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_PTR(tre) ((tre)->ptr) 3088c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_CODE(tre) (((tre)->dword[0] >> 24) & 0xFF) 3098c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_LEN(tre) ((tre)->dword[0] & 0xFFFF) 3108c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_CHID(tre) (((tre)->dword[1] >> 24) & 0xFF) 3118c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_TYPE(tre) (((tre)->dword[1] >> 16) & 0xFF) 3128c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_STATE(tre) (((tre)->dword[0] >> 24) & 0xFF) 3138c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_EXECENV(tre) (((tre)->dword[0] >> 24) & 0xFF) 3148c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_SEQ(tre) ((tre)->dword[0]) 3158c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_TIME(tre) ((tre)->ptr) 3168c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_COOKIE(tre) lower_32_bits((tre)->ptr) 3178c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_VEID(tre) (((tre)->dword[0] >> 16) & 0xFF) 3188c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_LINKSPEED(tre) (((tre)->dword[1] >> 24) & 0xFF) 3198c2ecf20Sopenharmony_ci#define MHI_TRE_GET_EV_LINKWIDTH(tre) ((tre)->dword[0] & 0xFF) 3208c2ecf20Sopenharmony_ci 3218c2ecf20Sopenharmony_ci/* Transfer descriptor macros */ 3228c2ecf20Sopenharmony_ci#define MHI_TRE_DATA_PTR(ptr) (ptr) 3238c2ecf20Sopenharmony_ci#define MHI_TRE_DATA_DWORD0(len) (len & MHI_MAX_MTU) 3248c2ecf20Sopenharmony_ci#define MHI_TRE_DATA_DWORD1(bei, ieot, ieob, chain) ((2 << 16) | (bei << 10) \ 3258c2ecf20Sopenharmony_ci | (ieot << 9) | (ieob << 8) | chain) 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ci/* RSC transfer descriptor macros */ 3288c2ecf20Sopenharmony_ci#define MHI_RSCTRE_DATA_PTR(ptr, len) (((u64)len << 48) | ptr) 3298c2ecf20Sopenharmony_ci#define MHI_RSCTRE_DATA_DWORD0(cookie) (cookie) 3308c2ecf20Sopenharmony_ci#define MHI_RSCTRE_DATA_DWORD1 (MHI_PKT_TYPE_COALESCING << 16) 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_cienum mhi_pkt_type { 3338c2ecf20Sopenharmony_ci MHI_PKT_TYPE_INVALID = 0x0, 3348c2ecf20Sopenharmony_ci MHI_PKT_TYPE_NOOP_CMD = 0x1, 3358c2ecf20Sopenharmony_ci MHI_PKT_TYPE_TRANSFER = 0x2, 3368c2ecf20Sopenharmony_ci MHI_PKT_TYPE_COALESCING = 0x8, 3378c2ecf20Sopenharmony_ci MHI_PKT_TYPE_RESET_CHAN_CMD = 0x10, 3388c2ecf20Sopenharmony_ci MHI_PKT_TYPE_STOP_CHAN_CMD = 0x11, 3398c2ecf20Sopenharmony_ci MHI_PKT_TYPE_START_CHAN_CMD = 0x12, 3408c2ecf20Sopenharmony_ci MHI_PKT_TYPE_STATE_CHANGE_EVENT = 0x20, 3418c2ecf20Sopenharmony_ci MHI_PKT_TYPE_CMD_COMPLETION_EVENT = 0x21, 3428c2ecf20Sopenharmony_ci MHI_PKT_TYPE_TX_EVENT = 0x22, 3438c2ecf20Sopenharmony_ci MHI_PKT_TYPE_RSC_TX_EVENT = 0x28, 3448c2ecf20Sopenharmony_ci MHI_PKT_TYPE_EE_EVENT = 0x40, 3458c2ecf20Sopenharmony_ci MHI_PKT_TYPE_TSYNC_EVENT = 0x48, 3468c2ecf20Sopenharmony_ci MHI_PKT_TYPE_BW_REQ_EVENT = 0x50, 3478c2ecf20Sopenharmony_ci MHI_PKT_TYPE_STALE_EVENT, /* internal event */ 3488c2ecf20Sopenharmony_ci}; 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci/* MHI transfer completion events */ 3518c2ecf20Sopenharmony_cienum mhi_ev_ccs { 3528c2ecf20Sopenharmony_ci MHI_EV_CC_INVALID = 0x0, 3538c2ecf20Sopenharmony_ci MHI_EV_CC_SUCCESS = 0x1, 3548c2ecf20Sopenharmony_ci MHI_EV_CC_EOT = 0x2, /* End of transfer event */ 3558c2ecf20Sopenharmony_ci MHI_EV_CC_OVERFLOW = 0x3, 3568c2ecf20Sopenharmony_ci MHI_EV_CC_EOB = 0x4, /* End of block event */ 3578c2ecf20Sopenharmony_ci MHI_EV_CC_OOB = 0x5, /* Out of block event */ 3588c2ecf20Sopenharmony_ci MHI_EV_CC_DB_MODE = 0x6, 3598c2ecf20Sopenharmony_ci MHI_EV_CC_UNDEFINED_ERR = 0x10, 3608c2ecf20Sopenharmony_ci MHI_EV_CC_BAD_TRE = 0x11, 3618c2ecf20Sopenharmony_ci}; 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_cienum mhi_ch_state { 3648c2ecf20Sopenharmony_ci MHI_CH_STATE_DISABLED = 0x0, 3658c2ecf20Sopenharmony_ci MHI_CH_STATE_ENABLED = 0x1, 3668c2ecf20Sopenharmony_ci MHI_CH_STATE_RUNNING = 0x2, 3678c2ecf20Sopenharmony_ci MHI_CH_STATE_SUSPENDED = 0x3, 3688c2ecf20Sopenharmony_ci MHI_CH_STATE_STOP = 0x4, 3698c2ecf20Sopenharmony_ci MHI_CH_STATE_ERROR = 0x5, 3708c2ecf20Sopenharmony_ci}; 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci#define MHI_INVALID_BRSTMODE(mode) (mode != MHI_DB_BRST_DISABLE && \ 3738c2ecf20Sopenharmony_ci mode != MHI_DB_BRST_ENABLE) 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_ciextern const char * const mhi_ee_str[MHI_EE_MAX]; 3768c2ecf20Sopenharmony_ci#define TO_MHI_EXEC_STR(ee) (((ee) >= MHI_EE_MAX) ? \ 3778c2ecf20Sopenharmony_ci "INVALID_EE" : mhi_ee_str[ee]) 3788c2ecf20Sopenharmony_ci 3798c2ecf20Sopenharmony_ci#define MHI_IN_PBL(ee) (ee == MHI_EE_PBL || ee == MHI_EE_PTHRU || \ 3808c2ecf20Sopenharmony_ci ee == MHI_EE_EDL) 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_ci#define MHI_IN_MISSION_MODE(ee) (ee == MHI_EE_AMSS || ee == MHI_EE_WFW) 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_cienum dev_st_transition { 3858c2ecf20Sopenharmony_ci DEV_ST_TRANSITION_PBL, 3868c2ecf20Sopenharmony_ci DEV_ST_TRANSITION_READY, 3878c2ecf20Sopenharmony_ci DEV_ST_TRANSITION_SBL, 3888c2ecf20Sopenharmony_ci DEV_ST_TRANSITION_MISSION_MODE, 3898c2ecf20Sopenharmony_ci DEV_ST_TRANSITION_SYS_ERR, 3908c2ecf20Sopenharmony_ci DEV_ST_TRANSITION_DISABLE, 3918c2ecf20Sopenharmony_ci DEV_ST_TRANSITION_MAX, 3928c2ecf20Sopenharmony_ci}; 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_ciextern const char * const dev_state_tran_str[DEV_ST_TRANSITION_MAX]; 3958c2ecf20Sopenharmony_ci#define TO_DEV_STATE_TRANS_STR(state) (((state) >= DEV_ST_TRANSITION_MAX) ? \ 3968c2ecf20Sopenharmony_ci "INVALID_STATE" : dev_state_tran_str[state]) 3978c2ecf20Sopenharmony_ci 3988c2ecf20Sopenharmony_ciextern const char * const mhi_state_str[MHI_STATE_MAX]; 3998c2ecf20Sopenharmony_ci#define TO_MHI_STATE_STR(state) ((state >= MHI_STATE_MAX || \ 4008c2ecf20Sopenharmony_ci !mhi_state_str[state]) ? \ 4018c2ecf20Sopenharmony_ci "INVALID_STATE" : mhi_state_str[state]) 4028c2ecf20Sopenharmony_ci 4038c2ecf20Sopenharmony_ci/* internal power states */ 4048c2ecf20Sopenharmony_cienum mhi_pm_state { 4058c2ecf20Sopenharmony_ci MHI_PM_STATE_DISABLE, 4068c2ecf20Sopenharmony_ci MHI_PM_STATE_POR, 4078c2ecf20Sopenharmony_ci MHI_PM_STATE_M0, 4088c2ecf20Sopenharmony_ci MHI_PM_STATE_M2, 4098c2ecf20Sopenharmony_ci MHI_PM_STATE_M3_ENTER, 4108c2ecf20Sopenharmony_ci MHI_PM_STATE_M3, 4118c2ecf20Sopenharmony_ci MHI_PM_STATE_M3_EXIT, 4128c2ecf20Sopenharmony_ci MHI_PM_STATE_FW_DL_ERR, 4138c2ecf20Sopenharmony_ci MHI_PM_STATE_SYS_ERR_DETECT, 4148c2ecf20Sopenharmony_ci MHI_PM_STATE_SYS_ERR_PROCESS, 4158c2ecf20Sopenharmony_ci MHI_PM_STATE_SHUTDOWN_PROCESS, 4168c2ecf20Sopenharmony_ci MHI_PM_STATE_LD_ERR_FATAL_DETECT, 4178c2ecf20Sopenharmony_ci MHI_PM_STATE_MAX 4188c2ecf20Sopenharmony_ci}; 4198c2ecf20Sopenharmony_ci 4208c2ecf20Sopenharmony_ci#define MHI_PM_DISABLE BIT(0) 4218c2ecf20Sopenharmony_ci#define MHI_PM_POR BIT(1) 4228c2ecf20Sopenharmony_ci#define MHI_PM_M0 BIT(2) 4238c2ecf20Sopenharmony_ci#define MHI_PM_M2 BIT(3) 4248c2ecf20Sopenharmony_ci#define MHI_PM_M3_ENTER BIT(4) 4258c2ecf20Sopenharmony_ci#define MHI_PM_M3 BIT(5) 4268c2ecf20Sopenharmony_ci#define MHI_PM_M3_EXIT BIT(6) 4278c2ecf20Sopenharmony_ci/* firmware download failure state */ 4288c2ecf20Sopenharmony_ci#define MHI_PM_FW_DL_ERR BIT(7) 4298c2ecf20Sopenharmony_ci#define MHI_PM_SYS_ERR_DETECT BIT(8) 4308c2ecf20Sopenharmony_ci#define MHI_PM_SYS_ERR_PROCESS BIT(9) 4318c2ecf20Sopenharmony_ci#define MHI_PM_SHUTDOWN_PROCESS BIT(10) 4328c2ecf20Sopenharmony_ci/* link not accessible */ 4338c2ecf20Sopenharmony_ci#define MHI_PM_LD_ERR_FATAL_DETECT BIT(11) 4348c2ecf20Sopenharmony_ci 4358c2ecf20Sopenharmony_ci#define MHI_REG_ACCESS_VALID(pm_state) ((pm_state & (MHI_PM_POR | MHI_PM_M0 | \ 4368c2ecf20Sopenharmony_ci MHI_PM_M2 | MHI_PM_M3_ENTER | MHI_PM_M3_EXIT | \ 4378c2ecf20Sopenharmony_ci MHI_PM_SYS_ERR_DETECT | MHI_PM_SYS_ERR_PROCESS | \ 4388c2ecf20Sopenharmony_ci MHI_PM_SHUTDOWN_PROCESS | MHI_PM_FW_DL_ERR))) 4398c2ecf20Sopenharmony_ci#define MHI_PM_IN_ERROR_STATE(pm_state) (pm_state >= MHI_PM_FW_DL_ERR) 4408c2ecf20Sopenharmony_ci#define MHI_PM_IN_FATAL_STATE(pm_state) (pm_state == MHI_PM_LD_ERR_FATAL_DETECT) 4418c2ecf20Sopenharmony_ci#define MHI_DB_ACCESS_VALID(mhi_cntrl) (mhi_cntrl->pm_state & \ 4428c2ecf20Sopenharmony_ci mhi_cntrl->db_access) 4438c2ecf20Sopenharmony_ci#define MHI_WAKE_DB_CLEAR_VALID(pm_state) (pm_state & (MHI_PM_M0 | \ 4448c2ecf20Sopenharmony_ci MHI_PM_M2 | MHI_PM_M3_EXIT)) 4458c2ecf20Sopenharmony_ci#define MHI_WAKE_DB_SET_VALID(pm_state) (pm_state & MHI_PM_M2) 4468c2ecf20Sopenharmony_ci#define MHI_WAKE_DB_FORCE_SET_VALID(pm_state) MHI_WAKE_DB_CLEAR_VALID(pm_state) 4478c2ecf20Sopenharmony_ci#define MHI_EVENT_ACCESS_INVALID(pm_state) (pm_state == MHI_PM_DISABLE || \ 4488c2ecf20Sopenharmony_ci MHI_PM_IN_ERROR_STATE(pm_state)) 4498c2ecf20Sopenharmony_ci#define MHI_PM_IN_SUSPEND_STATE(pm_state) (pm_state & \ 4508c2ecf20Sopenharmony_ci (MHI_PM_M3_ENTER | MHI_PM_M3)) 4518c2ecf20Sopenharmony_ci 4528c2ecf20Sopenharmony_ci#define NR_OF_CMD_RINGS 1 4538c2ecf20Sopenharmony_ci#define CMD_EL_PER_RING 128 4548c2ecf20Sopenharmony_ci#define PRIMARY_CMD_RING 0 4558c2ecf20Sopenharmony_ci#define MHI_DEV_WAKE_DB 127 4568c2ecf20Sopenharmony_ci#define MHI_MAX_MTU 0xffff 4578c2ecf20Sopenharmony_ci#define MHI_RANDOM_U32_NONZERO(bmsk) (prandom_u32_max(bmsk) + 1) 4588c2ecf20Sopenharmony_ci 4598c2ecf20Sopenharmony_cienum mhi_er_type { 4608c2ecf20Sopenharmony_ci MHI_ER_TYPE_INVALID = 0x0, 4618c2ecf20Sopenharmony_ci MHI_ER_TYPE_VALID = 0x1, 4628c2ecf20Sopenharmony_ci}; 4638c2ecf20Sopenharmony_ci 4648c2ecf20Sopenharmony_cistruct db_cfg { 4658c2ecf20Sopenharmony_ci bool reset_req; 4668c2ecf20Sopenharmony_ci bool db_mode; 4678c2ecf20Sopenharmony_ci u32 pollcfg; 4688c2ecf20Sopenharmony_ci enum mhi_db_brst_mode brstmode; 4698c2ecf20Sopenharmony_ci dma_addr_t db_val; 4708c2ecf20Sopenharmony_ci void (*process_db)(struct mhi_controller *mhi_cntrl, 4718c2ecf20Sopenharmony_ci struct db_cfg *db_cfg, void __iomem *io_addr, 4728c2ecf20Sopenharmony_ci dma_addr_t db_val); 4738c2ecf20Sopenharmony_ci}; 4748c2ecf20Sopenharmony_ci 4758c2ecf20Sopenharmony_cistruct mhi_pm_transitions { 4768c2ecf20Sopenharmony_ci enum mhi_pm_state from_state; 4778c2ecf20Sopenharmony_ci u32 to_states; 4788c2ecf20Sopenharmony_ci}; 4798c2ecf20Sopenharmony_ci 4808c2ecf20Sopenharmony_cistruct state_transition { 4818c2ecf20Sopenharmony_ci struct list_head node; 4828c2ecf20Sopenharmony_ci enum dev_st_transition state; 4838c2ecf20Sopenharmony_ci}; 4848c2ecf20Sopenharmony_ci 4858c2ecf20Sopenharmony_cistruct mhi_ring { 4868c2ecf20Sopenharmony_ci dma_addr_t dma_handle; 4878c2ecf20Sopenharmony_ci dma_addr_t iommu_base; 4888c2ecf20Sopenharmony_ci u64 *ctxt_wp; /* point to ctxt wp */ 4898c2ecf20Sopenharmony_ci void *pre_aligned; 4908c2ecf20Sopenharmony_ci void *base; 4918c2ecf20Sopenharmony_ci void *rp; 4928c2ecf20Sopenharmony_ci void *wp; 4938c2ecf20Sopenharmony_ci size_t el_size; 4948c2ecf20Sopenharmony_ci size_t len; 4958c2ecf20Sopenharmony_ci size_t elements; 4968c2ecf20Sopenharmony_ci size_t alloc_size; 4978c2ecf20Sopenharmony_ci void __iomem *db_addr; 4988c2ecf20Sopenharmony_ci}; 4998c2ecf20Sopenharmony_ci 5008c2ecf20Sopenharmony_cistruct mhi_cmd { 5018c2ecf20Sopenharmony_ci struct mhi_ring ring; 5028c2ecf20Sopenharmony_ci spinlock_t lock; 5038c2ecf20Sopenharmony_ci}; 5048c2ecf20Sopenharmony_ci 5058c2ecf20Sopenharmony_cistruct mhi_buf_info { 5068c2ecf20Sopenharmony_ci void *v_addr; 5078c2ecf20Sopenharmony_ci void *bb_addr; 5088c2ecf20Sopenharmony_ci void *wp; 5098c2ecf20Sopenharmony_ci void *cb_buf; 5108c2ecf20Sopenharmony_ci dma_addr_t p_addr; 5118c2ecf20Sopenharmony_ci size_t len; 5128c2ecf20Sopenharmony_ci enum dma_data_direction dir; 5138c2ecf20Sopenharmony_ci bool used; /* Indicates whether the buffer is used or not */ 5148c2ecf20Sopenharmony_ci bool pre_mapped; /* Already pre-mapped by client */ 5158c2ecf20Sopenharmony_ci}; 5168c2ecf20Sopenharmony_ci 5178c2ecf20Sopenharmony_cistruct mhi_event { 5188c2ecf20Sopenharmony_ci struct mhi_controller *mhi_cntrl; 5198c2ecf20Sopenharmony_ci struct mhi_chan *mhi_chan; /* dedicated to channel */ 5208c2ecf20Sopenharmony_ci u32 er_index; 5218c2ecf20Sopenharmony_ci u32 intmod; 5228c2ecf20Sopenharmony_ci u32 irq; 5238c2ecf20Sopenharmony_ci int chan; /* this event ring is dedicated to a channel (optional) */ 5248c2ecf20Sopenharmony_ci u32 priority; 5258c2ecf20Sopenharmony_ci enum mhi_er_data_type data_type; 5268c2ecf20Sopenharmony_ci struct mhi_ring ring; 5278c2ecf20Sopenharmony_ci struct db_cfg db_cfg; 5288c2ecf20Sopenharmony_ci struct tasklet_struct task; 5298c2ecf20Sopenharmony_ci spinlock_t lock; 5308c2ecf20Sopenharmony_ci int (*process_event)(struct mhi_controller *mhi_cntrl, 5318c2ecf20Sopenharmony_ci struct mhi_event *mhi_event, 5328c2ecf20Sopenharmony_ci u32 event_quota); 5338c2ecf20Sopenharmony_ci bool hw_ring; 5348c2ecf20Sopenharmony_ci bool cl_manage; 5358c2ecf20Sopenharmony_ci bool offload_ev; /* managed by a device driver */ 5368c2ecf20Sopenharmony_ci}; 5378c2ecf20Sopenharmony_ci 5388c2ecf20Sopenharmony_cistruct mhi_chan { 5398c2ecf20Sopenharmony_ci const char *name; 5408c2ecf20Sopenharmony_ci /* 5418c2ecf20Sopenharmony_ci * Important: When consuming, increment tre_ring first and when 5428c2ecf20Sopenharmony_ci * releasing, decrement buf_ring first. If tre_ring has space, buf_ring 5438c2ecf20Sopenharmony_ci * is guranteed to have space so we do not need to check both rings. 5448c2ecf20Sopenharmony_ci */ 5458c2ecf20Sopenharmony_ci struct mhi_ring buf_ring; 5468c2ecf20Sopenharmony_ci struct mhi_ring tre_ring; 5478c2ecf20Sopenharmony_ci u32 chan; 5488c2ecf20Sopenharmony_ci u32 er_index; 5498c2ecf20Sopenharmony_ci u32 intmod; 5508c2ecf20Sopenharmony_ci enum mhi_ch_type type; 5518c2ecf20Sopenharmony_ci enum dma_data_direction dir; 5528c2ecf20Sopenharmony_ci struct db_cfg db_cfg; 5538c2ecf20Sopenharmony_ci enum mhi_ch_ee_mask ee_mask; 5548c2ecf20Sopenharmony_ci enum mhi_ch_state ch_state; 5558c2ecf20Sopenharmony_ci enum mhi_ev_ccs ccs; 5568c2ecf20Sopenharmony_ci struct mhi_device *mhi_dev; 5578c2ecf20Sopenharmony_ci void (*xfer_cb)(struct mhi_device *mhi_dev, struct mhi_result *result); 5588c2ecf20Sopenharmony_ci struct mutex mutex; 5598c2ecf20Sopenharmony_ci struct completion completion; 5608c2ecf20Sopenharmony_ci rwlock_t lock; 5618c2ecf20Sopenharmony_ci struct list_head node; 5628c2ecf20Sopenharmony_ci bool lpm_notify; 5638c2ecf20Sopenharmony_ci bool configured; 5648c2ecf20Sopenharmony_ci bool offload_ch; 5658c2ecf20Sopenharmony_ci bool pre_alloc; 5668c2ecf20Sopenharmony_ci bool auto_start; 5678c2ecf20Sopenharmony_ci bool wake_capable; 5688c2ecf20Sopenharmony_ci}; 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_ci/* Default MHI timeout */ 5718c2ecf20Sopenharmony_ci#define MHI_TIMEOUT_MS (1000) 5728c2ecf20Sopenharmony_ci 5738c2ecf20Sopenharmony_ci/* debugfs related functions */ 5748c2ecf20Sopenharmony_ci#ifdef CONFIG_MHI_BUS_DEBUG 5758c2ecf20Sopenharmony_civoid mhi_create_debugfs(struct mhi_controller *mhi_cntrl); 5768c2ecf20Sopenharmony_civoid mhi_destroy_debugfs(struct mhi_controller *mhi_cntrl); 5778c2ecf20Sopenharmony_civoid mhi_debugfs_init(void); 5788c2ecf20Sopenharmony_civoid mhi_debugfs_exit(void); 5798c2ecf20Sopenharmony_ci#else 5808c2ecf20Sopenharmony_cistatic inline void mhi_create_debugfs(struct mhi_controller *mhi_cntrl) 5818c2ecf20Sopenharmony_ci{ 5828c2ecf20Sopenharmony_ci} 5838c2ecf20Sopenharmony_ci 5848c2ecf20Sopenharmony_cistatic inline void mhi_destroy_debugfs(struct mhi_controller *mhi_cntrl) 5858c2ecf20Sopenharmony_ci{ 5868c2ecf20Sopenharmony_ci} 5878c2ecf20Sopenharmony_ci 5888c2ecf20Sopenharmony_cistatic inline void mhi_debugfs_init(void) 5898c2ecf20Sopenharmony_ci{ 5908c2ecf20Sopenharmony_ci} 5918c2ecf20Sopenharmony_ci 5928c2ecf20Sopenharmony_cistatic inline void mhi_debugfs_exit(void) 5938c2ecf20Sopenharmony_ci{ 5948c2ecf20Sopenharmony_ci} 5958c2ecf20Sopenharmony_ci#endif 5968c2ecf20Sopenharmony_ci 5978c2ecf20Sopenharmony_cistruct mhi_device *mhi_alloc_device(struct mhi_controller *mhi_cntrl); 5988c2ecf20Sopenharmony_ci 5998c2ecf20Sopenharmony_ciint mhi_destroy_device(struct device *dev, void *data); 6008c2ecf20Sopenharmony_civoid mhi_create_devices(struct mhi_controller *mhi_cntrl); 6018c2ecf20Sopenharmony_ci 6028c2ecf20Sopenharmony_ciint mhi_alloc_bhie_table(struct mhi_controller *mhi_cntrl, 6038c2ecf20Sopenharmony_ci struct image_info **image_info, size_t alloc_size); 6048c2ecf20Sopenharmony_civoid mhi_free_bhie_table(struct mhi_controller *mhi_cntrl, 6058c2ecf20Sopenharmony_ci struct image_info *image_info); 6068c2ecf20Sopenharmony_ci 6078c2ecf20Sopenharmony_ci/* Power management APIs */ 6088c2ecf20Sopenharmony_cienum mhi_pm_state __must_check mhi_tryset_pm_state( 6098c2ecf20Sopenharmony_ci struct mhi_controller *mhi_cntrl, 6108c2ecf20Sopenharmony_ci enum mhi_pm_state state); 6118c2ecf20Sopenharmony_ciconst char *to_mhi_pm_state_str(enum mhi_pm_state state); 6128c2ecf20Sopenharmony_cienum mhi_ee_type mhi_get_exec_env(struct mhi_controller *mhi_cntrl); 6138c2ecf20Sopenharmony_ciint mhi_queue_state_transition(struct mhi_controller *mhi_cntrl, 6148c2ecf20Sopenharmony_ci enum dev_st_transition state); 6158c2ecf20Sopenharmony_civoid mhi_pm_st_worker(struct work_struct *work); 6168c2ecf20Sopenharmony_civoid mhi_pm_sys_err_handler(struct mhi_controller *mhi_cntrl); 6178c2ecf20Sopenharmony_civoid mhi_fw_load_worker(struct work_struct *work); 6188c2ecf20Sopenharmony_ciint mhi_ready_state_transition(struct mhi_controller *mhi_cntrl); 6198c2ecf20Sopenharmony_ciint mhi_pm_m0_transition(struct mhi_controller *mhi_cntrl); 6208c2ecf20Sopenharmony_civoid mhi_pm_m1_transition(struct mhi_controller *mhi_cntrl); 6218c2ecf20Sopenharmony_ciint mhi_pm_m3_transition(struct mhi_controller *mhi_cntrl); 6228c2ecf20Sopenharmony_ciint __mhi_device_get_sync(struct mhi_controller *mhi_cntrl); 6238c2ecf20Sopenharmony_ciint mhi_send_cmd(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan, 6248c2ecf20Sopenharmony_ci enum mhi_cmd_type cmd); 6258c2ecf20Sopenharmony_cistatic inline bool mhi_is_active(struct mhi_controller *mhi_cntrl) 6268c2ecf20Sopenharmony_ci{ 6278c2ecf20Sopenharmony_ci return (mhi_cntrl->dev_state >= MHI_STATE_M0 && 6288c2ecf20Sopenharmony_ci mhi_cntrl->dev_state <= MHI_STATE_M3_FAST); 6298c2ecf20Sopenharmony_ci} 6308c2ecf20Sopenharmony_ci 6318c2ecf20Sopenharmony_cistatic inline void mhi_trigger_resume(struct mhi_controller *mhi_cntrl) 6328c2ecf20Sopenharmony_ci{ 6338c2ecf20Sopenharmony_ci pm_wakeup_event(&mhi_cntrl->mhi_dev->dev, 0); 6348c2ecf20Sopenharmony_ci mhi_cntrl->runtime_get(mhi_cntrl); 6358c2ecf20Sopenharmony_ci mhi_cntrl->runtime_put(mhi_cntrl); 6368c2ecf20Sopenharmony_ci} 6378c2ecf20Sopenharmony_ci 6388c2ecf20Sopenharmony_ci/* Register access methods */ 6398c2ecf20Sopenharmony_civoid mhi_db_brstmode(struct mhi_controller *mhi_cntrl, struct db_cfg *db_cfg, 6408c2ecf20Sopenharmony_ci void __iomem *db_addr, dma_addr_t db_val); 6418c2ecf20Sopenharmony_civoid mhi_db_brstmode_disable(struct mhi_controller *mhi_cntrl, 6428c2ecf20Sopenharmony_ci struct db_cfg *db_mode, void __iomem *db_addr, 6438c2ecf20Sopenharmony_ci dma_addr_t db_val); 6448c2ecf20Sopenharmony_ciint __must_check mhi_read_reg(struct mhi_controller *mhi_cntrl, 6458c2ecf20Sopenharmony_ci void __iomem *base, u32 offset, u32 *out); 6468c2ecf20Sopenharmony_ciint __must_check mhi_read_reg_field(struct mhi_controller *mhi_cntrl, 6478c2ecf20Sopenharmony_ci void __iomem *base, u32 offset, u32 mask, 6488c2ecf20Sopenharmony_ci u32 shift, u32 *out); 6498c2ecf20Sopenharmony_civoid mhi_write_reg(struct mhi_controller *mhi_cntrl, void __iomem *base, 6508c2ecf20Sopenharmony_ci u32 offset, u32 val); 6518c2ecf20Sopenharmony_civoid mhi_write_reg_field(struct mhi_controller *mhi_cntrl, void __iomem *base, 6528c2ecf20Sopenharmony_ci u32 offset, u32 mask, u32 shift, u32 val); 6538c2ecf20Sopenharmony_civoid mhi_ring_er_db(struct mhi_event *mhi_event); 6548c2ecf20Sopenharmony_civoid mhi_write_db(struct mhi_controller *mhi_cntrl, void __iomem *db_addr, 6558c2ecf20Sopenharmony_ci dma_addr_t db_val); 6568c2ecf20Sopenharmony_civoid mhi_ring_cmd_db(struct mhi_controller *mhi_cntrl, struct mhi_cmd *mhi_cmd); 6578c2ecf20Sopenharmony_civoid mhi_ring_chan_db(struct mhi_controller *mhi_cntrl, 6588c2ecf20Sopenharmony_ci struct mhi_chan *mhi_chan); 6598c2ecf20Sopenharmony_ci 6608c2ecf20Sopenharmony_ci/* Initialization methods */ 6618c2ecf20Sopenharmony_ciint mhi_init_mmio(struct mhi_controller *mhi_cntrl); 6628c2ecf20Sopenharmony_ciint mhi_init_dev_ctxt(struct mhi_controller *mhi_cntrl); 6638c2ecf20Sopenharmony_civoid mhi_deinit_dev_ctxt(struct mhi_controller *mhi_cntrl); 6648c2ecf20Sopenharmony_ciint mhi_init_irq_setup(struct mhi_controller *mhi_cntrl); 6658c2ecf20Sopenharmony_civoid mhi_deinit_free_irq(struct mhi_controller *mhi_cntrl); 6668c2ecf20Sopenharmony_civoid mhi_rddm_prepare(struct mhi_controller *mhi_cntrl, 6678c2ecf20Sopenharmony_ci struct image_info *img_info); 6688c2ecf20Sopenharmony_civoid mhi_fw_load_handler(struct mhi_controller *mhi_cntrl); 6698c2ecf20Sopenharmony_ciint mhi_prepare_channel(struct mhi_controller *mhi_cntrl, 6708c2ecf20Sopenharmony_ci struct mhi_chan *mhi_chan); 6718c2ecf20Sopenharmony_ciint mhi_init_chan_ctxt(struct mhi_controller *mhi_cntrl, 6728c2ecf20Sopenharmony_ci struct mhi_chan *mhi_chan); 6738c2ecf20Sopenharmony_civoid mhi_deinit_chan_ctxt(struct mhi_controller *mhi_cntrl, 6748c2ecf20Sopenharmony_ci struct mhi_chan *mhi_chan); 6758c2ecf20Sopenharmony_civoid mhi_reset_chan(struct mhi_controller *mhi_cntrl, 6768c2ecf20Sopenharmony_ci struct mhi_chan *mhi_chan); 6778c2ecf20Sopenharmony_ci 6788c2ecf20Sopenharmony_ci/* Memory allocation methods */ 6798c2ecf20Sopenharmony_cistatic inline void *mhi_alloc_coherent(struct mhi_controller *mhi_cntrl, 6808c2ecf20Sopenharmony_ci size_t size, 6818c2ecf20Sopenharmony_ci dma_addr_t *dma_handle, 6828c2ecf20Sopenharmony_ci gfp_t gfp) 6838c2ecf20Sopenharmony_ci{ 6848c2ecf20Sopenharmony_ci void *buf = dma_alloc_coherent(mhi_cntrl->cntrl_dev, size, dma_handle, 6858c2ecf20Sopenharmony_ci gfp); 6868c2ecf20Sopenharmony_ci 6878c2ecf20Sopenharmony_ci return buf; 6888c2ecf20Sopenharmony_ci} 6898c2ecf20Sopenharmony_ci 6908c2ecf20Sopenharmony_cistatic inline void mhi_free_coherent(struct mhi_controller *mhi_cntrl, 6918c2ecf20Sopenharmony_ci size_t size, 6928c2ecf20Sopenharmony_ci void *vaddr, 6938c2ecf20Sopenharmony_ci dma_addr_t dma_handle) 6948c2ecf20Sopenharmony_ci{ 6958c2ecf20Sopenharmony_ci dma_free_coherent(mhi_cntrl->cntrl_dev, size, vaddr, dma_handle); 6968c2ecf20Sopenharmony_ci} 6978c2ecf20Sopenharmony_ci 6988c2ecf20Sopenharmony_ci/* Event processing methods */ 6998c2ecf20Sopenharmony_civoid mhi_ctrl_ev_task(unsigned long data); 7008c2ecf20Sopenharmony_civoid mhi_ev_task(unsigned long data); 7018c2ecf20Sopenharmony_ciint mhi_process_data_event_ring(struct mhi_controller *mhi_cntrl, 7028c2ecf20Sopenharmony_ci struct mhi_event *mhi_event, u32 event_quota); 7038c2ecf20Sopenharmony_ciint mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl, 7048c2ecf20Sopenharmony_ci struct mhi_event *mhi_event, u32 event_quota); 7058c2ecf20Sopenharmony_ci 7068c2ecf20Sopenharmony_ci/* ISR handlers */ 7078c2ecf20Sopenharmony_ciirqreturn_t mhi_irq_handler(int irq_number, void *dev); 7088c2ecf20Sopenharmony_ciirqreturn_t mhi_intvec_threaded_handler(int irq_number, void *dev); 7098c2ecf20Sopenharmony_ciirqreturn_t mhi_intvec_handler(int irq_number, void *dev); 7108c2ecf20Sopenharmony_ci 7118c2ecf20Sopenharmony_ciint mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan, 7128c2ecf20Sopenharmony_ci struct mhi_buf_info *info, enum mhi_flags flags); 7138c2ecf20Sopenharmony_ciint mhi_map_single_no_bb(struct mhi_controller *mhi_cntrl, 7148c2ecf20Sopenharmony_ci struct mhi_buf_info *buf_info); 7158c2ecf20Sopenharmony_ciint mhi_map_single_use_bb(struct mhi_controller *mhi_cntrl, 7168c2ecf20Sopenharmony_ci struct mhi_buf_info *buf_info); 7178c2ecf20Sopenharmony_civoid mhi_unmap_single_no_bb(struct mhi_controller *mhi_cntrl, 7188c2ecf20Sopenharmony_ci struct mhi_buf_info *buf_info); 7198c2ecf20Sopenharmony_civoid mhi_unmap_single_use_bb(struct mhi_controller *mhi_cntrl, 7208c2ecf20Sopenharmony_ci struct mhi_buf_info *buf_info); 7218c2ecf20Sopenharmony_ci 7228c2ecf20Sopenharmony_ci#endif /* _MHI_INT_H */ 723