Loading drivers/platform/msm/ipa/ipa_clients/ipa_wdi3.c +55 −26 Original line number Diff line number Diff line /* Copyright (c) 2017 The Linux Foundation. All rights reserved. /* Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -121,7 +121,7 @@ int ipa_wdi_init(struct ipa_wdi_init_in_params *in, ipa_wdi_ctx->is_smmu_enabled = out->is_smmu_enabled; if (ipa3_ctx->ipa_wdi3_over_gsi) if (IPA_WDI2_OVER_GSI() && (in->wdi_version == IPA_WDI_3)) out->is_over_gsi = true; else out->is_over_gsi = false; Loading @@ -129,6 +129,15 @@ int ipa_wdi_init(struct ipa_wdi_init_in_params *in, } EXPORT_SYMBOL(ipa_wdi_init); int ipa3_get_wdi_version(void) { if (ipa_wdi_ctx) return ipa_wdi_ctx->wdi_version; /* default version is IPA_WDI_3 */ return IPA_WDI_3; } EXPORT_SYMBOL(ipa3_get_wdi_version); int ipa_wdi_cleanup(void) { struct ipa_wdi_intf_info *entry; Loading Loading @@ -255,20 +264,22 @@ int ipa_wdi_reg_intf(struct ipa_wdi_reg_intf_in_params *in) memset(tx_prop, 0, sizeof(tx_prop)); tx_prop[0].ip = IPA_IP_v4; if (!ipa3_ctx->ipa_wdi3_over_gsi) tx_prop[0].dst_pipe = IPA_CLIENT_WLAN1_CONS; else if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) tx_prop[0].dst_pipe = IPA_CLIENT_WLAN2_CONS; else tx_prop[0].dst_pipe = IPA_CLIENT_WLAN1_CONS; tx_prop[0].alt_dst_pipe = in->alt_dst_pipe; tx_prop[0].hdr_l2_type = in->hdr_info[0].hdr_type; strlcpy(tx_prop[0].hdr_name, hdr->hdr[IPA_IP_v4].name, sizeof(tx_prop[0].hdr_name)); tx_prop[1].ip = IPA_IP_v6; if (!ipa3_ctx->ipa_wdi3_over_gsi) tx_prop[1].dst_pipe = IPA_CLIENT_WLAN1_CONS; else if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) tx_prop[1].dst_pipe = IPA_CLIENT_WLAN2_CONS; else tx_prop[1].dst_pipe = IPA_CLIENT_WLAN1_CONS; tx_prop[1].alt_dst_pipe = in->alt_dst_pipe; tx_prop[1].hdr_l2_type = in->hdr_info[1].hdr_type; strlcpy(tx_prop[1].hdr_name, hdr->hdr[IPA_IP_v6].name, Loading @@ -279,10 +290,11 @@ int ipa_wdi_reg_intf(struct ipa_wdi_reg_intf_in_params *in) rx.prop = rx_prop; memset(rx_prop, 0, sizeof(rx_prop)); rx_prop[0].ip = IPA_IP_v4; if (!ipa3_ctx->ipa_wdi3_over_gsi) rx_prop[0].src_pipe = IPA_CLIENT_WLAN1_PROD; else if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) rx_prop[0].src_pipe = IPA_CLIENT_WLAN2_PROD; else rx_prop[0].src_pipe = IPA_CLIENT_WLAN1_PROD; rx_prop[0].hdr_l2_type = in->hdr_info[0].hdr_type; if (in->is_meta_data_valid) { rx_prop[0].attrib.attrib_mask |= IPA_FLT_META_DATA; Loading @@ -291,10 +303,11 @@ int ipa_wdi_reg_intf(struct ipa_wdi_reg_intf_in_params *in) } rx_prop[1].ip = IPA_IP_v6; if (!ipa3_ctx->ipa_wdi3_over_gsi) rx_prop[1].src_pipe = IPA_CLIENT_WLAN1_PROD; else if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) rx_prop[1].src_pipe = IPA_CLIENT_WLAN2_PROD; else rx_prop[1].src_pipe = IPA_CLIENT_WLAN1_PROD; rx_prop[1].hdr_l2_type = in->hdr_info[1].hdr_type; if (in->is_meta_data_valid) { rx_prop[1].attrib.attrib_mask |= IPA_FLT_META_DATA; Loading Loading @@ -545,6 +558,10 @@ int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, in->u_rx.rx.event_ring_doorbell_pa; in_rx.u.ul.rdy_comp_ring_size = in->u_rx.rx.event_ring_size; in_rx.u.ul.is_txr_rn_db_pcie_addr = in->u_rx.rx.is_txr_rn_db_pcie_addr; in_rx.u.ul.is_evt_rn_db_pcie_addr = in->u_rx.rx.is_evt_rn_db_pcie_addr; if (ipa_connect_wdi_pipe(&in_rx, &out_rx)) { IPA_WDI_ERR("fail to setup rx pipe\n"); ret = -EFAULT; Loading @@ -570,6 +587,10 @@ int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, in->u_tx.tx.event_ring_size; in_tx.u.dl.num_tx_buffers = in->u_tx.tx.num_pkt_buffers; in_tx.u.dl.is_txr_rn_db_pcie_addr = in->u_tx.tx.is_txr_rn_db_pcie_addr; in_tx.u.dl.is_evt_rn_db_pcie_addr = in->u_tx.tx.is_evt_rn_db_pcie_addr; if (ipa_connect_wdi_pipe(&in_tx, &out_tx)) { IPA_WDI_ERR("fail to setup tx pipe\n"); ret = -EFAULT; Loading Loading @@ -597,6 +618,10 @@ int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, in->u_rx.rx_smmu.event_ring_doorbell_pa; in_rx.u.ul_smmu.rdy_comp_ring_size = in->u_rx.rx_smmu.event_ring_size; in_rx.u.ul_smmu.is_txr_rn_db_pcie_addr = in->u_rx.rx_smmu.is_txr_rn_db_pcie_addr; in_rx.u.ul_smmu.is_evt_rn_db_pcie_addr = in->u_rx.rx_smmu.is_evt_rn_db_pcie_addr; if (ipa_connect_wdi_pipe(&in_rx, &out_rx)) { IPA_WDI_ERR("fail to setup rx pipe\n"); ret = -EFAULT; Loading @@ -622,6 +647,10 @@ int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, in->u_tx.tx_smmu.event_ring_size; in_tx.u.dl_smmu.num_tx_buffers = in->u_tx.tx_smmu.num_pkt_buffers; in_tx.u.dl_smmu.is_txr_rn_db_pcie_addr = in->u_tx.tx_smmu.is_txr_rn_db_pcie_addr; in_tx.u.dl_smmu.is_evt_rn_db_pcie_addr = in->u_tx.tx_smmu.is_evt_rn_db_pcie_addr; if (ipa_connect_wdi_pipe(&in_tx, &out_tx)) { IPA_WDI_ERR("fail to setup tx pipe\n"); ret = -EFAULT; Loading Loading @@ -673,12 +702,12 @@ int ipa_wdi_disconn_pipes(void) } } if (!ipa3_ctx->ipa_wdi3_over_gsi) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } else { if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_CONS); } else { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { Loading Loading @@ -734,12 +763,12 @@ int ipa_wdi_enable_pipes(void) return -EPERM; } if (!ipa3_ctx->ipa_wdi3_over_gsi) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } else { if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_CONS); } else { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { Loading Loading @@ -800,12 +829,12 @@ int ipa_wdi_disable_pipes(void) return -EPERM; } if (!ipa3_ctx->ipa_wdi3_over_gsi) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } else { if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_CONS); } else { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { Loading drivers/platform/msm/ipa/ipa_v3/ipa.c +2 −2 Original line number Diff line number Diff line Loading @@ -8699,8 +8699,8 @@ int ipa3_get_smmu_params(struct ipa_smmu_in_params *in, switch (in->smmu_client) { case IPA_SMMU_WLAN_CLIENT: if (ipa3_ctx->ipa_wdi3_over_gsi || ipa3_ctx->ipa_wdi2_over_gsi) if (ipa3_get_wdi_version() == IPA_WDI_3 || IPA_WDI2_OVER_GSI()) is_smmu_enable = !(ipa3_ctx->s1_bypass_arr[IPA_SMMU_CB_AP] | ipa3_ctx->s1_bypass_arr[IPA_SMMU_CB_WLAN]); Loading drivers/platform/msm/ipa/ipa_v3/ipa_i.h +4 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,9 @@ /*Bit pattern for SW to identify PC restoration completed */ #define PC_RESTORE_CONTEXT_STATUS_SUCCESS 0xCAFECAFE #define IPA_WDI2_OVER_GSI() (ipa3_ctx->ipa_wdi2_over_gsi \ && (ipa3_get_wdi_version() == IPA_WDI_2)) #define IPADBG(fmt, args...) \ do { \ pr_debug(DRV_NAME " %s:%d " fmt, __func__, __LINE__, ## args);\ Loading Loading @@ -2904,6 +2907,7 @@ int ipa3_tag_aggr_force_close(int pipe_num); void ipa3_active_clients_unlock(void); int ipa3_wdi_init(void); int ipa3_get_wdi_version(void); int ipa3_write_qmapid_gsi_wdi_pipe(u32 clnt_hdl, u8 qmap_id); int ipa3_write_qmapid_wdi_pipe(u32 clnt_hdl, u8 qmap_id); int ipa3_write_qmapid_wdi3_gsi_pipe(u32 clnt_hdl, u8 qmap_id); Loading drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c +181 −28 Original line number Diff line number Diff line Loading @@ -728,14 +728,14 @@ static void ipa_release_ap_smmu_mappings(enum ipa_client_type client) if (IPA_CLIENT_IS_CONS(client)) { start = IPA_WDI_TX_RING_RES; if (ipa3_ctx->ipa_wdi3_over_gsi) if (ipa3_get_wdi_version() == IPA_WDI_3) end = IPA_WDI_TX_DB_RES; else end = IPA_WDI_CE_DB_RES; } else { start = IPA_WDI_RX_RING_RES; if (ipa3_ctx->ipa_wdi2 || ipa3_ctx->ipa_wdi3_over_gsi) (ipa3_get_wdi_version() == IPA_WDI_3)) end = IPA_WDI_RX_COMP_RING_WP_RES; else end = IPA_WDI_RX_RING_RP_RES; Loading Loading @@ -1184,6 +1184,8 @@ int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, unsigned long wifi_rx_ri_addr = 0; u32 gsi_db_reg_phs_addr_lsb; u32 gsi_db_reg_phs_addr_msb; uint32_t addr_low, addr_high; bool is_evt_rn_db_pcie_addr, is_txr_rn_db_pcie_addr; ipa_ep_idx = ipa3_get_ep_mapping(in->sys.client); if (ipa_ep_idx == -1) { Loading Loading @@ -1351,19 +1353,6 @@ int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, gsi_channel_props.ring_base_addr = va; gsi_channel_props.ring_base_vaddr = NULL; gsi_channel_props.ring_len = len; pa = in->smmu_enabled ? in->u.ul_smmu.rdy_ring_rp_pa : in->u.ul.rdy_ring_rp_pa; if (ipa_create_gsi_smmu_mapping(IPA_WDI_RX_RING_RP_RES, in->smmu_enabled, pa, NULL, 4, false, &wifi_rx_ri_addr)) { IPAERR("fail to create gsi RX rng RP\n"); result = -ENOMEM; goto gsi_timeout; } len = in->smmu_enabled ? in->u.ul_smmu.rdy_comp_ring_size : in->u.ul.rdy_comp_ring_size; Loading @@ -1384,6 +1373,19 @@ int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, goto gsi_timeout; } gsi_evt_ring_props.ring_base_addr = va; pa = in->smmu_enabled ? in->u.ul_smmu.rdy_ring_rp_pa : in->u.ul.rdy_ring_rp_pa; if (ipa_create_gsi_smmu_mapping(IPA_WDI_RX_RING_RP_RES, in->smmu_enabled, pa, NULL, 4, false, &wifi_rx_ri_addr)) { IPAERR("fail to create gsi RX rng RP\n"); result = -ENOMEM; goto gsi_timeout; } gsi_evt_ring_props.ring_base_vaddr = NULL; gsi_evt_ring_props.ring_len = len; pa = in->smmu_enabled ? Loading Loading @@ -1439,6 +1441,99 @@ int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, &ep->gsi_evt_ring_hdl); if (result) goto fail_alloc_evt_ring; is_evt_rn_db_pcie_addr = IPA_CLIENT_IS_CONS(in->sys.client) ? in->u.dl.is_evt_rn_db_pcie_addr : in->u.ul.is_evt_rn_db_pcie_addr; if (IPA_CLIENT_IS_CONS(in->sys.client)) { is_evt_rn_db_pcie_addr = in->smmu_enabled ? in->u.dl_smmu.is_evt_rn_db_pcie_addr : in->u.dl.is_evt_rn_db_pcie_addr; gsi_evt_ring_props.rp_update_addr = in->smmu_enabled ? in->u.dl_smmu.ce_door_bell_pa : in->u.dl.ce_door_bell_pa; } else { is_evt_rn_db_pcie_addr = in->smmu_enabled ? in->u.ul_smmu.is_evt_rn_db_pcie_addr : in->u.ul.is_evt_rn_db_pcie_addr; gsi_evt_ring_props.rp_update_addr = in->smmu_enabled ? in->u.ul_smmu.rdy_comp_ring_wp_pa : in->u.ul.rdy_comp_ring_wp_pa; } if (!in->smmu_enabled) { IPADBG("smmu disabled\n"); if (is_evt_rn_db_pcie_addr == true) IPADBG("is_evt_rn_db_pcie_addr is PCIE addr\n"); else IPADBG("is_evt_rn_db_pcie_addr is DDR addr\n"); addr_low = (u32)gsi_evt_ring_props.rp_update_addr; addr_high = (u32)((u64)gsi_evt_ring_props.rp_update_addr >> 32); } else { IPADBG("smmu enabled\n"); if (is_evt_rn_db_pcie_addr == true) IPADBG("is_evt_rn_db_pcie_addr is PCIE addr\n"); else IPADBG("is_evt_rn_db_pcie_addr is DDR addr\n"); if (IPA_CLIENT_IS_CONS(in->sys.client)) { if (ipa_create_gsi_smmu_mapping(IPA_WDI_CE_DB_RES, true, gsi_evt_ring_props.rp_update_addr, NULL, 4, true, &va)) { IPAERR("failed to get smmu mapping\n"); result = -EFAULT; goto fail_alloc_evt_ring; } } else { if (ipa_create_gsi_smmu_mapping( IPA_WDI_RX_COMP_RING_WP_RES, true, gsi_evt_ring_props.rp_update_addr, NULL, 4, true, &va)) { IPAERR("failed to get smmu mapping\n"); result = -EFAULT; goto fail_alloc_evt_ring; } } addr_low = (u32)va; addr_high = (u32)((u64)va >> 32); } /* * Arch specific: * pcie addr which are not via smmu, use pa directly! * pcie and DDR via 2 different port * assert bit 40 to indicate it is pcie addr * WDI-3.0, MSM --> pcie via smmu * WDI-3.0, MDM --> pcie not via smmu + dual port * assert bit 40 in case */ if (!ipa3_is_msm_device() && in->smmu_enabled) { /* * Ir-respective of smmu enabled don't use IOVA addr * since pcie not via smmu in MDM's */ if (is_evt_rn_db_pcie_addr == true) { addr_low = (u32)gsi_evt_ring_props.rp_update_addr; addr_high = (u32)((u64)gsi_evt_ring_props.rp_update_addr >> 32); } } /* * GSI recomendation to set bit-40 for (mdm targets && pcie addr) * from wdi-3.0 interface document */ if (!ipa3_is_msm_device() && is_evt_rn_db_pcie_addr) addr_high |= (1 << 8); gsi_wdi3_write_evt_ring_db(ep->gsi_evt_ring_hdl, addr_low, addr_high); /*copy mem info */ ep->gsi_mem_info.evt_ring_len = gsi_evt_ring_props.ring_len; ep->gsi_mem_info.evt_ring_base_addr = gsi_evt_ring_props.ring_base_addr; Loading Loading @@ -1479,10 +1574,66 @@ int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, gsi_scratch.wdi.wdi_rx_tre_proc_in_progress = 0; } else { if (IPA_CLIENT_IS_PROD(in->sys.client)) { is_txr_rn_db_pcie_addr = in->smmu_enabled ? in->u.ul_smmu.is_txr_rn_db_pcie_addr : in->u.ul.is_txr_rn_db_pcie_addr; if (!in->smmu_enabled) { IPADBG("smmu disabled\n"); gsi_scratch.wdi2_new.wifi_rx_ri_addr_low = in->u.ul.rdy_ring_rp_pa & 0xFFFFFFFF; gsi_scratch.wdi2_new.wifi_rx_ri_addr_high = (in->u.ul.rdy_ring_rp_pa & 0xFFFFF00000000) >> 32; } else { IPADBG("smmu eabled\n"); gsi_scratch.wdi2_new.wifi_rx_ri_addr_low = wifi_rx_ri_addr & 0xFFFFFFFF; gsi_scratch.wdi2_new.wifi_rx_ri_addr_high = (wifi_rx_ri_addr & 0xFFFFF00000000) >> 32; } /* * Arch specific: * pcie addr which are not via smmu, use pa directly! * pcie and DDR via 2 different port * assert bit 40 to indicate it is pcie addr * WDI-3.0, MSM --> pcie via smmu * WDI-3.0, MDM --> pcie not via smmu + dual port * assert bit 40 in case */ if (!ipa3_is_msm_device() && in->smmu_enabled) { /* * Ir-respective of smmu enabled don't use IOVA * addr since pcie not via smmu in MDM's */ if (is_txr_rn_db_pcie_addr == true) { gsi_scratch.wdi2_new.wifi_rx_ri_addr_low = in->u.ul_smmu.rdy_ring_rp_pa & 0xFFFFFFFF; gsi_scratch.wdi2_new.wifi_rx_ri_addr_high = (in->u.ul_smmu.rdy_ring_rp_pa & 0xFFFFF00000000) >> 32; } } /* * GSI recomendation to set bit-40 for * (mdm targets && pcie addr) from wdi-3.0 * interface document */ if (!ipa3_is_msm_device() && is_txr_rn_db_pcie_addr) gsi_scratch.wdi2_new.wifi_rx_ri_addr_high = (u32)((u32) gsi_scratch.wdi2_new.wifi_rx_ri_addr_high | (1 << 8)); gsi_scratch.wdi2_new.wdi_rx_vdev_id = 0xff; gsi_scratch.wdi2_new.wdi_rx_fw_desc = 0xff; gsi_scratch.wdi2_new.endp_metadatareg_offset = Loading Loading @@ -1600,7 +1751,7 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, } } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_connect_gsi_wdi_pipe(in, out); result = ipa3_uc_state_check(); Loading Loading @@ -2119,10 +2270,11 @@ int ipa3_disconnect_gsi_wdi_pipe(u32 clnt_hdl) ipa3_ctx->uc_wdi_ctx.stats_notify = NULL; else IPADBG("uc_wdi_ctx.stats_notify already null\n"); if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_5 || if (ipa3_ctx->ipa_hw_type > IPA_HW_v4_5 || (ipa3_ctx->ipa_hw_type == IPA_HW_v4_1 && ipa3_ctx->platform_type == IPA_PLAT_TYPE_APQ)) ipa3_uc_debug_stats_dealloc(IPA_HW_PROTOCOL_WDI); IPADBG("client (ep: %d) disconnected\n", clnt_hdl); fail_dealloc_channel: Loading @@ -2149,7 +2301,7 @@ int ipa3_disconnect_wdi_pipe(u32 clnt_hdl) return -EINVAL; } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_disconnect_gsi_wdi_pipe(clnt_hdl); result = ipa3_uc_state_check(); Loading Loading @@ -2320,7 +2472,7 @@ int ipa3_enable_wdi_pipe(u32 clnt_hdl) return -EINVAL; } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_enable_gsi_wdi_pipe(clnt_hdl); result = ipa3_uc_state_check(); Loading Loading @@ -2385,7 +2537,7 @@ int ipa3_disable_wdi_pipe(u32 clnt_hdl) return -EINVAL; } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_disable_gsi_wdi_pipe(clnt_hdl); result = ipa3_uc_state_check(); Loading Loading @@ -2423,6 +2575,7 @@ int ipa3_disable_wdi_pipe(u32 clnt_hdl) ipa3_cfg_ep_ctrl(clnt_hdl, &ep_cfg_ctrl); cons_hdl = ipa3_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); if (cons_hdl == IPA_EP_NOT_ALLOCATED) { IPAERR("Client %u is not mapped\n", IPA_CLIENT_WLAN1_CONS); Loading Loading @@ -2502,7 +2655,7 @@ int ipa3_resume_gsi_wdi_pipe(u32 clnt_hdl) } pcmd_t = &ipa3_ctx->gsi_info[IPA_HW_PROTOCOL_WDI]; /* start uC gsi dbg stats monitor */ if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_5 || if (ipa3_ctx->ipa_hw_type > IPA_HW_v4_5 || (ipa3_ctx->ipa_hw_type == IPA_HW_v4_1 && ipa3_ctx->platform_type == IPA_PLAT_TYPE_APQ)) { if (IPA_CLIENT_IS_PROD(ep->client)) { Loading Loading @@ -2558,7 +2711,7 @@ int ipa3_resume_wdi_pipe(u32 clnt_hdl) return -EINVAL; } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_resume_gsi_wdi_pipe(clnt_hdl); result = ipa3_uc_state_check(); Loading Loading @@ -2680,7 +2833,7 @@ int ipa3_suspend_gsi_wdi_pipe(u32 clnt_hdl) } pcmd_t = &ipa3_ctx->gsi_info[IPA_HW_PROTOCOL_WDI]; /* stop uC gsi dbg stats monitor */ if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_5 || if (ipa3_ctx->ipa_hw_type > IPA_HW_v4_5 || (ipa3_ctx->ipa_hw_type == IPA_HW_v4_1 && ipa3_ctx->platform_type == IPA_PLAT_TYPE_APQ)) { if (IPA_CLIENT_IS_PROD(ep->client)) { Loading Loading @@ -2731,7 +2884,7 @@ int ipa3_suspend_wdi_pipe(u32 clnt_hdl) return -EINVAL; } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_suspend_gsi_wdi_pipe(clnt_hdl); result = ipa3_uc_state_check(); Loading drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +30 −2 Original line number Diff line number Diff line Loading @@ -2299,6 +2299,13 @@ static const struct ipa_ep_configuration ipa3_ep_mapping IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP, QMB_MASTER_SELECT_DDR, { 9, 12, 8, 16, IPA_EE_AP, GSI_FREE_PRE_FETCH, 2 } }, /* config wlan1_prod same as wlan2_prod */ [IPA_4_5][IPA_CLIENT_WLAN1_PROD] = { true, IPA_v4_5_GROUP_UL_DL, true, IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP, QMB_MASTER_SELECT_DDR, { 9, 12, 8, 16, IPA_EE_AP, GSI_FREE_PRE_FETCH, 2 } }, [IPA_4_5][IPA_CLIENT_USB_PROD] = { true, IPA_v4_5_GROUP_UL_DL, true, Loading Loading @@ -2397,6 +2404,13 @@ static const struct ipa_ep_configuration ipa3_ep_mapping IPA_DPS_HPS_SEQ_TYPE_INVALID, QMB_MASTER_SELECT_DDR, { 24, 3, 8, 14, IPA_EE_AP, GSI_SMART_PRE_FETCH, 3 } }, /* config wlan1_cons same as wlan2_cons */ [IPA_4_5][IPA_CLIENT_WLAN1_CONS] = { true, IPA_v4_5_GROUP_UL_DL, false, IPA_DPS_HPS_SEQ_TYPE_INVALID, QMB_MASTER_SELECT_DDR, { 24, 3, 8, 14, IPA_EE_AP, GSI_SMART_PRE_FETCH, 3 } }, [IPA_4_5][IPA_CLIENT_USB_CONS] = { true, IPA_v4_5_GROUP_UL_DL, false, Loading Loading @@ -2673,7 +2687,14 @@ static const struct ipa_ep_configuration ipa3_ep_mapping /* IPA_4_5_AUTO */ [IPA_4_5_AUTO][IPA_CLIENT_WLAN2_PROD] = { false, IPA_v4_5_GROUP_UL_DL, true, IPA_v4_5_GROUP_UL_DL, true, IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP, QMB_MASTER_SELECT_DDR, { 9, 12, 8, 16, IPA_EE_AP, GSI_FREE_PRE_FETCH, 2 } }, /* config wlan1_prod same as wlan2_prod */ [IPA_4_5_AUTO][IPA_CLIENT_WLAN1_PROD] = { true, IPA_v4_5_GROUP_UL_DL, true, IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP, QMB_MASTER_SELECT_DDR, Loading Loading @@ -2777,7 +2798,14 @@ static const struct ipa_ep_configuration ipa3_ep_mapping { 11, 14, 8, 16, IPA_EE_AP } }, [IPA_4_5_AUTO][IPA_CLIENT_WLAN2_CONS] = { false, IPA_v4_5_GROUP_UL_DL, true, IPA_v4_5_GROUP_UL_DL, false, IPA_DPS_HPS_SEQ_TYPE_INVALID, QMB_MASTER_SELECT_DDR, { 24, 18, 8, 14, IPA_EE_AP, GSI_SMART_PRE_FETCH, 3 } }, /* config wlan1_cons same as wlan2_cons */ [IPA_4_5_AUTO][IPA_CLIENT_WLAN1_CONS] = { true, IPA_v4_5_GROUP_UL_DL, false, IPA_DPS_HPS_SEQ_TYPE_INVALID, QMB_MASTER_SELECT_DDR, Loading Loading
drivers/platform/msm/ipa/ipa_clients/ipa_wdi3.c +55 −26 Original line number Diff line number Diff line /* Copyright (c) 2017 The Linux Foundation. All rights reserved. /* Copyright (c) 2017, 2020, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -121,7 +121,7 @@ int ipa_wdi_init(struct ipa_wdi_init_in_params *in, ipa_wdi_ctx->is_smmu_enabled = out->is_smmu_enabled; if (ipa3_ctx->ipa_wdi3_over_gsi) if (IPA_WDI2_OVER_GSI() && (in->wdi_version == IPA_WDI_3)) out->is_over_gsi = true; else out->is_over_gsi = false; Loading @@ -129,6 +129,15 @@ int ipa_wdi_init(struct ipa_wdi_init_in_params *in, } EXPORT_SYMBOL(ipa_wdi_init); int ipa3_get_wdi_version(void) { if (ipa_wdi_ctx) return ipa_wdi_ctx->wdi_version; /* default version is IPA_WDI_3 */ return IPA_WDI_3; } EXPORT_SYMBOL(ipa3_get_wdi_version); int ipa_wdi_cleanup(void) { struct ipa_wdi_intf_info *entry; Loading Loading @@ -255,20 +264,22 @@ int ipa_wdi_reg_intf(struct ipa_wdi_reg_intf_in_params *in) memset(tx_prop, 0, sizeof(tx_prop)); tx_prop[0].ip = IPA_IP_v4; if (!ipa3_ctx->ipa_wdi3_over_gsi) tx_prop[0].dst_pipe = IPA_CLIENT_WLAN1_CONS; else if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) tx_prop[0].dst_pipe = IPA_CLIENT_WLAN2_CONS; else tx_prop[0].dst_pipe = IPA_CLIENT_WLAN1_CONS; tx_prop[0].alt_dst_pipe = in->alt_dst_pipe; tx_prop[0].hdr_l2_type = in->hdr_info[0].hdr_type; strlcpy(tx_prop[0].hdr_name, hdr->hdr[IPA_IP_v4].name, sizeof(tx_prop[0].hdr_name)); tx_prop[1].ip = IPA_IP_v6; if (!ipa3_ctx->ipa_wdi3_over_gsi) tx_prop[1].dst_pipe = IPA_CLIENT_WLAN1_CONS; else if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) tx_prop[1].dst_pipe = IPA_CLIENT_WLAN2_CONS; else tx_prop[1].dst_pipe = IPA_CLIENT_WLAN1_CONS; tx_prop[1].alt_dst_pipe = in->alt_dst_pipe; tx_prop[1].hdr_l2_type = in->hdr_info[1].hdr_type; strlcpy(tx_prop[1].hdr_name, hdr->hdr[IPA_IP_v6].name, Loading @@ -279,10 +290,11 @@ int ipa_wdi_reg_intf(struct ipa_wdi_reg_intf_in_params *in) rx.prop = rx_prop; memset(rx_prop, 0, sizeof(rx_prop)); rx_prop[0].ip = IPA_IP_v4; if (!ipa3_ctx->ipa_wdi3_over_gsi) rx_prop[0].src_pipe = IPA_CLIENT_WLAN1_PROD; else if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) rx_prop[0].src_pipe = IPA_CLIENT_WLAN2_PROD; else rx_prop[0].src_pipe = IPA_CLIENT_WLAN1_PROD; rx_prop[0].hdr_l2_type = in->hdr_info[0].hdr_type; if (in->is_meta_data_valid) { rx_prop[0].attrib.attrib_mask |= IPA_FLT_META_DATA; Loading @@ -291,10 +303,11 @@ int ipa_wdi_reg_intf(struct ipa_wdi_reg_intf_in_params *in) } rx_prop[1].ip = IPA_IP_v6; if (!ipa3_ctx->ipa_wdi3_over_gsi) rx_prop[1].src_pipe = IPA_CLIENT_WLAN1_PROD; else if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) rx_prop[1].src_pipe = IPA_CLIENT_WLAN2_PROD; else rx_prop[1].src_pipe = IPA_CLIENT_WLAN1_PROD; rx_prop[1].hdr_l2_type = in->hdr_info[1].hdr_type; if (in->is_meta_data_valid) { rx_prop[1].attrib.attrib_mask |= IPA_FLT_META_DATA; Loading Loading @@ -545,6 +558,10 @@ int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, in->u_rx.rx.event_ring_doorbell_pa; in_rx.u.ul.rdy_comp_ring_size = in->u_rx.rx.event_ring_size; in_rx.u.ul.is_txr_rn_db_pcie_addr = in->u_rx.rx.is_txr_rn_db_pcie_addr; in_rx.u.ul.is_evt_rn_db_pcie_addr = in->u_rx.rx.is_evt_rn_db_pcie_addr; if (ipa_connect_wdi_pipe(&in_rx, &out_rx)) { IPA_WDI_ERR("fail to setup rx pipe\n"); ret = -EFAULT; Loading @@ -570,6 +587,10 @@ int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, in->u_tx.tx.event_ring_size; in_tx.u.dl.num_tx_buffers = in->u_tx.tx.num_pkt_buffers; in_tx.u.dl.is_txr_rn_db_pcie_addr = in->u_tx.tx.is_txr_rn_db_pcie_addr; in_tx.u.dl.is_evt_rn_db_pcie_addr = in->u_tx.tx.is_evt_rn_db_pcie_addr; if (ipa_connect_wdi_pipe(&in_tx, &out_tx)) { IPA_WDI_ERR("fail to setup tx pipe\n"); ret = -EFAULT; Loading Loading @@ -597,6 +618,10 @@ int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, in->u_rx.rx_smmu.event_ring_doorbell_pa; in_rx.u.ul_smmu.rdy_comp_ring_size = in->u_rx.rx_smmu.event_ring_size; in_rx.u.ul_smmu.is_txr_rn_db_pcie_addr = in->u_rx.rx_smmu.is_txr_rn_db_pcie_addr; in_rx.u.ul_smmu.is_evt_rn_db_pcie_addr = in->u_rx.rx_smmu.is_evt_rn_db_pcie_addr; if (ipa_connect_wdi_pipe(&in_rx, &out_rx)) { IPA_WDI_ERR("fail to setup rx pipe\n"); ret = -EFAULT; Loading @@ -622,6 +647,10 @@ int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, in->u_tx.tx_smmu.event_ring_size; in_tx.u.dl_smmu.num_tx_buffers = in->u_tx.tx_smmu.num_pkt_buffers; in_tx.u.dl_smmu.is_txr_rn_db_pcie_addr = in->u_tx.tx_smmu.is_txr_rn_db_pcie_addr; in_tx.u.dl_smmu.is_evt_rn_db_pcie_addr = in->u_tx.tx_smmu.is_evt_rn_db_pcie_addr; if (ipa_connect_wdi_pipe(&in_tx, &out_tx)) { IPA_WDI_ERR("fail to setup tx pipe\n"); ret = -EFAULT; Loading Loading @@ -673,12 +702,12 @@ int ipa_wdi_disconn_pipes(void) } } if (!ipa3_ctx->ipa_wdi3_over_gsi) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } else { if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_CONS); } else { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { Loading Loading @@ -734,12 +763,12 @@ int ipa_wdi_enable_pipes(void) return -EPERM; } if (!ipa3_ctx->ipa_wdi3_over_gsi) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } else { if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_CONS); } else { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { Loading Loading @@ -800,12 +829,12 @@ int ipa_wdi_disable_pipes(void) return -EPERM; } if (!ipa3_ctx->ipa_wdi3_over_gsi) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } else { if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_CONS); } else { ipa_ep_idx_rx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_PROD); ipa_ep_idx_tx = ipa_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); } if (ipa_wdi_ctx->wdi_version == IPA_WDI_3) { Loading
drivers/platform/msm/ipa/ipa_v3/ipa.c +2 −2 Original line number Diff line number Diff line Loading @@ -8699,8 +8699,8 @@ int ipa3_get_smmu_params(struct ipa_smmu_in_params *in, switch (in->smmu_client) { case IPA_SMMU_WLAN_CLIENT: if (ipa3_ctx->ipa_wdi3_over_gsi || ipa3_ctx->ipa_wdi2_over_gsi) if (ipa3_get_wdi_version() == IPA_WDI_3 || IPA_WDI2_OVER_GSI()) is_smmu_enable = !(ipa3_ctx->s1_bypass_arr[IPA_SMMU_CB_AP] | ipa3_ctx->s1_bypass_arr[IPA_SMMU_CB_WLAN]); Loading
drivers/platform/msm/ipa/ipa_v3/ipa_i.h +4 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,9 @@ /*Bit pattern for SW to identify PC restoration completed */ #define PC_RESTORE_CONTEXT_STATUS_SUCCESS 0xCAFECAFE #define IPA_WDI2_OVER_GSI() (ipa3_ctx->ipa_wdi2_over_gsi \ && (ipa3_get_wdi_version() == IPA_WDI_2)) #define IPADBG(fmt, args...) \ do { \ pr_debug(DRV_NAME " %s:%d " fmt, __func__, __LINE__, ## args);\ Loading Loading @@ -2904,6 +2907,7 @@ int ipa3_tag_aggr_force_close(int pipe_num); void ipa3_active_clients_unlock(void); int ipa3_wdi_init(void); int ipa3_get_wdi_version(void); int ipa3_write_qmapid_gsi_wdi_pipe(u32 clnt_hdl, u8 qmap_id); int ipa3_write_qmapid_wdi_pipe(u32 clnt_hdl, u8 qmap_id); int ipa3_write_qmapid_wdi3_gsi_pipe(u32 clnt_hdl, u8 qmap_id); Loading
drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c +181 −28 Original line number Diff line number Diff line Loading @@ -728,14 +728,14 @@ static void ipa_release_ap_smmu_mappings(enum ipa_client_type client) if (IPA_CLIENT_IS_CONS(client)) { start = IPA_WDI_TX_RING_RES; if (ipa3_ctx->ipa_wdi3_over_gsi) if (ipa3_get_wdi_version() == IPA_WDI_3) end = IPA_WDI_TX_DB_RES; else end = IPA_WDI_CE_DB_RES; } else { start = IPA_WDI_RX_RING_RES; if (ipa3_ctx->ipa_wdi2 || ipa3_ctx->ipa_wdi3_over_gsi) (ipa3_get_wdi_version() == IPA_WDI_3)) end = IPA_WDI_RX_COMP_RING_WP_RES; else end = IPA_WDI_RX_RING_RP_RES; Loading Loading @@ -1184,6 +1184,8 @@ int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, unsigned long wifi_rx_ri_addr = 0; u32 gsi_db_reg_phs_addr_lsb; u32 gsi_db_reg_phs_addr_msb; uint32_t addr_low, addr_high; bool is_evt_rn_db_pcie_addr, is_txr_rn_db_pcie_addr; ipa_ep_idx = ipa3_get_ep_mapping(in->sys.client); if (ipa_ep_idx == -1) { Loading Loading @@ -1351,19 +1353,6 @@ int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, gsi_channel_props.ring_base_addr = va; gsi_channel_props.ring_base_vaddr = NULL; gsi_channel_props.ring_len = len; pa = in->smmu_enabled ? in->u.ul_smmu.rdy_ring_rp_pa : in->u.ul.rdy_ring_rp_pa; if (ipa_create_gsi_smmu_mapping(IPA_WDI_RX_RING_RP_RES, in->smmu_enabled, pa, NULL, 4, false, &wifi_rx_ri_addr)) { IPAERR("fail to create gsi RX rng RP\n"); result = -ENOMEM; goto gsi_timeout; } len = in->smmu_enabled ? in->u.ul_smmu.rdy_comp_ring_size : in->u.ul.rdy_comp_ring_size; Loading @@ -1384,6 +1373,19 @@ int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, goto gsi_timeout; } gsi_evt_ring_props.ring_base_addr = va; pa = in->smmu_enabled ? in->u.ul_smmu.rdy_ring_rp_pa : in->u.ul.rdy_ring_rp_pa; if (ipa_create_gsi_smmu_mapping(IPA_WDI_RX_RING_RP_RES, in->smmu_enabled, pa, NULL, 4, false, &wifi_rx_ri_addr)) { IPAERR("fail to create gsi RX rng RP\n"); result = -ENOMEM; goto gsi_timeout; } gsi_evt_ring_props.ring_base_vaddr = NULL; gsi_evt_ring_props.ring_len = len; pa = in->smmu_enabled ? Loading Loading @@ -1439,6 +1441,99 @@ int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, &ep->gsi_evt_ring_hdl); if (result) goto fail_alloc_evt_ring; is_evt_rn_db_pcie_addr = IPA_CLIENT_IS_CONS(in->sys.client) ? in->u.dl.is_evt_rn_db_pcie_addr : in->u.ul.is_evt_rn_db_pcie_addr; if (IPA_CLIENT_IS_CONS(in->sys.client)) { is_evt_rn_db_pcie_addr = in->smmu_enabled ? in->u.dl_smmu.is_evt_rn_db_pcie_addr : in->u.dl.is_evt_rn_db_pcie_addr; gsi_evt_ring_props.rp_update_addr = in->smmu_enabled ? in->u.dl_smmu.ce_door_bell_pa : in->u.dl.ce_door_bell_pa; } else { is_evt_rn_db_pcie_addr = in->smmu_enabled ? in->u.ul_smmu.is_evt_rn_db_pcie_addr : in->u.ul.is_evt_rn_db_pcie_addr; gsi_evt_ring_props.rp_update_addr = in->smmu_enabled ? in->u.ul_smmu.rdy_comp_ring_wp_pa : in->u.ul.rdy_comp_ring_wp_pa; } if (!in->smmu_enabled) { IPADBG("smmu disabled\n"); if (is_evt_rn_db_pcie_addr == true) IPADBG("is_evt_rn_db_pcie_addr is PCIE addr\n"); else IPADBG("is_evt_rn_db_pcie_addr is DDR addr\n"); addr_low = (u32)gsi_evt_ring_props.rp_update_addr; addr_high = (u32)((u64)gsi_evt_ring_props.rp_update_addr >> 32); } else { IPADBG("smmu enabled\n"); if (is_evt_rn_db_pcie_addr == true) IPADBG("is_evt_rn_db_pcie_addr is PCIE addr\n"); else IPADBG("is_evt_rn_db_pcie_addr is DDR addr\n"); if (IPA_CLIENT_IS_CONS(in->sys.client)) { if (ipa_create_gsi_smmu_mapping(IPA_WDI_CE_DB_RES, true, gsi_evt_ring_props.rp_update_addr, NULL, 4, true, &va)) { IPAERR("failed to get smmu mapping\n"); result = -EFAULT; goto fail_alloc_evt_ring; } } else { if (ipa_create_gsi_smmu_mapping( IPA_WDI_RX_COMP_RING_WP_RES, true, gsi_evt_ring_props.rp_update_addr, NULL, 4, true, &va)) { IPAERR("failed to get smmu mapping\n"); result = -EFAULT; goto fail_alloc_evt_ring; } } addr_low = (u32)va; addr_high = (u32)((u64)va >> 32); } /* * Arch specific: * pcie addr which are not via smmu, use pa directly! * pcie and DDR via 2 different port * assert bit 40 to indicate it is pcie addr * WDI-3.0, MSM --> pcie via smmu * WDI-3.0, MDM --> pcie not via smmu + dual port * assert bit 40 in case */ if (!ipa3_is_msm_device() && in->smmu_enabled) { /* * Ir-respective of smmu enabled don't use IOVA addr * since pcie not via smmu in MDM's */ if (is_evt_rn_db_pcie_addr == true) { addr_low = (u32)gsi_evt_ring_props.rp_update_addr; addr_high = (u32)((u64)gsi_evt_ring_props.rp_update_addr >> 32); } } /* * GSI recomendation to set bit-40 for (mdm targets && pcie addr) * from wdi-3.0 interface document */ if (!ipa3_is_msm_device() && is_evt_rn_db_pcie_addr) addr_high |= (1 << 8); gsi_wdi3_write_evt_ring_db(ep->gsi_evt_ring_hdl, addr_low, addr_high); /*copy mem info */ ep->gsi_mem_info.evt_ring_len = gsi_evt_ring_props.ring_len; ep->gsi_mem_info.evt_ring_base_addr = gsi_evt_ring_props.ring_base_addr; Loading Loading @@ -1479,10 +1574,66 @@ int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, gsi_scratch.wdi.wdi_rx_tre_proc_in_progress = 0; } else { if (IPA_CLIENT_IS_PROD(in->sys.client)) { is_txr_rn_db_pcie_addr = in->smmu_enabled ? in->u.ul_smmu.is_txr_rn_db_pcie_addr : in->u.ul.is_txr_rn_db_pcie_addr; if (!in->smmu_enabled) { IPADBG("smmu disabled\n"); gsi_scratch.wdi2_new.wifi_rx_ri_addr_low = in->u.ul.rdy_ring_rp_pa & 0xFFFFFFFF; gsi_scratch.wdi2_new.wifi_rx_ri_addr_high = (in->u.ul.rdy_ring_rp_pa & 0xFFFFF00000000) >> 32; } else { IPADBG("smmu eabled\n"); gsi_scratch.wdi2_new.wifi_rx_ri_addr_low = wifi_rx_ri_addr & 0xFFFFFFFF; gsi_scratch.wdi2_new.wifi_rx_ri_addr_high = (wifi_rx_ri_addr & 0xFFFFF00000000) >> 32; } /* * Arch specific: * pcie addr which are not via smmu, use pa directly! * pcie and DDR via 2 different port * assert bit 40 to indicate it is pcie addr * WDI-3.0, MSM --> pcie via smmu * WDI-3.0, MDM --> pcie not via smmu + dual port * assert bit 40 in case */ if (!ipa3_is_msm_device() && in->smmu_enabled) { /* * Ir-respective of smmu enabled don't use IOVA * addr since pcie not via smmu in MDM's */ if (is_txr_rn_db_pcie_addr == true) { gsi_scratch.wdi2_new.wifi_rx_ri_addr_low = in->u.ul_smmu.rdy_ring_rp_pa & 0xFFFFFFFF; gsi_scratch.wdi2_new.wifi_rx_ri_addr_high = (in->u.ul_smmu.rdy_ring_rp_pa & 0xFFFFF00000000) >> 32; } } /* * GSI recomendation to set bit-40 for * (mdm targets && pcie addr) from wdi-3.0 * interface document */ if (!ipa3_is_msm_device() && is_txr_rn_db_pcie_addr) gsi_scratch.wdi2_new.wifi_rx_ri_addr_high = (u32)((u32) gsi_scratch.wdi2_new.wifi_rx_ri_addr_high | (1 << 8)); gsi_scratch.wdi2_new.wdi_rx_vdev_id = 0xff; gsi_scratch.wdi2_new.wdi_rx_fw_desc = 0xff; gsi_scratch.wdi2_new.endp_metadatareg_offset = Loading Loading @@ -1600,7 +1751,7 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, } } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_connect_gsi_wdi_pipe(in, out); result = ipa3_uc_state_check(); Loading Loading @@ -2119,10 +2270,11 @@ int ipa3_disconnect_gsi_wdi_pipe(u32 clnt_hdl) ipa3_ctx->uc_wdi_ctx.stats_notify = NULL; else IPADBG("uc_wdi_ctx.stats_notify already null\n"); if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_5 || if (ipa3_ctx->ipa_hw_type > IPA_HW_v4_5 || (ipa3_ctx->ipa_hw_type == IPA_HW_v4_1 && ipa3_ctx->platform_type == IPA_PLAT_TYPE_APQ)) ipa3_uc_debug_stats_dealloc(IPA_HW_PROTOCOL_WDI); IPADBG("client (ep: %d) disconnected\n", clnt_hdl); fail_dealloc_channel: Loading @@ -2149,7 +2301,7 @@ int ipa3_disconnect_wdi_pipe(u32 clnt_hdl) return -EINVAL; } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_disconnect_gsi_wdi_pipe(clnt_hdl); result = ipa3_uc_state_check(); Loading Loading @@ -2320,7 +2472,7 @@ int ipa3_enable_wdi_pipe(u32 clnt_hdl) return -EINVAL; } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_enable_gsi_wdi_pipe(clnt_hdl); result = ipa3_uc_state_check(); Loading Loading @@ -2385,7 +2537,7 @@ int ipa3_disable_wdi_pipe(u32 clnt_hdl) return -EINVAL; } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_disable_gsi_wdi_pipe(clnt_hdl); result = ipa3_uc_state_check(); Loading Loading @@ -2423,6 +2575,7 @@ int ipa3_disable_wdi_pipe(u32 clnt_hdl) ipa3_cfg_ep_ctrl(clnt_hdl, &ep_cfg_ctrl); cons_hdl = ipa3_get_ep_mapping(IPA_CLIENT_WLAN1_CONS); if (cons_hdl == IPA_EP_NOT_ALLOCATED) { IPAERR("Client %u is not mapped\n", IPA_CLIENT_WLAN1_CONS); Loading Loading @@ -2502,7 +2655,7 @@ int ipa3_resume_gsi_wdi_pipe(u32 clnt_hdl) } pcmd_t = &ipa3_ctx->gsi_info[IPA_HW_PROTOCOL_WDI]; /* start uC gsi dbg stats monitor */ if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_5 || if (ipa3_ctx->ipa_hw_type > IPA_HW_v4_5 || (ipa3_ctx->ipa_hw_type == IPA_HW_v4_1 && ipa3_ctx->platform_type == IPA_PLAT_TYPE_APQ)) { if (IPA_CLIENT_IS_PROD(ep->client)) { Loading Loading @@ -2558,7 +2711,7 @@ int ipa3_resume_wdi_pipe(u32 clnt_hdl) return -EINVAL; } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_resume_gsi_wdi_pipe(clnt_hdl); result = ipa3_uc_state_check(); Loading Loading @@ -2680,7 +2833,7 @@ int ipa3_suspend_gsi_wdi_pipe(u32 clnt_hdl) } pcmd_t = &ipa3_ctx->gsi_info[IPA_HW_PROTOCOL_WDI]; /* stop uC gsi dbg stats monitor */ if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_5 || if (ipa3_ctx->ipa_hw_type > IPA_HW_v4_5 || (ipa3_ctx->ipa_hw_type == IPA_HW_v4_1 && ipa3_ctx->platform_type == IPA_PLAT_TYPE_APQ)) { if (IPA_CLIENT_IS_PROD(ep->client)) { Loading Loading @@ -2731,7 +2884,7 @@ int ipa3_suspend_wdi_pipe(u32 clnt_hdl) return -EINVAL; } if (ipa3_ctx->ipa_wdi2_over_gsi) if (IPA_WDI2_OVER_GSI()) return ipa3_suspend_gsi_wdi_pipe(clnt_hdl); result = ipa3_uc_state_check(); Loading
drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +30 −2 Original line number Diff line number Diff line Loading @@ -2299,6 +2299,13 @@ static const struct ipa_ep_configuration ipa3_ep_mapping IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP, QMB_MASTER_SELECT_DDR, { 9, 12, 8, 16, IPA_EE_AP, GSI_FREE_PRE_FETCH, 2 } }, /* config wlan1_prod same as wlan2_prod */ [IPA_4_5][IPA_CLIENT_WLAN1_PROD] = { true, IPA_v4_5_GROUP_UL_DL, true, IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP, QMB_MASTER_SELECT_DDR, { 9, 12, 8, 16, IPA_EE_AP, GSI_FREE_PRE_FETCH, 2 } }, [IPA_4_5][IPA_CLIENT_USB_PROD] = { true, IPA_v4_5_GROUP_UL_DL, true, Loading Loading @@ -2397,6 +2404,13 @@ static const struct ipa_ep_configuration ipa3_ep_mapping IPA_DPS_HPS_SEQ_TYPE_INVALID, QMB_MASTER_SELECT_DDR, { 24, 3, 8, 14, IPA_EE_AP, GSI_SMART_PRE_FETCH, 3 } }, /* config wlan1_cons same as wlan2_cons */ [IPA_4_5][IPA_CLIENT_WLAN1_CONS] = { true, IPA_v4_5_GROUP_UL_DL, false, IPA_DPS_HPS_SEQ_TYPE_INVALID, QMB_MASTER_SELECT_DDR, { 24, 3, 8, 14, IPA_EE_AP, GSI_SMART_PRE_FETCH, 3 } }, [IPA_4_5][IPA_CLIENT_USB_CONS] = { true, IPA_v4_5_GROUP_UL_DL, false, Loading Loading @@ -2673,7 +2687,14 @@ static const struct ipa_ep_configuration ipa3_ep_mapping /* IPA_4_5_AUTO */ [IPA_4_5_AUTO][IPA_CLIENT_WLAN2_PROD] = { false, IPA_v4_5_GROUP_UL_DL, true, IPA_v4_5_GROUP_UL_DL, true, IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP, QMB_MASTER_SELECT_DDR, { 9, 12, 8, 16, IPA_EE_AP, GSI_FREE_PRE_FETCH, 2 } }, /* config wlan1_prod same as wlan2_prod */ [IPA_4_5_AUTO][IPA_CLIENT_WLAN1_PROD] = { true, IPA_v4_5_GROUP_UL_DL, true, IPA_DPS_HPS_SEQ_TYPE_2ND_PKT_PROCESS_PASS_NO_DEC_UCP, QMB_MASTER_SELECT_DDR, Loading Loading @@ -2777,7 +2798,14 @@ static const struct ipa_ep_configuration ipa3_ep_mapping { 11, 14, 8, 16, IPA_EE_AP } }, [IPA_4_5_AUTO][IPA_CLIENT_WLAN2_CONS] = { false, IPA_v4_5_GROUP_UL_DL, true, IPA_v4_5_GROUP_UL_DL, false, IPA_DPS_HPS_SEQ_TYPE_INVALID, QMB_MASTER_SELECT_DDR, { 24, 18, 8, 14, IPA_EE_AP, GSI_SMART_PRE_FETCH, 3 } }, /* config wlan1_cons same as wlan2_cons */ [IPA_4_5_AUTO][IPA_CLIENT_WLAN1_CONS] = { true, IPA_v4_5_GROUP_UL_DL, false, IPA_DPS_HPS_SEQ_TYPE_INVALID, QMB_MASTER_SELECT_DDR, Loading