From: Robin Murphy <robin.murphy@arm.com>
To: Jean-Philippe Brucker <jean-philippe@linaro.org>,
will@kernel.org, joro@8bytes.org
Cc: vivek.gautam@arm.com, iommu@lists.linux-foundation.org,
linux-arm-kernel@lists.infradead.org, zhangfei.gao@linaro.org
Subject: Re: [PATCH 2/3] iommu/arm-smmu-v3: Make BTM optional for SVA
Date: Fri, 22 Jan 2021 14:04:55 +0000 [thread overview]
Message-ID: <14f78aee-c7fd-22ff-64d4-6aff2e9ec015@arm.com> (raw)
In-Reply-To: <20210122115257.2502526-3-jean-philippe@linaro.org>
On 2021-01-22 11:52, Jean-Philippe Brucker wrote:
> When BTM isn't supported by the SMMU, send invalidations on the
> command queue.
>
> Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
> ---
> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 3 +++
> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 14 +++++++++++---
> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 14 ++++++++++++++
> 3 files changed, 28 insertions(+), 3 deletions(-)
>
> 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 a6536c2b32d0..652d03ad8ae6 100644
> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h
> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h
> @@ -743,6 +743,9 @@ extern struct arm_smmu_ctx_desc quiet_cd;
> int arm_smmu_write_ctx_desc(struct arm_smmu_domain *smmu_domain, int ssid,
> struct arm_smmu_ctx_desc *cd);
> void arm_smmu_tlb_inv_asid(struct arm_smmu_device *smmu, u16 asid);
> +void arm_smmu_tlb_inv_range_asid(unsigned long iova, size_t size, int asid,
> + size_t granule, bool leaf,
> + struct arm_smmu_domain *smmu_domain);
> bool arm_smmu_free_asid(struct arm_smmu_ctx_desc *cd);
> int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid,
> unsigned long iova, size_t size);
> diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c
> index 642ce2c225b5..ad8cf62a8f83 100644
> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c
> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c
> @@ -16,6 +16,7 @@ struct arm_smmu_mmu_notifier {
> struct mmu_notifier mn;
> struct arm_smmu_ctx_desc *cd;
> bool cleared;
> + bool tlb_inv_command;
> refcount_t refs;
> struct list_head list;
> struct arm_smmu_domain *domain;
> @@ -182,9 +183,13 @@ static void arm_smmu_mm_invalidate_range(struct mmu_notifier *mn,
> unsigned long start, unsigned long end)
> {
> struct arm_smmu_mmu_notifier *smmu_mn = mn_to_smmu(mn);
> + struct arm_smmu_domain *smmu_domain = smmu_mn->domain;
> + size_t size = end - start + 1;
>
> - arm_smmu_atc_inv_domain(smmu_mn->domain, mm->pasid, start,
> - end - start + 1);
> + if (smmu_mn->tlb_inv_command)
Since we're going to be drilling down to smmu_domain->smmu->features in
the invalidate call anyway, perhaps we could just test for BTM directly
here?
Obviously that also proves my previous comment involved a reading
comprehension failure and too much haste, so should be discounted. Sorry
about that :)
Robin.
> + arm_smmu_tlb_inv_range_asid(start, size, smmu_mn->cd->asid,
> + PAGE_SIZE, false, smmu_domain);
> + arm_smmu_atc_inv_domain(smmu_domain, mm->pasid, start, size);
> }
>
> static void arm_smmu_mm_release(struct mmu_notifier *mn, struct mm_struct *mm)
> @@ -253,6 +258,9 @@ arm_smmu_mmu_notifier_get(struct arm_smmu_domain *smmu_domain,
> smmu_mn->domain = smmu_domain;
> smmu_mn->mn.ops = &arm_smmu_mmu_notifier_ops;
>
> + if (!(smmu_domain->smmu->features & ARM_SMMU_FEAT_BTM))
> + smmu_mn->tlb_inv_command = true;
> +
> ret = mmu_notifier_register(&smmu_mn->mn, mm);
> if (ret) {
> kfree(smmu_mn);
> @@ -404,7 +412,7 @@ bool arm_smmu_sva_supported(struct arm_smmu_device *smmu)
> unsigned long reg, fld;
> unsigned long oas;
> unsigned long asid_bits;
> - u32 feat_mask = ARM_SMMU_FEAT_BTM | ARM_SMMU_FEAT_COHERENCY;
> + u32 feat_mask = ARM_SMMU_FEAT_COHERENCY;
>
> if (vabits_actual == 52)
> feat_mask |= ARM_SMMU_FEAT_VAX;
> 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 a27b074d5c0c..db545834493b 100644
> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> @@ -2018,6 +2018,20 @@ static void arm_smmu_tlb_inv_range_domain(unsigned long iova, size_t size,
> arm_smmu_atc_inv_domain(smmu_domain, 0, iova, size);
> }
>
> +void arm_smmu_tlb_inv_range_asid(unsigned long iova, size_t size, int asid,
> + size_t granule, bool leaf,
> + struct arm_smmu_domain *smmu_domain)
> +{
> + struct arm_smmu_cmdq_ent cmd = {
> + .opcode = CMDQ_OP_TLBI_NH_VA,
> + .tlbi = {
> + .asid = asid,
> + .leaf = leaf,
> + },
> + };
> + arm_smmu_tlb_inv_range(&cmd, iova, size, granule, smmu_domain);
> +}
> +
> static void arm_smmu_tlb_inv_page_nosync(struct iommu_iotlb_gather *gather,
> unsigned long iova, size_t granule,
> void *cookie)
>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
next prev parent reply other threads:[~2021-01-22 14:05 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-22 11:52 [PATCH 0/3] iommu/arm-smmu-v3: TLB invalidation for SVA Jean-Philippe Brucker
2021-01-22 11:52 ` [PATCH 1/3] iommu/arm-smmu-v3: Split arm_smmu_tlb_inv_range() Jean-Philippe Brucker
2021-01-22 13:49 ` Will Deacon
2021-01-22 13:56 ` Robin Murphy
2021-01-22 11:52 ` [PATCH 2/3] iommu/arm-smmu-v3: Make BTM optional for SVA Jean-Philippe Brucker
2021-01-22 14:04 ` Robin Murphy [this message]
2021-01-22 14:13 ` Jean-Philippe Brucker
2021-01-22 11:52 ` [PATCH 3/3] iommu/arm-smmu-v3: Add support for VHE Jean-Philippe Brucker
2021-01-22 13:29 ` [PATCH 0/3] iommu/arm-smmu-v3: TLB invalidation for SVA Jonathan Cameron
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=14f78aee-c7fd-22ff-64d4-6aff2e9ec015@arm.com \
--to=robin.murphy@arm.com \
--cc=iommu@lists.linux-foundation.org \
--cc=jean-philippe@linaro.org \
--cc=joro@8bytes.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=vivek.gautam@arm.com \
--cc=will@kernel.org \
--cc=zhangfei.gao@linaro.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;
as well as URLs for NNTP newsgroup(s).