Commit 8abd818f authored by Michael Ellerman's avatar Michael Ellerman Committed by Benjamin Herrenschmidt

powerpc/perf: Pass the struct perf_events down to compute_mmcr()

To support per-event exclude settings on Power8 we need access to the
struct perf_events in compute_mmcr().
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 79a4cb28
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#define MAX_EVENT_ALTERNATIVES 8 #define MAX_EVENT_ALTERNATIVES 8
#define MAX_LIMITED_HWCOUNTERS 2 #define MAX_LIMITED_HWCOUNTERS 2
struct perf_event;
/* /*
* This struct provides the constants and functions needed to * This struct provides the constants and functions needed to
* describe the PMU on a particular POWER-family CPU. * describe the PMU on a particular POWER-family CPU.
...@@ -30,7 +32,8 @@ struct power_pmu { ...@@ -30,7 +32,8 @@ struct power_pmu {
unsigned long add_fields; unsigned long add_fields;
unsigned long test_adder; unsigned long test_adder;
int (*compute_mmcr)(u64 events[], int n_ev, int (*compute_mmcr)(u64 events[], int n_ev,
unsigned int hwc[], unsigned long mmcr[]); unsigned int hwc[], unsigned long mmcr[],
struct perf_event *pevents[]);
int (*get_constraint)(u64 event_id, unsigned long *mskp, int (*get_constraint)(u64 event_id, unsigned long *mskp,
unsigned long *valp); unsigned long *valp);
int (*get_alternatives)(u64 event_id, unsigned int flags, int (*get_alternatives)(u64 event_id, unsigned int flags,
......
...@@ -1224,7 +1224,7 @@ static void power_pmu_enable(struct pmu *pmu) ...@@ -1224,7 +1224,7 @@ static void power_pmu_enable(struct pmu *pmu)
memset(cpuhw->mmcr, 0, sizeof(cpuhw->mmcr)); memset(cpuhw->mmcr, 0, sizeof(cpuhw->mmcr));
if (ppmu->compute_mmcr(cpuhw->events, cpuhw->n_events, hwc_index, if (ppmu->compute_mmcr(cpuhw->events, cpuhw->n_events, hwc_index,
cpuhw->mmcr)) { cpuhw->mmcr, cpuhw->event)) {
/* shouldn't ever get here */ /* shouldn't ever get here */
printk(KERN_ERR "oops compute_mmcr failed\n"); printk(KERN_ERR "oops compute_mmcr failed\n");
goto out; goto out;
......
...@@ -260,8 +260,9 @@ static const u32 pmcsel_mask[N_COUNTER] = { ...@@ -260,8 +260,9 @@ static const u32 pmcsel_mask[N_COUNTER] = {
/* /*
* Compute MMCR0/1/2 values for a set of events. * Compute MMCR0/1/2 values for a set of events.
*/ */
static int mpc7450_compute_mmcr(u64 event[], int n_ev, static int mpc7450_compute_mmcr(u64 event[], int n_ev, unsigned int hwc[],
unsigned int hwc[], unsigned long mmcr[]) unsigned long mmcr[],
struct perf_event *pevents[])
{ {
u8 event_index[N_CLASSES][N_COUNTER]; u8 event_index[N_CLASSES][N_COUNTER];
int n_classevent[N_CLASSES]; int n_classevent[N_CLASSES];
......
...@@ -356,7 +356,7 @@ static int p4_get_alternatives(u64 event, unsigned int flags, u64 alt[]) ...@@ -356,7 +356,7 @@ static int p4_get_alternatives(u64 event, unsigned int flags, u64 alt[])
} }
static int p4_compute_mmcr(u64 event[], int n_ev, static int p4_compute_mmcr(u64 event[], int n_ev,
unsigned int hwc[], unsigned long mmcr[]) unsigned int hwc[], unsigned long mmcr[], struct perf_event *pevents[])
{ {
unsigned long mmcr0 = 0, mmcr1 = 0, mmcra = 0; unsigned long mmcr0 = 0, mmcr1 = 0, mmcra = 0;
unsigned int pmc, unit, byte, psel, lower; unsigned int pmc, unit, byte, psel, lower;
......
...@@ -452,7 +452,7 @@ static int power5p_marked_instr_event(u64 event) ...@@ -452,7 +452,7 @@ static int power5p_marked_instr_event(u64 event)
} }
static int power5p_compute_mmcr(u64 event[], int n_ev, static int power5p_compute_mmcr(u64 event[], int n_ev,
unsigned int hwc[], unsigned long mmcr[]) unsigned int hwc[], unsigned long mmcr[], struct perf_event *pevents[])
{ {
unsigned long mmcr1 = 0; unsigned long mmcr1 = 0;
unsigned long mmcra = 0; unsigned long mmcra = 0;
......
...@@ -383,7 +383,7 @@ static int power5_marked_instr_event(u64 event) ...@@ -383,7 +383,7 @@ static int power5_marked_instr_event(u64 event)
} }
static int power5_compute_mmcr(u64 event[], int n_ev, static int power5_compute_mmcr(u64 event[], int n_ev,
unsigned int hwc[], unsigned long mmcr[]) unsigned int hwc[], unsigned long mmcr[], struct perf_event *pevents[])
{ {
unsigned long mmcr1 = 0; unsigned long mmcr1 = 0;
unsigned long mmcra = MMCRA_SDAR_DCACHE_MISS | MMCRA_SDAR_ERAT_MISS; unsigned long mmcra = MMCRA_SDAR_DCACHE_MISS | MMCRA_SDAR_ERAT_MISS;
......
...@@ -175,7 +175,7 @@ static int power6_marked_instr_event(u64 event) ...@@ -175,7 +175,7 @@ static int power6_marked_instr_event(u64 event)
* Assign PMC numbers and compute MMCR1 value for a set of events * Assign PMC numbers and compute MMCR1 value for a set of events
*/ */
static int p6_compute_mmcr(u64 event[], int n_ev, static int p6_compute_mmcr(u64 event[], int n_ev,
unsigned int hwc[], unsigned long mmcr[]) unsigned int hwc[], unsigned long mmcr[], struct perf_event *pevents[])
{ {
unsigned long mmcr1 = 0; unsigned long mmcr1 = 0;
unsigned long mmcra = MMCRA_SDAR_DCACHE_MISS | MMCRA_SDAR_ERAT_MISS; unsigned long mmcra = MMCRA_SDAR_DCACHE_MISS | MMCRA_SDAR_ERAT_MISS;
......
...@@ -245,7 +245,7 @@ static int power7_marked_instr_event(u64 event) ...@@ -245,7 +245,7 @@ static int power7_marked_instr_event(u64 event)
} }
static int power7_compute_mmcr(u64 event[], int n_ev, static int power7_compute_mmcr(u64 event[], int n_ev,
unsigned int hwc[], unsigned long mmcr[]) unsigned int hwc[], unsigned long mmcr[], struct perf_event *pevents[])
{ {
unsigned long mmcr1 = 0; unsigned long mmcr1 = 0;
unsigned long mmcra = MMCRA_SDAR_DCACHE_MISS | MMCRA_SDAR_ERAT_MISS; unsigned long mmcra = MMCRA_SDAR_DCACHE_MISS | MMCRA_SDAR_ERAT_MISS;
......
...@@ -393,7 +393,8 @@ static int power8_get_constraint(u64 event, unsigned long *maskp, unsigned long ...@@ -393,7 +393,8 @@ static int power8_get_constraint(u64 event, unsigned long *maskp, unsigned long
} }
static int power8_compute_mmcr(u64 event[], int n_ev, static int power8_compute_mmcr(u64 event[], int n_ev,
unsigned int hwc[], unsigned long mmcr[]) unsigned int hwc[], unsigned long mmcr[],
struct perf_event *pevents[])
{ {
unsigned long mmcra, mmcr1, unit, combine, psel, cache, val; unsigned long mmcra, mmcr1, unit, combine, psel, cache, val;
unsigned int pmc, pmc_inuse; unsigned int pmc, pmc_inuse;
......
...@@ -257,7 +257,7 @@ static int p970_get_alternatives(u64 event, unsigned int flags, u64 alt[]) ...@@ -257,7 +257,7 @@ static int p970_get_alternatives(u64 event, unsigned int flags, u64 alt[])
} }
static int p970_compute_mmcr(u64 event[], int n_ev, static int p970_compute_mmcr(u64 event[], int n_ev,
unsigned int hwc[], unsigned long mmcr[]) unsigned int hwc[], unsigned long mmcr[], struct perf_event *pevents[])
{ {
unsigned long mmcr0 = 0, mmcr1 = 0, mmcra = 0; unsigned long mmcr0 = 0, mmcr1 = 0, mmcra = 0;
unsigned int pmc, unit, byte, psel; unsigned int pmc, unit, byte, psel;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment