aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanakarajan Natarajan <Janakarajan.Natarajan@amd.com>2017-01-16 18:36:23 -0500
committerIngo Molnar <mingo@kernel.org>2017-01-30 06:01:18 -0500
commitda6adaea2b7ef658c61a557c28508668eac29fe1 (patch)
tree150a42e3a1dda2e98cb04afeb19cba4b7b487bdd
parentbc1daef6b5da574bca0a2ec7f9b4d0c5fe0c7d11 (diff)
perf/x86/amd/uncore: Update sysfs attributes for Family17h processors
This patch updates the sysfs attributes for AMD Family17h processors. In Family17h, the event bit position is changed for both the NorthBridge and Last level cache counters. The sysfs attributes are assigned based on the family and the type of the counter. Signed-off-by: Janakarajan Natarajan <Janakarajan.Natarajan@amd.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Vince Weaver <vincent.weaver@maine.edu> Link: http://lkml.kernel.org/r/617570ed3634e804991f95db62c3cf3856a9d2a7.1484598705.git.Janakarajan.Natarajan@amd.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/x86/events/amd/uncore.c77
1 files changed, 56 insertions, 21 deletions
diff --git a/arch/x86/events/amd/uncore.c b/arch/x86/events/amd/uncore.c
index e6a2eb54c4a4..4d1f7f2d9aff 100644
--- a/arch/x86/events/amd/uncore.c
+++ b/arch/x86/events/amd/uncore.c
@@ -248,30 +248,47 @@ static struct attribute_group amd_uncore_attr_group = {
248 .attrs = amd_uncore_attrs, 248 .attrs = amd_uncore_attrs,
249}; 249};
250 250
251PMU_FORMAT_ATTR(event, "config:0-7,32-35"); 251/*
252PMU_FORMAT_ATTR(umask, "config:8-15"); 252 * Similar to PMU_FORMAT_ATTR but allowing for format_attr to be assigned based
253 253 * on family
254static struct attribute *amd_uncore_format_attr[] = { 254 */
255 &format_attr_event.attr, 255#define AMD_FORMAT_ATTR(_dev, _name, _format) \
256 &format_attr_umask.attr, 256static ssize_t \
257 NULL, 257_dev##_show##_name(struct device *dev, \
258}; 258 struct device_attribute *attr, \
259 259 char *page) \
260static struct attribute_group amd_uncore_format_group = { 260{ \
261 .name = "format", 261 BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \
262 .attrs = amd_uncore_format_attr, 262 return sprintf(page, _format "\n"); \
263} \
264static struct device_attribute format_attr_##_dev##_name = __ATTR_RO(_dev);
265
266/* Used for each uncore counter type */
267#define AMD_ATTRIBUTE(_name) \
268static struct attribute *amd_uncore_format_attr_##_name[] = { \
269 &format_attr_event_##_name.attr, \
270 &format_attr_umask.attr, \
271 NULL, \
272}; \
273static struct attribute_group amd_uncore_format_group_##_name = { \
274 .name = "format", \
275 .attrs = amd_uncore_format_attr_##_name, \
276}; \
277static const struct attribute_group *amd_uncore_attr_groups_##_name[] = { \
278 &amd_uncore_attr_group, \
279 &amd_uncore_format_group_##_name, \
280 NULL, \
263}; 281};
264 282
265static const struct attribute_group *amd_uncore_attr_groups[] = { 283AMD_FORMAT_ATTR(event, , "config:0-7,32-35");
266 &amd_uncore_attr_group, 284AMD_FORMAT_ATTR(umask, , "config:8-15");
267 &amd_uncore_format_group, 285AMD_FORMAT_ATTR(event, _df, "config:0-7,32-35,59-60");
268 NULL, 286AMD_FORMAT_ATTR(event, _l3, "config:0-7");
269}; 287AMD_ATTRIBUTE(df);
288AMD_ATTRIBUTE(l3);
270 289
271static struct pmu amd_nb_pmu = { 290static struct pmu amd_nb_pmu = {
272 .task_ctx_nr = perf_invalid_context, 291 .task_ctx_nr = perf_invalid_context,
273 .attr_groups = amd_uncore_attr_groups,
274 .name = "amd_nb",
275 .event_init = amd_uncore_event_init, 292 .event_init = amd_uncore_event_init,
276 .add = amd_uncore_add, 293 .add = amd_uncore_add,
277 .del = amd_uncore_del, 294 .del = amd_uncore_del,
@@ -282,8 +299,6 @@ static struct pmu amd_nb_pmu = {
282 299
283static struct pmu amd_llc_pmu = { 300static struct pmu amd_llc_pmu = {
284 .task_ctx_nr = perf_invalid_context, 301 .task_ctx_nr = perf_invalid_context,
285 .attr_groups = amd_uncore_attr_groups,
286 .name = "amd_l2",
287 .event_init = amd_uncore_event_init, 302 .event_init = amd_uncore_event_init,
288 .add = amd_uncore_add, 303 .add = amd_uncore_add,
289 .del = amd_uncore_del, 304 .del = amd_uncore_del,
@@ -501,11 +516,25 @@ static int __init amd_uncore_init(void)
501 /* Family 17h: */ 516 /* Family 17h: */
502 num_counters_nb = NUM_COUNTERS_NB; 517 num_counters_nb = NUM_COUNTERS_NB;
503 num_counters_llc = NUM_COUNTERS_L3; 518 num_counters_llc = NUM_COUNTERS_L3;
519 /*
520 * For Family17h, the NorthBridge counters are
521 * re-purposed as Data Fabric counters. Also, support is
522 * added for L3 counters. The pmus are exported based on
523 * family as either L2 or L3 and NB or DF.
524 */
525 amd_nb_pmu.name = "amd_df";
526 amd_llc_pmu.name = "amd_l3";
527 format_attr_event_df.show = &event_show_df;
528 format_attr_event_l3.show = &event_show_l3;
504 break; 529 break;
505 case 22: 530 case 22:
506 /* Family 16h - may change: */ 531 /* Family 16h - may change: */
507 num_counters_nb = NUM_COUNTERS_NB; 532 num_counters_nb = NUM_COUNTERS_NB;
508 num_counters_llc = NUM_COUNTERS_L2; 533 num_counters_llc = NUM_COUNTERS_L2;
534 amd_nb_pmu.name = "amd_nb";
535 amd_llc_pmu.name = "amd_l2";
536 format_attr_event_df = format_attr_event;
537 format_attr_event_l3 = format_attr_event;
509 break; 538 break;
510 default: 539 default:
511 /* 540 /*
@@ -514,8 +543,14 @@ static int __init amd_uncore_init(void)
514 */ 543 */
515 num_counters_nb = NUM_COUNTERS_NB; 544 num_counters_nb = NUM_COUNTERS_NB;
516 num_counters_llc = NUM_COUNTERS_L2; 545 num_counters_llc = NUM_COUNTERS_L2;
546 amd_nb_pmu.name = "amd_nb";
547 amd_llc_pmu.name = "amd_l2";
548 format_attr_event_df = format_attr_event;
549 format_attr_event_l3 = format_attr_event;
517 break; 550 break;
518 } 551 }
552 amd_nb_pmu.attr_groups = amd_uncore_attr_groups_df;
553 amd_llc_pmu.attr_groups = amd_uncore_attr_groups_l3;
519 554
520 if (!boot_cpu_has(X86_FEATURE_TOPOEXT)) 555 if (!boot_cpu_has(X86_FEATURE_TOPOEXT))
521 goto fail_nodev; 556 goto fail_nodev;