lkml.org 
[lkml]   [2016]   [Feb]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH v8 5/7] powerpc/perf: Add event attribute and group to nest pmu
Date
Device tree nest driver module parses the nest unit and its events.
It pass the information to nest pmu code which is placed in
perf/ as "nest-pmu.c".

Inthis patch code added to create only event attributes and
attribute groups for the nest pmu.

Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Anton Blanchard <anton@samba.org>
Cc: Daniel Axtens <dja@axtens.net>
Cc: Stephane Eranian <eranian@google.com>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
---
arch/powerpc/perf/Makefile | 2 +-
arch/powerpc/perf/nest-pmu.c | 69 ++++++++++++++++++++++++++++++
arch/powerpc/platforms/powernv/opal-nest.c | 8 ++++
3 files changed, 78 insertions(+), 1 deletion(-)
create mode 100644 arch/powerpc/perf/nest-pmu.c

diff --git a/arch/powerpc/perf/Makefile b/arch/powerpc/perf/Makefile
index f9c083a5652a..6da656b50e3c 100644
--- a/arch/powerpc/perf/Makefile
+++ b/arch/powerpc/perf/Makefile
@@ -5,7 +5,7 @@ obj-$(CONFIG_PERF_EVENTS) += callchain.o
obj-$(CONFIG_PPC_PERF_CTRS) += core-book3s.o bhrb.o
obj64-$(CONFIG_PPC_PERF_CTRS) += power4-pmu.o ppc970-pmu.o power5-pmu.o \
power5+-pmu.o power6-pmu.o power7-pmu.o \
- power8-pmu.o
+ power8-pmu.o nest-pmu.o
obj32-$(CONFIG_PPC_PERF_CTRS) += mpc7450-pmu.o

obj-$(CONFIG_FSL_EMB_PERF_EVENT) += core-fsl-emb.o
diff --git a/arch/powerpc/perf/nest-pmu.c b/arch/powerpc/perf/nest-pmu.c
new file mode 100644
index 000000000000..b9b44147c9b8
--- /dev/null
+++ b/arch/powerpc/perf/nest-pmu.c
@@ -0,0 +1,69 @@
+/*
+ * Nest Performance Monitor counter support.
+ *
+ * Copyright (C) 2016 Madhavan Srinivasan, IBM Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include <asm/nest-pmu.h>
+
+struct perchip_nest_info nest_perchip_info[NEST_MAX_CHIPS];
+struct nest_pmu *per_nest_pmu_arr[NEST_MAX_PMUS];
+
+/*
+ * Populate event name and string in attribute
+ */
+static struct attribute *dev_str_attr(const char *name, const char *str)
+{
+ struct perf_pmu_events_attr *attr;
+
+ attr = kzalloc(sizeof(*attr), GFP_KERNEL);
+
+ sysfs_attr_init(&attr->attr.attr);
+
+ attr->event_str = str;
+ attr->attr.attr.name = name;
+ attr->attr.attr.mode = 0444;
+ attr->attr.show = perf_event_sysfs_show;
+
+ return &attr->attr.attr;
+}
+
+static int update_events_in_group(
+ struct nest_ima_events *nest_events, int idx, struct nest_pmu *pmu)
+{
+ struct attribute_group *attr_group;
+ struct attribute **attrs;
+ int i;
+
+ /* Allocate memory for attribute group */
+ attr_group = kzalloc(sizeof(*attr_group), GFP_KERNEL);
+ if (!attr_group)
+ return -ENOMEM;
+
+ /* Allocate memory for attributes */
+ attrs = kzalloc((sizeof(struct attribute *) * (idx + 1)), GFP_KERNEL);
+ if (!attrs)
+ return -ENOMEM;
+
+ attr_group->name = "events";
+ attr_group->attrs = attrs;
+ for (i = 0; i < idx; i++, nest_events++)
+ attrs[i] = dev_str_attr((char *)nest_events->ev_name,
+ (char *)nest_events->ev_value);
+
+ pmu->attr_groups[0] = attr_group;
+ return 0;
+}
+
+int init_nest_pmu(struct nest_ima_events *nest_events,
+ int idx, struct nest_pmu *pmu_ptr)
+{
+
+ update_events_in_group(nest_events, idx, pmu_ptr);
+ return 0;
+}
+
diff --git a/arch/powerpc/platforms/powernv/opal-nest.c b/arch/powerpc/platforms/powernv/opal-nest.c
index 548a8c0236e4..6ad260353d04 100644
--- a/arch/powerpc/platforms/powernv/opal-nest.c
+++ b/arch/powerpc/platforms/powernv/opal-nest.c
@@ -32,6 +32,8 @@

extern struct perchip_nest_info nest_perchip_info[NEST_MAX_CHIPS];
extern struct nest_pmu *per_nest_pmu_arr[NEST_MAX_PMUS];
+extern int init_nest_pmu(struct nest_ima_events *nest_events,
+ int idx, struct nest_pmu *pmu_ptr);

static int nest_event_info(char *name, struct nest_ima_events *nest_events)
{
@@ -210,6 +212,12 @@ static int nest_pmu_create(struct device_node *parent, int pmu_index)
idx += ret;
}

+ ret = init_nest_pmu(nest_events, idx, pmu_ptr);
+ if (ret) {
+ pr_err("Nest PMU %s Register failed\n", pmu_ptr->pmu.name);
+ return ret;
+ }
+
return 0;
}

--
1.9.1
\
 
 \ /
  Last update: 2016-02-23 05:41    [W:0.078 / U:1.292 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site