Skip to content

Commit c7c3f56

Browse files
Madhavan Srinivasanmpe
authored andcommitted
powerpc/perf: macros for power9 format encoding
Patch to add macros and contants to support the power9 raw event encoding format. Couple of functions added since some of the bits fields like PMCxCOMB and THRESH_CMP has different width and location within MMCR* in power9. Signed-off-by: Madhavan Srinivasan <[email protected]> Signed-off-by: Michael Ellerman <[email protected]>
1 parent 18201b2 commit c7c3f56

File tree

2 files changed

+79
-8
lines changed

2 files changed

+79
-8
lines changed

arch/powerpc/perf/isa207-common.c

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,56 @@ static inline bool event_is_fab_match(u64 event)
5555
return (event == 0x30056 || event == 0x4f052);
5656
}
5757

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+
58100
int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)
59101
{
60102
unsigned int unit, pmc, cache, ebb;
61103
unsigned long mask, value;
62104

63105
mask = value = 0;
64106

65-
if (event & ~EVENT_VALID_MASK)
107+
if (!is_event_valid(event))
66108
return -1;
67109

68110
pmc = (event >> EVENT_PMC_SHIFT) & EVENT_PMC_MASK;
@@ -189,15 +231,13 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
189231
pmc_inuse |= 1 << pmc;
190232
}
191233

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;
195235

196236
/* Second pass: assign PMCs, set all MMCR1 fields */
197237
for (i = 0; i < n_ev; ++i) {
198238
pmc = (event[i] >> EVENT_PMC_SHIFT) & EVENT_PMC_MASK;
199239
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]);
201241
psel = event[i] & EVENT_PSEL_MASK;
202242

203243
if (!pmc) {
@@ -211,10 +251,13 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
211251

212252
if (pmc <= 4) {
213253
mmcr1 |= unit << MMCR1_UNIT_SHIFT(pmc);
214-
mmcr1 |= combine << MMCR1_COMBINE_SHIFT(pmc);
254+
mmcr1 |= combine << combine_shift(pmc);
215255
mmcr1 |= psel << MMCR1_PMCSEL_SHIFT(pmc);
216256
}
217257

258+
/* In continuous sampling mode, update SDAR on TLB miss */
259+
mmcra |= mmcra_sdar_mode(event[i]);
260+
218261
if (event[i] & EVENT_IS_L1) {
219262
cache = event[i] >> EVENT_CACHE_SEL_SHIFT;
220263
mmcr1 |= (cache & 1) << MMCR1_IC_QUAL_SHIFT;
@@ -245,7 +288,7 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
245288
val = (event[i] >> EVENT_THR_SEL_SHIFT) & EVENT_THR_SEL_MASK;
246289
mmcra |= val << MMCRA_THR_SEL_SHIFT;
247290
val = (event[i] >> EVENT_THR_CMP_SHIFT) & EVENT_THR_CMP_MASK;
248-
mmcra |= val << MMCRA_THR_CMP_SHIFT;
291+
mmcra |= thresh_cmp_val(val);
249292
}
250293

251294
if (event[i] & EVENT_WANTS_BHRB) {

arch/powerpc/perf/isa207-common.h

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
#define EVENT_UNIT_MASK 0xf
108108
#define EVENT_COMBINE_SHIFT 11 /* Combine bit */
109109
#define EVENT_COMBINE_MASK 0x1
110+
#define EVENT_COMBINE(v) (((v) >> EVENT_COMBINE_SHIFT) & EVENT_COMBINE_MASK)
110111
#define EVENT_MARKED_SHIFT 8 /* Marked bit */
111112
#define EVENT_MARKED_MASK 0x1
112113
#define EVENT_IS_MARKED (EVENT_MARKED_MASK << EVENT_MARKED_SHIFT)
@@ -134,6 +135,26 @@
134135
PERF_SAMPLE_BRANCH_KERNEL |\
135136
PERF_SAMPLE_BRANCH_HV)
136137

138+
/* Contants to support power9 raw encoding format */
139+
#define p9_EVENT_COMBINE_SHIFT 10 /* Combine bit */
140+
#define p9_EVENT_COMBINE_MASK 0x3ull
141+
#define p9_EVENT_COMBINE(v) (((v) >> p9_EVENT_COMBINE_SHIFT) & p9_EVENT_COMBINE_MASK)
142+
#define p9_SDAR_MODE_SHIFT 50
143+
#define p9_SDAR_MODE_MASK 0x3ull
144+
#define p9_SDAR_MODE(v) (((v) >> p9_SDAR_MODE_SHIFT) & p9_SDAR_MODE_MASK)
145+
146+
#define p9_EVENT_VALID_MASK \
147+
((p9_SDAR_MODE_MASK << p9_SDAR_MODE_SHIFT | \
148+
(EVENT_THRESH_MASK << EVENT_THRESH_SHIFT) | \
149+
(EVENT_SAMPLE_MASK << EVENT_SAMPLE_SHIFT) | \
150+
(EVENT_CACHE_SEL_MASK << EVENT_CACHE_SEL_SHIFT) | \
151+
(EVENT_PMC_MASK << EVENT_PMC_SHIFT) | \
152+
(EVENT_UNIT_MASK << EVENT_UNIT_SHIFT) | \
153+
(p9_EVENT_COMBINE_MASK << p9_EVENT_COMBINE_SHIFT) | \
154+
(EVENT_MARKED_MASK << EVENT_MARKED_SHIFT) | \
155+
EVENT_LINUX_MASK | \
156+
EVENT_PSEL_MASK))
157+
137158
/*
138159
* Layout of constraint bits:
139160
*
@@ -210,15 +231,22 @@
210231
#define MMCR1_DC_QUAL_SHIFT 47
211232
#define MMCR1_IC_QUAL_SHIFT 46
212233

234+
/* MMCR1 Combine bits macro for power9 */
235+
#define p9_MMCR1_COMBINE_SHIFT(pmc) (38 - ((pmc - 1) * 2))
236+
213237
/* Bits in MMCRA for PowerISA v2.07 */
214238
#define MMCRA_SAMP_MODE_SHIFT 1
215239
#define MMCRA_SAMP_ELIG_SHIFT 4
216240
#define MMCRA_THR_CTL_SHIFT 8
217241
#define MMCRA_THR_SEL_SHIFT 16
218242
#define MMCRA_THR_CMP_SHIFT 32
219-
#define MMCRA_SDAR_MODE_TLB (1ull << 42)
243+
#define MMCRA_SDAR_MODE_SHIFT 42
244+
#define MMCRA_SDAR_MODE_TLB (1ull << MMCRA_SDAR_MODE_SHIFT)
220245
#define MMCRA_IFM_SHIFT 30
221246

247+
/* MMCR1 Threshold Compare bit constant for power9 */
248+
#define p9_MMCRA_THR_CMP_SHIFT 45
249+
222250
/* Bits in MMCR2 for PowerISA v2.07 */
223251
#define MMCR2_FCS(pmc) (1ull << (63 - (((pmc) - 1) * 9)))
224252
#define MMCR2_FCP(pmc) (1ull << (62 - (((pmc) - 1) * 9)))

0 commit comments

Comments
 (0)