]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
coresight: etm4x: Fix save/restore during cpu idle
authorSuzuki K Poulose <suzuki.poulose@arm.com>
Thu, 16 Jul 2020 17:57:46 +0000 (11:57 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 21 Jul 2020 13:48:40 +0000 (15:48 +0200)
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.poirier@linaro.org>
Cc: Mike Leach <mike.leach@linaro.org>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Link: https://lore.kernel.org/r/20200716175746.3338735-18-mathieu.poirier@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/coresight/coresight-etm4x.c
drivers/hwtracing/coresight/coresight-etm4x.h

index 2d732af8b3e78d13cd192a250ac8fa75ad4df8d0..6d7d2169bfb26738a14bc4df8d4c79e406943635 100644 (file)
@@ -1206,8 +1206,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));
        }
 
        /*
@@ -1218,10 +1218,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);
@@ -1319,18 +1319,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);
index 7da022e87218d2ef9c8774b41c3cedb2b0cb316f..b8283e1d6d88cc27e96031dae8d4aa347de405bf 100644 (file)
@@ -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;