From: Robin Murphy <robin.murphy@arm.com>
To: Michael Shavit <mshavit@google.com>,
iommu@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Cc: will@kernel.org, jgg@nvidia.com, nicolinc@nvidia.com,
tina.zhang@intel.com, jean-philippe@linaro.org
Subject: Re: [RFC PATCH v1 4/8] iommu/arm-smmu-v3: check smmu compatibility on attach
Date: Thu, 17 Aug 2023 20:16:52 +0100 [thread overview]
Message-ID: <3fc6ba4b-1e40-b835-06b9-b6d40f916d75@arm.com> (raw)
In-Reply-To: <20230818021629.RFC.v1.4.I100c49a1e2ce915982965a065f95a494c2e9ad28@changeid>
On 2023-08-17 19:16, Michael Shavit wrote:
> Record the domain's pgtbl_cfg when it's being prepared so that it can
> later be compared to the features an smmu supports.
What's wrong with retrieving the existing config from the
io_pgtable_ops, same as all the other io-pgtable code does?
Thanks,
Robin.
> Verify a domain's compatibility with the smmu when it's being attached
> to a master belong to a different smmu device.
>
> Signed-off-by: Michael Shavit <mshavit@google.com>
> ---
>
> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 103 ++++++++++++++++----
> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 2 +
> 2 files changed, 86 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> index 447af74dbe280..c0943cf3c09ca 100644
> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> @@ -2195,17 +2195,48 @@ static int arm_smmu_domain_finalise_s2(struct arm_smmu_domain *smmu_domain,
> return 0;
> }
>
> +static int arm_smmu_prepare_pgtbl_cfg(struct arm_smmu_device *smmu,
> + enum arm_smmu_domain_stage stage,
> + struct io_pgtable_cfg *pgtbl_cfg)
> +{
> + unsigned long ias, oas;
> +
> + switch (stage) {
> + case ARM_SMMU_DOMAIN_S1:
> + ias = (smmu->features & ARM_SMMU_FEAT_VAX) ? 52 : 48;
> + ias = min_t(unsigned long, ias, VA_BITS);
> + oas = smmu->ias;
> + break;
> + case ARM_SMMU_DOMAIN_NESTED:
> + case ARM_SMMU_DOMAIN_S2:
> + ias = smmu->ias;
> + oas = smmu->oas;
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + *pgtbl_cfg = (struct io_pgtable_cfg) {
> + .pgsize_bitmap = smmu->pgsize_bitmap,
> + .ias = ias,
> + .oas = oas,
> + .coherent_walk = smmu->features & ARM_SMMU_FEAT_COHERENCY,
> + .tlb = &arm_smmu_flush_ops,
> + .iommu_dev = smmu->dev,
> + };
> + return 0;
> +}
> +
> static int arm_smmu_domain_finalise(struct iommu_domain *domain)
> {
> int ret;
> - unsigned long ias, oas;
> enum io_pgtable_fmt fmt;
> - struct io_pgtable_cfg pgtbl_cfg;
> struct io_pgtable_ops *pgtbl_ops;
> int (*finalise_stage_fn)(struct arm_smmu_domain *,
> struct io_pgtable_cfg *);
> struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
> struct arm_smmu_device *smmu = smmu_domain->smmu;
> + struct io_pgtable_cfg *pgtbl_cfg = &smmu_domain->pgtbl_cfg;
>
> if (domain->type == IOMMU_DOMAIN_IDENTITY) {
> smmu_domain->stage = ARM_SMMU_DOMAIN_BYPASS;
> @@ -2220,16 +2251,11 @@ static int arm_smmu_domain_finalise(struct iommu_domain *domain)
>
> switch (smmu_domain->stage) {
> case ARM_SMMU_DOMAIN_S1:
> - ias = (smmu->features & ARM_SMMU_FEAT_VAX) ? 52 : 48;
> - ias = min_t(unsigned long, ias, VA_BITS);
> - oas = smmu->ias;
> fmt = ARM_64_LPAE_S1;
> finalise_stage_fn = arm_smmu_domain_finalise_s1;
> break;
> case ARM_SMMU_DOMAIN_NESTED:
> case ARM_SMMU_DOMAIN_S2:
> - ias = smmu->ias;
> - oas = smmu->oas;
> fmt = ARM_64_LPAE_S2;
> finalise_stage_fn = arm_smmu_domain_finalise_s2;
> break;
> @@ -2237,24 +2263,19 @@ static int arm_smmu_domain_finalise(struct iommu_domain *domain)
> return -EINVAL;
> }
>
> - pgtbl_cfg = (struct io_pgtable_cfg) {
> - .pgsize_bitmap = smmu->pgsize_bitmap,
> - .ias = ias,
> - .oas = oas,
> - .coherent_walk = smmu->features & ARM_SMMU_FEAT_COHERENCY,
> - .tlb = &arm_smmu_flush_ops,
> - .iommu_dev = smmu->dev,
> - };
> + ret = arm_smmu_prepare_pgtbl_cfg(smmu, smmu_domain->stage, pgtbl_cfg);
> + if (ret)
> + return ret;
>
> - pgtbl_ops = alloc_io_pgtable_ops(fmt, &pgtbl_cfg, smmu_domain);
> + pgtbl_ops = alloc_io_pgtable_ops(fmt, pgtbl_cfg, smmu_domain);
> if (!pgtbl_ops)
> return -ENOMEM;
>
> - domain->pgsize_bitmap = pgtbl_cfg.pgsize_bitmap;
> - domain->geometry.aperture_end = (1UL << pgtbl_cfg.ias) - 1;
> + domain->pgsize_bitmap = pgtbl_cfg->pgsize_bitmap;
> + domain->geometry.aperture_end = (1UL << pgtbl_cfg->ias) - 1;
> domain->geometry.force_aperture = true;
>
> - ret = finalise_stage_fn(smmu_domain, &pgtbl_cfg);
> + ret = finalise_stage_fn(smmu_domain, pgtbl_cfg);
> if (ret < 0) {
> free_io_pgtable_ops(pgtbl_ops);
> return ret;
> @@ -2406,6 +2427,46 @@ static void arm_smmu_disable_pasid(struct arm_smmu_master *master)
> pci_disable_pasid(pdev);
> }
>
> +static int
> +arm_smmu_verify_domain_compatible(struct arm_smmu_device *smmu,
> + struct arm_smmu_domain *smmu_domain)
> +{
> + struct io_pgtable_cfg pgtbl_cfg;
> + int ret;
> +
> + if (smmu_domain->domain.type == IOMMU_DOMAIN_IDENTITY)
> + return 0;
> +
> + if (smmu_domain->stage == ARM_SMMU_DOMAIN_S2) {
> + if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S2))
> + return -EINVAL;
> + if (smmu_domain->s2_cfg.vmid >> smmu->vmid_bits)
> + return -EINVAL;
> + } else if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
> + if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S1))
> + return -EINVAL;
> + if (smmu_domain->cd.asid >> smmu->asid_bits)
> + return -EINVAL;
> + }
> +
> + ret = arm_smmu_prepare_pgtbl_cfg(smmu, smmu_domain->stage, &pgtbl_cfg);
> + if (ret)
> + return ret;
> +
> + if (smmu_domain->pgtbl_cfg.ias > pgtbl_cfg.ias ||
> + smmu_domain->pgtbl_cfg.oas > pgtbl_cfg.oas ||
> + /*
> + * The supported pgsize_bitmap must be a superset of the domain's
> + * pgsize_bitmap.
> + */
> + (smmu_domain->pgtbl_cfg.pgsize_bitmap ^ pgtbl_cfg.pgsize_bitmap) &
> + smmu_domain->pgtbl_cfg.pgsize_bitmap ||
> + smmu_domain->pgtbl_cfg.coherent_walk != pgtbl_cfg.coherent_walk)
> + return -EINVAL;
> +
> + return 0;
> +}
> +
> static void arm_smmu_installed_smmus_remove_device(
> struct arm_smmu_domain *smmu_domain,
> struct arm_smmu_master *master)
> @@ -2449,6 +2510,10 @@ arm_smmu_installed_smmus_add_device(struct arm_smmu_domain *smmu_domain,
> }
> }
> if (!list_entry_found) {
> + ret = arm_smmu_verify_domain_compatible(smmu, smmu_domain);
> + if (ret)
> + goto unlock;
> +
> installed_smmu = kzalloc(sizeof(*installed_smmu), GFP_KERNEL);
> if (!installed_smmu) {
> ret = -ENOMEM;
> diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h
> index 2ab23139c796e..143b287be2f8b 100644
> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h
> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h
> @@ -9,6 +9,7 @@
> #define _ARM_SMMU_V3_H
>
> #include <linux/bitfield.h>
> +#include <linux/io-pgtable.h>
> #include <linux/iommu.h>
> #include <linux/kernel.h>
> #include <linux/mmzone.h>
> @@ -729,6 +730,7 @@ struct arm_smmu_domain {
> struct mutex init_mutex; /* Protects smmu pointer */
>
> struct io_pgtable_ops *pgtbl_ops;
> + struct io_pgtable_cfg pgtbl_cfg;
> atomic_t nr_ats_masters;
>
> enum arm_smmu_domain_stage stage;
next prev parent reply other threads:[~2023-08-17 19:18 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-17 18:16 [RFC PATCH v1 0/8] Install domain onto multiple smmus Michael Shavit
2023-08-17 18:16 ` [RFC PATCH v1 1/8] iommu/arm-smmu-v3: Add list of installed_smmus Michael Shavit
2023-08-17 19:05 ` Jason Gunthorpe
2023-08-17 19:34 ` Robin Murphy
2023-08-18 5:34 ` Michael Shavit
2023-08-17 18:16 ` [RFC PATCH v1 2/8] iommu/arm-smmu-v3: Perform invalidations over installed_smmus Michael Shavit
2023-08-17 19:20 ` Jason Gunthorpe
2023-08-17 19:41 ` Robin Murphy
2023-08-18 3:44 ` Michael Shavit
2023-08-18 13:51 ` Jason Gunthorpe
2023-08-21 8:33 ` Michael Shavit
2023-08-21 11:57 ` Jason Gunthorpe
2023-08-22 8:17 ` Michael Shavit
2023-08-22 8:21 ` Michael Shavit
2023-08-22 10:10 ` Michael Shavit
2023-08-22 14:15 ` Jason Gunthorpe
2023-08-17 18:16 ` [RFC PATCH v1 3/8] iommu/arm-smmu-v3-sva: Allocate new ASID from installed_smmus Michael Shavit
2023-08-17 18:38 ` Jason Gunthorpe
2023-08-21 9:31 ` Michael Shavit
2023-08-21 11:54 ` Jason Gunthorpe
2023-08-21 13:38 ` Michael Shavit
2023-08-21 13:50 ` Jason Gunthorpe
2023-08-21 14:16 ` Michael Shavit
2023-08-21 14:26 ` Jason Gunthorpe
2023-08-21 14:39 ` Michael Shavit
2023-08-21 14:56 ` Jason Gunthorpe
2023-08-22 8:53 ` Michael Shavit
2023-08-17 18:16 ` [RFC PATCH v1 4/8] iommu/arm-smmu-v3: check smmu compatibility on attach Michael Shavit
2023-08-17 19:16 ` Robin Murphy [this message]
2023-08-18 3:14 ` Michael Shavit
2023-08-17 18:16 ` [RFC PATCH v1 5/8] iommu/arm-smmu-v3: Add arm_smmu_device as a parameter to domain_finalise Michael Shavit
2023-08-17 18:16 ` [RFC PATCH v1 6/8] iommu/arm-smmu-v3: Free VMID when uninstalling domain from SMMU Michael Shavit
2023-08-17 18:50 ` Jason Gunthorpe
2023-08-17 18:16 ` [RFC PATCH v1 7/8] iommu/arm-smmu-v3: check for domain initialization using pgtbl_ops Michael Shavit
2023-08-17 18:16 ` [RFC PATCH v1 8/8] iommu/arm-smmu-v3: allow multi-SMMU domain installs Michael Shavit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3fc6ba4b-1e40-b835-06b9-b6d40f916d75@arm.com \
--to=robin.murphy@arm.com \
--cc=iommu@lists.linux.dev \
--cc=jean-philippe@linaro.org \
--cc=jgg@nvidia.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mshavit@google.com \
--cc=nicolinc@nvidia.com \
--cc=tina.zhang@intel.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®