in kernel/perf_event_cpu.c [412:462]
static void nds32_pmu_enable_event(struct perf_event *event)
{
unsigned long flags;
unsigned int evnum = 0;
struct hw_perf_event *hwc = &event->hw;
struct nds32_pmu *cpu_pmu = to_nds32_pmu(event->pmu);
struct pmu_hw_events *events = cpu_pmu->get_hw_events();
int idx = hwc->idx;
if (!nds32_pfm_counter_valid(cpu_pmu, idx)) {
pr_err("CPU enabling wrong pfm counter IRQ enable\n");
return;
}
/*
* Enable counter and interrupt, and set the counter to count
* the event that we're interested in.
*/
raw_spin_lock_irqsave(&events->pmu_lock, flags);
/*
* Disable counter
*/
nds32_pfm_disable_counter(idx);
/*
* Check whether we need to exclude the counter from certain modes.
*/
if ((!cpu_pmu->set_event_filter ||
cpu_pmu->set_event_filter(hwc, &event->attr)) &&
event_requires_mode_exclusion(&event->attr)) {
pr_notice
("NDS32 performance counters do not support mode exclusion\n");
hwc->config_base = 0;
}
/* Write event */
evnum = hwc->config_base;
nds32_pfm_write_evtsel(idx, evnum);
/*
* Enable interrupt for this counter
*/
nds32_pfm_enable_intens(idx);
/*
* Enable counter
*/
nds32_pfm_enable_counter(idx);
raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
}