summaryrefslogtreecommitdiff
path: root/drivers/iommu
diff options
context:
space:
mode:
authorMitchel Humpherys <mitchelh@codeaurora.org>2014-02-11 17:31:55 -0800
committerMitchel Humpherys <mitchelh@codeaurora.org>2014-02-11 17:41:33 -0800
commit854878cbfc5d97867b2c6f1e6cbd71528e1159ff (patch)
treed937e46c9c99822b6f850e1a789b11d03df1ea81 /drivers/iommu
parentb6cc994641cd94a734121815a2e406ede99edbea (diff)
iommu: msm: allow partial register dumps to be printed
If we get back a partial register dump from TZ we should go ahead and print as much as we can, rather than bailing out and not printing anything. Change-Id: Idcc8b14a76bf1f23bdf00b52879b3ce0ca9afdcc Signed-off-by: Mitchel Humpherys <mitchelh@codeaurora.org>
Diffstat (limited to 'drivers/iommu')
-rw-r--r--drivers/iommu/msm_iommu-v1.c6
-rw-r--r--drivers/iommu/msm_iommu_sec.c8
2 files changed, 10 insertions, 4 deletions
diff --git a/drivers/iommu/msm_iommu-v1.c b/drivers/iommu/msm_iommu-v1.c
index 367285c1d00b..ee7a1f251dc3 100644
--- a/drivers/iommu/msm_iommu-v1.c
+++ b/drivers/iommu/msm_iommu-v1.c
@@ -1143,6 +1143,7 @@ void print_ctx_regs(struct msm_iommu_context_reg regs[])
{
uint32_t fsr = regs[DUMP_REG_FSR].val;
u64 ttbr;
+ enum dump_reg iter;
pr_err("FAR = %016llx\n",
COMBINE_DUMP_REG(
@@ -1186,6 +1187,11 @@ void print_ctx_regs(struct msm_iommu_context_reg regs[])
pr_err("CBAR = %08x CBFRSYNRA = %08x\n",
regs[DUMP_REG_CBAR_N].val, regs[DUMP_REG_CBFRSYNRA_N].val);
print_ctx_mem_attr_regs(regs);
+
+ for (iter = DUMP_REG_FIRST; iter < MAX_DUMP_REGS; ++iter)
+ if (!regs[iter].valid)
+ pr_err("NOTE: Value actually unknown for %s\n",
+ dump_regs_tbl[iter].name);
}
static void __print_ctx_regs(void __iomem *base, int ctx, unsigned int fsr)
diff --git a/drivers/iommu/msm_iommu_sec.c b/drivers/iommu/msm_iommu_sec.c
index d1b891c21d7e..b0c43bf6fe06 100644
--- a/drivers/iommu/msm_iommu_sec.c
+++ b/drivers/iommu/msm_iommu_sec.c
@@ -217,7 +217,6 @@ static int msm_iommu_reg_dump_to_regs(
if (i != nvals) {
pr_err("Invalid dump! %d != %d\n", i, nvals);
ret = 1;
- goto out;
}
for (i = 0; i < MAX_DUMP_REGS; ++i) {
@@ -231,11 +230,10 @@ static int msm_iommu_reg_dump_to_regs(
dump_regs_tbl[i].reg_offset));
ret = 1;
}
- ctx_regs[i].val = 0;
+ ctx_regs[i].val = 0xd00dfeed;
}
}
-out:
return ret;
}
@@ -289,7 +287,9 @@ irqreturn_t msm_iommu_secure_fault_handler_v2(int irq, void *dev_id)
memset(ctx_regs, 0, sizeof(ctx_regs));
tmp = msm_iommu_reg_dump_to_regs(
ctx_regs, regs, drvdata, ctx_drvdata);
- if (!tmp && ctx_regs[DUMP_REG_FSR].val) {
+ if (ctx_regs[DUMP_REG_FSR].val) {
+ if (tmp)
+ pr_err("Incomplete fault register dump. Printout will be incomplete.\n");
if (!ctx_drvdata->attached_domain) {
pr_err("Bad domain in interrupt handler\n");
tmp = -ENOSYS;