lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:   Tue, 10 Aug 2021 12:21:00 +0530
From:   Sai Prakash Ranjan <saiprakash.ranjan@...eaurora.org>
To:     Will Deacon <will@...nel.org>
Cc:     Robin Murphy <robin.murphy@....com>,
        Joerg Roedel <joro@...tes.org>,
        Rajendra Nayak <rnayak@...eaurora.org>,
        Taniya Das <tdas@...eaurora.org>,
        srimuc <srimuc@...eaurora.org>, iommu@...ts.linux-foundation.org,
        linux-arm-kernel@...ts.infradead.org, linux-kernel@...r.kernel.org,
        linux-arm-msm@...r.kernel.org, robdclark@...omium.org
Subject: Re: [PATCH] iommu/arm-smmu: Add clk_bulk_{prepare/unprepare} to
 system pm callbacks

On 2021-08-03 11:36, Sai Prakash Ranjan wrote:
> On 2021-08-02 21:42, Will Deacon wrote:
>> On Tue, Jul 27, 2021 at 03:03:22PM +0530, Sai Prakash Ranjan wrote:
>>> Some clocks for SMMU can have parent as XO such as 
>>> gpu_cc_hub_cx_int_clk
>>> of GPU SMMU in QTI SC7280 SoC and in order to enter deep sleep states 
>>> in
>>> such cases, we would need to drop the XO clock vote in unprepare call 
>>> and
>>> this unprepare callback for XO is in RPMh (Resource Power 
>>> Manager-Hardened)
>>> clock driver which controls RPMh managed clock resources for new QTI 
>>> SoCs
>>> and is a blocking call.
>>> 
>>> Given we cannot have a sleeping calls such as clk_bulk_prepare() and
>>> clk_bulk_unprepare() in arm-smmu runtime pm callbacks since the iommu
>>> operations like map and unmap can be in atomic context and are in 
>>> fast
>>> path, add this prepare and unprepare call to drop the XO vote only 
>>> for
>>> system pm callbacks since it is not a fast path and we expect the 
>>> system
>>> to enter deep sleep states with system pm as opposed to runtime pm.
>>> 
>>> This is a similar sequence of clock requests (prepare,enable and
>>> disable,unprepare) in arm-smmu probe and remove.
>>> 
>>> Signed-off-by: Sai Prakash Ranjan <saiprakash.ranjan@...eaurora.org>
>>> Co-developed-by: Rajendra Nayak <rnayak@...eaurora.org>
>>> Signed-off-by: Rajendra Nayak <rnayak@...eaurora.org>
>>> ---
>>>  drivers/iommu/arm/arm-smmu/arm-smmu.c | 20 ++++++++++++++++++--
>>>  1 file changed, 18 insertions(+), 2 deletions(-)
>> 
>> [+Rob]
>> 
>> How does this work with that funny GPU which writes to the SMMU 
>> registers
>> directly? Does the SMMU need to remain independently clocked for that 
>> to
>> work or is it all in the same clock domain?
>> 
> 
> As Rob mentioned, device link should take care of all the dependencies 
> between
> SMMU and its consumers. But not sure how the question relates to this
> patch as this
> change is for system pm and not runtime pm, so it is exactly the 
> sequence of
> SMMU probe/remove which if works currently for that GPU SMMU, then it
> should work
> just fine for system suspend and resume as well.
> 
>>> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.c 
>>> b/drivers/iommu/arm/arm-smmu/arm-smmu.c
>>> index d3c6f54110a5..9561ba4c5d39 100644
>>> --- a/drivers/iommu/arm/arm-smmu/arm-smmu.c
>>> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu.c
>>> @@ -2277,6 +2277,13 @@ static int __maybe_unused 
>>> arm_smmu_runtime_suspend(struct device *dev)
>>> 
>>>  static int __maybe_unused arm_smmu_pm_resume(struct device *dev)
>>>  {
>>> +	int ret;
>>> +	struct arm_smmu_device *smmu = dev_get_drvdata(dev);
>>> +
>>> +	ret = clk_bulk_prepare(smmu->num_clks, smmu->clks);
>>> +	if (ret)
>>> +		return ret;
>>> +
>>>  	if (pm_runtime_suspended(dev))
>>>  		return 0;
>> 
>> If we subsequently fail to enable the clks in 
>> arm_smmu_runtime_resume()
>> should we unprepare them again?
>> 
> 
> If we are unable to turn on the clks then its fatal and we will not
> live for long.
> 

Nonetheless, it won't hurt to unprepare if clk enable fails as that is
the correct thing anyway, so I have added it and sent a v2.

Thanks,
Sai

> 
>> Will
>> 
>>> @@ -2285,10 +2292,19 @@ static int __maybe_unused 
>>> arm_smmu_pm_resume(struct device *dev)
>>> 
>>>  static int __maybe_unused arm_smmu_pm_suspend(struct device *dev)
>>>  {
>>> +	int ret = 0;
>>> +	struct arm_smmu_device *smmu = dev_get_drvdata(dev);
>>> +
>>>  	if (pm_runtime_suspended(dev))
>>> -		return 0;
>>> +		goto clk_unprepare;
>>> 
>>> -	return arm_smmu_runtime_suspend(dev);
>>> +	ret = arm_smmu_runtime_suspend(dev);
>>> +	if (ret)
>>> +		return ret;
>>> +
>>> +clk_unprepare:
>>> +	clk_bulk_unprepare(smmu->num_clks, smmu->clks);
>>> +	return ret;
>>>  }
>>> 
>>>  static const struct dev_pm_ops arm_smmu_pm_ops = {
>>> --
>>> QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a 
>>> member
>>> of Code Aurora Forum, hosted by The Linux Foundation
>>> 

-- 
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a 
member
of Code Aurora Forum, hosted by The Linux Foundation

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