iommu/arm-smmu: Allow client devices to select identity mapping
Subsystems (5)
v2 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
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 | 20 ++++++++++ drivers/iommu/arm-smmu.h | 1 + 6 files changed, 68 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 v2 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 · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
PATCH v2 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_request_domain (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 = { + .req_domain = qcom_smmu_request_domain, .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 (*req_domain)(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
Robin Murphy
reviewerRe: [PATCHv2 2/6] iommu/arm-smmu: Allow client devices to select direct mapping
Quoted 63 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.
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_request_domain (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 = { + .req_domain = qcom_smmu_request_domain, .reset = qcom_smmu500_reset, };drivers/iommu/arm-smmu.h +0
-0
drivers/iommu/arm-smmu.h struct arm_smmu_impl { · line 389
Quoted 4 lines
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 (*req_domain)(struct device *dev);
Nit: since the point is to implement the full iommu_ops::def_domain_type interface, can we call it def_domain_type please?
Robin.
Quoted 4 lines
drivers/iommu/arm-smmu.h +0
-0};static inline void __iomem *arm_smmu_page (struct arm_smmu_device *smmu,int n)
Re: [PATCHv2 2/6] iommu/arm-smmu: Allow client devices to select direct mapping
Quoted 60 lines · Robin Murphy
Quoted 59 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.
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 +17
-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_request_domain (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 = { + .req_domain = qcom_smmu_request_domain, .reset = qcom_smmu500_reset, }; diff --git a/drivers/iommu/arm-smmu.h b/drivers/iommu/arm-smmu.hindex
8d1cd54d82a6..662fdb4dccd2100644drivers/iommu/arm-smmu.h +0
-0@@ -386,6 +386,7 @@ struct arm_smmu_impl {
Quoted 9 lines
drivers/iommu/arm-smmu.h struct arm_smmu_impl { · line 389
Quoted 4 lines
drivers/iommu/arm-smmu.h +1
-0int (*init_context)(struct arm_smmu_domain *smmu_domain);void (*tlb_sync)(struct arm_smmu_device *smmu,int page,int sync,int status); +int (*req_domain)(struct device *dev);Nit: since the point is to implement the full
iommu_ops::def_domain_typeinterface, can we call itdef_domain_typeplease?
Sure, will send the next version shortly.
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 v2 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 | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
drivers/iommu/arm-smmu.c +20 -0
@@ -1609,6 +1609,25 @@ 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 iommu_fwspec *fwspec; +struct arm_smmu_device *smmu; + + fwspec =dev_iommu_fwspec_get (dev); +if (!fwspec || fwspec->ops != &arm_smmu_ops) +return -ENODEV ; + + smmu =arm_smmu_get_by_fwnode (fwspec->iommu_fwnode); +if (!smmu) +return -ENODEV ; + +if (smmu->impl && smmu->impl->req_domain) +return smmu->impl->req_domain (dev); + +return 0 ; +} +static struct iommu_ops arm_smmu_ops = { .capable = arm_smmu_capable, .domain_alloc = arm_smmu_domain_alloc,
@@ -1627,6 +1646,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 · 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: [PATCHv2 3/6] iommu/arm-smmu: Implement iommu_ops->def_domain_type call-back
Quoted 20 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.Signed-off-by Sai Prakash Ranjan <[email protected]>--- drivers/iommu/arm-smmu.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)drivers/iommu/arm-smmu.c +3
-0@@ -1609,6 +1609,25 @@ 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 iommu_fwspec *fwspec;
drivers/iommu/arm-smmu.c static void arm_smmu_get_resv_regions(struct device *dev, · line 1624
Quoted 10 lines
drivers/iommu/arm-smmu.c +10
-0+struct arm_smmu_device *smmu; + + fwspec =dev_iommu_fwspec_get (dev); +if (!fwspec || fwspec->ops != &arm_smmu_ops) +return -ENODEV ; + + smmu =arm_smmu_get_by_fwnode (fwspec->iommu_fwnode); +if (!smmu) +return -ENODEV ; +
AFAICS this should only ever be called for a device in a group, which means an initial ->probe_device has succeeded and rather than defensively going the long way round, we can safely assume this:
struct arm_smmu_master_cfg = dev_iommu_priv_get(dev); struct arm_smmu_impl *impl = cfg->smmu->impl; if (impl && impl->req_domain) return impl->req_domain(dev);
Or have I misunderstood the flow?
Robin.
Quoted 18 lines
drivers/iommu/arm-smmu.c +7
-0+if (smmu->impl && smmu->impl->req_domain) +return smmu->impl->req_domain (dev); + +return 0 ; +} +static struct iommu_ops arm_smmu_ops = { .capable = arm_smmu_capable, .domain_alloc = arm_smmu_domain_alloc,@@ -1627,6 +1646,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 */ };
Re: [PATCHv2 3/6] iommu/arm-smmu: Implement iommu_ops->def_domain_type call-back
Hi Robin,
Quoted 36 lines · Robin Murphy
Quoted 20 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.Signed-off-by Sai Prakash Ranjan <[email protected]>--- drivers/iommu/arm-smmu.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)drivers/iommu/arm-smmu.c +2
-0@@ -1609,6 +1609,25 @@ static void arm_smmu_get_resv_regions(structdevice *dev,iommu_dma_get_resv_regions (dev ,head ); } +static int arm_smmu_def_domain_type(struct device *dev) +{ +struct iommu_fwspec *fwspec;drivers/iommu/arm-smmu.c static void arm_smmu_get_resv_regions(struct · line 1624
Quoted 10 lines
drivers/iommu/arm-smmu.c +10
-0+struct arm_smmu_device *smmu; + + fwspec =dev_iommu_fwspec_get (dev); +if (!fwspec || fwspec->ops != &arm_smmu_ops) +return -ENODEV ; + + smmu =arm_smmu_get_by_fwnode (fwspec->iommu_fwnode); +if (!smmu) +return -ENODEV ; +AFAICS this should only ever be called for a device in a group, which means an initial ->probe_device has succeeded and rather than defensively going the long way round, we can safely assume this:
Quoted 6 lines
struct arm_smmu_master_cfg = dev_iommu_priv_get(dev); struct arm_smmu_impl *impl = cfg->smmu->impl; if (impl && impl->req_domain) return impl->req_domain(dev);
Yes you are right, will use this.
Thanks,
Sai
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 v2 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 · 2 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
PATCH v2 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 v2 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 · 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