diff options
| author | David S. Miller <davem@davemloft.net> | 2012-08-19 02:17:38 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2012-08-19 02:26:21 -0400 |
| commit | bab96bda4431602213deb53723d13f73f5308a20 (patch) | |
| tree | fd4207ba2809a05c5c1a4fb037ebe6f845612c20 | |
| parent | 035ea28dde1802ad4cc570976da34f8b7c2ed515 (diff) | |
sparc64: Update generic comments in perf event code to match reality.
Describe how we support two types of PMU setups, one with a single control
register and two counters stored in a single register, and another with
one control register per counter and each counter living in it's own
register.
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | arch/sparc/kernel/perf_event.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c index 18853705282b..e48651dace1b 100644 --- a/arch/sparc/kernel/perf_event.c +++ b/arch/sparc/kernel/perf_event.c | |||
| @@ -30,27 +30,39 @@ | |||
| 30 | #include "kernel.h" | 30 | #include "kernel.h" |
| 31 | #include "kstack.h" | 31 | #include "kstack.h" |
| 32 | 32 | ||
| 33 | /* Sparc64 chips have two performance counters, 32-bits each, with | 33 | /* Two classes of sparc64 chips currently exist. All of which have |
| 34 | * overflow interrupts generated on transition from 0xffffffff to 0. | 34 | * 32-bit counters which can generate overflow interrupts on the |
| 35 | * The counters are accessed in one go using a 64-bit register. | 35 | * transition from 0xffffffff to 0. |
| 36 | * | 36 | * |
| 37 | * Both counters are controlled using a single control register. The | 37 | * All chips upto and including SPARC-T3 have two performance |
| 38 | * only way to stop all sampling is to clear all of the context (user, | 38 | * counters. The two 32-bit counters are accessed in one go using a |
| 39 | * supervisor, hypervisor) sampling enable bits. But these bits apply | 39 | * single 64-bit register. |
| 40 | * to both counters, thus the two counters can't be enabled/disabled | ||
| 41 | * individually. | ||
| 42 | * | 40 | * |
| 43 | * The control register has two event fields, one for each of the two | 41 | * On these older chips both counters are controlled using a single |
| 44 | * counters. It's thus nearly impossible to have one counter going | 42 | * control register. The only way to stop all sampling is to clear |
| 45 | * while keeping the other one stopped. Therefore it is possible to | 43 | * all of the context (user, supervisor, hypervisor) sampling enable |
| 46 | * get overflow interrupts for counters not currently "in use" and | 44 | * bits. But these bits apply to both counters, thus the two counters |
| 47 | * that condition must be checked in the overflow interrupt handler. | 45 | * can't be enabled/disabled individually. |
| 46 | * | ||
| 47 | * Furthermore, the control register on these older chips have two | ||
| 48 | * event fields, one for each of the two counters. It's thus nearly | ||
| 49 | * impossible to have one counter going while keeping the other one | ||
| 50 | * stopped. Therefore it is possible to get overflow interrupts for | ||
| 51 | * counters not currently "in use" and that condition must be checked | ||
| 52 | * in the overflow interrupt handler. | ||
| 48 | * | 53 | * |
| 49 | * So we use a hack, in that we program inactive counters with the | 54 | * So we use a hack, in that we program inactive counters with the |
| 50 | * "sw_count0" and "sw_count1" events. These count how many times | 55 | * "sw_count0" and "sw_count1" events. These count how many times |
| 51 | * the instruction "sethi %hi(0xfc000), %g0" is executed. It's an | 56 | * the instruction "sethi %hi(0xfc000), %g0" is executed. It's an |
| 52 | * unusual way to encode a NOP and therefore will not trigger in | 57 | * unusual way to encode a NOP and therefore will not trigger in |
| 53 | * normal code. | 58 | * normal code. |
| 59 | * | ||
| 60 | * Starting with SPARC-T4 we have one control register per counter. | ||
| 61 | * And the counters are stored in individual registers. The registers | ||
| 62 | * for the counters are 64-bit but only a 32-bit counter is | ||
| 63 | * implemented. The event selections on SPARC-T4 lack any | ||
| 64 | * restrictions, therefore we can elide all of the complicated | ||
| 65 | * conflict resolution code we have for SPARC-T3 and earlier chips. | ||
| 54 | */ | 66 | */ |
| 55 | 67 | ||
| 56 | #define MAX_HWEVENTS 4 | 68 | #define MAX_HWEVENTS 4 |
| @@ -103,6 +115,8 @@ DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events) = { .enabled = 1, }; | |||
| 103 | /* An event map describes the characteristics of a performance | 115 | /* An event map describes the characteristics of a performance |
| 104 | * counter event. In particular it gives the encoding as well as | 116 | * counter event. In particular it gives the encoding as well as |
| 105 | * a mask telling which counters the event can be measured on. | 117 | * a mask telling which counters the event can be measured on. |
| 118 | * | ||
| 119 | * The mask is unused on SPARC-T4 and later. | ||
| 106 | */ | 120 | */ |
| 107 | struct perf_event_map { | 121 | struct perf_event_map { |
| 108 | u16 encoding; | 122 | u16 encoding; |
