|
@@ -488,8 +488,8 @@ static int find_alternative(u64 event, const unsigned int ev_alt[][MAX_ALT], int
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-int isa207_get_alternatives(u64 event, u64 alt[],
|
|
|
- const unsigned int ev_alt[][MAX_ALT], int size)
|
|
|
+int isa207_get_alternatives(u64 event, u64 alt[], int size, unsigned int flags,
|
|
|
+ const unsigned int ev_alt[][MAX_ALT])
|
|
|
{
|
|
|
int i, j, num_alt = 0;
|
|
|
u64 alt_event;
|
|
@@ -505,5 +505,30 @@ int isa207_get_alternatives(u64 event, u64 alt[],
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (flags & PPMU_ONLY_COUNT_RUN) {
|
|
|
+ /*
|
|
|
+ * We're only counting in RUN state, so PM_CYC is equivalent to
|
|
|
+ * PM_RUN_CYC and PM_INST_CMPL === PM_RUN_INST_CMPL.
|
|
|
+ */
|
|
|
+ j = num_alt;
|
|
|
+ for (i = 0; i < num_alt; ++i) {
|
|
|
+ switch (alt[i]) {
|
|
|
+ case 0x1e: /* PMC_CYC */
|
|
|
+ alt[j++] = 0x600f4; /* PM_RUN_CYC */
|
|
|
+ break;
|
|
|
+ case 0x600f4:
|
|
|
+ alt[j++] = 0x1e;
|
|
|
+ break;
|
|
|
+ case 0x2: /* PM_INST_CMPL */
|
|
|
+ alt[j++] = 0x500fa; /* PM_RUN_INST_CMPL */
|
|
|
+ break;
|
|
|
+ case 0x500fa:
|
|
|
+ alt[j++] = 0x2;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ num_alt = j;
|
|
|
+ }
|
|
|
+
|
|
|
return num_alt;
|
|
|
}
|