Skip to contentSkip to conversation

iommu/arm-smmu: Allow client devices to select identity mapping

PATCH Superseded Sai Prakash Ranjan 2 participants 12 messages Apr 20, 2020

Subsystems (5)

v3 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

v3 cover iommu/arm-smmu: Allow client devices to select identity mapping

This series allows DRM, Modem devices to set a default identity mapping in qcom smmu implementation.

Patch 1 is cleanup to support other SoCs to call into QCOM specific implementation.
Patch 2 sets the default identity domain for DRM devices. Patch 3 implements def_domain_type callback for arm-smmu. Patch 4 sets the default identity domain for modem device. Patch 5-6 adds the iommus property for mss pil.

This is based on Joerg's tree:
- https://git.kernel.org/pub/scm/linux/kernel/git/joro/linux.git/log/?h=iommu-probe-device-v2

v3:
* Use arm_smmu_master_cfg to get impl instead of long way as per Robin.
* Use def_domain_type name for the callback in arm_smmu_imp as per Robin

Jordan Crouse (1):
iommu/arm-smmu: Allow client devices to select direct mapping

Sai Prakash Ranjan (2):
iommu: arm-smmu-impl: Convert to a generic reset implementation iommu/arm-smmu: Implement iommu_ops->def_domain_type call-back

Sibi Sankar (3):
iommu/arm-smmu-qcom: Request direct mapping for modem device
dt-bindings: remoteproc: qcom: Add iommus property
arm64: dts: qcom: sdm845-cheza: Add iommus property

 .../bindings/remoteproc/qcom,q6v5.txt         |  3 ++
 arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi    |  5 +++
 drivers/iommu/arm-smmu-impl.c                 |  8 ++--
 drivers/iommu/arm-smmu-qcom.c                 | 37 +++++++++++++++++--
 drivers/iommu/arm-smmu.c                      | 12 ++++++
 drivers/iommu/arm-smmu.h                      |  1 +
 6 files changed, 60 insertions(+), 6 deletions(-)
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation
#1 lore raw

PATCH v3 1/6 iommu: arm-smmu-impl: Convert to a generic reset implementation

Currently the QCOM specific smmu reset implementation is very specific to SDM845 SoC and has a wait-for-safe logic which may not be required for other SoCs. So move the SDM845 specific logic to its specific reset function. Also add SC7180 SMMU compatible for calling into QCOM specific implementation.

---
 drivers/iommu/arm-smmu-impl.c |  8 +++++---
 drivers/iommu/arm-smmu-qcom.c | 16 +++++++++++++---
 2 files changed, 18 insertions(+), 6 deletions(-)
