From a4720ff813a9ec14b63ddb88747d1184e4783a9e Mon Sep 17 00:00:00 2001 From: Skylar Chang Date: Tue, 19 Jul 2016 11:56:25 -0700 Subject: [PATCH] msm: ipa: header change for SMMU wlan VA mapping Wlan need to pass the VA to let the IPA-driver decide when to suspend the WDI pipe in SMMU enabled scenario. Change-Id: I00ae7f088c7411c8a6420f5e7ab12276d65fd269 Signed-off-by: Skylar Chang --- drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c | 49 ++++++++++++-------- include/linux/ipa.h | 2 + 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c b/drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c index e0f32bdcbb3d..9f026fc58f53 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c @@ -811,16 +811,12 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, in->u.ul.rdy_ring_size); IPADBG("rx_ring_rp_pa=0x%pa\n", &in->u.ul.rdy_ring_rp_pa); - IPADBG("rdy_ring_rp value =%d\n", - *in->u.ul.rdy_ring_rp_va); IPADBG("rx_comp_ring_base_pa=0x%pa\n", &in->u.ul.rdy_comp_ring_base_pa); IPADBG("rx_comp_ring_size=%d\n", in->u.ul.rdy_comp_ring_size); IPADBG("rx_comp_ring_wp_pa=0x%pa\n", &in->u.ul.rdy_comp_ring_wp_pa); - IPADBG("rx_comp_ring_wp value=%d\n", - *in->u.ul.rdy_comp_ring_wp_va); ipa3_ctx->uc_ctx.rdy_ring_base_pa = in->u.ul.rdy_ring_base_pa; ipa3_ctx->uc_ctx.rdy_ring_rp_pa = @@ -833,21 +829,34 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, in->u.ul.rdy_comp_ring_wp_pa; ipa3_ctx->uc_ctx.rdy_comp_ring_size = in->u.ul.rdy_comp_ring_size; - ipa3_ctx->uc_ctx.rdy_ring_rp_va = - in->u.ul.rdy_ring_rp_va; - ipa3_ctx->uc_ctx.rdy_comp_ring_wp_va = - in->u.ul.rdy_comp_ring_wp_va; + /* check if the VA is empty */ - if (!in->u.ul.rdy_ring_rp_va && ipa3_ctx->ipa_wdi2) { - IPAERR("rdy_ring_rp_va is empty, wdi2.0(%d)\n", - ipa3_ctx->ipa_wdi2); - goto dma_alloc_fail; - } - if (!in->u.ul.rdy_comp_ring_wp_va && - ipa3_ctx->ipa_wdi2) { - IPAERR("comp_ring_wp_va is empty, wdi2.0(%d)\n", - ipa3_ctx->ipa_wdi2); - goto dma_alloc_fail; + if (ipa3_ctx->ipa_wdi2) { + if (in->smmu_enabled) { + if (!in->u.ul_smmu.rdy_ring_rp_va || + !in->u.ul_smmu.rdy_comp_ring_wp_va) + goto dma_alloc_fail; + } else { + if (!in->u.ul.rdy_ring_rp_va || + !in->u.ul.rdy_comp_ring_wp_va) + goto dma_alloc_fail; + } + IPADBG("rdy_ring_rp value =%d\n", + in->smmu_enabled ? + *in->u.ul_smmu.rdy_ring_rp_va : + *in->u.ul.rdy_ring_rp_va); + IPADBG("rx_comp_ring_wp value=%d\n", + in->smmu_enabled ? + *in->u.ul_smmu.rdy_comp_ring_wp_va : + *in->u.ul.rdy_comp_ring_wp_va); + ipa3_ctx->uc_ctx.rdy_ring_rp_va = + in->smmu_enabled ? + in->u.ul_smmu.rdy_ring_rp_va : + in->u.ul.rdy_ring_rp_va; + ipa3_ctx->uc_ctx.rdy_comp_ring_wp_va = + in->smmu_enabled ? + in->u.ul_smmu.rdy_comp_ring_wp_va : + in->u.ul.rdy_comp_ring_wp_va; } } @@ -933,7 +942,9 @@ int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, tx_2->ce_ring_doorbell_pa_hi, tx_2->ce_ring_doorbell_pa); - tx_2->num_tx_buffers = in->u.dl.num_tx_buffers; + tx_2->num_tx_buffers = in->smmu_enabled ? + in->u.dl_smmu.num_tx_buffers : + in->u.dl.num_tx_buffers; tx_2->ipa_pipe_number = ipa_ep_idx; } else { tx = (struct IpaHwWdiTxSetUpCmdData_t *)cmd.base; diff --git a/include/linux/ipa.h b/include/linux/ipa.h index 5f85508353c9..1d9eebf7dc83 100644 --- a/include/linux/ipa.h +++ b/include/linux/ipa.h @@ -948,6 +948,8 @@ struct ipa_wdi_ul_params_smmu { struct sg_table rdy_comp_ring; phys_addr_t rdy_comp_ring_wp_pa; u32 rdy_comp_ring_size; + u32 *rdy_ring_rp_va; + u32 *rdy_comp_ring_wp_va; }; /**