From: Robin Murphy <robin.murphy@arm.com>
To: Joao Martins <joao.m.martins@oracle.com>
Cc: Jean-Philippe Brucker <jean-philippe@linaro.org>,
Kevin Tian <kevin.tian@intel.com>,
Yishai Hadas <yishaih@nvidia.com>,
Jason Gunthorpe <jgg@nvidia.com>,
kvm@vger.kernel.org, Cornelia Huck <cohuck@redhat.com>,
iommu@lists.linux-foundation.org,
Alex Williamson <alex.williamson@redhat.com>,
Will Deacon <will@kernel.org>,
David Woodhouse <dwmw2@infradead.org>
Subject: Re: [PATCH RFC 16/19] iommu/arm-smmu-v3: Enable HTTU for stage1 with io-pgtable mapping
Date: Fri, 29 Apr 2022 13:46:45 +0100 [thread overview]
Message-ID: <af50900e-eae4-8610-0796-f8df4010aeeb@arm.com> (raw)
In-Reply-To: <17aa6d5d-e386-c115-8dfb-5e7bf12b106f@oracle.com>
On 2022-04-29 13:10, Joao Martins wrote:
> On 4/29/22 12:35, Robin Murphy wrote:
>> On 2022-04-28 22:09, Joao Martins wrote:
>>> From: Kunkun Jiang <jiangkunkun@huawei.com>
>>>
>>> As nested mode is not upstreamed now, we just aim to support dirty
>>> log tracking for stage1 with io-pgtable mapping (means not support
>>> SVA mapping). If HTTU is supported, we enable HA/HD bits in the SMMU
>>> CD and transfer ARM_HD quirk to io-pgtable.
>>>
>>> We additionally filter out HD|HA if not supportted. The CD.HD bit
>>> is not particularly useful unless we toggle the DBM bit in the PTE
>>> entries.
>>>
>>> Co-developed-by: Keqian Zhu <zhukeqian1@huawei.com>
>>> Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
>>> Signed-off-by: Kunkun Jiang <jiangkunkun@huawei.com>
>>> [joaomart:Convey HD|HA bits over to the context descriptor
>>> and update commit message]
>>> Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
>>> ---
>>> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 11 +++++++++++
>>> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 3 +++
>>> include/linux/io-pgtable.h | 1 +
>>> 3 files changed, 15 insertions(+)
>>>
>>> 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 1ca72fcca930..5f728f8f20a2 100644
>>> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
>>> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
>>> @@ -1077,10 +1077,18 @@ int arm_smmu_write_ctx_desc(struct arm_smmu_domain *smmu_domain, int ssid,
>>> * this substream's traffic
>>> */
>>> } else { /* (1) and (2) */
>>> + struct arm_smmu_device *smmu = smmu_domain->smmu;
>>> + u64 tcr = cd->tcr;
>>> +
>>> cdptr[1] = cpu_to_le64(cd->ttbr & CTXDESC_CD_1_TTB0_MASK);
>>> cdptr[2] = 0;
>>> cdptr[3] = cpu_to_le64(cd->mair);
>>>
>>> + if (!(smmu->features & ARM_SMMU_FEAT_HD))
>>> + tcr &= ~CTXDESC_CD_0_TCR_HD;
>>> + if (!(smmu->features & ARM_SMMU_FEAT_HA))
>>> + tcr &= ~CTXDESC_CD_0_TCR_HA;
>>
>> This is very backwards...
>>
> Yes.
>
>>> +
>>> /*
>>> * STE is live, and the SMMU might read dwords of this CD in any
>>> * order. Ensure that it observes valid values before reading
>>> @@ -2100,6 +2108,7 @@ static int arm_smmu_domain_finalise_s1(struct arm_smmu_domain *smmu_domain,
>>> FIELD_PREP(CTXDESC_CD_0_TCR_ORGN0, tcr->orgn) |
>>> FIELD_PREP(CTXDESC_CD_0_TCR_SH0, tcr->sh) |
>>> FIELD_PREP(CTXDESC_CD_0_TCR_IPS, tcr->ips) |
>>> + CTXDESC_CD_0_TCR_HA | CTXDESC_CD_0_TCR_HD |
>>
>> ...these should be set in io-pgtable's TCR value *if* io-pgatble is
>> using DBM, then propagated through from there like everything else.
>>
>
> So the DBM bit superseedes the TCR bit -- that's strage? say if you mark a PTE as
> writeable-clean with DBM set but TCR.HD unset .. then won't trigger a perm-fault?
> I need to re-read that section of the manual, as I didn't get the impression above.
No, architecturally, the {TCR,CD}.HD bit is still the "master switch"
for whether the DBM field in PTEs is interpreted or not, but in terms of
our abstraction, we only need to care about setting HD if io-pgtable is
actually going to want to use DBM, so we may as well leave it to
io-pgtable to tell us canonically. The logical interface here in general
is that we use the initial io_pgtable_cfg to tell it what it *can* use,
but then we read back afterwards to see exactly what it has chosen to
do, and I think HA/HD also fit perfectly into that paradigm.
Robin.
>>> CTXDESC_CD_0_TCR_EPD1 | CTXDESC_CD_0_AA64;
>>> cfg->cd.mair = pgtbl_cfg->arm_lpae_s1_cfg.mair;
>>>
>>> @@ -2203,6 +2212,8 @@ static int arm_smmu_domain_finalise(struct iommu_domain *domain,
>>> .iommu_dev = smmu->dev,
>>> };
>>>
>>> + if (smmu->features & ARM_SMMU_FEAT_HD)
>>> + pgtbl_cfg.quirks |= IO_PGTABLE_QUIRK_ARM_HD;
>>
>> You need to depend on ARM_SMMU_FEAT_COHERENCY for this as well, not
>> least because you don't have any of the relevant business for
>> synchronising non-coherent PTEs in your walk functions, but it's also
>> implementation-defined whether HTTU even operates on non-cacheable
>> pagetables, and frankly you just don't want to go there ;)
>>
> /me nods OK.
>
>> Robin.
>>
>>> if (smmu->features & ARM_SMMU_FEAT_BBML1)
>>> pgtbl_cfg.quirks |= IO_PGTABLE_QUIRK_ARM_BBML1;
>>> else if (smmu->features & ARM_SMMU_FEAT_BBML2)
>>> 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 e15750be1d95..ff32242f2fdb 100644
>>> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h
>>> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h
>>> @@ -292,6 +292,9 @@
>>> #define CTXDESC_CD_0_TCR_IPS GENMASK_ULL(34, 32)
>>> #define CTXDESC_CD_0_TCR_TBI0 (1ULL << 38)
>>>
>>> +#define CTXDESC_CD_0_TCR_HA (1UL << 43)
>>> +#define CTXDESC_CD_0_TCR_HD (1UL << 42)
>>> +
>>> #define CTXDESC_CD_0_AA64 (1UL << 41)
>>> #define CTXDESC_CD_0_S (1UL << 44)
>>> #define CTXDESC_CD_0_R (1UL << 45)
>>> diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h
>>> index d7626ca67dbf..a11902ae9cf1 100644
>>> --- a/include/linux/io-pgtable.h
>>> +++ b/include/linux/io-pgtable.h
>>> @@ -87,6 +87,7 @@ struct io_pgtable_cfg {
>>> #define IO_PGTABLE_QUIRK_ARM_OUTER_WBWA BIT(6)
>>> #define IO_PGTABLE_QUIRK_ARM_BBML1 BIT(7)
>>> #define IO_PGTABLE_QUIRK_ARM_BBML2 BIT(8)
>>> + #define IO_PGTABLE_QUIRK_ARM_HD BIT(9)
>>>
>>> unsigned long quirks;
>>> unsigned long pgsize_bitmap;
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
next prev parent reply other threads:[~2022-04-29 12:47 UTC|newest]
Thread overview: 101+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-28 21:09 [PATCH RFC 00/19] IOMMUFD Dirty Tracking Joao Martins
2022-04-28 21:09 ` [PATCH RFC 01/19] iommu: Add iommu_domain ops for dirty tracking Joao Martins
2022-04-29 7:54 ` Tian, Kevin
2022-04-29 10:44 ` Joao Martins
2022-04-29 12:08 ` Jason Gunthorpe via iommu
2022-04-29 14:26 ` Joao Martins
2022-04-29 14:35 ` Jason Gunthorpe via iommu
2022-04-29 13:40 ` Baolu Lu
2022-04-29 15:27 ` Joao Martins
2022-04-28 21:09 ` [PATCH RFC 02/19] iommufd: Dirty tracking for io_pagetable Joao Martins
2022-04-29 8:07 ` Tian, Kevin
2022-04-29 10:48 ` Joao Martins
2022-04-29 11:56 ` Jason Gunthorpe via iommu
2022-04-29 14:28 ` Joao Martins
2022-04-29 23:51 ` Baolu Lu
2022-05-02 11:57 ` Joao Martins
2022-04-28 21:09 ` [PATCH RFC 03/19] iommufd: Dirty tracking data support Joao Martins
2022-04-29 8:12 ` Tian, Kevin
2022-04-29 10:54 ` Joao Martins
2022-04-29 12:09 ` Jason Gunthorpe via iommu
2022-04-29 14:33 ` Joao Martins
2022-04-30 4:11 ` Baolu Lu
2022-05-02 12:06 ` Joao Martins
2022-04-28 21:09 ` [PATCH RFC 04/19] iommu: Add an unmap API that returns dirtied IOPTEs Joao Martins
2022-04-30 5:12 ` Baolu Lu
2022-05-02 12:22 ` Joao Martins
2022-04-28 21:09 ` [PATCH RFC 05/19] iommufd: Add a dirty bitmap to iopt_unmap_iova() Joao Martins
2022-04-29 12:14 ` Jason Gunthorpe via iommu
2022-04-29 14:36 ` Joao Martins
2022-04-28 21:09 ` [PATCH RFC 06/19] iommufd: Dirty tracking IOCTLs for the hw_pagetable Joao Martins
2022-04-28 21:09 ` [PATCH RFC 07/19] iommufd/vfio-compat: Dirty tracking IOCTLs compatibility Joao Martins
2022-04-29 12:19 ` Jason Gunthorpe via iommu
2022-04-29 14:27 ` Joao Martins
2022-04-29 14:36 ` Jason Gunthorpe via iommu
2022-04-29 14:52 ` Joao Martins
2022-04-28 21:09 ` [PATCH RFC 08/19] iommufd: Add a test for dirty tracking ioctls Joao Martins
2022-04-28 21:09 ` [PATCH RFC 09/19] iommu/amd: Access/Dirty bit support in IOPTEs Joao Martins
2022-05-31 11:34 ` Suravee Suthikulpanit via iommu
2022-05-31 12:15 ` Baolu Lu
2022-05-31 15:22 ` Joao Martins
2022-04-28 21:09 ` [PATCH RFC 10/19] iommu/amd: Add unmap_read_dirty() support Joao Martins
2022-05-31 12:39 ` Suravee Suthikulpanit via iommu
2022-05-31 15:51 ` Joao Martins
2022-04-28 21:09 ` [PATCH RFC 11/19] iommu/amd: Print access/dirty bits if supported Joao Martins
2022-04-28 21:09 ` [PATCH RFC 12/19] iommu/arm-smmu-v3: Add feature detection for HTTU Joao Martins
2022-04-28 21:09 ` [PATCH RFC 13/19] iommu/arm-smmu-v3: Add feature detection for BBML Joao Martins
2022-04-29 11:11 ` Robin Murphy
2022-04-29 11:54 ` Joao Martins
2022-04-29 12:26 ` Robin Murphy
2022-04-29 14:34 ` Joao Martins
2022-04-28 21:09 ` [PATCH RFC 14/19] iommu/arm-smmu-v3: Add read_and_clear_dirty() support Joao Martins
2022-04-28 21:09 ` [PATCH RFC 15/19] iommu/arm-smmu-v3: Add set_dirty_tracking_range() support Joao Martins
2022-04-29 8:28 ` Tian, Kevin
2022-04-29 11:05 ` Joao Martins
2022-04-29 11:19 ` Robin Murphy
2022-04-29 12:06 ` Joao Martins
2022-04-29 12:23 ` Jason Gunthorpe via iommu
2022-04-29 14:45 ` Joao Martins
2022-04-29 16:11 ` Jason Gunthorpe via iommu
2022-04-29 16:40 ` Joao Martins
2022-04-29 16:46 ` Jason Gunthorpe via iommu
2022-04-29 19:20 ` Robin Murphy
2022-05-02 11:52 ` Joao Martins
2022-05-02 11:57 ` Joao Martins
2022-05-05 7:25 ` Shameerali Kolothum Thodi via iommu
2022-05-05 9:52 ` Joao Martins
2022-04-28 21:09 ` [PATCH RFC 16/19] iommu/arm-smmu-v3: Enable HTTU for stage1 with io-pgtable mapping Joao Martins
2022-04-29 11:35 ` Robin Murphy
2022-04-29 12:10 ` Joao Martins
2022-04-29 12:46 ` Robin Murphy [this message]
2022-04-28 21:09 ` [PATCH RFC 17/19] iommu/arm-smmu-v3: Add unmap_read_dirty() support Joao Martins
2022-04-29 11:53 ` Robin Murphy
2022-04-28 21:09 ` [PATCH RFC 18/19] iommu/intel: Access/Dirty bit support for SL domains Joao Martins
2022-04-29 9:03 ` Tian, Kevin
2022-04-29 11:20 ` Joao Martins
2022-04-30 6:12 ` Baolu Lu
2022-05-02 12:24 ` Joao Martins
2022-04-28 21:09 ` [PATCH RFC 19/19] iommu/intel: Add unmap_read_dirty() support Joao Martins
2022-04-29 5:45 ` [PATCH RFC 00/19] IOMMUFD Dirty Tracking Tian, Kevin
2022-04-29 10:27 ` Joao Martins
2022-04-29 12:38 ` Jason Gunthorpe via iommu
2022-04-29 15:20 ` Joao Martins
2022-05-05 7:40 ` Tian, Kevin
2022-05-05 14:07 ` Jason Gunthorpe via iommu
2022-05-06 3:51 ` Tian, Kevin
2022-05-06 11:46 ` Jason Gunthorpe via iommu
2022-05-10 1:38 ` Tian, Kevin
2022-05-10 11:50 ` Joao Martins
2022-05-11 1:17 ` Tian, Kevin
2022-05-10 13:46 ` Jason Gunthorpe via iommu
2022-05-11 1:10 ` Tian, Kevin
2022-05-02 18:11 ` Alex Williamson
2022-05-02 18:52 ` Jason Gunthorpe via iommu
2022-05-03 10:48 ` Joao Martins
2022-05-05 7:42 ` Tian, Kevin
2022-05-05 10:06 ` Joao Martins
2022-05-05 11:03 ` Tian, Kevin
2022-05-05 11:50 ` Joao Martins
2022-05-06 3:14 ` Tian, Kevin
2022-05-05 13:55 ` Jason Gunthorpe via iommu
2022-05-06 3:17 ` Tian, Kevin
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=af50900e-eae4-8610-0796-f8df4010aeeb@arm.com \
--to=robin.murphy@arm.com \
--cc=alex.williamson@redhat.com \
--cc=cohuck@redhat.com \
--cc=dwmw2@infradead.org \
--cc=iommu@lists.linux-foundation.org \
--cc=jean-philippe@linaro.org \
--cc=jgg@nvidia.com \
--cc=joao.m.martins@oracle.com \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=will@kernel.org \
--cc=yishaih@nvidia.com \
/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