metag: perf: prepare for use by oprofile
To allow our perf_events code to work with oprofile the PERF_TYPE_RAW event type attribute is implemented, which allows the internal encoding of events to be used externally (this requires some tweaks so that it handles invalid event types more gracefully), and perf_pmu_name() is adjusted to return metag_pmu->name instead of metag_pmu->pmu.name (which is changed to "meta2"). Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> Cc: Robert Richter <rric@kernel.org> Cc: oprofile-list@lists.sf.net
This commit is contained in:
Родитель
1fb4dc5c39
Коммит
f27086f5dc
|
@ -40,10 +40,10 @@ static DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events);
|
||||||
/* PMU admin */
|
/* PMU admin */
|
||||||
const char *perf_pmu_name(void)
|
const char *perf_pmu_name(void)
|
||||||
{
|
{
|
||||||
if (metag_pmu)
|
if (!metag_pmu)
|
||||||
return metag_pmu->pmu.name;
|
return NULL;
|
||||||
|
|
||||||
return NULL;
|
return metag_pmu->name;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(perf_pmu_name);
|
EXPORT_SYMBOL_GPL(perf_pmu_name);
|
||||||
|
|
||||||
|
@ -171,6 +171,7 @@ static int metag_pmu_event_init(struct perf_event *event)
|
||||||
switch (event->attr.type) {
|
switch (event->attr.type) {
|
||||||
case PERF_TYPE_HARDWARE:
|
case PERF_TYPE_HARDWARE:
|
||||||
case PERF_TYPE_HW_CACHE:
|
case PERF_TYPE_HW_CACHE:
|
||||||
|
case PERF_TYPE_RAW:
|
||||||
err = _hw_perf_event_init(event);
|
err = _hw_perf_event_init(event);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -556,6 +557,10 @@ static int _hw_perf_event_init(struct perf_event *event)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PERF_TYPE_RAW:
|
||||||
|
mapping = attr->config;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return early if the event is unsupported */
|
/* Return early if the event is unsupported */
|
||||||
|
@ -623,7 +628,7 @@ static void metag_pmu_enable_counter(struct hw_perf_event *event, int idx)
|
||||||
|
|
||||||
/* Check for a core internal or performance channel event. */
|
/* Check for a core internal or performance channel event. */
|
||||||
if (tmp) {
|
if (tmp) {
|
||||||
void *perf_addr = (void *)PERF_COUNT(idx);
|
void *perf_addr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Anything other than a cycle count will write the low-
|
* Anything other than a cycle count will write the low-
|
||||||
|
@ -637,9 +642,14 @@ static void metag_pmu_enable_counter(struct hw_perf_event *event, int idx)
|
||||||
case 0xf0:
|
case 0xf0:
|
||||||
perf_addr = (void *)PERF_CHAN(idx);
|
perf_addr = (void *)PERF_CHAN(idx);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
perf_addr = NULL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
metag_out32((config & 0x0f), perf_addr);
|
if (perf_addr)
|
||||||
|
metag_out32((config & 0x0f), perf_addr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now we use the high nibble as the performance event to
|
* Now we use the high nibble as the performance event to
|
||||||
|
@ -848,7 +858,7 @@ static int __init init_hw_perf_events(void)
|
||||||
metag_pmu->max_period = 0;
|
metag_pmu->max_period = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
metag_pmu->name = "Meta 2";
|
metag_pmu->name = "meta2";
|
||||||
metag_pmu->version = version;
|
metag_pmu->version = version;
|
||||||
metag_pmu->pmu = pmu;
|
metag_pmu->pmu = pmu;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче