diff options
author | Skylar Chang <chiaweic@codeaurora.org> | 2016-06-14 16:44:54 -0700 |
---|---|---|
committer | Kyle Yan <kyan@codeaurora.org> | 2016-06-21 15:12:44 -0700 |
commit | 5fed61467694fb7e83e0e911ccccafcbf187b93e (patch) | |
tree | 52ef971666c39d3392033afb0964f78176b5d07a /drivers | |
parent | f956c61bd2ee86905762e78f1c574e87b284ed04 (diff) |
msm: ipa3: support use for 64bit DMA mask
add 64bit dma mask support on ipa3 to resolve
the dma pool exhausted issue.
Change-Id: I629e2ae15574ab779c43dd40d40cf169fe19bb8e
Signed-off-by: Skylar Chang <chiaweic@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/platform/msm/ipa/ipa_v3/ipa.c | 58 | ||||
-rw-r--r-- | drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 3 |
2 files changed, 49 insertions, 12 deletions
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 546c6fbfcaa9..7acf07acb8c1 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -3932,6 +3932,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p, ipa3_ctx->ipa_bam_remote_mode = resource_p->ipa_bam_remote_mode; ipa3_ctx->modem_cfg_emb_pipe_flt = resource_p->modem_cfg_emb_pipe_flt; ipa3_ctx->ipa_wdi2 = resource_p->ipa_wdi2; + ipa3_ctx->use_64_bit_dma_mask = resource_p->use_64_bit_dma_mask; ipa3_ctx->wan_rx_ring_size = resource_p->wan_rx_ring_size; ipa3_ctx->skip_uc_pipe_reset = resource_p->skip_uc_pipe_reset; ipa3_ctx->tethered_flow_control = resource_p->tethered_flow_control; @@ -4410,6 +4411,7 @@ static int get_ipa_dts_configuration(struct platform_device *pdev, ipa_drv_res->ipa_bam_remote_mode = false; ipa_drv_res->modem_cfg_emb_pipe_flt = false; ipa_drv_res->ipa_wdi2 = false; + ipa_drv_res->use_64_bit_dma_mask = false; ipa_drv_res->wan_rx_ring_size = IPA_GENERIC_RX_POOL_SZ; ipa_drv_res->apply_rg10_wa = false; ipa_drv_res->gsi_ch20_wa = false; @@ -4478,6 +4480,13 @@ static int get_ipa_dts_configuration(struct platform_device *pdev, ipa_drv_res->ipa_wdi2 ? "True" : "False"); + ipa_drv_res->use_64_bit_dma_mask = + of_property_read_bool(pdev->dev.of_node, + "qcom,use-64-bit-dma-mask"); + IPADBG(": use_64_bit_dma_mask = %s\n", + ipa_drv_res->use_64_bit_dma_mask + ? "True" : "False"); + ipa_drv_res->skip_uc_pipe_reset = of_property_read_bool(pdev->dev.of_node, "qcom,skip-uc-pipe-reset"); @@ -4706,12 +4715,19 @@ static int ipa_smmu_uc_cb_probe(struct device *dev) cb->va_end = cb->va_start + cb->va_size; IPADBG("UC va_start=0x%x va_sise=0x%x\n", cb->va_start, cb->va_size); - if (dma_set_mask(dev, DMA_BIT_MASK(32)) || - dma_set_coherent_mask(dev, DMA_BIT_MASK(32))) { - IPAERR("DMA set mask failed\n"); - return -EOPNOTSUPP; + if (ipa3_ctx->use_64_bit_dma_mask) { + if (dma_set_mask(dev, DMA_BIT_MASK(64)) || + dma_set_coherent_mask(dev, DMA_BIT_MASK(64))) { + IPAERR("DMA set 64bit mask failed\n"); + return -EOPNOTSUPP; + } + } else { + if (dma_set_mask(dev, DMA_BIT_MASK(32)) || + dma_set_coherent_mask(dev, DMA_BIT_MASK(32))) { + IPAERR("DMA set 32bit mask failed\n"); + return -EOPNOTSUPP; + } } - IPADBG("UC CB PROBE=%p create IOMMU mapping\n", dev); cb->dev = dev; @@ -4810,10 +4826,18 @@ static int ipa_smmu_ap_cb_probe(struct device *dev) cb->va_end = cb->va_start + cb->va_size; IPADBG("AP va_start=0x%x va_sise=0x%x\n", cb->va_start, cb->va_size); - if (dma_set_mask(dev, DMA_BIT_MASK(32)) || - dma_set_coherent_mask(dev, DMA_BIT_MASK(32))) { - IPAERR("DMA set mask failed\n"); - return -EOPNOTSUPP; + if (ipa3_ctx->use_64_bit_dma_mask) { + if (dma_set_mask(dev, DMA_BIT_MASK(64)) || + dma_set_coherent_mask(dev, DMA_BIT_MASK(64))) { + IPAERR("DMA set 64bit mask failed\n"); + return -EOPNOTSUPP; + } + } else { + if (dma_set_mask(dev, DMA_BIT_MASK(32)) || + dma_set_coherent_mask(dev, DMA_BIT_MASK(32))) { + IPAERR("DMA set 32bit mask failed\n"); + return -EOPNOTSUPP; + } } cb->dev = dev; @@ -5019,11 +5043,21 @@ int ipa3_plat_drv_probe(struct platform_device *pdev_p, IPAERR("Legacy IOMMU not supported\n"); result = -EOPNOTSUPP; } else { - if (dma_set_mask(&pdev_p->dev, DMA_BIT_MASK(32)) || + if (of_property_read_bool(pdev_p->dev.of_node, + "qcom,use-64-bit-dma-mask")) { + if (dma_set_mask(&pdev_p->dev, DMA_BIT_MASK(64)) || + dma_set_coherent_mask(&pdev_p->dev, + DMA_BIT_MASK(64))) { + IPAERR("DMA set 64bit mask failed\n"); + return -EOPNOTSUPP; + } + } else { + if (dma_set_mask(&pdev_p->dev, DMA_BIT_MASK(32)) || dma_set_coherent_mask(&pdev_p->dev, DMA_BIT_MASK(32))) { - IPAERR("DMA set mask failed\n"); - return -EOPNOTSUPP; + IPAERR("DMA set 32bit mask failed\n"); + return -EOPNOTSUPP; + } } } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index e50a6be4d186..d2c605d7627c 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -1272,6 +1272,7 @@ struct ipa3_ready_cb_info { * @logbuf: ipc log buffer for high priority messages * @logbuf_low: ipc log buffer for low priority messages * @ipa_wdi2: using wdi-2.0 + * @use_64_bit_dma_mask: using 64bits dma mask * @ipa_bus_hdl: msm driver handle for the data path bus * @ctrl: holds the core specific operations based on * core version (vtable like) @@ -1370,6 +1371,7 @@ struct ipa3_context { bool ipa_bam_remote_mode; bool modem_cfg_emb_pipe_flt; bool ipa_wdi2; + bool use_64_bit_dma_mask; /* featurize if memory footprint becomes a concern */ struct ipa3_stats stats; void *smem_pipe_mem; @@ -1447,6 +1449,7 @@ struct ipa3_plat_drv_res { bool ipa_bam_remote_mode; bool modem_cfg_emb_pipe_flt; bool ipa_wdi2; + bool use_64_bit_dma_mask; u32 wan_rx_ring_size; bool skip_uc_pipe_reset; enum ipa_transport_type transport_prototype; |