Loading Documentation/devicetree/bindings/platform/msm/ipa.txt +2 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,8 @@ memory allocation over a PCIe bridge need to be unlocked by TZ. - qcom,ipa-uc-monitor-holb: Boolean context flag to indicate whether monitoring of holb via IPA uc is required. - qcom,wlan-ce-db-over-pcie: Boolean context flag to represent WLAN CE DB over pcie bus or not. IPA pipe sub nodes (A2 static pipes configurations): Loading drivers/platform/msm/ipa/ipa_v3/ipa.c +7 −0 Original line number Diff line number Diff line Loading @@ -5041,6 +5041,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p, ipa3_ctx->apply_rg10_wa = resource_p->apply_rg10_wa; ipa3_ctx->gsi_ch20_wa = resource_p->gsi_ch20_wa; ipa3_ctx->use_ipa_pm = resource_p->use_ipa_pm; ipa3_ctx->wdi_over_pcie = resource_p->wdi_over_pcie; ipa3_ctx->ipa3_active_clients_logging.log_rdy = false; ipa3_ctx->ipa_config_is_mhi = resource_p->ipa_mhi_dynamic_config; ipa3_ctx->mhi_evid_limits[0] = resource_p->mhi_evid_limits[0]; Loading Loading @@ -5872,6 +5873,12 @@ static int get_ipa_dts_configuration(struct platform_device *pdev, return result; } ipa_drv_res->wdi_over_pcie = of_property_read_bool(pdev->dev.of_node, "qcom,wlan-ce-db-over-pcie"); IPADBG("Is wdi_over_pcie ? (%s)\n", ipa3_ctx->wdi_over_pcie ? "Yes":"No"); /* * If we're on emulator, get its interrupt controller's mem * start and size Loading drivers/platform/msm/ipa/ipa_v3/ipa_i.h +2 −0 Original line number Diff line number Diff line Loading @@ -1604,6 +1604,7 @@ struct ipa3_context { struct mutex ipa_cne_evt_lock; bool use_ipa_pm; bool vlan_mode_iface[IPA_VLAN_IF_MAX]; bool wdi_over_pcie; }; struct ipa3_plat_drv_res { Loading Loading @@ -1638,6 +1639,7 @@ struct ipa3_plat_drv_res { struct ipa_tz_unlock_reg_info *ipa_tz_unlock_reg; bool use_ipa_pm; struct ipa_pm_init_params pm_init; bool wdi_over_pcie; }; /** Loading drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c +93 −46 Original line number Diff line number Diff line Loading @@ -756,18 +756,23 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, return -EINVAL; } if (!in->smmu_enabled) { if (IPA_CLIENT_IS_CONS(in->sys.client)) { if (in->u.dl.comp_ring_base_pa % IPA_WDI_RING_ALIGNMENT || in->u.dl.ce_ring_base_pa % IPA_WDI_RING_ALIGNMENT) { if (in->u.dl.comp_ring_base_pa % IPA_WDI_RING_ALIGNMENT || in->u.dl.ce_ring_base_pa % IPA_WDI_RING_ALIGNMENT) { IPAERR("alignment failure on TX\n"); return -EINVAL; } } else { if (in->u.ul.rdy_ring_base_pa % IPA_WDI_RING_ALIGNMENT) { if (in->u.ul.rdy_ring_base_pa % IPA_WDI_RING_ALIGNMENT) { IPAERR("alignment failure on RX\n"); return -EINVAL; } } } result = ipa3_uc_state_check(); if (result) Loading Loading @@ -795,19 +800,48 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, cmd.size = sizeof(*tx_2); else cmd.size = sizeof(*tx); if (in->smmu_enabled) { IPADBG("comp_ring_size=%d\n", in->u.dl_smmu.comp_ring_size); IPADBG("ce_ring_size=%d\n", in->u.dl_smmu.ce_ring_size); IPADBG("ce_ring_doorbell_pa=0x%pa\n", &in->u.dl_smmu.ce_door_bell_pa); IPADBG("num_tx_buffers=%d\n", in->u.dl_smmu.num_tx_buffers); } else { IPADBG("comp_ring_base_pa=0x%pa\n", &in->u.dl.comp_ring_base_pa); IPADBG("comp_ring_size=%d\n", in->u.dl.comp_ring_size); IPADBG("ce_ring_base_pa=0x%pa\n", &in->u.dl.ce_ring_base_pa); IPADBG("ce_ring_base_pa=0x%pa\n", &in->u.dl.ce_ring_base_pa); IPADBG("ce_ring_size=%d\n", in->u.dl.ce_ring_size); IPADBG("ce_ring_doorbell_pa=0x%pa\n", &in->u.dl.ce_door_bell_pa); IPADBG("num_tx_buffers=%d\n", in->u.dl.num_tx_buffers); } } else { if (ipa3_ctx->ipa_wdi2) cmd.size = sizeof(*rx_2); else cmd.size = sizeof(*rx); if (in->smmu_enabled) { IPADBG("rx_ring_size=%d\n", in->u.ul_smmu.rdy_ring_size); IPADBG("rx_ring_rp_pa=0x%pa\n", &in->u.ul_smmu.rdy_ring_rp_pa); IPADBG("rx_comp_ring_size=%d\n", in->u.ul_smmu.rdy_comp_ring_size); IPADBG("rx_comp_ring_wp_pa=0x%pa\n", &in->u.ul_smmu.rdy_comp_ring_wp_pa); ipa3_ctx->uc_ctx.rdy_ring_rp_pa = in->u.ul_smmu.rdy_ring_rp_pa; ipa3_ctx->uc_ctx.rdy_ring_size = in->u.ul_smmu.rdy_ring_size; ipa3_ctx->uc_ctx.rdy_comp_ring_wp_pa = in->u.ul_smmu.rdy_comp_ring_wp_pa; ipa3_ctx->uc_ctx.rdy_comp_ring_size = in->u.ul_smmu.rdy_comp_ring_size; } else { IPADBG("rx_ring_base_pa=0x%pa\n", &in->u.ul.rdy_ring_base_pa); IPADBG("rx_ring_size=%d\n", Loading @@ -833,6 +867,7 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, ipa3_ctx->uc_ctx.rdy_comp_ring_size = in->u.ul.rdy_comp_ring_size; } } cmd.base = dma_alloc_coherent(ipa3_ctx->uc_pdev, cmd.size, &cmd.phys_base, GFP_KERNEL); Loading Loading @@ -945,10 +980,11 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, tx->comp_ring_size = len; len = in->smmu_enabled ? in->u.dl_smmu.ce_ring_size : in->u.dl.ce_ring_size; IPADBG("TX CE ring smmu_en=%d ring_size=%d %d\n", IPADBG("TX CE ring smmu_en=%d ring_size=%d %d 0x%lx\n", in->smmu_enabled, in->u.dl_smmu.ce_ring_size, in->u.dl.ce_ring_size); in->u.dl.ce_ring_size, va); if (ipa_create_uc_smmu_mapping(IPA_WDI_CE_RING_RES, in->smmu_enabled, in->u.dl.ce_ring_base_pa, Loading @@ -975,8 +1011,19 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, result = -ENOMEM; goto uc_timeout; } IPADBG("CE doorbell pa: 0x%pa va:0x%lx\n", &pa, va); IPADBG("Is wdi_over_pcie ? (%s)\n", ipa3_ctx->wdi_over_pcie ? "Yes":"No"); if (ipa3_ctx->wdi_over_pcie) tx->ce_ring_doorbell_pa = pa; else tx->ce_ring_doorbell_pa = va; tx->num_tx_buffers = in->u.dl.num_tx_buffers; tx->num_tx_buffers = in->smmu_enabled ? in->u.dl_smmu.num_tx_buffers : in->u.dl.num_tx_buffers; tx->ipa_pipe_number = ipa_ep_idx; } out->uc_door_bell_pa = ipa3_ctx->ipa_wrapper_base + Loading Loading
Documentation/devicetree/bindings/platform/msm/ipa.txt +2 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,8 @@ memory allocation over a PCIe bridge need to be unlocked by TZ. - qcom,ipa-uc-monitor-holb: Boolean context flag to indicate whether monitoring of holb via IPA uc is required. - qcom,wlan-ce-db-over-pcie: Boolean context flag to represent WLAN CE DB over pcie bus or not. IPA pipe sub nodes (A2 static pipes configurations): Loading
drivers/platform/msm/ipa/ipa_v3/ipa.c +7 −0 Original line number Diff line number Diff line Loading @@ -5041,6 +5041,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p, ipa3_ctx->apply_rg10_wa = resource_p->apply_rg10_wa; ipa3_ctx->gsi_ch20_wa = resource_p->gsi_ch20_wa; ipa3_ctx->use_ipa_pm = resource_p->use_ipa_pm; ipa3_ctx->wdi_over_pcie = resource_p->wdi_over_pcie; ipa3_ctx->ipa3_active_clients_logging.log_rdy = false; ipa3_ctx->ipa_config_is_mhi = resource_p->ipa_mhi_dynamic_config; ipa3_ctx->mhi_evid_limits[0] = resource_p->mhi_evid_limits[0]; Loading Loading @@ -5872,6 +5873,12 @@ static int get_ipa_dts_configuration(struct platform_device *pdev, return result; } ipa_drv_res->wdi_over_pcie = of_property_read_bool(pdev->dev.of_node, "qcom,wlan-ce-db-over-pcie"); IPADBG("Is wdi_over_pcie ? (%s)\n", ipa3_ctx->wdi_over_pcie ? "Yes":"No"); /* * If we're on emulator, get its interrupt controller's mem * start and size Loading
drivers/platform/msm/ipa/ipa_v3/ipa_i.h +2 −0 Original line number Diff line number Diff line Loading @@ -1604,6 +1604,7 @@ struct ipa3_context { struct mutex ipa_cne_evt_lock; bool use_ipa_pm; bool vlan_mode_iface[IPA_VLAN_IF_MAX]; bool wdi_over_pcie; }; struct ipa3_plat_drv_res { Loading Loading @@ -1638,6 +1639,7 @@ struct ipa3_plat_drv_res { struct ipa_tz_unlock_reg_info *ipa_tz_unlock_reg; bool use_ipa_pm; struct ipa_pm_init_params pm_init; bool wdi_over_pcie; }; /** Loading
drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c +93 −46 Original line number Diff line number Diff line Loading @@ -756,18 +756,23 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, return -EINVAL; } if (!in->smmu_enabled) { if (IPA_CLIENT_IS_CONS(in->sys.client)) { if (in->u.dl.comp_ring_base_pa % IPA_WDI_RING_ALIGNMENT || in->u.dl.ce_ring_base_pa % IPA_WDI_RING_ALIGNMENT) { if (in->u.dl.comp_ring_base_pa % IPA_WDI_RING_ALIGNMENT || in->u.dl.ce_ring_base_pa % IPA_WDI_RING_ALIGNMENT) { IPAERR("alignment failure on TX\n"); return -EINVAL; } } else { if (in->u.ul.rdy_ring_base_pa % IPA_WDI_RING_ALIGNMENT) { if (in->u.ul.rdy_ring_base_pa % IPA_WDI_RING_ALIGNMENT) { IPAERR("alignment failure on RX\n"); return -EINVAL; } } } result = ipa3_uc_state_check(); if (result) Loading Loading @@ -795,19 +800,48 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, cmd.size = sizeof(*tx_2); else cmd.size = sizeof(*tx); if (in->smmu_enabled) { IPADBG("comp_ring_size=%d\n", in->u.dl_smmu.comp_ring_size); IPADBG("ce_ring_size=%d\n", in->u.dl_smmu.ce_ring_size); IPADBG("ce_ring_doorbell_pa=0x%pa\n", &in->u.dl_smmu.ce_door_bell_pa); IPADBG("num_tx_buffers=%d\n", in->u.dl_smmu.num_tx_buffers); } else { IPADBG("comp_ring_base_pa=0x%pa\n", &in->u.dl.comp_ring_base_pa); IPADBG("comp_ring_size=%d\n", in->u.dl.comp_ring_size); IPADBG("ce_ring_base_pa=0x%pa\n", &in->u.dl.ce_ring_base_pa); IPADBG("ce_ring_base_pa=0x%pa\n", &in->u.dl.ce_ring_base_pa); IPADBG("ce_ring_size=%d\n", in->u.dl.ce_ring_size); IPADBG("ce_ring_doorbell_pa=0x%pa\n", &in->u.dl.ce_door_bell_pa); IPADBG("num_tx_buffers=%d\n", in->u.dl.num_tx_buffers); } } else { if (ipa3_ctx->ipa_wdi2) cmd.size = sizeof(*rx_2); else cmd.size = sizeof(*rx); if (in->smmu_enabled) { IPADBG("rx_ring_size=%d\n", in->u.ul_smmu.rdy_ring_size); IPADBG("rx_ring_rp_pa=0x%pa\n", &in->u.ul_smmu.rdy_ring_rp_pa); IPADBG("rx_comp_ring_size=%d\n", in->u.ul_smmu.rdy_comp_ring_size); IPADBG("rx_comp_ring_wp_pa=0x%pa\n", &in->u.ul_smmu.rdy_comp_ring_wp_pa); ipa3_ctx->uc_ctx.rdy_ring_rp_pa = in->u.ul_smmu.rdy_ring_rp_pa; ipa3_ctx->uc_ctx.rdy_ring_size = in->u.ul_smmu.rdy_ring_size; ipa3_ctx->uc_ctx.rdy_comp_ring_wp_pa = in->u.ul_smmu.rdy_comp_ring_wp_pa; ipa3_ctx->uc_ctx.rdy_comp_ring_size = in->u.ul_smmu.rdy_comp_ring_size; } else { IPADBG("rx_ring_base_pa=0x%pa\n", &in->u.ul.rdy_ring_base_pa); IPADBG("rx_ring_size=%d\n", Loading @@ -833,6 +867,7 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, ipa3_ctx->uc_ctx.rdy_comp_ring_size = in->u.ul.rdy_comp_ring_size; } } cmd.base = dma_alloc_coherent(ipa3_ctx->uc_pdev, cmd.size, &cmd.phys_base, GFP_KERNEL); Loading Loading @@ -945,10 +980,11 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, tx->comp_ring_size = len; len = in->smmu_enabled ? in->u.dl_smmu.ce_ring_size : in->u.dl.ce_ring_size; IPADBG("TX CE ring smmu_en=%d ring_size=%d %d\n", IPADBG("TX CE ring smmu_en=%d ring_size=%d %d 0x%lx\n", in->smmu_enabled, in->u.dl_smmu.ce_ring_size, in->u.dl.ce_ring_size); in->u.dl.ce_ring_size, va); if (ipa_create_uc_smmu_mapping(IPA_WDI_CE_RING_RES, in->smmu_enabled, in->u.dl.ce_ring_base_pa, Loading @@ -975,8 +1011,19 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, result = -ENOMEM; goto uc_timeout; } IPADBG("CE doorbell pa: 0x%pa va:0x%lx\n", &pa, va); IPADBG("Is wdi_over_pcie ? (%s)\n", ipa3_ctx->wdi_over_pcie ? "Yes":"No"); if (ipa3_ctx->wdi_over_pcie) tx->ce_ring_doorbell_pa = pa; else tx->ce_ring_doorbell_pa = va; tx->num_tx_buffers = in->u.dl.num_tx_buffers; tx->num_tx_buffers = in->smmu_enabled ? in->u.dl_smmu.num_tx_buffers : in->u.dl.num_tx_buffers; tx->ipa_pipe_number = ipa_ep_idx; } out->uc_door_bell_pa = ipa3_ctx->ipa_wrapper_base + Loading