summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorSkylar Chang <chiaweic@codeaurora.org>2016-06-14 16:44:54 -0700
committerKyle Yan <kyan@codeaurora.org>2016-06-21 15:12:44 -0700
commit5fed61467694fb7e83e0e911ccccafcbf187b93e (patch)
tree52ef971666c39d3392033afb0964f78176b5d07a /drivers
parentf956c61bd2ee86905762e78f1c574e87b284ed04 (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.c58
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa_i.h3
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;