|
@@ -55,6 +55,48 @@ static inline bool event_is_fab_match(u64 event)
|
|
|
return (event == 0x30056 || event == 0x4f052);
|
|
|
}
|
|
|
|
|
|
+static bool is_event_valid(u64 event)
|
|
|
+{
|
|
|
+ u64 valid_mask = EVENT_VALID_MASK;
|
|
|
+
|
|
|
+ if (cpu_has_feature(CPU_FTR_ARCH_300) && !cpu_has_feature(CPU_FTR_POWER9_DD1))
|
|
|
+ valid_mask = p9_EVENT_VALID_MASK;
|
|
|
+
|
|
|
+ return !(event & ~valid_mask);
|
|
|
+}
|
|
|
+
|
|
|
+static u64 mmcra_sdar_mode(u64 event)
|
|
|
+{
|
|
|
+ if (cpu_has_feature(CPU_FTR_ARCH_300) && !cpu_has_feature(CPU_FTR_POWER9_DD1))
|
|
|
+ return p9_SDAR_MODE(event) << MMCRA_SDAR_MODE_SHIFT;
|
|
|
+
|
|
|
+ return MMCRA_SDAR_MODE_TLB;
|
|
|
+}
|
|
|
+
|
|
|
+static u64 thresh_cmp_val(u64 value)
|
|
|
+{
|
|
|
+ if (cpu_has_feature(CPU_FTR_ARCH_300) && !cpu_has_feature(CPU_FTR_POWER9_DD1))
|
|
|
+ return value << p9_MMCRA_THR_CMP_SHIFT;
|
|
|
+
|
|
|
+ return value << MMCRA_THR_CMP_SHIFT;
|
|
|
+}
|
|
|
+
|
|
|
+static unsigned long combine_from_event(u64 event)
|
|
|
+{
|
|
|
+ if (cpu_has_feature(CPU_FTR_ARCH_300) && !cpu_has_feature(CPU_FTR_POWER9_DD1))
|
|
|
+ return p9_EVENT_COMBINE(event);
|
|
|
+
|
|
|
+ return EVENT_COMBINE(event);
|
|
|
+}
|
|
|
+
|
|
|
+static unsigned long combine_shift(unsigned long pmc)
|
|
|
+{
|
|
|
+ if (cpu_has_feature(CPU_FTR_ARCH_300) && !cpu_has_feature(CPU_FTR_POWER9_DD1))
|
|
|
+ return p9_MMCR1_COMBINE_SHIFT(pmc);
|
|
|
+
|
|
|
+ return MMCR1_COMBINE_SHIFT(pmc);
|
|
|
+}
|
|
|
+
|
|
|
int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)
|
|
|
{
|
|
|
unsigned int unit, pmc, cache, ebb;
|
|
@@ -62,7 +104,7 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)
|
|
|
|
|
|
mask = value = 0;
|
|
|
|
|
|
- if (event & ~EVENT_VALID_MASK)
|
|
|
+ if (!is_event_valid(event))
|
|
|
return -1;
|
|
|
|
|
|
pmc = (event >> EVENT_PMC_SHIFT) & EVENT_PMC_MASK;
|
|
@@ -189,15 +231,13 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
|
|
|
pmc_inuse |= 1 << pmc;
|
|
|
}
|
|
|
|
|
|
- /* In continuous sampling mode, update SDAR on TLB miss */
|
|
|
- mmcra = MMCRA_SDAR_MODE_TLB;
|
|
|
- mmcr1 = mmcr2 = 0;
|
|
|
+ mmcra = mmcr1 = mmcr2 = 0;
|
|
|
|
|
|
/* Second pass: assign PMCs, set all MMCR1 fields */
|
|
|
for (i = 0; i < n_ev; ++i) {
|
|
|
pmc = (event[i] >> EVENT_PMC_SHIFT) & EVENT_PMC_MASK;
|
|
|
unit = (event[i] >> EVENT_UNIT_SHIFT) & EVENT_UNIT_MASK;
|
|
|
- combine = (event[i] >> EVENT_COMBINE_SHIFT) & EVENT_COMBINE_MASK;
|
|
|
+ combine = combine_from_event(event[i]);
|
|
|
psel = event[i] & EVENT_PSEL_MASK;
|
|
|
|
|
|
if (!pmc) {
|
|
@@ -211,10 +251,13 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
|
|
|
|
|
|
if (pmc <= 4) {
|
|
|
mmcr1 |= unit << MMCR1_UNIT_SHIFT(pmc);
|
|
|
- mmcr1 |= combine << MMCR1_COMBINE_SHIFT(pmc);
|
|
|
+ mmcr1 |= combine << combine_shift(pmc);
|
|
|
mmcr1 |= psel << MMCR1_PMCSEL_SHIFT(pmc);
|
|
|
}
|
|
|
|
|
|
+ /* In continuous sampling mode, update SDAR on TLB miss */
|
|
|
+ mmcra |= mmcra_sdar_mode(event[i]);
|
|
|
+
|
|
|
if (event[i] & EVENT_IS_L1) {
|
|
|
cache = event[i] >> EVENT_CACHE_SEL_SHIFT;
|
|
|
mmcr1 |= (cache & 1) << MMCR1_IC_QUAL_SHIFT;
|
|
@@ -245,7 +288,7 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
|
|
|
val = (event[i] >> EVENT_THR_SEL_SHIFT) & EVENT_THR_SEL_MASK;
|
|
|
mmcra |= val << MMCRA_THR_SEL_SHIFT;
|
|
|
val = (event[i] >> EVENT_THR_CMP_SHIFT) & EVENT_THR_CMP_MASK;
|
|
|
- mmcra |= val << MMCRA_THR_CMP_SHIFT;
|
|
|
+ mmcra |= thresh_cmp_val(val);
|
|
|
}
|
|
|
|
|
|
if (event[i] & EVENT_WANTS_BHRB) {
|