Commit f8f89e8c authored by Yicong Yang's avatar Yicong Yang Committed by Will Deacon
Browse files

perf: arm_pmuv3: Factor out PMCCNTR_EL0 use conditions



PMCCNTR_EL0 is preferred for counting CPU_CYCLES under certain
conditions. Factor out the condition check to a separate function
for further extension. Add documents for better understanding.
No functional changes intended.

Reviewed-by: default avatarJames Clark <james.clark@linaro.org>
Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
Signed-off-by: default avatarYicong Yang <yangyicong@hisilicon.com>
Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 00d7a1af
Loading
Loading
Loading
Loading
+27 −2
Original line number Diff line number Diff line
@@ -978,6 +978,32 @@ static int armv8pmu_get_chain_idx(struct pmu_hw_events *cpuc,
	return -EAGAIN;
}

static bool armv8pmu_can_use_pmccntr(struct pmu_hw_events *cpuc,
				     struct perf_event *event)
{
	struct hw_perf_event *hwc = &event->hw;
	unsigned long evtype = hwc->config_base & ARMV8_PMU_EVTYPE_EVENT;

	if (evtype != ARMV8_PMUV3_PERFCTR_CPU_CYCLES)
		return false;

	/*
	 * A CPU_CYCLES event with threshold counting cannot use PMCCNTR_EL0
	 * since it lacks threshold support.
	 */
	if (armv8pmu_event_get_threshold(&event->attr))
		return false;

	/*
	 * PMCCNTR_EL0 is not affected by BRBE controls like BRBCR_ELx.FZP.
	 * So don't use it for branch events.
	 */
	if (has_branch_stack(event))
		return false;

	return true;
}

static int armv8pmu_get_event_idx(struct pmu_hw_events *cpuc,
				  struct perf_event *event)
{
@@ -986,8 +1012,7 @@ static int armv8pmu_get_event_idx(struct pmu_hw_events *cpuc,
	unsigned long evtype = hwc->config_base & ARMV8_PMU_EVTYPE_EVENT;

	/* Always prefer to place a cycle counter into the cycle counter. */
	if ((evtype == ARMV8_PMUV3_PERFCTR_CPU_CYCLES) &&
	    !armv8pmu_event_get_threshold(&event->attr) && !has_branch_stack(event)) {
	if (armv8pmu_can_use_pmccntr(cpuc, event)) {
		if (!test_and_set_bit(ARMV8_PMU_CYCLE_IDX, cpuc->used_mask))
			return ARMV8_PMU_CYCLE_IDX;
		else if (armv8pmu_event_is_64bit(event) &&