drivers/iommu/arm-smmu-impl.c +5 -3
index 74d97a886e93..c75b9d957b70 100644
@@ -150,6 +150,8 @@ static const struct arm_smmu_impl arm_mmu500_impl = {
 
 struct arm_smmu_device *arm_smmu_impl_init(struct arm_smmu_device *smmu)
 {
+	const struct device_node *np = smmu->dev->of_node;
+
 	/*
 	 * We will inevitably have to combine model-specific implementation
 	 * quirks with platform-specific integration quirks, but everything
@@ -166,11 +168,11 @@ struct arm_smmu_device *arm_smmu_impl_init(struct arm_smmu_device *smmu)
 		break;
 	}
 
-	if (of_property_read_bool(smmu->dev->of_node,
-				  "calxeda,smmu-secure-config-access"))
+	if (of_property_read_bool(np, "calxeda,smmu-secure-config-access"))
 		smmu->impl = &calxeda_impl;
 
-	if (of_device_is_compatible(smmu->dev->of_node, "qcom,sdm845-smmu-500"))
+	if (of_device_is_compatible(np, "qcom,sdm845-smmu-500") ||
+	    of_device_is_compatible(np, "qcom,sc7180-smmu-500"))
 		return qcom_smmu_impl_init(smmu);
 
 	return smmu;
drivers/iommu/arm-smmu-qcom.c +13 -3
index 24c071c1d8b0..64a4ab270ab7 100644
@@ -15,8 +15,6 @@ static int qcom_sdm845_smmu500_reset(struct arm_smmu_device *smmu)
 {
 	int ret;
 
-	arm_mmu500_reset(smmu);
-
 	/*
 	 * To address performance degradation in non-real time clients,
 	 * such as USB and UFS, turn off wait-for-safe on sdm845 based boards,
@@ -30,8 +28,20 @@ static int qcom_sdm845_smmu500_reset(struct arm_smmu_device *smmu)
 	return ret;
 }
 
+static int qcom_smmu500_reset(struct arm_smmu_device *smmu)
+{
+	const struct device_node *np = smmu->dev->of_node;
+
+	arm_mmu500_reset(smmu);
+
+	if (of_device_is_compatible(np, "qcom,sdm845-smmu-500"))
+		return qcom_sdm845_smmu500_reset(smmu);
+
+	return 0;
+}
+
 static const struct arm_smmu_impl qcom_smmu_impl = {
-	.reset = qcom_sdm845_smmu500_reset,
+	.reset = qcom_smmu500_reset,
 };
 
 struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)
Signature · 6 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu
#2 lore raw

PATCH v3 2/6 iommu/arm-smmu: Allow client devices to select direct mapping

In reply to Sai Prakash Ranjan

From: Jordan Crouse <[email protected]>

Some client devices want to directly map the IOMMU themselves instead of using the DMA domain. Allow those devices to opt in to direct mapping by way of a list of compatible strings.

---
 drivers/iommu/arm-smmu-qcom.c | 19 +++++++++++++++++++
 drivers/iommu/arm-smmu.h      |  1 +
 2 files changed, 20 insertions(+)
drivers/iommu/arm-smmu-qcom.c +19 -0
index 64a4ab270ab7..5bedf21587a5 100644
@@ -3,6 +3,7 @@
  * Copyright (c) 2019, The Linux Foundation. All rights reserved.
  */
 
+#include <linux/of_device.h>
 #include <linux/qcom_scm.h>
 
 #include "arm-smmu.h"
@@ -11,6 +12,23 @@ struct qcom_smmu {
 	struct arm_smmu_device smmu;
 };
 
+static const struct of_device_id qcom_smmu_client_of_match[] = {
+	{ .compatible = "qcom,adreno" },
+	{ .compatible = "qcom,mdp4" },
+	{ .compatible = "qcom,mdss" },
+	{ .compatible = "qcom,sc7180-mdss" },
+	{ .compatible = "qcom,sdm845-mdss" },
+	{ }
+};
+
+static int qcom_smmu_def_domain_type(struct device *dev)
+{
+	const struct of_device_id *match =
+		of_match_device(qcom_smmu_client_of_match, dev);
+
+	return match ? IOMMU_DOMAIN_IDENTITY : 0;
+}
+
 static int qcom_sdm845_smmu500_reset(struct arm_smmu_device *smmu)
 {
 	int ret;
@@ -41,6 +59,7 @@ static int qcom_smmu500_reset(struct arm_smmu_device *smmu)
 }
 
 static const struct arm_smmu_impl qcom_smmu_impl = {
+	.def_domain_type = qcom_smmu_def_domain_type,
 	.reset = qcom_smmu500_reset,
 };
 
drivers/iommu/arm-smmu.h +1 -0
index 8d1cd54d82a6..d172c024be61 100644
@@ -386,6 +386,7 @@ struct arm_smmu_impl {
 	int (*init_context)(struct arm_smmu_domain *smmu_domain);
 	void (*tlb_sync)(struct arm_smmu_device *smmu, int page, int sync,
 			 int status);
+	int (*def_domain_type)(struct device *dev);
 };
 
 static inline void __iomem *arm_smmu_page(struct arm_smmu_device *smmu, int n)
Signature · 6 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu
reviewer Reviewed-by on v3 2/6
#3 lore raw

Re: [PATCHv3 2/6] iommu/arm-smmu: Allow client devices to select direct mapping

Quoted 5 lines · Sai Prakash Ranjan

From: Jordan Crouse <[email protected]>

Some client devices want to directly map the IOMMU themselves instead of using the DMA domain. Allow those devices to opt in to direct mapping by way of a list of compatible strings.

Neat and tidy :)

Strictly, I think patch #3/6 should really have come before this one (with the header change moved accordingly), but don't bother resending just for that.

Thanks,
Robin.

Quoted 65 lines
---
  drivers/iommu/arm-smmu-qcom.c | 19 +++++++++++++++++++
  drivers/iommu/arm-smmu.h      |  1 +
  2 files changed, 20 insertions(+)
drivers/iommu/arm-smmu-qcom.c +19 -0
index 64a4ab270ab7..5bedf21587a5 100644
@@ -3,6 +3,7 @@
   * Copyright (c) 2019, The Linux Foundation. All rights reserved.
   */
 
+#include <linux/of_device.h>
  #include <linux/qcom_scm.h>
 
  #include "arm-smmu.h"
@@ -11,6 +12,23 @@ struct qcom_smmu {
  	struct arm_smmu_device smmu;
  };
 
+static const struct of_device_id qcom_smmu_client_of_match[] = {
+	{ .compatible = "qcom,adreno" },
+	{ .compatible = "qcom,mdp4" },
+	{ .compatible = "qcom,mdss" },
+	{ .compatible = "qcom,sc7180-mdss" },
+	{ .compatible = "qcom,sdm845-mdss" },
+	{ }
+};
+
+static int qcom_smmu_def_domain_type(struct device *dev)
+{
+	const struct of_device_id *match =
+		of_match_device(qcom_smmu_client_of_match, dev);
+
+	return match ? IOMMU_DOMAIN_IDENTITY : 0;
+}
+
  static int qcom_sdm845_smmu500_reset(struct arm_smmu_device *smmu)
  {
  	int ret;
@@ -41,6 +59,7 @@ static int qcom_smmu500_reset(struct arm_smmu_device *smmu)
  }
 
  static const struct arm_smmu_impl qcom_smmu_impl = {
+	.def_domain_type = qcom_smmu_def_domain_type,
  	.reset = qcom_smmu500_reset,
  };
 
drivers/iommu/arm-smmu.h +1 -0
index 8d1cd54d82a6..d172c024be61 100644
@@ -386,6 +386,7 @@ struct arm_smmu_impl {
  	int (*init_context)(struct arm_smmu_domain *smmu_domain);
  	void (*tlb_sync)(struct arm_smmu_device *smmu, int page, int sync,
  			 int status);
+	int (*def_domain_type)(struct device *dev);
  };
 
  static inline void __iomem *arm_smmu_page(struct arm_smmu_device *smmu, int n)
#4 lore raw

Re: [PATCHv3 2/6] iommu/arm-smmu: Allow client devices to select direct mapping

Quoted 7 lines · Robin Murphy
Quoted 5 lines · Sai Prakash Ranjan

From: Jordan Crouse <[email protected]>

Some client devices want to directly map the IOMMU themselves instead of using the DMA domain. Allow those devices to opt in to direct mapping by way of a list of compatible strings.

Quoted 8 lines

Neat and tidy :)

