@@ -55,14 +55,56 @@ static inline bool event_is_fab_match(u64 event)
55
55
return (event == 0x30056 || event == 0x4f052 );
56
56
}
57
57
58
+ static bool is_event_valid (u64 event )
59
+ {
60
+ u64 valid_mask = EVENT_VALID_MASK ;
61
+
62
+ if (cpu_has_feature (CPU_FTR_ARCH_300 ) && !cpu_has_feature (CPU_FTR_POWER9_DD1 ))
63
+ valid_mask = p9_EVENT_VALID_MASK ;
64
+
65
+ return !(event & ~valid_mask );
66
+ }
67
+
68
+ static u64 mmcra_sdar_mode (u64 event )
69
+ {
70
+ if (cpu_has_feature (CPU_FTR_ARCH_300 ) && !cpu_has_feature (CPU_FTR_POWER9_DD1 ))
71
+ return p9_SDAR_MODE (event ) << MMCRA_SDAR_MODE_SHIFT ;
72
+
73
+ return MMCRA_SDAR_MODE_TLB ;
74
+ }
75
+
76
+ static u64 thresh_cmp_val (u64 value )
77
+ {
78
+ if (cpu_has_feature (CPU_FTR_ARCH_300 ) && !cpu_has_feature (CPU_FTR_POWER9_DD1 ))
79
+ return value << p9_MMCRA_THR_CMP_SHIFT ;
80
+
81
+ return value << MMCRA_THR_CMP_SHIFT ;
82
+ }
83
+
84
+ static unsigned long combine_from_event (u64 event )
85
+ {
86
+ if (cpu_has_feature (CPU_FTR_ARCH_300 ) && !cpu_has_feature (CPU_FTR_POWER9_DD1 ))
87
+ return p9_EVENT_COMBINE (event );
88
+
89
+ return EVENT_COMBINE (event );
90
+ }
91
+
92
+ static unsigned long combine_shift (unsigned long pmc )
93
+ {
94
+ if (cpu_has_feature (CPU_FTR_ARCH_300 ) && !cpu_has_feature (CPU_FTR_POWER9_DD1 ))
95
+ return p9_MMCR1_COMBINE_SHIFT (pmc );
96
+
97
+ return MMCR1_COMBINE_SHIFT (pmc );
98
+ }
99
+
58
100
int isa207_get_constraint (u64 event , unsigned long * maskp , unsigned long * valp )
59
101
{
60
102
unsigned int unit , pmc , cache , ebb ;
61
103
unsigned long mask , value ;
62
104
63
105
mask = value = 0 ;
64
106
65
- if (event & ~ EVENT_VALID_MASK )
107
+ if (! is_event_valid ( event ) )
66
108
return -1 ;
67
109
68
110
pmc = (event >> EVENT_PMC_SHIFT ) & EVENT_PMC_MASK ;
@@ -189,15 +231,13 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
189
231
pmc_inuse |= 1 << pmc ;
190
232
}
191
233
192
- /* In continuous sampling mode, update SDAR on TLB miss */
193
- mmcra = MMCRA_SDAR_MODE_TLB ;
194
- mmcr1 = mmcr2 = 0 ;
234
+ mmcra = mmcr1 = mmcr2 = 0 ;
195
235
196
236
/* Second pass: assign PMCs, set all MMCR1 fields */
197
237
for (i = 0 ; i < n_ev ; ++ i ) {
198
238
pmc = (event [i ] >> EVENT_PMC_SHIFT ) & EVENT_PMC_MASK ;
199
239
unit = (event [i ] >> EVENT_UNIT_SHIFT ) & EVENT_UNIT_MASK ;
200
- combine = (event [i ] >> EVENT_COMBINE_SHIFT ) & EVENT_COMBINE_MASK ;
240
+ combine = combine_from_event (event [i ]) ;
201
241
psel = event [i ] & EVENT_PSEL_MASK ;
202
242
203
243
if (!pmc ) {
@@ -211,10 +251,13 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
211
251
212
252
if (pmc <= 4 ) {
213
253
mmcr1 |= unit << MMCR1_UNIT_SHIFT (pmc );
214
- mmcr1 |= combine << MMCR1_COMBINE_SHIFT (pmc );
254
+ mmcr1 |= combine << combine_shift (pmc );
215
255
mmcr1 |= psel << MMCR1_PMCSEL_SHIFT (pmc );
216
256
}
217
257
258
+ /* In continuous sampling mode, update SDAR on TLB miss */
259
+ mmcra |= mmcra_sdar_mode (event [i ]);
260
+
218
261
if (event [i ] & EVENT_IS_L1 ) {
219
262
cache = event [i ] >> EVENT_CACHE_SEL_SHIFT ;
220
263
mmcr1 |= (cache & 1 ) << MMCR1_IC_QUAL_SHIFT ;
@@ -245,7 +288,7 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
245
288
val = (event [i ] >> EVENT_THR_SEL_SHIFT ) & EVENT_THR_SEL_MASK ;
246
289
mmcra |= val << MMCRA_THR_SEL_SHIFT ;
247
290
val = (event [i ] >> EVENT_THR_CMP_SHIFT ) & EVENT_THR_CMP_MASK ;
248
- mmcra |= val << MMCRA_THR_CMP_SHIFT ;
291
+ mmcra |= thresh_cmp_val ( val ) ;
249
292
}
250
293
251
294
if (event [i ] & EVENT_WANTS_BHRB ) {
0 commit comments