mirror of
https://github.com/torvalds/linux.git
synced 2024-12-02 17:11:33 +00:00
powerpc/perf: Factor out event_alternative function
Factor out the power8 event_alternative function to share the code with power9. Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
753843471c
commit
efe881afdd
@ -338,3 +338,39 @@ void isa207_disable_pmc(unsigned int pmc, unsigned long mmcr[])
|
|||||||
if (pmc <= 3)
|
if (pmc <= 3)
|
||||||
mmcr[1] &= ~(0xffUL << MMCR1_PMCSEL_SHIFT(pmc + 1));
|
mmcr[1] &= ~(0xffUL << MMCR1_PMCSEL_SHIFT(pmc + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int find_alternative(u64 event, const unsigned int ev_alt[][MAX_ALT], int size)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < size; ++i) {
|
||||||
|
if (event < ev_alt[i][0])
|
||||||
|
break;
|
||||||
|
|
||||||
|
for (j = 0; j < MAX_ALT && ev_alt[i][j]; ++j)
|
||||||
|
if (event == ev_alt[i][j])
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int isa207_get_alternatives(u64 event, u64 alt[],
|
||||||
|
const unsigned int ev_alt[][MAX_ALT], int size)
|
||||||
|
{
|
||||||
|
int i, j, num_alt = 0;
|
||||||
|
u64 alt_event;
|
||||||
|
|
||||||
|
alt[num_alt++] = event;
|
||||||
|
i = find_alternative(event, ev_alt, size);
|
||||||
|
if (i >= 0) {
|
||||||
|
/* Filter out the original event, it's already in alt[0] */
|
||||||
|
for (j = 0; j < MAX_ALT; ++j) {
|
||||||
|
alt_event = ev_alt[i][j];
|
||||||
|
if (alt_event && alt_event != event)
|
||||||
|
alt[num_alt++] = alt_event;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return num_alt;
|
||||||
|
}
|
||||||
|
@ -260,5 +260,8 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
|
|||||||
unsigned int hwc[], unsigned long mmcr[],
|
unsigned int hwc[], unsigned long mmcr[],
|
||||||
struct perf_event *pevents[]);
|
struct perf_event *pevents[]);
|
||||||
void isa207_disable_pmc(unsigned int pmc, unsigned long mmcr[]);
|
void isa207_disable_pmc(unsigned int pmc, unsigned long mmcr[]);
|
||||||
|
int isa207_get_alternatives(u64 event, u64 alt[],
|
||||||
|
const unsigned int ev_alt[][MAX_ALT], int size);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -48,43 +48,12 @@ static const unsigned int event_alternatives[][MAX_ALT] = {
|
|||||||
{ PM_RUN_INST_CMPL_ALT, PM_RUN_INST_CMPL },
|
{ PM_RUN_INST_CMPL_ALT, PM_RUN_INST_CMPL },
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Scan the alternatives table for a match and return the
|
|
||||||
* index into the alternatives table if found, else -1.
|
|
||||||
*/
|
|
||||||
static int find_alternative(u64 event)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(event_alternatives); ++i) {
|
|
||||||
if (event < event_alternatives[i][0])
|
|
||||||
break;
|
|
||||||
|
|
||||||
for (j = 0; j < MAX_ALT && event_alternatives[i][j]; ++j)
|
|
||||||
if (event == event_alternatives[i][j])
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int power8_get_alternatives(u64 event, unsigned int flags, u64 alt[])
|
static int power8_get_alternatives(u64 event, unsigned int flags, u64 alt[])
|
||||||
{
|
{
|
||||||
int i, j, num_alt = 0;
|
int i, j, num_alt = 0;
|
||||||
u64 alt_event;
|
|
||||||
|
|
||||||
alt[num_alt++] = event;
|
|
||||||
|
|
||||||
i = find_alternative(event);
|
|
||||||
if (i >= 0) {
|
|
||||||
/* Filter out the original event, it's already in alt[0] */
|
|
||||||
for (j = 0; j < MAX_ALT; ++j) {
|
|
||||||
alt_event = event_alternatives[i][j];
|
|
||||||
if (alt_event && alt_event != event)
|
|
||||||
alt[num_alt++] = alt_event;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
num_alt = isa207_get_alternatives(event, alt, event_alternatives,
|
||||||
|
(int)ARRAY_SIZE(event_alternatives));
|
||||||
if (flags & PPMU_ONLY_COUNT_RUN) {
|
if (flags & PPMU_ONLY_COUNT_RUN) {
|
||||||
/*
|
/*
|
||||||
* We're only counting in RUN state, so PM_CYC is equivalent to
|
* We're only counting in RUN state, so PM_CYC is equivalent to
|
||||||
|
Loading…
Reference in New Issue
Block a user