From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: Johan Hovold <johan@kernel.org>
Cc: will@kernel.org, joro@8bytes.org, robin.murphy@arm.com,
andersson@kernel.org, johan+linaro@kernel.org, steev@kali.org,
linux-arm-kernel@lists.infradead.org, iommu@lists.linux.dev,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] iommu/arm-smmu-qcom: Rework the logic finding the bypass quirk
Date: Tue, 14 Mar 2023 16:56:20 +0530 [thread overview]
Message-ID: <20230314112620.GB137001@thinkpad> (raw)
In-Reply-To: <ZBBX0n4S2QBYB3Pi@hovoldconsulting.com>
On Tue, Mar 14, 2023 at 12:17:38PM +0100, Johan Hovold wrote:
> On Tue, Mar 14, 2023 at 04:29:05PM +0530, Manivannan Sadhasivam wrote:
> > The logic used to find the quirky firmware that intercepts the writes to
> > S2CR register to replace bypass type streams with a fault, and ignore the
> > fault type, is not working with the firmware on newer SoCs like SC8280XP.
> >
> > The current logic uses the last stream mapping group (num_mapping_groups
> > - 1) as an index for finding quirky firmware. But on SC8280XP, NUSMRG
> > reports a value of 162 (possibly emulated by the hypervisor) and logic is
> > not working for stream mapping groups > 128. (Note that the ARM SMMU
> > architecture specification defines NUMSMRG in the range of 0-127).
> >
> > So the current logic that checks the (162-1)th S2CR entry fails to detect
> > the quirky firmware on these devices and SMMU triggers invalid context
> > fault for bypass streams.
> >
> > To fix this issue, rework the logic to find the first non-valid (free)
> > stream mapping register group (SMR) within 128 groups and use that index
> > to access S2CR for detecting the bypass quirk. If no free groups are
> > available, then just skip the quirk detection.
> >
> > While at it, let's move the quirk detection logic to a separate function
> > and change the local variable name from last_s2cr to free_s2cr.
> >
> > Reviewed-by: Bjorn Andersson <andersson@kernel.org>
> > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
> > ---
> >
> > Changes in v2:
> >
> > * Limited the check to 128 groups as per ARM SMMU spec's NUMSMRG range
> > * Moved the quirk handling to its own function
> > * Collected review tag from Bjorn
> >
> > drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 48 ++++++++++++++++++----
> > 1 file changed, 40 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
> > index d1b296b95c86..48362d7ef451 100644
> > --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
> > +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
> > @@ -266,25 +266,49 @@ static int qcom_smmu_init_context(struct arm_smmu_domain *smmu_domain,
> > return 0;
> > }
> >
> > -static int qcom_smmu_cfg_probe(struct arm_smmu_device *smmu)
> > +static void qcom_smmu_bypass_quirk(struct arm_smmu_device *smmu)
> > {
> > - unsigned int last_s2cr = ARM_SMMU_GR0_S2CR(smmu->num_mapping_groups - 1);
> > struct qcom_smmu *qsmmu = to_qcom_smmu(smmu);
> > - u32 reg;
> > - u32 smr;
> > + u32 free_s2cr;
> > + u32 reg, smr;
> > int i;
> >
> > + /*
> > + * Find the first non-valid (free) stream mapping register group and
> > + * use that index to access S2CR for detecting the bypass quirk.
> > + *
> > + * Note that only the first 128 stream mapping groups are considered for
> > + * the check. This is because the ARM SMMU architecture specification
> > + * defines NUMSMRG (Number of Stream Mapping Register Groups) in the
> > + * range of 0-127, but some Qcom platforms emulate more stream mapping
> > + * groups with the help of hypervisor. And those groups don't exhibit
> > + * the quirky behavior.
> > + */
> > + for (i = 0; i < 128; i++) {
>
> This may now access registers beyond smmu->num_mapping_groups. Should
> you not use the minimum of these two values here (and below)?
>
Doh! yeah, you're right. Will fix it in v3.
Thanks,
Mani
> > + smr = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_SMR(i));
> > +
> > + if (!FIELD_GET(ARM_SMMU_SMR_VALID, smr))
> > + break;
> > + }
> > +
> > + /* If no free stream mapping register group is available, skip the check */
> > + if (i == 128)
> > + return;
>
> Johan
--
மணிவண்ணன் சதாசிவம்
WARNING: multiple messages have this Message-ID (diff)
From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: Johan Hovold <johan@kernel.org>
Cc: will@kernel.org, joro@8bytes.org, robin.murphy@arm.com,
andersson@kernel.org, johan+linaro@kernel.org, steev@kali.org,
linux-arm-kernel@lists.infradead.org, iommu@lists.linux.dev,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] iommu/arm-smmu-qcom: Rework the logic finding the bypass quirk
Date: Tue, 14 Mar 2023 16:56:20 +0530 [thread overview]
Message-ID: <20230314112620.GB137001@thinkpad> (raw)
In-Reply-To: <ZBBX0n4S2QBYB3Pi@hovoldconsulting.com>
On Tue, Mar 14, 2023 at 12:17:38PM +0100, Johan Hovold wrote:
> On Tue, Mar 14, 2023 at 04:29:05PM +0530, Manivannan Sadhasivam wrote:
> > The logic used to find the quirky firmware that intercepts the writes to
> > S2CR register to replace bypass type streams with a fault, and ignore the
> > fault type, is not working with the firmware on newer SoCs like SC8280XP.
> >
> > The current logic uses the last stream mapping group (num_mapping_groups
> > - 1) as an index for finding quirky firmware. But on SC8280XP, NUSMRG
> > reports a value of 162 (possibly emulated by the hypervisor) and logic is
> > not working for stream mapping groups > 128. (Note that the ARM SMMU
> > architecture specification defines NUMSMRG in the range of 0-127).
> >
> > So the current logic that checks the (162-1)th S2CR entry fails to detect
> > the quirky firmware on these devices and SMMU triggers invalid context
> > fault for bypass streams.
> >
> > To fix this issue, rework the logic to find the first non-valid (free)
> > stream mapping register group (SMR) within 128 groups and use that index
> > to access S2CR for detecting the bypass quirk. If no free groups are
> > available, then just skip the quirk detection.
> >
> > While at it, let's move the quirk detection logic to a separate function
> > and change the local variable name from last_s2cr to free_s2cr.
> >
> > Reviewed-by: Bjorn Andersson <andersson@kernel.org>
> > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
> > ---
> >
> > Changes in v2:
> >
> > * Limited the check to 128 groups as per ARM SMMU spec's NUMSMRG range
> > * Moved the quirk handling to its own function
> > * Collected review tag from Bjorn
> >
> > drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 48 ++++++++++++++++++----
> > 1 file changed, 40 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
> > index d1b296b95c86..48362d7ef451 100644
> > --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
> > +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
> > @@ -266,25 +266,49 @@ static int qcom_smmu_init_context(struct arm_smmu_domain *smmu_domain,
> > return 0;
> > }
> >
> > -static int qcom_smmu_cfg_probe(struct arm_smmu_device *smmu)
> > +static void qcom_smmu_bypass_quirk(struct arm_smmu_device *smmu)
> > {
> > - unsigned int last_s2cr = ARM_SMMU_GR0_S2CR(smmu->num_mapping_groups - 1);
> > struct qcom_smmu *qsmmu = to_qcom_smmu(smmu);
> > - u32 reg;
> > - u32 smr;
> > + u32 free_s2cr;
> > + u32 reg, smr;
> > int i;
> >
> > + /*
> > + * Find the first non-valid (free) stream mapping register group and
> > + * use that index to access S2CR for detecting the bypass quirk.
> > + *
> > + * Note that only the first 128 stream mapping groups are considered for
> > + * the check. This is because the ARM SMMU architecture specification
> > + * defines NUMSMRG (Number of Stream Mapping Register Groups) in the
> > + * range of 0-127, but some Qcom platforms emulate more stream mapping
> > + * groups with the help of hypervisor. And those groups don't exhibit
> > + * the quirky behavior.
> > + */
> > + for (i = 0; i < 128; i++) {
>
> This may now access registers beyond smmu->num_mapping_groups. Should
> you not use the minimum of these two values here (and below)?
>
Doh! yeah, you're right. Will fix it in v3.
Thanks,
Mani
> > + smr = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_SMR(i));
> > +
> > + if (!FIELD_GET(ARM_SMMU_SMR_VALID, smr))
> > + break;
> > + }
> > +
> > + /* If no free stream mapping register group is available, skip the check */
> > + if (i == 128)
> > + return;
>
> Johan
--
மணிவண்ணன் சதாசிவம்
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-03-14 11:26 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-14 10:59 [PATCH v2] iommu/arm-smmu-qcom: Rework the logic finding the bypass quirk Manivannan Sadhasivam
2023-03-14 10:59 ` Manivannan Sadhasivam
2023-03-14 11:17 ` Johan Hovold
2023-03-14 11:17 ` Johan Hovold
2023-03-14 11:26 ` Manivannan Sadhasivam [this message]
2023-03-14 11:26 ` Manivannan Sadhasivam
2023-03-14 11:58 ` Robin Murphy
2023-03-14 11:58 ` Robin Murphy
2023-03-14 13:20 ` Manivannan Sadhasivam
2023-03-14 13:20 ` Manivannan Sadhasivam
2023-03-14 13:41 ` Robin Murphy
2023-03-14 13:41 ` Robin Murphy
2023-03-14 14:07 ` Manivannan Sadhasivam
2023-03-14 14:07 ` Manivannan Sadhasivam
2023-03-14 14:32 ` Bjorn Andersson
2023-03-14 14:32 ` Bjorn Andersson
2023-03-14 15:25 ` Robin Murphy
2023-03-14 15:25 ` Robin Murphy
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=20230314112620.GB137001@thinkpad \
--to=manivannan.sadhasivam@linaro.org \
--cc=andersson@kernel.org \
--cc=iommu@lists.linux.dev \
--cc=johan+linaro@kernel.org \
--cc=johan@kernel.org \
--cc=joro@8bytes.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robin.murphy@arm.com \
--cc=steev@kali.org \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.