aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMadhavan Srinivasan <maddy@linux.vnet.ibm.com>2016-12-01 19:35:02 -0500
committerMichael Ellerman <mpe@ellerman.id.au>2016-12-02 00:26:57 -0500
commitc7c3f568beff2b72f02a7807ec48b0bc66a7ead6 (patch)
tree8fb442530e2d549657a56de9a87409e0a27ce3d0
parent18201b204286a1ef478ef52b00ab9f6c5739b4f6 (diff)
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 <maddy@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r--arch/powerpc/perf/isa207-common.c57
-rw-r--r--arch/powerpc/perf/isa207-common.h30
2 files changed, 79 insertions, 8 deletions
diff --git a/arch/powerpc/perf/isa207-common.c b/arch/powerpc/perf/isa207-common.c
index 2a2040ea5f99..50e598cf644b 100644
--- a/arch/powerpc/perf/isa207-common.c
+++ b/arch/powerpc/perf/isa207-common.c
@@ -55,6 +55,48 @@ static inline bool event_is_fab_match(u64 event)
55 return (event == 0x30056 || event == 0x4f052); 55 return (event == 0x30056 || event == 0x4f052);
56} 56}
57 57
58static 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
68static 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
76static 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
84static 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
92static 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
58int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp) 100int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)
59{ 101{
60 unsigned int unit, pmc, cache, ebb; 102 unsigned int unit, pmc, cache, ebb;
@@ -62,7 +104,7 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)
62 104
63 mask = value = 0; 105 mask = value = 0;
64 106
65 if (event & ~EVENT_VALID_MASK) 107 if (!is_event_valid(event))
66 return -1; 108 return -1;
67 109
68 pmc = (event >> EVENT_PMC_SHIFT) & EVENT_PMC_MASK; 110 pmc = (event >> EVENT_PMC_SHIFT) & EVENT_PMC_MASK;
@@ -189,15 +231,13 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
189 pmc_inuse |= 1 << pmc; 231 pmc_inuse |= 1 << pmc;
190 } 232 }
191 233
192 /* In continuous sampling mode, update SDAR on TLB miss */ 234 mmcra = mmcr1 = mmcr2 = 0;
193 mmcra = MMCRA_SDAR_MODE_TLB;
194 mmcr1 = mmcr2 = 0;
195 235
196 /* Second pass: assign PMCs, set all MMCR1 fields */ 236 /* Second pass: assign PMCs, set all MMCR1 fields */
197 for (i = 0; i < n_ev; ++i) { 237 for (i = 0; i < n_ev; ++i) {
198 pmc = (event[i] >> EVENT_PMC_SHIFT) & EVENT_PMC_MASK; 238 pmc = (event[i] >> EVENT_PMC_SHIFT) & EVENT_PMC_MASK;
199 unit = (event[i] >> EVENT_UNIT_SHIFT) & EVENT_UNIT_MASK; 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 psel = event[i] & EVENT_PSEL_MASK; 241 psel = event[i] & EVENT_PSEL_MASK;
202 242
203 if (!pmc) { 243 if (!pmc) {
@@ -211,10 +251,13 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
211 251
212 if (pmc <= 4) { 252 if (pmc <= 4) {
213 mmcr1 |= unit << MMCR1_UNIT_SHIFT(pmc); 253 mmcr1 |= unit << MMCR1_UNIT_SHIFT(pmc);
214 mmcr1 |= combine << MMCR1_COMBINE_SHIFT(pmc); 254 mmcr1 |= combine << combine_shift(pmc);
215 mmcr1 |= psel << MMCR1_PMCSEL_SHIFT(pmc); 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 if (event[i] & EVENT_IS_L1) { 261 if (event[i] & EVENT_IS_L1) {
219 cache = event[i] >> EVENT_CACHE_SEL_SHIFT; 262 cache = event[i] >> EVENT_CACHE_SEL_SHIFT;
220 mmcr1 |= (cache & 1) << MMCR1_IC_QUAL_SHIFT; 263 mmcr1 |= (cache & 1) << MMCR1_IC_QUAL_SHIFT;
@@ -245,7 +288,7 @@ int isa207_compute_mmcr(u64 event[], int n_ev,
245 val = (event[i] >> EVENT_THR_SEL_SHIFT) & EVENT_THR_SEL_MASK; 288 val = (event[i] >> EVENT_THR_SEL_SHIFT) & EVENT_THR_SEL_MASK;
246 mmcra |= val << MMCRA_THR_SEL_SHIFT; 289 mmcra |= val << MMCRA_THR_SEL_SHIFT;
247 val = (event[i] >> EVENT_THR_CMP_SHIFT) & EVENT_THR_CMP_MASK; 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 if (event[i] & EVENT_WANTS_BHRB) { 294 if (event[i] & EVENT_WANTS_BHRB) {
diff --git a/arch/powerpc/perf/isa207-common.h b/arch/powerpc/perf/isa207-common.h
index 4d0a4e5017c2..90495f1580c7 100644
--- a/arch/powerpc/perf/isa207-common.h
+++ b/arch/powerpc/perf/isa207-common.h
@@ -107,6 +107,7 @@
107#define EVENT_UNIT_MASK 0xf 107#define EVENT_UNIT_MASK 0xf
108#define EVENT_COMBINE_SHIFT 11 /* Combine bit */ 108#define EVENT_COMBINE_SHIFT 11 /* Combine bit */
109#define EVENT_COMBINE_MASK 0x1 109#define EVENT_COMBINE_MASK 0x1
110#define EVENT_COMBINE(v) (((v) >> EVENT_COMBINE_SHIFT) & EVENT_COMBINE_MASK)
110#define EVENT_MARKED_SHIFT 8 /* Marked bit */ 111#define EVENT_MARKED_SHIFT 8 /* Marked bit */
111#define EVENT_MARKED_MASK 0x1 112#define EVENT_MARKED_MASK 0x1
112#define EVENT_IS_MARKED (EVENT_MARKED_MASK << EVENT_MARKED_SHIFT) 113#define EVENT_IS_MARKED (EVENT_MARKED_MASK << EVENT_MARKED_SHIFT)
@@ -134,6 +135,26 @@
134 PERF_SAMPLE_BRANCH_KERNEL |\ 135 PERF_SAMPLE_BRANCH_KERNEL |\
135 PERF_SAMPLE_BRANCH_HV) 136 PERF_SAMPLE_BRANCH_HV)
136 137
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
137/* 158/*
138 * Layout of constraint bits: 159 * Layout of constraint bits:
139 * 160 *
@@ -210,15 +231,22 @@
210#define MMCR1_DC_QUAL_SHIFT 47 231#define MMCR1_DC_QUAL_SHIFT 47
211#define MMCR1_IC_QUAL_SHIFT 46 232#define MMCR1_IC_QUAL_SHIFT 46
212 233
234/* MMCR1 Combine bits macro for power9 */
235#define p9_MMCR1_COMBINE_SHIFT(pmc) (38 - ((pmc - 1) * 2))
236
213/* Bits in MMCRA for PowerISA v2.07 */ 237/* Bits in MMCRA for PowerISA v2.07 */
214#define MMCRA_SAMP_MODE_SHIFT 1 238#define MMCRA_SAMP_MODE_SHIFT 1
215#define MMCRA_SAMP_ELIG_SHIFT 4 239#define MMCRA_SAMP_ELIG_SHIFT 4
216#define MMCRA_THR_CTL_SHIFT 8 240#define MMCRA_THR_CTL_SHIFT 8
217#define MMCRA_THR_SEL_SHIFT 16 241#define MMCRA_THR_SEL_SHIFT 16
218#define MMCRA_THR_CMP_SHIFT 32 242#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)
220#define MMCRA_IFM_SHIFT 30 245#define MMCRA_IFM_SHIFT 30
221 246
247/* MMCR1 Threshold Compare bit constant for power9 */
248#define p9_MMCRA_THR_CMP_SHIFT 45
249
222/* Bits in MMCR2 for PowerISA v2.07 */ 250/* Bits in MMCR2 for PowerISA v2.07 */
223#define MMCR2_FCS(pmc) (1ull << (63 - (((pmc) - 1) * 9))) 251#define MMCR2_FCS(pmc) (1ull << (63 - (((pmc) - 1) * 9)))
224#define MMCR2_FCP(pmc) (1ull << (62 - (((pmc) - 1) * 9))) 252#define MMCR2_FCP(pmc) (1ull << (62 - (((pmc) - 1) * 9)))