summaryrefslogtreecommitdiff
path: root/drivers/platform
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-08-26 14:48:49 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-26 14:48:48 -0700
commit409a2f2f0b5393495b0363fd5e573f7afe91a7d9 (patch)
tree73bbed7e4991a1beacdd65283bc9d1619c6511b4 /drivers/platform
parent0cf5c85f8a9567a043b7c7399a184f5533eae7b5 (diff)
parenta029e1f5196bc27d4d1aac4fe6a52623add044d1 (diff)
Merge "msm: ipa3: add ipa-uc ram mapping to wlan-cb"
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c
index 9115e30b2b21..b5160ae110b1 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c
@@ -4660,6 +4660,9 @@ static int ipa_smmu_wlan_cb_probe(struct device *dev)
int fast = 1;
int bypass = 1;
int ret;
+ u32 add_map_size;
+ const u32 *add_map;
+ int i;
IPADBG("sub pdev=%p\n", dev);
@@ -4720,7 +4723,35 @@ static int ipa_smmu_wlan_cb_probe(struct device *dev)
cb->valid = false;
return ret;
}
+ /* MAP ipa-uc ram */
+ add_map = of_get_property(dev->of_node,
+ "qcom,additional-mapping", &add_map_size);
+ if (add_map) {
+ /* mapping size is an array of 3-tuple of u32 */
+ if (add_map_size % (3 * sizeof(u32))) {
+ IPAERR("wrong additional mapping format\n");
+ cb->valid = false;
+ return -EFAULT;
+ }
+ /* iterate of each entry of the additional mapping array */
+ for (i = 0; i < add_map_size / sizeof(u32); i += 3) {
+ u32 iova = be32_to_cpu(add_map[i]);
+ u32 pa = be32_to_cpu(add_map[i + 1]);
+ u32 size = be32_to_cpu(add_map[i + 2]);
+ unsigned long iova_p;
+ phys_addr_t pa_p;
+ u32 size_p;
+
+ IPA_SMMU_ROUND_TO_PAGE(iova, pa, size,
+ iova_p, pa_p, size_p);
+ IPADBG("mapping 0x%lx to 0x%pa size %d\n",
+ iova_p, &pa_p, size_p);
+ ipa3_iommu_map(cb->iommu,
+ iova_p, pa_p, size_p,
+ IOMMU_READ | IOMMU_WRITE | IOMMU_DEVICE);
+ }
+ }
return 0;
}