DOWNSTREAM: iommu/arm-smmu-v3: Add pm suspend op
- Issue CMD_OP_CFGI and CMD_OP_TBI_ALL to ensure all pending transactions are complete before going into suspend and then disable SMMU device so that there won't be any new map/unmap requests. - Change to sleep ops to late sleep ops so that SMMU will suspend late after clients and resume early before clients. - Add few debug prints Bug 5117507 Bug 5165373 Change-Id: I108861e6288fd63cebd6d2da2aa93ece071d419f Signed-off-by: Ashish Mhetre <amhetre@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/3rdparty/canonical/linux-noble/+/3447041 GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com> Reviewed-by: svcacv <svcacv@nvidia.com> Reviewed-by: Pritesh Raithatha <praithatha@nvidia.com>
This commit is contained in:
@@ -4058,13 +4058,32 @@ static int __maybe_unused arm_smmu_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct arm_smmu_device *smmu = dev_get_drvdata(dev);
|
||||
|
||||
dev_dbg(dev, "Resuming\n");
|
||||
arm_smmu_device_reset(smmu, smmu->bypass);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused arm_smmu_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct arm_smmu_device *smmu = dev_get_drvdata(dev);
|
||||
struct arm_smmu_cmdq_ent cmd;
|
||||
|
||||
cmd.opcode = CMDQ_OP_CFGI_ALL;
|
||||
arm_smmu_cmdq_issue_cmd_with_sync(smmu, &cmd);
|
||||
|
||||
cmd.opcode = CMDQ_OP_TLBI_NSNH_ALL;
|
||||
arm_smmu_cmdq_issue_cmd_with_sync(smmu, &cmd);
|
||||
|
||||
dev_dbg(dev, "Disabling\n");
|
||||
arm_smmu_device_disable(smmu);
|
||||
|
||||
dev_dbg(dev, "Suspending\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops arm_smmu_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(NULL, arm_smmu_runtime_resume)
|
||||
SET_LATE_SYSTEM_SLEEP_PM_OPS(arm_smmu_runtime_suspend, arm_smmu_runtime_resume)
|
||||
};
|
||||
|
||||
static struct platform_driver arm_smmu_driver = {
|
||||
|
||||
Reference in New Issue
Block a user