Commit fa637bf0 authored by Pawel Moll's avatar Pawel Moll Committed by Arnd Bergmann

bus: arm-ccn: Fix spurious warning message

Because CCN's cycle counter always runs, it will generate
an interrupt on overflow even if the relevant perf event
was not requested, causing a spurious warning message.

Fixed now by warning on only normal counter unwanted
overflows. Also cleaning the overflow mask at init now,
not to warn on event previously requested by firmware.
Signed-off-by: default avatarPawel Moll <pawel.moll@arm.com>
Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent 741c798a
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
#define CCN_DT_PMCCNTRSR 0x0190 #define CCN_DT_PMCCNTRSR 0x0190
#define CCN_DT_PMOVSR 0x0198 #define CCN_DT_PMOVSR 0x0198
#define CCN_DT_PMOVSR_CLR 0x01a0 #define CCN_DT_PMOVSR_CLR 0x01a0
#define CCN_DT_PMOVSR_CLR__MASK 0x1f
#define CCN_DT_PMCR 0x01a8 #define CCN_DT_PMCR 0x01a8
#define CCN_DT_PMCR__OVFL_INTR_EN (1 << 6) #define CCN_DT_PMCR__OVFL_INTR_EN (1 << 6)
#define CCN_DT_PMCR__PMU_EN (1 << 0) #define CCN_DT_PMCR__PMU_EN (1 << 0)
...@@ -1052,7 +1053,8 @@ static irqreturn_t arm_ccn_pmu_overflow_handler(struct arm_ccn_dt *dt) ...@@ -1052,7 +1053,8 @@ static irqreturn_t arm_ccn_pmu_overflow_handler(struct arm_ccn_dt *dt)
struct perf_event *event = dt->pmu_counters[idx].event; struct perf_event *event = dt->pmu_counters[idx].event;
int overflowed = pmovsr & BIT(idx); int overflowed = pmovsr & BIT(idx);
WARN_ON_ONCE(overflowed && !event); WARN_ON_ONCE(overflowed && !event &&
idx != CCN_IDX_PMU_CYCLE_COUNTER);
if (!event || !overflowed) if (!event || !overflowed)
continue; continue;
...@@ -1088,6 +1090,7 @@ static int arm_ccn_pmu_init(struct arm_ccn *ccn) ...@@ -1088,6 +1090,7 @@ static int arm_ccn_pmu_init(struct arm_ccn *ccn)
/* Initialize DT subsystem */ /* Initialize DT subsystem */
ccn->dt.base = ccn->base + CCN_REGION_SIZE; ccn->dt.base = ccn->base + CCN_REGION_SIZE;
spin_lock_init(&ccn->dt.config_lock); spin_lock_init(&ccn->dt.config_lock);
writel(CCN_DT_PMOVSR_CLR__MASK, ccn->dt.base + CCN_DT_PMOVSR_CLR);
writel(CCN_DT_CTL__DT_EN, ccn->dt.base + CCN_DT_CTL); writel(CCN_DT_CTL__DT_EN, ccn->dt.base + CCN_DT_CTL);
writel(CCN_DT_PMCR__OVFL_INTR_EN | CCN_DT_PMCR__PMU_EN, writel(CCN_DT_PMCR__OVFL_INTR_EN | CCN_DT_PMCR__PMU_EN,
ccn->dt.base + CCN_DT_PMCR); ccn->dt.base + CCN_DT_PMCR);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment