From: sricharan@codeaurora.org (Sricharan R)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 3/4] iommu/arm-smmu: Add context save restore support
Date: Fri, 21 Oct 2016 22:44:25 +0530 [thread overview]
Message-ID: <1477070066-15044-4-git-send-email-sricharan@codeaurora.org> (raw)
In-Reply-To: <1477070066-15044-1-git-send-email-sricharan@codeaurora.org>
The smes registers and the context bank registers are
the ones that are needs to be saved and restored.
Fortunately the smes are already stored as a part
of the smmu device structure. So just write that
back. The data required to configure the context banks
are the master's domain data and pgtable cfgs.
So store them as a part of the context banks info
and just reconfigure the context banks on the restore
path.
Signed-off-by: Sricharan R <sricharan@codeaurora.org>
---
drivers/iommu/arm-smmu.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 51 insertions(+), 1 deletion(-)
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 45f2762..578cdc2 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -328,6 +328,11 @@ struct arm_smmu_master_cfg {
#define for_each_cfg_sme(fw, i, idx) \
for (i = 0; idx = __fwspec_cfg(fw)->smendx[i], i < fw->num_ids; ++i)
+struct cbinfo {
+ struct arm_smmu_domain *domain;
+ struct io_pgtable_cfg pgtbl_cfg;
+};
+
struct arm_smmu_device {
struct device *dev;
@@ -378,6 +383,9 @@ struct arm_smmu_device {
struct clk **clocks;
u32 cavium_id_base; /* Specific to Cavium */
+
+ /* For save/restore of context bank registers */
+ struct cbinfo *cb_saved_ctx;
};
enum arm_smmu_context_fmt {
@@ -972,6 +980,8 @@ static int arm_smmu_init_domain_context(struct iommu_domain *domain,
/* Initialise the context bank with our page table cfg */
arm_smmu_init_context_bank(smmu_domain, &pgtbl_cfg);
+ smmu->cb_saved_ctx[cfg->cbndx].domain = smmu_domain;
+ smmu->cb_saved_ctx[cfg->cbndx].pgtbl_cfg = pgtbl_cfg;
/*
* Request context fault interrupt. Do this last to avoid the
@@ -1861,6 +1871,10 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
}
dev_notice(smmu->dev, "\t%u context banks (%u stage-2 only)\n",
smmu->num_context_banks, smmu->num_s2_context_banks);
+
+ smmu->cb_saved_ctx = devm_kzalloc(smmu->dev,
+ sizeof(struct cbinfo) * smmu->num_context_banks,
+ GFP_KERNEL);
/*
* Cavium CN88xx erratum #27704.
* Ensure ASID and VMID allocation is unique across all SMMUs in
@@ -2115,8 +2129,44 @@ static int arm_smmu_resume(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
struct arm_smmu_device *smmu = platform_get_drvdata(pdev);
+ struct arm_smmu_domain *domain = NULL;
+ struct io_pgtable_cfg *pgtbl_cfg = NULL;
+ struct arm_smmu_smr *smrs = smmu->smrs;
+ int i = 0, idx, cb, ret, pcb = 0;
+
+ ret = arm_smmu_enable_clocks(smmu);
+ if (ret)
+ return ret;
+
+ arm_smmu_device_reset(smmu);
- return arm_smmu_enable_clocks(smmu);
+ /* Restore the smes and the context banks */
+ for (idx = 0; idx < smmu->num_mapping_groups; ++idx) {
+ mutex_lock(&smmu->stream_map_mutex);
+ if (!smrs[idx].valid) {
+ mutex_unlock(&smmu->stream_map_mutex);
+ continue;
+ }
+
+ arm_smmu_write_sme(smmu, idx);
+ cb = smmu->s2crs[idx].cbndx;
+ mutex_unlock(&smmu->stream_map_mutex);
+
+ if (!i || (cb != pcb)) {
+ domain = smmu->cb_saved_ctx[cb].domain;
+ pgtbl_cfg = &smmu->cb_saved_ctx[cb].pgtbl_cfg;
+
+ if (domain) {
+ mutex_lock(&domain->init_mutex);
+ arm_smmu_init_context_bank(domain, pgtbl_cfg);
+ mutex_unlock(&domain->init_mutex);
+ }
+ }
+ pcb = cb;
+ i++;
+ }
+
+ return 0;
}
static int arm_smmu_suspend(struct device *dev)
--
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
next prev parent reply other threads:[~2016-10-21 17:14 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-21 17:14 [PATCH 0/4] iommu/arm-smmu: Add runtime pm/sleep support Sricharan R
2016-10-21 17:14 ` [PATCH 1/4] Docs: dt: document ARM SMMU clocks/powerdomains bindings Sricharan R
2016-10-21 17:14 ` [PATCH 2/4] iommu/arm-smmu: Add pm_runtime/sleep ops Sricharan R
2016-10-24 16:40 ` Mathieu Poirier
2016-10-25 6:27 ` Sricharan
2016-10-21 17:14 ` Sricharan R [this message]
2016-10-24 16:45 ` [PATCH 3/4] iommu/arm-smmu: Add context save restore support Mathieu Poirier
2016-10-25 6:43 ` Sricharan
2016-10-26 16:51 ` Robin Murphy
2016-10-21 17:14 ` [PATCH 4/4] iommu/arm-smmu: Add the device_link between masters and smmu Sricharan R
2016-10-25 10:07 ` Marek Szyprowski
2016-10-26 4:14 ` Sricharan
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=1477070066-15044-4-git-send-email-sricharan@codeaurora.org \
--to=sricharan@codeaurora.org \
--cc=linux-arm-kernel@lists.infradead.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).