Strictly, I think patch #3/6 should really have come before this one (with the header change moved accordingly), but don't bother resending just for that.

Thanks, I have sent the updated version with this change as well in addition to the commit msg update for modem requesting direct mapping.

Thanks,
Sai

Signature · 6 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu
#5 lore raw

PATCH v3 3/6 iommu/arm-smmu: Implement iommu_ops->def_domain_type call-back

In reply to Sai Prakash Ranjan

Implement the new def_domain_type call-back for the ARM SMMU driver. We need this to support requesting the domain type by the client devices.

---
 drivers/iommu/arm-smmu.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)
drivers/iommu/arm-smmu.c +12 -0
index e622f4e33379..b345a86085ce 100644
@@ -1609,6 +1609,17 @@ static void arm_smmu_get_resv_regions(struct device *dev,
 	iommu_dma_get_resv_regions(dev, head);
 }
 
+static int arm_smmu_def_domain_type(struct device *dev)
+{
+	struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev);
+	const struct arm_smmu_impl *impl = cfg->smmu->impl;
+
+	if (impl && impl->def_domain_type)
+		return impl->def_domain_type(dev);
+
+	return 0;
+}
+
 static struct iommu_ops arm_smmu_ops = {
 	.capable		= arm_smmu_capable,
 	.domain_alloc		= arm_smmu_domain_alloc,
@@ -1627,6 +1638,7 @@ static struct iommu_ops arm_smmu_ops = {
 	.of_xlate		= arm_smmu_of_xlate,
 	.get_resv_regions	= arm_smmu_get_resv_regions,
 	.put_resv_regions	= generic_iommu_put_resv_regions,
+	.def_domain_type	= arm_smmu_def_domain_type,
 	.pgsize_bitmap		= -1UL, /* Restricted during device attach */
 };
 
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation
reviewer Reviewed-by on v3 3/6
#6 lore raw

Re: [PATCHv3 3/6] iommu/arm-smmu: Implement iommu_ops->def_domain_type call-back

Quoted 3 lines · Sai Prakash Ranjan

Implement the new def_domain_type call-back for the ARM SMMU driver. We need this to support requesting the domain type by the client devices.

Modulo any further changes to the default domain rework,

Quoted 36 lines
---
  drivers/iommu/arm-smmu.c | 12 ++++++++++++
  1 file changed, 12 insertions(+)
drivers/iommu/arm-smmu.c +12 -0
index e622f4e33379..b345a86085ce 100644
@@ -1609,6 +1609,17 @@ static void arm_smmu_get_resv_regions(struct device *dev,
  	iommu_dma_get_resv_regions(dev, head);
  }
 
+static int arm_smmu_def_domain_type(struct device *dev)
+{
+	struct arm_smmu_master_cfg *cfg = dev_iommu_priv_get(dev);
+	const struct arm_smmu_impl *impl = cfg->smmu->impl;
+
+	if (impl && impl->def_domain_type)
+		return impl->def_domain_type(dev);
+
+	return 0;
+}
+
  static struct iommu_ops arm_smmu_ops = {
  	.capable		= arm_smmu_capable,
  	.domain_alloc		= arm_smmu_domain_alloc,
@@ -1627,6 +1638,7 @@ static struct iommu_ops arm_smmu_ops = {
  	.of_xlate		= arm_smmu_of_xlate,
  	.get_resv_regions	= arm_smmu_get_resv_regions,
  	.put_resv_regions	= generic_iommu_put_resv_regions,
+	.def_domain_type	= arm_smmu_def_domain_type,
  	.pgsize_bitmap		= -1UL, /* Restricted during device attach */
  };
 
#7 lore raw

PATCH v3 4/6 iommu/arm-smmu-qcom: Request direct mapping for modem device

In reply to Sai Prakash Ranjan

From: Sibi Sankar <[email protected]>

Request direct mapping for modem on platforms which don't have TrustZone (which programs the modem SIDs) to prevent the following global faults seen on Cheza/Trogdor:

arm-smmu 15000000.iommu: Unexpected global fault, this could be serious arm-smmu 15000000.iommu: GFSR 0x80000002, GFSYNR0 0x00000000,

			 GFSYNR1 0x00000781, GFSYNR2 0x00000000

arm-smmu 15000000.iommu: Unexpected global fault, this could be serious arm-smmu 15000000.iommu: GFSR 0x80000002, GFSYNR0 0x00000000,

			 GFSYNR1 0x00000461, GFSYNR2 0x00000000
---
 drivers/iommu/arm-smmu-qcom.c | 2 ++
 1 file changed, 2 insertions(+)
drivers/iommu/arm-smmu-qcom.c +2 -0
index 5bedf21587a5..cf01d0215a39 100644
@@ -17,7 +17,9 @@ static const struct of_device_id qcom_smmu_client_of_match[] = {
 	{ .compatible = "qcom,mdp4" },
 	{ .compatible = "qcom,mdss" },
 	{ .compatible = "qcom,sc7180-mdss" },
+	{ .compatible = "qcom,sc7180-mss-pil" },
 	{ .compatible = "qcom,sdm845-mdss" },
+	{ .compatible = "qcom,sdm845-mss-pil" },
 	{ }
 };
 
Signature · 6 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu
reviewer
#8 lore raw

Re: [PATCHv3 4/6] iommu/arm-smmu-qcom: Request direct mapping for modem device

Quoted 5 lines · Sai Prakash Ranjan

From: Sibi Sankar <[email protected]>

Request direct mapping for modem on platforms which don't have TrustZone (which programs the modem SIDs) to prevent the following global faults seen on Cheza/Trogdor:

Not strictly true - it's patch #6/6 that prevents *those* faults (and these days the driver should be reporting unmatched streams a little more helpfully). This change would resolve the context faults and/or weird memory corruption that might result from applying patch #6 alone - this is the crazy thing where transactions sometimes go directly to DRAM round the side of the SMMU so we can never safely remap anything, right?

Robin.

Quoted 29 lines

arm-smmu 15000000.iommu: Unexpected global fault, this could be serious arm-smmu 15000000.iommu: GFSR 0x80000002, GFSYNR0 0x00000000,

			 GFSYNR1 0x00000781, GFSYNR2 0x00000000

arm-smmu 15000000.iommu: Unexpected global fault, this could be serious arm-smmu 15000000.iommu: GFSR 0x80000002, GFSYNR0 0x00000000,

			 GFSYNR1 0x00000461, GFSYNR2 0x00000000
---
  drivers/iommu/arm-smmu-qcom.c | 2 ++
  1 file changed, 2 insertions(+)
drivers/iommu/arm-smmu-qcom.c +2 -0
index 5bedf21587a5..cf01d0215a39 100644
@@ -17,7 +17,9 @@ static const struct of_device_id qcom_smmu_client_of_match[] = {
  	{ .compatible = "qcom,mdp4" },
  	{ .compatible = "qcom,mdss" },
  	{ .compatible = "qcom,sc7180-mdss" },
+	{ .compatible = "qcom,sc7180-mss-pil" },
  	{ .compatible = "qcom,sdm845-mdss" },
+	{ .compatible = "qcom,sdm845-mss-pil" },
  	{ }
  };
 
#9 lore raw

Re: [PATCHv3 4/6] iommu/arm-smmu-qcom: Request direct mapping for modem device

Hi Robin,

Quoted 7 lines · Robin Murphy
Quoted 5 lines · Sai Prakash Ranjan

From: Sibi Sankar <[email protected]>

Request direct mapping for modem on platforms which don't have TrustZone (which programs the modem SIDs) to prevent the following global faults seen on Cheza/Trogdor:

Quoted 8 lines

Not strictly true - it's patch #6/6 that prevents *those* faults (and these days the driver should be reporting unmatched streams a little more helpfully). This change would resolve the context faults and/or weird memory corruption that might result from applying patch #6 alone
- this is the crazy thing where transactions sometimes go directly to DRAM round the side of the SMMU so we can never safely remap anything, right?

True this doesnt prevent global faults, the fault details should go to patch6. I'll update the commit msg something like below:

The Q6 modem sub-system has direct access to DDR through memnoc. Also SMMU is not expected to provide access control/translation for these SIDs (sandboxing of the modem is achieved through XPUs engaged using SMC calls).

Thanks,
Sai

Signature · 6 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu
#10 lore raw

PATCH v3 5/6 dt-bindings: remoteproc: qcom: Add iommus property

In reply to Sai Prakash Ranjan

From: Sibi Sankar <[email protected]>

Add iommus property to allow Q6 modem to boot on platforms which do not have trustZone.

---
 Documentation/devicetree/bindings/remoteproc/qcom,q6v5.txt | 3 +++
 1 file changed, 3 insertions(+)
Documentation/devicetree/bindings/remoteproc/qcom,q6v5.txt +3 -0
index 88dfa3fc15f7..130e50aab741 100644
@@ -184,6 +184,9 @@ For the compatible strings below the following phandle references are required:
 		    followed by the offset within syscon for conn_box_spare0
 		    register.
 
+The Hexagon node must contain iommus property as described in ../iommu/iommu.txt
+on platforms which do not have TrustZone.
+
 = SUBNODES:
 The Hexagon node must contain two subnodes, named "mba" and "mpss" representing
 the memory regions used by the Hexagon firmware. Each sub-node must contain:
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation
#11 lore raw

PATCH v3 6/6 arm64: dts: qcom: sdm845-cheza: Add iommus property

In reply to Sai Prakash Ranjan

From: Sibi Sankar <[email protected]>

Add iommus property to remoteproc modem node.

---
 arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi | 5 +++++
 1 file changed, 5 insertions(+)
arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi +5 -0
index 9070be43a309..07081da2c83e 100644
@@ -631,6 +631,11 @@ ap_ts_i2c: &i2c14 {
 	status = "okay";
 };
 
+&mss_pil {
+	iommus = <&apps_smmu 0x780 0x1>,
+		 <&apps_smmu 0x724 0x3>;
+};
+
 &pm8998_pwrkey {
 	status = "disabled";
 };
Signature · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation