From a029e1f5196bc27d4d1aac4fe6a52623add044d1 Mon Sep 17 00:00:00 2001 From: Skylar Chang Date: Thu, 28 Jul 2016 11:35:22 -0700 Subject: [PATCH] msm: ipa3: add ipa-uc ram mapping to wlan-cb Add support for getting additional mappings from dtsi in order to create a mapping on IPA wlan SMMU context bank. Change-Id: I92922e494c745ea4c6bf4f473515dea4eccbd62e Signed-off-by: Skylar Chang --- .../devicetree/bindings/platform/msm/ipa.txt | 3 ++ drivers/platform/msm/ipa/ipa_v3/ipa.c | 31 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/Documentation/devicetree/bindings/platform/msm/ipa.txt b/Documentation/devicetree/bindings/platform/msm/ipa.txt index 11f36d8d9ebd..f3166d33f9e4 100644 --- a/Documentation/devicetree/bindings/platform/msm/ipa.txt +++ b/Documentation/devicetree/bindings/platform/msm/ipa.txt @@ -212,6 +212,9 @@ qcom,ipa@fd4c0000 { ipa_smmu_wlan: ipa_smmu_wlan { compatible = "qcom,ipa-smmu-wlan-cb"; iommus = <&anoc2_smmu 0x31>; + qcom,additional-mapping = + /* ipa-uc ram */ + <0x1E60000 0x1E60000 0x80000>; }; ipa_smmu_uc: ipa_smmu_uc { 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; }