iommu/arm-smmu: Allow client devices to select identity mapping
Subsystems (5)
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
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
@@ -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
@@ -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
PATCH v3 2/6 iommu/arm-smmu: Allow client devices to select direct mapping
In reply to Sai Prakash RanjanFrom: 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
@@ -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
@@ -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
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
Signed-off-by Jordan Crouse <[email protected]>Co-developed-by Sai Prakash Ranjan <[email protected]>Signed-off-by Sai Prakash Ranjan <[email protected]>--- 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@@ -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@@ -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)
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 :)
Reviewed-by Robin Murphy <[email protected]>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
PATCH v3 3/6 iommu/arm-smmu: Implement iommu_ops->def_domain_type call-back
In reply to Sai Prakash RanjanImplement 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
@@ -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
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_typecall-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
Signed-off-by Sai Prakash Ranjan <[email protected]>--- drivers/iommu/arm-smmu.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)drivers/iommu/arm-smmu.c +12
-0@@ -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 */ };
PATCH v3 4/6 iommu/arm-smmu-qcom: Request direct mapping for modem device
In reply to Sai Prakash RanjanFrom: 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
@@ -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
Robin Murphy
reviewerRe: [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, GFSYNR00x00000000,GFSYNR1 0x00000781, GFSYNR2 0x00000000arm-smmu 15000000.iommu: Unexpected global fault, this could be serious arm-smmu 15000000.iommu: GFSR
0x80000002, GFSYNR00x00000000,GFSYNR1 0x00000461, GFSYNR2 0x00000000Signed-off-by Sibi Sankar <[email protected]>Signed-off-by Sai Prakash Ranjan <[email protected]>--- drivers/iommu/arm-smmu-qcom.c | 2 ++ 1 file changed, 2 insertions(+)drivers/iommu/arm-smmu-qcom.c +2
-0@@ -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" }, { } };
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
PATCH v3 5/6 dt-bindings: remoteproc: qcom: Add iommus property
In reply to Sai Prakash RanjanFrom: 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
@@ -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
PATCH v3 6/6 arm64: dts: qcom: sdm845-cheza: Add iommus property
In reply to Sai Prakash RanjanFrom: 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
@@ -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