summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSkylar Chang <chiaweic@codeaurora.org>2016-07-28 11:35:22 -0700
committerSkylar Chang <chiaweic@codeaurora.org>2016-08-24 01:24:59 -0700
commita029e1f5196bc27d4d1aac4fe6a52623add044d1 (patch)
tree90b5df02c072ab7751f97d0470a6eb7297591988
parentc605e110ab18604981481a7b502da54640b620bc (diff)
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 <chiaweic@codeaurora.org>
-rw-r--r--Documentation/devicetree/bindings/platform/msm/ipa.txt3
-rw-r--r--drivers/platform/msm/ipa/ipa_v3/ipa.c31
2 files changed, 34 insertions, 0 deletions
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;
}