diff options
author | Pawel Moll <pawel.moll@arm.com> | 2016-08-10 17:06:26 +0100 |
---|---|---|
committer | Sasha Levin <alexander.levin@verizon.com> | 2016-10-04 00:53:32 -0400 |
commit | cb3662589ad97db5643d0ce9e10adc0f56476a50 (patch) | |
tree | 77fe7e2e8af94035b1d359fe85599a9ce6420623 | |
parent | 703dd66fe5555544b4aed696e9e25616cda4c55a (diff) | |
download | lwn-cb3662589ad97db5643d0ce9e10adc0f56476a50.tar.gz lwn-cb3662589ad97db5643d0ce9e10adc0f56476a50.zip |
bus: arm-ccn: Fix XP watchpoint settings bitmask
[ Upstream commit b928466b2169e061822daad48ecf55b005445547 ]
The code setting XP watchpoint comparator and mask registers should, in
order to be fully compliant with specification, zero one or more most
significant bits of each field. In both L cases it means zeroing bit 63.
The bitmask doing this was wrong, though, zeroing bit 60 instead.
Fortunately, due to a lucky coincidence, this turned out to be fairly
innocent with the existing hardware.
Fixed now.
Cc: stable@vger.kernel.org # 3.17+
Signed-off-by: Pawel Moll <pawel.moll@arm.com>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
-rw-r--r-- | drivers/bus/arm-ccn.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c index bf2092c85c98..27fd0dacad5f 100644 --- a/drivers/bus/arm-ccn.c +++ b/drivers/bus/arm-ccn.c @@ -905,7 +905,7 @@ static void arm_ccn_pmu_xp_watchpoint_config(struct perf_event *event) /* Comparison values */ writel(cmp_l & 0xffffffff, source->base + CCN_XP_DT_CMP_VAL_L(wp)); - writel((cmp_l >> 32) & 0xefffffff, + writel((cmp_l >> 32) & 0x7fffffff, source->base + CCN_XP_DT_CMP_VAL_L(wp) + 4); writel(cmp_h & 0xffffffff, source->base + CCN_XP_DT_CMP_VAL_H(wp)); writel((cmp_h >> 32) & 0x0fffffff, @@ -913,7 +913,7 @@ static void arm_ccn_pmu_xp_watchpoint_config(struct perf_event *event) /* Mask */ writel(mask_l & 0xffffffff, source->base + CCN_XP_DT_CMP_MASK_L(wp)); - writel((mask_l >> 32) & 0xefffffff, + writel((mask_l >> 32) & 0x7fffffff, source->base + CCN_XP_DT_CMP_MASK_L(wp) + 4); writel(mask_h & 0xffffffff, source->base + CCN_XP_DT_CMP_MASK_H(wp)); writel((mask_h >> 32) & 0x0fffffff, |