diff --git a/config/dataipa_GKI.conf b/config/dataipa_GKI.conf index 075a7198f2..a26fef0079 100644 --- a/config/dataipa_GKI.conf +++ b/config/dataipa_GKI.conf @@ -2,4 +2,5 @@ export CONFIG_GSI=m export CONFIG_IPA_CLIENTS_MANAGER=m export CONFIG_IPA_WDI_UNIFIED_API=y export CONFIG_RMNET_IPA3=y +export CONFIG_IPA3_MHI_PRIME_MANAGER=y export CONFIG_RNDIS_IPA=m diff --git a/config/dataipa_vendor.h b/config/dataipa_vendor.h index 7b64081038..210d477259 100644 --- a/config/dataipa_vendor.h +++ b/config/dataipa_vendor.h @@ -8,3 +8,4 @@ #define CONFIG_RNDIS_IPA 1 #define CONFIG_IPA_WDI_UNIFIED_API 1 #define CONFIG_IPA_VENDOR_DLKM 1 +#define CONFIG_IPA3_MHI_PRIME_MANAGER 1 diff --git a/drivers/platform/msm/ipa/Kbuild b/drivers/platform/msm/ipa/Kbuild index 424d73ebad..48bc30063e 100644 --- a/drivers/platform/msm/ipa/Kbuild +++ b/drivers/platform/msm/ipa/Kbuild @@ -38,6 +38,8 @@ ipam-$(CONFIG_RMNET_IPA3) += ipa_v3/rmnet_ipa.o ipa_v3/ipa_qmi_service_v01.o \ ipa_v3/ipa_qmi_service.o ipa_v3/rmnet_ctl_ipa.o \ ipa_v3/rmnet_ipa_fd_ioctl.o +ipam-$(CONFIG_IPA3_MHI_PRIME_MANAGER) += ipa_v3/ipa_mpm.o + ipam-$(CONFIG_IPA3_MHI_PROXY) += ipa_v3/ipa_mhi_proxy.o ipam-$(CONFIG_IPA_EMULATION) += ipa_v3/ipa_dt_replacement.o ipam-$(CONFIG_IPA3_REGDUMP) += ipa_v3/dump/ipa_reg_dump.o diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 60eaa784fb..daa08653c0 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -6944,6 +6944,12 @@ static int ipa3_post_init(const struct ipa3_plat_drv_res *resource_p, ipa3_debugfs_init(); + result = ipa_mpm_init(); + if (result) + IPAERR("fail to init mpm %d\n", result); + else + IPADBG(":mpm init init ok\n"); + mutex_lock(&ipa3_ctx->lock); ipa3_ctx->ipa_initialization_complete = true; if (ipa3_ctx->clients_registered) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index 45347fa143..f3c0bd32a8 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -3253,6 +3253,8 @@ int ipa3_get_gsi_chan_info(struct gsi_chan_info *gsi_chan_info, int ipa3_disable_apps_wan_cons_deaggr(uint32_t agg_size, uint32_t agg_count); #if IS_ENABLED(CONFIG_IPA3_MHI_PRIME_MANAGER) +int ipa_mpm_init(void); +void ipa_mpm_exit(void); int ipa_mpm_mhip_xdci_pipe_enable(enum ipa_usb_teth_prot prot); int ipa_mpm_mhip_xdci_pipe_disable(enum ipa_usb_teth_prot xdci_teth_prot); int ipa_mpm_notify_wan_state(struct wan_ioctl_notify_wan_state *state); @@ -3263,6 +3265,14 @@ int ipa_mpm_panic_handler(char *buf, int size); int ipa3_mpm_enable_adpl_over_odl(bool enable); int ipa3_get_mhip_gsi_stats(struct ipa_uc_dbg_ring_stats *stats); #else /* IS_ENABLED(CONFIG_IPA3_MHI_PRIME_MANAGER) */ +static inline int ipa_mpm_init(void) +{ + return 0; +} +static inline void ipa_mpm_exit(void) +{ + return; +} static inline int ipa_mpm_mhip_xdci_pipe_enable( enum ipa_usb_teth_prot prot) { diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_mpm.c b/drivers/platform/msm/ipa/ipa_v3/ipa_mpm.c index a42c543b53..783628b354 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_mpm.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_mpm.c @@ -560,7 +560,7 @@ static int ipa_mpm_set_dma_mode(enum ipa_client_type src_pipe, ep_cfg.mode.dst = dst_pipe; ep_cfg.seq.set_dynamic = true; - result = ipa_cfg_ep(ipa_get_ep_mapping(src_pipe), &ep_cfg); + result = ipa3_cfg_ep(ipa_get_ep_mapping(src_pipe), &ep_cfg); IPA_MPM_FUNC_EXIT(); destroy_imm_cmd: @@ -1649,7 +1649,11 @@ static int ipa_mpm_start_stop_remote_mhip_chan( IPA_MPM_DBG("Remote channel already started for %d\n", probe_id); } else { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + ret = mhi_start_transfer(mhi_dev); +#else ret = mhi_resume_transfer(mhi_dev); +#endif mutex_lock(&ipa_mpm_ctx->md[probe_id].mhi_mutex); if (ret) ipa_mpm_ctx->md[probe_id].remote_state = @@ -1665,7 +1669,11 @@ static int ipa_mpm_start_stop_remote_mhip_chan( IPA_MPM_DBG("Remote channel already stopped for %d\n", probe_id); } else { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) + ret = mhi_stop_transfer(mhi_dev); +#else ret = mhi_pause_transfer(mhi_dev); +#endif mutex_lock(&ipa_mpm_ctx->md[probe_id].mhi_mutex); if (ret) ipa_mpm_ctx->md[probe_id].remote_state = @@ -1684,7 +1692,7 @@ static enum mhip_status_type ipa_mpm_start_stop_mhip_chan( int probe_id, enum ipa_mpm_start_stop_type start_stop) { - int ipa_ep_idx; + int ipa_ep_idx = IPA_EP_NOT_ALLOCATED; struct ipa3_ep_context *ep; bool is_start; enum ipa_client_type ul_chan, dl_chan; @@ -2753,6 +2761,7 @@ static void ipa_mpm_mhi_status_cb(struct mhi_device *mhi_dev, case MHI_CB_FATAL_ERROR: case MHI_CB_EE_MISSION_MODE: case MHI_CB_DTR_SIGNAL: + default: IPA_MPM_ERR("unexpected event %d\n", mhi_cb); break; } @@ -2784,7 +2793,7 @@ int ipa_mpm_mhip_xdci_pipe_enable(enum ipa_usb_teth_prot xdci_teth_prot) int probe_id = IPA_MPM_MHIP_CH_ID_MAX; int i; enum ipa_mpm_mhip_client_type mhip_client; - enum mhip_status_type status; + enum mhip_status_type status = MHIP_STATUS_SUCCESS; int pipe_idx; bool is_acted = true; int ret = 0; @@ -2919,6 +2928,7 @@ int ipa_mpm_mhip_xdci_pipe_enable(enum ipa_usb_teth_prot xdci_teth_prot) } return ret; } +EXPORT_SYMBOL(ipa_mpm_mhip_xdci_pipe_enable); int ipa_mpm_mhip_xdci_pipe_disable(enum ipa_usb_teth_prot xdci_teth_prot) { @@ -3042,6 +3052,7 @@ int ipa_mpm_mhip_xdci_pipe_disable(enum ipa_usb_teth_prot xdci_teth_prot) return ret; } +EXPORT_SYMBOL(ipa_mpm_mhip_xdci_pipe_disable); static int ipa_mpm_populate_smmu_info(struct platform_device *pdev) { @@ -3228,13 +3239,13 @@ static struct platform_driver ipa_ipa_mpm_driver = { * * Return: None */ -static int __init ipa_mpm_init(void) +int ipa_mpm_init(void) { IPA_MPM_DBG("register ipa_mpm platform device\n"); return platform_driver_register(&ipa_ipa_mpm_driver); } -static void __exit ipa_mpm_exit(void) +void ipa_mpm_exit(void) { IPA_MPM_DBG("unregister ipa_mpm platform device\n"); platform_driver_unregister(&ipa_ipa_mpm_driver); @@ -3253,6 +3264,7 @@ int ipa3_is_mhip_offload_enabled(void) else return 1; } +EXPORT_SYMBOL(ipa3_is_mhip_offload_enabled); int ipa_mpm_panic_handler(char *buf, int size) { @@ -3406,7 +3418,5 @@ int ipa3_mpm_enable_adpl_over_odl(bool enable) return ret; } -late_initcall(ipa_mpm_init); -module_exit(ipa_mpm_exit); MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("MHI Proxy Manager Driver"); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index 49cd3baa15..6bba46021a 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -291,6 +291,7 @@ enum ipa_ver { IPA_5_0, IPA_5_0_MHI, IPA_5_1, + IPA_5_1_APQ, IPA_VER_MAX, }; @@ -551,6 +552,21 @@ static const struct rsrc_min_max ipa3_rsrc_src_grp_config [IPA_v5_0_RSRC_GRP_TYPE_SRC_ACK_ENTRIES] = { {22, 22}, {16, 16}, {0, 0}, {0, 0}, {16, 16}, {0, 0}, {0, 0}, }, }, + + [IPA_5_1_APQ] = { + /* UL DL unused unused URLLC UC_RX_Q N/A */ + [IPA_v5_0_RSRC_GRP_TYPE_SRC_PKT_CONTEXTS] = { + {3, 9}, {4, 10}, {0, 0}, {0, 0}, {1, 63}, {0, 63}, {0, 0}, }, + [IPA_v5_0_RSRC_GRP_TYPE_SRC_DESCRIPTOR_LISTS] = { + {9, 9}, {12, 12}, {0, 0}, {0, 0}, {10, 10}, {0, 0}, {0, 0}, }, + [IPA_v5_0_RSRC_GRP_TYPE_SRC_DESCRIPTOR_BUFF] = { + {9, 9}, {24, 24}, {0, 0}, {0, 0}, {20, 20}, {0, 0}, {0, 0}, }, + [IPA_v5_0_RSRC_GRP_TYPE_SRC_HPS_DMARS] = { + {0, 63}, {0, 63}, {0, 63}, {0, 63}, {1, 63}, {0, 63}, {0, 0}, }, + [IPA_v5_0_RSRC_GRP_TYPE_SRC_ACK_ENTRIES] = { + {22, 22}, {16, 16}, {0, 0}, {0, 0}, {16, 16}, {0, 0}, {0, 0}, }, + }, + }; static const struct rsrc_min_max ipa3_rsrc_dst_grp_config @@ -691,6 +707,15 @@ static const struct rsrc_min_max ipa3_rsrc_dst_grp_config [IPA_v5_0_RSRC_GRP_TYPE_DST_DPS_DMARS] = { {0, 3}, {0, 3}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, }, }, + + [IPA_5_1_APQ] = { + /* UL DL unused unused unused UC_RX_Q DRBIP N/A */ + [IPA_v5_0_RSRC_GRP_TYPE_DST_DATA_SECTORS] = { + {6, 6}, {5, 5}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {39, 39}, }, + [IPA_v5_0_RSRC_GRP_TYPE_DST_DPS_DMARS] = { + {0, 3}, {0, 3}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, }, + }, + }; static const struct rsrc_min_max ipa3_rsrc_rx_grp_config @@ -791,6 +816,13 @@ static const struct rsrc_min_max ipa3_rsrc_rx_grp_config [IPA_RSRC_GRP_TYPE_RX_HPS_CMDQ] = { {3, 3}, {3, 3}, {0, 0}, {0, 0}, {3, 3}, {0, 0} }, }, + + [IPA_5_1_APQ] = { + /* UL DL unused unused URLLC UC_RX_Q */ + [IPA_RSRC_GRP_TYPE_RX_HPS_CMDQ] = { + {3, 3}, {3, 3}, {0, 0}, {0, 0}, {3, 3}, {0, 0} }, + }, + }; static const u32 ipa3_rsrc_rx_grp_hps_weight_config @@ -4790,6 +4822,86 @@ static const struct ipa_ep_configuration ipa3_ep_mapping QMB_MASTER_SELECT_PCIE, { 34, 25, 9, 9, IPA_EE_AP, GSI_SMART_PRE_FETCH, 3 }, IPA_TX_INSTANCE_DL }, + + /* IPA_5_1_APQ */ + [IPA_5_1_APQ][IPA_CLIENT_MHI_PRIME_DPL_PROD] = { + true, IPA_v5_0_GROUP_DL, + true, + IPA_DPS_HPS_SEQ_TYPE_DMA_ONLY, + QMB_MASTER_SELECT_DDR, + {8, 18, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY, 0 }, + IPA_TX_INSTANCE_NA }, + [IPA_5_1_APQ][IPA_CLIENT_MHI_PRIME_RMNET_PROD] = { + true, IPA_v5_0_GROUP_DL, + true, + IPA_DPS_HPS_SEQ_TYPE_DMA_ONLY, + QMB_MASTER_SELECT_DDR, + { 3, 15, 8, 16, IPA_EE_AP, GSI_SMART_PRE_FETCH, 3 }, + IPA_TX_INSTANCE_NA }, + [IPA_5_1_APQ][IPA_CLIENT_USB_PROD] = { + true, IPA_v5_0_GROUP_UL, + true, + IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP, + QMB_MASTER_SELECT_DDR, + { 1, 0, 8, 16, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY, 0}, + IPA_TX_INSTANCE_NA }, + [IPA_5_1_APQ][IPA_CLIENT_APPS_WAN_PROD] = { + true, IPA_v5_0_GROUP_UL, + true, + IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP, + QMB_MASTER_SELECT_DDR, + { 2, 11, 25, 32, IPA_EE_AP, GSI_SMART_PRE_FETCH, 3}, + IPA_TX_INSTANCE_NA }, + [IPA_5_1_APQ][IPA_CLIENT_APPS_LAN_PROD] = { + true, IPA_v5_0_GROUP_UL, + false, + IPA_DPS_HPS_SEQ_TYPE_PKT_PROCESS_NO_DEC_UCP, + QMB_MASTER_SELECT_DDR, + { 9, 19, 26, 32, IPA_EE_AP, GSI_SMART_PRE_FETCH, 4}, + IPA_TX_INSTANCE_NA }, + [IPA_5_1_APQ][IPA_CLIENT_APPS_CMD_PROD] = { + true, IPA_v5_0_GROUP_UL, + false, + IPA_DPS_HPS_SEQ_TYPE_DMA_ONLY, + QMB_MASTER_SELECT_DDR, + { 14, 12, 20, 24, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY, 0}, + IPA_TX_INSTANCE_NA }, + + [IPA_5_1_APQ][IPA_CLIENT_MHI_PRIME_RMNET_CONS] = { + true, IPA_v5_0_GROUP_UL, + false, + IPA_DPS_HPS_SEQ_TYPE_INVALID, + QMB_MASTER_SELECT_DDR, + { 31, 8, 9, 9, IPA_EE_AP, GSI_SMART_PRE_FETCH, 3 }, + IPA_TX_INSTANCE_DL }, + [IPA_5_1_APQ][IPA_CLIENT_APPS_LAN_CONS] = { + true, IPA_v5_0_GROUP_UL, + false, + IPA_DPS_HPS_SEQ_TYPE_INVALID, + QMB_MASTER_SELECT_DDR, + { 16, 13, 9, 9, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY, 0}, + IPA_TX_INSTANCE_UL }, + [IPA_5_1_APQ][IPA_CLIENT_USB_DPL_CONS] = { + true, IPA_v5_0_GROUP_DL, + false, + IPA_DPS_HPS_SEQ_TYPE_INVALID, + QMB_MASTER_SELECT_DDR, + { 24, 20, 5, 5, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY, 0}, + IPA_TX_INSTANCE_DL }, + [IPA_5_1_APQ][IPA_CLIENT_ODL_DPL_CONS] = { + true, IPA_v5_0_GROUP_DL, + false, + IPA_DPS_HPS_SEQ_TYPE_INVALID, + QMB_MASTER_SELECT_DDR, + { 25, 2, 5, 5, IPA_EE_AP, GSI_ESCAPE_BUF_ONLY, 0}, + IPA_TX_INSTANCE_DL }, + [IPA_5_1_APQ][IPA_CLIENT_USB_CONS] = { + true, IPA_v5_0_GROUP_DL, + false, + IPA_DPS_HPS_SEQ_TYPE_INVALID, + QMB_MASTER_SELECT_DDR, + { 29, 23, 9, 9, IPA_EE_AP, GSI_SMART_PRE_FETCH, 3}, + IPA_TX_INSTANCE_DL }, }; static struct ipa3_mem_partition ipa_4_1_mem_part = { @@ -6189,6 +6301,8 @@ u8 ipa3_get_hw_type_index(void) break; case IPA_HW_v5_1: hw_type_index = IPA_5_1; + if (ipa3_ctx->platform_type == IPA_PLAT_TYPE_APQ) + hw_type_index = IPA_5_1_APQ; break; default: IPAERR("Incorrect IPA version %d\n", ipa3_ctx->ipa_hw_type); @@ -10009,6 +10123,7 @@ static void ipa3_write_rsrc_grp_type_reg(int group_index, case IPA_5_0: case IPA_5_0_MHI: case IPA_5_1: + case IPA_5_1_APQ: if (src) { switch (group_index) { case IPA_v5_0_GROUP_UL: @@ -10250,6 +10365,7 @@ void ipa3_set_resorce_groups_min_max_limits(void) case IPA_5_0: case IPA_5_0_MHI: case IPA_5_1: + case IPA_5_1_APQ: src_rsrc_type_max = IPA_v5_0_RSRC_GRP_TYPE_SRC_MAX; dst_rsrc_type_max = IPA_v5_0_RSRC_GRP_TYPE_DST_MAX; src_grp_idx_max = IPA_v5_0_SRC_GROUP_MAX;