From: Suzuki K Poulose <suzuki.poul...@arm.com>

[ Upstream commit 342c8a1d1d9e418d32fa02d635cf96989f9a986e ]

The ETM state save/restore incorrectly reads/writes some of the 64bit
registers (e.g, address comparators, vmid/cid comparators etc.) using
32bit accesses. Ensure we use the appropriate width accessors for
the registers.

Fixes: f188b5e76aae ("coresight: etm4x: Save/restore state across CPU low power 
states")
Cc: Mathieu Poirier <mathieu.poir...@linaro.org>
Cc: Mike Leach <mike.le...@linaro.org>
Signed-off-by: Suzuki K Poulose <suzuki.poul...@arm.com>
Signed-off-by: Mathieu Poirier <mathieu.poir...@linaro.org>
Link: 
https://lore.kernel.org/r/20200716175746.3338735-18-mathieu.poir...@linaro.org
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/hwtracing/coresight/coresight-etm4x.c | 16 ++++++++--------
 drivers/hwtracing/coresight/coresight-etm4x.h |  2 +-
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c 
b/drivers/hwtracing/coresight/coresight-etm4x.c
index 007d7c6e91f48..6089c481f8f19 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x.c
+++ b/drivers/hwtracing/coresight/coresight-etm4x.c
@@ -1202,8 +1202,8 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata)
        }
 
        for (i = 0; i < drvdata->nr_addr_cmp * 2; i++) {
-               state->trcacvr[i] = readl(drvdata->base + TRCACVRn(i));
-               state->trcacatr[i] = readl(drvdata->base + TRCACATRn(i));
+               state->trcacvr[i] = readq(drvdata->base + TRCACVRn(i));
+               state->trcacatr[i] = readq(drvdata->base + TRCACATRn(i));
        }
 
        /*
@@ -1214,10 +1214,10 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata)
         */
 
        for (i = 0; i < drvdata->numcidc; i++)
-               state->trccidcvr[i] = readl(drvdata->base + TRCCIDCVRn(i));
+               state->trccidcvr[i] = readq(drvdata->base + TRCCIDCVRn(i));
 
        for (i = 0; i < drvdata->numvmidc; i++)
-               state->trcvmidcvr[i] = readl(drvdata->base + TRCVMIDCVRn(i));
+               state->trcvmidcvr[i] = readq(drvdata->base + TRCVMIDCVRn(i));
 
        state->trccidcctlr0 = readl(drvdata->base + TRCCIDCCTLR0);
        state->trccidcctlr1 = readl(drvdata->base + TRCCIDCCTLR1);
@@ -1315,18 +1315,18 @@ static void etm4_cpu_restore(struct etmv4_drvdata 
*drvdata)
        }
 
        for (i = 0; i < drvdata->nr_addr_cmp * 2; i++) {
-               writel_relaxed(state->trcacvr[i],
+               writeq_relaxed(state->trcacvr[i],
                               drvdata->base + TRCACVRn(i));
-               writel_relaxed(state->trcacatr[i],
+               writeq_relaxed(state->trcacatr[i],
                               drvdata->base + TRCACATRn(i));
        }
 
        for (i = 0; i < drvdata->numcidc; i++)
-               writel_relaxed(state->trccidcvr[i],
+               writeq_relaxed(state->trccidcvr[i],
                               drvdata->base + TRCCIDCVRn(i));
 
        for (i = 0; i < drvdata->numvmidc; i++)
-               writel_relaxed(state->trcvmidcvr[i],
+               writeq_relaxed(state->trcvmidcvr[i],
                               drvdata->base + TRCVMIDCVRn(i));
 
        writel_relaxed(state->trccidcctlr0, drvdata->base + TRCCIDCCTLR0);
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h 
b/drivers/hwtracing/coresight/coresight-etm4x.h
index b0d633daf7162..47729e04aac72 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x.h
+++ b/drivers/hwtracing/coresight/coresight-etm4x.h
@@ -334,7 +334,7 @@ struct etmv4_save_state {
        u64     trcacvr[ETM_MAX_SINGLE_ADDR_CMP];
        u64     trcacatr[ETM_MAX_SINGLE_ADDR_CMP];
        u64     trccidcvr[ETMv4_MAX_CTXID_CMP];
-       u32     trcvmidcvr[ETM_MAX_VMID_CMP];
+       u64     trcvmidcvr[ETM_MAX_VMID_CMP];
        u32     trccidcctlr0;
        u32     trccidcctlr1;
        u32     trcvmidcctlr0;
-- 
2.25.1



Reply via email to