This adds the downstream property required to support
SMMUs on SDM630 and other platforms (the need for it
most likely depends on firmware configuration).

Signed-off-by: Konrad Dybcio <[email protected]>
---
 .../devicetree/bindings/iommu/arm,smmu.yaml       | 10 ++++++++++
 drivers/iommu/arm-smmu.c                          | 15 +++++++++------
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/Documentation/devicetree/bindings/iommu/arm,smmu.yaml 
b/Documentation/devicetree/bindings/iommu/arm,smmu.yaml
index d7ceb4c34423..9abd6d41a32c 100644
--- a/Documentation/devicetree/bindings/iommu/arm,smmu.yaml
+++ b/Documentation/devicetree/bindings/iommu/arm,smmu.yaml
@@ -102,6 +102,16 @@ properties:
       access to SMMU configuration registers. In this case non-secure aliases 
of
       secure registers have to be used during SMMU configuration.
 
+  qcom,skip-init:
+    description: |
+      Disable resetting configuration for all context banks
+      during device reset.  This is useful for targets where
+      some context banks are dedicated to other execution
+      environments outside of Linux and those other EEs are
+      programming their own stream match tables, SCTLR, etc.
+      Without setting this option we will trample on their
+      configuration.
+
   stream-match-mask:
     $ref: /schemas/types.yaml#/definitions/uint32
     description: |
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 243bc4cb2705..a5c623d4caf9 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -1655,13 +1655,16 @@ static void arm_smmu_device_reset(struct 
arm_smmu_device *smmu)
         * Reset stream mapping groups: Initial values mark all SMRn as
         * invalid and all S2CRn as bypass unless overridden.
         */
-       for (i = 0; i < smmu->num_mapping_groups; ++i)
-               arm_smmu_write_sme(smmu, i);
 
-       /* Make sure all context banks are disabled and clear CB_FSR  */
-       for (i = 0; i < smmu->num_context_banks; ++i) {
-               arm_smmu_write_context_bank(smmu, i);
-               arm_smmu_cb_write(smmu, i, ARM_SMMU_CB_FSR, ARM_SMMU_FSR_FAULT);
+       if (!of_find_property(smmu->dev->of_node, "qcom,skip-init", NULL)) {
+               for (i = 0; i < smmu->num_mapping_groups; ++i)
+                       arm_smmu_write_sme(smmu, i);
+
+               /* Make sure all context banks are disabled and clear CB_FSR  */
+               for (i = 0; i < smmu->num_context_banks; ++i) {
+                       arm_smmu_write_context_bank(smmu, i);
+                       arm_smmu_cb_write(smmu, i, ARM_SMMU_CB_FSR, 
ARM_SMMU_FSR_FAULT);
+               }
        }
 
        /* Invalidate the TLB, just in case */
-- 
2.27.0

Reply via email to