aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJames Hogan <james.hogan@imgtec.com>2013-02-21 10:34:59 -0500
committerJames Hogan <james.hogan@imgtec.com>2013-03-15 09:20:19 -0400
commitf27086f5dcb0c7e9622f724d5279e4dfe4e844a2 (patch)
tree2768182e4159e8c0a27c5b3eee8f8e03dc3d5efa /arch
parent1fb4dc5c39af941d3abc597337e0ea776bfce0f2 (diff)
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
Diffstat (limited to 'arch')
-rw-r--r--arch/metag/kernel/perf/perf_event.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/arch/metag/kernel/perf/perf_event.c b/arch/metag/kernel/perf/perf_event.c
index a1eff3687e8e..366569425c52 100644
--- a/arch/metag/kernel/perf/perf_event.c
+++ b/arch/metag/kernel/perf/perf_event.c
@@ -40,10 +40,10 @@ static DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events);
40/* PMU admin */ 40/* PMU admin */
41const char *perf_pmu_name(void) 41const char *perf_pmu_name(void)
42{ 42{
43 if (metag_pmu) 43 if (!metag_pmu)
44 return metag_pmu->pmu.name; 44 return NULL;
45 45
46 return NULL; 46 return metag_pmu->name;
47} 47}
48EXPORT_SYMBOL_GPL(perf_pmu_name); 48EXPORT_SYMBOL_GPL(perf_pmu_name);
49 49
@@ -171,6 +171,7 @@ static int metag_pmu_event_init(struct perf_event *event)
171 switch (event->attr.type) { 171 switch (event->attr.type) {
172 case PERF_TYPE_HARDWARE: 172 case PERF_TYPE_HARDWARE:
173 case PERF_TYPE_HW_CACHE: 173 case PERF_TYPE_HW_CACHE:
174 case PERF_TYPE_RAW:
174 err = _hw_perf_event_init(event); 175 err = _hw_perf_event_init(event);
175 break; 176 break;
176 177
@@ -556,6 +557,10 @@ static int _hw_perf_event_init(struct perf_event *event)
556 if (err) 557 if (err)
557 return err; 558 return err;
558 break; 559 break;
560
561 case PERF_TYPE_RAW:
562 mapping = attr->config;
563 break;
559 } 564 }
560 565
561 /* Return early if the event is unsupported */ 566 /* Return early if the event is unsupported */
@@ -623,7 +628,7 @@ static void metag_pmu_enable_counter(struct hw_perf_event *event, int idx)
623 628
624 /* Check for a core internal or performance channel event. */ 629 /* Check for a core internal or performance channel event. */
625 if (tmp) { 630 if (tmp) {
626 void *perf_addr = (void *)PERF_COUNT(idx); 631 void *perf_addr;
627 632
628 /* 633 /*
629 * Anything other than a cycle count will write the low- 634 * 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)
637 case 0xf0: 642 case 0xf0:
638 perf_addr = (void *)PERF_CHAN(idx); 643 perf_addr = (void *)PERF_CHAN(idx);
639 break; 644 break;
645
646 default:
647 perf_addr = NULL;
648 break;
640 } 649 }
641 650
642 metag_out32((config & 0x0f), perf_addr); 651 if (perf_addr)
652 metag_out32((config & 0x0f), perf_addr);
643 653
644 /* 654 /*
645 * Now we use the high nibble as the performance event to 655 * Now we use the high nibble as the performance event to
@@ -848,7 +858,7 @@ static int __init init_hw_perf_events(void)
848 metag_pmu->max_period = 0; 858 metag_pmu->max_period = 0;
849 } 859 }
850 860
851 metag_pmu->name = "Meta 2"; 861 metag_pmu->name = "meta2";
852 metag_pmu->version = version; 862 metag_pmu->version = version;
853 metag_pmu->pmu = pmu; 863 metag_pmu->pmu = pmu;
854 } 864 }